package wm.managers
{
import mx.collections.ArrayCollection;
import wm.objects.IProcess;
public class RemoteDataManager
{
private static var _instance:SingletonRemoteDataManager;
public function RemoteDataManager()
{
throw(new Error('RemoteDataManager: You can\'t instatiate a singleton class'));
}
private static function instance():* {
if (_instance) {
} else {
_instance = new SingletonRemoteDataManager();
}
return _instance;
}
// PUBLIC INTERFACE FUCNTIONS
public static function requestAmfphp(request:String , data:*, callback:Function, listeners:String = null, process:IProcess = null, service:String = ''):void {
instance().requestAmfphp(request,data,callback, listeners, process,service);
}
public static function setSessionId(sessionid:String):void {
instance().setSessionId(sessionid);
}
public static function getSessionId():String {
return instance().getSessionId();
}
public static function dispatchListener(listener:String):void {
instance().dispatchListener(listener);
}
public static function set gatewayRequestPath(value:String):void {
instance().gatewayRequestPath = value;
}
}
}
import mx.collections.ArrayCollection;
import flash.utils.Dictionary;
import wm.managers.LoggingManager;
import wm.utils.RemotingConnection;
import flash.net.Responder;
import flash.profiler.showRedrawRegions;
import mx.managers.CursorManager;
import mx.controls.Alert;
import flash.events.NetStatusEvent;
import wm.objects.IProcess;
import wm.structures.ProcessMessage;
import mx.core.Application;
import wm.managers.RemoteDataManager;
internal class RemoteAmfRequest {
private var _request:String;
private var _data:*;
private var _callback:Function;
private var _service:String;
private var _remoteUrl:String;
private var _process:IProcess = null;
public function RemoteAmfRequest(request:String , data:*, callback:Function, service:String, process:IProcess, remoteConnectionUrl:String) {
_request = request;
_callback = callback;
_service = service;
_remoteUrl = remoteConnectionUrl;
_data = data;
_process = process;
executeRequest()
}
public function get request():String { return _request; }
public function get data():* { return _data; }
public function get callback():Function { return _callback; }
public function get service():String { return _service; }
public function get remoteUrl():String { return _remoteUrl; }
public function get process():IProcess { return _process; }
private function setBusyProcess():void {
if (_process)
_process.sendMessage(new ProcessMessage(ProcessMessage.MODAL_LOCK, {mode:true}));
}
private function removeBusyProcess():void {
if (_process)
_process.sendMessage(new ProcessMessage(ProcessMessage.MODAL_LOCK, {mode:false}));
}
public function executeRequest():void {
var gateway:RemotingConnection = new RemotingConnection( _remoteUrl );
gateway.addEventListener(NetStatusEvent.NET_STATUS,net_status_callback)
gateway.call( _service, new Responder(onResult, onFault),_request, _data);
CursorManager.setBusyCursor();
setBusyProcess()
}
private function net_status_callback(ev:NetStatusEvent):void {
Alert.show("Net status error has occoured:")
CursorManager.removeBusyCursor();
removeBusyProcess();
}
private function onResult(output:*):void {
removeBusyProcess();
output['errors'] = false;
output['messages'] = false;
// Searching for alerts to be made from request callback output
if (output['alerts']) {
var item:*;
if (output['alerts']['messages']) {
for each (item in output['alerts']['messages']) {
Alert.show(item.message,item.title);
output['messages'] = true;
}
}
if (output['alerts']['errors']) {
for each (item in output['alerts']['errors']) {
output['errors'] = true;
Alert.show(item.message,item.title);
}
}
}
if (output['__sessid']) {
RemoteDataManager.setSessionId(output['__sessid']);
}
if (this['_callback'])
_callback(output);
CursorManager.removeBusyCursor();
}
private function onFault( fault:String ):void {
LoggingManager.addLog("RemoteAmfRequest","Amf fault: '" + fault + "'. Details(Request: `"+_request+"`, Service: `"+_service+"`);");
CursorManager.removeBusyCursor();
}
}
internal class SingletonRemoteDataManager {
private var _requestStack:Dictionary = new Dictionary();
private var _listenersStack:ArrayCollection = new ArrayCollection();
private var remoteConnectionUrl:String = "";
private var defaultService:String = "system.request";
private var sessionId:String = '';
/**
*/
public function requestAmfphp(request:String , data:*, callback:Function = null, listeners:String = null, process:IProcess = null, service:String = ''):void {
// Send also the session id
//data.__sessid = sessionId;
var _remoteAmfRequest:RemoteAmfRequest = new RemoteAmfRequest(
request,
data,
callback,
service.length ? service : defaultService,
process,
remoteConnectionUrl
);
if (listeners)
if (listeners.length) {
// HERE I SEARCH IF A SIMILAR LISTENER FOR AN IDENTICALL REQUEST WAS ALREADY ADDDED TO STACK
for each (var item:* in _listenersStack) {
if (
(item.listenersString==listeners) &&
(item.reference.callback == callback) &&
(item.reference.request == request)
) {
_listenersStack.removeItemAt(_listenersStack.getItemIndex(item));
}
}
_listenersStack.addItem({listeners:listeners.split(','), listenersString:listeners, reference:_remoteAmfRequest});
}
}
public function set gatewayRequestPath(value:String):void {
remoteConnectionUrl = value;
}
public function setSessionId(sessionid:String):void {
this.sessionId = sessionid;
}
public function getSessionId():String {
return this.sessionId;
}
public function dispatchListener(listener:String):void {
for each (var item:* in _listenersStack) {
for each (var listenerString:String in item.listeners) {
if (listenerString == listener) {
item.reference.executeRequest();
break;
}
}
}
}
} |