开发者

Load External Class from content in another sandbox

开发者 https://www.devze.com 2023-01-15 10:08 出处:网络
The problem is: I have (for example) font embeder class, and I want to load external SWF not from application storage folder, but another local path ( \"D:\\blah-blah\\123.swf\") in AIR, but as you un

The problem is: I have (for example) font embeder class, and I want to load external SWF not from application storage folder, but another local path ( "D:\blah-blah\123.swf") in AIR, but as you understand I can't find any decision on the Internet (Google, Adode.com)

Security.allowDomain() not working in AIR ( documented on adobe.com)


Trick with ApplicationDomain is not working ( same documented on adobe.com)

The all I want, is to get CLASS REFERENCE from loaded content and use in load initiator.

Does anybody knows how to solve this problem?

listing code for getting acquaint:

_

_

[main AIR-app code sheet]

// function and one param (path to content)
function tralala( _swfPath : String)
{
    var l : Loader = new Loader();

        l.contentLoaderInfo.
        addEventListener( Event.COMPLETE,
                          function( _e : Event)
                          {
                              var tmp = _e.target.content;

                              // call function from SWF and retrieving
                              // classes, but can't work with them
                              Font.registerFont( tmp._getRef()[0]);


                              // no error checking for clarity
                          }
                        );

        l.load( new URLRequest( _swfPath));
}

_

_

[external SWF code]

开发者_运维知识库
function _getRef() : Array
{
    // class1,2,3 are font classes imported in library
    return [ class1, class2, class3]; 
}


I just managed to get my code working.

So here's everything I had to do in case someone else has the same issue:

  1. Read the swf file using a FileStream

    stream.readBytes(bytes)

  2. Create a new Loader object and load the bytes on that, using a LoaderContext

    var loader:Loader = new Loader(); loadercontentLoaderInfo.addEventListener(Event.COMPLETE, fontFileLoaded, false, 0, true);

    var context:LoaderContext = new LoaderContext(); context.applicationDomain = ApplicationDomain.currentDomain; context.allowCodeImport = true;

    loader.loadBytes(bytes, context);

  3. Make sure you do NOT call Security.allowDomain() inside the loaded swf. It doesn't work with AIR, as @Focker mentions.

  4. There is no need to load a policy file with Security.loadPolicyFile()

  5. The swf files I used were created using Flash CS3, by adding new Font instances to the Library. I had no luck creating them with [Embed], as the resulting class was stored as TrebuchetMS_TrebuchetMS for example, instead of the actual class name which was TrebuchetMS.

  6. I didn't have to create a security bridge (LoaderInfo.childSandboxBridge)

I hope I'm not forgetting anything.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号