blob: 7a757959627101ede0f41e6c143f77995ac77a64 [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
{
import bridge.FABridge;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.external.ExternalInterface;
import flash.system.ApplicationDomain;
import flash.utils.describeType;
import mx.collections.ArrayCollection;
import mx.collections.IViewCursor;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.messaging.config.LoaderConfig;
import mx.managers.SystemManager;
import mx.messaging.ChannelSet;
import mx.messaging.Consumer;
import mx.messaging.Producer;
import mx.messaging.channels.AMFChannel;
import mx.messaging.channels.HTTPChannel;
import mx.messaging.channels.SecureAMFChannel;
import mx.messaging.channels.SecureHTTPChannel;
import mx.messaging.channels.SecureStreamingAMFChannel;
import mx.messaging.channels.SecureStreamingHTTPChannel
import mx.messaging.channels.StreamingAMFChannel;
import mx.messaging.channels.StreamingHTTPChannel;
import mx.messaging.messages.AsyncMessage;
import mx.rpc.AsyncResponder;
import mx.utils.object_proxy;
import mx.utils.UIDUtil;
import mx.core.mx_internal;
use namespace object_proxy;
[Frame(extraClass="FakeFlexInit")]
public class FDMSBridge extends FDMSBase
{
private var gateway:FABridge;
public function FDMSBridge()
{
super();
if (ExternalInterface.available == false)
{
return;
}
gateway = new FABridge();
gateway.rootObject = this;
gateway.addEventListener(FABridge.INITIALIZED, gatewayInitialized);
ExternalInterface.addCallback("createObject", createObject);
}
/**
* The createObject function is the callback used by the bridge to construct
* new ActionScript objects. As is, it supports constructors with up to four
* arguments. If more than that are required, please update this function
* and recompile with your appliation.
*/
private function createObject(className:String, cArgs:Array):Object
{
var c:Class = Class(ApplicationDomain.currentDomain.getDefinition(className));
var instance:Object;
cArgs = gateway.deserialize(cArgs);
// used to pass constructor arguments
switch (cArgs.length)
{
case 0:
instance = new c();
break;
case 1:
instance = new c(cArgs[0]);
break;
case 2:
instance = new c(cArgs[0], cArgs[1]);
break;
case 3:
instance = new c(cArgs[0], cArgs[1], cArgs[2]);
break;
case 4:
instance = new c(cArgs[0], cArgs[1], cArgs[2], cArgs[3]);
break;
default:
throw new Error("Too many arguments. Please update 'createObject' for your use case.");
}
//
// make sure the reference is known
var objRef:Number = gateway.getRef(instance, true);
gateway.incRef(objRef);
return gateway.serialize(instance);
}
//initialize the gateway and load the type descriptions for supported objects from AS
private function gatewayInitialized(event:Event):void
{
var typeDesc:Array = [];
var acRef:ArrayCollection;
var asyncResponderRef:AsyncResponder;
var csRef:ChannelSet;
var pRef:Producer;
var cRef:Consumer;
var amfRef:AMFChannel;
var httpRef:HTTPChannel;
var samfRef:SecureAMFChannel;
var shttpRef:SecureHTTPChannel;
var streamAmfRef:StreamingAMFChannel;
var streamHttpRef:StreamingHTTPChannel;
var sstreamAmfRef:SecureStreamingAMFChannel;
var sstreamHttpRef:SecureStreamingHTTPChannel;
var asmRef:AsyncMessage;
var lRef:IViewCursor;
var sortRef:Sort;
var sortFieldRef:SortField;
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.collections.ArrayCollection", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.collections.IViewCursor", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.rpc.AsyncResponder", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.ChannelSet", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.Producer", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.Consumer", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.AMFChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.HTTPChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.SecureAMFChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.SecureHTTPChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.SecureStreamingAMFChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.SecureStreamingHTTPChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.StreamingAMFChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.channels.StreamingHTTPChannel", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.messaging.messages.AsyncMessage", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.collections.Sort", true));
typeDesc.push(gateway.retrieveCachedTypeDescription("mx.collections.SortField", true));
//the ListCollectionView is now serialized natively accross the bridge; however if you want to access an object over the bridge and is not serialized correctly
// this is the way to add custom serializer
//see below for the actual implementation
//gateway.addCustomSerialization("ListCollectionViewCursor", serializeIViewCursor);
try
{
mx.messaging.config.LoaderConfig.mx_internal::_url = loaderInfo.loaderURL;
mx.messaging.config.LoaderConfig.mx_internal::_parameters = loaderInfo.parameters;
}
catch(e:Error)
{
trace("could not set initial URL, connections will probably not work !");
}
ExternalInterface.call("FDMSLibrary_initialized", typeDesc, gateway.bridgeName);
}
//the ListCollectionView is already serialized natively accross the bridge
// but if yo uneed to you can define a custom serializer and use an interface or base class as starting point
// this is for informative purposes
// any ListCollectionViewCursor will be serialized by its interface IViewCursor
private function serializeIViewCursor(value:*):*
{
var result:* = {};
result.newTypes = [];
result.newRefs = {};
// serialize a class
result.type = FABridge.TYPE_ASINSTANCE;
// make sure the type info is available
var className:String = "mx.collections::IViewCursor";
if (gateway.retrieveCachedTypeDescription(className, false) == null)
{
var desc:Object = gateway.retrieveCachedTypeDescription(className, true);
result.newTypes.push(desc);
}
// make sure the reference is known
var objRef:Number = gateway.getRef(IViewCursor(value), false);
if (isNaN(objRef))
{
objRef = gateway.getRef(IViewCursor(value), true);
result.newRefs[objRef] = className;
}
result.value = objRef;
return result;
}
}
}