1 dump('entering util/network.js\n');
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.sound'); this.sound = new util.sound();
12 util.network.prototype = {
16 'NETWORK_FAILURE' : null,
18 'simple_request' : function(method_id,params,f,override_params) {
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 });
28 'get_result' : function (req) {
32 result = req.getResultObject();
35 if (instanceOf(E, NetworkFailure)) {
36 obj.NETWORK_FAILURE = E;
38 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
41 obj.NETWORK_FAILURE = 'Unknown status';
48 'request' : function (app,name,params,f,override_params,_params) {
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');
58 var request = this._request(app,name,params,f,override_params,_params);
60 return this.get_result(request);
70 '_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 +
76 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
78 var request = new RemoteRequest( app, name );
79 if (_params && _params.secure) {
80 request.setSecure(true);
82 request.setSecure(false);
84 for(var index in params) {
85 request.addParam(params[index]);
89 request.setCompleteCallback(
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);
103 req = obj.check_for_offline(app,name,params,req,override_params,_params);
105 obj.NETWORK_FAILURE = null;
109 E.textcode = 'Server/Method Error';
111 f( { 'getResultObject' : function() { return E; } } );
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);
138 request = obj.check_for_offline(app,name,params,request,override_params,_params);
139 obj.NETWORK_FAILURE = null;
145 if (instanceOf(E,perm_ex)) {
146 alert('in util.network, _request : permission exception: ' + js2JSON(E));
152 'check_for_offline' : function (app,name,params,req,override_params,_params) {
154 var result = obj.get_result(req);
155 if (result != null) return req;
157 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
166 if (data.proceed_offline) {
172 var network_failure_string;
173 var network_failure_status_string;
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); }
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; }
181 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
183 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Ignore Errors',null,'Check here to confirm this message');
185 data.proceed_offline = true; data.stash('proceed_offline');
186 dump('Remembering proceed_offline for 200000 ms.\n');
189 data.proceed_offline = false; data.stash('proceed_offline');
190 dump('Setting proceed_offline back to false.\n');
196 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
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? :) */
205 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
211 'reset_titlebars' : function(data) {
213 data.stash_retrieve();
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);
220 var w; // set title on all appshell windows
221 while ( w = enumerator.getNext() ) {
222 if (w.document.title.match(/^\d/)) {
224 win.appshell_name_increment()
225 + ': ' + data.list.au[0].usrname()
226 + '@' + data.ws_name;
227 + '.' + data.server_unadorned
231 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
235 'get_new_session' : function(name,xulG,text) {
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(
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(),
250 'chrome,resizable,modal,width=700,height=500',
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(),
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 );
267 obj.reset_titlebars(data);
269 } else { alert('Error applying new auth session in network.js'); }
273 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
277 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
280 var robj = obj.get_result(req);
281 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
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);
290 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
295 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
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.');
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(),
312 'chrome,resizable,modal,width=700,height=500',
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(),
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);
329 this.error.sdump('D_ERROR',E);
334 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
337 if (!override_params.text) override_params.text = {};
338 function override(r) {
340 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
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,'&').replace(/</g,'<').replace(/>/g,'>');
347 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
348 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
349 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
351 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
352 '<description>' + t3 + '</description>' +
353 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
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 }
370 if (fancy_prompt_data.fancy_status == 'complete') {
371 req = obj._request(app,name + '.override',params);
375 alert('in util.network, rerequest_on_override, override:' + E);
379 var result = obj.get_result(req);
380 if (!result) return req;
382 if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
383 req = override([result]);
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) ) {
393 if (found_good && (!found_bad)) req = override(result);
406 function sample_callback(request) {
407 var result = request.getResultObject();
411 dump('exiting util/network.js\n');