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 obj.error.sdump('D_ERROR','DEBUG: got here');
29 if (instanceOf(E, NetworkFailure)) {
30 obj.NETWORK_FAILURE = E.status();
32 try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
34 } catch(I) { dump(I + '\n'); }
40 'request' : function (app,name,params,f,o_params) {
41 var request = this._request(app,name,params,f,o_params);
43 return this.get_result(request);
49 '_request' : function (app,name,params,f,o_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 '\no_params = ' + o_params +
55 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
56 var request = new RemoteRequest( app, name );
57 for(var index in params) {
58 request.addParam(params[index]);
62 request.setCompleteCallback(
65 var json_string = js2JSON(obj.get_result(req));
66 obj.error.sdump('D_SES_RESULT','asynced result #'
67 + obj.link_id + '\n\n'
68 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string)
69 + '\n\nOriginal Request:\n\n'
70 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
71 req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
72 req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
74 req = obj.rerequest_on_override(app,name,params,req,o_params);
76 req = obj.check_for_offline(app,name,params,req,o_params);
78 obj.NETWORK_FAILURE = null;
82 E.textcode = 'Server/Method Error';
84 f( { 'getResultObject' : function() { return E; } } );
100 var result = obj.get_result(request);
101 var json_string = js2JSON(result);
102 this.error.sdump('D_SES_RESULT','synced result #'
103 + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string )
104 + '\n\nOriginal Request:\n\n'
105 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
106 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
107 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
109 request = obj.rerequest_on_override(app,name,params,request,o_params);
111 request = obj.check_for_offline(app,name,params,request,o_params);
112 obj.NETWORK_FAILURE = null;
118 if (instanceOf(E,perm_ex)) {
119 alert('in util.network, _request : permission exception: ' + js2JSON(E));
125 'check_for_offline' : function (app,name,params,req,o_params) {
127 var result = obj.get_result(req);
128 if (result != null) return req;
129 if (obj.NETWORK_FAILURE == null) {
130 obj.error.sdump('D_SES_ERROR','method: ' + name + '\nparams: ' + js2JSON(params) + '\nReturned null. There was no NetworkFailure object thrown.');
131 obj.error.sdump('D_ALERT','method: ' + name + '\nparams: ' + js2JSON(params) + '\nReturned null. There was no NetworkFailure object thrown.');
135 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
144 if (data.proceed_offline) {
149 try { obj.error.sdump('D_SES_ERROR','method: ' + name + '\nparams: '+ js2JSON(params) + '\nReturned null\n'); } catch(E) { alert(E); }
150 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) + ' status = ' + obj.NETWORK_FAILURE + '.','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
152 data.proceed_offline = true; data.stash('proceed_offline');
153 dump('Remembering proceed_offline for 200000 ms.\n');
156 data.proceed_offline = false; data.stash('proceed_offline');
157 dump('Setting proceed_offline back to false.\n');
163 dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
167 req = obj._request(app,name,params,null,o_params);
168 if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
172 return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
178 'reset_titlebars' : function(data) {
180 data.stash_retrieve();
182 JSAN.use('util.window'); var win = new util.window();
183 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
184 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
185 var enumerator = windowManagerInterface.getEnumerator(null);
187 var w; // set title on all appshell windows
188 while ( w = enumerator.getNext() ) {
189 if (w.document.title.match(/^\d/)) {
191 win.appshell_name_increment()
192 + ': ' + data.list.au[0].usrname()
193 + '@' + data.ws_name;
194 + '.' + data.server_unadorned
198 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
202 'get_new_session' : function(name,xulG,text) {
206 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
207 var url = urls.XUL_AUTH_SIMPLE;
208 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
211 + '?login_type=staff'
212 + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
213 + '&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.'),
214 'simple_auth' + (new Date()).toString(),
215 'chrome,resizable,modal,width=700,height=500'
217 JSAN.use('OpenILS.data');
218 var data = new OpenILS.data(); data.init({'via':'stash'});
219 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
220 data.session.key = data.temporary_session.key;
221 data.session.authtime = data.temporary_session.authtime;
222 data.stash('session');
223 data.list.au[0] = JSON2js(data.temporary_session.usr);
225 obj.reset_titlebars(data);
231 obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
235 'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
238 var robj = obj.get_result(req);
239 if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
241 if (obj.get_new_session(name,undefined,true)) {
242 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
243 params[0] = data.session.key;
244 req = obj._request(app,name,params,null,o_params);
248 this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
253 'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
256 var robj = obj.get_result(req);
257 if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
258 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
259 if (location.href.match(/^chrome/)) {
260 //alert('Permission denied.');
265 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
266 + '&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),
267 'simple_auth' + (new Date()).toString(),
268 'chrome,resizable,modal,width=700,height=500'
270 JSAN.use('OpenILS.data');
271 var data = new OpenILS.data(); data.init({'via':'stash'});
272 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
273 params[0] = data.temporary_session.key;
274 req = obj._request(app,name,params,null,o_params);
279 this.error.sdump('D_ERROR',E);
284 'rerequest_on_override' : function (app,name,params,req,o_params) {
287 if (!o_params.text) o_params.text = {};
288 function override(r) {
290 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
291 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
292 '<groupbox><caption label="Exceptions"/>' +
293 '<grid><columns><column/><column/></columns><rows>';
294 for (var i = 0; i < r.length; i++) {
296 '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' +
297 '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' +
298 '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
300 xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' +
301 '<description>Force this action?</description>' +
302 '<button accesskey="N" label="No" name="fancy_cancel"/>' +
303 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
305 urls.XUL_FANCY_PROMPT
306 + '?xml=' + window.escape(xml)
307 + '&title=' + window.escape(o_params.title),
308 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
310 JSAN.use('OpenILS.data');
311 var data = new OpenILS.data(); data.init({'via':'stash'});
312 if (data.fancy_prompt_data != '') {
313 req = obj._request(app,name + '.override',params);
317 alert('in util.network, rerequest_on_override, override:' + E);
321 var result = obj.get_result(req);
322 if (!result) return req;
324 if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
325 req = override([result]);
327 var found_good = false; var found_bad = false;
328 for (var i = 0; i < result.length; i++) {
329 if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
335 if (found_good && (!found_bad)) req = override(result);
348 function sample_callback(request) {
349 var result = request.getResultObject();
353 dump('exiting util/network.js\n');