[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