Question

I have a problem with loading SWF and access to their elements by class linkage in Adobe AIR 2.6 for Android. Please, help if anyone know.

Problem:
I have two different .swf files:

file1.swf (in which MovieClip with name1 has class linkage 'mainScreen')
file2.swf (in which MovieClip with name2 has class linkage 'mainScreen')

They have some action script code, which I need to import in my application domain.
Files downloading great.
After downloading they are in differen app domains
But when I'm getting elements by class linkage and add them to stage - only element which was loaded second is shown. Looks like second movieclip with same class linkage replaces the first one.

For this I'm using such approach:

Please, help how can I load two different elements SWF files, which have elements with same class linkage, or explain why I can not do this? When elements have different class linkages - all OK. But!!! It is working for web, but for air it don't want to work.

package
{
    import flash.display.*;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.errors.*;
    import flash.events.*;
    import flash.net.*;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.system.Security;
    import flash.system.SecurityDomain;
    import flash.utils.*;
    import flash.utils.ByteArray;

    import org.bytearray.explorer.SWFExplorer;
    import org.bytearray.explorer.events.*;



public class LoadSWFTest extends Sprite
{
    private static const LOADERS_COUNT:int = 2;

    private var asset_loader1:Loader;
    private var asset_loader2:Loader;
    private var finishedLoaders:int;


    private var urlLoader1:URLLoader;
    private var urlLoader2:URLLoader;
    private var finishedURLLoaders:int;

    private var movAssets:MovieClip;
    private var movReels:MovieClip;

    private static const initAssetsStr:String = "http://dl.dropbox.com/u/11/name1.swf";
    private static const reelsStr:String = "http://dl.dropbox.com/u/11/name2.swf";


    public function LoadSWFTest()
    {
        super();

        // support autoOrients
        //stage.align = StageAlign.TOP_LEFT;
        stage.scaleMode = StageScaleMode.EXACT_FIT;
        this.scaleX = 0.5;
        this.scaleY = 0.5;

        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event:Event):void
    {
        this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        //draw black background
        with( graphics ) 
        {
            beginFill(0x0)
            drawRect(0,0,stage.stageWidth,stage.stageHeight);
        }
        initURLLoaders();
    }

    private function initURLLoaders():void
    {
        finishedURLLoaders = 0;
        trace("finishedLoaders: " + finishedURLLoaders);

        //first loader
        urlLoader1 = new URLLoader();
        urlLoader1.dataFormat = URLLoaderDataFormat.BINARY;
        urlLoader1.addEventListener(Event.COMPLETE, loadCompleteURLLoaders);
        var url1:URLRequest = new URLRequest(initAssetsStr);    
        urlLoader1.load(url1);


        //reels
        urlLoader2 = new URLLoader();
        urlLoader2.dataFormat = URLLoaderDataFormat.BINARY;
        urlLoader2.addEventListener(Event.COMPLETE, loadCompleteURLLoaders);
        var url2:URLRequest = new URLRequest(reelsStr); 
        urlLoader2.load(url2);
    }

    private function loadCompleteURLLoaders(event:Event):void
    {
        finishedURLLoaders += 1;
        trace("loadCompleteURLLoaders. finishedURLLoaders: " + finishedURLLoaders);
        if (finishedURLLoaders == LoadSWFTest.LOADERS_COUNT)
        {
            init();
        }
    }

    //init
    private function init():void
    {
        finishedLoaders = 0;
        trace("finishedLoaders: " + finishedLoaders);

        var context1:LoaderContext = new LoaderContext(true);
        context1.checkPolicyFile = false;
        context1.allowCodeImport = true;
        context1.applicationDomain = ApplicationDomain.currentDomain;


        var context2:LoaderContext = new LoaderContext(true);
        context2.checkPolicyFile = false;
        context2.allowCodeImport = true;
        context2.applicationDomain = ApplicationDomain.currentDomain;

        var arr1:ByteArray = urlLoader1.data as ByteArray;
        var arr2:ByteArray = urlLoader2.data as ByteArray;


        //first loader
        asset_loader1 = new Loader();
        asset_loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
        asset_loader1.loadBytes(arr1, context1);


        //reels
        asset_loader2 = new Loader();
        asset_loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
        asset_loader2.loadBytes(arr2, context2);
    }

    private function loadComplete(event:Event):void
    {
        finishedLoaders += 1;
        trace("loadComplete. finishedLoaders: " + finishedLoaders);
        if (finishedLoaders == LoadSWFTest.LOADERS_COUNT)
        {
            downloadCompleted();
        }
    }

    private function downloadCompleted():void
    {
        trace("downloadCompleted");



        movAssets = getSkinAsset(asset_loader1, 'mainScreen1') as MovieClip;
        movReels = getSkinAsset(asset_loader2, 'mainScreen2') as MovieClip;

        addChild(movAssets);


        setTimeout( showMovie, 5000 );
    }

    private function showMovie():void
    {
        addChild(movReels);
    }

    ///////////////////////////////////////////////
    public function hasAsset(asset_loader:Loader, assetName:String):Boolean 
    {
        try
        {
            var assetClass:Class = asset_loader.contentLoaderInfo.applicationDomain.getDefinition(assetName) as Class;
            return assetClass!=null;
        }
        catch(e:Error) 
        {
            trace(e);
            return false;
        }
        return false;
    }

    public function getSkinAsset(asset_loader:Loader, assetName:String):DisplayObject 
    {
        try
        {
            trace("getSkinAsset: " + assetName);
            var memoryHash:String;

            try
            {
                FakeClass(asset_loader);

            }
            catch (e:Error)
            {
                memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
            }
            trace("asset_loader: " + memoryHash);

            try
            {

                FakeClass(asset_loader.contentLoaderInfo.applicationDomain);
            }
            catch (e:Error)
            {
                memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
            }
            trace("app domain: " + memoryHash);
            trace("Loader: " + asset_loader.contentLoaderInfo.url + " appDomain: " + asset_loader.contentLoaderInfo.applicationDomain); 



            var assetClass:Class = asset_loader.content.loaderInfo.applicationDomain.getDefinition(assetName) as Class;
            var disObj:DisplayObject = new assetClass();
            return disObj;
        } 
        catch(e:Error) 
        {
            throw new IllegalOperationError( 'getSkinAsset( '+assetName + ' ) - error msg: ' + e.message );
        }
        return null;
    }
}

}

internal final class FakeClass { }

Was it helpful?

Solution

I solved my problem, but I don't know why it is so in Adobe AIR:

After loading with URLLoader, I'm using Loader.loadbytes to import SWF into my app domain, with Loader context.

var context2:LoaderContext = new LoaderContext(true);
        context2.checkPolicyFile = false;
        context2.allowCodeImport = true;

//if we comment this line of code - all works grate!      
//context2.applicationDomain = ApplicationDomain.currentDomain;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top