blob: d96a8c0fb88f1b56f691322efb7c222bd1ed2816 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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);
}
}
}
}