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