1  //!-- UTF8
     2  /*
     3   Oregano Multiuser Server - Version 1.2.0 - January 4th, 2005
     4   
     5  	Web:  www.oregano-server.org
     6  	Mail: info@oregano-server.org
     7   
     8  	Copyright 2003 - 2004 - 2004 Jens Halm / Cologne, Germany
     9   
    10   This library is free software; you can redistribute it and/or
    11   modify it under the terms of the GNU Lesser General Public
    12   License as published by the Free Software Foundation; either
    13   version 2.1 of the License, or (at your option) any later version.
    14   
    15   This library is distributed in the hope that it will be useful,
    16   but WITHOUT ANY WARRANTY; without even the implied warranty of
    17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    18   Lesser General Public License for more details.
    19   
    20   You should have received a copy of the GNU Lesser General Public
    21   License along with this library; if not, write to the Free Software
    22   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23  */
    24  
    25  /*
    26   -------------------------------------------
    27  	Classe Info
    28   
    29  	@description :
    30  	Classe d'utilitaires.
    31   
    32   
    33  	@author Jens Halm copyright http://www.spicefactory.org/
    34  	@author erixtekila copyleft http://www.v-i-a.net  
    35   -------------------------------------------
    36  	version history :
    37  	1.2.0 : 29/12/04
    38  			- Portage en actionscript 2 pour le
    39  			compile time type checking
    40   -------------------------------------------
    41   */
    42  
    43  import org.omus.util.EventDispatcher;
    44  import org.omus.util.iObservable;
    45  import org.omus.util._Error;
    46  import org.omus.util._Class;
    47  
    48  import org.omus.msg.MessageHandler;
    49  import org.omus.msg.iMessageHandler;
    50  import org.omus.msg.EnvelopeFactory;
    51  import org.omus.msg.Envelope;
    52  import org.omus.msg.Message;
    53  
    54  import org.omus.core.Session;
    55  
    56  
    57  /**
    58   *	Cette classe gère une série de méthodes utiitaires.
    59   *	<p>
    60   *	Evénements auxquels s'abonner :
    61   *	<ul>
    62   *	<li>onFindUser(username:String, groupName:String)	Généré lorsqu'un membre est localisé.
    63   *																_param username			Nom de l'utilisateur.
    64   *																_param groupName		Nom du groupe ou nill si deconnecté.
    65   *	</li><li> onLoadGroupList(groups:Table)				Généré lors du chargement de la liste d'un groupe.
    66   *																_param groups			Objet Table dont la définition est : 
    67   *																						name(String), userCount(number), userLimit(number)and closed(boolean).
    68   *	</li><li>onLoadUserList(usernames:Array)			Généré lors du chargement de la liste des utilsateurs connectés.
    69   *																_param usernames		Liste des membres connectés.
    70   *	</li><li>onError(error:_Error)						Invoqué lorsqu'une erreur survient lors de le fermeture/ouverture ou le changement de groupe.
    71   *	</li></ul><p>
    72   *	Elle est aggrémentée par composition des méthodes des sources d'événements (EventDispatcher).
    73   *	Elle est aggrémentée par composition de la classe MessageHandler.
    74   *	@see org.omus.util.EventDispatcher
    75   *	@see org.omus.util.iObservable
    76   *	@see org.omus.msg.MessageHandler
    77   *	@see org.omus.msg.iMessageHandler
    78   *
    79   *	@author Jens Halm copyright http://www.spicefactory.org/
    80   *	@author erixtekila copyleft http://www.v-i-a.net 
    81   *	@version 1.2.0
    82   */
    83  class org.omus.core.Info implements iObservable, iMessageHandler
    84  {
    85  	//--------------------
    86  	// PROPRIETES
    87  	//--------------------
    88  	/**
    89  	 *	Référence au système de génération d'événements.
    90  	 */
    91  	private var _eventSource:EventDispatcher;
    92  	
    93  	/**
    94  	 *	Référence à la classe MessageHandler;
    95  	 */
    96  	private var _messageHandler:MessageHandler;
    97  	
    98  	//--------------------
    99  	// CONSTRUCTEUR
   100  	//--------------------
   101  	/**
   102  	 *	L'objet Info dispose des méthodes d'EventDispatcher
   103  	 *	et de celles de MessageHandler par composition.
   104  	 *
   105  	 *	@see org.omus.util.EventDispatcher
   106  	 *	@see org.omus.util.iObservable
   107  	 *	@see org.omus.msg.MessageHandler
   108  	 *	@see org.omus.msg.iMessageHandler
   109  	 */
   110  	public function Info()
   111  	{	
   112  		// Composition avec EventDispatcher
   113  		_eventSource = new EventDispatcher();
   114  		// Composition avec MessageHandler
   115  		_messageHandler = new MessageHandler();
   116  		
   117  		// Initialisation des événements
   118  		_messageHandler.initMessageHandler(this);
   119  		
   120  		// Callbacks des envois de messages.
   121  		addHandler("userList","handleUserList");
   122  		addHandler("groupList","handleGroupList");
   123  		addHandler("findUser","handleFindUser");
   124  		
   125  		// trace(this+ " installé.");
   126  	}
   127  	
   128  	
   129  	//--------------------
   130  	// METHODES PUBLIQUES
   131  	//--------------------
   132  	/**
   133  	 *	Utilisé dans un contexte littéral
   134  	 *	@return	Une chaine définissant l'objet
   135  	 */
   136  	public function toString():String
   137  	{
   138  		return "[Objet Info]";
   139  	}
   140  	
   141  	/**
   142  	 *	Charge la liste de tous les utilsateurs connectés.
   143  	 */
   144  	public function loadUserList ():Void
   145  	{
   146  		// TODO : Accès Singleton
   147  		var envFactory = EnvelopeFactory.getInstance();
   148  		var session = Session.getInstance();
   149  		var env = envFactory.getOutgoing(new Message("userList"), "info");
   150  		session.sendMessage(env);
   151  	}
   152  	
   153  	/**
   154  	 *	Charge un objet Table contenant tous les Groupes crées.
   155  	 */
   156  	public function loadGroupList ():Void
   157  	{
   158  		// TODO : Accès Singleton
   159  		var envFactory = EnvelopeFactory.getInstance();
   160  		var session = Session.getInstance();
   161  		var env = envFactory.getOutgoing(new Message("groupList"),"info");
   162  		session.sendMessage(env);
   163  	}
   164  	
   165  	/**
   166  	 *	Localise un utilsateur.
   167  	 *
   168  	 *	@param username			Nom de l'utilisateur.
   169  	 */
   170  	public function findUser (username:String):Void
   171  	{
   172  		// TODO : Accès Singleton
   173  		var clazz = _Class.getInstance();
   174  		var envFactory = EnvelopeFactory.getInstance();
   175  		var session = Session.getInstance();
   176  		
   177  		if (! clazz.checkArguments("org.omus.info.findUser", [[username, "string", true]])) return;
   178  		var msg = new Message("findUser");
   179  		msg.getAttachment().username = username;
   180  		var env = envFactory.getOutgoing(msg,"info");
   181  		session.sendMessage(env);
   182  	}
   183  
   184  	//*** Implémentation de iObservable ***\
   185  	/**
   186  	 *	Notifie les observateurs d'un événement.
   187  	 *
   188  	 *	@param logLevel Une chaine caractérisant le niveau de logging de l'information.
   189  	 *	@param eventName Nom de l'événement.
   190  	 *	@param arg1		[option] Autant de paramêtres de voulu.
   191  	 */
   192  	private function fireEvent (logLevel:String, eventName:String):Void
   193  	{
   194  		_eventSource.fireEvent.apply (_eventSource, arguments);
   195  	}
   196  	
   197  	/**
   198  	 *	Ajoute un nouvel observateur.
   199  	 * 
   200  	 *	@param		listener Référence de l'observateur.
   201  	 *	@return Un booléen indiquant la réussite de l'opération.
   202  	 */
   203  	public function addListener (listener:Object):Boolean
   204  	{
   205  		return _eventSource.addListener(listener);
   206  	}
   207  	
   208  	/**
   209  	 *	Supprime un observateur.
   210  	 *
   211  	 *	@param		listener Référence de l'observateur.
   212  	 *	@return Un booléen indiquant la réussite de l'opération.
   213  	 */
   214  	public function removeListener (listener:Object):Boolean
   215  	{
   216  		return _eventSource.removeListener(listener);
   217  	}
   218  	
   219  	/**
   220  	 *	Supprime tous les abonnés.
   221  	 */
   222  	public function removeAllListeners ():Void
   223  	{
   224  		_eventSource.removeAllListeners();
   225  	}
   226  	
   227  	/**
   228  	 *	Retourne le nombre d'observateurs.
   229  	 *
   230  	 *	@return Le nombre d'observateurs enregistrés.
   231  	 */
   232  	public function countListeners ():Number
   233  	{
   234  		return _eventSource.countListeners();
   235  	}
   236  	
   237  	
   238  	//*** Implémentation de iMessageHandler ***\\
   239  	/**
   240  	 *	Active la gestion d'un type de message par accusé de réception
   241  	 *	en fonction du contenu de son enveloppe.
   242  	 *
   243  	 * @param env		Une référence à l'enveloppe.
   244  	 */
   245  	public function handleMessage (env:Envelope):Void
   246  	{
   247  		_messageHandler.handleMessage(env);
   248  	}
   249  	
   250  	/**
   251  	 *	Rajoute un gestionnaire chargé d'intercepter 
   252  	 *	la réponse du serveur suite à un message soumis.
   253  	 *	Forme d'accusé de réception (callback).
   254  	 *
   255  	 *	@param		subject Le type de message.
   256  	 *	@param		methodName Le nom de l'événement gérant un type de message. 
   257  	 */
   258  	public function addHandler (subject:String, methodName:String):Void
   259  	{
   260  		_messageHandler.addHandler (subject, methodName);
   261  	}
   262  	
   263  	
   264  	// Callbacks des messges Message avec accusés de réception
   265  	/**
   266  	 *	Gestionnaire de l'accusé de réception du message de chargement de la liste des utilisateurs connectés.
   267  	 *	Génère un événement onLoadUserList ou onError aux observateurs.
   268  	 *
   269  	 *	@param env		Enveloppe du message retourné.
   270  	 */
   271  	private function handleUserList (env:Envelope):Void
   272  	{
   273  		var attach = env.getMessage().getAttachment();
   274  		var errCode = attach.error;
   275  		if (errCode == "ok")
   276  		{
   277  			// Broadcast
   278  			fireEvent("info","onLoadUserList",attach.userList);
   279  		} else
   280  		{
   281  			// Broadcast
   282  			fireEvent("error", "onError", new _Error(errCode, "loadUserList", new Array()));
   283  		}
   284  	}
   285  	
   286  	/**
   287  	 *	Gestionnaire de l'accusé de réception du message de chargement d'un groupe.
   288  	 *	Génère un événement onLoadGroupList ou onError aux observateurs.
   289  	 *
   290  	 *	@param env		Enveloppe du message retourné.
   291  	 */
   292  	private function handleGroupList (env:Envelope):Void
   293  	{
   294  		var attach = env.getMessage().getAttachment();
   295  		var errCode = attach.error;
   296  		if (errCode == "ok")
   297  		{
   298  			var t = attach.groupList;
   299  			t.sortBy("name");
   300  			// Broadcast
   301  			fireEvent("info", "onLoadGroupList", t);
   302  		} else 
   303  		{
   304  			// Broadcast
   305  			fireEvent("error", "onError", new _Error(errCode, "loadGroupList", new Array()));
   306  		}
   307  	}
   308  	
   309  	/**
   310  	 *	Gestionnaire de l'accusé de réception du message de localisation d'un utilisateur.
   311  	 *	Génère un événement onFindUser ou onError aux observateurs.
   312  	 *
   313  	 *	@param env		Enveloppe du message retourné.
   314  	 */
   315  	private function handleFindUser (env:Envelope):Void
   316  	{
   317  		var attach = env.getMessage().getAttachment();
   318  		var errCode = attach.error;
   319  		if (errCode == "ok")
   320  		{
   321  			// Broadcast
   322  			fireEvent("info", "onFindUser", attach.username, attach.groupName);
   323  		} else 
   324  		{
   325  			if (errCode == "inf-003") 
   326  			{
   327  				// Broadcast
   328  				fireEvent("info", "onFindUser", attach.username, null);
   329  			} else
   330  			{
   331  				// Broadcast
   332  				fireEvent("error","onError", new _Error(errCode, "findUser", [attach.username]));
   333  			}
   334  		}
   335  	}
   336  
   337  	// Fin des callbacks des messges Message avec accusés de réception
   338  
   339  	
   340  	//--------------------
   341  	// METHODES PRIVEES
   342  	//--------------------
   343  
   344  	
   345  	//--------------------
   346  	// METHODES STATIQUES
   347  	//--------------------
   348  	/**
   349  	 *	Utilisé dans un contexte littéral
   350  	 *
   351  	 *	@return Une chaine définissant l'objet.
   352  	 */
   353  	public static function toLog():String
   354  	{
   355  		return "[Objet Info]";
   356  	}
   357  
   358  }
   359