/** @namespace XMPP
@desc Routes XMPP packets to and from Orion User Server.
*/
var XMPP = XMPP ||
{
/* properties */
'subscription_packets': {},
'registered_starlets' : [],
'queue' : [],
'connection' : null,
'reconnect' : 0,
'ping' : 0,
'internet_status' : 1,
/* callbacks */
'onPresence': function (presence)
{
var ptype = $(presence).attr('type');
!~$.inArray(ptype, ['orion_ping']) && log(L_FUNC, 'XMPP.onPresence', presence);
0 && !~$.inArray(ptype,
[
'orion_ping',
'peerstatus',
'extension',
'presence',
'dialpad_call',
'new_caller_info'
])
&& console.log('PRES', presence);
//Connection.onPing(); // any incoming traffic shows connection is alive
// route
switch (ptype) // alphabetical
{
// !! NEW
case 'userSettings' : Processor.userSettings (presence); return true;
// !! OLD
case 'add_group' : Processor.add_group (presence, 'add_group'); return true;
case 'add_group_extension' : Processor.add_group_extension (presence, 'add_group_extension'); return true;
case 'api_broadcast' : Processor.xmpp.onBroadcast (presence); return true;
case 'available' :
log(L_DEBUG, 'XMPP.onPresence', 'available');
//Connection.onConnect();
return true;
case 'availability_status' : Processor.first_roster (presence, 'availability_status'); return true;
//case 'call_recording' : Processor.call_recording (presence, 'call_recording'); return true;
//case 'call_recording_filter' : Processor.call_recording (presence, 'call_recording'); return true;
case 'chat_status' : Processor.chat_status (presence, 'chat_status'); return true;
case 'conference' : Processor.conference (presence, 'conference'); return true;
case 'conference_event' : Processor.conferencesEvent (presence, 'conference_event'); return true;
case 'create_fax_bucket' : Processor.create_fax_bucket (presence, 'create_fax_bucket'); return true;
case 'delete_fax' : Processor.delete_fax (presence, 'delete_fax'); return true;
case 'delete_fax_bucket' : Processor.delete_fax_bucket (presence, 'delete_fax_bucket'); return true;
case 'dialpad_call' :
if ($(presence).find('extension_id').text() == 0) { return true; }
Processor.dialpad_call(presence);
return true;
case 'dialpad_key' :
log(L_INFO, 'received a dialpad key');
Processor.dialpad_key(presence);
return true;
case 'error' :
if ($(presence).find('error').find('conflict').length > 0)
{
var obj = $pres({'to': $(presence).attr('from') + '_sub_' + Math.floor((Math.random() * 100) + 1)})
.c('x', {'xmlns': 'http://jabber.org/protocol/muc'});
this.send(obj);
}
return true;
case 'extension' : Processor.extension (presence, 'extension'); return true;
case 'fax' :
log(L_INFO, 'STARFAX INIT: PTYPE FAX');
Processor.fax(presence, 'fax');
return true;
case 'fax_filter' : Processor.fax_messages (presence, 'fax_messages'); return true;
case 'fax_messages' : Processor.fax_messages (presence, 'fax_messages'); return true;
case 'fax_status' : return true;
case 'file_upload_token' : Processor.file_upload_token (presence, 'file_upload_token'); return true;
case 'first_roster' : Processor.first_roster (presence, 'first_roster'); return true;
case 'framework_update' : Processor.frameworkUpdate (presence); return true;
case 'get_starlets' :
log(L_DEBUG, 'XMPP.onPresence', 'get_starlets');
//Connection.onConnect();
return true;
case 'group_invites' : Processor.group_invites (presence, 'group_invites'); return true; // chat
case 'group_roster' : Processor.group_roster (presence, 'group_roster'); return true;
case 'groups' : Processor.groups (presence, 'groups'); return true;
case 'hold' : Processor.xmpp.hold (presence); return true;
case 'join_update' :
log(L_INFO, 'received join_update packet: ' + $(presence).attr('to').text() + ' | id: ' + $(presence).attr('user_id').text());
var msg = "<div id='" + $(presence).attr('to').text() + "' class='message notice'>" +
"<div style='display:none' id='timestamp'>" + new Date().getTime() + "</div>" +
"<div class='nick center'>" +
"sub_" + $(presence).attr('user_id').text() + "_ has joined.</div></div>";
amplify.publish('starchat_message', msg);
return true;
case 'location_chat_status' : Processor.location_chat_status (presence, 'location_chat_status'); return true;
case 'location_status' : Processor.location_status (presence, 'location_status'); return true;
case 'locations' : Processor.locations (presence, 'locations'); return true;
case 'move_fax' : Processor.move_fax (presence, 'move_fax'); return true;
case 'mycall' : Processor.mycalls (presence, 'mycall'); return true;
case 'mycall_filter' : Processor.mycalls (presence, 'mycall'); return true;
case 'mycalls' : Processor.mycalls (presence, 'mycall'); return true;
case 'mycalls_filter' : Processor.mycalls (presence, 'mycall'); return true;
//case 'new_call_recording' : Processor.call_recording (presence, 'new_call_recording'); return true;
case 'new_caller_info' : Processor.new_caller_info (presence); return true;
case 'new_fax' : Processor.fax (presence, 'new_fax'); return true;
case 'notes_info' : Processor.notes_info (presence, 'notes_info'); return true;
case 'orion_connection' : Processor.orion_connection (presence); return true;
case 'orion_ping' : /*Connection.onPong();*/ return true;
case 'orion_user_settings' : Processor.orion_user_settings (presence); return true;
case 'parked' : Processor.parked (presence); return true;
case 'peerstatus' : Processor.peerstatus (presence, 'peerstatus'); return true;
case 'ping' : /*Connection.onPing();*/ return true;
case 'pong' : Connection.onPong(); return true;
case 'pop' : Processor.pop (presence, 'pop'); return true;
case 'presence' : Processor.presence (presence); return true;
case 'privacy_setting' : Processor.privacy_setting (presence, 'privacy_setting'); return true;
case 'receive_chat' : Processor.receive_chat (presence, 'receive_chat'); return true;
case 'remove_group' : Processor.remove_group (presence, 'remove_group'); return true;
case 'remove_group_extension': Processor.remove_group_extension(presence, 'remove_group_extension'); return true;
case 'rename' : Processor.rename (presence); return true;
case 'rename_fax_bucket' : Processor.rename_fax_bucket (presence, 'rename_fax_bucket'); return true;
case 'rename_group' : Processor.rename_group (presence, 'rename_group'); return true;
case 'roster' : Processor.roster (presence, 'roster'); return true;
case 'settings' : Processor.settings (presence); return true;
case 'status' : Processor.status (presence); return true;
case 'unavailable' :
//log(L_INFO, 'received unavailable presence: ' + $(presence).attr('from'));
//amplify.publish('user_disconnected', $(presence).attr('from').split('/').pop());
Processor.chatmessages(presence, true);
return true;
case 'update_locations' : Processor.locations (presence, 'update_locations'); return true;
case 'update_roster' : Processor.roster (presence, 'update_roster'); return true;
case 'user_extensions' : return true;
case 'voicemail' : Processor.voicemail (presence, 'voicemail'); return true;
case 'voicemail_filter' : Processor.voicemail (presence, 'voicemail'); return true;
default : // chat events
$(presence).find('x').attr('xmlns') === 'http://jabber.org/protocol/muc#user'
&& Processor.chatmessages(presence, true);
return true;
}
},
'onPublicMessage': function (message)
{
log(L_FUNC, 'XMPP.onPublicMessage', message);
//console.log('onPublicMessage: ', message);
// Connection.onPing(); // any incoming traffic shows connection is alive
Processor.chatmessages(message);
return true;
},
/* methods */
'connect': function (username, password, domain, url)
{
log(L_MAIN, 'XMPP.connect', arguments);
Connection.username = username;
Connection.password = password;
Connection.domain = domain;
Connection.url = url;
//console.log('----------', Connection.internet, this.connection );
if (Connection.internet && this.connection === null)
{
var conn = new Strophe.Connection(Connection.url);
conn.connect(Connection.username + '@' + Connection.domain, Connection.password, function (status)
{
switch (status)
{
case Strophe.Status.AUTHENTICATING:
log(L_INFO , 'XMPP.connect', 'authenticating');
Connection.onPong();
break;
case Strophe.Status.AUTHFAIL:
log(L_ERROR, 'XMPP.connect', 'authentication fail');
XMPP.connection = null;
//Connection.onDisconnect();
OrionConnection.logoffApplication();
break;
case Strophe.Status.CONNECTING: log(L_INFO , 'XMPP.connect', 'connecting'); break;
case Strophe.Status.CONNFAIL:
log(L_ERROR, 'XMPP.connect', 'connection fail');
XMPP.connection = null;
Connection.onDisconnect();
break;
case Strophe.Status.CONNECTED:
log(L_MAIN, 'XMPP.connect', 'connected');
if (XMPP.connection === null)
{
XMPP.connection = conn;
XMPP.connection.addHandler(XMPP.onPresence , null, 'presence' );
XMPP.connection.addHandler(XMPP.onPublicMessage , null, 'message' , 'groupchat');
//XMPP.connection.addHandler(XMPP.on_private_message, null, 'message' , 'chat' );
XMPP.send($pres({'name': 'presence', 'category': 'update', 'type': 'subscribe_packet'}));
// New packet to initialize the client. Replaces the old get_starlets.
XMPP.send($pres({'user_id': Connection.my_user_id, 'location_id': Connection.my_location, 'type': 'initialize'}));
//XMPP.send($pres({'type': 'available'}));//.c({'platform': ''}, {'version': ''})); // new 2.0 initial presence
//Connection.onPing();
Connection.onConnect();
}
break;
case Strophe.Status.DISCONNECTING: log(L_INFO , 'XMPP.connect', 'disconnecting'); break;
case Strophe.Status.DISCONNECTED:
log(L_MAIN, 'XMPP.connect', 'disconnected');
XMPP.connection = null;
Connection.onDisconnect();
break;
case Strophe.Status.ERROR:
log(L_ERROR, 'XMPP.connect', 'connection error');
XMPP.connection = null;
Connection.onDisconnect();
break;
default: log(L_INFO , 'XMPP.connect', 'status ' + status); break;
}
});
}
},
'disconnect': function () { this.connection && this.connection.disconnect(); },
'send': function (packet)
{
log(L_INFO, 'XMPP.send', packet);
XMPP.queue.push(packet);
!XMPP.sendInterval && (XMPP.sendInterval = setInterval(function(){
if (XMPP.queue.length) {
var item = XMPP.queue.shift();
XMPP.connection !== null && XMPP.connection.send(item);
} else {
clearInterval(XMPP.sendInterval);
XMPP.sendInterval = null;
}
}, 500))
}
};