r9227: cleanup and simplify the AJAJ code
[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   register a new call
12 */
13 function __register_call(name, func)
14 {
15         var c = this;
16         c.calls[name] = func;
17 }
18
19 /*
20   run a call sent from the client, and output the returned object (if any)
21 */
22 function __run_call() {
23         var c = this;
24         var name = form['ajaj_func'];
25         if (name == undefined) {
26                 /* no function to run */
27                 return;
28         }
29         var args = form['ajaj_args'];
30         if (args == undefined) {
31                 println("no function arguments given in run_call");
32                 exit(0);
33         }
34         args = decodeObject(args);
35         if (c.calls[name] == undefined) {
36                 println("undefined remote call " + name);
37                 exit(0);
38         }
39         var f = c.calls[name];
40         var res;
41         /* oh what a hack - should write a varargs ejs helper */
42         if (args.length == 0) {
43                 res = f();
44         } else if (args.length == 1) {
45                 res = f(args[0]);
46         } else if (args.length == 2) {
47                 res = f(args[0], args[1]);
48         } else if (args.length == 3) {
49                 res = f(args[0], args[1], args[2]);
50         } else if (args.length == 4) {
51                 res = f(args[0], args[1], args[2], args[3]);
52         } else if (args.length == 5) {
53                 res = f(args[0], args[1], args[2], args[3], args[4]);
54         } else if (args.length == 6) {
55                 res = f(args[0], args[1], args[2], args[3], args[4], args[5]);
56         } else if (args.length == 7) {
57                 res = f(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
58         } else if (args.length == 8) {
59                 res = f(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
60         } else {
61                 println("too many arguments for remote call: " + name);
62                 exit(0);
63         }
64         var repobj = new Object();
65         repobj.res = res;
66         write(encodeObject(repobj));
67         exit(0);
68 }
69
70
71
72 /*
73   initialise a server call object
74 */
75 function servCallObj()
76 {
77         var c = new Object();
78         c.add = __register_call;
79         c.run = __run_call;
80         c.calls = new Object();
81         return c;
82 }
83