Показать сообщение отдельно
Старый 05.07.2011, 15:51
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
да, вроде
Да вроде нет =) Используй localConnection

Код AS3:
package ugo.net.connections.unique 
{
	import flash.errors.IllegalOperationError;
	import flash.events.AsyncErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.LocalConnection;
	import ugo.events.RemovableEventDispatcher;
 
 
	/**
	 * Такая флешка уже запущена
	 */
	[Event(name="flashAlreadyStarted", type="ugo.net.connections.unique.UniqueFlashControllerEvent")]
 
	/**
	 * Запущен еще один экземпляр флешки.
	 */
	[Event(name="secondFlashStarted", type="ugo.net.connections.unique.UniqueFlashControllerEvent")]
 
	/**
	 * Контроллер уникальности запущенных флешек.
	 * 
	 * Использование:
	 * 
	 * UniqueFlashController.addEventListener(UniqueFlashControllerEvent.FLASH_ALREADY_STARTED, function (e:Event):void { trace("Эта флешка запущена вторично"); } );
	 * UniqueFlashController.addEventListener(UniqueFlashControllerEvent.SECOND_FLASH_STARTED , function (e:Event):void { trace("Запущена вторая флешка"); } );
	 * UniqueFlashController.init("myConnectionName");
	 * 
	 * @author strax
	 */
	public class UniqueFlashController
	{
		private static var _instance:UniqueFlashController = null;
 
		private static const _dispatcher:RemovableEventDispatcher= new RemovableEventDispatcher;
 
 
		private var _connectionName:String;
		private const _connection:LocalConnection = new LocalConnection;
 
		/**
		 * Проинициализировать контроллер уникальности флешки.
		 * 
		 * @param connectionName	имя соединения
		 */
		public static function init( connectionName:String ):void
		{
			if( UniqueFlashController._instance )
				throw new IllegalOperationError("Контроллер уникальности флешки уже проинициализирован.");
			if(!connectionName )
				throw new ArgumentError( "Необходимо задать имя соединения." );
 
			UniqueFlashController._instance = new UniqueFlashController( new UniqueFlashControllerEnforcer(), connectionName );
		}
 
		/**
		 * Для получения экземпляра используется статическое свойство instance!
		 */
		public function UniqueFlashController(enforcer:UniqueFlashControllerEnforcer, connectionName:String) 
		{
			super();
			if(!enforcer) throw new ArgumentError("Для создания экземпляра необходим приватный ключ!");
 
			_connectionName = connectionName;
 
			_connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
			_connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecutiryError);
			_connection.allowDomain("*");
 
			try
			{
				_connection.connect( connectionName );
			}
			// если в результате попытки соединиться была получена ошибка, значит такое соединение уже существует.
			// значит, эта флешка является уже не первой запущенной
			catch( error:Error )
			{
				_dispatcher.dispatchEvent( new UniqueFlashControllerEvent( UniqueFlashControllerEvent.FLASH_ALREADY_STARTED ));
 
				// вызвать в первой запущенной флешке AsyncError
				_connection.send( connectionName, connectionName );
			}
		}
 
		private function onSecutiryError(event:SecurityErrorEvent):void 
		{
			return;
		}
 
		/**
		 * Обработать AsyncError.
		 * 
		 * Эта ошибка возникает при попытке вызвать несуществующий метод через LocalConnection.
		 * Соответственно, если кто-то пытается вызвать этот метод, значит запущена вторая флешка.
		 */
		private function onAsyncError(event:AsyncErrorEvent):void 
		{
			_dispatcher.dispatchEvent( new UniqueFlashControllerEvent( UniqueFlashControllerEvent.SECOND_FLASH_STARTED ));
		}
 
		/**
		 * Имя соединения, которое используется для проверки единичного запуска флешки
		 */
		public static function get connectionName():String
		{
			if( _instance )
				return _instance._connectionName;
			else
				return null;
		}
 
		/**
		 * @inheritDoc
		 */
		public static function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
		{
			_dispatcher.addEventListener( type, listener, useCapture, priority, useWeakReference );
		}
 
		/**
		 * @inheritDoc
		 */
		public static function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
		{
			_dispatcher.removeEventListener(type, listener, useCapture);
		}
 
		/**
		 * Удалить всех слушателей
		 */
		public static function removeAllListeners():void
		{
			_dispatcher.removeAllListeners();
		}
	}
 
}
 
class UniqueFlashControllerEnforcer {}
Код AS3:
package ugo.net.connections.unique 
{
	import flash.events.ErrorEvent;
 
	/**
	 * Событие контроллера уникальных флешек.
	 * 
	 * @author strax
	 */
	public class UniqueFlashControllerEvent extends ErrorEvent 
	{
		/**
		 * Такая Флешка уже запущена.
		 * 
		 * Это сообщение получает флешка, которая пытается запуститься вторично.
		 */
		public static const FLASH_ALREADY_STARTED:String = "flashAlreadyStarted";
 
		/**
		 * Запущена вторая флешка.
		 * 
		 * Это событие получает первая запушенная флешка при запуске второй.
		 */
		public static const SECOND_FLASH_STARTED:String = "secondFlashStarted";
 
		public function UniqueFlashControllerEvent(type:String) 
		{
			super(type, false, false, (type == FLASH_ALREADY_STARTED?"SWF уже запущена":"Запущен еще один экземпляр SWF"));
		}
 
	}
 
}
Автор шедевра - товарищ по работе. Не уверен, что он помнит свой пароль от flasher.ru, поэтому запостил сам. Кстати, претензии тоже к нему =)
__________________
...вселенская грусть