[pypy-svn] r62022 - in pypy/trunk/pypy: module/_winreg module/_winreg/test rlib
afa at codespeak.net
afa at codespeak.net
Thu Feb 19 17:22:03 CET 2009
Author: afa
Date: Thu Feb 19 17:22:01 2009
New Revision: 62022
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/rwinreg.py
Log:
implement _winreg.RegSetValueEx
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 17:22:01 2009
@@ -8,6 +8,7 @@
interpleveldefs = {
'HKEYType': 'interp_winreg.W_HKEY',
'SetValue': 'interp_winreg.SetValue',
+ 'SetValueEx': 'interp_winreg.SetValueEx',
'QueryValue': 'interp_winreg.QueryValue',
'CreateKey': 'interp_winreg.CreateKey',
'CloseKey': 'interp_winreg.CloseKey',
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 17:22:01 2009
@@ -109,6 +109,88 @@
raiseWindowsError(space, ret, 'RegQueryValue')
QueryValue.unwrap_spec = [ObjSpace, W_Root, W_Root]
+def convert_to_regdata(space, w_value, typ):
+ buf = None
+
+ if typ == rwinreg.REG_DWORD:
+ if space.is_true(space.isinstance(w_value, space.w_int)):
+ buflen = rffi.sizeof(rwin32.DWORD)
+ buf = lltype.malloc(rffi.CArray(rwin32.DWORD), 1, flavor='raw')
+ buf[0] = space.uint_w(w_value)
+
+ elif typ == rwinreg.REG_SZ or typ == rwinreg.REG_EXPAND_SZ:
+ if space.is_w(w_value, space.w_None):
+ buflen = 1
+ buf = lltype.malloc(rffi.CCHARP.TO, buflen, flavor='raw')
+ buf[0] = 0
+ else:
+ if space.is_true(space.isinstance(w_value, space.w_unicode)):
+ w_value = space.call_method(w_value, 'encode',
+ space.wrap('mbcs'))
+ buf = rffi.str2charp(space.str_w(w_value))
+ buflen = space.int_w(space.len(w_value)) + 1
+
+ elif typ == rwinreg.REG_MULTI_SZ:
+ if space.is_w(w_value, space.w_None):
+ buflen = 1
+ buf = lltype.malloc(rffi.CCHARP.TO, buflen, flavor='raw')
+ buf[0] = 0
+ elif space.is_true(space.isinstance(w_value, space.w_list)):
+ strings = []
+ buflen = 0
+
+ # unwrap strings and compute total size
+ w_iter = space.iter(w_value)
+ while True:
+ try:
+ w_item = space.next(w_iter)
+ if space.is_true(space.isinstance(w_item, space.w_unicode)):
+ w_item = space.call_method(w_item, 'encode',
+ space.wrap('mbcs'))
+ item = space.str_w(w_item)
+ strings.append(item)
+ buflen += len(item) + 1
+ except OperationError, e:
+ if not e.match(space, space.w_StopIteration):
+ raise # re-raise other app-level exceptions
+ break
+ buflen += 1
+ buf = lltype.malloc(rffi.CCHARP.TO, buflen, flavor='raw')
+
+ # Now copy data
+ buflen = 0
+ for string in strings:
+ for i in range(len(string)):
+ buf[buflen + i] = string[i]
+ buflen += len(string) + 1
+ buf[buflen - 1] = '\0'
+ buflen += 1
+ buf[buflen - 1] = '\0'
+
+ else: # REG_BINARY and ALL unknown data types.
+ if space.is_w(w_value, space.w_None):
+ buflen = 0
+ buf = lltype.malloc(rffi.CCHARP.TO, 1, flavor='raw')
+ else:
+ value = space.bufferstr_w(w_value)
+ buflen = len(value)
+ buf = rffi.str2charp(value)
+
+ if buf is not None:
+ return rffi.cast(rffi.CCHARP, buf), buflen
+
+ errstring = space.wrap("Could not convert the data to the specified type")
+ raise OperationError(space.w_ValueError, errstring)
+
+def SetValueEx(space, w_hkey, value_name, w_reserved, typ, w_value):
+ hkey = hkey_w(w_hkey, space)
+ buf, buflen = convert_to_regdata(space, w_value, typ)
+ try:
+ ret = rwinreg.RegSetValueEx(hkey, value_name, 0, typ, buf, buflen)
+ finally:
+ lltype.free(buf, flavor='raw')
+SetValueEx.unwrap_spec = [ObjSpace, W_Root, str, W_Root, int, W_Root]
+
def CreateKey(space, w_hkey, subkey):
hkey = hkey_w(w_hkey, space)
rethkey = lltype.malloc(rwinreg.PHKEY.TO, 1, flavor='raw')
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 17:22:01 2009
@@ -27,7 +27,6 @@
def teardown_class(cls):
import _winreg
- return
try:
_winreg.DeleteKey(cls.root_key, cls.test_key_name)
except WindowsError:
@@ -69,3 +68,21 @@
assert "invalid" in e.strerror.lower()
else:
assert 0, "Did not raise"
+
+ def test_SetValueEx(self):
+ from _winreg import CreateKey, SetValueEx
+ from _winreg import REG_DWORD, REG_SZ, REG_EXPAND_SZ
+ from _winreg import REG_MULTI_SZ, REG_BINARY
+ key = CreateKey(self.root_key, self.test_key_name)
+ SetValueEx(key, "Int Value", 0,
+ REG_DWORD, 45)
+ SetValueEx(key, "Str Value", 0,
+ REG_SZ, "A string Value")
+ SetValueEx(key, "Unicode Value", 0,
+ REG_SZ, u"A unicode Value")
+ SetValueEx(key, "Str Expand", 0,
+ REG_EXPAND_SZ, "The path is %path%")
+ SetValueEx(key, "Multi Str", 0,
+ REG_MULTI_SZ, ["Several", "string", u"values"])
+ SetValueEx(key, "Raw data", 0,
+ REG_BINARY, "binary"+chr(0)+"data")
Modified: pypy/trunk/pypy/rlib/rwinreg.py
==============================================================================
--- pypy/trunk/pypy/rlib/rwinreg.py (original)
+++ pypy/trunk/pypy/rlib/rwinreg.py Thu Feb 19 17:22:01 2009
@@ -48,6 +48,12 @@
[HKEY, rffi.CCHARP, rwin32.DWORD, rffi.CCHARP, rwin32.DWORD],
rffi.LONG)
+RegSetValueEx = external(
+ 'RegSetValueExA',
+ [HKEY, rffi.CCHARP, rwin32.DWORD,
+ rwin32.DWORD, rffi.CCHARP, rwin32.DWORD],
+ rffi.LONG)
+
RegQueryValue = external(
'RegQueryValueA',
[HKEY, rffi.CCHARP, rffi.CCHARP, rwin32.PLONG],
More information about the Pypy-commit
mailing list