mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
SF patch# 1755229 by Amaury Forgeot d'Arc: fix _winreg module and tests.
Untested.
This commit is contained in:
parent
52b8976a03
commit
a8c360ee76
2 changed files with 24 additions and 34 deletions
|
@ -4,7 +4,7 @@
|
||||||
from _winreg import *
|
from _winreg import *
|
||||||
import os, sys
|
import os, sys
|
||||||
|
|
||||||
from test.test_support import verify, have_unicode
|
from test.test_support import verify
|
||||||
|
|
||||||
test_key_name = "SOFTWARE\\Python Registry Test Key - Delete Me"
|
test_key_name = "SOFTWARE\\Python Registry Test Key - Delete Me"
|
||||||
|
|
||||||
|
@ -13,17 +13,10 @@ test_data = [
|
||||||
("String Val", "A string value", REG_SZ),
|
("String Val", "A string value", REG_SZ),
|
||||||
("StringExpand", "The path is %path%", REG_EXPAND_SZ),
|
("StringExpand", "The path is %path%", REG_EXPAND_SZ),
|
||||||
("Multi-string", ["Lots", "of", "string", "values"], REG_MULTI_SZ),
|
("Multi-string", ["Lots", "of", "string", "values"], REG_MULTI_SZ),
|
||||||
("Raw Data", ("binary"+chr(0)+"data"), REG_BINARY),
|
("Raw Data", bytes("binary"+chr(0)+"data"), REG_BINARY),
|
||||||
("Big String", "x"*(2**14-1), REG_SZ),
|
("Big String", "x"*(2**14-1), REG_SZ),
|
||||||
("Big Binary", "x"*(2**14), REG_BINARY),
|
("Big Binary", b"x"*(2**14), REG_BINARY),
|
||||||
]
|
]
|
||||||
if have_unicode:
|
|
||||||
test_data+=[
|
|
||||||
(str("Unicode Val"), str("A Unicode value"), REG_SZ,),
|
|
||||||
("UnicodeExpand", str("The path is %path%"), REG_EXPAND_SZ),
|
|
||||||
("Multi-unicode", [str("Lots"), str("of"), str("unicode"), str("values")], REG_MULTI_SZ),
|
|
||||||
("Multi-mixed", [str("Unicode"), str("and"), "string", "values"],REG_MULTI_SZ),
|
|
||||||
]
|
|
||||||
|
|
||||||
def WriteTestData(root_key):
|
def WriteTestData(root_key):
|
||||||
# Set the default value for this key.
|
# Set the default value for this key.
|
||||||
|
@ -65,7 +58,7 @@ def WriteTestData(root_key):
|
||||||
def ReadTestData(root_key):
|
def ReadTestData(root_key):
|
||||||
# Check we can get default value for this key.
|
# Check we can get default value for this key.
|
||||||
val = QueryValue(root_key, test_key_name)
|
val = QueryValue(root_key, test_key_name)
|
||||||
verify(val=="Default value", "Registry didn't give back the correct value")
|
verify(type(val) is str and val=="Default value", "Registry didn't give back the correct value")
|
||||||
|
|
||||||
key = OpenKey(root_key, test_key_name)
|
key = OpenKey(root_key, test_key_name)
|
||||||
# Read the sub-keys
|
# Read the sub-keys
|
||||||
|
|
43
PC/_winreg.c
43
PC/_winreg.c
|
@ -404,7 +404,7 @@ PyHKEY_strFunc(PyObject *ob)
|
||||||
PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
|
PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
|
||||||
char resBuf[160];
|
char resBuf[160];
|
||||||
wsprintf(resBuf, "<PyHKEY:%p>", pyhkey->hkey);
|
wsprintf(resBuf, "<PyHKEY:%p>", pyhkey->hkey);
|
||||||
return PyString_FromString(resBuf);
|
return PyUnicode_FromString(resBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -444,6 +444,7 @@ static PyNumberMethods PyHKEY_NumberMethods =
|
||||||
PyHKEY_binaryFailureFunc, /* nb_and */
|
PyHKEY_binaryFailureFunc, /* nb_and */
|
||||||
PyHKEY_binaryFailureFunc, /* nb_xor */
|
PyHKEY_binaryFailureFunc, /* nb_xor */
|
||||||
PyHKEY_binaryFailureFunc, /* nb_or */
|
PyHKEY_binaryFailureFunc, /* nb_or */
|
||||||
|
NULL, /* nb_coerce */
|
||||||
PyHKEY_intFunc, /* nb_int */
|
PyHKEY_intFunc, /* nb_int */
|
||||||
PyHKEY_unaryFailureFunc, /* nb_long */
|
PyHKEY_unaryFailureFunc, /* nb_long */
|
||||||
PyHKEY_unaryFailureFunc, /* nb_float */
|
PyHKEY_unaryFailureFunc, /* nb_float */
|
||||||
|
@ -729,11 +730,10 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
need_decref = 1;
|
need_decref = 1;
|
||||||
}
|
}
|
||||||
if (!PyString_Check(value))
|
if (!PyBytes_Check(value))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*retDataSize = 1 + strlen(
|
*retDataSize = 1 + strlen(
|
||||||
PyString_AS_STRING(
|
PyBytes_AS_STRING(value));
|
||||||
(PyStringObject *)value));
|
|
||||||
}
|
}
|
||||||
*retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
|
*retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
|
||||||
if (*retDataBuf==NULL){
|
if (*retDataBuf==NULL){
|
||||||
|
@ -744,8 +744,7 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
|
||||||
strcpy((char *)*retDataBuf, "");
|
strcpy((char *)*retDataBuf, "");
|
||||||
else
|
else
|
||||||
strcpy((char *)*retDataBuf,
|
strcpy((char *)*retDataBuf,
|
||||||
PyString_AS_STRING(
|
PyBytes_AS_STRING(value));
|
||||||
(PyStringObject *)value));
|
|
||||||
if (need_decref)
|
if (need_decref)
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
break;
|
break;
|
||||||
|
@ -770,7 +769,7 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
|
||||||
PyObject *t;
|
PyObject *t;
|
||||||
t = PyList_GET_ITEM(
|
t = PyList_GET_ITEM(
|
||||||
(PyListObject *)value,j);
|
(PyListObject *)value,j);
|
||||||
if (PyString_Check(t)) {
|
if (PyBytes_Check(t)) {
|
||||||
obs[j] = t;
|
obs[j] = t;
|
||||||
Py_INCREF(t);
|
Py_INCREF(t);
|
||||||
} else if (PyUnicode_Check(t)) {
|
} else if (PyUnicode_Check(t)) {
|
||||||
|
@ -783,8 +782,7 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
|
||||||
} else
|
} else
|
||||||
goto reg_multi_fail;
|
goto reg_multi_fail;
|
||||||
size += 1 + strlen(
|
size += 1 + strlen(
|
||||||
PyString_AS_STRING(
|
PyBytes_AS_STRING(obs[j]));
|
||||||
(PyStringObject *)obs[j]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*retDataSize = size + 1;
|
*retDataSize = size + 1;
|
||||||
|
@ -800,12 +798,9 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
|
||||||
{
|
{
|
||||||
PyObject *t;
|
PyObject *t;
|
||||||
t = obs[j];
|
t = obs[j];
|
||||||
strcpy(P,
|
strcpy(P, PyBytes_AS_STRING(t));
|
||||||
PyString_AS_STRING(
|
|
||||||
(PyStringObject *)t));
|
|
||||||
P += 1 + strlen(
|
P += 1 + strlen(
|
||||||
PyString_AS_STRING(
|
PyBytes_AS_STRING(t));
|
||||||
(PyStringObject *)t));
|
|
||||||
Py_DECREF(obs[j]);
|
Py_DECREF(obs[j]);
|
||||||
}
|
}
|
||||||
/* And doubly-terminate the list... */
|
/* And doubly-terminate the list... */
|
||||||
|
@ -922,7 +917,7 @@ Reg2Py(char *retDataBuf, DWORD retDataSize, DWORD typ)
|
||||||
obData = Py_None;
|
obData = Py_None;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
obData = Py_BuildValue("s#",
|
obData = Py_BuildValue("y#",
|
||||||
(char *)retDataBuf,
|
(char *)retDataBuf,
|
||||||
retDataSize);
|
retDataSize);
|
||||||
break;
|
break;
|
||||||
|
@ -1047,7 +1042,7 @@ PyEnumKey(PyObject *self, PyObject *args)
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
|
return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
|
||||||
|
|
||||||
retStr = PyString_FromStringAndSize(tmpbuf, len);
|
retStr = PyUnicode_FromStringAndSize(tmpbuf, len);
|
||||||
return retStr; /* can be NULL */
|
return retStr; /* can be NULL */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1109,7 +1104,7 @@ PyEnumValue(PyObject *self, PyObject *args)
|
||||||
retVal = NULL;
|
retVal = NULL;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
retVal = Py_BuildValue("sOi", retValueBuf, obData, typ);
|
retVal = Py_BuildValue("UOi", retValueBuf, obData, typ);
|
||||||
Py_DECREF(obData);
|
Py_DECREF(obData);
|
||||||
fail:
|
fail:
|
||||||
PyMem_Free(retValueBuf);
|
PyMem_Free(retValueBuf);
|
||||||
|
@ -1232,17 +1227,19 @@ PyQueryValue(PyObject *self, PyObject *args)
|
||||||
!= ERROR_SUCCESS)
|
!= ERROR_SUCCESS)
|
||||||
return PyErr_SetFromWindowsErrWithFunction(rc,
|
return PyErr_SetFromWindowsErrWithFunction(rc,
|
||||||
"RegQueryValue");
|
"RegQueryValue");
|
||||||
retStr = PyString_FromStringAndSize(NULL, bufSize);
|
retBuf = (char *)PyMem_Malloc(bufSize);
|
||||||
if (retStr == NULL)
|
if (retBuf == NULL)
|
||||||
return NULL;
|
return PyErr_NoMemory();
|
||||||
retBuf = PyString_AS_STRING(retStr);
|
|
||||||
if ((rc = RegQueryValue(hKey, subKey, retBuf, &bufSize))
|
if ((rc = RegQueryValue(hKey, subKey, retBuf, &bufSize))
|
||||||
!= ERROR_SUCCESS) {
|
!= ERROR_SUCCESS) {
|
||||||
Py_DECREF(retStr);
|
PyMem_Free(retBuf);
|
||||||
return PyErr_SetFromWindowsErrWithFunction(rc,
|
return PyErr_SetFromWindowsErrWithFunction(rc,
|
||||||
"RegQueryValue");
|
"RegQueryValue");
|
||||||
}
|
}
|
||||||
_PyString_Resize(&retStr, strlen(retBuf));
|
|
||||||
|
retStr = PyUnicode_DecodeMBCS(retBuf, strlen(retBuf), NULL);
|
||||||
|
PyMem_Free(retBuf);
|
||||||
return retStr;
|
return retStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue