]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
show request together with the result
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
5
6         JSAN.use('util.error'); this.error = new util.error();
7
8         return this;
9 };
10
11 util.network.prototype = {
12
13         'link_id' : 0,
14
15         'simple_request' : function(id,params,f,o_params) {
16                 return this.request(api[id].app,api[id].method,params,f,o_params);
17         },
18
19         'request' : function (app,name,params,f,o_params) {
20                 var request =  this._request(app,name,params,f,o_params);
21                 if (request) {
22                         return request.getResultObject();
23                 } else {
24                         return null;
25                 }
26         },
27
28         '_request' : function (app,name,params,f,o_params) {
29                 var obj = this;
30                 try {
31                         var sparams = js2JSON(params);
32                         obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
33                                 '\no_params = ' + o_params + 
34                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
35                         var request = new RemoteRequest( app, name );
36                         for(var index in params) {
37                                 request.addParam(params[index]);
38                         }
39         
40                         if (f)  {
41                                 request.setCompleteCallback(
42                                         function(req) {
43                                                 try {
44                                                         var json_string = js2JSON(req.getResultObject());
45                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
46                                                                 + obj.link_id + '\n\n' 
47                                                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
48                                                                 + '\n\nOriginal Request:\n\n' 
49                                                                 + 'request '+app+' '+name+' '+ sparams);
50                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
51                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
52                                                         if (o_params) {
53                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
54                                                         }
55                                                         req = obj.check_for_offline(app,name,params,req,o_params);
56                                                         f(req);
57                                                 } catch(E) {
58                                                         try {
59                                                                 E.ilsevent = -2;
60                                                                 E.textcode = 'Server/Method Error';
61                                                         } catch(F) {}
62                                                         f( { 'getResultObject' : function() { return E; } } );
63                                                 }
64                                         }
65                                 );
66                                 request.send(false);
67                                 return null;
68                         } else {
69                                 request.send(true);
70                                 var result = request.getResultObject();
71                                 var json_string = js2JSON(result);
72                                 this.error.sdump('D_SES_RESULT','synced result #' 
73                                         + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
74                                         + '\n\nOriginal Request:\n\n' 
75                                         + 'request '+app+' '+name+' '+ sparams);
76                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
77                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
78                                 if (o_params) {
79                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
80                                 }
81                                 request = obj.check_for_offline(app,name,params,request,o_params);
82                                 return request;
83                         }
84
85                 } catch(E) {
86                         if (instanceOf(E,perm_ex)) {
87                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
88                         }
89                         throw(E);
90                 }
91         },
92
93         'check_for_offline' : function (app,name,params,req,o_params) {
94                 var obj = this;
95                 var result = req.getResultObject();
96                 if (result != null) return req;
97
98                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
99                 var proceed = true;
100
101                 while(proceed) {
102
103                         proceed = false;
104
105                         var r;
106
107                         if (data.proceed_offline) {
108
109                                 r = 1;
110
111                         } else {
112                                 r = obj.error.yns_alert('Network 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) + '.','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
113                                 if (r == 1) {
114                                         data.proceed_offline = true; data.stash('proceed_offline');
115                                         dump('Remembering proceed_offline for 200000 ms.\n');
116                                         setTimeout(
117                                                 function() {
118                                                         data.proceed_offline = false; data.stash('proceed_offline');
119                                                         dump('Setting proceed_offline back to false.\n');
120                                                 }, 200000
121                                         );
122                                 }
123                         }
124
125                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
126
127                         switch(r) {
128                                 case 0: 
129                                         req = obj._request(app,name,params,null,o_params);
130                                         if (req.getResultObject() == null) proceed = true;
131                                         return req;
132                                 break;
133                                 case 1: 
134                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
135                                 break;
136                         }
137                 }
138         },
139
140         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
141                 try {
142                         var obj = this;
143                         var robj = req.getResultObject();
144                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
145                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
146                                 window.open(
147                                         urls.XUL_AUTH_SIMPLE
148                                         + '?login_type=staff'
149                                         + '&desc_brief=' + window.escape('Your session has expired')
150                                         + '&desc_full=' + window.escape('Please re-login.  If after you have re-authenticated, you still see session expired dialogs like this one, please note where they are occuring and inform your friendly Evergreen developers of this debug information: ' + name),
151                                         'simple_auth' + (new Date()).toString(),
152                                         'chrome,resizable,modal,width=700,height=500'
153                                 );
154                                 JSAN.use('OpenILS.data');
155                                 var data = new OpenILS.data(); data.init({'via':'stash'});
156                                 if (data.temporary_session != '') {
157                                         data.session.key = data.temporary_session.key; 
158                                         data.session.authtime = data.temporary_session.authtime; 
159                                         data.stash('session');
160                                         data.list.au[0] = JSON2js(data.temporary_session.usr);
161                                         data.stash('list');
162                                         try {
163                                                 JSAN.use('util.window'); var win =  new util.window();
164                                                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
165                                                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
166                                                 var enumerator = windowManagerInterface.getEnumerator(null);
167
168                                                 var w; // set title on all appshell windows
169                                                 while ( w = enumerator.getNext() ) {
170                                                         if (w.document.title.match(/^\d/)) {
171                                                                 w.document.title = 
172                                                                         win.appshell_name_increment() 
173                                                                         + ': ' + data.list.au[0].usrname() 
174                                                                         + '@' + data.ws_name;
175                                                                         + '.' + data.server_unadorned 
176                                                         }
177                                                 }
178                                         } catch(E) {
179                                                 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
180                                         }
181
182                                         params[0] = data.session.key;
183                                         req = obj._request(app,name,params,null,o_params);
184                                 }
185                         }
186                 } catch(E) {
187                         this.error.sdump('D_ERROR',E);
188                 }
189                 return req;
190         },
191         
192         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
193                 try {
194                         var obj = this;
195                         var robj = req.getResultObject();
196                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
197                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
198                                 window.open(
199                                         urls.XUL_AUTH_SIMPLE
200                                         + '?login_type=temp'
201                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
202                                         + '&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),
203                                         'simple_auth' + (new Date()).toString(),
204                                         'chrome,resizable,modal,width=700,height=500'
205                                 );
206                                 JSAN.use('OpenILS.data');
207                                 var data = new OpenILS.data(); data.init({'via':'stash'});
208                                 if (data.temporary_session != '') {
209                                         params[0] = data.temporary_session.key;
210                                         req = obj._request(app,name,params,null,o_params);
211                                 }
212                         }
213                 } catch(E) {
214                         this.error.sdump('D_ERROR',E);
215                 }
216                 return req;
217         },
218
219         'rerequest_on_override' : function (app,name,params,req,o_params) {
220                 var obj = this;
221                 try {
222                         if (!o_params.text) o_params.text = {};
223                         function override(r) {
224                                 try {
225                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
226                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
227                                                 '<groupbox><caption label="Exceptions"/>' + 
228                                                 '<grid><columns><column/><column/></columns><rows>';
229                                         for (var i = 0; i < r.length; i++) {
230                                                 xml += '<row>' + 
231                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
232                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
233                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
234                                         }
235                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
236                                                 '<description>Force this action?</description>' + 
237                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
238                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
239                                         window.open(
240                                                 urls.XUL_FANCY_PROMPT
241                                                 + '?xml=' + window.escape(xml)
242                                                 + '&title=' + window.escape(o_params.title),
243                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
244                                         );
245                                         JSAN.use('OpenILS.data');
246                                         var data = new OpenILS.data(); data.init({'via':'stash'});
247                                         if (data.fancy_prompt_data != '') {
248                                                 req = obj._request(app,name + '.override',params);
249                                         }
250                                         return req;
251                                 } catch(E) {
252                                         alert('in util.network, rerequest_on_override, override:' + E);
253                                 }
254                         }
255
256                         var result = req.getResultObject();
257                         if (!result) return req;
258
259                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
260                                 req = override([result]);
261                         } else {
262                                 var found_good = false; var found_bad = false;
263                                 for (var i = 0; i < result.length; i++) {
264                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
265                                                 found_good = true;
266                                         } else {
267                                                 found_bad = true;
268                                         }
269                                 }
270                                 if (found_good && (!found_bad)) req = override(result);
271                         }
272
273                         return req;
274                 } catch(E) {
275                         throw(E);
276                 }
277         },
278
279
280 }
281
282 /*
283 function sample_callback(request) {
284         var result = request.getResultObject();
285 }
286 */
287
288 dump('exiting util/network.js\n');