1 dump('entering util/network.js\n');
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.sound'); this.sound = new util.sound();
12 util.network.prototype = {
16 'NETWORK_FAILURE' : null,
18 'simple_request' : function(id,params,f,o_params) {
19 return this.request(api[id].app,api[id].method,params,f,o_params);
22 'get_result' : function (req) {
26 result = req.getResultObject();
29 if (instanceOf(E, NetworkFailure)) {
30 obj.NETWORK_FAILURE = E;
32 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
35 obj.NETWORK_FAILURE = 'Unknown status';
42 'request' : function (app,name,params,f,o_params) {
43 var request = this._request(app,name,params,f,o_params);
45 return this.get_result(request);
51 '_request' : function (app,name,params,f,o_params) {
54 var sparams = js2JSON(params);
55 obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
56 '\no_params = ' + o_params +
57 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
58 var request = new RemoteRequest( app, name );
59 for(var index in params) {
60 request.addParam(params[index]);
64 request.setCompleteCallback(
67 var json_string = js2JSON(obj.get_result(req));
68 obj.error.sdump('D_SES_RESULT','asynced result #'
69 + obj.link_id + '\n\n'
70 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
71 + '\n\nOriginal Request:\n\n'
72 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
73 req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
74 req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
76 req = obj.rerequest_on_override(app,name,params,req,o_params);
78 req = obj.check_for_offline(app,name,params,req,o_params);
80 obj.NETWORK_FAILURE = null;
84 E.textcode = 'Server/Method Error';
86 f( { 'getResultObject' : function() { return E; } } );
102 var result = obj.get_result(request);
103 var json_string = js2JSON(result);
104 this.error.sdump('D_SES_RESULT','synced result #'
105 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
106 + '\n\nOriginal Request:\n\n'
107 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
108 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
109 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
111 request = obj.rerequest_on_override(app,name,params,request,o_params);
113 request = obj.check_for_offline(app,name,params,request,o_params);
114 obj.NETWORK_FAILURE = null;
120 if (instanceOf(E,perm_ex)) {
121 alert('in util.network, _request : permission exception: ' + js2JSON(E));
127 'check_for_offline' : function (app,name,params,req,o_params) {
129 var result = obj.get_result(req);
130 if (result != null) return req;
132 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
141 if (data.proceed_offline) {
147 var network_failure_string;
148 var network_failure_status_string;
151 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
152 try { network_failure_status_string = typeof obj.NETWORK_FAILURE == 'object' && typeof obj.NETWORK_FAILURE != 'null' && typeof obj.NETWORK_FAILURE.status == 'function' ? obj.NETWORK_FAILURE.status() : ''; } catch(E) { network_failure_status_string = ''; obj.error.sdump('D_ERROR', 'setting network_failure_status_string: ' + E); }
154 try { msg = 'Network/server failure. Please check your Internet connection to ' + data.server_unadorned + ' and choose Retry Network. If you need to enter Offline Mode, choose Ignore Errors in this and subsequent dialogs. If you believe this error is due to a bug in Evergreen and not network problems, please contact your helpdesk or friendly Evergreen admins, and give them this information:\nmethod=' + name + '\nparams=' + js2JSON(params) + '\nTHROWN:\n' + network_failure_string + '\nSTATUS:\n' + network_failure_status_string; } catch(E) { msg = E; }
156 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
158 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Ignore Errors',null,'Check here to confirm this message');
160 data.proceed_offline = true; data.stash('proceed_offline');
161 dump('Remembering proceed_offline for 200000 ms.\n');
164 data.proceed_offline = false; data.stash('proceed_offline');
165 dump('Setting proceed_offline back to false.\n');
171 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
175 req = obj._request(app,name,params,null,o_params);
176 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
180 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
186 'reset_titlebars' : function(data) {
188 data.stash_retrieve();
190 JSAN.use('util.window'); var win = new util.window();
191 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
192 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
193 var enumerator = windowManagerInterface.getEnumerator(null);
195 var w; // set title on all appshell windows
196 while ( w = enumerator.getNext() ) {
197 if (w.document.title.match(/^\d/)) {
199 win.appshell_name_increment()
200 + ': ' + data.list.au[0].usrname()
201 + '@' + data.ws_name;
202 + '.' + data.server_unadorned
206 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
210 'get_new_session' : function(name,xulG,text) {
214 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
215 var url = urls.XUL_AUTH_SIMPLE;
216 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
219 + '?login_type=staff'
220 + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
221 + '&desc_full=' + window.escape( text ? 'Please enter the credentials for a new login session.' : 'Please enter the credentials for the new login session. Note that the previous session is still active.'),
222 'simple_auth' + (new Date()).toString(),
223 'chrome,resizable,modal,width=700,height=500'
225 JSAN.use('OpenILS.data');
226 var data = new OpenILS.data(); data.init({'via':'stash'});
227 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
228 data.session.key = data.temporary_session.key;
229 data.session.authtime = data.temporary_session.authtime;
230 data.stash('session');
231 data.list.au[0] = JSON2js(data.temporary_session.usr);
233 obj.reset_titlebars(data);
239 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
243 'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
246 var robj = obj.get_result(req);
247 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
249 if (obj.get_new_session(name,undefined,true)) {
250 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
251 params[0] = data.session.key;
252 req = obj._request(app,name,params,null,o_params);
256 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
261 'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
264 var robj = obj.get_result(req);
265 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
266 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
267 if (location.href.match(/^chrome/)) {
268 //alert('Permission denied.');
273 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
274 + '&desc_full=' + window.escape('Another staff member with the above permission may authorize this specific action. Please notify your library administrator if you need this permission. If you feel you have received this exception in error, inform your friendly Evergreen developers of the above permission and this debug information: ' + name),
275 'simple_auth' + (new Date()).toString(),
276 'chrome,resizable,modal,width=700,height=500'
278 JSAN.use('OpenILS.data');
279 var data = new OpenILS.data(); data.init({'via':'stash'});
280 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
281 params[0] = data.temporary_session.key;
282 req = obj._request(app,name,params,null,o_params);
287 this.error.sdump('D_ERROR',E);
292 'rerequest_on_override' : function (app,name,params,req,o_params) {
295 if (!o_params.text) o_params.text = {};
296 function override(r) {
298 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
300 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
301 '<groupbox><caption label="Exceptions"/>' +
302 '<grid><columns><column/><column/></columns><rows>';
303 for (var i = 0; i < r.length; i++) {
304 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
305 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
306 var t3 = String((o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
307 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
309 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
310 '<description>' + t3 + '</description>' +
311 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
313 xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' +
314 '<description>Force this action?</description>' +
315 '<button accesskey="N" label="No" name="fancy_cancel"/>' +
316 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
318 urls.XUL_FANCY_PROMPT
319 + '?xml=' + window.escape(xml)
320 + '&title=' + window.escape(o_params.title),
321 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
323 JSAN.use('OpenILS.data');
324 var data = new OpenILS.data(); data.init({'via':'stash'});
325 if (data.fancy_prompt_data != '') {
326 req = obj._request(app,name + '.override',params);
330 alert('in util.network, rerequest_on_override, override:' + E);
334 var result = obj.get_result(req);
335 if (!result) return req;
337 if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
338 req = override([result]);
340 var found_good = false; var found_bad = false;
341 for (var i = 0; i < result.length; i++) {
342 if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
348 if (found_good && (!found_bad)) req = override(result);
361 function sample_callback(request) {
362 var result = request.getResultObject();
366 dump('exiting util/network.js\n');