blob: f2f624b816e0c01e7fdc2f823f2eafbf85efdf26 [file] [log] [blame]
/*
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 "";
}});
}