1
2
24
25
43
44 import org.omus.core.*;
45
46
47 import org.omus.msg.*;
48 import org.omus.util.*;
49
50
79 class org.omus.core.Session implements iObservable, iMessageHandler
80 {
81
82
83
84
88 public var versionID:String;
89
90
93 public var address:String;
94
95
98 public var loginPort:Number;
99
100
103 public var reconnectPort:Number;
104
105
108 private var _eventSource:EventDispatcher;
109
110
113 private var _messageHandler:MessageHandler;
114
115
118 private var socket:Socket;
119
120
123 private var oldSocket:XMLSocket;
124
125
128 private var recVer:Number;
129
130
133 private var pwdEncoder:Function;
134
135
138 private var online:Boolean;
139
140
143 public var changeGroup:Boolean;
144
145
148 private var loginMode:String;
149
150
154 private var cache:Array;
155
156
159 private var clientInfo:ClientInfo;
160
161
162
165 private static var _instance:Session;
166
167
168
169
170
171
180 private function Session()
181 {
182
183 _eventSource = new EventDispatcher();
184
185 _messageHandler = new MessageHandler();
186
187
188 _messageHandler.initMessageHandler(this);
189
190
191 addHandler("encoding","handleEncoding");
192 addHandler("loginRequest","handleLoginRequest");
193 addHandler("login","handleConnect");
194 addHandler("register","handleConnect");
195 addHandler("logout","handleLogout");
196 addHandler("reconnect","handleReconnect");
197 addHandler("error","handleError");
198
199
200
201
202 online = false;
203 changeGroup = false;
204 loginMode = null;
205 cache = null;
206
207 Log.getInstance().clearCache();
208
209 _global.oregano.iLog.clearCache();
210
211 pwdEncoder = null;
212
213
214 createSocket();
215
216
217
218 recVer = 3;
219
220
221 }
222
223
224
225
226
230 public function toString():String
231 {
232 var s = "[Objet Session]";
233 s += "\norg.omus.session:";
234 s += "\nversionID = " + versionID;
235 s += "\nserver address = " + address;
236 s += "\nlogin port = " + loginPort;
237 s += "\nreconnect port = " + reconnectPort;
238 s += "\nconnected = " + isConnected();
239 return s;
240 }
241
242
245 public function reset ():Void
246 {
247 online = false;
248 changeGroup = false;
249 loginMode = null;
250 cache = null;
251
252 var msgRouter = MessageRouter.getInstance();
253 msgRouter.clearCache();
254
255 Log.getInstance().clearCache();
256
257 _global.oregano.iLog.clearCache();
258 }
259
260
268 public function init (vers:String, addr:String, login:Number, recon:Number):Void
269 {
270
271 if (online)
272 {
273
274 _global.oregano.iLog.error("clj-006","");
275 return;
276 }
277
278
279
280 var clazz = _Class.getInstance();
281 var argCheck = [
282 [vers,"string",true],
283 [addr,"string",true],
284 [login,"number",true],
285 [recon,"number",false]
286 ];
287 if (! clazz.checkArguments("org.omus.session.init", argCheck)) return;
288 reset();
289
290 versionID = vers;
291 address = addr;
292 loginPort = login;
293 reconnectPort = recon;
294
295
296 }
297
298
318 public function setPasswordEncoder (func:Function):Void
319 {
320
321 var clazz = _Class.getInstance();
322
323 if (! clazz.checkArguments("org.omus.session.setPasswordEncoder",[[func,"function",true]])) return;
324 pwdEncoder = func;
325 }
326
327
333 public function login (user:String, pwd:String):Void
334 {
335
336 var clazz = _Class.getInstance();
337 if (! clazz.checkArguments("org.omus.session.login", [[user, "string", true], [pwd, "string", true]])) return;
338
339 cache = [user, pwd];
340 loginMode = "login";
341
342 connect(address, loginPort);
343 }
344
345
352 public function register (user:String, pwd:String, mail:String):Void
353 {
354
355 var clazz = _Class.getInstance();
356 var argCheck = [[user,"string",true], [pwd,"string",true], [mail,"string",true]];
357 if (! clazz.checkArguments("org.omus.session.register", argCheck)) return;
358
359 cache = [user, pwd, mail];
360 loginMode = "register";
361
362 connect(address, loginPort);
363 }
364
365
369 public function isConnected ():Boolean
370 {
371 return (online && ! changeGroup);
372 }
373
374
377 public function logout ():Void
378 {
379
380 var envFactory = EnvelopeFactory.getInstance();
381
382 var env = envFactory.getOutgoing(new Message(""),"logout");
383
384 sendMessage(env);
385 }
386
387
388
393 public function sendMessage (env:Envelope):Void
394 {
395 if (! online)
396 {
397 if (env.getType() != "encoding" && (env.getType() != "session" || env.getMessage().getSubject() != loginMode))
398 {
399
400 _global.oregano.iLog.error("clj-011","envelope = " + env);
401 return;
402 }
403 } else
404 {
405 if (changeGroup)
406 {
407
408 _global.oregano.iLog.error("clj-011","envelope = " + env);
409 return;
410 }
411 }
412
413 var str = env.getMarshalledString();
414
415 if (_global.oregano.iLog.infoEnabled()) _global.oregano.iLog.logLocal("INFO","clj-012","str = " + str + "\nenvelope = " + env);
416
417 socket.send(str);
418 }
419
420
421
428 private function fireEvent (logLevel:String, eventName:String):Void
429 {
430 _eventSource.fireEvent.apply (_eventSource, arguments);
431 }
432
433
439 public function addListener (listener:Object):Boolean
440 {
441 return _eventSource.addListener(listener);
442 }
443
444
450 public function removeListener (listener:Object):Boolean
451 {
452 return _eventSource.removeListener(listener);
453 }
454
455
458 public function removeAllListeners ():Void
459 {
460 _eventSource.removeAllListeners();
461 }
462
463
468 public function countListeners ():Number
469 {
470 return _eventSource.countListeners();
471 }
472
473
474
479 public function handleMessage (env:Envelope):Void
480 {
481 _messageHandler.handleMessage(env);
482 }
483
484
491 public function addHandler (subject:String, methodName:String):Void
492 {
493 _messageHandler.addHandler (subject, methodName);
494 }
495
496
497
498
503 private function handleEncoding (env:Envelope):Void
504 {
505 var enc = (typeof(_global) == "object") ? "UTF-8" : "ISO-8859-1" ;
506 var msg = new Message(enc);
507
508 var envFactory = EnvelopeFactory.getInstance();
509 sendMessage(envFactory.getOutgoing(msg, "encoding"));
510 }
511
512
513
518 private function handleLoginRequest (env:Envelope):Void
519 {
520
521 var sKey = env.getMessage().getAttachment().key;
522 var pwd:String;
523
524
525 if (sKey == undefined) {
526
527 pwd = cache[1];
528 } else {
529 if (pwdEncoder == null)
530 {
531 reset();
532
533 _global.oregano.iLog.error("clj-013","");
534 return;
535 }
536 pwd = pwdEncoder(cache[1], sKey);
537 }
538
539 var msg = new Message(loginMode);
540 var attach = msg.getAttachment();
541 attach.versionID = versionID;
542 attach.username = cache[0];
543 attach.pwd = pwd;
544
545
546 if (loginMode == "register") attach.email = cache[2];
547
548
549 clientInfo = new ClientInfo();
550 clientInfo.insert(attach);
551
552
553 var envFactory = EnvelopeFactory.getInstance();
554 sendMessage(envFactory.getOutgoing(msg, "session"));
555 }
556
557
564 private function handleConnect (env:Envelope):Void
565 {
566
567 var msg = env.getMessage();
568 var attach = msg.getAttachment();
569
570 var errCode = attach.error;
571 if (errCode == "ok")
572 {
573 online = true;
574 if (attach.machineID != undefined) clientInfo.save(attach.machineID);
575
576 Log.getInstance().setLogLevel(attach.logLevel.dev);
577
578 _global.oregano.iLog.setLogLevel(attach.logLevel.omus);
579
580
581 var user = User.getInstance();
582
583 user["init"](attach.regInfo,
584 attach.loginInfo,
585 attach.userProps,
586 attach.userPropConfig);
587
588
589 var group = Group.getInstance(attach.groupPropConfig);
590
591 group["init"]("login",
592 "login",
593 attach.grpID,
594 0,
595 attach.groupProps,
596 attach.extraPropConfig,
597 null);
598
599 _global.messenger = Messenger.getInstance();
600
601 _global.info = new Info();
602
603
604 var msgRouter = MessageRouter.getInstance();
605
606 msgRouter["init"]();
607
608
609 var eventName = (this.loginMode == "login") ? "onLogin" : "onRegister" ;
610
611 fireEvent("info", eventName, attach.extra);
612
613 _global.oregano.iLog.sendCache();
614
615 Log.getInstance().sendCache();
616 } else
617 {
618 cancelConnect(errCode);
619 }
620 loginMode = null;
621 }
622
623
630 private function handleReconnect (env:Envelope) {
631 if (typeof(reconnectPort) != "number")
632 {
633
634 _global.oregano.iLog.warn("clj-066","");
635 return;
636 }
637
638 var address = env.getMessage().getAttachment().address;
639 loginMode = "reconnect";
640 online = false;
641
642 socket.active = false;
643 oldSocket = socket;
644
645
646 if (recVer == 3) oldSocket.close();
647
648 createSocket();
649 connect(address, reconnectPort);
650 }
651
652
658 private function handleLogout (env:Envelope):Void
659 {
660 reset();
661 var errCode = env.getMessage().getAttachment().error;
662 var errObj = new _Error(errCode, "logout", new Array());
663
664 fireEvent("warn", "onLogout", errObj);
665 }
666
667
672 private function handleError (env:Envelope):Void
673 {
674
675 var errCode = env.getMessage().getAttachment().error;
676 changeGroup = false;
677
678 if (! online)
679 {
680 if (loginMode == "reconnect")
681 {
682 connectionBroken();
683 return;
684 }
685 if (this.loginMode == "login" || this.loginMode == "register")
686 {
687 cancelConnect(errCode);
688 return;
689 }
690 }
691 var err = new _Error(errCode, null, null);
692
693 fireEvent("error","onError", err);
694 }
695
696
697
703 public function reconnect (address:String):Void
704 {
705 createSocket();
706 connect(address, reconnectPort);
707
708 }
709
710
713 public function handleChangeGroup ():Void
714 {
715 if (! online && recVer == 2) oldSocket.close();
716 changeGroup = false;
717 online = true;
718 }
719
720
721
722
723
724
727 private function createSocket ():Void
728 {
729 socket = new Socket();
730 socket.active = true;
731
732 var self = this;
733
734
735 socket.onConnect = function (success)
736 {
737 if (! success)
738 {
739
740 var ses = self;
741
742 if (ses["loginMode"] == "reconnect")
743 {
744 ses ["connectionBroken"]();
745 }else
746 {
747 ses ["cancelConnect"]("ses-012");
748 }
749 }
750 };
751
752 socket.onClose = function ()
753 {
754
755 var session = self;
756
757 if (this.active) session ["handleClosedSocket"]();
758 };
759
760 socket.onData = function (str)
761 {
762
763
764 var session = self;
765
766 session ["handleData"](str);
767 };
768 }
769
770
773 private function connect (addr:String, port:Number):Void
774 {
775
776 if (online && loginMode != "reconnect")
777 {
778
779 _global.oregano.iLog.warn("clj-007","");
780 return;
781 }
782
783 if (typeof(addr) != "string" || typeof(port) != "number")
784 {
785
786 _global.oregano.iLog.warn("clj-065","");
787 return;
788 }
789
790 var ok = socket.connect(addr, port);
791 if (! ok)
792 {
793
794 if (loginMode == "reconnect")
795 {
796 connectionBroken();
797 }else
798 {
799
800 cancelConnect("ses-012");
801 }
802 }
803 }
804
805
808 private function handleClosedSocket ():Void
809 {
810 if (online)
811 {
812 connectionBroken();
813 }else
814 {
815
816 _global.oregano.iLog.logLocal("INFO","clj-008","");
817 }
818 }
819
820
826 private function cancelConnect (errCode:String):Void
827 {
828 var err = new _Error(errCode, loginMode, cache);
829 trace(err instanceof _Error);
830 reset();
831
832 fireEvent("error", "onError", err);
833 }
834
835
839 private function connectionBroken ():Void
840 {
841 var err = new _Error("lgt-007", null, null);
842 reset();
843
844 fireEvent("error", "onLogout", err);
845 }
846
847
852 private function handleData (str:String):Void
853 {
854 if (str.substr(0, 13) == "#msgkeepAlive")
855 {
856
857 if (_global.oregano.iLog.infoEnabled()) _global.oregano.iLog.logLocal("INFO", "clj-009", "");
858
859 socket.send(str);
860 return;
861 }
862
863
864 var envFactory = EnvelopeFactory.getInstance();
865 var env = envFactory.getIncoming(str);
866 if (env == null) return;
867
868 if (_global.oregano.iLog.infoEnabled()) _global.oregano.iLog.logLocal("INFO","clj-010","str = " + str + "\nenvelope = " + env);
869
870 var msgRouter = MessageRouter.getInstance();
871 msgRouter.handleIncoming(env);
872 }
873
874
875
876
877
878
883 public static function toLog():String
884 {
885 return "[Objet Session]";
886 }
887
888
892 public static function getInstance():Session
893 {
894 if(_instance == undefined)
895 {
896
897 trace("Oregano client version 1.2.0");
898
899
900 Log.getInstance();
901
902
903 org.omus.util._Error.initDescriptions();
904
905 var resolver = function (propName)
906 {
907 if (_global.org.omus.Log.enablePropLog)
908 {
909 _global.oregano.iLog.error("clj-001","object = " + this.constructor.toLog() + " - property name = " + propName);
910 }
911 };
912 var cl = [
913 org.omus.core.Session,
914 org.omus.core.Group,
915 org.omus.core.User,
916 org.omus.core.Info,
917 org.omus.core.Buddies,
918 org.omus.core.Locks,
919 org.omus.data.DataParser,
920 org.omus.data.DataTransformer,
921 org.omus.data.MarshalledProperties,
922 org.omus.data.Property,
923 org.omus.data.ObjectProperty,
924 org.omus.data.TableProperty,
925 org.omus.data.PropertyLoader,
926 org.omus.data.PropertySet,
927 org.omus.data.Table,
928 org.omus.data.TableBackup,
929 org.omus.data.TableDefinition,
930 org.omus.data.UpdateSequence,
931 org.omus.data.AddRow,
932 org.omus.data.ClearTable,
933 org.omus.data.RemoveRow,
934 org.omus.data.UpdateRow,
935 org.omus.db.DbResult,
936 org.omus.db.DbTransaction,
937 org.omus.db.DbTransactionPart,
938 org.omus.msg.Envelope,
939 org.omus.msg.EnvelopeFactory,
940 org.omus.msg.Mail,
941 org.omus.msg.Mailbox,
942 org.omus.msg.Message,
943 org.omus.msg.MessageRouter,
944 org.omus.msg.Messenger,
945 org.omus.msg.MessageFilter,
946 org.omus.util._Class,
947 org.omus.util.Log,
948 org.omus.util._Error,
949 org.omus.util.ClientInfo,
950 org.omus.util.EventDispatcher,
951 org.omus.util.EventSource
952 ];
953 var len = cl.length;
954 for (var i = 0; i < len; i++)
955 {
956 cl[i].prototype.__resolve = resolver;
957 }
958
959
960 _instance = new Session();
961 }
962 return _instance;
963 }
964 }
965