| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright ownership. |
| // The ASF licenses this file to You under the Apache License, Version 2.0 |
| // (the "License"); you may not use this file except in compliance with |
| // the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| package mx.core |
| { |
| |
| import flash.display.Loader; |
| import flash.events.Event; |
| import flash.events.ErrorEvent; |
| import flash.events.ProgressEvent; |
| import flash.events.IOErrorEvent; |
| import flash.events.SecurityErrorEvent; |
| import flash.net.URLRequest; |
| import flash.system.LoaderContext; |
| import flash.system.ApplicationDomain; |
| import flash.system.LoaderContext; |
| import flash.system.Security; |
| import flash.system.SecurityDomain; |
| import flash.utils.ByteArray; |
| |
| import mx.events.RSLEvent; |
| import mx.utils.LoaderUtil; |
| |
| [ExcludeClass] |
| |
| /** |
| * @private |
| * RSL Item Class |
| * |
| * Contains properties to describe the RSL and methods to help load the RSL. |
| */ |
| public class RSLItem |
| { |
| include "../core/Version.as"; |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Properties |
| // |
| //-------------------------------------------------------------------------- |
| |
| //---------------------------------- |
| // urlRequest |
| //---------------------------------- |
| |
| /** |
| * @private |
| * Only valid after loading has started |
| */ |
| public var urlRequest:URLRequest; |
| |
| //---------------------------------- |
| // total |
| //---------------------------------- |
| |
| /** |
| * @private |
| */ |
| public var total:uint = 0; |
| |
| //---------------------------------- |
| // loaded |
| //---------------------------------- |
| |
| /** |
| * @private |
| */ |
| public var loaded:uint = 0; |
| |
| //---------------------------------- |
| // rootURL |
| //---------------------------------- |
| |
| /** |
| * @private |
| * |
| * Provides the url used to locate relative RSL urls. |
| */ |
| public var rootURL:String; |
| |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Variables |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * @private |
| * External handlers so the load can be |
| * observed by the class calling load(). |
| */ |
| protected var chainedProgressHandler:Function; |
| protected var chainedCompleteHandler:Function; |
| protected var chainedIOErrorHandler:Function; |
| protected var chainedSecurityErrorHandler:Function; |
| protected var chainedRSLErrorHandler:Function; |
| |
| /** |
| * @private |
| */ |
| private var completed:Boolean = false; |
| |
| /** |
| * @private |
| */ |
| private var errorText:String; |
| |
| /** |
| * @private |
| */ |
| protected var moduleFactory:IFlexModuleFactory; // application/module loading this RSL. |
| |
| /** |
| * @private |
| */ |
| protected var url:String; |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Constructor |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Create a RSLItem with a given URL. |
| * |
| * @param url location of RSL to load |
| * @param rootURL provides the url used to locate relative RSL urls. |
| * @param moduleFactory The module factory that is loading the RSLs. The |
| * RSLs will be loaded into the application domain of the given module factory. |
| * If a module factory is not specified, then the RSLs will be loaded into the |
| * application domain of where the CrossDomainRSLItem class was first loaded. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| public function RSLItem(url:String, rootURL:String = null, |
| moduleFactory:IFlexModuleFactory = null) |
| { |
| super(); |
| |
| this.url = url; |
| this.rootURL = rootURL; |
| this.moduleFactory = moduleFactory; |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * |
| * Load an RSL. |
| * |
| * @param progressHandler Receives ProgressEvent.PROGRESS events. |
| * May be null. |
| * |
| * @param completeHandler Receives Event.COMPLETE events. |
| * May be null. |
| * |
| * @param ioErrorHandler Receives IOErrorEvent.IO_ERROR events. |
| * May be null. |
| * |
| * @param securityErrorHandler |
| * Receives SecurityErrorEvent.SECURITY_ERROR events. |
| * May be null. |
| * |
| * @param rslErrorHandler Receives RSLEvent.RSL_ERROR events. |
| * May be null. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| public function load(progressHandler:Function, |
| completeHandler:Function, |
| ioErrorHandler:Function, |
| securityErrorHandler:Function, |
| rslErrorHandler:Function):void |
| { |
| chainedProgressHandler = progressHandler; |
| chainedCompleteHandler = completeHandler; |
| chainedIOErrorHandler = ioErrorHandler; |
| chainedSecurityErrorHandler = securityErrorHandler; |
| chainedRSLErrorHandler = rslErrorHandler; |
| |
| var loader:Loader = new Loader(); |
| var loaderContext:LoaderContext = new LoaderContext(); |
| urlRequest = new URLRequest(LoaderUtil.createAbsoluteURL(rootURL, url)); |
| |
| // The RSLItem needs to listen to certain events. |
| |
| loader.contentLoaderInfo.addEventListener( |
| ProgressEvent.PROGRESS, itemProgressHandler); |
| |
| loader.contentLoaderInfo.addEventListener( |
| Event.COMPLETE, itemCompleteHandler); |
| |
| loader.contentLoaderInfo.addEventListener( |
| IOErrorEvent.IO_ERROR, itemErrorHandler); |
| |
| loader.contentLoaderInfo.addEventListener( |
| SecurityErrorEvent.SECURITY_ERROR, itemErrorHandler); |
| |
| if (moduleFactory != null) |
| loaderContext.applicationDomain = moduleFactory.info()["currentDomain"]; |
| else |
| loaderContext.applicationDomain = ApplicationDomain.currentDomain; |
| |
| loader.load(urlRequest, loaderContext); |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Event handlers |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * @private |
| */ |
| public function itemProgressHandler(event:ProgressEvent):void |
| { |
| // Update the loaded and total properties. |
| loaded = event.bytesLoaded; |
| total = event.bytesTotal; |
| |
| // Notify an external listener |
| if (chainedProgressHandler != null) |
| chainedProgressHandler(event); |
| } |
| |
| /** |
| * @private |
| */ |
| public function itemCompleteHandler(event:Event):void |
| { |
| completed = true; |
| |
| // Notify an external listener |
| if (chainedCompleteHandler != null) |
| chainedCompleteHandler(event); |
| } |
| |
| /** |
| * @private |
| */ |
| public function itemErrorHandler(event:ErrorEvent):void |
| { |
| errorText = decodeURI(event.text); |
| completed = true; |
| loaded = 0; |
| total = 0; |
| |
| trace(errorText); |
| |
| // Notify an external listener |
| if (event.type == IOErrorEvent.IO_ERROR && |
| chainedIOErrorHandler != null) |
| { |
| chainedIOErrorHandler(event); |
| } |
| else if (event.type == SecurityErrorEvent.SECURITY_ERROR && |
| chainedSecurityErrorHandler != null) |
| { |
| chainedSecurityErrorHandler(event); |
| } |
| else if (event.type == RSLEvent.RSL_ERROR && |
| chainedRSLErrorHandler != null) |
| { |
| chainedRSLErrorHandler(event); |
| } |
| |
| } |
| } |
| |
| } |