Detlef Riekenberg : localui: Implement ConfigurePortUI for LPT.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 7 09:10:25 CDT 2007


Module: wine
Branch: master
Commit: 406e5255dcf6a790f73ca08c4c9347c2c850395f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=406e5255dcf6a790f73ca08c4c9347c2c850395f

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Sat May  5 00:19:33 2007 +0200

localui: Implement ConfigurePortUI for LPT.

---

 dlls/localui/localui.c |  122 ++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/localui/localui.h |    6 ++-
 dlls/localui/ui_En.rc  |   13 +++++
 3 files changed, 140 insertions(+), 1 deletions(-)

diff --git a/dlls/localui/localui.c b/dlls/localui/localui.c
index 05950e3..55b035a 100644
--- a/dlls/localui/localui.c
+++ b/dlls/localui/localui.c
@@ -42,15 +42,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(localui);
 static HINSTANCE LOCALUI_hInstance;
 
 static const WCHAR cmd_AddPortW[] = {'A','d','d','P','o','r','t',0};
+static const WCHAR cmd_ConfigureLPTPortCommandOKW[] = {'C','o','n','f','i','g','u','r','e',
+                                    'L','P','T','P','o','r','t',
+                                    'C','o','m','m','a','n','d','O','K',0};
 static const WCHAR cmd_DeletePortW[] = {'D','e','l','e','t','e','P','o','r','t',0};
 static const WCHAR cmd_GetDefaultCommConfigW[] = {'G','e','t',
                                     'D','e','f','a','u','l','t',
                                     'C','o','m','m','C','o','n','f','i','g',0};
+static const WCHAR cmd_GetTransmissionRetryTimeoutW[] = {'G','e','t',
+                                    'T','r','a','n','s','m','i','s','s','i','o','n',
+                                    'R','e','t','r','y','T','i','m','e','o','u','t',0};
 static const WCHAR cmd_PortIsValidW[] = {'P','o','r','t','I','s','V','a','l','i','d',0};
 static const WCHAR cmd_SetDefaultCommConfigW[] = {'S','e','t',
                                     'D','e','f','a','u','l','t',
                                     'C','o','m','m','C','o','n','f','i','g',0};
 
+static const WCHAR fmt_uW[]  = {'%','u',0};
 static const WCHAR portname_LPT[]  = {'L','P','T',0};
 static const WCHAR portname_COM[]  = {'C','O','M',0};
 static const WCHAR portname_FILE[] = {'F','I','L','E',':',0};
@@ -67,6 +74,14 @@ typedef struct tag_addportui_t {
     HANDLE  hXcv;
 } addportui_t;
 
+typedef struct tag_lptconfig_t {
+    HANDLE  hXcv;
+    DWORD   value;
+} lptconfig_t;
+
+
+static INT_PTR CALLBACK dlgproc_lptconfig(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
+
 /*****************************************************
  *   strdupWW [internal]
  */
@@ -131,6 +146,29 @@ static BOOL dlg_configure_com(HANDLE hXcv, HWND hWnd, PCWSTR pPortName)
     return FALSE;
 }
 
+
+/*****************************************************
+ *   dlg_configure_lpt [internal]
+ *
+ */
+
+static BOOL dlg_configure_lpt(HANDLE hXcv, HWND hWnd)
+{
+    lptconfig_t data;
+    BOOL  res;
+
+
+    data.hXcv = hXcv;
+
+    res = DialogBoxParamW(LOCALUI_hInstance, MAKEINTRESOURCEW(LPTCONFIG_DIALOG), hWnd,
+                               dlgproc_lptconfig, (LPARAM) &data);
+
+    TRACE("got %u with %u\n", res, GetLastError());
+
+    if (!res) SetLastError(ERROR_CANCELLED);
+    return res;
+}
+
 /******************************************************************
  *  dlg_port_already_exists [internal]
  */
@@ -291,6 +329,86 @@ static INT_PTR CALLBACK dlgproc_addport(HWND hwnd, UINT msg, WPARAM wparam, LPAR
     return FALSE;
 }
 
+/*****************************************************************************
+ *   dlgproc_lptconfig  [internal]
+ *
+ * Our message-proc is simple, as the range-check is done only during the
+ * command "OK" and the dialog is set to the start-value at "out of range".
+ *
+ * Native localui.dll does the check during keyboard-input and set the dialog
+ * to the previous value.
+ *
+ */
+
+static INT_PTR CALLBACK dlgproc_lptconfig(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    lptconfig_t * data;
+    WCHAR   bufferW[16];
+    DWORD   status;
+    DWORD   dummy;
+    DWORD   len;
+    DWORD   res;
+
+
+    switch(msg)
+    {
+    case WM_INITDIALOG:
+        SetWindowLongPtrW(hwnd, DWLP_USER, lparam);
+        data = (lptconfig_t *) lparam;
+
+        /* Get current setting */
+        data->value = 45;
+        status = ERROR_SUCCESS;
+        res = XcvDataW( data->hXcv, cmd_GetTransmissionRetryTimeoutW,
+                        (PBYTE) &dummy, 0,
+                        (PBYTE) &data->value, sizeof(data->value), &len, &status);
+
+        TRACE("got %u with status %u\n", res, status);
+
+        /* Set current setting as the initial value in the Dialog */
+        SetDlgItemInt(hwnd, LPTCONFIG_EDIT, data->value, FALSE);
+        return TRUE;
+
+    case WM_COMMAND:
+        if (wparam == MAKEWPARAM(IDOK, BN_CLICKED))
+        {
+            data = (lptconfig_t *) GetWindowLongPtrW(hwnd, DWLP_USER);
+
+            status = FALSE;
+            res = GetDlgItemInt(hwnd, LPTCONFIG_EDIT, (BOOL *) &status, FALSE);
+            /* length is in WCHAR, including the '\0' */
+            GetDlgItemTextW(hwnd, LPTCONFIG_EDIT, bufferW, sizeof(bufferW) / sizeof(bufferW[0]));
+            TRACE("got %s and %u (translated: %u)\n", debugstr_w(bufferW), res, status);
+
+            /* native localui.dll use the same limits */
+            if ((res > 0) && (res < 1000000) && status) {
+                sprintfW(bufferW, fmt_uW, res);
+                res = XcvDataW( data->hXcv, cmd_ConfigureLPTPortCommandOKW,
+                        (PBYTE) bufferW,
+                        (lstrlenW(bufferW) +1) * sizeof(WCHAR),
+                        (PBYTE) &dummy, 0, &len, &status);
+
+                TRACE("got %u with status %u\n", res, status);
+                EndDialog(hwnd, TRUE);
+                return TRUE;
+            }
+
+            /* Set initial value and rerun the Dialog */
+            SetDlgItemInt(hwnd, LPTCONFIG_EDIT, data->value, FALSE);
+            return TRUE;
+        }
+
+        if (wparam == MAKEWPARAM(IDCANCEL, BN_CLICKED))
+        {
+            EndDialog(hwnd, FALSE);
+            return TRUE;
+        }
+        return FALSE;
+    }
+    return FALSE;
+}
+
+
 /*****************************************************
  * get_type_from_name (internal)
  *
@@ -471,6 +589,10 @@ static BOOL WINAPI localui_ConfigurePortUI(PCWSTR pName, HWND hWnd, PCWSTR pPort
             res = dlg_configure_com(hXcv, hWnd, pPortName);
             break;
 
+        case PORT_IS_LPT:
+            res = dlg_configure_lpt(hXcv, hWnd);
+            break;
+
         default:
             dlg_nothingtoconfig(hWnd);
             SetLastError(ERROR_CANCELLED);
diff --git a/dlls/localui/localui.h b/dlls/localui/localui.h
index 599ef58..aa244bd 100644
--- a/dlls/localui/localui.h
+++ b/dlls/localui/localui.h
@@ -24,7 +24,11 @@
 
 /* ## Resource-ID ## */
 #define ADDPORT_DIALOG  100
-#define ADDPORT_EDIT    201
+#define ADDPORT_EDIT    101
+
+#define LPTCONFIG_DIALOG 200
+#define LPTCONFIG_GROUP  201
+#define LPTCONFIG_EDIT   202
 
 #define IDS_LOCALPORT       300
 #define IDS_INVALIDNAME     301
diff --git a/dlls/localui/ui_En.rc b/dlls/localui/ui_En.rc
index 8a1e5b9..c2de626 100644
--- a/dlls/localui/ui_En.rc
+++ b/dlls/localui/ui_En.rc
@@ -32,6 +32,19 @@ BEGIN
 END
 
 
+LPTCONFIG_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Configure LPT Port"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Timeout (seconds)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
+    LTEXT "&Transmission Retry:", -1, 14, 22, 90, 13, WS_VISIBLE
+    EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER
+    DEFPUSHBUTTON "OK", IDOK, 164, 10, 50, 14, WS_VISIBLE
+    PUSHBUTTON "Cancel", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
+END
+
+
 STRINGTABLE DISCARDABLE
 {
     IDS_LOCALPORT "Local Port"




More information about the wine-cvs mailing list