| /* |
| Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved. |
| Available via Academic Free License >= 2.1 OR the modified BSD license. |
| see: http://dojotoolkit.org/license for details |
| */ |
| |
| |
| if(!dojo._hasResource["dojox.xmpp.xmppSession"]){ |
| dojo._hasResource["dojox.xmpp.xmppSession"]=true; |
| dojo.provide("dojox.xmpp.xmppSession"); |
| dojo.require("dojox.xmpp.TransportSession"); |
| dojo.require("dojox.xmpp.RosterService"); |
| dojo.require("dojox.xmpp.PresenceService"); |
| dojo.require("dojox.xmpp.UserService"); |
| dojo.require("dojox.xmpp.ChatService"); |
| dojo.require("dojox.xmpp.sasl"); |
| dojox.xmpp.xmpp={STREAM_NS:"http://etherx.jabber.org/streams",CLIENT_NS:"jabber:client",STANZA_NS:"urn:ietf:params:xml:ns:xmpp-stanzas",SASL_NS:"urn:ietf:params:xml:ns:xmpp-sasl",BIND_NS:"urn:ietf:params:xml:ns:xmpp-bind",SESSION_NS:"urn:ietf:params:xml:ns:xmpp-session",BODY_NS:"http://jabber.org/protocol/httpbind",XHTML_BODY_NS:"http://www.w3.org/1999/xhtml",XHTML_IM_NS:"http://jabber.org/protocol/xhtml-im",INACTIVE:"Inactive",CONNECTED:"Connected",ACTIVE:"Active",TERMINATE:"Terminate",LOGIN_FAILURE:"LoginFailure",INVALID_ID:-1,NO_ID:0,error:{BAD_REQUEST:"bad-request",CONFLICT:"conflict",FEATURE_NOT_IMPLEMENTED:"feature-not-implemented",FORBIDDEN:"forbidden",GONE:"gone",INTERNAL_SERVER_ERROR:"internal-server-error",ITEM_NOT_FOUND:"item-not-found",ID_MALFORMED:"jid-malformed",NOT_ACCEPTABLE:"not-acceptable",NOT_ALLOWED:"not-allowed",NOT_AUTHORIZED:"not-authorized",SERVICE_UNAVAILABLE:"service-unavailable",SUBSCRIPTION_REQUIRED:"subscription-required",UNEXPECTED_REQUEST:"unexpected-request"}}; |
| dojox.xmpp.xmppSession=function(_1){ |
| this.roster=[]; |
| this.chatRegister=[]; |
| this._iqId=Math.round(Math.random()*1000000000); |
| if(_1&&dojo.isObject(_1)){ |
| dojo.mixin(this,_1); |
| } |
| this.session=new dojox.xmpp.TransportSession(_1); |
| dojo.connect(this.session,"onReady",this,"onTransportReady"); |
| dojo.connect(this.session,"onTerminate",this,"onTransportTerminate"); |
| dojo.connect(this.session,"onProcessProtocolResponse",this,"processProtocolResponse"); |
| }; |
| dojo.extend(dojox.xmpp.xmppSession,{roster:[],chatRegister:[],_iqId:0,open:function(_2,_3,_4){ |
| if(!_2){ |
| throw new Error("User id cannot be null"); |
| }else{ |
| this.jid=_2; |
| if(_2.indexOf("@")==-1){ |
| this.jid=this.jid+"@"+this.domain; |
| } |
| } |
| if(_3){ |
| this.password=_3; |
| } |
| if(_4){ |
| this.resource=_4; |
| } |
| this.session.open(); |
| },close:function(){ |
| this.state=dojox.xmpp.xmpp.TERMINATE; |
| this.session.close(dojox.xmpp.util.createElement("presence",{type:"unavailable",xmlns:dojox.xmpp.xmpp.CLIENT_NS},true)); |
| },processProtocolResponse:function(_5){ |
| var _6=_5.nodeName; |
| var _7=_6.indexOf(":"); |
| if(_7>0){ |
| _6=_6.substring(_7+1); |
| } |
| switch(_6){ |
| case "iq": |
| case "presence": |
| case "message": |
| case "features": |
| this[_6+"Handler"](_5); |
| break; |
| default: |
| if(_5.getAttribute("xmlns")==dojox.xmpp.xmpp.SASL_NS){ |
| this.saslHandler(_5); |
| } |
| } |
| },messageHandler:function(_8){ |
| switch(_8.getAttribute("type")){ |
| case "chat": |
| this.chatHandler(_8); |
| break; |
| case "normal": |
| default: |
| this.simpleMessageHandler(_8); |
| } |
| },iqHandler:function(_9){ |
| if(_9.getAttribute("type")=="set"){ |
| this.iqSetHandler(_9); |
| return; |
| }else{ |
| if(_9.getAttribute("type")=="get"){ |
| return; |
| } |
| } |
| },presenceHandler:function(_a){ |
| switch(_a.getAttribute("type")){ |
| case "subscribe": |
| this.presenceSubscriptionRequest(_a.getAttribute("from")); |
| break; |
| case "subscribed": |
| case "unsubscribed": |
| break; |
| case "error": |
| this.processXmppError(_a); |
| break; |
| default: |
| this.presenceUpdate(_a); |
| break; |
| } |
| },featuresHandler:function(_b){ |
| var _c=[]; |
| var _d=false; |
| var _e=false; |
| if(_b.hasChildNodes()){ |
| for(var i=0;i<_b.childNodes.length;i++){ |
| var n=_b.childNodes[i]; |
| switch(n.nodeName){ |
| case "mechanisms": |
| for(var x=0;x<n.childNodes.length;x++){ |
| _c.push(n.childNodes[x].firstChild.nodeValue); |
| } |
| break; |
| case "bind": |
| _d=true; |
| break; |
| case "session": |
| _e=true; |
| } |
| } |
| } |
| if(this.state==dojox.xmpp.xmpp.CONNECTED){ |
| if(!this.auth){ |
| for(var i=0;i<_c.length;i++){ |
| try{ |
| this.auth=dojox.xmpp.sasl.registry.match(_c[i],this); |
| break; |
| } |
| catch(e){ |
| console.warn("No suitable auth mechanism found for: ",_c[i]); |
| } |
| } |
| }else{ |
| if(_d){ |
| this.bindResource(_e); |
| } |
| } |
| } |
| },saslHandler:function(_f){ |
| if(_f.nodeName=="success"){ |
| this.auth.onSuccess(); |
| return; |
| } |
| if(_f.nodeName=="challenge"){ |
| this.auth.onChallenge(_f); |
| return; |
| } |
| if(_f.hasChildNodes()){ |
| this.onLoginFailure(_f.firstChild.nodeName); |
| this.session.setState("Terminate",_f.firstChild.nodeName); |
| } |
| },sendRestart:function(){ |
| this.session._sendRestart(); |
| },chatHandler:function(msg){ |
| var _10={from:msg.getAttribute("from"),to:msg.getAttribute("to")}; |
| var _11=null; |
| for(var i=0;i<msg.childNodes.length;i++){ |
| var n=msg.childNodes[i]; |
| if(n.hasChildNodes()){ |
| switch(n.nodeName){ |
| case "thread": |
| _10.chatid=n.firstChild.nodeValue; |
| break; |
| case "body": |
| if(!n.getAttribute("xmlns")||(n.getAttribute("xmlns")=="")){ |
| _10.body=n.firstChild.nodeValue; |
| } |
| break; |
| case "subject": |
| _10.subject=n.firstChild.nodeValue; |
| case "html": |
| if(n.getAttribute("xmlns")==dojox.xmpp.xmpp.XHTML_IM_NS){ |
| _10.xhtml=n.getElementsByTagName("body")[0]; |
| } |
| break; |
| case "x": |
| break; |
| default: |
| } |
| } |
| } |
| var _12=-1; |
| if(_10.chatid){ |
| for(var i=0;i<this.chatRegister.length;i++){ |
| var ci=this.chatRegister[i]; |
| if(ci&&ci.chatid==_10.chatid){ |
| _12=i; |
| break; |
| } |
| } |
| }else{ |
| for(var i=0;i<this.chatRegister.length;i++){ |
| var ci=this.chatRegister[i]; |
| if(ci){ |
| if(ci.uid==this.getBareJid(_10.from)){ |
| _12=i; |
| } |
| } |
| } |
| } |
| if(_12>-1&&_11){ |
| var _13=this.chatRegister[_12]; |
| _13.setState(_11); |
| if(_13.firstMessage){ |
| if(_11==dojox.xmpp.chat.ACTIVE_STATE){ |
| _13.useChatState=(_11!=null)?true:false; |
| _13.firstMessage=false; |
| } |
| } |
| } |
| if((!_10.body||_10.body=="")&&!_10.xhtml){ |
| return; |
| } |
| if(_12>-1){ |
| var _13=this.chatRegister[_12]; |
| _13.recieveMessage(_10); |
| }else{ |
| var _14=new dojox.xmpp.ChatService(); |
| _14.uid=this.getBareJid(_10.from); |
| _14.chatid=_10.chatid; |
| _14.firstMessage=true; |
| if(!_11||_11!=dojox.xmpp.chat.ACTIVE_STATE){ |
| this.useChatState=false; |
| } |
| this.registerChatInstance(_14,_10); |
| } |
| },simpleMessageHandler:function(msg){ |
| },registerChatInstance:function(_15,_16){ |
| _15.setSession(this); |
| this.chatRegister.push(_15); |
| this.onRegisterChatInstance(_15,_16); |
| _15.recieveMessage(_16,true); |
| },iqSetHandler:function(msg){ |
| if(msg.hasChildNodes()){ |
| var fn=msg.firstChild; |
| switch(fn.nodeName){ |
| case "query": |
| if(fn.getAttribute("xmlns")=="jabber:iq:roster"){ |
| this.rosterSetHandler(fn); |
| this.sendIqResult(msg.getAttribute("id"),msg.getAttribute("from")); |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| },sendIqResult:function(_17,to){ |
| var req={id:_17,to:to||this.domain,type:"result",from:this.jid+"/"+this.resource}; |
| this.dispatchPacket(dojox.xmpp.util.createElement("iq",req,true)); |
| },rosterSetHandler:function(_18){ |
| for(var i=0;i<_18.childNodes.length;i++){ |
| var n=_18.childNodes[i]; |
| if(n.nodeName=="item"){ |
| var _19=false; |
| var _1a=-1; |
| var _1b=null; |
| var _1c=null; |
| for(var x=0;x<this.roster.length;x++){ |
| var r=this.roster[x]; |
| if(n.getAttribute("jid")==r.jid){ |
| _19=true; |
| if(n.getAttribute("subscription")=="remove"){ |
| _1b={id:r.jid,name:r.name,groups:[]}; |
| for(var y=0;y<r.groups.length;y++){ |
| _1b.groups.push(r.groups[y]); |
| } |
| this.roster.splice(x,1); |
| _1a=dojox.xmpp.roster.REMOVED; |
| }else{ |
| _1c=dojo.clone(r); |
| var _1d=n.getAttribute("name"); |
| if(_1d){ |
| this.roster[x].name=_1d; |
| } |
| r.groups=[]; |
| if(n.getAttribute("subscription")){ |
| r.status=n.getAttribute("subscription"); |
| } |
| r.substatus=dojox.xmpp.presence.SUBSCRIPTION_SUBSTATUS_NONE; |
| if(n.getAttribute("ask")=="subscribe"){ |
| r.substatus=dojox.xmpp.presence.SUBSCRIPTION_REQUEST_PENDING; |
| } |
| for(var y=0;y<n.childNodes.length;y++){ |
| var _1e=n.childNodes[y]; |
| if((_1e.nodeName=="group")&&(_1e.hasChildNodes())){ |
| var _1f=_1e.firstChild.nodeValue; |
| r.groups.push(_1f); |
| } |
| } |
| _1b=r; |
| _1a=dojox.xmpp.roster.CHANGED; |
| } |
| break; |
| } |
| } |
| if(!_19&&(n.getAttribute("subscription")!="remove")){ |
| r=this.createRosterEntry(n); |
| _1b=r; |
| _1a=dojox.xmpp.roster.ADDED; |
| } |
| switch(_1a){ |
| case dojox.xmpp.roster.ADDED: |
| this.onRosterAdded(_1b); |
| break; |
| case dojox.xmpp.roster.REMOVED: |
| this.onRosterRemoved(_1b); |
| break; |
| case dojox.xmpp.roster.CHANGED: |
| this.onRosterChanged(_1b,_1c); |
| break; |
| } |
| } |
| } |
| },presenceUpdate:function(msg){ |
| if(msg.getAttribute("to")){ |
| var jid=this.getBareJid(msg.getAttribute("to")); |
| if(jid!=this.jid){ |
| return; |
| } |
| } |
| var _20=this.getResourceFromJid(msg.getAttribute("from")); |
| var p={from:this.getBareJid(msg.getAttribute("from")),resource:_20,show:dojox.xmpp.presence.STATUS_ONLINE,priority:5,hasAvatar:false}; |
| if(msg.getAttribute("type")=="unavailable"){ |
| p.show=dojox.xmpp.presence.STATUS_OFFLINE; |
| } |
| for(var i=0;i<msg.childNodes.length;i++){ |
| var n=msg.childNodes[i]; |
| if(n.hasChildNodes()){ |
| switch(n.nodeName){ |
| case "status": |
| case "show": |
| p[n.nodeName]=n.firstChild.nodeValue; |
| break; |
| case "status": |
| p.priority=parseInt(n.firstChild.nodeValue); |
| break; |
| case "x": |
| if(n.firstChild&&n.firstChild.firstChild&&n.firstChild.firstChild.nodeValue!=""){ |
| p.avatarHash=n.firstChild.firstChild.nodeValue; |
| p.hasAvatar=true; |
| } |
| break; |
| } |
| } |
| } |
| this.onPresenceUpdate(p); |
| },retrieveRoster:function(){ |
| var _21={id:this.getNextIqId(),from:this.jid+"/"+this.resource,type:"get"}; |
| var req=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_21,false)); |
| req.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:roster"},true)); |
| req.append("</iq>"); |
| var def=this.dispatchPacket(req,"iq",_21.id); |
| def.addCallback(this,"onRetrieveRoster"); |
| },getRosterIndex:function(jid){ |
| if(jid.indexOf("@")==-1){ |
| jid+="@"+this.domain; |
| } |
| for(var i=0;i<this.roster.length;i++){ |
| if(jid==this.roster[i].jid){ |
| return i; |
| } |
| } |
| return -1; |
| },createRosterEntry:function(_22){ |
| var re={name:_22.getAttribute("name"),jid:_22.getAttribute("jid"),groups:[],status:dojox.xmpp.presence.SUBSCRIPTION_NONE,substatus:dojox.xmpp.presence.SUBSCRIPTION_SUBSTATUS_NONE}; |
| if(!re.name){ |
| re.name=re.id; |
| } |
| for(var i=0;i<_22.childNodes.length;i++){ |
| var n=_22.childNodes[i]; |
| if(n.nodeName=="group"&&n.hasChildNodes()){ |
| re.groups.push(n.firstChild.nodeValue); |
| } |
| } |
| if(_22.getAttribute("subscription")){ |
| re.status=_22.getAttribute("subscription"); |
| } |
| if(_22.getAttribute("ask")=="subscribe"){ |
| re.substatus=dojox.xmpp.presence.SUBSCRIPTION_REQUEST_PENDING; |
| } |
| return re; |
| },bindResource:function(_23){ |
| var _24={id:this.getNextIqId(),type:"set"}; |
| var _25=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_24,false)); |
| _25.append(dojox.xmpp.util.createElement("bind",{xmlns:dojox.xmpp.xmpp.BIND_NS},false)); |
| if(this.resource){ |
| _25.append(dojox.xmpp.util.createElement("resource")); |
| _25.append(this.resource); |
| _25.append("</resource>"); |
| } |
| _25.append("</bind></iq>"); |
| var def=this.dispatchPacket(_25,"iq",_24.id); |
| def.addCallback(this,function(msg){ |
| this.onBindResource(msg,_23); |
| return msg; |
| }); |
| },getNextIqId:function(){ |
| return "im_"+this._iqId++; |
| },presenceSubscriptionRequest:function(msg){ |
| this.onSubscriptionRequest(msg); |
| },dispatchPacket:function(msg,_26,_27){ |
| if(this.state!="Terminate"){ |
| return this.session.dispatchPacket(msg,_26,_27); |
| }else{ |
| } |
| },setState:function(_28,_29){ |
| if(this.state!=_28){ |
| if(this["on"+_28]){ |
| this["on"+_28](_28,this.state,_29); |
| } |
| this.state=_28; |
| } |
| },search:function(_2a,_2b,_2c){ |
| var req={id:this.getNextIqId(),"xml:lang":this.lang,type:"set",from:this.jid+"/"+this.resource,to:_2b}; |
| var _2d=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",req,false)); |
| _2d.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:search"},false)); |
| _2d.append(dojox.xmpp.util.createElement(_2c,{},false)); |
| _2d.append(_2a); |
| _2d.append("</").append(_2c).append(">"); |
| _2d.append("</query></iq>"); |
| var def=this.dispatchPacket(_2d.toString,"iq",req.id); |
| def.addCallback(this,"_onSearchResults"); |
| },_onSearchResults:function(msg){ |
| if((msg.getAttribute("type")=="result")&&(msg.hasChildNodes())){ |
| this.onSearchResults([]); |
| } |
| },onLogin:function(){ |
| this.retrieveRoster(); |
| },onLoginFailure:function(msg){ |
| },onBindResource:function(msg,_2e){ |
| if(msg.getAttribute("type")=="result"){ |
| if((msg.hasChildNodes())&&(msg.firstChild.nodeName=="bind")){ |
| var _2f=msg.firstChild; |
| if((_2f.hasChildNodes())&&(_2f.firstChild.nodeName=="jid")){ |
| if(_2f.firstChild.hasChildNodes()){ |
| var _30=_2f.firstChild.firstChild.nodeValue; |
| this.jid=this.getBareJid(_30); |
| this.resource=this.getResourceFromJid(_30); |
| } |
| } |
| if(_2e){ |
| var _31={id:this.getNextIqId(),type:"set"}; |
| var _32=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_31,false)); |
| _32.append(dojox.xmpp.util.createElement("session",{xmlns:dojox.xmpp.xmpp.SESSION_NS},true)); |
| _32.append("</iq>"); |
| var def=this.dispatchPacket(_32,"iq",_31.id); |
| def.addCallback(this,"onBindSession"); |
| return; |
| } |
| }else{ |
| } |
| this.onLogin(); |
| }else{ |
| if(msg.getAttribute("type")=="error"){ |
| var err=this.processXmppError(msg); |
| this.onLoginFailure(err); |
| } |
| } |
| },onBindSession:function(msg){ |
| if(msg.getAttribute("type")=="error"){ |
| var err=this.processXmppError(msg); |
| this.onLoginFailure(err); |
| }else{ |
| this.onLogin(); |
| } |
| },onSearchResults:function(_33){ |
| },onRetrieveRoster:function(msg){ |
| if((msg.getAttribute("type")=="result")&&msg.hasChildNodes()){ |
| var _34=msg.getElementsByTagName("query")[0]; |
| if(_34.getAttribute("xmlns")=="jabber:iq:roster"){ |
| for(var i=0;i<_34.childNodes.length;i++){ |
| if(_34.childNodes[i].nodeName=="item"){ |
| this.roster[i]=this.createRosterEntry(_34.childNodes[i]); |
| } |
| } |
| } |
| }else{ |
| if(msg.getAttribute("type")=="error"){ |
| } |
| } |
| this.setState(dojox.xmpp.xmpp.ACTIVE); |
| this.onRosterUpdated(); |
| return msg; |
| },onRosterUpdated:function(){ |
| },onSubscriptionRequest:function(req){ |
| },onPresenceUpdate:function(p){ |
| },onTransportReady:function(){ |
| this.setState(dojox.xmpp.xmpp.CONNECTED); |
| this.rosterService=new dojox.xmpp.RosterService(this); |
| this.presenceService=new dojox.xmpp.PresenceService(this); |
| this.userService=new dojox.xmpp.UserService(this); |
| },onTransportTerminate:function(_35,_36,_37){ |
| this.setState(dojox.xmpp.xmpp.TERMINATE,_37); |
| },onConnected:function(){ |
| },onTerminate:function(_38,_39,_3a){ |
| },onActive:function(){ |
| },onRegisterChatInstance:function(_3b,_3c){ |
| },onRosterAdded:function(ri){ |
| },onRosterRemoved:function(ri){ |
| },onRosterChanged:function(ri,_3d){ |
| },processXmppError:function(msg){ |
| var err={stanzaType:msg.nodeName,id:msg.getAttribute("id")}; |
| for(var i=0;i<msg.childNodes.length;i++){ |
| var n=msg.childNodes[i]; |
| switch(n.nodeName){ |
| case "error": |
| err.errorType=n.getAttribute("type"); |
| for(var x=0;x<n.childNodes.length;x++){ |
| var cn=n.childNodes[x]; |
| if((cn.nodeName=="text")&&(cn.getAttribute("xmlns")==dojox.xmpp.xmpp.STANZA_NS)&&cn.hasChildNodes()){ |
| err.message=cn.firstChild.nodeValue; |
| }else{ |
| if((cn.getAttribute("xmlns")==dojox.xmpp.xmpp.STANZA_NS)&&(!cn.hasChildNodes())){ |
| err.condition=cn.nodeName; |
| } |
| } |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| return err; |
| },sendStanzaError:function(_3e,to,id,_3f,_40,_41){ |
| var req={type:"error"}; |
| if(to){ |
| req.to=to; |
| } |
| if(id){ |
| req.id=id; |
| } |
| var _42=new dojox.string.Builder(dojox.xmpp.util.createElement(_3e,req,false)); |
| _42.append(dojox.xmpp.util.createElement("error",{type:_3f},false)); |
| _42.append(dojox.xmpp.util.createElement("condition",{xmlns:dojox.xmpp.xmpp.STANZA_NS},true)); |
| if(_41){ |
| var _43={xmlns:dojox.xmpp.xmpp.STANZA_NS,"xml:lang":this.lang}; |
| _42.append(dojox.xmpp.util.createElement("text",_43,false)); |
| _42.append(_41).append("</text>"); |
| } |
| _42.append("</error></").append(_3e).append(">"); |
| this.dispatchPacket(_42.toString()); |
| },getBareJid:function(jid){ |
| var i=jid.indexOf("/"); |
| if(i!=-1){ |
| return jid.substring(0,i); |
| } |
| return jid; |
| },getResourceFromJid:function(jid){ |
| var i=jid.indexOf("/"); |
| if(i!=-1){ |
| return jid.substring((i+1),jid.length); |
| } |
| return ""; |
| }}); |
| } |