]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
Change each tab to 4 spaces in the staff client javascript files.
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 var offlineStrings;
5
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
8
9     try {
10
11         JSAN.use('util.error'); this.error = new util.error();
12         JSAN.use('util.sound'); this.sound = new util.sound();
13
14         offlineStrings = document.getElementById('offlineStrings');
15
16     } catch(E) {
17         alert('error in util.network constructor: ' + E);
18         throw(E);
19     }
20
21     return this;
22 };
23
24 util.network.prototype = {
25
26     'link_id' : 0,
27
28     'network_timeout' : 55, /* seconds */
29
30     'NETWORK_FAILURE' : null,
31
32     'simple_request' : function(method_id,params,f,override_params) {
33         //var obj = this;
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]) );
39         }
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 });
42     },
43
44     'get_result' : function (req) {
45         var obj = this;
46         var result;
47         var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') }; 
48         try {
49             if (req.cancelled) {
50                 result = fake_ilsevent_for_network_errors;
51             } else {
52                 result = req.getResultObject();    
53             }
54         } catch(E) {
55             try {
56                 if (instanceOf(E, NetworkFailure)) {
57                     obj.NETWORK_FAILURE = E;
58                 } else {
59                     try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
60                 }
61             } catch(I) { 
62                 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
63             }
64             result = fake_ilsevent_for_network_errors;
65         }
66         return result;
67     },
68
69     'request' : function (app,name,params,f,override_params,_params) {
70
71         var obj = this;
72         
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');
76
77         try { 
78
79             var request =  this._request(app,name,params,f,override_params,_params);
80             if (request) {
81                 return this.get_result(request);
82             } else {
83                 return null;
84             }
85     
86         } catch(E) {
87             alert('1: ' + E); 
88         }
89     },
90
91     '_request' : function (app,name,params,f,override_params,_params) {
92         var obj = this;
93         try {
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
99             if (document.getElementById('network_progress')) {
100                 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
101             } else if (typeof xulG != 'undefined') {
102                 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
103             }
104
105             var request = new RemoteRequest( app, name );
106             if (_params && _params.secure) {
107                 request.setSecure(true);
108             } else {
109                 request.setSecure(false);
110             }
111             for(var index in params) {
112                 request.addParam(params[index]);
113             }
114
115             var start_timer = (new Date).getTime();    
116             if (f)  {
117                 request.setCompleteCallback(
118                     function(req) {
119                         try {
120                             var duration = ( (new Date).getTime() - start_timer )/1000;
121                             if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
122
123                             if (document.getElementById('network_progress')) {
124                                 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
125                             } else if (typeof xulG != 'undefined') {
126                                 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
127                             }
128
129                             var json_string = js2JSON(obj.get_result(req));
130                             obj.error.sdump('D_SES_RESULT','asynced result #' 
131                                 + obj.link_id + '\n\n' 
132                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
133                                 + '\n\nOriginal Request:\n\n' 
134                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
135                             req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
136                             req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
137                             if (override_params) {
138                                 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
139                             }
140                             req = obj.check_for_offline(app,name,params,req,override_params,_params);
141                             f(req);
142                             obj.NETWORK_FAILURE = null;
143                         } catch(E) {
144                             try {
145                                 E.ilsevent = -2;
146                                 E.textcode = offlineStrings.getString('network.server_or_method.error');
147                             } catch(F) {}
148                             f( { 'getResultObject' : function() { return E; } } );
149                         }
150                     }
151                 );
152                 try {
153                     request.send(false);
154                 } catch(E) {
155                     throw(E);
156                 }
157                 return null;
158             } else {
159                 try {
160                     request.send(true);
161                     var duration = ( (new Date).getTime() - start_timer )/1000;
162                     if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
163
164                     if (document.getElementById('network_progress')) {
165                         if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
166                     } else if (typeof xulG != 'undefined') {
167                         if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
168                     }
169
170                 } catch(E) {
171                     throw(E);
172                 }
173                 var result = obj.get_result(request);
174                 var json_string = js2JSON(result);
175                 this.error.sdump('D_SES_RESULT','synced result #' 
176                     + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
177                     + '\n\nOriginal Request:\n\n' 
178                     + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
179                 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
180                 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
181                 if (override_params) {
182                     request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
183                 }
184                 request = obj.check_for_offline(app,name,params,request,override_params,_params);
185                 obj.NETWORK_FAILURE = null;
186                 return request;
187             }
188
189         } catch(E) {
190             alert('2: ' + E);
191             if (instanceOf(E,perm_ex)) {
192                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
193             }
194             throw(E);
195         }
196     },
197
198     'check_for_offline' : function (app,name,params,req,override_params,_params) {
199         try {
200             var obj = this;
201             var result = obj.get_result(req);
202             if (result == null) return req;
203             if (typeof result.ilsevent == 'undefined') return req;
204             if (result.ilsevent != -1) return req;
205
206             JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
207             var proceed = true;
208
209             while(proceed) {
210
211                 proceed = false;
212
213                 var r;
214
215                 if (data.proceed_offline) {
216
217                     r = 1;
218
219                 } else {
220
221                     var network_failure_string;
222                     var network_failure_status_string;
223                     var msg;
224
225                     try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
226                     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); }
227                     
228                     try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
229                                 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' + 
230                                 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' + 
231                                 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' + 
232                                 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
233                     } catch(E) { msg = E; }
234
235                     try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
236
237                     r = obj.error.yns_alert(
238                         msg,
239                         offlineStrings.getString('network.network_failure'),
240                         offlineStrings.getString('network.retry_network'),
241                         offlineStrings.getString('network.ignore_errors'),
242                         null,
243                         offlineStrings.getString('common.confirm')
244                     );
245                     if (r == 1) {
246                         data.proceed_offline = true; data.stash('proceed_offline');
247                         dump('Remembering proceed_offline for 200000 ms.\n');
248                         setTimeout(
249                             function() {
250                                 data.proceed_offline = false; data.stash('proceed_offline');
251                                 dump('Setting proceed_offline back to false.\n');
252                             }, 200000
253                         );
254                     }
255                 }
256
257                 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
258
259                 switch(r) {
260                     case 0: 
261                         req = obj._request(app,name,params,null,override_params,_params);
262                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
263                         return req;
264                     break;
265
266                     case 1: 
267                         return req;
268                     break;
269                 }
270             }
271         } catch(E) {
272             alert('4: ' + E);
273             throw(E);
274         }
275     },
276
277     'reset_titlebars' : function(data) {
278         var obj = this;
279         data.stash_retrieve();
280         try {
281             JSAN.use('util.window'); var win =  new util.window();
282             var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
283             var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
284             var enumerator = windowManagerInterface.getEnumerator(null);
285
286             var w; // set title on all appshell windows
287             while ( w = enumerator.getNext() ) {
288                 if (w.document.title.match(/^\d/)) {
289                     w.document.title = 
290                         win.appshell_name_increment() 
291                         + ': ' + data.list.au[0].usrname() 
292                         + '@' + data.ws_name;
293                         + '.' + data.server_unadorned 
294                 }
295             }
296         } catch(E) {
297             obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
298         }
299     },
300
301     'get_new_session' : function(name,xulG,text) {
302         var obj = this;
303         try {
304
305         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
306         var url = urls.XUL_AUTH_SIMPLE;
307         if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
308         JSAN.use('util.window'); var win = new util.window();
309         var my_xulG = win.open(
310             url,
311             //+ '?login_type=staff'
312             //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
313             //+ '&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.'),
314             //'simple_auth' + (new Date()).toString(),
315             offlineStrings.getString('network.new_session.authorize'),
316             'chrome,resizable,modal,width=700,height=500',
317             {
318                 'login_type' : 'staff',
319                 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
320                 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
321                 //'simple_auth' : (new Date()).toString(),
322             }
323         );
324         JSAN.use('OpenILS.data');
325         var data = new OpenILS.data(); data.init({'via':'stash'});
326         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
327             data.session.key = data.temporary_session.key; 
328             data.session.authtime = data.temporary_session.authtime; 
329             data.stash('session');
330             try {
331                 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
332                 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
333                 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
334                 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
335
336                 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
337                 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
338
339             } catch(E) {
340                 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
341             }
342             if (! data.list.au ) data.list.au = [];
343             data.list.au[0] = JSON2js( data.temporary_session.usr );
344             data.stash('list');
345             obj.reset_titlebars(data);
346             return true;
347         } else {
348             obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
349         }
350         return false;
351
352         } catch(E) {
353             obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
354         }
355     },
356
357     'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
358         try {
359             var obj = this;
360             var robj = obj.get_result(req);
361             if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
362
363                 if (obj.get_new_session(name,undefined,true)) {
364                     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
365                     params[0] = data.session.key;
366                     req = obj._request(app,name,params,null,override_params,_params);
367                 }
368             }
369         } catch(E) {
370             this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
371         }
372         return req;
373     },
374     
375     'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
376         try {
377             var obj = this;
378             var robj = obj.get_result(req);
379             if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
380                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
381                 if (location.href.match(/^chrome/)) {
382                     //alert('Permission denied.');
383                 } else {
384                     JSAN.use('util.window'); var win = new util.window();
385                     var my_xulG = win.open(
386                         urls.XUL_AUTH_SIMPLE,
387                         //+ '?login_type=temp'
388                         //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
389                         //+ '&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),
390                         //'simple_auth' + (new Date()).toString(),
391                         offlineStrings.getFormattedString('network.permission.authorize'),
392                         'chrome,resizable,modal,width=700,height=500',
393                         {
394                             'login_type' : 'temp',
395                             'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
396                             'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
397                             //'simple_auth' : (new Date()).toString(),
398                         }
399                     );
400                     JSAN.use('OpenILS.data');
401                     //var data = new OpenILS.data(); data.init({'via':'stash'});
402                     if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
403                         params[0] = my_xulG.temporary_session.key;
404                         req = obj._request(app,name,params,null,override_params,_params);
405                     }
406                 }
407             }
408         } catch(E) {
409             this.error.sdump('D_ERROR',E);
410         }
411         return req;
412     },
413
414     'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
415         var obj = this;
416         try {
417             if (!override_params.text) override_params.text = {};
418             function override(r) {
419                 try {
420                     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
421                     obj.sound.bad();
422                     var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
423                         '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' + 
424                         '<grid><columns><column/><column/></columns><rows>';
425                     for (var i = 0; i < r.length; i++) {
426                         var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
427                         var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
428                         var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
429                         var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
430                         xml += '<row>' + 
431                             '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
432                             '<description>' + t3 + '</description>' + 
433                             '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
434                     }
435                     xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' + 
436                         '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' + 
437                         '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' + 
438                         '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
439                     //JSAN.use('OpenILS.data');
440                     //var data = new OpenILS.data(); data.init({'via':'stash'});
441                     //data.temp_override_xml = xml; data.stash('temp_override_xml');
442                     JSAN.use('util.window'); var win = new util.window();
443                     var fancy_prompt_data = win.open(
444                         urls.XUL_FANCY_PROMPT,
445                         //+ '?xml_in_stash=temp_override_xml'
446                         //+ '&title=' + window.escape(override_params.title),
447                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
448                         { 'xml' : xml, 'title' : override_params.title }
449                     );
450                     if (fancy_prompt_data.fancy_status == 'complete') {
451                         req = obj._request(app,name + '.override',params);
452                     }
453                     return req;
454                 } catch(E) {
455                     alert('in util.network, rerequest_on_override, override:' + E);
456                 }
457             }
458
459             var result = obj.get_result(req);
460             if (!result) return req;
461
462             if ( 
463                 (typeof result.ilsevent != 'undefined') && 
464                 (
465                     (override_params.overridable_events.indexOf( result.ilsevent == null ? null : Number(result.ilsevent) ) != -1) ||
466                     (override_params.overridable_events.indexOf( result.textcode ) != -1)
467                 )
468             ) {
469                 req = override([result]);
470             } else {
471                 var found_good = false; var found_bad = false;
472                 for (var i = 0; i < result.length; i++) {
473                     if ( 
474                         (result[i].ilsevent != 'undefined') && 
475                         (
476                             (override_params.overridable_events.indexOf( result[i].ilsevent == null ? null : Number(result[i].ilsevent) ) != -1) ||
477                             (override_params.overridable_events.indexOf( result[i].textcode ) != -1) 
478                         )
479                     ) {
480                         found_good = true;
481                     } else {
482                         found_bad = true;
483                     }
484                 }
485                 if (found_good && (!found_bad)) req = override(result);
486             }
487
488             return req;
489         } catch(E) {
490             throw(E);
491         }
492     },
493
494     'ping' : function() {
495         try {
496             JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
497             var file = new util.file('ping.bat');
498             var path = file._file.path;
499             file.write_content('truncate+exec',
500                 '#!/bin/sh\n' +
501                 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
502                 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n'  /* unix */
503             );
504             file.close();
505             file = new util.file('ping.bat');
506
507             var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
508             process.init(file._file);
509
510             var args = [];
511
512             dump('process.run = ' + process.run(true, args, args.length) + '\n');
513
514             file.close();
515
516             var file = new util.file('ping.bat.txt');
517             var output = file.get_content();
518             file.close();
519
520             return output;
521         } catch(E) {
522             alert(E);
523         }
524     }
525 }
526
527 /*
528 function sample_callback(request) {
529     var result = request.getResultObject();
530 }
531 */
532
533 dump('exiting util/network.js\n');