]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
missed this way back when. fix multiple event override handling (for ilsevent lackin...
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 var offlineStrings;
5
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
8
9     try {
10
11         JSAN.use('util.error'); this.error = new util.error();
12         JSAN.use('util.sound'); this.sound = new util.sound();
13
14         offlineStrings = document.getElementById('offlineStrings');
15
16     } catch(E) {
17         alert('error in util.network constructor: ' + E);
18         throw(E);
19     }
20
21     return this;
22 };
23
24 util.network.prototype = {
25
26     'link_id' : 0,
27
28     'network_timeout' : 55, /* seconds */
29
30     'NETWORK_FAILURE' : null,
31
32     'simple_request' : function(method_id,params,f,override_params) {
33         //var obj = this;
34         //var sparams = js2JSON(params);
35         //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
36         //    '\noverride_params = ' + override_params + '\n');
37         if (typeof api[method_id] == 'undefined') {
38             throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
39         }
40         var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
41         return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
42     },
43
44     'get_result' : function (req) {
45         var obj = this;
46         var result;
47         var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') }; 
48         try {
49             if (req.cancelled) {
50                 result = fake_ilsevent_for_network_errors;
51             } else {
52                 result = req.getResultObject();    
53             }
54         } catch(E) {
55             try {
56                 if (instanceOf(E, NetworkFailure)) {
57                     obj.NETWORK_FAILURE = E;
58                 } else {
59                     try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
60                 }
61             } catch(I) { 
62                 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
63             }
64             result = fake_ilsevent_for_network_errors;
65         }
66         return result;
67     },
68
69     'request' : function (app,name,params,f,override_params,_params) {
70
71         var obj = this;
72         
73         //var sparams = js2JSON(params);
74         //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
75         //    '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
76
77         try { 
78
79             var request =  this._request(app,name,params,f,override_params,_params);
80             if (request) {
81                 return this.get_result(request);
82             } else {
83                 return null;
84             }
85     
86         } catch(E) {
87             alert('1: ' + E); 
88         }
89     },
90
91     '_request' : function (app,name,params,f,override_params,_params) {
92         var obj = this;
93         try {
94             var sparams = js2JSON(params);
95             obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
96                 '\noverride_params = ' + override_params + '\n_params = ' + _params +
97                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
98                 '\nlocation.href = ' + location.href );
99
100             if (document.getElementById('network_progress')) {
101                 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
102             } else if (typeof xulG != 'undefined') {
103                 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
104             }
105
106             var request = new RemoteRequest( app, name );
107             if (_params && _params.secure) {
108                 request.setSecure(true);
109             } else {
110                 request.setSecure(false);
111             }
112             for(var index in params) {
113                 request.addParam(params[index]);
114             }
115
116             var start_timer = (new Date).getTime();    
117             if (f)  {
118                 request.setCompleteCallback(
119                     function(req) {
120                         try {
121                             var duration = ( (new Date).getTime() - start_timer )/1000;
122                             if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
123
124                             if (document.getElementById('network_progress')) {
125                                 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
126                             } else if (typeof xulG != 'undefined') {
127                                 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
128                             }
129
130                             var json_string = js2JSON(obj.get_result(req));
131                             obj.error.sdump('D_SES_RESULT','asynced result #' 
132                                 + obj.link_id + '\n\n' 
133                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
134                                 + '\n\nOriginal Request:\n\n' 
135                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
136                             obj.play_sounds( request );
137                             req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
138                             req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
139                             if (override_params) {
140                                 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
141                             }
142                             req = obj.check_for_offline(app,name,params,req,override_params,_params);
143                             f(req);
144                             obj.NETWORK_FAILURE = null;
145                         } catch(E) {
146                             try {
147                                 E.ilsevent = -2;
148                                 E.textcode = offlineStrings.getString('network.server_or_method.error');
149                             } catch(F) {}
150                             f( { 'getResultObject' : function() { return E; } } );
151                         }
152                     }
153                 );
154                 try {
155                     request.send(false);
156                 } catch(E) {
157                     throw(E);
158                 }
159                 return null;
160             } else {
161                 try {
162                     request.send(true);
163                     var duration = ( (new Date).getTime() - start_timer )/1000;
164                     if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
165
166                     if (document.getElementById('network_progress')) {
167                         if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
168                     } else if (typeof xulG != 'undefined') {
169                         if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
170                     }
171
172                 } catch(E) {
173                     throw(E);
174                 }
175                 var result = obj.get_result(request);
176                 var json_string = js2JSON(result);
177                 this.error.sdump('D_SES_RESULT','synced result #' 
178                     + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
179                     + '\n\nOriginal Request:\n\n' 
180                     + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
181                 obj.play_sounds( request );
182                 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
183                 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
184                 if (override_params) {
185                     request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
186                 }
187                 request = obj.check_for_offline(app,name,params,request,override_params,_params);
188                 obj.NETWORK_FAILURE = null;
189                 return request;
190             }
191
192         } catch(E) {
193             alert('2: ' + E);
194             if (instanceOf(E,perm_ex)) {
195                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
196             }
197             throw(E);
198         }
199     },
200
201     'check_for_offline' : function (app,name,params,req,override_params,_params) {
202         try {
203             var obj = this;
204             var result = obj.get_result(req);
205             if (result == null) return req;
206             if (typeof result.ilsevent == 'undefined') return req;
207             if (result.ilsevent != -1) return req;
208
209             JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
210             var proceed = true;
211
212             while(proceed) {
213
214                 proceed = false;
215
216                 var r;
217
218                 if (data.proceed_offline) {
219
220                     r = 1;
221
222                 } else {
223
224                     var network_failure_string;
225                     var network_failure_status_string;
226                     var msg;
227
228                     try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
229                     try { network_failure_status_string = typeof obj.NETWORK_FAILURE == 'object' && typeof obj.NETWORK_FAILURE != 'null' && typeof obj.NETWORK_FAILURE.status == 'function' ? obj.NETWORK_FAILURE.status() : ''; } catch(E) { network_failure_status_string = ''; obj.error.sdump('D_ERROR', 'setting network_failure_status_string: ' + E); }
230                     
231                     try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
232                                 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' + 
233                                 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' + 
234                                 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' + 
235                                 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
236                     } catch(E) { msg = E; }
237
238                     try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
239
240                     r = obj.error.yns_alert(
241                         msg,
242                         offlineStrings.getString('network.network_failure'),
243                         offlineStrings.getString('network.retry_network'),
244                         offlineStrings.getString('network.ignore_errors'),
245                         null,
246                         offlineStrings.getString('common.confirm')
247                     );
248                     if (r == 1) {
249                         data.proceed_offline = true; data.stash('proceed_offline');
250                         dump('Remembering proceed_offline for 200000 ms.\n');
251                         setTimeout(
252                             function() {
253                                 data.proceed_offline = false; data.stash('proceed_offline');
254                                 dump('Setting proceed_offline back to false.\n');
255                             }, 200000
256                         );
257                     }
258                 }
259
260                 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
261
262                 switch(r) {
263                     case 0: 
264                         req = obj._request(app,name,params,null,override_params,_params);
265                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
266                         return req;
267                     break;
268
269                     case 1: 
270                         return req;
271                     break;
272                 }
273             }
274         } catch(E) {
275             alert('4: ' + E);
276             throw(E);
277         }
278     },
279
280     'reset_titlebars' : function(data) {
281         var obj = this;
282         data.stash_retrieve();
283         try {
284             JSAN.use('util.window'); var win =  new util.window();
285             var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
286             var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
287             var enumerator = windowManagerInterface.getEnumerator(null);
288
289             var w; // set title on all appshell windows
290             while ( w = enumerator.getNext() ) {
291                 if (w.document.title.match(/^\d/)) {
292                     w.document.title = 
293                         win.appshell_name_increment() 
294                         + ': ' + data.list.au[0].usrname() 
295                         + '@' + data.ws_name;
296                         + '.' + data.server_unadorned 
297                 }
298             }
299         } catch(E) {
300             obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
301         }
302     },
303
304     'set_user_status' : function() {
305         data.stash_retrieve();
306         try {
307             var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
308             var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
309             var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
310             var offlinestrings;
311             var enumerator = windowManagerInterface.getEnumerator('eg_menu');
312
313             var w;
314             var x;
315             while ( w = enumerator.getNext() ) {
316                 x = w.document.getElementById('oc_menuitem');
317
318                 if(!offlinestrings) w.document.getElementById('offlineStrings');
319                 if(permlist) w.g.menu.set_menu_access(permlist);
320                 if(data.list.au.length > 1) {
321                     addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
322                     x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
323                 }
324                 else {
325                     removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
326                     x.setAttribute('label', x.getAttribute('label_orig'));
327                 }
328             }
329         } catch(E) {
330             obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
331         }
332     },
333
334     'get_new_session' : function(name,xulG,text) {
335         var obj = this;
336         try {
337
338         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
339         var url = urls.XUL_AUTH_SIMPLE;
340         if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
341         JSAN.use('util.window'); var win = new util.window();
342         var my_xulG = win.open(
343             url,
344             //+ '?login_type=staff'
345             //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
346             //+ '&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.'),
347             //'simple_auth' + (new Date()).toString(),
348             offlineStrings.getString('network.new_session.authorize'),
349             'chrome,resizable,modal,width=700,height=500',
350             {
351                 'login_type' : 'staff',
352                 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
353                 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
354                 //'simple_auth' : (new Date()).toString(),
355             }
356         );
357         JSAN.use('OpenILS.data');
358         var data = new OpenILS.data(); data.init({'via':'stash'});
359         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
360             data.session.key = data.temporary_session.key; 
361             data.session.authtime = data.temporary_session.authtime; 
362             data.stash('session');
363             try {
364                 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
365                 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
366                 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
367                 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
368
369                 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
370                 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
371
372             } catch(E) {
373                 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
374             }
375             if (! data.list.au ) data.list.au = [];
376             data.list.au[0] = JSON2js( data.temporary_session.usr );
377             data.stash('list');
378             obj.reset_titlebars(data);
379             return true;
380         } else {
381             obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
382         }
383         return false;
384
385         } catch(E) {
386             obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
387         }
388     },
389
390     'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
391         try {
392             var obj = this;
393             var robj = obj.get_result(req);
394             if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
395
396                 if (obj.get_new_session(name,undefined,true)) {
397                     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
398                     params[0] = data.session.key;
399                     req = obj._request(app,name,params,null,override_params,_params);
400                 }
401             }
402         } catch(E) {
403             this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
404         }
405         return req;
406     },
407     
408     'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
409         try {
410             var obj = this;
411             var robj = obj.get_result(req);
412             if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
413                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
414                 if (location.href.match(/^chrome/)) {
415                     //alert('Permission denied.');
416                 } else {
417                     JSAN.use('util.window'); var win = new util.window();
418                     var my_xulG = win.open(
419                         urls.XUL_AUTH_SIMPLE,
420                         //+ '?login_type=temp'
421                         //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
422                         //+ '&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),
423                         //'simple_auth' + (new Date()).toString(),
424                         offlineStrings.getFormattedString('network.permission.authorize'),
425                         'chrome,resizable,modal,width=700,height=500',
426                         {
427                             'login_type' : 'temp',
428                             'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
429                             'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
430                             //'simple_auth' : (new Date()).toString(),
431                         }
432                     );
433                     JSAN.use('OpenILS.data');
434                     //var data = new OpenILS.data(); data.init({'via':'stash'});
435                     if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
436                         params[0] = my_xulG.temporary_session.key;
437                         req = obj._request(app,name,params,null,override_params,_params);
438                     }
439                 }
440             }
441         } catch(E) {
442             this.error.sdump('D_ERROR',E);
443         }
444         return req;
445     },
446
447     'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
448         var obj = this;
449         try {
450             if (!override_params.text) override_params.text = {};
451             if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
452             function override(r) {
453                 try {
454                     // test to see if we can suppress this dialog and auto-override
455                     var auto_override = false;
456                     if (override_params.auto_override_these_events.length > 0) {
457                         auto_override = true;
458                         for (var i = 0; i < r.length; i++) {
459                             if ( 
460                                 (typeof r[i].ilsevent != 'undefined') && 
461                                 (
462                                     (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
463                                     (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1) 
464                                 )
465                             ) {
466                                 // so far so good
467                             } else {
468                                 // showstopper
469                                 auto_override = false;
470                             }
471                         }
472                     }
473                     if (auto_override) {
474                         obj.sound.bad();
475                         req = obj._request(app,name + '.override',params);
476                         return req;
477                     }
478
479                     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
480                     var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
481                         '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' + 
482                         '<grid><columns><column/><column/></columns><rows>';
483                     for (var i = 0; i < r.length; i++) {
484                         var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
485                         var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
486                         var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
487                         var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
488                         xml += '<row>' + 
489                             '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
490                             '<description>' + t3 + '</description>' + 
491                             '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
492                     }
493                     xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' + 
494                         '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' + 
495                         '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' + 
496                         '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
497                     //JSAN.use('OpenILS.data');
498                     //var data = new OpenILS.data(); data.init({'via':'stash'});
499                     //data.temp_override_xml = xml; data.stash('temp_override_xml');
500                     JSAN.use('util.window'); var win = new util.window();
501                     var fancy_prompt_data = win.open(
502                         urls.XUL_FANCY_PROMPT,
503                         //+ '?xml_in_stash=temp_override_xml'
504                         //+ '&title=' + window.escape(override_params.title),
505                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
506                         { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
507                     );
508                     if (fancy_prompt_data.fancy_status == 'complete') {
509                         req = obj._request(app,name + '.override',params);
510                     }
511                     return req;
512                 } catch(E) {
513                     alert('in util.network, rerequest_on_override, override:' + E);
514                 }
515             }
516
517             var result = obj.get_result(req);
518             if (!result) return req;
519
520             if ( 
521                 (typeof result.ilsevent != 'undefined') && 
522                 (
523                     (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
524                     (override_params.overridable_events.indexOf( result.textcode ) != -1)
525                 )
526             ) {
527                 req = override([result]);
528             } else {
529                 var found_good = false; var found_bad = false;
530                 for (var i = 0; i < result.length; i++) {
531                     if ( 
532                         (typeof result[i].ilsevent != 'undefined') && 
533                         (
534                             (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
535                             (override_params.overridable_events.indexOf( result[i].textcode ) != -1) 
536                         )
537                     ) {
538                         found_good = true;
539                     } else {
540                         found_bad = true;
541                     }
542                 }
543                 if (found_good && (!found_bad)) req = override(result);
544             }
545
546             return req;
547         } catch(E) {
548             throw(E);
549         }
550     },
551
552     'ping' : function() {
553         try {
554             JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
555             var file = new util.file('ping.bat');
556             var path = file._file.path;
557             file.write_content('truncate+exec',
558                 '#!/bin/sh\n' +
559                 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
560                 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n'  /* unix */
561             );
562             file.close();
563             file = new util.file('ping.bat');
564
565             var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
566             process.init(file._file);
567
568             var args = [];
569
570             dump('process.run = ' + process.run(true, args, args.length) + '\n');
571
572             file.close();
573
574             var file = new util.file('ping.bat.txt');
575             var output = file.get_content();
576             file.close();
577
578             return output;
579         } catch(E) {
580             alert(E);
581         }
582     },
583
584     'play_sounds' : function(req) {
585         var obj = this;
586         try {
587             var result = req.getResultObject();
588             if (result == null) { return; }
589             if (typeof result.textcode != 'undefined') {
590                 obj.sound.event( result );
591             } else {
592                 if (typeof result.length != 'undefined') {
593                     for (var i = 0; i < result.length; i++) {
594                         if (typeof result[i].textcode != 'undefined') {
595                             obj.sound.event( result[i] );
596                         }
597                     }
598                 }
599             }
600         } catch(E) {
601             dump('Error in network.js, play_sounds() : ' + E + '\n');
602         }
603     }
604 }
605
606 /*
607 function sample_callback(request) {
608     var result = request.getResultObject();
609 }
610 */
611
612 dump('exiting util/network.js\n');