1 dump('entering util/network.js\n');
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
11 JSAN.use('util.error'); this.error = new util.error();
12 JSAN.use('util.sound'); this.sound = new util.sound();
14 offlineStrings = document.getElementById('offlineStrings');
17 alert('error in util.network constructor: ' + E);
24 util.network.prototype = {
28 'network_timeout' : 55, /* seconds */
30 'NETWORK_FAILURE' : null,
32 'simple_request' : function(method_id,params,f,override_params) {
34 //var sparams = js2JSON(params);
35 //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
36 // '\noverride_params = ' + override_params + '\n');
37 if (typeof api[method_id] == 'undefined') {
38 throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
40 var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
41 return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
44 'get_result' : function (req) {
47 var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') };
50 result = fake_ilsevent_for_network_errors;
52 result = req.getResultObject();
53 if(result && req._reported_events) {
54 if(typeof result.ilsevent != 'undefined') {
55 result._reported_events = req._reported_events;
57 result[0]._reported_events = req._reported_events;
63 if (instanceOf(E, NetworkFailure)) {
64 obj.NETWORK_FAILURE = E;
66 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
69 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
71 result = fake_ilsevent_for_network_errors;
76 'request' : function (app,name,params,f,override_params,_params) {
80 //var sparams = js2JSON(params);
81 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
82 // '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
86 if (typeof _params == 'undefined') {
87 // If we're not using simple_request to get here, let's assume secure by default
88 _params = { 'secure' : true };
91 var request = this._request(app,name,params,f,override_params,_params);
93 return this.get_result(request);
103 '_request' : function (app,name,params,f,override_params,_params) {
106 var sparams = js2JSON(params);
107 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
108 '\noverride_params = ' + override_params + '\n_params = ' + _params +
109 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
110 '\nlocation.href = ' + location.href );
112 if (document.getElementById('network_progress')) {
113 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
114 } else if (typeof xulG != 'undefined') {
115 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
118 var request = new RemoteRequest( app, name );
119 if (_params && _params.secure) {
120 request.setSecure(true);
122 request.setSecure(false);
124 for(var index in params) {
125 request.addParam(params[index]);
128 var start_timer = (new Date).getTime();
130 request.setCompleteCallback(
133 var duration = ( (new Date).getTime() - start_timer )/1000;
134 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
136 if (document.getElementById('network_progress')) {
137 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
138 } else if (typeof xulG != 'undefined') {
139 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
142 var json_string = js2JSON(obj.get_result(req));
143 obj.error.sdump('D_SES_RESULT','asynced result #'
144 + obj.link_id + '\n\n'
145 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
146 + '\n\nOriginal Request:\n\n'
147 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
148 obj.play_sounds( request );
149 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
150 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
151 if (override_params) {
152 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
154 req = obj.check_for_offline(app,name,params,req,override_params,_params);
156 obj.NETWORK_FAILURE = null;
160 E.textcode = offlineStrings.getString('network.server_or_method.error');
162 f( { 'getResultObject' : function() { return E; } } );
175 var duration = ( (new Date).getTime() - start_timer )/1000;
176 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
178 if (document.getElementById('network_progress')) {
179 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
180 } else if (typeof xulG != 'undefined') {
181 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
187 var result = obj.get_result(request);
188 var json_string = js2JSON(result);
189 this.error.sdump('D_SES_RESULT','synced result #'
190 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
191 + '\n\nOriginal Request:\n\n'
192 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
193 obj.play_sounds( request );
194 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
195 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
196 if (override_params) {
197 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
199 request = obj.check_for_offline(app,name,params,request,override_params,_params);
200 obj.NETWORK_FAILURE = null;
206 if (instanceOf(E,perm_ex)) {
207 alert('in util.network, _request : permission exception: ' + js2JSON(E));
213 'check_for_offline' : function (app,name,params,req,override_params,_params) {
216 var result = obj.get_result(req);
217 if (result == null) return req;
218 if (typeof result.ilsevent == 'undefined') return req;
219 if (result.ilsevent != -1) return req;
221 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
230 if (data.proceed_offline) {
236 var network_failure_string;
237 var network_failure_status_string;
240 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
241 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); }
243 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
244 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
245 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
246 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
247 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
248 } catch(E) { msg = E; }
250 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
252 r = obj.error.yns_alert(
254 offlineStrings.getString('network.network_failure'),
255 offlineStrings.getString('network.retry_network'),
256 offlineStrings.getString('network.ignore_errors'),
258 offlineStrings.getString('common.confirm')
261 data.proceed_offline = true; data.stash('proceed_offline');
262 dump('Remembering proceed_offline for 200000 ms.\n');
265 data.proceed_offline = false; data.stash('proceed_offline');
266 dump('Setting proceed_offline back to false.\n');
272 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
276 req = obj._request(app,name,params,null,override_params,_params);
277 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
292 'reset_titlebars' : function(data) {
294 data.stash_retrieve();
296 JSAN.use('util.window'); var win = new util.window();
297 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
298 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
299 var enumerator = windowManagerInterface.getEnumerator('eg_menu');
301 var w; // set title on all appshell windows
302 while ( w = enumerator.getNext() ) {
305 + ': ' + data.list.au[0].usrname()
307 + '.' + data.server_unadorned;
310 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
314 'set_user_status' : function() {
315 data.stash_retrieve();
317 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
318 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
319 var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
321 var enumerator = windowManagerInterface.getEnumerator('eg_menu');
325 while ( w = enumerator.getNext() ) {
326 x = w.document.getElementById('oc_menuitem');
328 if(!offlinestrings) offlinestrings = w.document.getElementById('offlineStrings');
329 if(permlist) w.g.menu.set_menu_access(permlist);
330 if(data.list.au.length > 1) {
331 addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
332 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
335 removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
336 x.setAttribute('label', x.getAttribute('label_orig'));
340 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
344 'get_new_session' : function(name,xulG,text) {
348 var url = urls.XUL_AUTH_SIMPLE;
349 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
350 JSAN.use('util.window'); var win = new util.window();
351 JSAN.use('OpenILS.data');
352 var data = new OpenILS.data(); data.init({'via':'stash'});
353 var my_xulG = win.open(
355 offlineStrings.getString('network.new_session.authorize'),
356 'chrome,resizable,modal,width=700,height=500',
358 'login_type' : text ? (data.session.login_type ? data.session.login_type : 'staff') : 'ochange',
359 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
360 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
361 //'simple_auth' : (new Date()).toString(),
364 data.stash_retrieve();
365 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
366 data.session.key = data.temporary_session.key;
367 data.session.authtime = data.temporary_session.authtime;
368 data.session.is_perm = data.temporary_session.is_perm; // For operator change, otherwise ignorable.
369 data.session.login_type = data.temporary_session.login_type; // For timeouts *after* operator change.
370 data.stash('session');
372 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
373 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
374 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
376 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key + "; secure;", null);
379 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
381 if (! data.list.au ) data.list.au = [];
382 data.list.au[0] = JSON2js( data.temporary_session.usr );
384 obj.reset_titlebars(data);
387 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
392 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
396 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
399 var robj = obj.get_result(req);
400 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
402 if (obj.get_new_session(name,undefined,true)) {
403 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
404 params[0] = data.session.key;
405 req = obj._request(app,name,params,null,override_params,_params);
409 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
414 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
417 var robj = obj.get_result(req);
418 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
419 if (location.href.match(/^chrome/)) {
420 //alert('Permission denied.');
422 JSAN.use('util.window'); var win = new util.window();
423 var my_xulG = win.open(
424 urls.XUL_AUTH_SIMPLE,
425 offlineStrings.getFormattedString('network.permission.authorize'),
426 'chrome,resizable,modal,width=700,height=500',
428 'login_type' : 'temp',
429 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
430 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
431 //'simple_auth' : (new Date()).toString(),
434 JSAN.use('OpenILS.data');
435 //var data = new OpenILS.data(); data.init({'via':'stash'});
436 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
437 params[0] = my_xulG.temporary_session.key;
438 req = obj._request(app,name,params,null,override_params,_params);
443 this.error.sdump('D_ERROR',E);
448 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
451 if (!override_params.text) override_params.text = {};
452 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
453 if (!override_params.report_override_on_events) override_params.report_override_on_events = [];
454 function override(r) {
456 // test to see if we can suppress this dialog and auto-override
457 var auto_override = false;
458 if (override_params.auto_override_these_events.length > 0) {
459 auto_override = true;
460 for (var i = 0; i < r.length; i++) {
462 (typeof r[i].ilsevent != 'undefined') &&
464 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
465 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
471 auto_override = false;
477 req = obj._request(app,name + '.override',params);
481 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
482 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
483 '<grid><columns><column/><column flex="1"/></columns><rows>';
484 for (var i = 0; i < r.length; i++) {
485 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
486 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
487 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
488 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
490 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
491 '<description>' + t3 + '</description>' +
492 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
494 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
495 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
496 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
497 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
498 //JSAN.use('OpenILS.data');
499 //var data = new OpenILS.data(); data.init({'via':'stash'});
500 //data.temp_override_xml = xml; data.stash('temp_override_xml');
501 JSAN.use('util.window'); var win = new util.window();
502 var fancy_prompt_data = win.open(
503 urls.XUL_FANCY_PROMPT,
504 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
505 { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
507 if (fancy_prompt_data.fancy_status == 'complete') {
508 req = obj._request(app,name + '.override',params);
509 if (req && override_params.report_override_on_events.length > 0 && typeof result == 'object') {
510 var reported_events = [];
511 for (var i = 0; i < r.length; i++) {
512 if (typeof r[i].ilsevent != 'undefined') {
513 if (override_params.report_override_on_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) {
514 reported_events.push(Number(r[i].ilsevent));
516 if (override_params.report_override_on_events.indexOf( r[i].textcode ) != -1) {
517 reported_events.push(r[i].textcode);
521 req._reported_events = reported_events;
526 alert('in util.network, rerequest_on_override, override:' + E);
530 var result = obj.get_result(req);
531 if (!result) return req;
534 (typeof result.ilsevent != 'undefined') &&
536 (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
537 (override_params.overridable_events.indexOf( result.textcode ) != -1)
540 req = override([result]);
542 var found_good = false; var found_bad = false;
543 for (var i = 0; i < result.length; i++) {
545 (typeof result[i].ilsevent != 'undefined') &&
547 (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
548 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
556 if (found_good && (!found_bad)) req = override(result);
565 'ping' : function() {
567 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
568 var file = new util.file('ping.bat');
569 var path = file._file.path;
570 file.write_content('truncate+exec',
572 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
573 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
576 file = new util.file('ping.bat');
578 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
579 process.init(file._file);
583 dump('process.run = ' + process.run(true, args, args.length) + '\n');
587 var file = new util.file('ping.bat.txt');
588 var output = file.get_content();
597 'play_sounds' : function(req) {
600 var result = req.getResultObject();
601 if (result == null) { return; }
602 if (typeof result.textcode != 'undefined') {
603 obj.sound.event( result );
605 if (typeof result.length != 'undefined') {
606 for (var i = 0; i < result.length; i++) {
607 if (typeof result[i].textcode != 'undefined') {
608 obj.sound.event( result[i] );
614 dump('Error in network.js, play_sounds() : ' + E + '\n');
620 function sample_callback(request) {
621 var result = request.getResultObject();
625 dump('exiting util/network.js\n');