r8216: - handle union pull in ejs pidl generation
authorAndrew Tridgell <tridge@samba.org>
Fri, 8 Jul 2005 04:07:26 +0000 (04:07 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:20 +0000 (13:19 -0500)
- added debugging calls for missing structure/union elements
(This used to be commit f3ff48204cb8edeb9f42afbbefe13f7d49305506)

source4/build/pidl/ejs.pm
source4/scripting/ejs/ejsrpc.c

index 1b5c34510cb91394babafc55829119c28f1dba15..3fe9579abaa0dd2adcaf029a93079da1f8c9d647 100644 (file)
@@ -193,10 +193,26 @@ sub EjsUnionPull($$)
 {
        my $name = shift;
        my $d = shift;
+       my $have_default = 0;
        my $env = GenerateStructEnv($d);
        pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)\n{\n";
-       pidl "return ejs_panic(ejs, \"union pull not handled\");\n";
-       pidl "}\n\n";
+       pidl "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, name));\n";
+       pidl "switch (ejs->switch_var) {\n";
+       foreach my $e (@{$d->{ELEMENTS}}) {
+               if ($e->{CASE} eq "default") {
+                       $have_default = 1;
+               }
+               pidl "$e->{CASE}:";
+               if ($e->{TYPE} ne "EMPTY") {
+                       EjsPullElementTop($e, $env);
+               }
+               pidl "break;\n";
+       }
+       if (! $have_default) {
+               pidl "default:";
+               pidl "\treturn ejs_panic(ejs, \"Bad switch value\");";
+       }
+       pidl "}\nreturn NT_STATUS_OK;\n}\n";
 }
 
 ###########################
@@ -368,6 +384,7 @@ sub EjsUnionPush($$)
        my $have_default = 0;
        my $env = GenerateStructEnv($d);
        pidl "\nstatic NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const union $name *r)\n{\n";
+       pidl "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n";
        pidl "switch (ejs->switch_var) {\n";
        foreach my $e (@{$d->{ELEMENTS}}) {
                if ($e->{CASE} eq "default") {
index 574c75b7de9b5301ce68e4fa2e49efcf945e5b44..19c1a2fc8d81df52377325cbee57acf92cb5de6d 100644 (file)
@@ -100,6 +100,7 @@ static NTSTATUS mprSetVar(struct MprVar *v, const char *name, struct MprVar val)
        if (p == NULL) {
                v2 = mprSetProperty(v, name, &val);
                if (v2 == NULL) {
+                       DEBUG(1,("mprSetVar unable to set '%s'\n", name));
                        return NT_STATUS_INVALID_PARAMETER_MIX;
                }
                return NT_STATUS_OK;
@@ -126,6 +127,7 @@ NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const cha
 {
        *v = mprGetProperty(*v, name, NULL);
        if (*v == NULL) {
+               DEBUG(1,("ejs_pull_struct_start: missing structure '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER;
        }
        return NT_STATUS_OK;
@@ -140,6 +142,7 @@ NTSTATUS ejs_push_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const cha
        struct MprVar s = mprCreateObjVar(name, MPR_DEFAULT_HASH_SIZE);
        *v = mprSetProperty(*v, name, &s);
        if (*v == NULL) {
+               DEBUG(1,("ejs_push_struct_start: unable to set structure '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER;
        }
        return NT_STATUS_OK;
@@ -154,6 +157,7 @@ NTSTATUS ejs_pull_uint8(struct ejs_rpc *ejs,
        struct MprVar *var;
        var = mprGetVar(v, name);
        if (var == NULL) {
+               DEBUG(1,("ejs_pull_uint8: unable to find '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER_MIX;
        }
        *r = mprVarToInteger(var);
@@ -176,6 +180,7 @@ NTSTATUS ejs_pull_uint16(struct ejs_rpc *ejs,
        struct MprVar *var;
        var = mprGetVar(v, name);
        if (var == NULL) {
+               DEBUG(1,("ejs_pull_uint16: unable to find '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER_MIX;
        }
        *r = mprVarToInteger(var);
@@ -198,6 +203,7 @@ NTSTATUS ejs_pull_uint32(struct ejs_rpc *ejs,
        struct MprVar *var;
        var = mprGetVar(v, name);
        if (var == NULL) {
+               DEBUG(1,("ejs_push_uint32: unable to find '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER_MIX;
        }
        *r = mprVarToInteger(var);
@@ -216,6 +222,7 @@ NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs,
        struct MprVar *var;
        var = mprGetVar(v, name);
        if (var == NULL) {
+               DEBUG(1,("ejs_pull_hyper: unable to find '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER_MIX;
        }
        *r = mprVarToInteger(var);
@@ -239,6 +246,7 @@ NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs,
        struct MprVar *var;
        var = mprGetVar(v, name);
        if (var == NULL) {
+               DEBUG(1,("ejs_pull_enum: unable to find '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER_MIX;
        }
        *r = mprVarToInteger(var);
@@ -262,6 +270,7 @@ NTSTATUS ejs_pull_string(struct ejs_rpc *ejs,
        struct MprVar *var;
        var = mprGetVar(v, name);
        if (var == NULL) {
+               DEBUG(1,("ejs_pull_string: unable to find '%s'\n", name));
                return NT_STATUS_INVALID_PARAMETER_MIX;
        }
        *s = mprToString(var);