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