r9174: ejs does not include the special variable 'length' in for loops over objects,
[samba.git] / source / scripting / libjs / encoder.js
index 65b2854d3066aef6a3d3f23083f23bd24bd6ed2b..24508f3f6b15d2a17455ec3f3594dbf3cf3d62fc 100644 (file)
@@ -21,6 +21,9 @@ function __count_members(o) {
        for (i in o) { 
                count++;  
        }
+       if (o.length != undefined) {
+               count++;
+       }
        return count;
 }
 
@@ -31,28 +34,39 @@ function __replace(str, old, rep) {
        return s.join(rep, a);
 }
 
+function encodeElement(e, name) {
+       var t = typeof(e);
+       var r;
+       var s = string_init();
+       if (t == 'object' && e == null) {
+               t = 'null';
+       }
+       if (t == 'object') {
+               r = s.sprintf("%s:%s:%s", name, t, encodeObject(e));
+       } else if (t == "string") {
+               var enc = s.encodeURIComponent(e);
+               var rep = __replace(enc, '%', '#');
+               r = s.sprintf("%s:%s:%s:", 
+                             name, t, __replace(s.encodeURIComponent(e),'%','#'));
+       } else if (t == "boolean" || t == "number") {
+               r = s.sprintf("%s:%s:%s:", name, t, "" + e);
+       } else if (t == "undefined" || t == "null") {
+               r = s.sprintf("%s:%s:", name, t);
+       } else {
+               println("Unable to linearise type " + t);
+               r = "";
+       }
+       return r;
+}
+
 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);
-               }
+               r = r + encodeElement(o[i], i);
+       }
+       if (o.length != undefined) {
+               r = r + encodeElement(o.length, 'length');
        }
        return r;
 }