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