Question

I'm trying to create a swfPanel for Flash CS5.5 using JSFL. I created my interface in flash and try to communicate with a JSFL command. So, in my .fla file, I use an ExternalInterface with callBack to call a specific function in JSFL, and then swfPanel.call() for the return. The problem I encounter is that I can't pass an Array as argument for the call function (after the AS3 function name). Here's the code :

In AS3 :

function init():void{
    ExternalInterface.addCallback("callBackPanel", JsflCallback);
    MMExecute("fl.runScript( fl.configURI + \"AirMobileFramework/AirMobileFrameworkPanel.jsfl\", \"checkSettings\" );");
}

function JsflCallback(... args):void{
    jsTrace("callback");
}

function jsTrace(str:String):void{
    MMExecute("fl.trace(\"" + str + "\");");
}

In JSFL :

function checkSettings(){   
    var fileSettingsUrl = fl.configURI + "AirMobileFramework/settings.fwk";
    var exist = FLfile.exists(fileSettingsUrl);
    var result = new Array("settings", exist);

    if(!exist){
        FLfile.write(fileSettingsUrl, "");
    } else {
        result.push(FLfile.read(fileSettingsUrl));
    }

    callPanelBack(result);
}

function callPanelBack(result){
    fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
    var panel;
    if(fl.swfPanels.length > 0){ 
        for(x = 0; x < fl.swfPanels.length; x++){
            if(fl.swfPanels[x].name == "AirMobileFramework"){ 
                panel = fl.swfPanels[x];
                panel.call("callBackPanel", result); 
                break; 
            } 
        }
    } else {
        fl.trace("No existing panel");
    }
}

When calling panel.call("callBackPanel", result[0], result[1]); there is no problem, my callback is well called, but when using panel.call("callBackPanel", result); I've an error : La ou les erreurs JavaScript suivantes se sont produites lors de l'exécution de AirMobileFramework : La ou les erreur(s) JavaScript suivantes se sont produites :

Any idea ??

Was it helpful?

Solution

I would guess that it's because JSFL can't parse an array. In the example you give, with result[0], result[1] you have seperate values (probably strigns or numbers), and that should give no problem.

What I would do is this:

panel.call("callBackPanel", result.join("@*$");

and in the as3 function simply just arg.split("@*$")

if your input could have the string "@*$", then you could simply make a call to the SWF for each item in result, and when you're done with the loop there, tell the SWF to gather the things - like this:

function callPanelBack(result){
    fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
    var panel;
    if(fl.swfPanels.length > 0){ 
        for(x = 0; x < fl.swfPanels.length; x++){
            if(fl.swfPanels[x].name == "AirMobileFramework"){ 
                panel = fl.swfPanels[x];
                panel.call("callBackPanelStart"); 
                for(var i=0; i < result.length; i++){
                    panel.call("callBackPanelArgument", result[i])
                }
                panel.call("callBackPanelEnd"); 
                break; 
            } 
        }
    } else {
        fl.trace("No existing panel");
    }
}

and then in AS3:

function callBackPanelStart():void
{
    jsflArray = [];
}

function callBackPanelArgument(argument:*):void
{
    jsflArray.push(argument);
}

function callBackPanelEnd():void
{
    // execute whatever you must on the result
}

OTHER TIPS

This is what you need to pass Arrays back and forth from JSFL: http://exanimo.com/actionscript/jsflinterface/

And worth looking at this as well, once it's released in a week or so: http://www.xjsfl.com

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top