// mWIMSadbCC mApplicatManager package { public class mApplicatManager { var wcc : mWIMSadbCC; var channels : mClientChannel; var Applets : Array = new Array(); var AppletCount : int = 0; var downloadmanager : Object = null; public var CommonVariables : Array = new Array(); public var _AuthChanApplet : AppletObject; // var _mainAppletChanned const UNDEFINED : String = "$$"; public function mApplicatManager(wcc:mWIMSadbCC,channels:mClientChannel):void { this.wcc = wcc; this.channels = channels; _AuthChanApplet=null; wcc.log("[WIMS] AppletManager: Init"); } private function boo(tk:String):Boolean { return soo(tk,"true"); } private function soo(tk:String,tv:String):Boolean { if (tk!=null) { if (tk.toUpperCase()==tv.toUpperCase()) { return true; } else { return false; } } else { return false; } } private function iint(tk:String):int { if (tk!=null) { return int(tk); } else { return 0; } } public function getDownloadManager():Object { return downloadmanager; } public function registerDefaultDownloadManager(dm:Object) { if (dm!=null) { downloadmanager=dm; } } public function unregisterDefaultDownloadManager() { downloadmanager=null; } public function CreateClientObject(pb:Array):void { var i:int = getClientObjectIdx(pb[12]); var s:Array; var c:int; if (i>0) { Applets[i].capplet_moid=pb[4]; Applets[i].ObjectSignals(new Array("$RESTART")); Applets[i].ServerObjectInit(); } else { AppletCount++; var ThisApplet : AppletObject; c = iint(pb[17]); if (c>0) { var o : AppletObject = CreateActiveContainer(pb[17]); ThisApplet = new AppletObject(wcc,this,AppletCount,iint(pb[3]),pb[4],pb[5],pb[6],pb[7],iint(pb[8]),iint(pb[9]),boo(pb[10]),boo(pb[11]),pb[12],pb[13],iint(pb[14]),iint(pb[15]),o); o.AddContainerChild(ThisApplet); } else { ThisApplet = new AppletObject(wcc,this,AppletCount,iint(pb[3]),pb[4],pb[5],pb[6],pb[7],iint(pb[8]),iint(pb[9]),boo(pb[10]),boo(pb[11]),pb[12],pb[13],iint(pb[14]),iint(pb[15]),null); } Applets[AppletCount] = ThisApplet; } if (pb[16]!=UNDEFINED) { s = wcc.sv(pb[16]).split(','); for (var t:int=1; t<=s.length; t++) { channels.serviceJoin(s[t-1],ThisApplet); } } if ((pb[18]!=null) && (pb[18].toUpperCase()=="TRUE")) { wRegisterAuthChanApplet(ThisApplet); } } public function ObjectsStructureExceptionsLocalManager(obj:AppletObject, err:int) { var l:String; switch(err) { // Alerts the server case 1 : // error downloading the object X l="error downloading the object"; break; case 2 : // object not WIMS compliant (InitWIMSClientObject) X l="object not WIMS compliant (InitWIMSClientObject)"; break; case 3 : // object refused to start X l="object refused to start"; break; case 4 : // object not WIMS compliant (ObjectSignals) - l="object not WIMS compliant (ObjectSignals)"; break; case 5 : // object not WIMS compliant (ChannelsSignal) - l="object not WIMS compliant (ChannelsSignal)"; break; case 6 : // object not WIMS compliant (AppletSignal) - l="object not WIMS compliant (AppletSignal)"; break; case 7 : // object not WIMS compliant (MediaSignals) - l="object not WIMS compliant (MediaSignals)"; break; case 8 : // container has no dx/dy dimensions - l="container has no dx/dy dimensions"; break; default : l="panic: undefined"; break; } wcc.log("WCC ERROR | mApplicatManager | object: "+obj.capplet_instance+" errorcode = "+err+" cause: "+l); } public function ObjectSignals(moid:String, instance:String, _tokens:Array) { var i:int; if (isNaN(Number(moid))) { if (moid=="*") { unreferencedObjectSignal(instance,_tokens); } else { var t:Array = new Array(instance); unreferencedObjectSignal(moid,t.concat(_tokens)); } } else { for (i=1; i<=AppletCount; i++) { if ((Applets[i]!=null) && (Applets[i].capplet_moid==moid)) { Applets[i].ObjectSignals(_tokens); } } } } public function unreferencedObjectSignal(instance:String,_tokens:Array) { for (var i:int=1; i<=AppletCount; i++) { if ((Applets[i]!=null) && (Applets[i].capplet_instance==instance)) { Applets[i].ObjectSignals(_tokens); } } } public function getUnreferencedAppletObject(instance:String):Object { var i:int = 1; var f:int = 0; while ((f<1) && (i<=AppletCount)) { if ((Applets[i]!=null) && (Applets[i].capplet_instance==instance)) { f=i; } i++; } if (f>0) { return Applets[f]; } else { return null; } } public function downloadObject(moid:String, weburl:String, opt:String) { for (var i:int=1; i<=AppletCount; i++) { if ((Applets[i]!=null) && (Applets[i].capplet_moid==moid)) { if ((_AuthChanApplet!=null) && (_AuthChanApplet.capplet_moid==Applets[i].capplet_moid)) { _AuthChanApplet=null; } Applets[i].downloadObject(weburl,boo(opt)); } } } public function DisposeClientObject(moid:String) { for (var i:int=1; i<=AppletCount; i++) { if ((Applets[i]!=null) && (Applets[i].capplet_moid==moid)) { DisposeThisClientObject(i); } } } private function getClientObjectIdx(spath:String):int { var fnd:int = -1; var c:int = 1; while ((fnd<0) && (c<=AppletCount)) { if ((Applets[c]!=null) && (Applets[c].server_path==spath)) { fnd=c; } else { c++; } } return fnd; } public function getClientObject(spath:String):AppletObject { var c : int = getClientObjectIdx(spath); if (c>0) { return Applets[c]; } else { return null; } } public function DisposeThisClientObject(i:int):void { if (Applets[i]!=null) { if (Applets[i].capplet_pparam!="NONE$$") { Applets[i].ObjectSignals(new Array("$DESTROY")); } Applets[i].RemoveActiveContainer(); Applets[i]._unload(); if (Applets[i].container!=null) { Applets[i].container.unloadAndStop(); } Applets[i]._AppletObject=null Applets[i]=null; } } private function DisposeAllClientObjects():void { var fo:Boolean = false; if (AppletCount>0) { for (var i:int=AppletCount; i>0; i--) { if (fo) { if (Applets[i]!=null) { if (!Applets[i].capplet_tsr) { DisposeThisClientObject(i); } else { if (Applets[i].capplet_pparam!="NONE$$") { Applets[i].ObjectSignals(new Array("$DISCONNECT")); } } } } else { if (Applets[i]!=null) { if (Applets[i].capplet_tsr) { if (Applets[i].capplet_pparam!="NONE$$") { Applets[i].ObjectSignals(new Array("$DISCONNECT")); } fo=true; } else { DisposeThisClientObject(i); AppletCount--; } } else { AppletCount--; } } } } } public function _reset():void { wcc.log("[WIMS] AppletManager: Reset"); DisposeAllClientObjects(); _AuthChanApplet=null; } public function allapplets(cmd:String,param:Array):void { if ((cmd!=null) && (cmd.length>0)) { for (var i:int=1; i<=AppletCount; i++) { if (Applets[i]!=null) { Applets[i].AppletSignal(cmd,param); } } } } public function _dumpApplets() { wcc.log("Internal modules dump (count="+AppletCount+"):"); if (AppletCount>0) { for (var i:int=1; i<=AppletCount; i++) { if (Applets[i]!=null) { wcc.log("module at "+i+ " id="+Applets[i].capplet_id+ " moid="+Applets[i].capplet_moid+ " instance="+Applets[i].capplet_instance+ " pparam="+Applets[i].capplet_pparam+ " target="+Applets[i].capplet_target+ " serverpath="+Applets[i].server_path+ " hasContainer="+Applets[i].hasContainer); } else { wcc.log("module at "+i+" is NULL"); } } wcc.log("end of report.\n"); } } function wRegisterAuthChanApplet(ao:AppletObject):void { _AuthChanApplet=ao; } public function CreateActiveContainer(moid:String):AppletObject { var res : AppletObject = null; var fnd : Boolean = false; for (var i:int=1; i<=AppletCount; i++) { if (!fnd && (Applets[i]!=null) && (Applets[i].capplet_moid==moid)) { res = Applets[i]; res.CreateActiveContainer(); fnd=true; } } return res; } public function ContainerChildFG(moid:String,capp:String):void { var res : AppletObject = null; var fnd : Boolean = false; for (var i:int=1; i<=AppletCount; i++) { if (!fnd && (Applets[i]!=null) && (Applets[i].capplet_moid==moid)) { Applets[i].ContainerChildFG(capp); fnd=true; } } } } } import flash.display.*; import flash.system.*; import flash.events.*; import flash.net.*; class AppletObject { public var wcc : mWIMSadbCC; public var MovieMedia : mMovieMedia; var appmanager : mApplicatManager; var idx : int = 0; // istitutional properties var _AppletSign : String; var _AppletObject : Object; var _AppletChannel : String; // server object properties public var capplet_id : String; var capplet_ptype : int; var capplet_moid : String; var capplet_instance: String; public var capplet_pparam : String; var capplet_xpos : int = 0; var capplet_ypos : int = 0; var capplet_dx : int = -1; var capplet_dy : int = -1; var capplet_visible : Boolean = false; var capplet_tsr : Boolean = false; var capplet_target : String; var server_path : String; var active : Boolean = false; var _state : int; // loader var loader : URLLoader = new URLLoader(); var container : Loader = new Loader(); var mcontainer : Sprite = new Sprite(); public var dlprogress : int = -1; // container var norun : Boolean = false; var _masked : Boolean = false; var _mask : Sprite = new Sprite(); var _maskadded : Boolean = false; var hasChilds : Boolean = false; var hasContainer : Object = null; var myApplets : Array = new Array(); var myAppletsCount : int = 0; public function AppletObject(wcc:mWIMSadbCC,appman:mApplicatManager,idx:int,ptype:int,moid:String,id:String,instance:String,pathparam:String,xpos:int,ypos:int,cvisible:Boolean,tsr:Boolean,sfullpath:String,target:String,dx:int,dy:int,hc:Object) { this.wcc = wcc; this.appmanager = appman; this.idx = idx; this.capplet_ptype = ptype; this.capplet_moid = moid; this.capplet_id = id; this.capplet_instance = instance; this.capplet_pparam = pathparam; this.capplet_xpos = xpos; this.capplet_ypos = ypos; this.capplet_dx = dx; this.capplet_dy = dy; this.capplet_visible = cvisible; this.capplet_tsr = tsr; this.capplet_target = target; this.server_path = sfullpath; this.hasContainer = hc; _AppletSign = capplet_instance; _state = 1; /* define clientapplet --mwfo 1023 10 10 true SEQ SYS OCLOAD 1 1126 trackplayer tp1 mwfo89123400000.swf 10 10 TRUE define clientapplet --clientpath self SEQ SYS OCLOAD 2 1126 trackplayer $ $ define clientapplet --clientpath root.container.object SEQ SYS OCLOAD 2 1126 trackplayer $ root.container define clientapplet http://repository.mc2labs.com/apps/test.swf SEQ SYS OCLOAD 0 1126 trackplayer tp1 http://www/test.swf 10 10 TRUE (old:) SEQ SYS CAPPLETLOAD x y (new:) SEQ SYS OCLOAD x y */ MovieMedia=wcc.getMediaclass(); setup(); switch(ptype) { case 0 : downloadObject(pathparam,false); break; case 1 : // deprecated: use dbfile() on server break; case 2 : if (pathparam=="$") { // assign to pre-preregistered movieclips } else { _AppletObject=this[pathparam]; // to check, even with __wRoot !!! // check consistency ServerObjectInit(); } break; case 3 : // not else (because we are a container) break; } } private function dman(signal:String) { if (appmanager.getDownloadManager()!=null) { try { appmanager.getDownloadManager().wApplicatSetDownloaderStatus(this,signal); } catch(e:Object) { wcc.log("WCC ERROR | mApplicatManager | download manager at "+appmanager.getDownloadManager()+" is invalid"); } } } private function _resolveFlashPath(so:Object,rt:String):Object { var res : Object = so; var pth : Array = rt.split("."); var a: int = pth.length; var i: int = 1; while ((a>0) && (i<=a)) { res=res.getChildByName(pth[i-1]); i++; } return res; } private function resolveFlashPath(rt:String):Object { var res: Object = wcc.__wRoot; var pth: Array = rt.split("."); var a : int = pth.length; if (a>0) { if (pth[0].toLowerCase()=="this") { var o:Object; var sp:Array = server_path.split("."); if (sp.length>1) { o=appmanager.getClientObject(sp.slice(0,sp.length-1).join(".")); if ((o!=null) && (o.container.content!=null)) { res=o.container.content; } else { o=res; } } else { o=res; } if (a>1) { res=_resolveFlashPath(res,pth.slice(1).join(".")); } } else { res=_resolveFlashPath(res,rt); } } return res; } public function setVisible(opt:Boolean):void { container.visible=opt; } public function getFlashPath():Object { if (capplet_target=="root") { return wcc.__wRoot; } else { return resolveFlashPath(capplet_target); } } private function setup() { if (capplet_target=="root") { wcc.__wRoot.addChild(container); } else { resolveFlashPath(capplet_target).addChild(container); } container.x=capplet_xpos; container.y=capplet_ypos; container.visible=capplet_visible; if ((capplet_ptype==3) && (capplet_dx>0) && (capplet_dy>0)) { _mask.graphics.beginFill(0xFF0000); _mask.graphics.drawRect(capplet_xpos,capplet_ypos,capplet_dx,capplet_dy); _masked=true; mcontainer.x=capplet_xpos; mcontainer.y=capplet_ypos; mcontainer.graphics.drawRect(0,0,capplet_dx-capplet_xpos,capplet_dy-capplet_ypos); mcontainer.graphics.beginFill(0x00FF00); } loader.dataFormat = URLLoaderDataFormat.BINARY; if (capplet_pparam!="NONE$$") { dman("init"); } wcc.addEventListener(Event.OPEN,setup_hndlr1); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,setup_hndlr2); loader.addEventListener(IOErrorEvent.IO_ERROR,setup_hndlr3); loader.addEventListener(ProgressEvent.PROGRESS,setup_hndlr4); loader.addEventListener(Event.COMPLETE,setup_hndlr5); } private function setup_hndlr1():void { dman("start"); } private function setup_hndlr2(e:SecurityErrorEvent):void { wcc.log("security sandbox error: "+e.toString()); dman("security"); gesterror(0); } private function setup_hndlr3(e:IOErrorEvent):void { dman("error"); gesterror(1); } private function setup_hndlr4(e:ProgressEvent):void { dlprogress=Math.round(e.bytesLoaded/e.bytesTotal*100); dman("progress"); } private function setup_hndlr5(e:Event):void { dman("complete"); var AD:ApplicationDomain = ApplicationDomain.currentDomain; var context:LoaderContext = new LoaderContext(false,AD); // context.allowLoadBytesCodeExecution=true; // AIR? context.allowCodeImport=true; container.contentLoaderInfo.addEventListener(Event.COMPLETE,_objectloaded); container.loadBytes(loader.data,context); container.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,_objectexception); } private function removeAllOtherEventListeners():void { wcc.removeEventListener(Event.OPEN,setup_hndlr1); wcc.removeEventListener(Event.OPEN,setup_hndlr2); wcc.removeEventListener(Event.OPEN,setup_hndlr3); wcc.removeEventListener(Event.OPEN,setup_hndlr4); wcc.removeEventListener(Event.OPEN,setup_hndlr5); } private function _objectloaded(e:Event) { container.contentLoaderInfo.removeEventListener(Event.COMPLETE,_objectloaded); container.uncaughtErrorEvents.removeEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,_objectexception); // me n'ero dimenticato. ora togliere tutti i listener on destroy if ((capplet_pparam=="NONE$$") && (!norun)) { capplet_pparam="OK"; } _AppletObject=container.content; if (_masked) { _maskadded=true; if (capplet_target=="root") { wcc.__wRoot.addChild(_mask); } else { resolveFlashPath(capplet_target).addChild(_mask); } _AppletObject.mask=_mask; } if (!norun) { ExecuteObject(); } else { ServerObjectInit(); norun=false; } //wcc.__wRoot.setChildIndex(wcc.__wRoot.mWIMSadbCC,wcc.__wRoot.numChildren-1); } private function _objectexception(ue:UncaughtErrorEvent):void { ue.preventDefault(); if (ue.error is Error) { var e:Error = ue.error as Error; // do something with the error wcc.log("WCC ERROR | mApplicatManager | object: "+capplet_instance+" runtime exception:"); wcc.log("| error id = "+e.errorID); wcc.log("| name = "+e.name); if (Capabilities.isDebugger) { wcc.log("| stack:"); wcc.log(e.getStackTrace()); } else { wcc.log("| message = "+e.message); } wcc.log("end of report."); } else { if (ue.error is ErrorEvent) { var ee:ErrorEvent = ue.error as ErrorEvent; wcc.log("WCC ERROR | mApplicatManager | object: "+capplet_instance+" event exception = "+ee); } else { wcc.log("WCC ERROR | mApplicatManager | object: "+capplet_instance+" unknown exception"); } } } public function _unload() { removeAllOtherEventListeners(); if (!hasChilds && _masked && _maskadded) { if (capplet_target=="root") { wcc.__wRoot.removeChild(_mask); } else { resolveFlashPath(capplet_target).removeChild(_mask); } _maskadded=false; _AppletObject.mask=null; } } public function downloadObject(weburl:String, _norun:Boolean) { if (weburl.toUpperCase()!="NULL") { if (weburl!="NONE$$") { if ((weburl!=null) && (weburl.length>0) && (weburl!="$NONE$")) { norun=_norun; loader.load(new URLRequest(weburl)); } else { gesterror(1); } } } else { container.unload(); } } private function gesterror(err:int) { appmanager.ObjectsStructureExceptionsLocalManager(this,err); wcc.wSendRAW("SYS|OCERROR|"+capplet_instance+wcc._sl+capplet_moid+wcc._sl+err); } public function ExecuteObject() { var res : Boolean = false; try { res=_AppletObject.InitWIMSClientObject(this); if (res) { ServerObjectInit(); } else { gesterror(3); container.unloadAndStop(); } } catch(e:Object) { gesterror(2); trace("ERROR STACKTRACE:\n"+e.getStackTrace()); } } public function ServerObjectInit() { wcc.wSendRAW("SYS|OCLOADED|"+capplet_instance+wcc._sl+capplet_moid); } public function capplet(cmds:String) { wcc.wSendSEQ(wcc.SYS+wcc._sl+wcc.__APPLET+wcc._sl+capplet_moid+wcc._sl+capplet_instance+wcc._sl+cmds); } public function ccapplet(cmd:String, cmds:String) { wcc.wSendSEQ(wcc.SYS+wcc._sl+wcc.__APPLET+wcc._sl+capplet_moid+wcc._sl+capplet_instance+wcc._sl+cmd+wcc._sl+cmds); } public function ObjectSignals(_tokens:Array) { if (capplet_pparam!="NONE$$") { try { _AppletObject.wObjectSignals(_tokens[0],_tokens.slice(1)); } catch(e:Object) { appmanager.ObjectsStructureExceptionsLocalManager(this,4); trace("ERROR STACKTRACE:\n"+e.getStackTrace()); } } } public function AppletSignal(cmd:String,param:Array) { if (capplet_pparam!="NONE$$") { try { _AppletObject.wAppletSignal(cmd,param); } catch(e:Object) { appmanager.ObjectsStructureExceptionsLocalManager(this,6); } } } public function getobj():Object { return _AppletObject; } public function getContainer():Object { return mcontainer; } public function CreateActiveContainer():void { if (!hasChilds) { hasChilds=true; if (_masked) { var fpath:Object; if (capplet_target=="root") { fpath=wcc.__wRoot; } else { fpath=resolveFlashPath(capplet_target); } mcontainer.name=capplet_instance; mcontainer.mask=_mask; fpath.addChild(mcontainer); fpath.addChild(_mask); } else { appmanager.ObjectsStructureExceptionsLocalManager(this,8); } } else { hideAllContainerChilds(); } } public function RemoveActiveContainer():void { if (hasChilds) { var fpath:Object; if (capplet_target=="root") { fpath=wcc.__wRoot; } else { fpath=resolveFlashPath(capplet_target); } fpath.removeChild(_mask); fpath.removeChild(mcontainer); } } public function AddContainerChild(obj:AppletObject):void { if (obj!=null) { myAppletsCount++; myApplets[myAppletsCount]=obj; } } public function hideAllContainerChilds():void { if (myAppletsCount>0) { for (var i:int=1; i<=myAppletsCount; i++) { myApplets[i].setVisible(false); } } } public function ContainerChildFG(capp:String):void { if (myAppletsCount>0) { for (var i:int=1; i<=myAppletsCount; i++) { if (myApplets[i].capplet_instance==capp) { myApplets[i].setVisible(true); } else { myApplets[i].setVisible(false); } } } } public function setCommonVariable(i:int,o:Object):void { appmanager.CommonVariables[i]=o; } public function getCommonVariable(i:int):Object { return appmanager.CommonVariables[i]; } } /* // Applet native support _AppletArraySign = new Array(); _AppletArrayObject = new Array(); _AppletArrayChanned = new Array(); _AppletCount = 0; _mainAppletChanned = 0; _AuthChanApplet = null; function existApplet(_sign) { var res=-1; if (_AppletCount>0) { for (i=1; i<=_AppletCount; i++) { if (_sign==_AppletArraySign[i]) { res=i; } } } return res; } function updateAppletObject(_signidx,_sign,_path) { if (_signidx<0) { _AppletCount++; _signidx=_AppletCount; _AppletArrayChanned[_signidx]=nada; } _AppletArraySign[_signidx]=_sign; _AppletArrayObject[_signidx]=_path; } function wRegisterApplet(sign,path) { updateAppletObject(existApplet(sign),sign,path); } function wUpdateApplet(sign) { var res=existApplet(sign); if (res>0) { eval(_AppletArrayObject[res]).wUpdateApplet(GetToken(4),5); } } function wExecApplet(sign,cmd) { var res=existApplet(sign); if (res>0) { eval(_AppletArrayObject[res]).wUpdateApplet(cmd,0); } } function wUnregisterApplets() { if (_AppletCount>0) { for (i=1; i<=_AppletCount; i++) { _AppletArraySign[i]=nada; _AppletArrayObject[i]=null; _AppletArrayChanned[i]=nada; } } _AppletCount=0; _mainAppletChanned=-1; } function wUnregisterApplet(sign) { var res=existApplet(sign); if (res>0) { _AppletArraySign[res]=nada; _AppletArrayObject[res]=null; _AppletArrayChanned[res]=nada; if (_mainAppletChanned==res) { _mainAppletChanned=-1; } } } function wRegisterChanApplet(sign,flag) { var res=existApplet(sign); if (res>0) { _AppletArrayChanned[res]=flag; if (_mainAppletChanned<=0) { _mainAppletChanned=res; } } } function wReRegisterChanApplet(sign,flag) { for (i=1; i<=_AppletCount; i++) { if (_AppletArrayChanned[i]==flag) { _AppletArrayChanned[i]=nada; } } wRegisterChanApplet(sign,flag); } function existAppletChanning(_sign) { var res=-1; if (_AppletCount>0) { for (i=1; i<=_AppletCount; i++) { if (_sign==_AppletArrayChanned[i]) { res=i; } } } return res; } function wAppletDump() { if (_AppletCount>0) { for (i=1; i<=_AppletCount; i++) { log("APPLET "+_AppletArraySign[i]+" idx="+i+" at "+_AppletArrayObject[i]); } } log("Applet dump executed."); } function allapplets(_signal,_param) { if (_AppletCount>0) { for (i=1; i<=_AppletCount; i++) { eval(_AppletArrayObject[i]).wAppletSignal(_signal,_param); } } } */