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(id,params,f,o_params) {
19 var secure = true; if (typeof api[id].secure != 'undefined') secure = api[id].secure;
20 return this.request(api[id].app,api[id].method,params,f,o_params,secure);
23 'get_result' : function (req) {
27 result = req.getResultObject();
30 if (instanceOf(E, NetworkFailure)) {
31 obj.NETWORK_FAILURE = E;
33 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
36 obj.NETWORK_FAILURE = 'Unknown status';
43 'request' : function (app,name,params,f,o_params,secure) {
44 var request = this._request(app,name,params,f,o_params,secure);
46 return this.get_result(request);
52 '_request' : function (app,name,params,f,o_params,secure) {
55 var sparams = js2JSON(params);
56 obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
57 '\no_params = ' + o_params + '\nsecure = ' + secure +
58 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
59 var request = new RemoteRequest( app, name );
61 request.setSecure(true);
63 request.setSecure(false);
65 for(var index in params) {
66 request.addParam(params[index]);
70 request.setCompleteCallback(
73 var json_string = js2JSON(obj.get_result(req));
74 obj.error.sdump('D_SES_RESULT','asynced result #'
75 + obj.link_id + '\n\n'
76 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
77 + '\n\nOriginal Request:\n\n'
78 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
79 req = obj.rerequest_on_session_timeout(app,name,params,req,o_params,secure);
80 req = obj.rerequest_on_perm_failure(app,name,params,req,o_params,secure);
82 req = obj.rerequest_on_override(app,name,params,req,o_params,secure);
84 req = obj.check_for_offline(app,name,params,req,o_params,secure);
86 obj.NETWORK_FAILURE = null;
90 E.textcode = 'Server/Method Error';
92 f( { 'getResultObject' : function() { return E; } } );
108 var result = obj.get_result(request);
109 var json_string = js2JSON(result);
110 this.error.sdump('D_SES_RESULT','synced result #'
111 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
112 + '\n\nOriginal Request:\n\n'
113 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
114 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params,secure);
115 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params,secure);
117 request = obj.rerequest_on_override(app,name,params,request,o_params,secure);
119 request = obj.check_for_offline(app,name,params,request,o_params,secure);
120 obj.NETWORK_FAILURE = null;
126 if (instanceOf(E,perm_ex)) {
127 alert('in util.network, _request : permission exception: ' + js2JSON(E));
133 'check_for_offline' : function (app,name,params,req,o_params,secure) {
135 var result = obj.get_result(req);
136 if (result != null) return req;
138 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
147 if (data.proceed_offline) {
153 var network_failure_string;
154 var network_failure_status_string;
157 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
158 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); }
160 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; }
162 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
164 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Ignore Errors',null,'Check here to confirm this message');
166 data.proceed_offline = true; data.stash('proceed_offline');
167 dump('Remembering proceed_offline for 200000 ms.\n');
170 data.proceed_offline = false; data.stash('proceed_offline');
171 dump('Setting proceed_offline back to false.\n');
177 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
181 req = obj._request(app,name,params,null,o_params,secure);
182 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
186 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
192 'reset_titlebars' : function(data) {
194 data.stash_retrieve();
196 JSAN.use('util.window'); var win = new util.window();
197 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
198 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
199 var enumerator = windowManagerInterface.getEnumerator(null);
201 var w; // set title on all appshell windows
202 while ( w = enumerator.getNext() ) {
203 if (w.document.title.match(/^\d/)) {
205 win.appshell_name_increment()
206 + ': ' + data.list.au[0].usrname()
207 + '@' + data.ws_name;
208 + '.' + data.server_unadorned
212 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
216 'get_new_session' : function(name,xulG,text) {
220 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
221 var url = urls.XUL_AUTH_SIMPLE;
222 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
225 + '?login_type=staff'
226 + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
227 + '&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.'),
228 'simple_auth' + (new Date()).toString(),
229 'chrome,resizable,modal,width=700,height=500'
231 JSAN.use('OpenILS.data');
232 var data = new OpenILS.data(); data.init({'via':'stash'});
233 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
234 data.session.key = data.temporary_session.key;
235 data.session.authtime = data.temporary_session.authtime;
236 data.stash('session');
237 if (! data.list.au ) data.list.au = [];
238 data.list.au[0] = JSON2js(data.temporary_session.usr);
240 obj.reset_titlebars(data);
246 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
250 'rerequest_on_session_timeout' : function(app,name,params,req,o_params,secure) {
253 var robj = obj.get_result(req);
254 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
256 if (obj.get_new_session(name,undefined,true)) {
257 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
258 params[0] = data.session.key;
259 req = obj._request(app,name,params,null,o_params,secure);
263 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
268 'rerequest_on_perm_failure' : function(app,name,params,req,o_params,secure) {
271 var robj = obj.get_result(req);
272 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
273 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
274 if (location.href.match(/^chrome/)) {
275 //alert('Permission denied.');
280 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
281 + '&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),
282 'simple_auth' + (new Date()).toString(),
283 'chrome,resizable,modal,width=700,height=500'
285 JSAN.use('OpenILS.data');
286 var data = new OpenILS.data(); data.init({'via':'stash'});
287 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
288 params[0] = data.temporary_session.key;
289 req = obj._request(app,name,params,null,o_params,secure);
294 this.error.sdump('D_ERROR',E);
299 'rerequest_on_override' : function (app,name,params,req,o_params,secure) {
302 if (!o_params.text) o_params.text = {};
303 function override(r) {
305 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
307 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
308 '<groupbox><caption label="Exceptions"/>' +
309 '<grid><columns><column/><column/></columns><rows>';
310 for (var i = 0; i < r.length; i++) {
311 var t1 = String(r[i].ilsevent).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
312 var t2 = String(r[i].textcode).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
313 var t3 = String((o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
314 var t4 = String(r[i].desc).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
316 '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' +
317 '<description>' + t3 + '</description>' +
318 '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
320 xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' +
321 '<description>Force this action?</description>' +
322 '<button accesskey="N" label="No" name="fancy_cancel"/>' +
323 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
324 JSAN.use('OpenILS.data');
325 var data = new OpenILS.data(); data.init({'via':'stash'});
326 data.temp_override_xml = xml; data.stash('temp_override_xml');
328 urls.XUL_FANCY_PROMPT
329 + '?xml_in_stash=temp_override_xml'
330 + '&title=' + window.escape(o_params.title),
331 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
333 data.init({'via':'stash'});
334 if (data.fancy_prompt_data != '') {
335 req = obj._request(app,name + '.override',params);
339 alert('in util.network, rerequest_on_override, override:' + E);
343 var result = obj.get_result(req);
344 if (!result) return req;
346 if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
347 req = override([result]);
349 var found_good = false; var found_bad = false;
350 for (var i = 0; i < result.length; i++) {
351 if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
357 if (found_good && (!found_bad)) req = override(result);
370 function sample_callback(request) {
371 var result = request.getResultObject();
375 dump('exiting util/network.js\n');