Загрузить внешний класс из контента в другую песочницу - PullRequest
0 голосов
/ 10 сентября 2010

Проблема в том, что у меня есть (например) класс для создания шрифтов, и я хочу загрузить внешний SWF-файл не из папки хранилища приложения, а из другого локального пути («D: \ blah-blah \ 123.swf») в AIR, но, как вы понимаете, я не могу найти никакого решения в Интернете (Google, Adode.com)

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


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

Все, что я хочу, - это получить CLASS REFERENCE из загруженного контентаи использовать в загрузчике инициатора.

Кто-нибудь знает, как решить эту проблему?

листинг кода для знакомства:

_

_

[основной лист кода приложения AIR]

// 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));
}

_

_

[внешний SWF-код]

function _getRef() : Array
{
    // class1,2,3 are font classes imported in library
    return [ class1, class2, class3]; 
}

1 Ответ

1 голос
/ 29 марта 2011

Мне только что удалось заставить мой код работать.

Итак, вот все, что мне нужно было сделать на тот случай, если у кого-то еще возникнет та же проблема:

  1. Прочитать файл swfиспользуя FileStream

    stream.readBytes (байты)

  2. Создайте новый объект Loader и загрузите в него байты, используя LoaderContext

    var loader: Loader = новый 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. Убедитесь, что вы НЕ вызываете Security.allowDomain () внутри загруженного swf.Он не работает с AIR, как упоминает @Focker.

  4. Нет необходимости загружать файл политики с Security.loadPolicyFile ()

  5. SWF-файлы, которые я использовал, были созданы с использованием Flash CS3 путем добавления новых экземпляров Font в библиотеку.Мне не повезло, создавая их с помощью [Embed], так как полученный класс хранился как TrebuchetMS_TrebuchetMS, например, вместо действительного имени класса, которое было TrebuchetMS.

  6. Мне не нужно былосоздать мост безопасности (LoaderInfo.childSandboxBridge)

Надеюсь, я ничего не забуду.

...