HttpIdManager.as

/**

* ADOBE SYSTEMS INCORPORATED

* Copyright 2008 Adobe Systems Incorporated

* All Rights Reserved.

*

* NOTICE: Adobe permits you to use, modify, and distribute this file

* in accordance with the terms of the license agreement accompanying it.

*

* Author: Jozsef Vass

*/

package

{

import flash.events.Event;

import flash.events.TimerEvent;

import flash.utils.Timer;

import mx.rpc.events.FaultEvent;

import mx.rpc.events.ResultEvent;

import mx.rpc.http.HTTPService;


public class HttpIdManager extends AbstractIdManager

{

private var mHttpService:HTTPService = null;

private var mWebServiceUrl:String = "";


private var mConnectionTimer:Timer;

private var mUser:String;

private var mId:String;


override protected function doSetService(service:Object):void

{

mWebServiceUrl = service as String;

}

override protected function doRegister(user:String, id:String):void

{

if (mWebServiceUrl.length == 0 || user.length == 0 || id.length == 0)

{

var e:Event = new IdManagerError("registerFailure", "Empty web service URL, user or id");

dispatchEvent(e);

return;

}

mUser = user;

mId = id;

// register the id to http service

mHttpService = new HTTPService();

mHttpService.url = mWebServiceUrl;

mHttpService.addEventListener("result", httpResult);

mHttpService.addEventListener("fault", httpFault);

var request:Object = new Object();

request.username = user

request.identity = id;

mHttpService.cancel();

mHttpService.send(request);

// refresh registration with web service in every 30 minutes

mConnectionTimer = new Timer(1000 * 60 * 30);

mConnectionTimer.addEventListener(TimerEvent.TIMER, onConnectionTimer);

mConnectionTimer.start();

}

override protected function doLookup(user:String):void

{

if (mHttpService)

{

var request:Object = new Object();

request.friends = user;

// when making repeated calls to the same user, it seemed that

// we recived cached result. So add time, to it to make it unique.

var now:Date = new Date();

request.time = now.getTime();

mHttpService.cancel();

mHttpService.send(request);

}

else

{

var e:Event = new IdManagerError("lookupFailure", "HTTP service not created");

dispatchEvent(e);

}

}

override protected function doUnregister():void

{

if (mHttpService)

{

var request:Object = new Object();

request.username = mUser;

request.identity = "0";

mHttpService.cancel();

mHttpService.send(request);

}


if (mConnectionTimer)

{

mConnectionTimer.stop();

mConnectionTimer = null;

}

}

// we need to refresh regsitration with web service periodically

private function onConnectionTimer(e:TimerEvent):void

{

var request:Object = new Object();

request.username = mUser;

request.identity = mId;

var now:Date = new Date();

request.time = now.getTime();

mHttpService.cancel();

mHttpService.send(request);

}

// process error from web service

private function httpFault(e:FaultEvent):void

{

var d:IdManagerError = new IdManagerError("idManagerError", "HTTP error: " + e.message.toString());

dispatchEvent(d);

}


// process successful response from web service

private function httpResult(e:ResultEvent):void

{

var result:Object = e.result as Object;

var remote:Object;

if (result.hasOwnProperty("result"))

{

if (result.result.hasOwnProperty("update"))

{

// registration response

if (result.result.update == true)

{

var d:Event = new Event("registerSuccess");

dispatchEvent(d);

}

else

{

d = new IdManagerError("registerFailure", "HTTP update error");

dispatchEvent(d);

}

}

else if (result.result.hasOwnProperty("friend"))

{

// party query response

remote = result.result.friend as Object;

if (remote.hasOwnProperty("user") && remote.hasOwnProperty("identity"))

{

var identityString:String = remote.identity

var userString:String = remote.user;


var r:IdManagerEvent = new IdManagerEvent("lookupSuccess", userString, identityString);

dispatchEvent(r);

}

else if (remote.hasOwnProperty("user"))

{

userString = remote.user;

r = new IdManagerEvent("lookupSuccess", userString, "");

dispatchEvent(r);

}

else

{

d = new IdManagerError("lookupFailure", "HTTP response does not have user property");

dispatchEvent(d);

}

}

else

{

d = new IdManagerError("idManagerError", "Unhandeled HTTP response");

dispatchEvent(d);

}

}

else

{

d = new IdManagerError("idManagerError", "HTTP response has no result");

dispatchEvent(d);

}

}

}

}