1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-08 16:23:49 +03:00

r9131: started adding the server side code for "AJAJ" (asynchronous javascript and javascript)

This is rather like AJAX, but passes around javascript objects between
the client and server, taking advantage of the fact that we have the
same language on both client and server.
This commit is contained in:
Andrew Tridgell
2005-08-05 19:02:01 +00:00
committed by Gerald (Jerry) Carter
parent b3e0baca71
commit 5f9e00fb7f
2 changed files with 195 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
/*
server side js functions for encoding/decoding objects into linear strings
Copyright Andrew Tridgell 2005
released under the GNU GPL Version 2 or later
*/
/*
usage:
enc = encodeObject(obj);
obj = decodeObject(enc);
The encoded format of the object is a string that is safe to
use in URLs
Note that only data elements are encoded, not functions
*/
function __count_members(o) {
var i, count = 0;
for (i in o) {
count++;
}
return count;
}
function __replace(str, old, rep) {
var s = string_init();
var a = s.split(old, str);
var j = s.join(rep, a);
return s.join(rep, a);
}
function encodeObject(o) {
var s = string_init();
var i, r = s.sprintf("%u:", __count_members(o));
for (i in o) {
var t = typeof(o[i]);
if (t == 'object' && o[i] == null) {
t = 'null';
}
if (t == 'object') {
r = s.sprintf("%s%s:%s:%s", r, i, t, encodeObject(o[i]));
} else if (t == "string") {
var enc = s.encodeURIComponent(o[i]);
var rep = __replace(enc, '%', '#');
r = s.sprintf("%s%s:%s:%s:",
r, i, t, __replace(s.encodeURIComponent(o[i]),'%','#'));
} else if (t == "boolean" || t == "number") {
r = s.sprintf("%s%s:%s:%s:", r, i, t, "" + o[i]);
} else if (t == "undefined" || t == "null") {
r = s.sprintf("%s%s:%s:", r, i, t);
} else {
println("Unable to linearise type " + t);
}
}
return r;
}
function decodeObjectArray(a) {
var s = string_init();
var o = new Object();
var i, count = a[a.i]; a.i++;
for (i=0;i<count;i++) {
var name = a[a.i]; a.i++;
var type = a[a.i]; a.i++;
var value;
if (type == 'object') {
o[name] = decodeObjectArray(a);
} else if (type == "string") {
value = s.decodeURIComponent(__replace(a[a.i],'#','%')); a.i++;
o[name] = value;
} else if (type == "boolean") {
value = a[a.i]; a.i++;
if (value == 'true') {
o[name] = true;
} else {
o[name] = false;
}
} else if (type == "undefined") {
o[name] = undefined;
} else if (type == "null") {
o[name] = null;
} else if (type == "number") {
value = a[a.i]; a.i++;
o[name] = value + 0;
} else {
println("Unable to delinearise type " + t);
assert(t == "supported type");
}
}
return o;
}
function decodeObject(str) {
var s = string_init();
var a = s.split(':', str);
a.i = 0;
return decodeObjectArray(a);
}