blob: 6c81ba39f0a323d93ecdf43cb536962cc42ef70f [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.rpc
{
COMPILE::SWF {
import flash.events.EventDispatcher;
}
COMPILE::JS {
import org.apache.royale.events.EventDispatcher;
}
import mx.rpc.IResponder;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.utils.ArrayUtil;
/**
* Dispatched when an Operation invocation successfully returns.
* @eventType mx.rpc.events.ResultEvent.RESULT
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="result", type="mx.rpc.events.ResultEvent")]
/**
* Dispatched when an Operation call fails.
* @eventType mx.rpc.events.FaultEvent.FAULT
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="fault", type="mx.rpc.events.FaultEvent")]
/**
* This component helps you manage the results for asynchronous calls made from
* RPC based services, typically from MXML components. While each individual service
* and operation dispatches result and fault events, it is common to need to use the
* same operation in different parts of your application. Using one event listener
* or lastResult value across the entire application can be awkward. Rather than creating
* two service components which refer to the same service, you can use a simple lightweight
* CallResponder to manage the event listeners and lastResult value for a specific invocation
* of a service.
* <p>
* You set the token property of this component to the AsyncToken returned by the
* service. You can then add event listeners on this component instead of having to
* add them to each AsyncToken returned. This component also maintains the
* lastResult property which is a copy of the value returned by the last successful
* result event dispatched by a token monitored by this service. Though you can
* bind to either the <code>callResponder.token.result</code> or
* <code>callResponder.lastResult</code>, the latter will be preserved while a second
* call to the same service is in progress while the former will be reset as soon
* as a new service invocation is started.
* </p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public class CallResponder extends EventDispatcher implements IResponder
{
private var _token:AsyncToken;
[Bindable]
/**
* Each CallResponder dispatches result and fault events received
* from a single token. This property value specifies that token. You typically
* set this property to the AsyncToken object returned by the service.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function set token(t:AsyncToken):void
{
if (_token != null)
{
var resps:Array = _token.responders;
var ix:int = ArrayUtil.getItemIndex(this, resps);
if (ix != -1)
resps.splice(ix, 1);
}
if (t != null)
t.addResponder(this);
_token = t;
}
public function get token():AsyncToken
{
return _token;
}
/**
* This method is called by the AsyncToken when it wants to deliver a
* <code>ResultEvent</code> to the CallResponder. You do not call
* this method directly.
*
* @param data The ResultEvent delivered by the AsyncToken
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function result(data:Object):void
{
var resultEvent:ResultEvent = ResultEvent(data);
lastResult = resultEvent.result;
dispatchEvent(resultEvent);
}
/**
* This method is called by the AsyncToken when it wants to deliver a
* <code>FaultEvent</code> to the CallResponder. You do not call
* this method directly.
*
* @param data The FaultEvent delivered by the AsyncToken
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function fault(data:Object):void
{
var faultEvent:FaultEvent = FaultEvent(data);
// Not clearing lastResult here... this will allow developers to keep using
// lastResult even in the event of a fault.
dispatchEvent(faultEvent);
}
[Bindable]
/**
* This property stores the result property of the token each time it
* delivers a successful result. You can bind to or access this property
* instead of the token.result property to keep your code from seeing that
* value cleared out on the second and subsequent call to a particular service
* method. Additionally, if a fault occurs this value will still be set to
* the last successful result returned by a token monitored by this CallResponder.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var lastResult:*;
}
}