python: Be more pythonic - turn WERROR and NTSTATUS return codes into exceptions.
authorJelmer Vernooij <jelmer@samba.org>
Mon, 14 Jan 2008 14:25:09 +0000 (15:25 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 14 Jan 2008 18:53:07 +0000 (19:53 +0100)
(This used to be commit 16fc69b843e92ae62b15caf927335cc117156499)

source4/pidl/lib/Parse/Pidl/Samba4/Python.pm
source4/scripting/python/samba/tests/dcerpc/registry.py

index c8505e9904f81b00cef02c75c7a0fb04ec42121d..9f6a7847b1bb49b7197d4fd31d92912861aea344 100644 (file)
@@ -298,7 +298,7 @@ sub PythonFunction($$$)
        $self->pidl("}");
 
        if ($fn->{RETURN_TYPE}) {
-               $result_size++;
+               $result_size++ unless ($fn->{RETURN_TYPE} eq "WERROR" or $fn->{RETURN_TYPE} eq "NTSTATUS");
        }
 
        foreach my $e (@{$fn->{ELEMENTS}}) {
@@ -329,7 +329,11 @@ sub PythonFunction($$$)
                }
        }
 
-       if (defined($fn->{RETURN_TYPE})) {
+       if (defined($fn->{RETURN_TYPE}) and $fn->{RETURN_TYPE} eq "NTSTATUS") {
+               $self->handle_ntstatus("r->out.result", "NULL", "mem_ctx");
+       } elsif (defined($fn->{RETURN_TYPE}) and $fn->{RETURN_TYPE} eq "WERROR") {
+               $self->handle_werror("r->out.result", "NULL", "mem_ctx");
+       } elsif (defined($fn->{RETURN_TYPE})) {
                my $conv = $self->ConvertObjectToPythonData("r", $fn->{RETURN_TYPE}, "r->out.result");
                if ($result_size > 1) {
                        $self->pidl("PyTuple_SetItem(result, $i, $conv);");
@@ -345,6 +349,20 @@ sub PythonFunction($$$)
        $self->pidl("");
 }
 
+sub handle_werror($$$$)
+{
+       my ($self, $var, $retval, $mem_ctx) = @_;
+
+       $self->pidl("if (!W_ERROR_IS_OK($var)) {");
+       $self->indent;
+       $self->pidl("PyErr_SetString(PyExc_RuntimeError, win_errstr($var));");
+       $self->pidl("talloc_free($mem_ctx);") if ($mem_ctx);
+       $self->pidl("return $retval;");
+       $self->deindent;
+       $self->pidl("}");
+       $self->pidl("");
+}
+
 sub handle_ntstatus($$$$)
 {
        my ($self, $var, $retval, $mem_ctx) = @_;
index 7979592a40064a60a1f5b8855adb44ba980825d7..f3f0b0fb1afc6850e7438253a4215bac9fa12d92 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-
-#!/usr/bin/python
-
-# Unix SMB/CIFS implementation.
-# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
-#   
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#   
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#   
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
 import winreg
 from param import LoadParm
 import unittest
@@ -47,7 +27,24 @@ class WinregTests(unittest.TestCase):
         lp_ctx.load("st/client/client.conf")
         self.conn = winreg.winreg("ncalrpc:", lp_ctx)
 
+    def get_hklm(self):
+        return self.conn.OpenHKLM(None, 
+             winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS)
+
     def test_hklm(self):
-        (handle, _) = self.conn.OpenHKLM(None, 
+        handle = self.conn.OpenHKLM(None, 
+                 winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS)
+        self.conn.CloseKey(handle)
+
+    def test_getversion(self):
+        handle = self.get_hklm()
+        version = self.conn.GetVersion(handle)
+        self.assertEquals(int, version.__class__)
+        self.conn.CloseKey(handle)
+
+    def test_getkeyinfo(self):
+        handle = self.conn.OpenHKLM(None, 
                  winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS)
+        x = self.conn.QueryInfoKey(handle, winreg.String())
+        self.assertEquals(9, len(x)) # should return a 9-tuple
         self.conn.CloseKey(handle)