serialui: [1/2] Fix returntype for CommConfigDialog

Detlef Riekenberg wine.dev at web.de
Mon Mar 5 22:40:56 CST 2007


serialui: Fix returntype for CommConfigDialog


-- 
 
By by ... Detlef

-------------- next part --------------
>From 9e41295a4d568ec8428024a5ab595c2bc650d41d Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Tue, 6 Mar 2007 05:36:14 +0100
Subject: [PATCH] serialui: Fix returntype for CommConfigDialog
---
 dlls/kernel32/comm.c    |   48 ++++++++++++++++++++++-------------------------
 dlls/serialui/confdlg.c |   38 ++++++++++++++++++++++---------------
 2 files changed, 44 insertions(+), 42 deletions(-)

diff --git a/dlls/kernel32/comm.c b/dlls/kernel32/comm.c
index 8fc1033..076b761 100644
--- a/dlls/kernel32/comm.c
+++ b/dlls/kernel32/comm.c
@@ -1194,23 +1194,20 @@ BOOL WINAPI CommConfigDialogA(
     HWND hWnd,                 /* [in] parent window for the dialog */
     LPCOMMCONFIG lpCommConfig) /* [out] pointer to struct to fill */
 {
-    FARPROC lpfnCommDialog;
-    HMODULE hConfigModule;
-    BOOL r = FALSE;
+    LPWSTR  lpDeviceW = NULL;
+    DWORD   len;
+    BOOL    r;
 
     TRACE("(%s, %p, %p)\n", debugstr_a(lpszDevice), hWnd, lpCommConfig);
 
-    hConfigModule = LoadLibraryW(lpszSerialUI);
-    if(!hConfigModule)
-        return FALSE;
-
-    lpfnCommDialog = GetProcAddress(hConfigModule, "drvCommConfigDialogA");
-
-    if(lpfnCommDialog)
-        r = lpfnCommDialog(lpszDevice,hWnd,lpCommConfig);
-
-    FreeLibrary(hConfigModule);
-
+    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 = CommConfigDialogW(lpDeviceW, hWnd, lpCommConfig);
+    HeapFree( GetProcessHeap(), 0, lpDeviceW );
     return r;
 }
 
@@ -1224,24 +1221,23 @@ BOOL WINAPI CommConfigDialogW(
     HWND hWnd,                 /* [in] parent window for the dialog */
     LPCOMMCONFIG lpCommConfig) /* [out] pointer to struct to fill */
 {
-    FARPROC lpfnCommDialog;
+    FARPROC pCommConfigDialog;
     HMODULE hConfigModule;
-    BOOL r = FALSE;
+    DWORD   res = ERROR_INVALID_PARAMETER;
 
     TRACE("(%s, %p, %p)\n", debugstr_w(lpszDevice), hWnd, lpCommConfig);
-
     hConfigModule = LoadLibraryW(lpszSerialUI);
-    if(!hConfigModule)
-        return FALSE;
-
-    lpfnCommDialog = GetProcAddress(hConfigModule, "drvCommConfigDialogW");
 
-    if(lpfnCommDialog)
-        r = lpfnCommDialog(lpszDevice,hWnd,lpCommConfig);
-
-    FreeLibrary(hConfigModule);
+    if (hConfigModule) {
+        pCommConfigDialog = GetProcAddress(hConfigModule, "drvCommConfigDialogW");
+        if (pCommConfigDialog) {
+            res = pCommConfigDialog(lpszDevice, hWnd, lpCommConfig);
+        }
+        FreeLibrary(hConfigModule);
+    }
 
-    return r;
+    if (res) SetLastError(res);
+    return (res == ERROR_SUCCESS);
 }
 
 /***********************************************************************
diff --git a/dlls/serialui/confdlg.c b/dlls/serialui/confdlg.c
index 4de730d..6b5dbe2 100644
--- a/dlls/serialui/confdlg.c
+++ b/dlls/serialui/confdlg.c
@@ -376,10 +376,10 @@ static INT_PTR CALLBACK SERIALUI_ConfigD
         {
         case IDOK:
             SERIALUI_DialogInfoToDCB(hWnd,info);
-            EndDialog(hWnd,1);
+            EndDialog(hWnd, ERROR_SUCCESS);
             return TRUE;
         case IDCANCEL:
-            EndDialog(hWnd,0);
+            EndDialog(hWnd, ERROR_CANCELLED);
             return TRUE;
 /* test code for Get/SetDefaultCommConfig begins */
         case ID_GETDEFAULT:
@@ -431,38 +431,44 @@ static VOID SERIALUI_strfree( LPWSTR str
 /***********************************************************************
  * drvCommConfigDialogW (SERIALUI.@)
  *
- * Used by Win9x KERNEL to show a dialog for configuring a COMM port.
+ * Show a dialog for configuring a Serial Port.
+ *
  */
-BOOL WINAPI drvCommConfigDialogW(
-	LPCWSTR lpszName,
-	HWND hWndParent,
-	LPCOMMCONFIG lpCommConfig
-) {
+DWORD WINAPI drvCommConfigDialogW(LPCWSTR lpszName, HWND hWndParent, LPCOMMCONFIG lpCommConfig)
+{
     SERIALUI_DialogInfo info;
+    INT res;
 
     info.lpCommConfig  = lpCommConfig;
     info.lpszDevice    = lpszName;
     info.bConvert      = FALSE;
     info.dwFlowControl = 0;
 
-    if(!lpCommConfig)
-        return FALSE;
+    if ((!lpCommConfig) || (!lpszName))
+        return ERROR_INVALID_PARAMETER;
 
-    return DialogBoxParamW(SERIALUI_hModule,
+    if (lpCommConfig->dwSize < sizeof(COMMCONFIG))
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    if (!lpszName[0])
+        return ERROR_BADKEY;
+
+    res = DialogBoxParamW( SERIALUI_hModule,
                            MAKEINTRESOURCEW(IDD_SERIALUICONFIG),
                            hWndParent,
                            SERIALUI_ConfigDialogProc,
                            (LPARAM)&info);
+
+    return (res == -1) ? GetLastError() : res ;
 }
 
 /***********************************************************************
  * drvCommConfigDialogA (SERIALUI.@)
  */
-BOOL WINAPI drvCommConfigDialogA(
-	LPCSTR lpszName, HWND hWndParent, LPCOMMCONFIG lpCommConfig )
+DWORD WINAPI drvCommConfigDialogA(LPCSTR lpszName, HWND hWndParent, LPCOMMCONFIG lpCommConfig)
 {
     LPWSTR strW = SERIALUI_strdup( lpszName );
-    BOOL r = drvCommConfigDialogW( strW, hWndParent, lpCommConfig );
+    DWORD r = drvCommConfigDialogW( strW, hWndParent, lpCommConfig );
     SERIALUI_strfree( strW );
     return r;
 }
@@ -560,7 +566,8 @@ DWORD WINAPI drvGetDefaultCommConfigW(
     r = sizeof(comW) / sizeof(WCHAR);       /* len of "com\0" */
     lstrcpynW(szKeyName, lpszDevice, r);    /* simulate a lstrcmpnW */
     r--;
-    if( lstrcmpW(szKeyName, comW) ||
+
+    if( lstrcmpiW(szKeyName, comW) ||
         (lpszDevice[r] < '1') || (lpszDevice[r] > '9') || lpszDevice[r+1]) {
         return ERROR_BADKEY;
     }
@@ -593,7 +600,6 @@ DWORD WINAPI drvGetDefaultCommConfigW(
     else
     {
         /* FIXME: default to a hardcoded commconfig */
-
         lpCommConfig->dcb.DCBlength = sizeof(DCB);
         lpCommConfig->dcb.BaudRate = 9600;
         lpCommConfig->dcb.fBinary = TRUE;
-- 
1.4.1



More information about the wine-patches mailing list