--- src/actionscript/org/flowplayer/view/Launcher.as 2009-02-26 08:54:36.000000000 -0600 +++ src/actionscript/org/flowplayer/view/Launcher.as 2009-03-13 08:42:46.000000000 -0500 @@ -96,7 +96,9 @@ [Frame(factoryClass="org.flowplayer.view.Preloader")] public function Launcher() { super("#canvas", this); - addEventListener(Event.ADDED_TO_STAGE, initPhase1); + addEventListener(Event.ADDED_TO_STAGE, function(event:Event):void{ + ConfigLoader.flow_internal::loadConfig(stage.loaderInfo.parameters, initPhase1, event); + }); } private function initPhase1(event:Event):void { --- src/actionscript/org/flowplayer/config/ConfigLoader.as 2009-02-06 10:39:32.000000000 -0600 +++ src/actionscript/org/flowplayer/config/ConfigLoader.as 2009-03-14 04:27:44.000000000 -0500 @@ -23,16 +23,150 @@ import com.adobe.serialization.json.JSON; + import flash.events.Event; + import flash.net.URLLoader; + import flash.net.URLRequest; + import flash.utils.getQualifiedClassName; + /** * @author anssi */ public class ConfigLoader { private static var log:Log = new Log(ConfigLoader); + private static var xmlConfig:XML = new XML(); flow_internal static function parseConfig(config:Object, playerSwfName:String, controlsVersion:String, audioVersion:String):Config { - if (!config) return new Config({}, playerSwfName, controlsVersion, audioVersion); - var configObj:Object = config is String ? JSON.decode(config as String) : config; - return new Config(configObj, playerSwfName, controlsVersion, audioVersion); + var configObj:Object = {}; + if (config) { + configObj = config is String ? JSON.decode(config as String) : config; + } + + if(xmlConfig.toXMLString() != ""){ + var o:Object, forceArray:Array = ['playlist']; + var convertFunc:Function = function(x:XML, prefix:String=""):Object { + var i:int, c:Object, is_array:Boolean, xc:XMLList = x.children(), o:Object = {}, val:Object, cname:String; + + for each (var attrib:XML in x.attributes()) { + o[new String(attrib.name())] = new String(attrib); + } + + for(i=0; i -1 ){ + o[cname] = [val]; + }else{ + o[cname] = val; + } + } + return o; + } + o = convertFunc(xmlConfig); + + if(o.hasOwnProperty('merge')){ + var mergeFunc:Function = function(src:Object, dest:Object):void{ + var curClass:String; + for (var curObj:String in src) { + curClass = getQualifiedClassName(src[curObj]); + if(dest.hasOwnProperty(curObj) && getQualifiedClassName(dest[curObj]) == curClass){ + switch(curClass){ + case 'Array': + case 'Object': + arguments.callee(src[curObj], dest[curObj]); + break; + default: + dest[curObj] = src[curObj]; + break; + } + }else{ + dest[curObj] = src[curObj]; + } + } + }; + + mergeFunc(o,configObj); + }else{ + /* do not merge, overwrite */ + o.playerId = configObj.playerId; + configObj = o; + } + + } + + return new Config(configObj, playerSwfName, controlsVersion, audioVersion); + } + + flow_internal static function loadConfig(vars:Object, onReadyCall:Function, event:Event):Boolean { + if (!vars) return onReadyCall(event); + + var xmlUrlRequest:URLRequest; + var configObj:Object; + + var xmlUrl:String; + var keyString:String; + var randString:String = new String(Math.round(Math.random()*100000)); + var qString:String = '_r=' + randString; + + if(vars.hasOwnProperty("config")) { + configObj = vars["config"] is String ? JSON.decode(vars["config"] as String) : vars["config"]; + } + + if(configObj && configObj.hasOwnProperty("xml")){ + xmlUrl = configObj["xml"]; + }else if(vars.hasOwnProperty("xml")){ + xmlUrl = vars.xml; + }else{ + return onReadyCall(event); + } + + if(xmlUrl.indexOf('?')>0){ + qString = xmlUrl.substr(xmlUrl.indexOf('?')) + '&' + qString; + xmlUrl = xmlUrl.substr(0, xmlUrl.indexOf('?')); + }else{ + qString = '?' + qString; + } + + xmlUrlRequest = new URLRequest(xmlUrl + qString); + + if(xmlUrl){ + var xmlLoader:URLLoader = new URLLoader(); + + xmlLoader.addEventListener("complete", function():void { + xmlConfig = new XML(xmlLoader.data); + onReadyCall(event); + }); + xmlLoader.addEventListener("ioError", function():void { + onReadyCall(event); + }); + + xmlLoader.load(xmlUrlRequest); + + return false; + } + return onReadyCall(event); } } } +