[Python-3000-checkins] r65709 - in python/branches/py3k: Misc/NEWS PC/_msi.c

martin.v.loewis python-3000-checkins at python.org
Sat Aug 16 15:02:57 CEST 2008


Author: martin.v.loewis
Date: Sat Aug 16 15:02:57 2008
New Revision: 65709

Log:
Bug #3542: Support Unicode strings in _msi module.

Modified:
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/PC/_msi.c

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sat Aug 16 15:02:57 2008
@@ -49,6 +49,11 @@
 - Issue #2523: Fix quadratic behaviour when read()ing a binary file without
   asking for a specific length.
 
+Extension Modules
+-----------------
+
+- Bug #3542: Support Unicode strings in _msi module.
+
 What's new in Python 3.0b2?
 ===========================
 

Modified: python/branches/py3k/PC/_msi.c
==============================================================================
--- python/branches/py3k/PC/_msi.c	(original)
+++ python/branches/py3k/PC/_msi.c	Sat Aug 16 15:02:57 2008
@@ -18,7 +18,7 @@
 uuidcreate(PyObject* obj, PyObject*args)
 {
     UUID result;
-    char *cresult;
+    RPC_WSTR cresult;
     PyObject *oresult;
     
     /* May return ok, local only, and no address.
@@ -30,13 +30,13 @@
 	return NULL;
     }
 
-    if (UuidToString(&result, &cresult) == RPC_S_OUT_OF_MEMORY) {
+    if (UuidToStringW(&result, &cresult) == RPC_S_OUT_OF_MEMORY) {
 	PyErr_SetString(PyExc_MemoryError, "out of memory in uuidgen");
 	return NULL;
     }
 
-    oresult = PyBytes_FromString(cresult);
-    RpcStringFree(&cresult);
+    oresult = PyUnicode_FromUnicode(cresult, wcslen(cresult));
+    RpcStringFreeW(&cresult);
     return oresult;
 
 }
@@ -359,23 +359,23 @@
 {
     unsigned int field;
     unsigned int status;
-    char buf[2000];
-    char *res = buf;
+    WCHAR buf[2000];
+    WCHAR *res = buf;
     DWORD size = sizeof(buf);
     PyObject* string;
     
     if (!PyArg_ParseTuple(args, "I:GetString", &field))
         return NULL;
-    status = MsiRecordGetString(record->h, field, res, &size);
+    status = MsiRecordGetStringW(record->h, field, res, &size);
     if (status == ERROR_MORE_DATA) {
-        res = (char*) malloc(size + 1);
+        res = (WCHAR*) malloc((size + 1)*sizeof(WCHAR));
         if (res == NULL)
             return PyErr_NoMemory();
-        status = MsiRecordGetString(record->h, field, res, &size);
+        status = MsiRecordGetStringW(record->h, field, res, &size);
     }
     if (status != ERROR_SUCCESS)
         return msierror((int) status);
-    string = PyUnicode_FromString(res);
+    string = PyUnicode_FromUnicode(res, size);
     if (buf != res)
         free(res);
     return string;
@@ -397,12 +397,12 @@
 {
     int status;
     int field;
-    char *data;
+    Py_UNICODE *data;
 
-    if (!PyArg_ParseTuple(args, "is:SetString", &field, &data))
+    if (!PyArg_ParseTuple(args, "iu:SetString", &field, &data))
 	return NULL;
 
-    if ((status = MsiRecordSetString(record->h, field, data)) != ERROR_SUCCESS)
+    if ((status = MsiRecordSetStringW(record->h, field, data)) != ERROR_SUCCESS)
 	return msierror(status);
 
     Py_INCREF(Py_None);
@@ -414,12 +414,12 @@
 {
     int status;
     int field;
-    char *data;
+    Py_UNICODE *data;
 
-    if (!PyArg_ParseTuple(args, "is:SetStream", &field, &data))
+    if (!PyArg_ParseTuple(args, "iu:SetStream", &field, &data))
 	return NULL;
 
-    if ((status = MsiRecordSetStream(record->h, field, data)) != ERROR_SUCCESS)
+    if ((status = MsiRecordSetStreamW(record->h, field, data)) != ERROR_SUCCESS)
 	return msierror(status);
 
     Py_INCREF(Py_None);
@@ -586,9 +586,9 @@
     if (!PyArg_ParseTuple(args, "iO:SetProperty", &field, &data))
 	return NULL;
 
-    if (PyBytes_Check(data)) {
-	status = MsiSummaryInfoSetProperty(si->h, field, VT_LPSTR,
-	    0, NULL, PyBytes_AsString(data));
+    if (PyUnicode_Check(data)) {
+	status = MsiSummaryInfoSetPropertyW(si->h, field, VT_LPSTR,
+	    0, NULL, PyUnicode_AsUnicode(data));
     } else if (PyLong_CheckExact(data)) {
 	long value = PyLong_AsLong(data);
 	if (value == -1 && PyErr_Occurred()) {


More information about the Python-3000-checkins mailing list