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();
11 util.network.prototype = {
15 'NETWORK_FAILURE' : null,
17 'simple_request' : function(id,params,f,o_params) {
18 return this.request(api[id].app,api[id].method,params,f,o_params);
21 'get_result' : function (req) {
25 result = req.getResultObject();
28 if (instanceOf(E, NetworkFailure)) {
29 obj.NETWORK_FAILURE = E;
31 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
34 obj.NETWORK_FAILURE = 'Unknown status';
41 'request' : function (app,name,params,f,o_params) {
42 var request = this._request(app,name,params,f,o_params);
44 return this.get_result(request);
50 '_request' : function (app,name,params,f,o_params) {
53 var sparams = js2JSON(params);
54 obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
55 '\no_params = ' + o_params +
56 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
57 var request = new RemoteRequest( app, name );
58 for(var index in params) {
59 request.addParam(params[index]);
63 request.setCompleteCallback(
66 var json_string = js2JSON(obj.get_result(req));
67 obj.error.sdump('D_SES_RESULT','asynced result #'
68 + obj.link_id + '\n\n'
69 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
70 + '\n\nOriginal Request:\n\n'
71 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
72 req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
73 req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
75 req = obj.rerequest_on_override(app,name,params,req,o_params);
77 req = obj.check_for_offline(app,name,params,req,o_params);
79 obj.NETWORK_FAILURE = null;
83 E.textcode = 'Server/Method Error';
85 f( { 'getResultObject' : function() { return E; } } );
101 var result = obj.get_result(request);
102 var json_string = js2JSON(result);
103 this.error.sdump('D_SES_RESULT','synced result #'
104 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
105 + '\n\nOriginal Request:\n\n'
106 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
107 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
108 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
110 request = obj.rerequest_on_override(app,name,params,request,o_params);
112 request = obj.check_for_offline(app,name,params,request,o_params);
113 obj.NETWORK_FAILURE = null;
119 if (instanceOf(E,perm_ex)) {
120 alert('in util.network, _request : permission exception: ' + js2JSON(E));
126 'check_for_offline' : function (app,name,params,req,o_params) {
128 var result = obj.get_result(req);
129 if (result != null) return req;
131 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
140 if (data.proceed_offline) {
146 var network_failure_string;
147 var network_failure_status_string;
150 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
151 try { network_failure_status_string = typeof obj.NETWORK_FAILURE == 'object' && typeof obj.NETWORK_FAILURE.status == 'function' ? network_failure_status_string = obj.NETWORK_FAILURE.status() : network_failure_status_string = ''; } catch(E) { network_failure_status_string = E; }
153 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 Proceed Offline 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; }
155 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
157 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
159 data.proceed_offline = true; data.stash('proceed_offline');
160 dump('Remembering proceed_offline for 200000 ms.\n');
163 data.proceed_offline = false; data.stash('proceed_offline');
164 dump('Setting proceed_offline back to false.\n');
170 dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
174 req = obj._request(app,name,params,null,o_params);
175 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
179 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
185 'reset_titlebars' : function(data) {
187 data.stash_retrieve();
189 JSAN.use('util.window'); var win = new util.window();
190 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
191 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
192 var enumerator = windowManagerInterface.getEnumerator(null);
194 var w; // set title on all appshell windows
195 while ( w = enumerator.getNext() ) {
196 if (w.document.title.match(/^\d/)) {
198 win.appshell_name_increment()
199 + ': ' + data.list.au[0].usrname()
200 + '@' + data.ws_name;
201 + '.' + data.server_unadorned
205 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
209 'get_new_session' : function(name,xulG,text) {
213 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
214 var url = urls.XUL_AUTH_SIMPLE;
215 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
218 + '?login_type=staff'
219 + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
220 + '&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.'),
221 'simple_auth' + (new Date()).toString(),
222 'chrome,resizable,modal,width=700,height=500'
224 JSAN.use('OpenILS.data');
225 var data = new OpenILS.data(); data.init({'via':'stash'});
226 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
227 data.session.key = data.temporary_session.key;
228 data.session.authtime = data.temporary_session.authtime;
229 data.stash('session');
230 data.list.au[0] = JSON2js(data.temporary_session.usr);
232 obj.reset_titlebars(data);
238 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
242 'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
245 var robj = obj.get_result(req);
246 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
248 if (obj.get_new_session(name,undefined,true)) {
249 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
250 params[0] = data.session.key;
251 req = obj._request(app,name,params,null,o_params);
255 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
260 'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
263 var robj = obj.get_result(req);
264 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
265 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
266 if (location.href.match(/^chrome/)) {
267 //alert('Permission denied.');
272 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
273 + '&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),
274 'simple_auth' + (new Date()).toString(),
275 'chrome,resizable,modal,width=700,height=500'
277 JSAN.use('OpenILS.data');
278 var data = new OpenILS.data(); data.init({'via':'stash'});
279 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
280 params[0] = data.temporary_session.key;
281 req = obj._request(app,name,params,null,o_params);
286 this.error.sdump('D_ERROR',E);
291 'rerequest_on_override' : function (app,name,params,req,o_params) {
294 if (!o_params.text) o_params.text = {};
295 function override(r) {
297 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
298 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
299 '<groupbox><caption label="Exceptions"/>' +
300 '<grid><columns><column/><column/></columns><rows>';
301 for (var i = 0; i < r.length; i++) {
303 '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' +
304 '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' +
305 '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
307 xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' +
308 '<description>Force this action?</description>' +
309 '<button accesskey="N" label="No" name="fancy_cancel"/>' +
310 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
312 urls.XUL_FANCY_PROMPT
313 + '?xml=' + window.escape(xml)
314 + '&title=' + window.escape(o_params.title),
315 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
317 JSAN.use('OpenILS.data');
318 var data = new OpenILS.data(); data.init({'via':'stash'});
319 if (data.fancy_prompt_data != '') {
320 req = obj._request(app,name + '.override',params);
324 alert('in util.network, rerequest_on_override, override:' + E);
328 var result = obj.get_result(req);
329 if (!result) return req;
331 if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
332 req = override([result]);
334 var found_good = false; var found_bad = false;
335 for (var i = 0; i < result.length; i++) {
336 if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
342 if (found_good && (!found_bad)) req = override(result);
355 function sample_callback(request) {
356 var result = request.getResultObject();
360 dump('exiting util/network.js\n');