[pypy-svn] r62020 - in pypy/trunk/pypy: module/_winreg module/_winreg/test rlib

afa at codespeak.net afa at codespeak.net
Thu Feb 19 15:55:17 CET 2009


Author: afa
Date: Thu Feb 19 15:55:14 2009
New Revision: 62020

Modified:
   pypy/trunk/pypy/module/_winreg/__init__.py
   pypy/trunk/pypy/module/_winreg/interp_winreg.py
   pypy/trunk/pypy/module/_winreg/test/test_winreg.py
   pypy/trunk/pypy/rlib/rwin32.py
   pypy/trunk/pypy/rlib/rwinreg.py
Log:
More progress on the winreg module


Modified: pypy/trunk/pypy/module/_winreg/__init__.py
==============================================================================
--- pypy/trunk/pypy/module/_winreg/__init__.py	(original)
+++ pypy/trunk/pypy/module/_winreg/__init__.py	Thu Feb 19 15:55:14 2009
@@ -6,9 +6,12 @@
     appleveldefs = {
     }
     interpleveldefs = {
+        'HKEYType': 'interp_winreg.W_HKEY',
         'SetValue': 'interp_winreg.SetValue',
         'QueryValue': 'interp_winreg.QueryValue',
-        'HKEYType': 'interp_winreg.W_HKEY',
+        'CreateKey': 'interp_winreg.CreateKey',
+        'CloseKey': 'interp_winreg.CloseKey',
+        'QueryInfoKey': 'interp_winreg.QueryInfoKey',
     }
 
     for name, value in constants.iteritems():

Modified: pypy/trunk/pypy/module/_winreg/interp_winreg.py
==============================================================================
--- pypy/trunk/pypy/module/_winreg/interp_winreg.py	(original)
+++ pypy/trunk/pypy/module/_winreg/interp_winreg.py	Thu Feb 19 15:55:14 2009
@@ -6,17 +6,30 @@
 from pypy.rpython.lltypesystem import rffi, lltype
 from pypy.rlib import rwinreg, rwin32
 
+def raiseWindowsError(space, errcode, context):
+    message = rwin32.FormatError(errcode)
+    raise OperationError(space.w_WindowsError, space.wrap((errcode, message)))
+
 class W_HKEY(Wrappable):
     def __init__(self, hkey):
         self.hkey = hkey
 
-    def __nonzero__(self):
-        return self.hkey != 0
+    def descr_nonzero(self, space):
+        return self.wrap(self.hkey != 0)
+    descr_nonzero.unwrap_spec = ['self', ObjSpace]
 
     def descr_repr(self, space):
-        return space.wrap("<PyHKEY:%d>" % (self.hkey,))
+        return space.wrap("<PyHKEY:0x%x>" % (self.hkey,))
     descr_repr.unwrap_spec = ['self', ObjSpace]
 
+    def descr_int(self, space):
+        return space.wrap(self.hkey)
+    descr_int.unwrap_spec = ['self', ObjSpace]
+
+    def Close(self, space):
+        CloseKey(space, self)
+    Close.unwrap_spec = ['self', ObjSpace]
+
 def new_HKEY(space, w_subtype, hkey):
     return space.wrap(W_HKEY(hkey))
 descr_HKEY_new = interp2app(new_HKEY,
@@ -26,61 +39,111 @@
     "_winreg.HKEYType",
     __new__ = descr_HKEY_new,
     __repr__ = interp2app(W_HKEY.descr_repr),
+    __int__ = interp2app(W_HKEY.descr_int),
+    __nonzero__ = interp2app(W_HKEY.descr_nonzero),
+    Close = interp2app(W_HKEY.Close),
     )
 
-def hkey_w(w_key, space):
-    if space.is_w(w_key, space.w_None):
+def hkey_w(w_hkey, space):
+    if space.is_w(w_hkey, space.w_None):
         errstring = space.wrap("None is not a valid HKEY in this context")
         raise OperationError(space.w_TypeError, errstring)
-    elif isinstance(w_key, W_HKEY):
-        return w_key.hkey
-    elif space.is_true(space.isinstance(w_key, space.w_int)):
-        return space.int_w(w_key)
-    elif space.is_true(space.isinstance(w_key, space.w_long)):
-        return space.uint_w(w_key)
+    elif isinstance(w_hkey, W_HKEY):
+        return w_hkey.hkey
+    elif space.is_true(space.isinstance(w_hkey, space.w_int)):
+        return space.int_w(w_hkey)
+    elif space.is_true(space.isinstance(w_hkey, space.w_long)):
+        return space.uint_w(w_hkey)
     else:
         errstring = space.wrap("The object is not a PyHKEY object")
         raise OperationError(space.w_TypeError, errstring)
 
-def SetValue(space, w_key, w_subkey, typ, value):
+def CloseKey(space, w_hkey):
+    hkey = hkey_w(w_hkey, space)
+    if hkey:
+        ret = rwinreg.RegCloseKey(hkey)
+        if ret != 0:
+            raiseWindowsError(space, ret, 'RegSetValue')
+CloseKey.unwrap_spec = [ObjSpace, W_Root]
+
+def SetValue(space, w_hkey, w_subkey, typ, value):
     if typ != rwinreg.REG_SZ:
         errstring = space.wrap("Type must be _winreg.REG_SZ")
         raise OperationError(space.w_ValueError, errstring)
-    key = hkey_w(w_key, space)
+    hkey = hkey_w(w_hkey, space)
     if space.is_w(w_subkey, space.w_None):
         subkey = None
     else:
         subkey = space.str_w(w_subkey)
     dataptr = rffi.str2charp(value)
     try:
-        ret = rwinreg.RegSetValue(key, subkey, rwinreg.REG_SZ, dataptr, len(value))
+        ret = rwinreg.RegSetValue(hkey, subkey, rwinreg.REG_SZ, dataptr, len(value))
     finally:
         rffi.free_charp(dataptr)
     if ret != 0:
-        rwin32.raiseWindowError(ret, 'RegSetValue')
+        raiseWindowsError(space, ret, 'RegSetValue')
 SetValue.unwrap_spec = [ObjSpace, W_Root, W_Root, int, str]
 
-def QueryValue(space, w_key, w_subkey):
-    key = hkey_w(w_key, space)
+def QueryValue(space, w_hkey, w_subkey):
+    hkey = hkey_w(w_hkey, space)
     if space.is_w(w_subkey, space.w_None):
         subkey = None
     else:
         subkey = space.str_w(w_subkey)
     bufsize_p = lltype.malloc(rwin32.PLONG.TO, 1, flavor='raw')
     try:
-        ret = rwinreg.RegQueryValue(key, subkey, None, bufsize_p)
+        ret = rwinreg.RegQueryValue(hkey, subkey, None, bufsize_p)
         if ret != 0:
-            rwin32.raiseWindowError(ret, 'RegQueryValue')
+            raiseWindowsError(space, ret, 'RegQueryValue')
         buf = lltype.malloc(rffi.CCHARP.TO, bufsize_p[0], flavor='raw')
         try:
-            ret = rwinreg.RegQueryValue(key, subkey, buf, bufsize_p)
+            ret = rwinreg.RegQueryValue(hkey, subkey, buf, bufsize_p)
             if ret != 0:
-                rwin32.raiseWindowError(ret, 'RegQueryValue')
+                raiseWindowsError(space, ret, 'RegQueryValue')
             return space.wrap(rffi.charp2strn(buf, bufsize_p[0] - 1))
         finally:
             lltype.free(buf, flavor='raw')
     finally:
         lltype.free(bufsize_p, flavor='raw')
     if ret != 0:
-        rwin32.raiseWindowError(ret, 'RegQueryValue')
+        raiseWindowsError(space, ret, 'RegQueryValue')
 SetValue.unwrap_spec = [ObjSpace, W_Root, W_Root, int, str]
+
+def CreateKey(space, w_hkey, subkey):
+    hkey = hkey_w(w_hkey, space)
+    rethkey = lltype.malloc(rwinreg.PHKEY.TO, 1, flavor='raw')
+    try:
+        ret = rwinreg.RegCreateKey(hkey, subkey, rethkey)
+        if ret != 0:
+            raiseWindowsError(space, ret, 'CreateKey')
+        return space.wrap(W_HKEY(rethkey[0]))
+    finally:
+        lltype.free(rethkey, flavor='raw')
+CreateKey.unwrap_spec = [ObjSpace, W_Root, str]
+
+def QueryInfoKey(space, w_hkey):
+    hkey = hkey_w(w_hkey, space)
+    nSubKeys = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
+    try:
+        nValues = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
+        try:
+            ft = lltype.malloc(rwin32.PFILETIME.TO, 1, flavor='raw')
+            try:
+                null_dword = lltype.nullptr(rwin32.LPDWORD.TO)
+                ret = rwinreg.RegQueryInfoKey(
+                    hkey, None, null_dword, null_dword,
+                    nSubKeys, null_dword, null_dword,
+                    nValues, null_dword, null_dword,
+                    null_dword, ft)
+                if ret != 0:
+                    raiseWindowsError(space, ret, 'RegQueryInfoKey')
+                l = (ft[0].c_dwLowDateTime +
+                     (ft[0].c_dwHighDateTime << 32))
+                return space.wrap((nSubKeys[0], nValues[0], l))
+            finally:
+                lltype.free(ft, flavor='raw')
+        finally:
+            lltype.free(nValues, flavor='raw')
+    finally:
+        lltype.free(nSubKeys, flavor='raw')
+QueryInfoKey.unwrap_spec = [ObjSpace, W_Root]

Modified: pypy/trunk/pypy/module/_winreg/test/test_winreg.py
==============================================================================
--- pypy/trunk/pypy/module/_winreg/test/test_winreg.py	(original)
+++ pypy/trunk/pypy/module/_winreg/test/test_winreg.py	Thu Feb 19 15:55:14 2009
@@ -12,8 +12,8 @@
 
     def test_repr(self):
         import _winreg
-        k = _winreg.HKEYType(123)
-        assert str(k) == "<PyHKEY:123>"
+        k = _winreg.HKEYType(0x123)
+        assert str(k) == "<PyHKEY:0x123>"
 
 class AppTestFfi:
     def setup_class(cls):
@@ -38,3 +38,34 @@
         value = "Some Default value"
         SetValue(self.root_key, self.test_key_name, REG_SZ, value)
         assert QueryValue(self.root_key, self.test_key_name) == value
+
+    def test_CreateKey(self):
+        from _winreg import CreateKey, CloseKey, QueryInfoKey
+        key = CreateKey(self.root_key, self.test_key_name)
+        sub_key = CreateKey(key, "sub_key")
+
+        nkeys, nvalues, since_mod = QueryInfoKey(key)
+        assert nkeys == 1
+
+        nkeys, nvalues, since_mod = QueryInfoKey(sub_key)
+        assert nkeys == 0
+
+        int_sub_key = int(sub_key)
+        CloseKey(sub_key)
+        raises(EnvironmentError, QueryInfoKey, int_sub_key)
+
+        int_key = int(key)
+        key.Close()
+        raises(EnvironmentError, QueryInfoKey, int_key)
+
+    def test_exception(self):
+        from _winreg import QueryInfoKey
+        import errno
+        try:
+            QueryInfoKey(0)
+        except EnvironmentError, e:
+            assert e.winerror == 6
+            assert e.errno == errno.EBADF
+            assert "invalid" in e.strerror.lower()
+        else:
+            assert 0, "Did not raise"

Modified: pypy/trunk/pypy/rlib/rwin32.py
==============================================================================
--- pypy/trunk/pypy/rlib/rwin32.py	(original)
+++ pypy/trunk/pypy/rlib/rwin32.py	Thu Feb 19 15:55:14 2009
@@ -39,6 +39,10 @@
         HRESULT = rffi_platform.SimpleType("HRESULT", rffi.LONG)
         HLOCAL = rffi_platform.SimpleType("HLOCAL", rffi.VOIDP)
 
+        FILETIME = rffi_platform.Struct('FILETIME',
+                                        [('dwLowDateTime', rffi.UINT),
+                                         ('dwHighDateTime', rffi.UINT)])
+
         DEFAULT_LANGUAGE = rffi_platform.ConstantInteger(
             "MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)")
 
@@ -57,6 +61,7 @@
     HANDLE = rffi.ULONG
     LPHANDLE = rffi.CArrayPtr(HANDLE)
     HMODULE = HANDLE
+    PFILETIME = rffi.CArrayPtr(FILETIME)
 
     GetLastError = winexternal('GetLastError', [], DWORD)
 

Modified: pypy/trunk/pypy/rlib/rwinreg.py
==============================================================================
--- pypy/trunk/pypy/rlib/rwinreg.py	(original)
+++ pypy/trunk/pypy/rlib/rwinreg.py	Thu Feb 19 15:55:14 2009
@@ -41,13 +41,32 @@
                            calling_conv='win')
 
 HKEY = rwin32.HANDLE
+PHKEY = rffi.CArrayPtr(HKEY)
 
-RegSetValue = external('RegSetValueA',
-                       [HKEY, rffi.CCHARP, rwin32.DWORD,
-                        rffi.CCHARP, rwin32.DWORD],
-                       rffi.LONG)
-
-RegQueryValue = external('RegQueryValueA',
-                         [HKEY, rffi.CCHARP,
-                          rffi.CCHARP, rwin32.PLONG],
-                         rffi.LONG)
+RegSetValue = external(
+    'RegSetValueA',
+    [HKEY, rffi.CCHARP, rwin32.DWORD, rffi.CCHARP, rwin32.DWORD],
+    rffi.LONG)
+
+RegQueryValue = external(
+    'RegQueryValueA',
+    [HKEY, rffi.CCHARP, rffi.CCHARP, rwin32.PLONG],
+    rffi.LONG)
+
+RegCreateKey = external(
+    'RegCreateKeyA',
+    [rffi.LONG, rffi.CCHARP, PHKEY],
+    rffi.LONG)
+
+RegQueryInfoKey = external(
+    'RegQueryInfoKeyA',
+    [HKEY, rffi.CCHARP, rwin32.LPDWORD, rwin32.LPDWORD,
+     rwin32.LPDWORD, rwin32.LPDWORD, rwin32.LPDWORD,
+     rwin32.LPDWORD, rwin32.LPDWORD, rwin32.LPDWORD,
+     rwin32.LPDWORD, rwin32.PFILETIME],
+    rffi.LONG)
+
+RegCloseKey = external(
+    'RegCloseKey',
+    [HKEY],
+    rffi.LONG)



More information about the Pypy-commit mailing list