/** @namespace Connection
@desc Manages connectivity, holds connection and user criteria, and handles packets.
*/
var Connection = Connection ||
{
/* properties */
// states & configuration
/** @member {object} Connection~readyFramework
@private
@desc Synchronizer promise representing Framework readiness.
*/
'readyFramework': new $.Deferred(),
/** @member {object} Connection~readyDom
@private
@desc Synchronizer promise representing DOM readiness.
*/
'readyDom': new $.Deferred(),
/** @member {object} Connection~readyData
@private
@desc Synchronizer promise representing data readiness.
*/
'readyData': new $.Deferred(),
/** @member {boolean} Connection.splash
@desc Whether WebView "framework_splash_screen" is open.
*/
'splash': true,
/** @member {object} Connection.starlets
@desc Hashlike object of starlet objects.
*/
'starlets': {},
/** @member {array} Connection.features
@desc Array of feature objects from API.
*/
'features': [],
/** @member {object} Connection.subscriptions
@desc Hashlike object of packet subscriptions.
*/
'subscriptions': {},
/** @member {object} Connection.shortcuts
@desc Hashlike object of shortcut mappings.
*/
'shortcuts': {},
/** @member {object} Connection.cache
@desc Hashlike object of cached data.
*/
'cache': {},
/** @member {boolean} Connection.internet
@desc Whether Framework is able to access the internet. Assumed true until proven otherwise.
*/
'internet': true,
/** @member {boolean} Connection.connected
@desc Whether Framework is connected to user server via XMPP.
*/
'connected': false,
/** @member {boolean} Connection.connectedOnce
@desc Whether Framework has connected to user server once since starting.
*/
'connectedOnce': false,
/** @member {boolean} Connection.unloading
@desc Whether Connection's WebView is about to unload.
*/
'unloading': false,
/** @member {boolean} Connection.reloading
@desc Whether Connection's WebView is going to load again after unloading.
*/
'reloading': false,
/** @member {boolean} Connection.sleeping
@desc Whether framework will be or has been in system sleep state.
*/
'sleeping': false,
/** @member {number} Connection.pingLast
@desc Time of last ping packet from XMPP user server (ms timestamp).
*/
'pingLast': 0,
/** @member {number} Connection.pingInterval
@desc Expected interval between incoming user server pings (ms).
*/
'pingInterval': T_SECOND * 10,
/** @member {number} Connection.pingTolerance
@desc Length of time before an incoming user server ping is considered missed (ms).
*/
'pingTolerance': T_SECOND * 2,
/** @member {number} Connection.pingMisses
@desc Number of missed pings before XMPP connection is presumed lost.
*/
'pingMisses': 10,
/** @member {number} Connection.pingCheck
@desc Interval to check time since last user server ping (ms).
*/
'pingCheck': T_SECOND,
/** @member {number} Connection.pongCheck
@desc Interval to wait before checking for a pong from server (ms).
*/
'pongCheck': T_SECOND * 3,
/** @member {number} Connection.ajaxCheckTimeout
@desc Length of time before AJAX internet connectivity check times out (ms).
*/
'ajaxCheckTimeout': T_SECOND * 5,
/** @member {string} Connection.ajaxCheckUrl
@desc URL for AJAX internet connectivity check.
*/
'ajaxCheckUrl': 'http://getip.star2star.com',
/** @member {boolean} Connection.isOnLinkCallbackSet
@desc Whether Connection's WebView is about to unload.
*/
'isOnLinkCallbackSet': false,
// xmpp credentials
/** @member {string} Connection.username
@desc XMPP username credential.
@see {@link Connection.password}
@see {@link Connection.domain}
@see {@link Connection.url}
*/
'username': null,
/** @member {string} Connection.password
@desc XMPP password credential.
@see {@link Connection.username}
@see {@link Connection.domain}
@see {@link Connection.url}
*/
'password': null,
/** @member {string} Connection.domain
@desc XMPP server domain.
@see {@link Connection.username}
@see {@link Connection.password}
@see {@link Connection.url}
*/
'domain': null,
/** @member {string} Connection.url
@desc XMPP server path.
@see {@link Connection.username}
@see {@link Connection.password}
@see {@link Connection.url}
*/
'url': null,
// user info
/** @member {number} Connection.my_customer
@desc User's customer id.
*/
'my_customer': 0,
/** @member {number} Connection.my_location
@desc User's location id.
*/
'my_location': 0,
/** @member {number} Connection.my_extension
@desc User's default extension id.
*/
'my_extension': 0,
/** @member {string} Connection.my_extension_number
@desc User's default extension number.
*/
'my_extension_number': '',
/** @member {string} Connection.my_email
@desc User's email address.
*/
'my_email': '',
/** @member {number} Connection.my_user_id
@desc User's user id.
*/
'my_user_id': 0,
/** @member {number} Connection.user_id
@desc User's user id. (REDUNDANT)
@see {@link Connection.my_user_id}
*/
'user_id': 0,
/** @member {number} Connection.sessionId
@desc User's user server session id.
*/
'sessionId': null,
/** @member {string} Connection.sessionNick
@desc User's user server session nick.
*/
'sessionNick': '',
/** @member {number} Connection.view_all_calls
@desc Feature: Whether user can see all calls.
*/
'view_all_calls': 0,
/** @member {number} Connection.view_all_conferences
@desc Feature: Whether user can view all conferences.
*/
'view_all_conference': 0,
/** @member {number} Connection.view_privacy
@desc Feature: Whether user can view other private users.
*/
'view_privacy': 0,
/** @member {number} Connection.operator_mode
@desc Feature: Whether user interacts with calls and extensions as an operator.
*/
'operator_mode': 1,
/** @member {number} Connection.create_video_sessions
@desc Feature: Whether user can create video sessions.
*/
'create_video_sessions': 1,
/** @member {string} Connection.download_url
@desc User's download path (possibly unused).
*/
'download_url': '',
/** @member {number} Connection.release_notes
@desc Whether user has seen running Framework version's release notes.
*/
'release_notes': 1,
/** @member {number} Connection.show_unavailable
@desc Setting: Whether unavailable extensions are shown.
*/
'show_unavailable': 0,
/** @member {object} Connection.overlays
@desc Hashlike object of overlay states.
@property {Boolean} shoebox - Whether shoebox is open.
@property {Boolean} navigation - Whether navigation is open.
@property {Boolean} lightbox - Whether a lightbox is open.
*/
'overlays': {'shoebox': false, 'navigation': false, 'lightbox': false},
/** @member {array} Connection.lightboxes
@desc Array of reserved WebView names to handle as lightboxes.
*/
'lightboxes': ['help', 'whatsnew', 'feedback'],
/** @member {boolean} Connection.visible
@desc State: Whether any Framework windows are visible to the user.
*/
'visible': false,
/** @member {boolean} Connection.focused
@desc State: Whether any Framework windows are focused.
*/
'focused': true,
/** @member {boolean} Connection.minimized
@desc State: Whether any Framework windows are minimized.
*/
'minimized': false,
/** @member {boolean} Connection.hidden
@desc State: Whether any Framework windows are hidden.
*/
'hidden': false,
/** @member {boolean} Connection.mouse
@desc State: Whether any Framework windows contain mouse pointer.
*/
'mouse': false,
/** @member {number} Connection.notificationsDismissed
@desc Last time a notification was dismissed (ms timestamp).
*/
'notificationsDismissed': 0,
/* callbacks */
/**
@member {callbackProv} Connection~onReadyFramework
@private
@desc Fires when framework signals readiness.
*/
'onReadyFramework': function (provData)
{
log(L_MAIN, 'Connection.onReadyFramework', provData);
// init
var $document = $(document);
this.provData = provData;
// server overrides
this.provData.xmpp.server = PRODUCTION
? '199.15.180.135'
: 'xmpp.lb.star2star.net';
this.provData.xmpp.port = PRODUCTION
? '5280'
: '80';
// save server info
this.username = this.provData.xmpp.username;
this.password = this.provData.xmpp.password;
this.domain = this.provData.xmpp.domain;
this.url = 'http://{0}:{1}/{2}'.format
(
this.provData.xmpp.server,
this.provData.xmpp.port,
this.provData.xmpp.path
);
// save user info
this.my_customer = this.provData.customers[0].id;
this.my_email = this.provData.userName;
this.my_user_id = this.provData.xmpp.userId;
this.user_id = this.provData.xmpp.userId;
// browser object
if (ISORION)
{
Browser.platform = OrionFramework.platform;
Browser.version = OrionFramework.version;
Browser.apiUrl = OrionFramework.apiURL;
}
// bind callbacks
OrionUpload.setProgressCallback ('', linkCallback(function (e) { $document.triggerHandler('uploadprogress' , [e.uploads]); }, window, true));
OrionUpload.setFinishCallback ('', linkCallback(function (e) { $document.triggerHandler('uploadfinish' , [e]); }, window, true));
OrionUpload.setErrorCallback ('', linkCallback(function (e) { $document.triggerHandler('uploaderror' , [e]); }, window, true));
OrionUpload.setResponseCallback ('', linkCallback(function (e) { $document.triggerHandler('uploadresponse' , [e]); }, window, true));
OrionDownload.setProgressCallback('', linkCallback(function (e) { $document.triggerHandler('downloadprogress', [e.downloads]); }, window, true));
OrionDownload.setFinishCallback ('', linkCallback(function (e) { $document.triggerHandler('downloadfinish' , [e]); }, window, true));
OrionDownload.setErrorCallback ('', linkCallback(function (e) { $document.triggerHandler('downloaderror' , [e]); }, window, true));
OrionDownload.setResponseCallback('', linkCallback(function (e) { $document.triggerHandler('downloadresponse', [e]); }, window, true));
//OrionConnection.setLinkCallback('Distributor', 'onLink');
//OrionConnection.setAnimationStepCallback('Connection', 'onAnimationStep');
OrionSystem.setSleepCallback('', linkCallback(function (e) { Connection.sleeping = true; Connection.onDisconnect(); }, window, true));
OrionSystem.setWakeCallback ('', linkCallback(function (e) { Connection.sleeping = false; Connection.checkAjax(); }, window, true));
// signal
Connection.readyFramework.resolve();
},
'onFinishedLoading': function() {
//console.log('=========== Finished Loading ===========');
//console.log('=========== Link callback set Loading ===========', Connection.isOnLinkCallbackSet, !Connection.isOnLinkCallbackSet);
!Connection.isOnLinkCallbackSet && OrionConnection.setLinkCallback('Distributor', 'onLink');
Connection.isOnLinkCallbackSet = true;
//console.log('=========== Link callback set Loading ===========', Connection.isOnLinkCallbackSet, !Connection.isOnLinkCallbackSet);
},
/** @member {callbackGeneric} Connection~onReadyDom
@private
@desc Fires when DOM signals readiness.
*/
'onReadyDom': function ()
{
log(L_MAIN, 'Connection.onReadyDom');
// bind events
$(window).on('beforeunload', Connection.onBeforeUnload);
// signal
this.readyDom.resolve();
},
/**
@member {callbackGeneric} Connection~onReadyAPI
@private
@desc Fires when API is ready to query.
*/
'onReadyAPI': function ()
{
log(L_MAIN, 'Connection.onReadyAPI');
$.when
(
Bus.ask('users' , {'action': 'detail', 'id': this.provData.xmpp.userId})
//Bus.ask('options', {'action': 'list' , 'category': '_global', 'filter': '^defaultExtensionID$'})
)
.then(this.onReadyData.context(this));
},
/** @member {callbackGeneric} Connection~onReadyData
@private
@desc Fires after basic user data is retrieved.
*/
'onReadyData': function (usersPacket, defaultsPacket)
{
log(L_MAIN, 'Connection.onReadyData');
// save user detail
this.user = usersPacket.data[0];
// generate nick
var uName = this.user.firstName+' '+this.user.lastName;
if (uName.trim().length === 0) {
uName = this.user.email;
}
this.sessionNick = '{0}_{1}_{2}'.format
(
this.user_id,
this.username.substring(String(this.user_id).length),
uName
//'{0} {1}'.format
//(
// this.user.firstName,
// this.user.lastName
//)
);
if (PRODUCTION)
{
var pd = Connection.provData;
if (pd.customers.length > 1) // multiple customers?
{
Bus.ask('options',
{
'action' : 'list',
'category': 'framework',
'filter' : 'multiplecustomer'
})
.then(function (packet)
{
if (packet.data.length && packet.data[0].value == '1') { return; } // already flagged
// create zendesk ticket
var message =
[
'Orion Framework has identified more than one customer for this user.',
'The system is using customer: {0}, other customers include:'
];
pd.customers.map(function (customer, index)
{
index && message.push('{{0}}{1}'.format
(
index,
index + 1 < pd.customers.length ? ',' : '.'
));
});
message.push('It is requested that support take the appropriate action to eliminate users expanding into multiple customers.');
message = ''.format.apply(message.join(' '), pd.customers.pluck('id'));
Bus.ask('feedback',
{
'action' : 'list',
'tickettype': 'problem',
'message' : message,
'log' : false
})
.then(function (packet)
{
Bus.ask('options',
{
'action' : 'set',
'category': 'framework',
'key' : 'multiplecustomer',
'value' : 1
})
.then(function (packet) { log(L_INFO, 'Multiple Customers Identified', 'support ticket has been opened'); });
});
});
}
else // single customer
{
Bus.ask('options',
{
'action' : 'list',
'category': 'framework',
'filter' : 'multiplecustomer'
})
.then(function (packet)
{
if (packet.data.length > 0) // flag set?
{
// reset flag
Bus.ask('options',
{
'action' : 'set',
'category': 'framework',
'key' : 'multiplecustomer'
// no value == delete
})
.then(function (packet) { log(L_INFO, 'Removing multiple customer setting' ); });
}
});
}
}
// cache locations/extensions, even if empty
var myexts = this.provData.extensions
? this.provData.extensions.filter(function (item) {
//(item.frameworkHide || item.framework_hide) && console.log('hiding myext: ', item);
return !(item.frameworkHide || item.framework_hide); })
: [];
touch(this.cache, 'locationsByUser' , {})[this.user_id] = dataArrayToObject(this.provData.locations, 'id');
touch(this.cache, 'extensionsByUser', {})[this.user_id] = dataArrayToObject(myexts, 'id');
Bus.ask('extensiondefault', {'action': 'get'}).then(function (defaultsPacket)
{
// signal
Connection.readyData.resolve();
});
},
/** @member {callbackGeneric} Connection~onRun
@private
@desc Fires when Connection is ready to initiate user server XMPP connection.
*/
'onRun': function ()
{
log(L_MAIN, 'Connection.onRun');
XMPP.connect(this.username, this.password, this.domain, this.url);
},
/** @member {callbackGeneric} Connection~onConnect
@private
@desc Fires after user server XMPP connection is established.
*/
'onConnect': function ()
{
if (!Connection.connected)
{
log(L_MAIN, 'Connection.onConnect');
// signal
this.connected = true;
// monitor
this.checkAjax.stop && this.checkAjax.stop();
this.checkPing();
var _self = this;
//raygun stuff
Raygun && Raygun.setUser(Connection.my_email);
!Raygun && console.log('hmmmm raygun not found WTF');
sdkjs.init(Browser.apiUrl, Connection.username, Connection.password);
sdkjs.updateApiServerUrl({'id': Connection.my_user_id}).then(function ()
{
// scenario-specific:
if (!_self.connectedOnce) // first connect
{
_self.connectedOnce = true;
log(L_DEBUG, 'Connection.onConnect', 'requesting remote starlets/features...');
API.send('getStarlets', {'action': 'list', 'platform': Browser.platform, 'version': Browser.version});
Bus.ask('all', {'subscribe': true, 'callback': function () {}});
}
else // reconnect
{
$.each(Distributor.packets.xmppSubscribed, function (index, packetName)
{
log(L_DEBUG, 'Connection.onConnect', 're-subscribing to xmpp packet "{0}"'.format(packetName));
XMPP.send($pres(
{
'name' : packetName,
'category': 'update',
'type' : 'subscribe_packet'
}));
});
Connection.publish('connectivity', 'update', {'xmpp': true}, 'connection');
}
//OrionSystem.showDevTools();
var iLoading = setInterval(function(){
//console.log('checking if loaded:', iTimes, sdkjs.queueRunning);
iTimes++;
if (sdkjs && sdkjs.queue.length === 0 && sdkjs.queueRunning === 0 && iTimes > 17) {
clearInterval(iLoading);
Connection.onFinishedLoading();
}
if (sdkjs.queueRunning > 0) {
iTimes =0;
}
}, 210), iTimes = 0;
});
}
else
{
log(L_ERROR, 'Connection.onConnect', 'already connected!');
Connection.checkAjax();
}
},
/** @member {callbackGeneric} Connection~onDisconnect
@private
@desc Fires after user server XMPP connection is terminated.
*/
'onDisconnect': function ()
{
if (Connection.connected)
{
log(L_MAIN, 'Connection.onDisconnect');
// signal
this.connected = false;
Connection.publish('connectivity', 'update', {'xmpp': false}, 'connection');
// reset requests
//console.log('queue', sdkjs.queue);
$.each(sdkjs.queue, function ()
{
// jes wrapping in try catch since meta is empty
try {
//console.log('rejecting', this);
this.deferred.rejectWith(this.promise, [[], this.promise.metas[0], '', 'error', 'abort']);
} catch(e) {
log(L_ERROR, 'Connection.onDisconnect', 'error on rejecting promises', e);
}
});
sdkjs.queue = [];
sdkjs.queueRunning = 0;
//console.log('requests', sdkjs.requests);
for (var hash in sdkjs.requests)
{
//console.log('aborting', sdkjs.requests[hash]);
sdkjs.requests[hash].jqXHR && sdkjs.requests[hash].jqXHR.abort();
}
// reset cache
this.cache = {};
// shutdown xmpp
XMPP.disconnect();
!(Connection.unloading || Connection.sleeping) && Connection.checkAjax();
}
else
{
log(L_ERROR, 'Connection.onDisconnect', 'already disconnected! calling checkAjax()');
Connection.checkAjax();
}
},
/** @member {callbackGeneric} Connection~onBeforeUnload
@private
@desc Fires before Connection's WebView is unloaded.
*/
'onBeforeUnload': function ()
{
Connection.unloading = true;
if (!Connection.reloading)
{
Connection.onBeforeExit();
Connection.publish('connectivity', 'update', {'exiting': true}, 'connection');
}
XMPP && XMPP.connection && XMPP.connection.disconnect();
},
/** @member {callbackGeneric} Connection~onBeforeExit
@private
@desc Fires before Framework exits.
*/
'onBeforeExit': function ()
{
},
/** @member {callbackGeneric} Connection~onPng
@private
@desc Fires when user server XMPP ping is received.
*/
'onPong': function () {
//console.log('PONG');
Connection.pingLast = (new Date()).getTime();
Connection.pingInterval = T_SECOND * 10;
},
// 'onAnimationStep': function (e)
// {
// log(L_DEBUG, 'Connection.onAnimationStep');
// amplify.publish('animation_step', {'x': e.x, 'y': e.y});
// },
/* methods */
/**
@method Connection.reply
@desc Reply to specific starlet with data and/or message.
@arg {object} packet - DataPacket object.
@returns {boolean} Success or failure (of data processing, not Starlet's receipt of packet).
*/
'reply': function ()
{
log(L_DEBUG, 'Connection.reply', arguments);
// init
var metas, data;
switch (arguments.length)
{
case 1: // standardized packet
var packet = arguments[0];
if (!packet.isPacket) { log(L_ERROR, 'Connection.reply', 'invalid packet'); return false; }
metas = packet.metas;
data = packet;
break;
case 2: // legacy
metas = arguments[0];
data = arguments[1];
break;
default:
log(L_ERROR, 'Connection.reply', 'invalid number of arguments');
return false;
}
// coerce to array, cleanup
metas = dltypeof(metas) === 'array' ? metas : [metas];
delete packet.metas;
// send
$.each(metas, function (index, meta)
{
// validate
if ( meta.tell ) { return true; }
if (!meta.callback) { log(L_ERROR, 'Connection.reply', 'missing callback', meta); return true; }
packet.meta = meta;
//packet.meta.packet == 'activity' && console.log('********', data, meta, JSON.stringify(data), JSON.parse(JSON.stringify(data)));
ISORION ?
(
typeof meta.namespace === 'string'
? Bus.tell(meta.starlet, meta.namespace, meta.callback, data)
: Bus.tell(meta.starlet, '' , meta.callback, data)
):(
typeof meta.namespace === 'string'
? window[meta.namespace][meta.callback](JSON.stringify(data))
: window [meta.callback](JSON.stringify(data))
);
});
return true;
},
/** @method Connection.publish
@desc Publish data and/or message to all starlets subscribing to a specific packet name.
@arg {object} packet - DataPacket object.
@arg {string} action - REST-like intention for recipient interface.
@arg {array|object} data - Single or multiple data rows for display or processing.
@arg {string} source - Single or multiple informational objects to allow communication with
recipient in non REST-like ways.
@arg {array|object} [message] - Single or multiple sets of recipient header information.
*/
'publish': function (packet, action, data, source, message)
{
$(document).triggerHandler(packet, [action, data, source, message]);
},
/** @method Connection.checkPing
@private
@desc Initiate XMPP user server ping checking. Mutually exclusive of {@link Connection.checkAjax}.
*/
'checkPing': function ()
{
if (Connection.connected)
{
var self = arguments.callee;
self.send = self.send || function() {
XMPP.send($pres({'type': 'ping'}));
//console.log('sent ping -- waiting for (ms): ', Connection.pongCheck, ' to check for pong');
setTimeout(self.checkPong.context(self), Connection.pongCheck );
};
self.checkPong = self.checkPong || function() {
//Connection.pingInterval = 1;
var now = (new Date()).getTime(),
since = now - Connection.pingLast,
tolerated = ((Connection.pingCheck * Connection.pingMisses) + Connection.pingTolerance) / 2, //1*10 sec + 2 sec / 2
nextSend = Connection.pingInterval - since, // default value for next send
timeout = T_SECOND * 10 * 4 + T_SECOND *5; //1*10* 2 + 2
//log(L_DEBUG, 'Connection.checkPing.check', 'last ping {0}ms ago'.format(since));
//console.log('checking for pong: (since, tolerated, timeout, nextSend)', since, tolerated, timeout, nextSend);
if (since > timeout) // missed too many pings?
{
log(L_WARN, 'Connection.checkPing.check', 'timeout after {0}ms'.format(since));
XMPP.connection === null ? Connection.checkAjax() : XMPP.disconnect();
}
else // been longer than expected?
{
if (since > tolerated ) {
Connection.pingInterval = Connection.pingCheck * 3; // now check every 3 second
} else {
Connection.pingInterval = Connection.pingCheck * Connection.pingMisses;
}
nextSend = Connection.pingInterval - since;
}
//console.log('checkPong, since: '+since+' interval: '+Connection.pingInterval + ' waiting to send: '+ nextSend);
// only call send again if we are connected
Connection.connected && setTimeout(self.send.context(self), nextSend);
};
self.send();
}
else
{
log(L_ERROR, 'Connection.checkPing', 'but we\'re not connected!');
self.stop && self.stop();
}
},
/** @method Connection.checkAjax
@private
@desc Initiate internet connectivity checking. Mutually exclusive of {@link Connection.checkPing}.
*/
'checkAjax': function ()
{
var self = arguments.callee, iRotation = 0;
//console.log('check AJAX Intitial');
if (!Connection.connected)
{
self.start = self.start || function ()
{
log(L_FUNC, 'Connection.checkAjax.start');
//console.log('Connection.checkAjax.start');
self.stop();
//self.interval = setInterval(self.check.context(self), Connection.pingCheck);
self.interval = setTimeout(self.check.context(self), Connection.pingCheck);
//self.throttleCount = 0;
//self.check();
};
self.stop = self.stop || function () {
if (self.interval)
{
log(L_FUNC, 'Connection.checkAjax.stop');
//console.log('Connection.checkAjax.stop');
//clearInterval(self.interval);
clearTimeout(self.interval);
delete self.interval;
//self.interval = null;
self.request && self.request.abort();
//self.throttleCount = 0;
}
};
self.check = self.check || function ()
{
//log(L_DEBUG, 'Connection.checkAjax.check');
//console.log('Connection.checkAjax.check');
self.request && self.request.abort();
//console.log('-----', this);
self.request = $.ajax(
{
'url' : Connection.ajaxCheckUrl,
'timeout': Connection.ajaxCheckTimeout,
'cache' : false,
'success': function ()
{
log(L_INFO, 'Connection.checkAjax.check', 'success');
//console.log('-----aaaa', this);
// jes if guest restart manually
Connection.user.guest && OrionConnection.closeFramework(true, false);
// jes postpone to later
self.stop();
//Connection.internet = true;
// jes check password here
Bus.ask('authenticate',
{
'action':'get',
'username': Connection.provData.userName,
'userpassword': Connection.provData.hash_key,
'notnow' : true,
'version_number': OrionFramework.version,
'device_id': String(CryptoJS.SHA1(OrionFramework.deviceID)),
'application_key': Connection.provData.applicationKey
})
.then(function (data)
{
log(L_WARN, 'Connection.checkAjax. authenticate call', 'returned "{0}"'.format(JSON.stringify(data)));
//console.log(data);
//alert( JSON.stringify(data) );
if (data.action === 'delete')
{
var API_AUTHENTICATE_URL = '/' + API.versionURL + '/client/' + OrionFramework.platform + '/authenticate';
// we cannot use our xmpp creds we have
//OrionConnection.setStarletAPIKey(null,null);
OrionAPI.getFrameworkURL('', linkCallback(function (url)
{
url = OrionFramework.apiURL + url;
$.get(url, function (data, status)
{
//console.log(data, status);
//alert(JSON.stringify(data)+ " status:" + status);
if (!data || (status == 401 || data.code == 401|| data.displayPasswordChange === 1))
{
OrionConnection.closeFramework(true, false);
}
else if
(
(
data.frameworkUpdateStatus
&& !OrionFramework.managedInstall
&& data.frameworkUpdateStatus.targetVersion
&& data.frameworkUpdateStatus.forced
)
|| (data.frameworkUpdateStatus.status == 'failure')
){
// update so we will restart which will kick us through the update process ... easiest at this point
OrionConnection.closeFramework(true, true);
}
// jes postponed to here
//self.stop();
Connection.internet = true;
Connection.username = data.xmpp.username;
Connection.password = data.xmpp.password;
OrionConnection.setStarletAPIKey(Connection.username, Connection.password);
setTimeout(function ()
{
self.throttleCount = 0;
XMPP.connect(Connection.username, Connection.password, Connection.domain, Connection.url);
Bus.ask('starlets', {'action': 'active'}).then(function (starletPacket)
{
var activeName = starletPacket.data[0].name.toLowerCase();
OrionConnection.focusStarlet(activeName, true);
});
},
200);
//XMPP.connect(Connection.username, Connection.password, Connection.domain, Connection.url);
})
.fail(function ()
{
OrionConnection.closeFramework(true, false);
});
}),
API_AUTHENTICATE_URL,
{
'username' : Connection.provData.userName,
'userpassword' : Connection.provData.hash_key,
'version_number' : OrionFramework.version,
'notnow' : true,
'device_id' : String(CryptoJS.SHA1(OrionFramework.deviceID)),
'application_key': Connection.provData.applicationKey
});
}
else
{
//console.log('Connection: 971 data:', data );
if (data && !data.data[0]) {
Connection.internet = false;
self.start();
} else {
if (data.data[0].password_state === 'expired' || data.data[0].password_state === 'reset')
{
OrionConnection.closeFramework(true, false);
}
else if (data.data[0].code && (data.data[0].code == '555'))
{
// throttling so just close andrestart
// OrionConnection.closeFramework(true, false);
log(L_WARN, 'Connection.checkAjax.check', 'throttling 555 "{0} "'.format(data.data[0].description), self.throttleCount);
self.throttleCount++
&& self.throttleCount > 120
&& OrionConnection.closeFramework(true, false);
Connection.internet = false;
self.start();
}
else if
(
(
data.data[0].frameworkUpdateStatus
&& !OrionFramework.managedInstall
&& data.data[0].frameworkUpdateStatus.targetVersion
&& data.data[0].frameworkUpdateStatus.forced
)
|| (data.data[0].frameworkUpdateStatus && (data.data[0].frameworkUpdateStatus.status == 'failure'))
){
// update so we will restart which will kick us through the update process ... easiest at this point
OrionConnection.closeFramework(true, true);
}
else
{
// jes postponed to here
log(L_WARN, 'Connection.checkAjax.check: all successful so will reconnect via xmpp now ');
//self.stop();
Connection.internet = true;
Connection.username = data.data[0].xmpp.username;
Connection.password = data.data[0].xmpp.password;
OrionConnection.setStarletAPIKey(Connection.username, Connection.password);
setTimeout(function ()
{
self.throttleCount = 0;
XMPP.connect(Connection.username, Connection.password, Connection.domain, Connection.url);
},
200);
}
}
}
});
},
'error' : function (xhr, status, message)
{
log(L_WARN, 'Connection.checkAjax.check', 'error "{0}"'.format(status));
Connection.internet = false;
//jes 20141016
self.start();
}
});
};
self.start();
}
else
{
log(L_WARN, 'Connection.checkAjax', 'but we\'re connected!');
self.stop && self.stop();
}
},
/** @method Connection.reload
@private
@desc Reload a starlet specified by Framework WebView name.
*/
'reload': function (nocache)
{
Connection.reloading = true;
nocache = typeof nocache === 'undefined' ? true : !!nocache;
OrionConnection.reloadStarlet('connection_starlet', nocache);
}
};
/* synchronizing */
function on_load(data) { Connection.onReadyFramework(data); }
$(function () { Connection.onReadyDom(); });
$.when
(
Connection.readyFramework,
Connection.readyDom
)
.then(Connection.onReadyAPI.context(Connection));
$.when
(
Connection.readyFramework,
Connection.readyDom,
Connection.readyData
)
.then(Connection.onRun.context(Connection));
/* misc */
var Browser = typeof Browser !== 'undefined' ? Browser :
{
'isOrion' : ISORION,
'platform': '',
'version' : '',
'apiUrl' : OrionFramework.apiURL
//'apiUrl' : 'http://web1-srq.star2star.net:8080'
};
//OrionSystem.showDevTools();