summaryrefslogtreecommitdiff
path: root/source4/build/pidl/swig.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl/swig.pm')
-rw-r--r--source4/build/pidl/swig.pm102
1 files changed, 71 insertions, 31 deletions
diff --git a/source4/build/pidl/swig.pm b/source4/build/pidl/swig.pm
index 0b48537d6f..dcd3efa698 100644
--- a/source4/build/pidl/swig.pm
+++ b/source4/build/pidl/swig.pm
@@ -38,6 +38,21 @@ sub DebugElement($)
return $result;
}
+sub ArrayFromPython($$)
+{
+ my($e) = shift;
+ my($prefix) = shift;
+ my($result) = "";
+
+ if ($e->{POINTERS} != 0) {
+ $result .= "\ts->$prefix$e->{NAME} = talloc(mem_ctx, PyString_Size(PyDict_GetItem(obj, PyString_FromString(\"$e->{NAME}\"))));\n";
+ }
+
+ $result .= "\tmemcpy(s->$prefix$e->{NAME}, PyString_AsString(PyDict_GetItem(obj, PyString_FromString(\"$e->{NAME}\"))), PyString_Size(PyDict_GetItem(obj, PyString_FromString(\"$e->{NAME}\"))));\n";
+
+ return $result;
+}
+
sub XFromPython($$)
{
my($e) = shift;
@@ -47,13 +62,8 @@ sub XFromPython($$)
# Special cases
- if (($e->{TYPE} eq "policy_handle" || $e->{TYPE} eq "string") && $e->{POINTERS} == 1) {
- $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, $obj);\n";
- return $result;
- }
-
if ($e->{TYPE} eq "string" && $e->{POINTERS} == 1) {
- $result .= "\ts->$prefix$e->{NAME} = policy_handle_ptr_from_python(mem_ctx, $obj);\n";
+ $result .= "\ts->$prefix$e->{NAME} = string_ptr_from_python(mem_ctx, $obj);\n";
return $result;
}
@@ -62,23 +72,21 @@ sub XFromPython($$)
if (util::is_scalar_type($e->{TYPE})) {
if ($e->{POINTERS} == 0) {
if ($e->{ARRAY_LEN}) {
- # pointer to scalar with array len property
- $result .= DebugElement($e);
+ $result .= ArrayFromPython($e, $prefix);
} else {
$result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_from_python($obj);\n";
}
} else {
- # Pointer to scalar
+ $result .= "\t// Pointer to scalar\n";
$result .= DebugElement($e);
}
} else {
if ($e->{POINTERS} == 0) {
- # Non-scalar type, no pointer
- $result .= DebugElement($e);
+ $result .= "\t$e->{TYPE}_from_python(mem_ctx, &s->$prefix$e->{NAME}, $obj);\n";
} elsif ($e->{POINTERS} == 1) {
$result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, $obj);\n";
} else {
- # Non-scalar type, multiple pointers
+ $result .= "\t// Non-scalar type, multiple pointers\n";
$result .= DebugElement($e);
}
}
@@ -86,19 +94,31 @@ sub XFromPython($$)
return $result;
}
-sub XToPython($$)
+sub ArrayToPython($$)
{
my($e) = shift;
my($prefix) = shift;
my($result) = "";
- # Special cases
+ my($array_len) = $e->{ARRAY_LEN};
- if ($e->{TYPE} eq "policy_handle" && $e->{POINTERS} == 1) {
- $result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), policy_handle_ptr_to_python(mem_ctx, s->$prefix$e->{NAME}));\n";
- return $result;
+ if (!util::is_constant($array_len)) {
+ $array_len = "s->$prefix$array_len";
}
+ $result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), PyString_FromStringAndSize((char *)s->$prefix$e->{NAME}, $array_len * sizeof($e->{TYPE})));\n";
+
+ return $result;
+}
+
+sub XToPython($$)
+{
+ my($e) = shift;
+ my($prefix) = shift;
+ my($result) = "";
+
+ # Special cases
+
if ($e->{TYPE} eq "string" && $e->{POINTERS} == 1) {
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), string_ptr_to_python(mem_ctx, s->$prefix$e->{NAME}));\n";
return $result;
@@ -109,23 +129,21 @@ sub XToPython($$)
if (util::is_scalar_type($e->{TYPE})) {
if ($e->{POINTERS} == 0) {
if ($e->{ARRAY_LEN}) {
- # pointer to scalar with array len property
- $result .= DebugElement($e);
+ $result .= ArrayToPython($e, $prefix);
} else {
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), $e->{TYPE}_to_python(s->$prefix$e->{NAME}));\n";
}
} else {
- # Pointer to scalar
+ $result .= "\t// Pointer to scalar\n";
$result .= DebugElement($e);
}
} else {
if ($e->{POINTERS} == 0) {
- # Non-scalar type, no pointer
- $result .= DebugElement($e);
+ $result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), $e->{TYPE}_ptr_to_python(mem_ctx, &s->$prefix$e->{NAME}));\n";
} elsif ($e->{POINTERS} == 1) {
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), $e->{TYPE}_ptr_to_python(mem_ctx, s->$prefix$e->{NAME}));\n";
} else {
- # Non-scalar type, multiple pointers
+ $result .= "\t// Non-scalar type, multiple pointers\n";
$result .= DebugElement($e);
}
}
@@ -234,7 +252,7 @@ sub ParseStruct($)
$res .= "}\n\n";
- $res .= "/* Convert struct $s->{NAME} to Python dict */\n\n";
+ $res .= "/* Convert struct $s->{NAME} pointer to Python dict */\n\n";
$res .= "PyObject *$s->{NAME}_ptr_to_python(TALLOC_CTX *mem_ctx, struct $s->{NAME} *s)\n";
$res .= "{\n";
@@ -257,7 +275,7 @@ sub ParseUnion($)
my($u) = shift;
$res .= "%{\n\n";
- $res .= "/* Convert Python dict to union $u->{NAME} */\n\n";
+ $res .= "/* Convert Python dict to union $u->{NAME} pointer */\n\n";
$res .= "union $u->{NAME} *$u->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
$res .= "{\n";
@@ -283,13 +301,33 @@ sub ParseUnion($)
$res .= "\treturn NULL;\n";
$res .= "}\n\n";
- $res .= "/* Convert union $u->{NAME} to Python dict */\n\n";
+ $res .= "/* Convert union $u->{NAME} pointer to Python dict */\n\n";
$res .= "PyObject *$u->{NAME}_ptr_to_python(TALLOC_CTX *mem_ctx, union $u->{NAME} *u)\n";
$res .= "{\n";
$res .= "\treturn PyDict_New();\n";
$res .= "}\n\n";
+ $res .= "/* Convert Python dict to union $u->{NAME} */\n\n";
+
+ $res .= "void $u->{NAME}_from_python(TALLOC_CTX *mem_ctx, union $u->{NAME} *u, PyObject *obj)\n";
+ $res .= "{\n";
+ $res .= "\tPyObject *dict;\n\n";
+ for my $e (@{$u->{DATA}{DATA}}) {
+ $res .= "\tif ((dict = PyDict_GetItem(obj, PyString_FromString(\"$e->{DATA}{NAME}\")))) {\n";
+ if ($e->{DATA}{POINTERS} == 0) {
+ $res .= "\t\t$e->{DATA}{TYPE}_from_python(mem_ctx, &u->$e->{DATA}{NAME}, dict);\n";
+ } elsif ($e->{DATA}{POINTERS} == 1) {
+ $res .= "\t\tu->$e->{DATA}{NAME} = $e->{DATA}{TYPE}_ptr_from_python(mem_ctx, dict);\n";
+ } else {
+ $res .= "\t\t// $e->{DATA}{TYPE} pointers=$e->{DATA}{POINTERS}\n";
+ }
+
+ $res .= "\t\treturn;\n";
+ $res .= "\t}\n\n";
+ }
+ $res .= "}\n";
+
$res .= "\n%}\n\n";
}
@@ -317,11 +355,13 @@ sub ParseHeader($)
{
my($hdr) = shift;
- $name = $hdr->{NAME};
- $res .= "#define DCERPC_" . uc($name) . "_UUID \"$hdr->{PROPERTIES}->{uuid}\"\n";
- $res .= "const int DCERPC_" . uc($name) . "_VERSION = " . $hdr->{PROPERTIES}->{version} . ";\n";
- $res .= "#define DCERPC_" . uc($name) . "_NAME \"" . $name . "\"\n";
- $res .= "\n";
+ if ($hdr->{PROPERTIES}{uuid}) {
+ $name = $hdr->{NAME};
+ $res .= "#define DCERPC_" . uc($name) . "_UUID \"$hdr->{PROPERTIES}->{uuid}\"\n";
+ $res .= "const int DCERPC_" . uc($name) . "_VERSION = " . $hdr->{PROPERTIES}->{version} . ";\n";
+ $res .= "#define DCERPC_" . uc($name) . "_NAME \"" . $name . "\"\n";
+ $res .= "\n";
+ }
ParseInheritedData($hdr->{INHERITED_DATA});
}