]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
I'm ripping the experimental network caching out of trunk; I want to start over in...
[working/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 my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
261                         data.session.key = my_xulG.temporary_session.key; 
262                         data.session.authtime = my_xulG.temporary_session.authtime; 
263                         data.stash('session');
264                         if (! data.list.au ) data.list.au = [];
265                         data.list.au[0] = JSON2js( my_xulG.temporary_session.usr );
266                         data.stash('list');
267                         obj.reset_titlebars(data);
268                         return true;
269                 } else { alert('here2'); }
270                 return false;
271
272                 } catch(E) {
273                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
274                 }
275         },
276
277         'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
278                 try {
279                         var obj = this;
280                         var robj = obj.get_result(req);
281                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
282
283                                 if (obj.get_new_session(name,undefined,true)) {
284                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
285                                         params[0] = data.session.key;
286                                         req = obj._request(app,name,params,null,override_params,_params);
287                                 }
288                         }
289                 } catch(E) {
290                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
291                 }
292                 return req;
293         },
294         
295         'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
296                 try {
297                         var obj = this;
298                         var robj = obj.get_result(req);
299                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
300                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
301                                 if (location.href.match(/^chrome/)) {
302                                         //alert('Permission denied.');
303                                 } else {
304                                         JSAN.use('util.window'); var win = new util.window();
305                                         var my_xulG = win.open(
306                                                 urls.XUL_AUTH_SIMPLE,
307                                                 //+ '?login_type=temp'
308                                                 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
309                                                 //+ '&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),
310                                                 //'simple_auth' + (new Date()).toString(),
311                                                 'Authorize',
312                                                 'chrome,resizable,modal,width=700,height=500',
313                                                 {
314                                                         'login_type' : 'temp',
315                                                         'desc_brief' : 'Permission Denied: ' + robj.ilsperm,
316                                                         '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,
317                                                         //'simple_auth' : (new Date()).toString(),
318                                                 }
319                                         );
320                                         JSAN.use('OpenILS.data');
321                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
322                                         if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
323                                                 params[0] = my_xulG.temporary_session.key;
324                                                 req = obj._request(app,name,params,null,override_params,_params);
325                                         }
326                                 }
327                         }
328                 } catch(E) {
329                         this.error.sdump('D_ERROR',E);
330                 }
331                 return req;
332         },
333
334         'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
335                 var obj = this;
336                 try {
337                         if (!override_params.text) override_params.text = {};
338                         function override(r) {
339                                 try {
340                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
341                                         obj.sound.bad();
342                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
343                                                 '<groupbox><caption label="Exceptions"/>' + 
344                                                 '<grid><columns><column/><column/></columns><rows>';
345                                         for (var i = 0; i < r.length; i++) {
346                                                 var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
347                                                 var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
348                                                 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;');
349                                                 var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
350                                                 xml += '<row>' + 
351                                                         '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
352                                                         '<description>' + t3 + '</description>' + 
353                                                         '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
354                                         }
355                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
356                                                 '<description>Force this action?</description>' + 
357                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
358                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
359                                         //JSAN.use('OpenILS.data');
360                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
361                                         //data.temp_override_xml = xml; data.stash('temp_override_xml');
362                                         JSAN.use('util.window'); var win = new util.window();
363                                         var fancy_prompt_data = win.open(
364                                                 urls.XUL_FANCY_PROMPT,
365                                                 //+ '?xml_in_stash=temp_override_xml'
366                                                 //+ '&title=' + window.escape(override_params.title),
367                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
368                                                 { 'xml' : xml, 'title' : override_params.title }
369                                         );
370                                         if (fancy_prompt_data.fancy_status == 'complete') {
371                                                 req = obj._request(app,name + '.override',params);
372                                         }
373                                         return req;
374                                 } catch(E) {
375                                         alert('in util.network, rerequest_on_override, override:' + E);
376                                 }
377                         }
378
379                         var result = obj.get_result(req);
380                         if (!result) return req;
381
382                         if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
383                                 req = override([result]);
384                         } else {
385                                 var found_good = false; var found_bad = false;
386                                 for (var i = 0; i < result.length; i++) {
387                                         if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
388                                                 found_good = true;
389                                         } else {
390                                                 found_bad = true;
391                                         }
392                                 }
393                                 if (found_good && (!found_bad)) req = override(result);
394                         }
395
396                         return req;
397                 } catch(E) {
398                         throw(E);
399                 }
400         },
401
402
403 }
404
405 /*
406 function sample_callback(request) {
407         var result = request.getResultObject();
408 }
409 */
410
411 dump('exiting util/network.js\n');