<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-295  評論-26  文章-1  trackbacks-0

    ?
    package org.jivesoftware.xiff.core
    {?
    ?import flash.events.DataEvent;
    ?import flash.events.Event;
    ?import flash.events.EventDispatcher;
    ?import flash.events.IOErrorEvent;
    ?import flash.events.SecurityErrorEvent;
    ?import flash.events.TimerEvent;
    ?import flash.net.XMLSocket;
    ?import flash.utils.Timer;
    ?import flash.xml.XMLDocument;
    ?import flash.xml.XMLNode;
    ?
    ?import org.jivesoftware.xiff.data.IExtension;
    ?import org.jivesoftware.xiff.data.IQ;
    ?import org.jivesoftware.xiff.data.Message;
    ?import org.jivesoftware.xiff.data.Presence;
    ?import org.jivesoftware.xiff.data.XMPPStanza;
    ?import org.jivesoftware.xiff.data.auth.AuthExtension;
    ?import org.jivesoftware.xiff.data.forms.FormExtension;
    ?import org.jivesoftware.xiff.data.register.RegisterExtension;
    ?import org.jivesoftware.xiff.events.*;
    ?import org.jivesoftware.xiff.exception.SerializationException;

    ?/**
    ? * 當密碼修改成功的時候被觸發
    ? *
    ? * @eventType org.jivesoftware.xiff.events.ChangePasswordSuccessEvent.PASSWORD_SUCCESS
    ? */
    ??? [Event(name="changePasswordSuccess", type="org.jivesoftware.xiff.events.ChangePasswordSuccessEvent")]
    ???
    ??? /**
    ???? * 當成功的鏈接到服務器上的時候觸發
    ???? *
    ???? * @eventType org.jivesoftware.xiff.events.ConnectionSuccessEvent.CONNECT_SUCCESS
    ???? */
    ??? [Event(name="connection", type="org.jivesoftware.xiff.events.ConnectionSuccessEvent")]
    ???
    ??? /**
    ???? * 當與服務器斷開的時候將會被觸發
    ???? *
    ???? * @eventType org.jivesoftware.xiff.events.DisconnectionEvent.DISCONNECT
    ???? */
    ??? [Event(name="disconnection", type="org.jivesoftware.xiff.events.DisconnectionEvent")]
    ???
    ??? /**
    ???? * Dispatched when there is some type of XMPP error.
    ???? * 當有xmpp 錯誤的時候將會被觸發
    ???? * @eventType org.jivesoftware.xiff.events.XIFFErrorEvent.XIFF_ERROR
    ???? */
    ??? [Event(name="error", type="org.jivesoftware.xiff.events.XIFFErrorEvent")]
    ???
    ??? /**
    ???? * Dispatched whenever there is incoming XML data.
    ???? * 當有傳入的數據的時候將會被觸發
    ???? * @eventType org.jivesoftware.xiff.events.IncomingDataEvent.INCOMING_DATA
    ???? */
    ??? [Event(name="incomingData", type="org.jivesoftware.xiff.events.IncomingDataEvent")]
    ???
    ??? /**
    ???? * Dispatched on successful authentication (login) with the server.
    ???? * 當有用戶登陸成功的時候將會被觸發
    ???? * @eventType org.jivesoftware.xiff.events.LoginEvent.LOGIN
    ???? */
    ??? [Event(name="login", type="org.jivesoftware.xiff.events.LoginEvent")]
    ???
    ??? /**
    ???? * Dispatched on incoming messages.
    ???? *? 當有進入的消息的時候將會被觸發
    ???? * @eventType org.jivesoftware.xiff.events.MessageEvent.MESSAGE
    ???? */
    ??? [Event(name="message", type="org.jivesoftware.xiff.events.MessageEvent")]
    ???
    ??? /**
    ???? * Dispatched whenever data is sent to the server.
    ???? * 當有數據被傳往服務器端的時候觸發
    ???? * @eventType org.jivesoftware.xiff.events.OutgoingDataEvent.OUTGOING_DATA
    ???? */
    ??? [Event(name="outgoingData", type="org.jivesoftware.xiff.events.OutgoingDataEvent")]
    ???
    ??? /**
    ???? * Dispatched on incoming presence data.
    ???? *? 當進入是否在線相關數據的時候觸發
    ???? * @eventType org.jivesoftware.xiff.events.PresenceEvent.PRESENCE
    ???? */
    ??? [Event(name="presence", type="org.jivesoftware.xiff.events.PresenceEvent")]
    ???
    ??? /**
    ???? * Dispatched on when new user account registration is successful.
    ???? * 當用戶注冊成功的時候觸發
    ???? * @eventType org.jivesoftware.xiff.events.RegistrationSuccessEvent.REGISTRATION_SUCCESS
    ???? */
    ??? [Event(name="registrationSuccess", type="org.jivesoftware.xiff.events.RegistrationSuccessEvent")]
    ???
    ??? /**
    ???? * This class is used to connect to and manage data coming from an XMPP server. Use one instance
    ???? * of this class per connection.
    ???? * XMPPConnection這個類被用做連接和管理從服務器端發來的數據,每一個連接一個實例
    ???? */
    ?public class XMPPConnection extends EventDispatcher
    ?{
    ??/**
    ?? * @private
    ?? * 是否匿名登陸
    ?? */
    ??protected var _useAnonymousLogin:Boolean;
    ??
    ??/**
    ?? * @private
    ?? *xmlsocket
    ?? */
    ??protected var _socket:XMLSocket;
    ??
    ??/**
    ?? * @private
    ?? * 服務器地址或者名稱
    ?? */
    ??protected var myServer:String;
    ??
    ??/**
    ?? * @private
    ?? * 用戶名
    ?? */
    ??protected var myUsername:String;
    ??
    ??/**
    ?? * @private
    ?? * 綁定的資源名稱? 比如smark linkq msn 等
    ?? * */
    ??protected var myResource:String;
    ??
    ??/**
    ?? * @private
    ?? * 用戶密碼
    ?? */
    ??protected var myPassword:String;
    ?
    ??/**
    ?? * @private
    ?? * 登陸端口
    ?? */
    ??protected var myPort:Number;
    ??
    ??/**
    ?? * 是否已經激活
    ?? * @private
    ?? */
    ??protected var _active:Boolean;
    ??
    ??/**
    ?? * 是否已經登陸
    ?? * @private
    ?? */
    ??protected var loggedIn:Boolean;
    ??
    ??/**
    ?? * 是否忽略空白字符
    ?? * @private
    ?? */
    ??protected var ignoreWhitespace:Boolean;
    ??
    ??/**
    ?? * @private
    ?? * 打開流的標簽
    ?? */
    ??protected var openingStreamTag:String;
    ??
    ??/**
    ?? * @private
    ?? * 關閉流的標簽
    ?? */
    ??protected var closingStreamTag:String;

    ??/**
    ?? * @private
    ?? * 會話id
    ?? */
    ??protected var sessionID:String;
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected var pendingIQs:Object;
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected var _expireTagSearch:Boolean;
    ??
    ??protected static var _openConnections:Array = [];
    ??
    ??public function XMPPConnection()
    ??{?
    ???
    ???// Hash to hold callbacks for IQs
    ???pendingIQs = new Object();
    ???
    ???_useAnonymousLogin = false;
    ???active = false;
    ???loggedIn = false;
    ???ignoreWhitespace = true;
    ???//初始化為忽略空白字符
    ???resource = "xiff";
    ???//初始化資源為xiff
    ???port = 5222;
    ???
    ???AuthExtension.enable();
    ???RegisterExtension.enable();
    ???FormExtension.enable();
    ??}
    ??
    ??/**
    ?? * Connects to the server.
    ?? * 鏈接到服務器端
    ?? * @param streamType (Optional) The type of initial stream negotiation, either &lt;flash:stream&gt; or &lt;stream:stream&gt;.
    ?? * Some servers, like Jabber, Inc.'s XCP and Jabberd 1.4 expect &lt;flash:stream&gt; from a Flash client instead of the standard &lt;stream:stream&gt;.
    ?? * The options for this parameter are: "flash", "terminatedFlash", "standard" and "terminatedStandard". The default is "terminatedStandard".
    ?? *返回是否找到服務器
    ?? * @return A boolean indicating whether the server was found.
    ?? */
    ??public function connect( streamType:String = "terminatedStandard" ):Boolean
    ??{
    ???
    ???// Create the socket 創建一個socket連接字
    ???_socket = _createXmlSocket();
    ???
    ???active = false;
    ???loggedIn = false;
    ???
    ???///? 創建流樣式? <stream:flash>
    ???// Stream type lets user set opening/closing tag - some servers (jadc2s) prefer <stream:flash> to the standard
    ???// <stream:stream>
    ???switch( streamType ) {
    ????/////在xiff中用flash
    ????case "flash":
    ?????openingStreamTag = new String( "<?xml version=\"1.0\"?><flash:stream to=\"" + server + "\" xmlns=\"jabber:client\" xmlns:flash=\"?????closingStreamTag = new String( "</flash:stream>" );
    ?????break;
    ?????
    ????case "terminatedFlash":
    ?????openingStreamTag = new String( "<?xml version=\"1.0\"?><flash:stream to=\"" + server + "\" xmlns=\"jabber:client\" xmlns:flash=\"
    ?????closingStreamTag = new String( "</flash:stream>" );
    ?????break;
    ?????
    ????case "standard":
    ?????openingStreamTag = new String( "<?xml version=\"1.0\"?><stream:stream to=\"" + server + "\" xmlns=\"jabber:client\" xmlns:stream=\"
    ?????closingStreamTag = new String( "</stream:stream>" );
    ?????break;
    ???
    ????case "terminatedStandard":
    ????default:
    ?????openingStreamTag = new String( "<?xml version=\"1.0\"?><stream:stream to=\"" + server + "\" xmlns=\"jabber:client\" xmlns:stream=\"
    ?????closingStreamTag = new String( "</stream:stream>" );
    ?????break;
    ???}
    ???//鏈接到服務器如果成功返回true
    ???_socket.connect( server, port );
    ???return true;
    ??}
    ??
    ??/**
    ?? * 關閉與服務器的連接
    ?? * Disconnects from the server if currently connected. After disconnect,
    ?? * a <code>DisconnectionEvent.DISCONNECT</code> event is broadcast.
    ?? */
    ??public function disconnect():void
    ??{
    ???//如果鏈接是活動的,發送一個關閉流? 設置活動狀態為false
    ???if( isActive() ) {
    ????sendXML( closingStreamTag );
    ????_socket.close();
    ????active = false;
    ????loggedIn = false;
    ????var event:DisconnectionEvent = new DisconnectionEvent();
    ????dispatchEvent(event);
    ????//將關閉連接這個事件分發( 廣播)
    ???}
    ??}
    ??
    ??/**
    ?? * Sends data to the server. If the data to send cannot be serialized properly, this method throws a <code>SerializeException</code>.
    ?? *發送數據給服務器,如果數據不能被序列號則不能被發送
    ?? * @param o The data to send. This must be an instance of a class that implements the ISerializable interface.
    ??* 參數必須是已經實現了ISerriable接口的實例
    ?? *? * @see org.jivesoftware.xiff.data.ISerializable
    ?? * @example The following example sends a basic chat message to the user with the JID "
    sideshowbob@springfieldpenitentiary.gov".<br />
    ?? * <pre>var msg:Message = new Message( "sideshowbob@springfieldpenitentiary.gov", null, "Hi Bob.", "<b>Hi Bob.</b>", Message.CHAT_TYPE );
    ?? * myXMPPConnection.send( msg );</pre>
    ?? */
    ??public function send( o:XMPPStanza ):void
    ??{
    ???if( isActive() ) {
    ????///主要是處理? IQ(info 、query)
    ????if( o is IQ ) {
    ???????????????? var iq:IQ = o as IQ;
    ???????????????? if ((iq.callbackName != null && iq.callbackScope != null) || iq.callback != null)
    ???????????????? {
    ???????????????? ?addIQCallbackToPending( iq.id, iq.callbackName, iq.callbackScope, iq.callback );
    ???????????????? }??
    ????}
    ????var root:XMLNode = o.getNode().parentNode;
    ????if (root == null) {
    ?????root = new XMLDocument();
    ????}
    ?
    ????if (o.serialize(root)) {
    ?????sendXML( root.firstChild );
    ????} else {
    ?????throw new SerializationException();
    ????}
    ???}
    ??}
    ??///發送一個空包,保持這個聯結
    ??public function sendKeepAlive():void
    ??{
    ???if( isActive() ) {
    ????sendXML(" ");
    ???}
    ??}
    ??
    ??/**
    ?? * Determines whether the connection with the server is currently active. (Not necessarily logged in.
    ?? * For login status, use the <code>isLoggedIn()</code> method.)
    ?? * 檢測這個連接是否是活動的
    ?? * @return A boolean indicating whether the connection is active.
    ?? * @see org.jivesoftware.xiff.core.XMPPConnection#isLoggedIn
    ?? */
    ??public function isActive():Boolean
    ??{
    ???return active;
    ??}
    ??
    ??/**
    ?? * Determines whether the user is connected and logged into the server.
    ?? * 判斷用戶是否已經登陸
    ?? * @return A boolean indicating whether the user is logged in.
    ?? * @see org.jivesoftware.xiff.core.XMPPConnection#isActive
    ?? */
    ??public function isLoggedIn():Boolean
    ??{
    ???return loggedIn;
    ??}
    ??
    ??/**
    ?? * Issues a request for the information that must be submitted for registration with the server.
    ?? * 發布一個請求去獲取必須提交的信息以用來向服務器注冊,注冊用戶時用到
    ?? * When the data returns, a <code>RegistrationFieldsEvent.REG_FIELDS</code> event is dispatched
    ?? * containing the requested data.
    ?? */
    ??public function getRegistrationFields():void
    ??{
    ???var regIQ:IQ = new IQ( new JID(server), IQ.GET_TYPE, XMPPStanza.generateID("reg_info_"), "getRegistrationFields_result", this, null);
    ???regIQ.addExtension(new RegisterExtension(regIQ.getNode()));
    ?
    ???send( regIQ );
    ??}
    ??
    ??/**
    ?? * Registers a new account with the server, sending the registration data as specified in the fieldMap paramter.
    ?? * 向服務注冊一個新的帳號,發送注冊所需的數據
    ?? * @param fieldMap An object map containing the data to use for registration. The map should be composed of
    ?? * attribute:value pairs for each registration data item.
    ?? * @param key (Optional) If a key was passed in the "data" field of the "registrationFields" event,
    ?? * that key must also be passed here.
    ?? * required field needed for registration.
    ?? */
    ??public function sendRegistrationFields( fieldMap:Object, key:String ):void
    ??{
    ???var regIQ:IQ = new IQ( new JID(server), IQ.SET_TYPE, XMPPStanza.generateID("reg_attempt_"), "sendRegistrationFields_result", this, null );
    ???var ext:RegisterExtension = new RegisterExtension(regIQ.getNode());
    ?
    ???for( var i:String in fieldMap ) {
    ????ext[i] = fieldMap[i];
    ???}
    ???if (key != null) {
    ????ext.key = key;
    ???}
    ?
    ???regIQ.addExtension(ext);
    ???send( regIQ );
    ??}
    ??
    ??/**
    ?? * Changes the user's account password on the server. If the password change is successful,
    ?? * the class will broadcast a <code>ChangePasswordSuccessEvent.PASSWORD_SUCCESS</code> event.
    ?? *變更用戶帳號密碼, 如果成功將會觸發事件:ChangePasswordSuccessEvent.PASSWORD_SUCCESS
    ?? * @param newPassword The new password
    ?? */
    ??public function changePassword( newPassword:String ):void
    ??{
    ???var passwdIQ:IQ = new IQ( new JID(server), IQ.SET_TYPE, XMPPStanza.generateID("pswd_change_"), "changePassword_result", this, null );
    ???var ext:RegisterExtension = new RegisterExtension(passwdIQ.getNode());
    ?
    ???ext.username = jid.toBareJID();
    ???ext.password = newPassword;
    ?
    ???passwdIQ.addExtension(ext);
    ???send( passwdIQ );
    ??}
    ??
    ??/**
    ?? * Gets the fully qualified JID (user@server/resource) of the user. A fully-qualified JID includes
    ?? * the resource. A bare JID does not. To get the bare JID, use the <code>getBareJID()</code> method.
    ?? * 返回一個完整的jid user@server/resource
    ?? * @return The fully qualified JID
    ?? * @see #getBareJID
    ?? */
    ??public function get jid():JID
    ??{
    ???return new JID(myUsername + "@" + myServer + "/" + myResource);
    ??}
    ??
    ??/**
    ?? * @private? 修改密碼的返回情況
    ?? */
    ??protected function changePassword_result( resultIQ:IQ ):void
    ??{
    ???if( resultIQ.type == IQ.RESULT_TYPE ) {
    ????var event:ChangePasswordSuccessEvent = new ChangePasswordSuccessEvent();
    ????dispatchEvent(event);
    ???}
    ???else {
    ????// We weren't expecting this
    ????////400? 修改密碼錯誤
    ????dispatchError( "unexpected-request", "Unexpected Request", "wait", 400 );
    ???}
    ??}
    ??
    ??/**
    ?? * @private 注冊用戶的返回情況
    ?? */
    ??protected function getRegistrationFields_result( resultIQ:IQ ):void
    ??{
    ???try
    ???{
    ????var ext:RegisterExtension = resultIQ.getAllExtensionsByNS(RegisterExtension.NS)[0];
    ????var fields:Array = ext.getRequiredFieldNames(); //TODO, phase this out
    ????
    ????var event:RegistrationFieldsEvent = new RegistrationFieldsEvent();
    ????event.fields = fields;
    ????event.data = ext;
    ???}
    ???catch (e:Error)
    ??? {
    ??? ?trace(e.getStackTrace());
    ??? }
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function sendRegistrationFields_result( resultIQ:IQ ):void
    ??{
    ???if( resultIQ.type == IQ.RESULT_TYPE ) {

    ????var event:RegistrationSuccessEvent = new RegistrationSuccessEvent();
    ????dispatchEvent( event );
    ???}
    ???else {
    ????// We weren't expecting this
    ????dispatchError( "unexpected-request", "Unexpected Request", "wait", 400 );
    ???}
    ??}
    ??
    ??// Listener function from the ListenerXMLSocket
    ??/**
    ?? * @private
    ?? */
    ??protected function socketConnected(ev:Event):void
    ??{
    ???active = true;
    ???sendXML( openingStreamTag );
    ???var event:ConnectionSuccessEvent = new ConnectionSuccessEvent();
    ???dispatchEvent( event );
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function socketReceivedData( ev:DataEvent ):void
    ??{
    ???// parseXML is more strict in AS3 so we must check for the presence of flash:stream
    ???// the unterminated tag should be in the first string of xml data retured from the server
    ???if (!_expireTagSearch)
    ???{
    ????var pattern:RegExp = new RegExp("<flash:stream");
    ????var resultObj:Object = pattern.exec(ev.data);
    ????if (resultObj != null) // stop searching for unterminated node
    ????{
    ?????ev.data = ev.data.concat("</flash:stream>");
    ?????_expireTagSearch = true;
    ????}
    ???}
    ???
    ???if(ev.data == "</flash:stream>")
    ???{
    ????socketClosed(null);
    ????return;?
    ???}?
    ???
    ???var xmlData:XMLDocument = new XMLDocument();
    ???xmlData.ignoreWhite = this.ignoreWhite;
    ???xmlData.parseXML( ev.data );
    ???
    ???var event:IncomingDataEvent = new IncomingDataEvent();
    ???event.data = xmlData;
    ???dispatchEvent( event );
    ???
    ???// Read the data and send it to the appropriate parser
    ???var firstNode:XMLNode = xmlData.firstChild;
    ???var nodeName:String = firstNode.nodeName.toLowerCase();
    ???//trace("RECV: " + firstNode);
    ???switch( nodeName )
    ???{
    ????case "stream:stream":
    ????case "flash:stream":
    ?????_expireTagSearch = false;
    ?????handleStream( firstNode );
    ?????break;
    ?????
    ????case "stream:error":
    ?????handleStreamError( firstNode );
    ?????break;
    ?????
    ????case "iq":
    ?????handleIQ( firstNode );
    ?????break;
    ?????
    ????case "message":
    ?????handleMessage( firstNode );
    ?????break;
    ?????
    ????case "presence":
    ?????handlePresence( firstNode );
    ?????break;
    ?????
    ????case "stream:features":
    ?????break;
    ?????
    ????default:
    ?????// silently ignore lack of or unknown stanzas
    ?????// if the app designer wishes to handle raw data they
    ?????// can on "incomingData".
    ?
    ?????// Use case: received null byte, XMLSocket parses empty document
    ?????// sends empty document
    ?????
    ?????// I am enabling this for debugging
    ?????dispatchError( "undefined-condition", "Unknown Error", "modify", 500 );
    ?????break;
    ???}
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function socketClosed(e:Event):void
    ??{?
    ???var event:DisconnectionEvent = new DisconnectionEvent();
    ???dispatchEvent( event );
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function handleStream( node:XMLNode ):void
    ??{
    ???sessionID = node.attributes.id;
    ???server = node.attributes.from;
    ???
    ???if(_useAnonymousLogin) {
    ????// Begin anonymous login
    ????sendAnonymousLogin();
    ???} else if( username != null && username.length > 0 ) {
    ????// Begin login sequence
    ????beginAuthentication();
    ???} else {
    ????//get registration fields
    ????getRegistrationFields();
    ???}
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function handleStreamError( node:XMLNode ):void
    ??{
    ???dispatchError( "service-unavailable", "Remote Server Error", "cancel", 502 );
    ???
    ???// Cancel everything by closing connection
    ???try {
    ????_socket.close();
    ???}
    ???catch (error:Error){
    ????
    ???}
    ???active = false;
    ???loggedIn = false;
    ???var event:DisconnectionEvent = new DisconnectionEvent();
    ???
    ???dispatchEvent( event );
    ??}
    ??
    ??protected function set active(flag:Boolean):void
    ??{
    ???if(flag)
    ???{
    ????_openConnections.push(this);
    ???}
    ???else
    ???{
    ????_openConnections.splice(_openConnections.indexOf(this), 1);
    ???}
    ???_active = flag;
    ??}
    ??
    ??protected function get active():Boolean
    ??{
    ???return _active;
    ??}
    ??
    ??public static function get openConnections():Array
    ??{
    ???return _openConnections;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function handleIQ( node:XMLNode ):IQ
    ??{
    ???var iq:IQ = new IQ();
    ???// Populate the IQ with the incoming data
    ???if( !iq.deserialize( node ) ) {
    ????throw new SerializationException();
    ???}
    ???
    ???// If it's an error, handle it
    ???
    ???if( iq.type == IQ.ERROR_TYPE && !pendingIQs[iq.id]) {
    ????dispatchError( iq.errorCondition, iq.errorMessage, iq.errorType, iq.errorCode );
    ???}
    ???else {
    ????
    ????// Start the callback for this IQ if one exists
    ????if( pendingIQs[iq.id] !== undefined ) {
    ?????var callbackInfo:* = pendingIQs[iq.id];
    ?????
    ?????if(callbackInfo.methodScope && callbackInfo.methodName) {
    ??????callbackInfo.methodScope[callbackInfo.methodName].apply( callbackInfo.methodScope, [iq] );
    ?????}???
    ?????if (callbackInfo.func != null) {
    ??????callbackInfo.func( iq );
    ?????}
    ?????pendingIQs[iq.id] = null;
    ?????delete pendingIQs[iq.id];
    ????}
    ????else {
    ?????var exts:Array = iq.getAllExtensions();
    ?????for (var ns:String in exts) {
    ??????// Static type casting
    ??????var ext:IExtension = exts[ns] as IExtension;
    ??????if (ext != null) {
    ???????var event:IQEvent = new IQEvent(ext.getNS());
    ???????event.data = ext;
    ???????event.iq = iq;
    ???????dispatchEvent( event );
    ??????}
    ?????}
    ????}
    ???}
    ???????? return iq;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function handleMessage( node:XMLNode ):Message
    ??{
    ???var msg:Message = new Message();
    ???//trace(msg);?
    ???// Populate with data
    ???if( !msg.deserialize( node ) ) {
    ????throw new SerializationException();
    ???}
    ???// ADDED in error handling for messages
    ???if( msg.type == Message.ERROR_TYPE ) {
    ????dispatchError( msg.errorCondition, msg.errorMessage, msg.errorType, msg.errorCode );
    ???}
    ???else
    ???{
    ????var event:MessageEvent = new MessageEvent();
    ????event.data = msg;
    ????dispatchEvent( event );??
    ???}
    ???????? return msg;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??private var presenceQueue:Array = [];
    ??private var presenceQueueTimer:Timer;
    ??protected function handlePresence( node:XMLNode ):Presence
    ??{
    ???if(!presenceQueueTimer)
    ???{
    ????presenceQueueTimer = new Timer(1, 1);
    ????presenceQueueTimer.addEventListener(TimerEvent.TIMER_COMPLETE, flushPresenceQueue);
    ???}
    ???
    ???var pres:Presence = new Presence();
    ???
    ???// Populate
    ???if( !pres.deserialize( node ) ) {
    ????throw new SerializationException();
    ???}
    ???
    ???presenceQueue.push(pres);
    ???
    ???presenceQueueTimer.reset();
    ???presenceQueueTimer.start();

    ???????? return pres;
    ??}
    ??
    ??protected function flushPresenceQueue(evt:TimerEvent):void
    ??{
    ???var event:PresenceEvent = new PresenceEvent();
    ???event.data = presenceQueue;
    ???dispatchEvent( event );
    ???presenceQueue = [];
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function onIOError(event:IOErrorEvent):void{
    ???/*
    ???this fires the standard dispatchError method. need to add
    ???the appropriate error code
    ???*/
    ???dispatchError( "service-unavailable", "Service Unavailable", "cancel", 503 );
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function securityError(event:SecurityErrorEvent):void{
    ???trace("there was a security error of type: " + event.type + "\nError: " + event.text);
    ???dispatchError( "not-authorized", "Not Authorized", "auth", 401 );
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function dispatchError( condition:String, message:String, type:String, code:Number ):void
    ??{
    ???var event:XIFFErrorEvent = new XIFFErrorEvent();
    ???event.errorCondition = condition;
    ???event.errorMessage = message;
    ???event.errorType = type;
    ???event.errorCode = code;
    ???dispatchEvent( event );
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function sendXML( someData:* ):void
    ??{
    ???//trace("SEND: " + someData);
    ???// Data is untyped because it could be a string or XML
    ???_socket.send( someData );
    ???var event:OutgoingDataEvent = new OutgoingDataEvent();
    ???event.data = someData;
    ???dispatchEvent( event );
    ??}
    ??
    ??// anonymous login
    ??/**
    ?? * @private
    ?? */
    ??protected function sendAnonymousLogin():void
    ??{
    ???var anonIQ:IQ = new IQ(null, IQ.SET_TYPE, XMPPStanza.generateID("log_anom_"), "sendAnonymousLogin_result", this, null );
    ???var authExt:AuthExtension = new AuthExtension(anonIQ.getNode());
    ???anonIQ.addExtension(authExt);
    ???send(anonIQ);
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function sendAnonymousLogin_result(resultIQ:IQ):void
    ??{resultIQ
    ???if( resultIQ.type == IQ.RESULT_TYPE ) {
    ????// update resource
    ????var jid:JID = resultIQ.to;
    ????resource = jid.resource;
    ????username = jid.node;
    ????// dispatch login event
    ????loggedIn = true;
    ????var event:LoginEvent = new LoginEvent();
    ????dispatchEvent( event );
    ???}
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function beginAuthentication():void
    ??{
    ???var authIQ:IQ = new IQ( null, IQ.GET_TYPE, XMPPStanza.generateID("log_user_"), "beginAuthentication_result", this, null );
    ???var authExt:AuthExtension = new AuthExtension(authIQ.getNode());
    ???authExt.username = username
    ???
    ???authIQ.addExtension(authExt);
    ???send( authIQ );
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function beginAuthentication_result( resultIQ:IQ ):void
    ??{
    ???var connectionType:String = "none";
    ?
    ???// Begin authentication procedure
    ???if( resultIQ.type == IQ.RESULT_TYPE ) {
    ????var authIQ:IQ = new IQ( null, IQ.SET_TYPE, XMPPStanza.generateID("log_user2_"), "sendAuthentication_result", this, null );
    ????try
    ????{
    ?????var resultAuth:* = resultIQ.getAllExtensionsByNS(AuthExtension.NS)[0];
    ?????var responseAuth:AuthExtension = new AuthExtension(authIQ.getNode());
    ?????responseAuth.password = password;
    ?????responseAuth.username = username;
    ?????responseAuth.resource = resource;
    ?????authIQ.addExtension(responseAuth);
    ?????send( authIQ );
    ????}
    ????catch (e:Error)
    ????{
    ?????trace("Error : null trapped. Resuming.");
    ????}
    ???}
    ???else {
    ????// We weren't expecting this
    ????dispatchError( "unexpected-request", "Unexpected Request", "wait", 400 );
    ???}
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function sendAuthentication_result( resultIQ:IQ ):void
    ??{
    ???if( resultIQ.type == IQ.RESULT_TYPE ) {
    ????loggedIn = true;
    ????var event:LoginEvent = new LoginEvent();
    ????dispatchEvent( event );
    ???}
    ???else {
    ????// We weren't expecting this
    ????dispatchError( "unexpected-request", "Unexpected Request", "wait", 400 );
    ???}
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??protected function addIQCallbackToPending( id:String, callbackName:String, callbackScope:Object, callbackFunc:Function ):void
    ??{
    ???pendingIQs[id] = {methodName:callbackName, methodScope:callbackScope, func:callbackFunc};
    ??}
    ??
    ??/**
    ?? * The XMPP server to use for connection.
    ?? */
    ??public function get server():String
    ??{
    ???return myServer;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??public function set server( theServer:String ):void
    ??{
    ???myServer = theServer;
    ??}
    ??
    ??/**
    ?? * The username to use for connection. If this property is null when <code>connect()</code> is called,
    ?? * the class will fetch registration field data rather than attempt to login.
    ?? */
    ??public function get username():String
    ??{
    ???return myUsername;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??public function set username( theUsername:String ):void
    ??{
    ???myUsername = theUsername;
    ??}
    ??
    ??/**
    ?? * The password to use when logging in.
    ?? */
    ??public function get password():String
    ??{
    ???return myPassword;
    ??}
    ??
    ??public function set password( thePassword:String ):void
    ??{
    ???myPassword = thePassword;
    ??}
    ??
    ??/**
    ?? * The resource to use when logging in. A resource is required (defaults to "XIFF") and
    ?? * allows a user to login using the same account simultaneously (most likely from multiple machines).
    ?? * Typical examples of the resource include "Home" or "Office" to indicate the user's current location.
    ?? */
    ??public function get resource():String
    ??{
    ???return myResource;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??public function set resource( theResource:String ):void
    ??{
    ???if( theResource.length > 0 )
    ???{
    ????myResource = theResource;
    ???}
    ??}
    ??
    ??/**
    ?? * Whether to use anonymous login or not.
    ?? */
    ??public function get useAnonymousLogin():Boolean
    ??{
    ???return _useAnonymousLogin;
    ??}
    ??
    ??/**
    ?? * @private
    ?? */
    ??public function set useAnonymousLogin(value:Boolean):void
    ??{
    ???// set only if not connected
    ???if(!isActive()) _useAnonymousLogin = value;
    ??}
    ??
    ??/**
    ?? * The port to use when connecting. The default XMPP port is 5222.
    ?? */
    ??public function get port():Number
    ??{
    ???return myPort;
    ??}
    ??
    ??public function set port( portNum:Number ):void
    ??{
    ???myPort = portNum;
    ??}
    ?
    ??/**
    ?? * Determines whether whitespace will be ignored on incoming XML data.
    ?? * Behaves the same as <code>XML.ignoreWhite</code>
    ?? */
    ??public function get ignoreWhite():Boolean
    ??{
    ???return ignoreWhitespace;
    ??}
    ?
    ??public function set ignoreWhite( val:Boolean ):void
    ??{
    ???ignoreWhitespace = val;
    ??}
    ??
    ??private function _createXmlSocket():XMLSocket {
    ???var socket:XMLSocket = new XMLSocket(server, port);
    ???socket.addEventListener(Event.CONNECT,socketConnected);
    ???socket.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
    ???socket.addEventListener(Event.CLOSE,socketClosed);
    ???socket.addEventListener(DataEvent.DATA,socketReceivedData);
    ???socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);
    ???return socket;
    ??}
    ?}
    }



    大盤預測 國富論
    posted on 2008-03-26 14:59 華夢行 閱讀(3269) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 国产精品国产亚洲精品看不卡| 国产一级大片免费看| 亚洲理论电影在线观看| 免费人成在线观看播放a| 免费不卡中文字幕在线| 特级毛片在线大全免费播放| 免费一级毛片不卡不收费| 久久久久亚洲国产AV麻豆| 国产免费观看青青草原网站| 国产精品亚洲二区在线| 亚洲国产日韩成人综合天堂| a毛片成人免费全部播放| 区久久AAA片69亚洲| 无码av免费一区二区三区| 亚洲人成777在线播放| 插B内射18免费视频| 色屁屁在线观看视频免费| 亚洲精品在线不卡| 免费人成网站在线观看10分钟| 久久精品国产亚洲AV忘忧草18| 免费无码精品黄AV电影| 亚洲国产欧美一区二区三区 | 四虎影视久久久免费观看| 亚洲毛片av日韩av无码| 99re6在线视频精品免费| 亚洲日本精品一区二区| 最近2019中文字幕免费看最新| 朝桐光亚洲专区在线中文字幕| 亚洲婷婷五月综合狠狠爱| 最近中文字幕国语免费完整| 亚洲色最新高清av网站| 亚洲国产精品一区二区九九 | 亚洲色无码专区一区| 亚洲福利精品一区二区三区| 国产真人无码作爱免费视频| 亚洲精品在线网站| 免费在线观看a级毛片| 猫咪免费人成网站在线观看| 亚洲AV性色在线观看| 亚洲AV无码国产在丝袜线观看| 免费黄色大片网站|