Hello David,

this is not final decision, just to show the idea.

== root =====================================================

import as.Test;
new Test();


== as.Test.as ===============================================
import as.MultiLocalConnection;

class as.Test {

       private var test1_lc : MultiLocalConnection;
       private var test2_lc : MultiLocalConnection;
       private var test3_lc : MultiLocalConnection;
       private var test4_lc : MultiLocalConnection;

       public function Test() {
               this.init();
       }

       private function init() : Void {

               this.test1_lc = new MultiLocalConnection();
               this.test2_lc = new MultiLocalConnection();
               this.test3_lc = new MultiLocalConnection();
               this.test4_lc = new MultiLocalConnection();

               this.test1_lc.onTest = function () {
                       trace("test1_lc.onTest("+arguments+")");
               };
               this.test2_lc.onTest = function () {
                       trace("test2_lc.onTest("+arguments+")");
               };

               this.test1_lc.connect("test");
               this.test2_lc.connect("test");

               this.test3_lc.send("test", "onTest", ["test", 1,
"third param"]);
               this.test4_lc.send("test", "onTest", ["test", 2,
"third param"]); // this send isn't work - thie same frame

               Mouse.addListener(this);
       }

       private function onMouseUp ():Void {
               this.test4_lc.send("test", "onTest", ["test", 2,
"third param"]); // this send isn't work
       }

}

== class as.MultiLocalConnection ============================
import mx.utils.Delegate;

dynamic class as.MultiLocalConnection {

       private var local_connection:LocalConnection;
       private var uid:String;

       public function MultiLocalConnection(Void) {
               this.init();
       }

       private function init() : Void {
               this.local_connection = new LocalConnection();
               this.local_connection["onMessage"]  =
Delegate.create(this, this.onMessage);
               this.uid = new Date().getTime()+"_"+random(10000);
       }

       public function connect (connectionName:String):Boolean {
               this.addMultiListener(connectionName);
               var connect_to:String = connectionName+this.uid;
               return this.local_connection.connect(connect_to);
       }

       public function send (connectionName:String,
methodName:String, args:Object):Boolean {
               var listeners_so:SharedObject =
SharedObject.getLocal(connectionName);
               var listeners_str:String = listeners_so.data[connectionName];
               var listeners:Array = listeners_str.split("|");
               // remove all connections
               listeners_so.data[connectionName] = "";

               args = [connectionName, methodName, args];
               args = args.toString();
               for (var i:Number=0, len:Number=listeners.length; i<len; i++) {
                       var listener_uid:String = listeners[i];
                       if (listener_uid.length) {
                               var connection_name:String =
connectionName+listener_uid;

this.local_connection.send(connection_name, "onMessage", args);
                       }
               }
               return true;
       }

       private function onMessage (args:String):Void {
               var args_array:Array = args.split(",");
               var connectionName:String = ""+args_array.shift();
               var methodName:String = ""+args_array.shift();

               // reset if is available
               this.addMultiListener(connectionName);

               var method:Function = this[methodName];
               if (!method) {
                       return;
               }
               method.call(this, args_array.join(","));
       }

       private function addMultiListener (connectionName:String):Void {
               var listeners_so:SharedObject =
SharedObject.getLocal(connectionName);
               var listeners_str:String = listeners_so.data[connectionName];
               var listeners:Array = listeners_str.split("|");
               if (!listeners.length) {
                       listeners = [];
               }
               for (var i:Number=0, len:Number=listeners.length; i<len; i++) {
                       var listener_uid:String = listeners[i];
                       if (listener_uid == this.uid) {
                               listeners.splice(i, 1);
                               i--;
                       }
               }
               listeners.push(this.uid);
               listeners_so.data[connectionName] = listeners.join("|");
       }

}

=============================================================================

--
Ivan Dembicki
______________________________________________________________________
[EMAIL PROTECTED] | http://www.artlebedev.ru | http://www.sharedfonts.com
_______________________________________________
[email protected]
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com

Reply via email to