]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
b0d42a6715f5b748ff6df6ebfa842b42c2566ba7
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
5
6         JSAN.use('util.error'); this.error = new util.error();
7         JSAN.use('util.sound'); this.sound = new util.sound();
8
9         return this;
10 };
11
12 util.network.prototype = {
13
14         'link_id' : 0,
15
16         'NETWORK_FAILURE' : null,
17
18         'simple_request' : function(method_id,params,f,override_params) {
19                 //var obj = this;
20                 //var sparams = js2JSON(params);
21                 //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
22                 //      '\noverride_params = ' + override_params + '\n');
23                 if (typeof api[method_id] == 'undefined') throw( 'Method not found for ' + method_id );
24                 var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
25                 return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
26         },
27
28         'get_result' : function (req) {
29                 var obj = this;
30                 var result;
31                 try {
32                         result = req.getResultObject(); 
33                 } catch(E) {
34                         try {
35                                 if (instanceOf(E, NetworkFailure)) {
36                                         obj.NETWORK_FAILURE = E;
37                                 } else {
38                                         try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
39                                 }
40                         } catch(I) { 
41                                 obj.NETWORK_FAILURE = 'Unknown status';
42                         }
43                         result = null;
44                 }
45                 return result;
46         },
47
48         'request' : function (app,name,params,f,override_params,_params) {
49
50                 var obj = this;
51                 
52                 //var sparams = js2JSON(params);
53                 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
54                 //      '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
55
56                 try { 
57
58                         var request =  this._request(app,name,params,f,override_params,_params);
59                         if (request) {
60                                 return this.get_result(request);
61                         } else {
62                                 return null;
63                         }
64         
65                 } catch(E) {
66                         alert(E); 
67                 }
68         },
69
70         '_request' : function (app,name,params,f,override_params,_params) {
71                 var obj = this;
72                 try {
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 +
76                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
77
78                         var request = new RemoteRequest( app, name );
79                         if (_params && _params.secure) {
80                                 request.setSecure(true);
81                         } else {
82                                 request.setSecure(false);
83                         }
84                         for(var index in params) {
85                                 request.addParam(params[index]);
86                         }
87         
88                         if (f)  {
89                                 request.setCompleteCallback(
90                                         function(req) {
91                                                 try {
92                                                         var json_string = js2JSON(obj.get_result(req));
93                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
94                                                                 + obj.link_id + '\n\n' 
95                                                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
96                                                                 + '\n\nOriginal Request:\n\n' 
97                                                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
98                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
99                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
100                                                         if (override_params) {
101                                                                 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
102                                                         }
103                                                         req = obj.check_for_offline(app,name,params,req,override_params,_params);
104                                                         f(req);
105                                                         obj.NETWORK_FAILURE = null;
106                                                 } catch(E) {
107                                                         try {
108                                                                 E.ilsevent = -2;
109                                                                 E.textcode = 'Server/Method Error';
110                                                         } catch(F) {}
111                                                         f( { 'getResultObject' : function() { return E; } } );
112                                                 }
113                                         }
114                                 );
115                                 try {
116                                         request.send(false);
117                                 } catch(E) {
118                                         throw(E);
119                                 }
120                                 return null;
121                         } else {
122                                 try {
123                                         request.send(true);
124                                 } catch(E) {
125                                         throw(E);
126                                 }
127                                 var result = obj.get_result(request);
128                                 var json_string = js2JSON(result);
129                                 this.error.sdump('D_SES_RESULT','synced result #' 
130                                         + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
131                                         + '\n\nOriginal Request:\n\n' 
132                                         + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
133                                 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
134                                 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
135                                 if (override_params) {
136                                         request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
137                                 }
138                                 request = obj.check_for_offline(app,name,params,request,override_params,_params);
139                                 obj.NETWORK_FAILURE = null;
140                                 return request;
141                         }
142
143                 } catch(E) {
144                         alert(E);
145                         if (instanceOf(E,perm_ex)) {
146                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
147                         }
148                         throw(E);
149                 }
150         },
151
152         'check_for_offline' : function (app,name,params,req,override_params,_params) {
153                 var obj = this;
154                 var result = obj.get_result(req);
155                 if (result != null) return req;
156
157                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
158                 var proceed = true;
159
160                 while(proceed) {
161
162                         proceed = false;
163
164                         var r;
165
166                         if (data.proceed_offline) {
167
168                                 r = 1;
169
170                         } else {
171
172                                 var network_failure_string;
173                                 var network_failure_status_string;
174                                 var msg;
175
176                                 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
177                                 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); }
178                                 
179                                 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; }
180
181                                 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
182
183                                 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Ignore Errors',null,'Check here to confirm this message');
184                                 if (r == 1) {
185                                         data.proceed_offline = true; data.stash('proceed_offline');
186                                         dump('Remembering proceed_offline for 200000 ms.\n');
187                                         setTimeout(
188                                                 function() {
189                                                         data.proceed_offline = false; data.stash('proceed_offline');
190                                                         dump('Setting proceed_offline back to false.\n');
191                                                 }, 200000
192                                         );
193                                 }
194                         }
195
196                         dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
197
198                         switch(r) {
199                                 case 0: 
200                                         req = obj._request(app,name,params,null,override_params,_params);
201                                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
202                                         return req;
203                                 break;
204                                 case 1: 
205                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
206                                 break;
207                         }
208                 }
209         },
210
211         'reset_titlebars' : function(data) {
212                 var obj = this;
213                 data.stash_retrieve();
214                 try {
215                         JSAN.use('util.window'); var win =  new util.window();
216                         var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
217                         var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
218                         var enumerator = windowManagerInterface.getEnumerator(null);
219
220                         var w; // set title on all appshell windows
221                         while ( w = enumerator.getNext() ) {
222                                 if (w.document.title.match(/^\d/)) {
223                                         w.document.title = 
224                                                 win.appshell_name_increment() 
225                                                 + ': ' + data.list.au[0].usrname() 
226                                                 + '@' + data.ws_name;
227                                                 + '.' + data.server_unadorned 
228                                 }
229                         }
230                 } catch(E) {
231                         obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
232                 }
233         },
234
235         'get_new_session' : function(name,xulG,text) {
236                 var obj = this;
237                 try {
238
239                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
240                 var url = urls.XUL_AUTH_SIMPLE;
241                 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
242                 JSAN.use('util.window'); var win = new util.window();
243                 var my_xulG = win.open(
244                         url,
245                         //+ '?login_type=staff'
246                         //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
247                         //+ '&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.'),
248                         //'simple_auth' + (new Date()).toString(),
249                         'Authorize',
250                         'chrome,resizable,modal,width=700,height=500',
251                         {
252                                 'login_type' : 'staff',
253                                 'desc_brief' : text ? 'Session Expired' : 'Operator Change',
254                                 'desc_full' : 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.',
255                                 //'simple_auth' : (new Date()).toString(),
256                         }
257                 );
258                 JSAN.use('OpenILS.data');
259                 var data = new OpenILS.data(); data.init({'via':'stash'});
260                 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
261                         data.session.key = data.temporary_session.key; 
262                         data.session.authtime = data.temporary_session.authtime; 
263                         data.stash('session');
264                         if (! data.list.au ) data.list.au = [];
265                         data.list.au[0] = JSON2js( data.temporary_session.usr );
266                         data.stash('list');
267                         obj.reset_titlebars(data);
268                         return true;
269         } else {
270             obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
271         }
272                 return false;
273
274                 } catch(E) {
275                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
276                 }
277         },
278
279         'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
280                 try {
281                         var obj = this;
282                         var robj = obj.get_result(req);
283                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
284
285                                 if (obj.get_new_session(name,undefined,true)) {
286                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
287                                         params[0] = data.session.key;
288                                         req = obj._request(app,name,params,null,override_params,_params);
289                                 }
290                         }
291                 } catch(E) {
292                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
293                 }
294                 return req;
295         },
296         
297         'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
298                 try {
299                         var obj = this;
300                         var robj = obj.get_result(req);
301                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
302                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
303                                 if (location.href.match(/^chrome/)) {
304                                         //alert('Permission denied.');
305                                 } else {
306                                         JSAN.use('util.window'); var win = new util.window();
307                                         var my_xulG = win.open(
308                                                 urls.XUL_AUTH_SIMPLE,
309                                                 //+ '?login_type=temp'
310                                                 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
311                                                 //+ '&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),
312                                                 //'simple_auth' + (new Date()).toString(),
313                                                 'Authorize',
314                                                 'chrome,resizable,modal,width=700,height=500',
315                                                 {
316                                                         'login_type' : 'temp',
317                                                         'desc_brief' : 'Permission Denied: ' + robj.ilsperm,
318                                                         'desc_full' : '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, please inform your friendly Evergreen developers or helpdesk staff of the above permission and this debug information: ' + name,
319                                                         //'simple_auth' : (new Date()).toString(),
320                                                 }
321                                         );
322                                         JSAN.use('OpenILS.data');
323                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
324                                         if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
325                                                 params[0] = my_xulG.temporary_session.key;
326                                                 req = obj._request(app,name,params,null,override_params,_params);
327                                         }
328                                 }
329                         }
330                 } catch(E) {
331                         this.error.sdump('D_ERROR',E);
332                 }
333                 return req;
334         },
335
336         'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
337                 var obj = this;
338                 try {
339                         if (!override_params.text) override_params.text = {};
340                         function override(r) {
341                                 try {
342                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
343                                         obj.sound.bad();
344                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
345                                                 '<groupbox><caption label="Exceptions"/>' + 
346                                                 '<grid><columns><column/><column/></columns><rows>';
347                                         for (var i = 0; i < r.length; i++) {
348                                                 var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
349                                                 var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
350                                                 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;');
351                                                 var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
352                                                 xml += '<row>' + 
353                                                         '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
354                                                         '<description>' + t3 + '</description>' + 
355                                                         '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
356                                         }
357                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
358                                                 '<description>Force this action?</description>' + 
359                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
360                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
361                                         //JSAN.use('OpenILS.data');
362                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
363                                         //data.temp_override_xml = xml; data.stash('temp_override_xml');
364                                         JSAN.use('util.window'); var win = new util.window();
365                                         var fancy_prompt_data = win.open(
366                                                 urls.XUL_FANCY_PROMPT,
367                                                 //+ '?xml_in_stash=temp_override_xml'
368                                                 //+ '&title=' + window.escape(override_params.title),
369                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
370                                                 { 'xml' : xml, 'title' : override_params.title }
371                                         );
372                                         if (fancy_prompt_data.fancy_status == 'complete') {
373                                                 req = obj._request(app,name + '.override',params);
374                                         }
375                                         return req;
376                                 } catch(E) {
377                                         alert('in util.network, rerequest_on_override, override:' + E);
378                                 }
379                         }
380
381                         var result = obj.get_result(req);
382                         if (!result) return req;
383
384                         if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result.ilsevent) ) != -1) ) {
385                                 req = override([result]);
386                         } else {
387                                 var found_good = false; var found_bad = false;
388                                 for (var i = 0; i < result.length; i++) {
389                                         if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result[i].ilsevent) ) != -1) ) {
390                                                 found_good = true;
391                                         } else {
392                                                 found_bad = true;
393                                         }
394                                 }
395                                 if (found_good && (!found_bad)) req = override(result);
396                         }
397
398                         return req;
399                 } catch(E) {
400                         throw(E);
401                 }
402         },
403
404
405 }
406
407 /*
408 function sample_callback(request) {
409         var result = request.getResultObject();
410 }
411 */
412
413 dump('exiting util/network.js\n');