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);
270 obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
275 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
279 'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
282 var robj = obj.get_result(req);
283 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
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);
292 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
297 'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
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.');
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(),
314 'chrome,resizable,modal,width=700,height=500',
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(),
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);
331 this.error.sdump('D_ERROR',E);
336 'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
339 if (!override_params.text) override_params.text = {};
340 function override(r) {
342 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
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,'&').replace(/</g,'<').replace(/>/g,'>');
349 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
350 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
351 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
353 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
354 '<description>' + t3 + '</description>' +
355 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
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 }
372 if (fancy_prompt_data.fancy_status == 'complete') {
373 req = obj._request(app,name + '.override',params);
377 alert('in util.network, rerequest_on_override, override:' + E);
381 var result = obj.get_result(req);
382 if (!result) return req;
384 if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result.ilsevent) ) != -1) ) {
385 req = override([result]);
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) ) {
395 if (found_good && (!found_bad)) req = override(result);
408 function sample_callback(request) {
409 var result = request.getResultObject();
413 dump('exiting util/network.js\n');