r8635: make object inheritance with the builtin objects easy by allowing
authorAndrew Tridgell <tridge@samba.org>
Wed, 20 Jul 2005 06:20:36 +0000 (06:20 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:29:47 +0000 (13:29 -0500)
callers to optionally supply an existing object to add the properties
to. So you can do:

 var rpc = samr_init();
 lsa_init(rpc);

and you end up with 'rpc' having both the samr and lsa functions and
constants available.
(This used to be commit 6a1ed328e27769bd52899fc2437a43fc17104eff)

source4/build/pidl/Parse/Pidl/Samba/EJS.pm
source4/scripting/ejs/mprutil.c
source4/scripting/ejs/smbcalls_ldb.c
source4/scripting/ejs/smbcalls_nss.c
source4/scripting/ejs/smbcalls_sys.c

index 0aa8de7c93dacc0d6f653766974b1cc5568ea44a..370db6d0e44f163023e06785ca01e9bcafdd1d22 100644 (file)
@@ -692,19 +692,18 @@ sub EjsInterface($$)
        pidl "static int ejs_$name\_init(int eid, int argc, struct MprVar **argv)";
        pidl "{";
        indent;
-       pidl "struct MprVar obj = mprObject(\"$name\");";
+       pidl "struct MprVar *obj = mprInitObject(eid, \"$name\", argc, argv);";
        foreach (@fns) {
-               pidl "mprSetCFunction(&obj, \"$_\", ejs_$_);";
+               pidl "mprSetCFunction(obj, \"$_\", ejs_$_);";
        }
        foreach my $v (keys %constants) {
                my $value = $constants{$v};
                if (substr($value, 0, 1) eq "\"") {
-                       pidl "mprSetVar(&obj, \"$v\", mprString($value));";
+                       pidl "mprSetVar(obj, \"$v\", mprString($value));";
                } else {
-                       pidl "mprSetVar(&obj, \"$v\", mprCreateNumberVar($value));";
+                       pidl "mprSetVar(obj, \"$v\", mprCreateNumberVar($value));";
                }
        }
-       pidl "mpr_Return(eid, obj);";
        pidl "return 0;";
        deindent;
        pidl "}\n";
index f9813f259762b97c22dd10e37989a24ed451a080..14d120c45aa1c4c986a23a731564e26cfaa58411 100644 (file)
@@ -403,3 +403,17 @@ void mprSetThisPtr(int eid, const char *name, void *ptr)
        struct MprVar *this = mprGetProperty(ejsGetLocalObject(eid), "this", 0);
        mprSetPtrChild(this, name, ptr);
 }
+
+/*
+  used by object xxx_init() routines to allow for the caller
+  to supply a pre-existing object to add properties to,
+  or create a new object. This makes inheritance easy
+*/
+struct MprVar *mprInitObject(int eid, const char *name, int argc, struct MprVar **argv)
+{
+       if (argc > 0 && mprVarIsObject(argv[0]->type)) {
+               return argv[0];
+       }
+       mpr_Return(eid, mprObject(name));
+       return ejsGetReturnValue(eid);
+}
index 0795db9018acfb44ebf16d602970784fb34973fc..f09039731ff9924cb7552212bfce3dd8aae4836a 100644 (file)
@@ -273,7 +273,7 @@ static int ejs_ldbConnect(MprVarHandle eid, int argc, char **argv)
 
        dbfile = argv[0];
 
-       ldb = ldb_wrap_connect(mprMemCtx(), dbfile, 0, argv+1);
+       ldb = ldb_wrap_connect(mprMemCtx(), dbfile, 0, (const char **)(argv+1));
        if (ldb == NULL) {
                ejsSetErrorMsg(eid, "ldb.connect failed to open %s", dbfile);
        }
@@ -289,10 +289,7 @@ static int ejs_ldbConnect(MprVarHandle eid, int argc, char **argv)
 */
 static int ejs_ldb_init(MprVarHandle eid, int argc, struct MprVar **argv)
 {
-       struct MprVar *ldb;
-       mpr_Return(eid, mprObject("ldb"));
-
-       ldb  = ejsGetReturnValue(eid);
+       struct MprVar *ldb = mprInitObject(eid, "ldb", argc, argv);
 
        mprSetStringCFunction(ldb, "connect", ejs_ldbConnect);
        mprSetCFunction(ldb, "search", ejs_ldbSearch);
index a804c14b7f4382785627ef35290bd363d32cebe0..6111ed57c25f8a87585f2c2ae5bbed847cb86cb8 100644 (file)
@@ -141,10 +141,7 @@ static int ejs_getgrgid(MprVarHandle eid, int argc, struct MprVar **argv)
 */
 static int ejs_nss_init(MprVarHandle eid, int argc, struct MprVar **argv)
 {
-       struct MprVar *nss;
-       mpr_Return(eid, mprObject("nss"));
-
-       nss  = ejsGetReturnValue(eid);
+       struct MprVar *nss = mprInitObject(eid, "nss", argc, argv);
 
        mprSetCFunction(nss, "getpwnam", ejs_getpwnam);
        mprSetCFunction(nss, "getpwuid", ejs_getpwuid);
index b1fb854dfb867722eff0863269bb15be3f08ce68..61b89843dcf69372f3e49c5502fa2348b1434266 100644 (file)
@@ -193,19 +193,18 @@ static int ejs_sys_file_save(MprVarHandle eid, int argc, char **argv)
 */
 static int ejs_sys_init(MprVarHandle eid, int argc, struct MprVar **argv)
 {
-       struct MprVar obj = mprObject("sys");
-
-       mprSetCFunction(&obj, "interfaces", ejs_sys_interfaces);
-       mprSetCFunction(&obj, "hostname", ejs_sys_hostname);
-       mprSetCFunction(&obj, "nttime", ejs_sys_nttime);
-       mprSetCFunction(&obj, "gmtime", ejs_sys_gmtime);
-       mprSetCFunction(&obj, "ldaptime", ejs_sys_ldaptime);
-       mprSetCFunction(&obj, "httptime", ejs_sys_httptime);
-       mprSetStringCFunction(&obj, "unlink", ejs_sys_unlink);
-       mprSetStringCFunction(&obj, "file_load", ejs_sys_file_load);
-       mprSetStringCFunction(&obj, "file_save", ejs_sys_file_save);
-
-       mpr_Return(eid, obj);
+       struct MprVar *obj = mprInitObject(eid, "sys", argc, argv);
+
+       mprSetCFunction(obj, "interfaces", ejs_sys_interfaces);
+       mprSetCFunction(obj, "hostname", ejs_sys_hostname);
+       mprSetCFunction(obj, "nttime", ejs_sys_nttime);
+       mprSetCFunction(obj, "gmtime", ejs_sys_gmtime);
+       mprSetCFunction(obj, "ldaptime", ejs_sys_ldaptime);
+       mprSetCFunction(obj, "httptime", ejs_sys_httptime);
+       mprSetStringCFunction(obj, "unlink", ejs_sys_unlink);
+       mprSetStringCFunction(obj, "file_load", ejs_sys_file_load);
+       mprSetStringCFunction(obj, "file_save", ejs_sys_file_save);
+
        return 0;
 }