winreg module avoids the deprecated Unicode API

This commit is contained in:
Victor Stinner 2011-11-21 12:43:50 +01:00
parent 0293db69a0
commit be49244bdc

View file

@ -760,26 +760,27 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
case REG_SZ: case REG_SZ:
case REG_EXPAND_SZ: case REG_EXPAND_SZ:
{ {
if (value == Py_None) if (value != Py_None) {
*retDataSize = 1; Py_ssize_t len;
else { if (!PyUnicode_Check(value))
if (!PyUnicode_Check(value)) return FALSE;
return FALSE; *retDataBuf = (BYTE*)PyUnicode_AsWideCharString(value, &len);
*retDataSize = Py_SAFE_DOWNCAST( if (*retDataBuf == NULL)
2 + PyUnicode_GET_DATA_SIZE(value), return FALSE;
size_t, DWORD); *retDataSize = Py_SAFE_DOWNCAST(
} (len + 1) * sizeof(wchar_t),
*retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize); Py_ssize_t, DWORD);
if (*retDataBuf==NULL){ }
PyErr_NoMemory(); else {
return FALSE; *retDataBuf = (BYTE *)PyMem_NEW(wchar_t, 1);
} if (*retDataBuf == NULL) {
if (value == Py_None) PyErr_NoMemory();
wcscpy((wchar_t *)*retDataBuf, L""); return FALSE;
else }
wcscpy((wchar_t *)*retDataBuf, ((wchar_t *)*retDataBuf)[0] = L'\0';
PyUnicode_AS_UNICODE(value)); *retDataSize = 1 * sizeof(wchar_t);
break; }
break;
} }
case REG_MULTI_SZ: case REG_MULTI_SZ:
{ {
@ -796,10 +797,16 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
{ {
PyObject *t; PyObject *t;
wchar_t *wstr;
Py_ssize_t len;
t = PyList_GET_ITEM(value, j); t = PyList_GET_ITEM(value, j);
if (!PyUnicode_Check(t)) if (!PyUnicode_Check(t))
return FALSE; return FALSE;
size += Py_SAFE_DOWNCAST(2 + PyUnicode_GET_DATA_SIZE(t), wstr = PyUnicode_AsUnicodeAndSize(t, &len);
if (wstr == NULL)
return FALSE;
size += Py_SAFE_DOWNCAST((len + 1) * sizeof(wchar_t),
size_t, DWORD); size_t, DWORD);
} }
@ -815,10 +822,15 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
{ {
PyObject *t; PyObject *t;
wchar_t *wstr;
Py_ssize_t len;
t = PyList_GET_ITEM(value, j); t = PyList_GET_ITEM(value, j);
wcscpy(P, PyUnicode_AS_UNICODE(t)); wstr = PyUnicode_AsUnicodeAndSize(t, &len);
P += 1 + wcslen( if (wstr == NULL)
PyUnicode_AS_UNICODE(t)); return FALSE;
wcscpy(P, wstr);
P += (len + 1);
} }
/* And doubly-terminate the list... */ /* And doubly-terminate the list... */
*P = '\0'; *P = '\0';