pidl/python: Some more support for special case types.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 12 Jan 2008 00:09:28 +0000 (01:09 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 14 Jan 2008 18:53:04 +0000 (19:53 +0100)
(This used to be commit 991aa950a377bbc07e0bf05758574f850a6d0ff7)

source4/pidl/lib/Parse/Pidl/Samba4/Python.pm

index 4454eeefd7068fce6c02935abeb92537936a2773..2bf5f1528aba54267258070da27c10858dea2f62 100644 (file)
@@ -11,7 +11,7 @@ use Exporter;
 use strict;
 use Parse::Pidl::Typelist qw(hasType getType mapTypeName);
 use Parse::Pidl::Util qw(has_property ParseExpr);
-use Parse::Pidl::CUtil qw(get_value_of get_pointer_of);
+use Parse::Pidl::CUtil qw(get_value_of get_pointer_to);
 
 use vars qw($VERSION);
 $VERSION = '0.01';
@@ -288,12 +288,11 @@ sub PythonType($$$)
        my ($self, $d, $interface, $basename) = @_;
 
        my $actual_ctype = $d;
-       if ($actual_ctype->{TYPE} eq "TYPEDEF") {
+       if ($actual_ctype->{TYPE} eq "TYPEDEF" or $actual_ctype->{TYPE} eq "DECLARE") {
                $actual_ctype = $actual_ctype->{DATA};
        }
 
-       if ($d->{TYPE} eq "STRUCT" or $d->{TYPE} eq "TYPEDEF" and 
-               $d->{DATA}->{TYPE} eq "STRUCT") {
+       if ($actual_ctype->{TYPE} eq "STRUCT") {
                my $py_fnname;
                if ($d->{TYPE} eq "STRUCT") {
                        $py_fnname = $self->PythonStruct($d->{NAME}, mapTypeName($d), $d);
@@ -466,13 +465,13 @@ sub ConvertObjectFromPython($$$)
        }
 
        my $actual_ctype = $ctype;
-       if ($ctype->{TYPE} eq "TYPEDEF") {
+       if ($ctype->{TYPE} eq "TYPEDEF" or $ctype->{TYPE} eq "DECLARE") {
                $actual_ctype = $ctype->{DATA};
        }
 
        if ($actual_ctype->{TYPE} eq "ENUM" or $actual_ctype->{TYPE} eq "BITMAP" or 
                $actual_ctype->{TYPE} eq "SCALAR" and (
-               $actual_ctype->{NAME} =~ /^(uint[0-9]+|hyper)$/)) {
+               $actual_ctype->{NAME} =~ /^(uint[0-9]+|hyper|NTTIME|time_t|NTTIME_hyper|NTTIME_1sec|dlong|udlong)$/)) {
                return "PyInt_AsLong($cvar)";
        }
 
@@ -488,18 +487,22 @@ sub ConvertObjectToPython($$$)
        }
 
        if (ref($ctype) ne "HASH") {
+               if (not hasType($ctype)) {
+                       return "py_import_$ctype($cvar)"; # best bet
+               }
+
                $ctype = getType($ctype);
        }
 
        my $actual_ctype = $ctype;
-       if ($ctype->{TYPE} eq "TYPEDEF") {
+       if ($ctype->{TYPE} eq "TYPEDEF" or $ctype->{TYPE} eq "DECLARE") {
                $actual_ctype = $ctype->{DATA};
        }
 
        if ($cvar =~ /^[0-9]+$/ or 
                $actual_ctype->{TYPE} eq "ENUM" or $actual_ctype->{TYPE} eq "BITMAP" or 
-               $actual_ctype->{TYPE} eq "SCALAR" and (
-               $actual_ctype->{NAME} =~ /^(uint[0-9]+|hyper)$/)) {
+               ($actual_ctype->{TYPE} eq "SCALAR" and 
+               $actual_ctype->{NAME} =~ /^(int|long|char|u?int[0-9]+|hyper|dlong|udlong|time_t|NTTIME_hyper|NTTIME|NTTIME_1sec)$/)) {
                return "PyInt_FromLong($cvar)";
        }
 
@@ -509,6 +512,11 @@ sub ConvertObjectToPython($$$)
                return "py_import_$ctype->{NAME}($cvar)";
        }
 
+       if ($actual_ctype->{TYPE} eq "SCALAR" and 
+               $actual_ctype->{NAME} eq "DATA_BLOB") {
+               return "PyString_FromStringAndSize($cvar->data, $cvar->length)";
+       }
+
        if ($ctype->{TYPE} eq "STRUCT" or $ctype->{TYPE} eq "UNION") {
                return "py_import_$ctype->{TYPE}_$ctype->{NAME}($cvar)";
        }
@@ -517,6 +525,28 @@ sub ConvertObjectToPython($$$)
                return "PyInt_FromLong($cvar->v)";
        }
 
+       if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "WERROR") {
+               return "PyInt_FromLong($cvar->v)";
+       }
+
+       if ($actual_ctype->{TYPE} eq "SCALAR" and 
+               ($actual_ctype->{NAME} eq "string" or $actual_ctype->{NAME} eq "nbt_string")) {
+               return "PyString_FromString($cvar)";
+       }
+
+       if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "string_array") {
+               return "FIXME($cvar)";
+       }
+
+       if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "ipv4address") {
+               return "FIXME($cvar)";
+               }
+
+       if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "pointer") {
+               return "PyCObject_FromVoidPtr($cvar, talloc_free)";
+       }
+
+
        die("unknown type ".mapTypeName($ctype) . ": $cvar");
 }