]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
debugging
[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                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
49                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
50                                                         if (o_params) {
51                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
52                                                         }
53                                                         req = obj.check_for_offline(app,name,params,req,o_params);
54                                                         f(req);
55                                                 } catch(E) {
56                                                         alert(E);
57                                                 }
58                                         }
59                                 );
60                                 request.send(false);
61                                 return null;
62                         } else {
63                                 request.send(true);
64                                 var result = request.getResultObject();
65                                 var json_string = js2JSON(result);
66                                 this.error.sdump('D_SES_RESULT','synced result #' + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) );
67                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
68                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
69                                 if (o_params) {
70                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
71                                 }
72                                 request = obj.check_for_offline(app,name,params,request,o_params);
73                                 return request;
74                         }
75
76                 } catch(E) {
77                         if (instanceOf(E,perm_ex)) {
78                                 alert('permission exception: ' + js2JSON(E));
79                         }
80                         throw(E);
81                 }
82         },
83
84         'check_for_offline' : function (app,name,params,req,o_params) {
85                 var obj = this;
86                 var result = req.getResultObject();
87                 if (result != null) return req;
88
89                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
90                 var proceed = true;
91
92                 while(proceed) {
93
94                         proceed = false;
95
96                         var r;
97
98                         if (data.proceed_offline) {
99
100                                 r = 1;
101
102                         } else {
103                                 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 "' + name + '".','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
104                                 if (r == 1) {
105                                         data.proceed_offline = true; data.stash('proceed_offline');
106                                         dump('Remembering proceed_offline for 200000 ms.\n');
107                                         setTimeout(
108                                                 function() {
109                                                         data.proceed_offline = false; data.stash('proceed_offline');
110                                                         dump('Setting proceed_offline back to false.\n');
111                                                 }, 200000
112                                         );
113                                 }
114                         }
115
116                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
117
118                         switch(r) {
119                                 case 0: 
120                                         req = obj._request(app,name,params,null,o_params);
121                                         if (req.getResultObject() == null) proceed = true;
122                                         return req;
123                                 break;
124                                 case 1: 
125                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
126                                 break;
127                         }
128                 }
129         },
130
131         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
132                 try {
133                         var obj = this;
134                         var robj = req.getResultObject();
135                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
136                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
137                                 window.open(
138                                         urls.XUL_AUTH_SIMPLE
139                                         + '?login_type=staff'
140                                         + '&desc_brief=' + window.escape('Your session has expired')
141                                         + '&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),
142                                         'simple_auth' + (new Date()).toString(),
143                                         'chrome,resizable,modal,width=700,height=500'
144                                 );
145                                 JSAN.use('OpenILS.data');
146                                 var data = new OpenILS.data(); data.init({'via':'stash'});
147                                 if (data.temporary_session != '') {
148                                         data.session.key = data.temporary_session.key; 
149                                         data.session.authtime = data.temporary_session.authtime; 
150                                         data.stash('session');
151                                         params[0] = data.session.key;
152                                         req = obj._request(app,name,params,null,o_params);
153                                 }
154                         }
155                 } catch(E) {
156                         this.error.sdump('D_ERROR',E);
157                 }
158                 return req;
159         },
160         
161         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
162                 try {
163                         var obj = this;
164                         var robj = req.getResultObject();
165                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
166                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
167                                 window.open(
168                                         urls.XUL_AUTH_SIMPLE
169                                         + '?login_type=temp'
170                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
171                                         + '&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),
172                                         'simple_auth' + (new Date()).toString(),
173                                         'chrome,resizable,modal,width=700,height=500'
174                                 );
175                                 JSAN.use('OpenILS.data');
176                                 var data = new OpenILS.data(); data.init({'via':'stash'});
177                                 if (data.temporary_session != '') {
178                                         params[0] = data.temporary_session.key;
179                                         req = obj._request(app,name,params,null,o_params);
180                                 }
181                         }
182                 } catch(E) {
183                         this.error.sdump('D_ERROR',E);
184                 }
185                 return req;
186         },
187
188         'rerequest_on_override' : function (app,name,params,req,o_params) {
189                 var obj = this;
190                 try {
191                         if (!o_params.text) o_params.text = {};
192                         function override(r) {
193                                 try {
194                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
195                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
196                                                 '<groupbox><caption label="Exceptions"/>' + 
197                                                 '<grid><columns><column/><column/></columns><rows>';
198                                         for (var i = 0; i < r.length; i++) {
199                                                 xml += '<row>' + 
200                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
201                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
202                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
203                                         }
204                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
205                                                 '<description>Force this action?</description>' + 
206                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
207                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
208                                         window.open(
209                                                 urls.XUL_FANCY_PROMPT
210                                                 + '?xml=' + window.escape(xml)
211                                                 + '&title=' + window.escape(o_params.title),
212                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
213                                         );
214                                         JSAN.use('OpenILS.data');
215                                         var data = new OpenILS.data(); data.init({'via':'stash'});
216                                         if (data.fancy_prompt_data != '') {
217                                                 req = obj._request(app,name + '.override',params);
218                                         }
219                                         return req;
220                                 } catch(E) {
221                                         alert(E);
222                                 }
223                         }
224
225                         var result = req.getResultObject();
226                         if (!result) return req;
227
228                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
229                                 req = override([result]);
230                         } else {
231                                 var found_good = false; var found_bad = false;
232                                 for (var i = 0; i < result.length; i++) {
233                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
234                                                 found_good = true;
235                                         } else {
236                                                 found_bad = true;
237                                         }
238                                 }
239                                 if (found_good && (!found_bad)) req = override(result);
240                         }
241
242                         return req;
243                 } catch(E) {
244                         throw(E);
245                 }
246         },
247
248
249 }
250
251 /*
252 function sample_callback(request) {
253         var result = request.getResultObject();
254 }
255 */
256
257 dump('exiting util/network.js\n');