import {AssetLibraryBundle} from "awayjs-core/lib/library/AssetLibraryBundle";
import {Loader} from "awayjs-core/lib/library/Loader";
import {LoaderContext} from "awayjs-core/lib/library/LoaderContext";
import {URLRequest} from "awayjs-core/lib/net/URLRequest";
import {AssetEvent} from "awayjs-core/lib/events/AssetEvent";
import {EventDispatcher} from "awayjs-core/lib/events/EventDispatcher";
import {URLLoaderEvent} from "awayjs-core/lib/events/URLLoaderEvent";
import {LoaderEvent} from "awayjs-core/lib/events/LoaderEvent";
import {ParserEvent} from "awayjs-core/lib/events/ParserEvent";
import {ParserBase} from "awayjs-core/lib/parsers/ParserBase";
import {DisplayObjectContainer} from "../display/DisplayObjectContainer";
import {DisplayObject} from "../display/DisplayObject";
/**
* The LoaderContainer class is used to load SWF files or image(JPG, PNG, or GIF)
* files. Use the load() method to initiate loading. The loaded
* display object is added as a child of the LoaderContainer object.
*
*
Use the URLLoader class to load text or binary data.
* *The LoaderContainer class overrides the following methods that it inherits,
* because a LoaderContainer object can only have one child display object - the
* display object that it loads. Calling the following methods throws an
* exception: addChild(), addChildAt(),
* removeChild(), removeChildAt(), and
* setChildIndex(). To remove a loaded display object, you must
* remove the LoaderContainer object from its parent DisplayObjectContainer
* child array.
Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes * are not used in ActionScript 3.0. The LoaderContainer and URLLoader classes replace * them.
* *When you use the LoaderContainer class, consider the Flash Player and Adobe AIR * security model:
* *System.allowDomain() or the
* System.allowInsecureDomain() method in the loaded content
* file.However, in AIR, content in the application security
* sandbox(content installed with the AIR application) are not restricted by
* these security limitations.
For more information related to security, see the Flash Player Developer * Center Topic: Security.
* *When loading a SWF file from an untrusted source(such as a domain other * than that of the LoaderContainer object's root SWF file), you may want to define a * mask for the LoaderContainer object, to prevent the loaded content(which is a child * of the LoaderContainer object) from drawing to portions of the Stage outside of that * mask, as shown in the following code:
*/ export class LoaderContainer extends DisplayObjectContainer { /** * Dispatched when any asset finishes parsing. Also see specific events for each * individual asset type (sprites, materials et c.) * * @eventType AssetEvent */ //[Event(name="assetComplete", type="AssetEvent")] /** * Dispatched when a full resource (including dependencies) finishes loading. * * @eventType LoaderEvent */ //[Event(name="resourceComplete", type="LoaderEvent")] private _loader:Loader; private _useAssetLib:boolean; private _assetLibId:string; private _onLoadCompleteDelegate:(event:LoaderEvent) => void; private _onAssetCompleteDelegate:(event:AssetEvent) => void; private _onTextureSizeErrorDelegate:(event:AssetEvent) => void; private _onLoadErrorDelegate:(event:URLLoaderEvent) => boolean; private _onParseErrorDelegate:(event:ParserEvent) => boolean; private _content:DisplayObject; /** * Contains the root display object of the SWF file or image(JPG, PNG, or * GIF) file that was loaded by using theload() or
* loadBytes() methods.
*
* @throws SecurityError The loaded SWF file or image file belongs to a
* security sandbox to which you do not have access.
* For a loaded SWF file, you can avoid this situation
* by having the file call the
* Security.allowDomain() method or by
* having the loading file specify a
* loaderContext parameter with its
* securityDomain property set to
* SecurityDomain.currentDomain when you
* call the load() or
* loadBytes() method.
*/
public get content():DisplayObject
{
return this._content;
}
/**
* Creates a Loader object that you can use to load files, such as SWF, JPEG,
* GIF, or PNG files. Call the load() method to load the asset
* as a child of the Loader instance. You can then add the Loader object to
* the display list(for instance, by using the addChild()
* method of a DisplayObjectContainer instance). The asset appears on the
* Stage as it loads.
*
* You can also use a Loader instance "offlist," that is without adding it * to a display object container on the display list. In this mode, the * Loader instance might be used to load a SWF file that contains additional * modules of an application.
* *To detect when the SWF file is finished loading, you can use the events
* of the LoaderInfo object associated with the
* contentLoaderInfo property of the Loader object. At that
* point, the code in the module SWF file can be executed to initialize and
* start the module. In the offlist mode, a Loader instance might also be
* used to load a SWF file that contains components or media assets. Again,
* you can use the LoaderInfo object event notifications to detect when the
* components are finished loading. At that point, the application can start
* using the components and media assets in the library of the SWF file by
* instantiating the ActionScript 3.0 classes that represent those components
* and assets.
To determine the status of a Loader object, monitor the following
* events that the LoaderInfo object associated with the
* contentLoaderInfo property of the Loader object:
open event is dispatched when loading begins.ioError or securityError event is
* dispatched if the file cannot be loaded or if an error occured during the
* load process. progress event fires continuously while the file is
* being loaded.complete event is dispatched when a file completes
* downloading, but before the loaded movie clip's methods and properties are
* available. init event is dispatched after the properties and
* methods of the loaded SWF file are accessible, so you can begin
* manipulating the loaded SWF file. This event is dispatched before the
* complete handler. In streaming SWF files, the
* init event can occur significantly earlier than the
* complete event. For most purposes, use the init
* handler.load() method operation that is currently in
* progress for the Loader instance.
*
*/
public close():void
{
if (!this._loader)
return;
if (this._useAssetLib) {
var lib:AssetLibraryBundle;
lib = AssetLibraryBundle.getInstance(this._assetLibId);
lib.disposeLoader(this._loader);
}
this._disposeLoader();
}
/**
* Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an
* object that is a child of this Loader object. If you load an animated GIF
* file, only the first frame is displayed. As the Loader object can contain
* only a single child, issuing a subsequent load() request
* terminates the previous request, if still pending, and commences a new
* load.
*
* Note: In AIR 1.5 and Flash Player 10, the maximum size for a * loaded image is 8,191 pixels in width or height, and the total number of * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height * and 2,880 pixels in width.
* *A SWF file or image loaded into a Loader object inherits the position, * rotation, and scale properties of the parent display objects of the Loader * object.
* *Use the unload() method to remove movies or images loaded
* with this method, or to cancel a load operation that is in progress.
You can prevent a SWF file from using this method by setting the
* allowNetworking parameter of the the object and
* embed tags in the HTML page that contains the SWF
* content.
When you use this method, consider the Flash Player security model, * which is described in the Loader class description.
* *In Flash Player 10 and later, if you use a multipart Content-Type(for * example "multipart/form-data") that contains an upload(indicated by a * "filename" parameter in a "content-disposition" header within the POST * body), the POST operation is subject to the security rules applied to * uploads:
* *Also, for any multipart Content-Type, the syntax must be valid * (according to the RFC2046 standard). If the syntax appears to be invalid, * the POST operation is subject to the security rules applied to * uploads.
* *For more information related to security, see the Flash Player * Developer Center Topic: Security.
* * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG * file to be loaded. A relative path must be relative to the * main SWF file. Absolute URLs must include the protocol * reference, such as http:// or file:///. Filenames cannot * include disk drive specifications. * @param context A LoaderContext object, which has properties that define * the following: *If the context parameter is not specified
* or refers to a null object, the loaded content remains in
* its own security domain.
For complete details, see the description of the * properties in the LoaderContext * class.
* @param ns An optional namespace string under which the file is to be * loaded, allowing the differentiation of two resources with * identical assets. * @param parser An optional parser object for translating the loaded data * into a usable resource. If not provided, Loader will * attempt to auto-detect the file type. * @throws IOError Thedigest property of the
* request object is not
* null. You should only set the
* digest property of a URLRequest
* object when calling the
* URLLoader.load() method when
* loading a SWZ file(an Adobe platform
* component).
* @throws IllegalOperationError If the requestedContentParent
* property of the context
* parameter is a Loader.
* @throws IllegalOperationError If the LoaderContext.parameters
* parameter is set to non-null and has some
* values which are not Strings.
* @throws SecurityError The value of
* LoaderContext.securityDomain
* must be either null or
* SecurityDomain.currentDomain.
* This reflects the fact that you can only
* place the loaded media in its natural
* security sandbox or your own(the latter
* requires a policy file).
* @throws SecurityError Local SWF files may not set
* LoaderContext.securityDomain to anything
* other than null. It is not
* permitted to import non-local media into a
* local sandbox, or to place other local media
* in anything other than its natural sandbox.
* @throws SecurityError You cannot connect to commonly reserved
* ports. For a complete list of blocked ports,
* see "Restricting Networking APIs" in the
* ActionScript 3.0 Developer's Guide.
* @throws SecurityError If the applicationDomain or
* securityDomain properties of
* the context parameter are from
* a disallowed domain.
* @throws SecurityError If a local SWF file is attempting to use the
* securityDomain property of the
* context parameter.
* @event asyncError Dispatched by the contentLoaderInfo
* object if the
* LoaderContext.requestedContentParent
* property has been specified and it is not possible to
* add the loaded content as a child to the specified
* DisplayObjectContainer. This could happen if the
* loaded content is a
* flash.display.AVM1Movie or if the
* addChild() call to the
* requestedContentParent throws an error.
* @event complete Dispatched by the contentLoaderInfo
* object when the file has completed loading. The
* complete event is always dispatched
* after the init event.
* @event httpStatus Dispatched by the contentLoaderInfo
* object when a network request is made over HTTP and
* Flash Player can detect the HTTP status code.
* @event init Dispatched by the contentLoaderInfo
* object when the properties and methods of the loaded
* SWF file are accessible. The init event
* always precedes the complete event.
* @event ioError Dispatched by the contentLoaderInfo
* object when an input or output error occurs that
* causes a load operation to fail.
* @event open Dispatched by the contentLoaderInfo
* object when the loading operation starts.
* @event progress Dispatched by the contentLoaderInfo
* object as data is received while load operation
* progresses.
* @event securityError Dispatched by the contentLoaderInfo
* object if a SWF file in the local-with-filesystem
* sandbox attempts to load content in the
* local-with-networking sandbox, or vice versa.
* @event securityError Dispatched by the contentLoaderInfo
* object if the
* LoaderContext.requestedContentParent
* property has been specified and the security sandbox
* of the
* LoaderContext.requestedContentParent
* does not have access to the loaded SWF.
* @event unload Dispatched by the contentLoaderInfo
* object when a loaded object is removed.
*/
public load(request:URLRequest, context:LoaderContext = null, ns:string = null, parser:ParserBase = null):void
{
this._getLoader().load(request, context, ns, parser);
}
/**
* Loads from binary data stored in a ByteArray object.
*
* The loadBytes() method is asynchronous. You must wait for
* the "init" event before accessing the properties of a loaded object.
When you use this method, consider the Flash Player security model, * which is described in the Loader class description.
* * @param bytes A ByteArray object. The contents of the ByteArray can be * any of the file formats supported by the Loader class: SWF, * GIF, JPEG, or PNG. * @param context A LoaderContext object. Only the *applicationDomain property of the
* LoaderContext object applies; the
* checkPolicyFile and
* securityDomain properties of the LoaderContext
* object do not apply.
*
* If the context parameter is not specified
* or refers to a null object, the content is loaded into the
* current security domain - a process referred to as "import
* loading" in Flash Player security documentation.
* Specifically, if the loading SWF file trusts the remote SWF
* by incorporating the remote SWF into its code, then the
* loading SWF can import it directly into its own security
* domain.
For more information related to security, see the Flash * Player Developer Center Topic: Security.
* @throws ArgumentError If thelength property of the
* ByteArray object is not greater than 0.
* @throws IllegalOperationError If the checkPolicyFile or
* securityDomain property of the
* context parameter are non-null.
* @throws IllegalOperationError If the requestedContentParent
* property of the context
* parameter is a Loader.
* @throws IllegalOperationError If the LoaderContext.parameters
* parameter is set to non-null and has some
* values which are not Strings.
* @throws SecurityError If the provided
* applicationDomain property of
* the context property is from a
* disallowed domain.
* @throws SecurityError You cannot connect to commonly reserved
* ports. For a complete list of blocked ports,
* see "Restricting Networking APIs" in the
* ActionScript 3.0 Developer's Guide.
* @event asyncError Dispatched by the contentLoaderInfo
* object if the
* LoaderContext.requestedContentParent
* property has been specified and it is not possible to
* add the loaded content as a child to the specified
* DisplayObjectContainer. This could happen if the
* loaded content is a
* flash.display.AVM1Movie or if the
* addChild() call to the
* requestedContentParent throws an error.
* @event complete Dispatched by the contentLoaderInfo
* object when the operation is complete. The
* complete event is always dispatched
* after the init event.
* @event init Dispatched by the contentLoaderInfo
* object when the properties and methods of the loaded
* data are accessible. The init event
* always precedes the complete event.
* @event ioError Dispatched by the contentLoaderInfo
* object when the runtime cannot parse the data in the
* byte array.
* @event open Dispatched by the contentLoaderInfo
* object when the operation starts.
* @event progress Dispatched by the contentLoaderInfo
* object as data is transfered in memory.
* @event securityError Dispatched by the contentLoaderInfo
* object if the
* LoaderContext.requestedContentParent
* property has been specified and the security sandbox
* of the
* LoaderContext.requestedContentParent
* does not have access to the loaded SWF.
* @event unload Dispatched by the contentLoaderInfo
* object when a loaded object is removed.
*/
public loadData(data:any, context:LoaderContext = null, ns:string = null, parser:ParserBase = null):void
{
this._getLoader().loadData(data, '', context, ns, parser);
}
private _getLoader():Loader
{
if (this._useAssetLib) {
var lib:AssetLibraryBundle = AssetLibraryBundle.getInstance(this._assetLibId);
this._loader = lib.getLoader();
} else {
this._loader = new Loader();
}
this._loader.addEventListener(LoaderEvent.LOAD_COMPLETE, this._onLoadCompleteDelegate);
this._loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);
this._loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);
// Error are handled separately (see documentation for addErrorHandler)
this._loader._iAddErrorHandler(this._onLoadErrorDelegate);
this._loader._iAddParseErrorHandler(this._onParseErrorDelegate);
return this._loader;
}
private _disposeLoader():void
{
this._loader.removeEventListener(LoaderEvent.LOAD_COMPLETE, this._onLoadCompleteDelegate);
this._loader.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);
this._loader.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);
if (!this._useAssetLib)
this._loader.stop();
this._loader = null;
}
/**
* Removes a child of this Loader object that was loaded by using the
* load() method. The property of the associated
* LoaderInfo object is reset to null. The child is not
* necessarily destroyed because other objects might have references to it;
* however, it is no longer a child of the Loader object.
*
* As a best practice, before you unload a child SWF file, you should
* explicitly close any streams in the child SWF file's objects, such as
* LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise,
* audio in the child SWF file might continue to play, even though the child
* SWF file was unloaded. To close streams in the child SWF file, add an
* event listener to the child that listens for the unload
* event. When the parent calls Loader.unload(), the
* unload event is dispatched to the child. The following code
* shows how you might do this:
public closeAllStreams(evt:Event) {
* myNetStream.close(); mySound.close(); myNetConnection.close();
* myLocalConnection.close(); }
* myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
* closeAllStreams);
*
*/
public unload():void
{
//TODO
}
/**
* Enables a specific parser.
* When no specific parser is set for a loading/parsing opperation,
* loader3d can autoselect the correct parser to use.
* A parser must have been enabled, to be considered when autoselecting the parser.
*
* @param parserClass The parser class to enable.
* @see away.parsers.Parsers
*/
public static enableParser(parserClass:Object):void
{
Loader.enableParser(parserClass);
}
/**
* Enables a list of parsers.
* When no specific parser is set for a loading/parsing opperation,
* loader3d can autoselect the correct parser to use.
* A parser must have been enabled, to be considered when autoselecting the parser.
*
* @param parserClasses A Vector of parser classes to enable.
* @see away.parsers.Parsers
*/
public static enableParsers(parserClasses:Array