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) {
145 try { obj.error.sdump('D_SES_ERROR','method: ' + name + '\nparams: '+ js2JSON(params) + '\nReturned null with a NETWORK_FAILURE = ' + obj.NETWORK_FAILURE + ( typeof obj.NETWORK_FAILURE.status == 'function' ? '.status() == ' + obj.NETWORK_FAILURE.status() : '') + '\n'); } catch(E) { alert(E); }
146 r = obj.error.yns_alert('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 message: method=' + name + ' params=' + js2JSON(params) + ' thrown = ' + obj.NETWORK_FAILURE + (obj.NETWORK_FAILURE.status == 'function' ? '.status() == ' + obj.NETWORK_FAILURE.status() : '') + '.','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
148 data.proceed_offline = true; data.stash('proceed_offline');
149 dump('Remembering proceed_offline for 200000 ms.\n');
152 data.proceed_offline = false; data.stash('proceed_offline');
153 dump('Setting proceed_offline back to false.\n');
159 dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
163 req = obj._request(app,name,params,null,o_params);
164 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
168 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
174 'reset_titlebars' : function(data) {
176 data.stash_retrieve();
178 JSAN.use('util.window'); var win = new util.window();
179 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
180 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
181 var enumerator = windowManagerInterface.getEnumerator(null);
183 var w; // set title on all appshell windows
184 while ( w = enumerator.getNext() ) {
185 if (w.document.title.match(/^\d/)) {
187 win.appshell_name_increment()
188 + ': ' + data.list.au[0].usrname()
189 + '@' + data.ws_name;
190 + '.' + data.server_unadorned
194 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
198 'get_new_session' : function(name,xulG,text) {
202 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
203 var url = urls.XUL_AUTH_SIMPLE;
204 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
207 + '?login_type=staff'
208 + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
209 + '&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.'),
210 'simple_auth' + (new Date()).toString(),
211 'chrome,resizable,modal,width=700,height=500'
213 JSAN.use('OpenILS.data');
214 var data = new OpenILS.data(); data.init({'via':'stash'});
215 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
216 data.session.key = data.temporary_session.key;
217 data.session.authtime = data.temporary_session.authtime;
218 data.stash('session');
219 data.list.au[0] = JSON2js(data.temporary_session.usr);
221 obj.reset_titlebars(data);
227 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
231 'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
234 var robj = obj.get_result(req);
235 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
237 if (obj.get_new_session(name,undefined,true)) {
238 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
239 params[0] = data.session.key;
240 req = obj._request(app,name,params,null,o_params);
244 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
249 'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
252 var robj = obj.get_result(req);
253 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
254 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
255 if (location.href.match(/^chrome/)) {
256 //alert('Permission denied.');
261 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
262 + '&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),
263 'simple_auth' + (new Date()).toString(),
264 'chrome,resizable,modal,width=700,height=500'
266 JSAN.use('OpenILS.data');
267 var data = new OpenILS.data(); data.init({'via':'stash'});
268 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
269 params[0] = data.temporary_session.key;
270 req = obj._request(app,name,params,null,o_params);
275 this.error.sdump('D_ERROR',E);
280 'rerequest_on_override' : function (app,name,params,req,o_params) {
283 if (!o_params.text) o_params.text = {};
284 function override(r) {
286 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
287 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
288 '<groupbox><caption label="Exceptions"/>' +
289 '<grid><columns><column/><column/></columns><rows>';
290 for (var i = 0; i < r.length; i++) {
292 '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' +
293 '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' +
294 '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
296 xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' +
297 '<description>Force this action?</description>' +
298 '<button accesskey="N" label="No" name="fancy_cancel"/>' +
299 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
301 urls.XUL_FANCY_PROMPT
302 + '?xml=' + window.escape(xml)
303 + '&title=' + window.escape(o_params.title),
304 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
306 JSAN.use('OpenILS.data');
307 var data = new OpenILS.data(); data.init({'via':'stash'});
308 if (data.fancy_prompt_data != '') {
309 req = obj._request(app,name + '.override',params);
313 alert('in util.network, rerequest_on_override, override:' + E);
317 var result = obj.get_result(req);
318 if (!result) return req;
320 if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
321 req = override([result]);
323 var found_good = false; var found_bad = false;
324 for (var i = 0; i < result.length; i++) {
325 if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
331 if (found_good && (!found_bad)) req = override(result);
344 function sample_callback(request) {
345 var result = request.getResultObject();
349 dump('exiting util/network.js\n');