home *** CD-ROM | disk | FTP | other *** search
Wrap
package mochi { import flash.display.*; import flash.events.*; import flash.net.*; import flash.system.*; import flash.utils.*; public class MochiServices { private static var _container:Object; private static var _connected:Boolean = false; private static var _swfVersion:String; private static var _sendChannel:LocalConnection; private static var _rcvChannelName:String; private static var _gatewayURL:String = "http://www.mochiads.com/static/lib/services/services.swf"; private static var _clip:MovieClip; private static var _loader:Loader; private static var _id:String; private static var _listenChannel:LocalConnection; private static var _timer:Timer; private static var _sendChannelName:String; private static var _startTime:Number; private static var _connecting:Boolean = false; public static var onError:Object; private static var _listenChannelName:String = "__mochiservices"; private static var _rcvChannel:LocalConnection; public function MochiServices() { super(); } public static function isNetworkAvailable() : Boolean { return Security.sandboxType != "localWithFile"; } public static function send(param1:String, param2:Object = null, param3:Object = null, param4:Object = null) : void { if(_connected) { _sendChannel.send(_sendChannelName,"onReceive",{ "methodName":param1, "args":param2, "callbackID":_clip._nextcallbackID }); } else { if(_clip == null || !_connecting) { onError("NotConnected"); handleError(param2,param3,param4); flush(true); return; } _clip._queue.push({ "methodName":param1, "args":param2, "callbackID":_clip._nextcallbackID }); } if(_clip != null) { if(_clip._callbacks != null && _clip._nextcallbackID != null) { _clip._callbacks[_clip._nextcallbackID] = { "callbackObject":param3, "callbackMethod":param4 }; ++_clip._nextcallbackID; } } } public static function get connected() : Boolean { return _connected; } private static function flush(param1:Boolean) : void { var _loc2_:Object = null; var _loc3_:Object = null; if(_clip != null) { if(_clip._queue != null) { while(_clip._queue.length > 0) { _loc2_ = _clip._queue.shift(); _loc3_ = null; if(_loc2_ != null) { if(_loc2_.callbackID != null) { _loc3_ = _clip._callbacks[_loc2_.callbackID]; } delete _clip._callbacks[_loc2_.callbackID]; if(param1 && _loc3_ != null) { handleError(_loc2_.args,_loc3_.callbackObject,_loc3_.callbackMethod); } } } } } } private static function init(param1:String, param2:Object) : void { _id = param1; if(param2 != null) { _container = param2; loadCommunicator(param1,_container); } } public static function get childClip() : Object { return _clip; } public static function get id() : String { return _id; } public static function stayOnTop() : void { _container.addEventListener(Event.ENTER_FRAME,MochiServices.bringToTop,false,0,true); if(_clip != null) { _clip.visible = true; } } public static function getVersion() : String { return "1.31"; } public static function disconnect() : void { if(Boolean(_connected) || Boolean(_connecting)) { if(_clip != null) { if(_clip.parent != null) { if(_clip.parent is Sprite) { Sprite(_clip.parent).removeChild(_clip); _clip = null; } } } _connecting = _connected = false; flush(true); try { _listenChannel.close(); _rcvChannel.close(); } catch(error:Error) { } } if(_timer != null) { try { _timer.stop(); } catch(error:Error) { } } } public static function allowDomains(param1:String) : String { var _loc2_:String = null; Security.allowDomain("*"); Security.allowInsecureDomain("*"); if(param1.indexOf("http://") != -1) { _loc2_ = String(param1.split("/")[2].split(":")[0]); Security.allowDomain(_loc2_); Security.allowInsecureDomain(_loc2_); } return _loc2_; } public static function doClose() : void { _container.removeEventListener(Event.ENTER_FRAME,MochiServices.bringToTop); if(_clip.parent != null) { Sprite(_clip.parent).removeChild(_clip); } } public static function setContainer(param1:Object = null, param2:Boolean = true) : void { if(param1 != null) { if(param1 is Sprite) { _container = param1; } } if(param2) { if(_container is Sprite) { Sprite(_container).addChild(_clip); } } } private static function onStatus(param1:StatusEvent) : void { switch(param1.level) { case "error": _connected = false; _listenChannel.connect(_listenChannelName); } } private static function initComChannels() : void { if(!_connected) { _sendChannel.addEventListener(StatusEvent.STATUS,MochiServices.onStatus); _sendChannel.send(_sendChannelName,"onReceive",{"methodName":"handshakeDone"}); _sendChannel.send(_sendChannelName,"onReceive",{ "methodName":"registerGame", "id":_id, "clip":_container, "version":getVersion() }); _rcvChannel.addEventListener(StatusEvent.STATUS,MochiServices.onStatus); _clip.onReceive = function(param1:Object):void { var cb:String = null; var cblst:Object = null; var method:* = undefined; var methodName:String = null; var obj:Object = null; var pkg:Object = param1; cb = String(pkg.callbackID); cblst = this.client._callbacks[cb]; if(!cblst) { return; } method = cblst.callbackMethod; methodName = ""; obj = cblst.callbackObject; if(Boolean(obj) && typeof method == "string") { methodName = method; if(obj[method] != null) { method = obj[method]; } } if(method != undefined) { try { method.apply(obj,pkg.args); } catch(error:Error) { } } else if(obj != null) { try { obj(pkg.args); } catch(error:Error) { } } delete this.client._callbacks[cb]; }; _clip.onError = function():void { MochiServices.onError("IOError"); }; _rcvChannel.connect(_rcvChannelName); _connecting = false; _connected = true; _listenChannel.close(); while(_clip._queue.length > 0) { _sendChannel.send(_sendChannelName,"onReceive",_clip._queue.shift()); } } } private static function listen() : void { _listenChannel = new LocalConnection(); _listenChannel.client = _clip; _clip.handshake = function(param1:Object):void { MochiServices.comChannelName = param1.newChannel; }; _listenChannel.allowDomain("*","localhost"); _listenChannel.allowInsecureDomain("*","localhost"); _listenChannel.connect(_listenChannelName); } private static function handleError(param1:Object, param2:Object, param3:Object) : void { var args:Object = param1; var callbackObject:Object = param2; var callbackMethod:Object = param3; if(args != null) { if(args.onError != null) { args.onError.apply(null,["NotConnected"]); } } if(callbackMethod != null) { args = {}; args.error = true; args.errorCode = "NotConnected"; if(callbackObject != null && callbackMethod is String) { try { callbackObject[callbackMethod](args); } catch(error:Error) { } } else if(callbackMethod != null) { try { callbackMethod.apply(args); } catch(error:Error) { } } } } public static function get clip() : Object { return _container; } public static function set comChannelName(param1:String) : void { if(param1 != null) { if(param1.length > 3) { _sendChannelName = param1 + "_fromgame"; _rcvChannelName = param1; initComChannels(); } } } private static function loadCommunicator(param1:String, param2:Object) : MovieClip { var clipname:String = null; var f:Function = null; var req:URLRequest = null; var id:String = param1; var clip:Object = param2; clipname = "_mochiservices_com_" + id; if(_clip != null) { return _clip; } if(!MochiServices.isNetworkAvailable()) { return null; } MochiServices.allowDomains(_gatewayURL); _clip = createEmptyMovieClip(clip,clipname,10336,false); _loader = new Loader(); _timer = new Timer(1000,0); _startTime = getTimer(); _timer.addEventListener(TimerEvent.TIMER,connectWait); _timer.start(); f = function(param1:Object):void { _clip._mochiad_ctr_failed = true; MochiServices.disconnect(); MochiServices.onError("IOError"); }; _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,f); req = new URLRequest(_gatewayURL); _loader.load(req); _clip.addChild(_loader); _clip._mochiservices_com = _loader; _sendChannel = new LocalConnection(); _clip._queue = []; _rcvChannel = new LocalConnection(); _rcvChannel.allowDomain("*","localhost"); _rcvChannel.allowInsecureDomain("*","localhost"); _rcvChannel.client = _clip; _clip._nextcallbackID = 0; _clip._callbacks = {}; listen(); return _clip; } public static function bringToTop(param1:Event) : void { var e:Event = param1; if(MochiServices.clip != null) { if(MochiServices.childClip != null) { try { if(MochiServices.clip.numChildren > 1) { MochiServices.clip.setChildIndex(MochiServices.childClip,MochiServices.clip.numChildren - 1); } } catch(errorObject:Error) { _container.removeEventListener(Event.ENTER_FRAME,MochiServices.bringToTop); } } } } public static function connect(param1:String, param2:Object, param3:Object = null) : void { var id:String = param1; var clip:Object = param2; var onError:Object = param3; if(clip is DisplayObject) { if(!_connected && _clip == null) { _connecting = true; init(id,clip); } } if(onError != null) { MochiServices.onError = onError; } else if(MochiServices.onError == null) { MochiServices.onError = function(param1:String):void { }; } } public static function createEmptyMovieClip(param1:Object, param2:String, param3:Number, param4:Boolean = true) : MovieClip { var mc:MovieClip = null; var parent:Object = param1; var name:String = param2; var depth:Number = param3; var doAdd:Boolean = param4; mc = new MovieClip(); if(doAdd) { if(false && Boolean(depth)) { parent.addChildAt(mc,depth); } else { parent.addChild(mc); } } try { parent[name] = mc; } catch(e:Error) { throw new Error("MochiServices requires a clip that is an instance of a dynamic class. If your class extends Sprite or MovieClip, you must make it dynamic."); } mc["_name"] = name; return mc; } public static function connectWait(param1:TimerEvent) : void { if(getTimer() - _startTime > 10000) { if(!_connected) { _clip._mochiad_ctr_failed = true; MochiServices.disconnect(); MochiServices.onError("IOError"); } _timer.stop(); } } } }