SERIALUI: convert to unicode

Mike McCormack mike at codeweavers.com
Mon Oct 25 04:26:00 CDT 2004


ChangeLog:
* convert to unicode
-------------- next part --------------
? dlls/serialui/serialui.dll-sRXZSL.spec.c
Index: dlls/serialui/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/serialui/Makefile.in,v
retrieving revision 1.10
diff -u -r1.10 Makefile.in
--- dlls/serialui/Makefile.in	11 Oct 2003 01:09:17 -0000	1.10
+++ dlls/serialui/Makefile.in	25 Oct 2004 07:33:27 -0000
@@ -4,6 +4,7 @@
 VPATH     = @srcdir@
 MODULE    = serialui.dll
 IMPORTS   = user32 advapi32 kernel32
+EXTRALIBS = $(LIBUNICODE)
 
 C_SRCS = \
 	confdlg.c
Index: dlls/serialui/confdlg.c
===================================================================
RCS file: /home/wine/wine/dlls/serialui/confdlg.c,v
retrieving revision 1.17
diff -u -r1.17 confdlg.c
--- dlls/serialui/confdlg.c	22 Sep 2004 02:46:39 -0000	1.17
+++ dlls/serialui/confdlg.c	25 Oct 2004 07:33:28 -0000
@@ -11,7 +11,7 @@
  *
  * Basic structure copied from COMCTL32 code.
  *
- * Copyright 2000 Mike McCormack
+ * Copyright 2000, 2004 Mike McCormack
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -30,6 +30,7 @@
 
 #include "config.h"
 #include "wine/port.h"
+#include "wine/unicode.h"
 
 #include <string.h>
 #include <stdarg.h>
@@ -243,7 +244,7 @@
 
 typedef struct tagSERIALUI_DialogInfo
 {
-    LPCSTR lpszDevice;
+    LPCWSTR lpszDevice;
     LPCOMMCONFIG lpCommConfig;
     BOOL bConvert; /* baud rate was converted to a DWORD */
     DWORD dwFlowControl; /* old flow control */
@@ -343,7 +344,10 @@
  */
 INT_PTR CALLBACK SERIALUI_ConfigDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-    CHAR szTitle[30];
+    static const WCHAR szSettings[] = {
+        'S','e','t','t','i','n','g','s',' ','f','o','r',' ',0
+    };
+    WCHAR szTitle[40];
     SERIALUI_DialogInfo *info;
 
     switch (uMsg)
@@ -352,9 +356,10 @@
         info = (SERIALUI_DialogInfo*) lParam;
         if(!info)
             return FALSE;
-        SetWindowLongA(hWnd, DWL_USER, lParam);
-        snprintf(szTitle, sizeof(szTitle), "Settings for %s", info->lpszDevice);
-        SetWindowTextA(hWnd, szTitle);
+        SetWindowLongW(hWnd, DWL_USER, lParam);
+        strcpyW( szTitle, szSettings );
+        strcatW( szTitle, info->lpszDevice );
+        SetWindowTextW(hWnd, szTitle);
         SERIALUI_DCBToDialogInfo(hWnd, info);
         return TRUE;
 
@@ -362,7 +367,7 @@
     {
         WORD wID = LOWORD(wParam);
 
-        info = (SERIALUI_DialogInfo *) GetWindowLongA(hWnd, DWL_USER);
+        info = (SERIALUI_DialogInfo *) GetWindowLongW(hWnd, DWL_USER);
         if(!info)
             EndDialog(hWnd,0);
         switch (wID)
@@ -378,7 +383,7 @@
         case ID_GETDEFAULT:
             {
                 DWORD r,dwConfSize = sizeof (COMMCONFIG);
-                r = GetDefaultCommConfigA(info->lpszDevice,
+                r = GetDefaultCommConfigW(info->lpszDevice,
                           info->lpCommConfig, &dwConfSize);
                 if(!r)
                     MessageBoxA(hWnd,"Failed","GetDefaultCommConfig",MB_OK);
@@ -389,7 +394,7 @@
             {
                 DWORD r;
                 SERIALUI_DialogInfoToDCB(hWnd,info);
-                r = SetDefaultCommConfigA(info->lpszDevice,
+                r = SetDefaultCommConfigW(info->lpszDevice,
                           info->lpCommConfig, sizeof (COMMCONFIG));
                 if(!r)
                     MessageBoxA(hWnd,"Failed","GetDefaultCommConfig",MB_OK);
@@ -403,13 +408,32 @@
     }
 }
 
+static LPWSTR SERIALUI_strdup( LPCSTR str )
+{
+    DWORD len;
+    LPWSTR strW;
+
+    if (!str)
+        return NULL;
+    len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+    strW = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, str, -1, strW, len );
+    return strW;
+}
+
+static VOID SERIALUI_strfree( LPWSTR strW )
+{
+    if (strW)
+        HeapFree( GetProcessHeap(), 0, strW );
+}
+
 /***********************************************************************
- * drvCommConfigDialog (SERIALUI.3)
+ * drvCommConfigDialogW (SERIALUI.@)
  *
  * Used by Win9x KERNEL to show a dialog for configuring a COMM port.
  */
-BOOL WINAPI SERIALUI_CommConfigDialog(
-	LPCSTR lpszName,
+BOOL WINAPI SERIALUI_CommConfigDialogW(
+	LPCWSTR lpszName,
 	HWND hWndParent,
 	LPCOMMCONFIG lpCommConfig
 ) {
@@ -423,31 +447,47 @@
     if(!lpCommConfig)
         return FALSE;
 
-    return DialogBoxParamA(SERIALUI_hModule,
-                           MAKEINTRESOURCEA(IDD_SERIALUICONFIG),
+    return DialogBoxParamW(SERIALUI_hModule,
+                           MAKEINTRESOURCEW(IDD_SERIALUICONFIG),
                            hWndParent,
                            SERIALUI_ConfigDialogProc,
                            (LPARAM)&info);
 }
 
-static LPCSTR lpszCommKey = "System\\CurrentControlSet\\Services\\Class\\Ports";
-static LPCSTR lpszDCB     = "DCB";
+/***********************************************************************
+ * drvSetDefaultCommConfigA (SERIALUI.@)
+ */
+BOOL WINAPI SERIALUI_CommConfigDialogA(
+	LPCSTR lpszName, HWND hWndParent, LPCOMMCONFIG lpCommConfig )
+{
+    LPWSTR strW = SERIALUI_strdup( lpszName );
+    BOOL r = SERIALUI_CommConfigDialogW( strW, hWndParent, lpCommConfig );
+    SERIALUI_strfree( strW );
+    return r;
+}
+
+static const WCHAR lpszCommKey[] = {
+    'S','y','s','t','e','m','\\',
+    'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+    'S','e','r','v','i','c','e','s','\\',
+    'C','l','a','s','s','\\','P','o','r','t','s',0
+};
+static const WCHAR lpszDCB[]     = {'D','C','B',0};
 
 /***********************************************************************
- * drvSetDefaultCommConfig (SERIALUI.4)
+ * drvSetDefaultCommConfigW (SERIALUI.@)
  *
  * Used by Win98 KERNEL to set the default config for a COMM port
  * FIXME: uses the wrong registry key... should use a digit, not
  *        the comm port name.
  */
-BOOL WINAPI SERIALUI_SetDefaultCommConfig(
-	LPCSTR lpszDevice,
-	LPCOMMCONFIG lpCommConfig,
-	DWORD dwSize
-) {
+BOOL WINAPI SERIALUI_SetDefaultCommConfigW(
+	LPCWSTR lpszDevice, LPCOMMCONFIG lpCommConfig, DWORD dwSize)
+{
     HKEY hKeyReg=0, hKeyPort=0;
-    CHAR szKeyName[100];
+    WCHAR szKeyName[100];
     DWORD r,dwDCBSize;
+    static const WCHAR fmt[] = {'%','s','\\','%','s',0 };
 
     TRACE("%p %p %lx\n",lpszDevice,lpCommConfig,dwSize);
 
@@ -457,17 +497,17 @@
     if(dwSize < sizeof (COMMCONFIG))
         return FALSE;
 
-    r = RegConnectRegistryA(NULL, HKEY_LOCAL_MACHINE, &hKeyReg);
+    r = RegConnectRegistryW(NULL, HKEY_LOCAL_MACHINE, &hKeyReg);
     if(r != ERROR_SUCCESS)
         return FALSE;
 
-    snprintf(szKeyName, sizeof(szKeyName), "%s\\%s", lpszCommKey ,lpszDevice);
-    r = RegCreateKeyA(hKeyReg, szKeyName, &hKeyPort);
+    snprintfW(szKeyName, sizeof(szKeyName)/sizeof(WCHAR), fmt, lpszCommKey ,lpszDevice);
+    r = RegCreateKeyW(hKeyReg, szKeyName, &hKeyPort);
     if(r == ERROR_SUCCESS)
     {
         dwDCBSize = sizeof (DCB);
-        r = RegSetValueExA( hKeyPort, lpszDCB, 0, REG_BINARY,
-                            (LPSTR)&lpCommConfig->dcb,dwDCBSize);
+        r = RegSetValueExW( hKeyPort, lpszDCB, 0, REG_BINARY,
+                            (LPBYTE)&lpCommConfig->dcb,dwDCBSize);
         TRACE("write key r=%ld\n",r);
         RegCloseKey(hKeyPort);
     }
@@ -478,20 +518,31 @@
 }
 
 /***********************************************************************
- * drvGetDefaultCommConfig (SERIALUI.5)
+ * drvSetDefaultCommConfigA (SERIALUI.@)
+ */
+BOOL WINAPI SERIALUI_SetDefaultCommConfigA(
+	LPCSTR lpszDevice, LPCOMMCONFIG lpCommConfig, DWORD dwSize)
+{
+    LPWSTR strW = SERIALUI_strdup( lpszDevice );
+    BOOL r = SERIALUI_SetDefaultCommConfigW( strW, lpCommConfig, dwSize );
+    SERIALUI_strfree( strW );
+    return r;
+}
+
+/***********************************************************************
+ * drvGetDefaultCommConfigW (SERIALUI.@)
  *
  * Used by Win9x KERNEL to get the default config for a COMM port
  * FIXME: uses the wrong registry key... should use a digit, not
  *        the comm port name.
  */
-BOOL WINAPI SERIALUI_GetDefaultCommConfig(
-	LPCSTR lpszDevice,
-	LPCOMMCONFIG lpCommConfig,
-	LPDWORD lpdwSize
-) {
+BOOL WINAPI SERIALUI_GetDefaultCommConfigW(
+	LPCWSTR lpszDevice, LPCOMMCONFIG lpCommConfig, LPDWORD lpdwSize)
+{
     HKEY hKeyReg, hKeyPort;
-    CHAR szKeyName[100];
+    WCHAR szKeyName[100];
     DWORD r,dwSize,dwType;
+    static const WCHAR fmt[] = {'%','s','\\','%','s',0 };
 
     TRACE("%p %p %p\n",lpszDevice,lpCommConfig,lpdwSize);
 
@@ -509,18 +560,18 @@
     lpCommConfig->dwSize = sizeof (COMMCONFIG);
     lpCommConfig->wVersion = 1;
 
-    r = RegConnectRegistryA(NULL, HKEY_LOCAL_MACHINE, &hKeyReg);
+    r = RegConnectRegistryW(NULL, HKEY_LOCAL_MACHINE, &hKeyReg);
     if(r != ERROR_SUCCESS)
         return FALSE;
 
-    snprintf(szKeyName, sizeof(szKeyName), "%s\\%s", lpszCommKey ,lpszDevice);
-    r = RegOpenKeyA(hKeyReg, szKeyName, &hKeyPort);
+    snprintfW(szKeyName, sizeof(szKeyName)/sizeof(WCHAR), fmt, lpszCommKey ,lpszDevice);
+    r = RegOpenKeyW(hKeyReg, szKeyName, &hKeyPort);
     if(r == ERROR_SUCCESS)
     {
         dwSize = sizeof (DCB);
         dwType = 0;
-        r = RegQueryValueExA( hKeyPort, lpszDCB, NULL,
-                             &dwType, (LPSTR)&lpCommConfig->dcb,&dwSize);
+        r = RegQueryValueExW( hKeyPort, lpszDCB, NULL,
+                             &dwType, (LPBYTE)&lpCommConfig->dcb, &dwSize);
         if ((r==ERROR_SUCCESS) && (dwType != REG_BINARY))
             r = 1;
         if ((r==ERROR_SUCCESS) && (dwSize != sizeof(DCB)))
@@ -545,4 +596,16 @@
     RegCloseKey(hKeyReg);
 
     return (r==ERROR_SUCCESS);
+}
+
+/***********************************************************************
+ * drvGetDefaultCommConfigA (SERIALUI.@)
+ */
+BOOL WINAPI SERIALUI_GetDefaultCommConfigA(
+	LPCSTR lpszDevice, LPCOMMCONFIG lpCommConfig, LPDWORD lpdwSize)
+{
+    LPWSTR strW = SERIALUI_strdup( lpszDevice );
+    BOOL r = SERIALUI_GetDefaultCommConfigW( strW, lpCommConfig, lpdwSize );
+    SERIALUI_strfree( strW );
+    return r;
 }
Index: dlls/serialui/serialui.spec
===================================================================
RCS file: /home/wine/wine/dlls/serialui/serialui.spec,v
retrieving revision 1.11
diff -u -r1.11 serialui.spec
--- dlls/serialui/serialui.spec	4 Nov 2002 23:53:44 -0000	1.11
+++ dlls/serialui/serialui.spec	25 Oct 2004 07:33:28 -0000
@@ -1,4 +1,7 @@
-2 stdcall EnumPropPages(ptr ptr ptr) SERIALUI_EnumPropPages
-3 stdcall drvCommConfigDialog(ptr long ptr) SERIALUI_CommConfigDialog
-4 stdcall drvSetDefaultCommConfig(str ptr long) SERIALUI_SetDefaultCommConfig
-5 stdcall drvGetDefaultCommConfig(str ptr ptr) SERIALUI_GetDefaultCommConfig
+@ stdcall EnumPropPages(ptr ptr ptr) SERIALUI_EnumPropPages
+@ stdcall drvCommConfigDialogA(ptr long ptr) SERIALUI_CommConfigDialogA
+@ stdcall drvCommConfigDialogW(ptr long ptr) SERIALUI_CommConfigDialogW
+@ stdcall drvSetDefaultCommConfigA(str ptr long) SERIALUI_SetDefaultCommConfigA
+@ stdcall drvSetDefaultCommConfigW(wstr ptr long) SERIALUI_SetDefaultCommConfigW
+@ stdcall drvGetDefaultCommConfigA(str ptr ptr) SERIALUI_GetDefaultCommConfigA
+@ stdcall drvGetDefaultCommConfigW(wstr ptr ptr) SERIALUI_GetDefaultCommConfigW
Index: dlls/kernel/comm.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/comm.c,v
retrieving revision 1.81
diff -u -r1.81 comm.c
--- dlls/kernel/comm.c	18 Aug 2004 00:04:58 -0000	1.81
+++ dlls/kernel/comm.c	25 Oct 2004 07:33:28 -0000
@@ -2098,7 +2098,8 @@
  * The DLL should be loaded when the COMM port is opened, and closed
  * when the COMM port is closed. - MJM 20 June 2000
  ***********************************************************************/
-static CHAR lpszSerialUI[] = "serialui.dll";
+static WCHAR lpszSerialUI[] = { 
+   's','e','r','i','a','l','u','i','.','d','l','l',0 };
 
 
 /***********************************************************************
@@ -2129,7 +2130,7 @@
 
     TRACE("(%p %p %p)\n",lpszDevice, hWnd, lpCommConfig);
 
-    hConfigModule = LoadLibraryA(lpszSerialUI);
+    hConfigModule = LoadLibraryW(lpszSerialUI);
     if(!hConfigModule)
         return FALSE;
 
@@ -2140,7 +2141,7 @@
 
     r = lpfnCommDialog(lpszDevice,hWnd,lpCommConfig);
 
-    /* UnloadLibrary(hConfigModule); */
+    FreeLibrary(hConfigModule);
 
     return r;
 }
@@ -2236,29 +2237,26 @@
  *
  *  True if the device was found and the defaults set, false otherwise
  */
-BOOL WINAPI SetDefaultCommConfigA(
-    LPCSTR       lpszDevice,   /* [in] The ascii name of the device targeted for configuration. */
+BOOL WINAPI SetDefaultCommConfigW(
+    LPCWSTR       lpszDevice,  /* [in] The ascii name of the device targeted for configuration. */
     LPCOMMCONFIG lpCommConfig, /* [in] The default configuration for the device. */
     DWORD        dwSize)       /* [in] The number of bytes in the configuration structure. */
 {
     FARPROC lpfnSetDefaultCommConfig;
     HMODULE hConfigModule;
-    BOOL r;
+    BOOL r = FALSE;
 
     TRACE("(%p %p %lx)\n",lpszDevice, lpCommConfig, dwSize);
 
-    hConfigModule = LoadLibraryA(lpszSerialUI);
+    hConfigModule = LoadLibraryW(lpszSerialUI);
     if(!hConfigModule)
-        return FALSE;
+        return r;
 
-    lpfnSetDefaultCommConfig = GetProcAddress(hConfigModule, (LPCSTR)4L);
+    lpfnSetDefaultCommConfig = GetProcAddress(hConfigModule, "drvSetDefaultCommConfigW");
+    if (lpfnSetDefaultCommConfig)
+        r = lpfnSetDefaultCommConfig(lpszDevice, lpCommConfig, dwSize);
 
-    if(! lpfnSetDefaultCommConfig)
-	return TRUE;
-
-    r = lpfnSetDefaultCommConfig(lpszDevice, lpCommConfig, dwSize);
-
-    /* UnloadLibrary(hConfigModule); */
+    FreeLibrary(hConfigModule);
 
     return r;
 }
@@ -2273,21 +2271,26 @@
  * RETURNS
  *
  */
-BOOL WINAPI SetDefaultCommConfigW(
-    LPCWSTR      lpszDevice,   /* [in] The unicode name of the device targeted for configuration. */
+BOOL WINAPI SetDefaultCommConfigA(
+    LPCSTR      lpszDevice,    /* [in] The unicode name of the device targeted for configuration. */
     LPCOMMCONFIG lpCommConfig, /* [in] The default configuration for the device. */
     DWORD        dwSize)       /* [in] The number of bytes in the configuration structure. */
 {
     BOOL r;
-    LPSTR lpDeviceA;
+    LPWSTR lpDeviceW = NULL;
+    DWORD len;
 
-    TRACE("(%s %p %lx)\n",debugstr_w(lpszDevice),lpCommConfig,dwSize);
+    TRACE("(%s %p %lx)\n",debugstr_a(lpszDevice),lpCommConfig,dwSize);
 
-    lpDeviceA = HEAP_strdupWtoA( GetProcessHeap(), 0, lpszDevice );
-    if(lpDeviceA)
-        return FALSE;
-    r = SetDefaultCommConfigA(lpDeviceA,lpCommConfig,dwSize);
-    HeapFree( GetProcessHeap(), 0, lpDeviceA );
+    if (lpszDevice)
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, lpszDevice, -1, NULL, 0 );
+        lpDeviceW = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+        MultiByteToWideChar( CP_ACP, 0, lpszDevice, -1, lpDeviceW, len );
+    }
+    r = SetDefaultCommConfigW(lpDeviceW,lpCommConfig,dwSize);
+    if (lpDeviceW) 
+        HeapFree( GetProcessHeap(), 0, lpDeviceW );
     return r;
 }
 


More information about the wine-patches mailing list