r9131: started adding the server side code for "AJAJ" (asynchronous javascript and...
[kai/samba.git] / source4 / scripting / libjs / server_call.js
1 /*
2         server side js functions for handling async calls from js clients
3
4         Copyright Andrew Tridgell 2005
5         released under the GNU GPL Version 2 or later
6 */
7
8 libinclude("encoder.js");
9
10 /*
11   a remote printf, for displaying stuff on smbd stdout
12 */
13 function __server_printf()
14 {
15         print(vsprintf(arguments));
16         return undefined;
17 }
18
19 /*
20   register a new call
21 */
22 function __register_call(name, func)
23 {
24         var c = this;
25         c.calls[name] = func;
26 }
27
28 /*
29   run a call sent from the client, and output the returned object (if any)
30 */
31 function __run_call() {
32         var c = this;
33         var name = form['func'];
34         if (name == undefined) {
35                 println("no function name given in run_call");
36                 return;
37         }
38         var args = form['args'];
39         if (args == undefined) {
40                 println("no function arguments given in run_call");
41                 return;
42         }
43         args = decodeObject(args);
44         if (c.calls[name] == undefined) {
45                 println("undefined remote call " + name);
46                 return;
47         }
48         var f = c.calls[name];
49         var res;
50         /* oh what a hack - should write a varargs ejs helper */
51         if (args.length == 0) {
52                 res = f();
53         } else if (args.length == 1) {
54                 res = f(args[0]);
55         } else if (args.length == 2) {
56                 res = f(args[0], args[1]);
57         } else if (args.length == 3) {
58                 res = f(args[0], args[1], args[2]);
59         } else if (args.length == 4) {
60                 res = f(args[0], args[1], args[2], args[3]);
61         } else if (args.length == 5) {
62                 res = f(args[0], args[1], args[2], args[3], args[4]);
63         } else if (args.length == 6) {
64                 res = f(args[0], args[1], args[2], args[3], args[4], args[5]);
65         } else if (args.length == 7) {
66                 res = f(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
67         } else if (args.length == 8) {
68                 res = f(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
69         } else {
70                 println("too many arguments for remote call: " + name);
71                 return;
72         }
73         var repobj = new Object();
74         repobj.res = res;
75         write(encodeObject(repobj));
76 }
77
78
79
80 /*
81   initialise a server call object
82 */
83 function servCallObj()
84 {
85         var c = new Object();
86         c.add = __register_call;
87         c.run = __run_call;
88         c.calls = new Object();
89
90         /* add some basic calls */
91         c.add('printf', __server_printf);
92
93         return c;
94 }
95