Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.02.2011, 01:32
VitaliyKrivtsov вне форума Посмотреть профиль Отправить личное сообщение для VitaliyKrivtsov Посетить домашнюю страницу VitaliyKrivtsov Найти все сообщения от VitaliyKrivtsov
  № 1  
Ответить с цитированием
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov

блогер
Регистрация: Apr 2010
Сообщений: 99
Записей в блоге: 5
Отправить сообщение для VitaliyKrivtsov с помощью ICQ Отправить сообщение для VitaliyKrivtsov с помощью Skype™
Post Flash Proxy in Vkontakte

Стал разбираться с флеш-посредником в Вконтакте. Как работать с ним понятно. Но я решил копнуть дальше.
Полез в класс APIConnection.
Вот код класса полностью.
Код AS3:
package vk {
  import flash.net.LocalConnection;
  import flash.external.ExternalInterface;
  import flash.events.*;
  import flash.utils.setTimeout;
 
  import vk.events.*;
  import vk.api.DataProvider;
 
 
  /**
   * @author Andrew Rogozov
   */
  public class APIConnection extends EventDispatcher {
    private var sendingLC: LocalConnection;
    private var connectionName: String;
    private var receivingLC: LocalConnection;
 
    private var pendingRequests: Array;
    private var loaded: Boolean = false;
 
	private var directApiAccess: Boolean = false;
 
	private var apiCallId: Number = 0;
	private var apiCalls: Object = new Object();
 
	private var dp: DataProvider;
 
    public function APIConnection(...params) {
	  var connectionName: String;
	  if (typeof(params[0]) == 'string') {
	    connectionName = params[0];
	  } else {
	    connectionName = params[0].lc_name;
		var api_url: String = 'http://api.vkontakte.ru/api.php';
		if (params[0].api_url) api_url = params[0].api_url;
		dp = new DataProvider(api_url, params[0].api_id, params[0].sid, params[0].secret, params[0].viewer_id);
	  }
	  if (!connectionName) return;
	  pendingRequests = new Array();
 
      this.connectionName = connectionName;
 
      sendingLC = new LocalConnection();
      sendingLC.allowDomain('*');
 
      receivingLC = new LocalConnection();
      receivingLC.allowDomain('*');
      receivingLC.client = {
        initConnection: initConnection,
        onBalanceChanged: onBalanceChanged,
        onSettingsChanged: onSettingsChanged,
		onLocationChanged: onLocationChanged,
		onWindowResized: onWindowResized,
		onApplicationAdded: onApplicationAdded,
		onWindowBlur: onWindowBlur,
		onWindowFocus: onWindowFocus,
		onWallPostSave: onWallPostSave,
		onWallPostCancel: onWallPostCancel,
		onProfilePhotoSave: onProfilePhotoSave,
		onProfilePhotoCancel: onProfilePhotoCancel,
		onMerchantPaymentSuccess: onMerchantPaymentSuccess,
		onMerchantPaymentCancel: onMerchantPaymentCancel,
		onMerchantPaymentFail: onMerchantPaymentFail,
		apiCallback: apiCallback,
		customEvent: customEvent
      };
      try {
        receivingLC.connect("_out_" + connectionName);
      } catch (error:ArgumentError) {
        debug("Cant connect from App. The connection name is already being used by another SWF");
      }
      sendingLC.addEventListener(StatusEvent.STATUS, onInitStatus);
      sendingLC.send("_in_" + connectionName, "initConnection");
    }
 
    /*
     * Public methods
     */
	public function callMethod(...params):void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift("callMethod");
	  sendData.apply(this, paramsArr);
	}
 
    public function debug(msg: *): void {
      if (!msg || !msg.toString) {
        return;
      }
      sendData("debug", msg.toString());
    }
 
	// direct access to api (wall.post would not work)
	public function forceDirectApiAccess(enable: Boolean = true):void {
	  directApiAccess = enable;
	}
 
	public function api(method: String, params: Object, onComplete:Function = null, onError:Function = null):void {
	  if (!sendingLC || directApiAccess) {
		var options: Object = new Object();
		options['params'] = params;
		options['onComplete'] = onComplete;
		options['onError'] = onError;
		dp.request(method, options);
	  } else {
		var callId: Number = apiCallId++;
	    apiCalls[callId] = function(data: Object):void {
		  if (data.error) {
			onError(data.error);
		  } else {
		  	onComplete(data.response);
		  }
		}
		sendData("api", callId, method, params);
	  }
	}
 
	public function navigateToURL(url: String, window: String = "_self"): void {
      this.callMethod("navigateToURL", url, window);
    }
 
    /*
     * Callbacks
     */
    private function initConnection(): void {
      if (loaded) return;
      loaded = true;
      debug("Connection initialized.");
      dispatchEvent(new CustomEvent(CustomEvent.CONN_INIT));
      sendPendingRequests();
    }
 
	public function customEvent(...params): void {
	  var paramsArr: Array = params as Array;
	  var eventName: String = paramsArr.shift();
	  debug(eventName);
	  var e:CustomEvent = new CustomEvent(eventName);
	  e.params = paramsArr;
	  dispatchEvent(e);
	}
 
	/*
     * Obsolete callbacks
     */
	private function onBalanceChanged(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onBalanceChanged')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onSettingsChanged(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onSettingsChanged')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onLocationChanged(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onLocationChanged')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onWindowResized(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onWindowResized')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onApplicationAdded(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onApplicationAdded')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onWindowBlur(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onWindowBlur')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onWindowFocus(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onWindowFocus')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onWallPostSave(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onWallPostSave')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onWallPostCancel(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onWallPostCancel')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onProfilePhotoSave(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onProfilePhotoSave')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onProfilePhotoCancel(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onProfilePhotoCancel')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onMerchantPaymentSuccess(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onMerchantPaymentSuccess')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onMerchantPaymentCancel(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onMerchantPaymentCancel')
	  customEvent.apply(this, paramsArr);
	}
 
	private function onMerchantPaymentFail(...params): void {
	  var paramsArr: Array = params as Array;
	  paramsArr.unshift('onMerchantPaymentFail')
	  customEvent.apply(this, paramsArr);
	}
 
	private function apiCallback(callId:Number, data:Object): void {
	  apiCalls[callId](data);
	  delete apiCalls[callId];
	}
 
    /*
     * Private methods
     */
    private function sendPendingRequests(): void {
      while (pendingRequests.length) {
        sendData.apply(this, pendingRequests.shift());
      }
    }
 
    private function sendData(...params):void {
      var paramsArr: Array = params as Array;
      if (loaded) {
        paramsArr.unshift("_in_" + connectionName);
        sendingLC.send.apply(null, paramsArr);
      } else {
        pendingRequests.push(paramsArr);
      }
    }
    private function onInitStatus(e:StatusEvent):void {
      debug("StatusEvent: "+e.level);
      e.target.removeEventListener(e.type, onInitStatus);
      if (e.level == "status") {
        receivingLC.client.initConnection();
      }
    }
  }
}
И появилась парочка вопросов:
1. Что делает метод debug(). В классе с уровнем доступа public.
2. Что делает метод apiCallback, и зачем он находится в списке обратных вызовов receivingLC.client.
3. customEvent добавляет событие в поток событий, тут вроде как бы все понятно, но не понятно зачем метод находится в списке обратных вызовов receivingLC.client, ведь уже и так указаны все возможные обратные методы всех событий, и добавления события в поток идет через них, зачем он нужен пока мне не понятно.
Надеюсь, что топик не останется без внимания.

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:19.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.