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();
56 if (instanceOf(E, NetworkFailure)) {
57 obj.NETWORK_FAILURE = E;
59 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
62 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
64 result = fake_ilsevent_for_network_errors;
69 'request' : function (app,name,params,f,override_params,_params) {
73 //var sparams = js2JSON(params);
74 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
75 // '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
79 var request = this._request(app,name,params,f,override_params,_params);
81 return this.get_result(request);
91 '_request' : function (app,name,params,f,override_params,_params) {
94 var sparams = js2JSON(params);
95 obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
96 '\noverride_params = ' + override_params + '\n_params = ' + _params +
97 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
98 '\nlocation.href = ' + location.href );
100 if (document.getElementById('network_progress')) {
101 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
102 } else if (typeof xulG != 'undefined') {
103 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
106 var request = new RemoteRequest( app, name );
107 if (_params && _params.secure) {
108 request.setSecure(true);
110 request.setSecure(false);
112 for(var index in params) {
113 request.addParam(params[index]);
116 var start_timer = (new Date).getTime();
118 request.setCompleteCallback(
121 var duration = ( (new Date).getTime() - start_timer )/1000;
122 if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
124 if (document.getElementById('network_progress')) {
125 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
126 } else if (typeof xulG != 'undefined') {
127 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
130 var json_string = js2JSON(obj.get_result(req));
131 obj.error.sdump('D_SES_RESULT','asynced result #'
132 + obj.link_id + '\n\n'
133 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
134 + '\n\nOriginal Request:\n\n'
135 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
136 obj.play_sounds( request );
137 req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
138 req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
139 if (override_params) {
140 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
142 req = obj.check_for_offline(app,name,params,req,override_params,_params);
144 obj.NETWORK_FAILURE = null;
148 E.textcode = offlineStrings.getString('network.server_or_method.error');
150 f( { 'getResultObject' : function() { return E; } } );
163 var duration = ( (new Date).getTime() - start_timer )/1000;
164 if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
166 if (document.getElementById('network_progress')) {
167 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
168 } else if (typeof xulG != 'undefined') {
169 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
175 var result = obj.get_result(request);
176 var json_string = js2JSON(result);
177 this.error.sdump('D_SES_RESULT','synced result #'
178 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
179 + '\n\nOriginal Request:\n\n'
180 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
181 obj.play_sounds( request );
182 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
183 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
184 if (override_params) {
185 request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
187 request = obj.check_for_offline(app,name,params,request,override_params,_params);
188 obj.NETWORK_FAILURE = null;
194 if (instanceOf(E,perm_ex)) {
195 alert('in util.network, _request : permission exception: ' + js2JSON(E));
201 'check_for_offline' : function (app,name,params,req,override_params,_params) {
204 var result = obj.get_result(req);
205 if (result == null) return req;
206 if (typeof result.ilsevent == 'undefined') return req;
207 if (result.ilsevent != -1) return req;
209 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
218 if (data.proceed_offline) {
224 var network_failure_string;
225 var network_failure_status_string;
228 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
229 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); }
231 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
232 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' +
233 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' +
234 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' +
235 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
236 } catch(E) { msg = E; }
238 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
240 r = obj.error.yns_alert(
242 offlineStrings.getString('network.network_failure'),
243 offlineStrings.getString('network.retry_network'),
244 offlineStrings.getString('network.ignore_errors'),
246 offlineStrings.getString('common.confirm')
249 data.proceed_offline = true; data.stash('proceed_offline');
250 dump('Remembering proceed_offline for 200000 ms.\n');
253 data.proceed_offline = false; data.stash('proceed_offline');
254 dump('Setting proceed_offline back to false.\n');
260 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
264 req = obj._request(app,name,params,null,override_params,_params);
265 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
280 'reset_titlebars' : function(data) {
282 data.stash_retrieve();
284 JSAN.use('util.window'); var win = new util.window();
285 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
286 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
287 var enumerator = windowManagerInterface.getEnumerator(null);
289 var w; // set title on all appshell windows
290 while ( w = enumerator.getNext() ) {
291 if (w.document.title.match(/^\d/)) {
293 win.appshell_name_increment()
294 + ': ' + data.list.au[0].usrname()
295 + '@' + data.ws_name;
296 + '.' + data.server_unadorned
300 obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
304 'get_new_session' : function(name,xulG,text) {
308 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
309 var url = urls.XUL_AUTH_SIMPLE;
310 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
311 JSAN.use('util.window'); var win = new util.window();
312 var my_xulG = win.open(
314 //+ '?login_type=staff'
315 //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
316 //+ '&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.'),
317 //'simple_auth' + (new Date()).toString(),
318 offlineStrings.getString('network.new_session.authorize'),
319 'chrome,resizable,modal,width=700,height=500',
321 'login_type' : 'staff',
322 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
323 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
324 //'simple_auth' : (new Date()).toString(),
327 JSAN.use('OpenILS.data');
328 var data = new OpenILS.data(); data.init({'via':'stash'});
329 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
330 data.session.key = data.temporary_session.key;
331 data.session.authtime = data.temporary_session.authtime;
332 data.stash('session');
334 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
335 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
336 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
337 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
339 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
340 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
343 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
345 if (! data.list.au ) data.list.au = [];
346 data.list.au[0] = JSON2js( data.temporary_session.usr );
348 obj.reset_titlebars(data);
351 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
356 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
360 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
363 var robj = obj.get_result(req);
364 if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
366 if (obj.get_new_session(name,undefined,true)) {
367 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
368 params[0] = data.session.key;
369 req = obj._request(app,name,params,null,override_params,_params);
373 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
378 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
381 var robj = obj.get_result(req);
382 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
383 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
384 if (location.href.match(/^chrome/)) {
385 //alert('Permission denied.');
387 JSAN.use('util.window'); var win = new util.window();
388 var my_xulG = win.open(
389 urls.XUL_AUTH_SIMPLE,
390 //+ '?login_type=temp'
391 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
392 //+ '&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),
393 //'simple_auth' + (new Date()).toString(),
394 offlineStrings.getFormattedString('network.permission.authorize'),
395 'chrome,resizable,modal,width=700,height=500',
397 'login_type' : 'temp',
398 'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
399 'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
400 //'simple_auth' : (new Date()).toString(),
403 JSAN.use('OpenILS.data');
404 //var data = new OpenILS.data(); data.init({'via':'stash'});
405 if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
406 params[0] = my_xulG.temporary_session.key;
407 req = obj._request(app,name,params,null,override_params,_params);
412 this.error.sdump('D_ERROR',E);
417 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
420 if (!override_params.text) override_params.text = {};
421 if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
422 function override(r) {
424 // test to see if we can suppress this dialog and auto-override
425 var auto_override = false;
426 if (override_params.auto_override_these_events.length > 0) {
427 auto_override = true;
428 for (var i = 0; i < r.length; i++) {
430 (r[i].ilsevent != 'undefined') &&
432 (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
433 (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1)
439 auto_override = false;
445 req = obj._request(app,name + '.override',params);
449 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
451 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
452 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' +
453 '<grid><columns><column/><column/></columns><rows>';
454 for (var i = 0; i < r.length; i++) {
455 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
456 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
457 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
458 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
460 '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' +
461 '<description>' + t3 + '</description>' +
462 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
464 xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' +
465 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' +
466 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' +
467 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
468 //JSAN.use('OpenILS.data');
469 //var data = new OpenILS.data(); data.init({'via':'stash'});
470 //data.temp_override_xml = xml; data.stash('temp_override_xml');
471 JSAN.use('util.window'); var win = new util.window();
472 var fancy_prompt_data = win.open(
473 urls.XUL_FANCY_PROMPT,
474 //+ '?xml_in_stash=temp_override_xml'
475 //+ '&title=' + window.escape(override_params.title),
476 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
477 { 'xml' : xml, 'title' : override_params.title }
479 if (fancy_prompt_data.fancy_status == 'complete') {
480 req = obj._request(app,name + '.override',params);
484 alert('in util.network, rerequest_on_override, override:' + E);
488 var result = obj.get_result(req);
489 if (!result) return req;
492 (typeof result.ilsevent != 'undefined') &&
494 (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ||
495 (override_params.overridable_events.indexOf( result.textcode ) != -1)
498 req = override([result]);
500 var found_good = false; var found_bad = false;
501 for (var i = 0; i < result.length; i++) {
503 (result[i].ilsevent != 'undefined') &&
505 (override_params.overridable_events.indexOf( result[i].ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ||
506 (override_params.overridable_events.indexOf( result[i].textcode ) != -1)
514 if (found_good && (!found_bad)) req = override(result);
523 'ping' : function() {
525 JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
526 var file = new util.file('ping.bat');
527 var path = file._file.path;
528 file.write_content('truncate+exec',
530 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
531 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n' /* unix */
534 file = new util.file('ping.bat');
536 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
537 process.init(file._file);
541 dump('process.run = ' + process.run(true, args, args.length) + '\n');
545 var file = new util.file('ping.bat.txt');
546 var output = file.get_content();
555 'play_sounds' : function(req) {
558 var result = req.getResultObject();
559 if (result == null) { return; }
560 if (typeof result.textcode != 'undefined') {
561 obj.sound.event( result );
563 if (typeof result.length != 'undefined') {
564 for (var i = 0; i < result.length; i++) {
565 if (typeof result[i].textcode != 'undefined') {
566 obj.sound.event( result[i] );
572 dump('Error in network.js, play_sounds() : ' + E + '\n');
578 function sample_callback(request) {
579 var result = request.getResultObject();
583 dump('exiting util/network.js\n');