From dc2461e8044fd0154ea462b4d9a500fa58d926a7 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Sat, 15 Jul 2000 21:35:55 +0000 Subject: [PATCH] Implemented serialui dll containing CommConfigDialog, GetDefaultCommConfig and SetDefaultCommConfig. --- Make.rules.in | 1 + configure | 2 + configure.in | 1 + dlls/Makefile.in | 5 + dlls/serialui/.cvsignore | 4 + dlls/serialui/Makefile.in | 16 ++ dlls/serialui/confdlg.c | 543 +++++++++++++++++++++++++++++++++++ dlls/serialui/serialui.h | 9 + dlls/serialui/serialui.spec | 9 + dlls/serialui/serialui_rc.rc | 26 ++ 10 files changed, 616 insertions(+) create mode 100644 dlls/serialui/.cvsignore create mode 100644 dlls/serialui/Makefile.in create mode 100644 dlls/serialui/confdlg.c create mode 100644 dlls/serialui/serialui.h create mode 100644 dlls/serialui/serialui.spec create mode 100644 dlls/serialui/serialui_rc.rc diff --git a/Make.rules.in b/Make.rules.in index de70b811322..0fa344f0b35 100644 --- a/Make.rules.in +++ b/Make.rules.in @@ -132,6 +132,7 @@ DLLS = \ rasapi32 \ riched32 \ rpcrt4 \ + serialui \ setupapi \ setupx \ shell32 \ diff --git a/configure b/configure index 25880d3bd2f..349606f227b 100755 --- a/configure +++ b/configure @@ -6210,6 +6210,7 @@ dlls/psapi/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile +dlls/serialui/Makefile dlls/setupapi/Makefile dlls/setupx/Makefile dlls/shell32/Makefile @@ -6450,6 +6451,7 @@ dlls/psapi/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile +dlls/serialui/Makefile dlls/setupapi/Makefile dlls/setupx/Makefile dlls/shell32/Makefile diff --git a/configure.in b/configure.in index aad7852ad5b..071287202a6 100644 --- a/configure.in +++ b/configure.in @@ -1009,6 +1009,7 @@ dlls/psapi/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile +dlls/serialui/Makefile dlls/setupapi/Makefile dlls/setupx/Makefile dlls/shell32/Makefile diff --git a/dlls/Makefile.in b/dlls/Makefile.in index a7c8d49334d..f554ef25cdc 100644 --- a/dlls/Makefile.in +++ b/dlls/Makefile.in @@ -44,6 +44,7 @@ DLLFILES = \ rasapi32/librasapi32.@LIBEXT@ \ richedit/libriched32.@LIBEXT@ \ rpcrt4/librpcrt4.@LIBEXT@ \ + serialui/libserialui.@LIBEXT@ \ setupx/libsetupx.@LIBEXT@ \ setupapi/libsetupapi.@LIBEXT@ \ shell32/libshell32.@LIBEXT@ \ @@ -150,6 +151,7 @@ SUBDIRS = \ rasapi32 \ richedit \ rpcrt4 \ + serialui \ setupx \ shell32 \ shfolder \ @@ -304,6 +306,9 @@ libriched32.@LIBEXT@: richedit/libriched32.@LIBEXT@ librpcrt4.@LIBEXT@: rpcrt4/librpcrt4.@LIBEXT@ $(RM) $@ && $(LN_S) rpcrt4/librpcrt4.@LIBEXT@ $@ +libserialui.@LIBEXT@: serialui/libserialui.@LIBEXT@ + $(RM) $@ && $(LN_S) serialui/libserialui.@LIBEXT@ $@ + libsetupapi.@LIBEXT@: setupapi/libsetupapi.@LIBEXT@ $(RM) $@ && $(LN_S) setupapi/libsetupapi.@LIBEXT@ $@ diff --git a/dlls/serialui/.cvsignore b/dlls/serialui/.cvsignore new file mode 100644 index 00000000000..ce9997d6a63 --- /dev/null +++ b/dlls/serialui/.cvsignore @@ -0,0 +1,4 @@ +Makefile +libserialui.so.1.0 +serialui.spec.c +serialui_rc.s diff --git a/dlls/serialui/Makefile.in b/dlls/serialui/Makefile.in new file mode 100644 index 00000000000..3139dda4a8e --- /dev/null +++ b/dlls/serialui/Makefile.in @@ -0,0 +1,16 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = serialui +SOVERSION = 1.0 + +C_SRCS = \ + confdlg.c + +RC_SRCS= \ + serialui_rc.rc + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/dlls/serialui/confdlg.c b/dlls/serialui/confdlg.c new file mode 100644 index 00000000000..63479c43de1 --- /dev/null +++ b/dlls/serialui/confdlg.c @@ -0,0 +1,543 @@ +/* + * This DLL contains the user interface for the serial driver. + * a Dialog box to configure the specified COMM port + * an interface to the control panel (??) + * functions to load and save default configuration + * + * Eventually the 32 bit comm port driver could be moved into here + * and interfaced to KERNEL32 using the WIN95 or WINNT comm driver interface. + * This way, different driver DLLS could be written to support other + * serial interfaces, such as X.25, etc. + * + * Basic structure copied from COMCTL32 code. + * + * Copyright 2000 Mike McCormack + */ + +#include + +#include "winbase.h" +#include "winreg.h" +#include "dialog.h" +#include "win.h" +#include "debugtools.h" +#include "serialui.h" +#include "winerror.h" + +#include "queue.h" +#include "message.h" + +DEFAULT_DEBUG_CHANNEL(comm) + +HMODULE SERIALUI_hModule = 0; +DWORD SERIALUI_dwProcessesAttached = 0; + +/*********************************************************************** + * SERIALUI_LibMain [Internal] Initializes the internal 'SERIALUI.DLL'. + * + * PARAMS + * hinstDLL [I] handle to the 'dlls' instance + * fdwReason [I] + * lpvReserved [I] reserverd, must be NULL + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ + +BOOL WINAPI +SERIALUI_LibMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved); + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + if (SERIALUI_dwProcessesAttached == 0) { + + /* This will be wrong for any other process attching in this address-space! */ + SERIALUI_hModule = (HMODULE)hinstDLL; + + } + SERIALUI_dwProcessesAttached++; + break; + + case DLL_PROCESS_DETACH: + SERIALUI_dwProcessesAttached--; + if (SERIALUI_dwProcessesAttached == 0) { + TRACE("Last Process detached\n"); + } + break; + } + + return TRUE; +} + + +/*********************************************************************** + * SERIALUI_EnumPropPages (SERIALUI.2) + * + * Called by the device manager to add prop sheets in Control Panel ??? + * Pointed to in Win98 registry by + * \System\CurrentControlSet\Services\Class\ports\0000\EnumPropPages = + * "serialui.dll,EnumPropPages" + */ +typedef LPVOID LPDEVICE_INFO; +typedef LPVOID LPFNADDPROPSHEETPAGE; +BOOL WINAPI SERIALUI_EnumPropPages(LPDEVICE_INFO pdi, LPFNADDPROPSHEETPAGE pfnAdd, LPARAM lParam ) +{ + FIXME("(%p %p %lx)\n",pdi,pfnAdd,lParam); + return FALSE; +} + +/* + * These data structures are convert from values used in fields of a DCB + * to strings used in the CommConfigDialog. + */ +typedef struct tagPARAM2STRDATA +{ + DWORD val; + CONST CHAR *name; +} PARAM2STRDATA, *LPPARAM2STRDATA; + +typedef struct tagPARAM2STR +{ + DWORD dwSize; + LPPARAM2STRDATA data; +} PARAM2STR, *LPPARAM2STR; +typedef const LPPARAM2STR LPCPARAM2STR; + +#define SERIALUI_TABLESIZE(x) ((sizeof (x))/(sizeof (x[0]))) + +static PARAM2STRDATA SERIALUI_Baud2StrData[]={ + {110, "110"}, {300, "300"}, {600, "600"}, {1200, "1200"}, + {2400, "2400"}, {4800, "4800"}, {9600, "9600"}, {14400, "14400"}, + {19200, "19200"}, {38400L, "38400"}, {56000L, "56000"}, {57600L, "57600"}, + {115200L, "115200"}, {128000L, "128000"}, {256000L, "256000"} +}; +static PARAM2STR SERIALUI_Baud2Str={ SERIALUI_TABLESIZE(SERIALUI_Baud2StrData),SERIALUI_Baud2StrData }; + +static PARAM2STRDATA SERIALUI_Parity2StrData[]={ + {NOPARITY,"None"}, {ODDPARITY,"Odd"}, {EVENPARITY,"Even"}, {MARKPARITY,"Mark"}, + {SPACEPARITY,"Space"} +}; +static PARAM2STR SERIALUI_Parity2Str={ SERIALUI_TABLESIZE(SERIALUI_Parity2StrData),SERIALUI_Parity2StrData }; + +static PARAM2STRDATA SERIALUI_Stop2StrData[]={ + {ONESTOPBIT,"1"}, {ONE5STOPBITS,"1.5"}, {TWOSTOPBITS,"2"} +}; +static PARAM2STR SERIALUI_Stop2Str={ SERIALUI_TABLESIZE(SERIALUI_Stop2StrData),SERIALUI_Stop2StrData }; + +static PARAM2STRDATA SERIALUI_Data2StrData[]={ + {5,"5"}, {6,"6"}, {7,"7"}, {8, "8"}, {16,"16"} +}; +static PARAM2STR SERIALUI_Data2Str={ SERIALUI_TABLESIZE(SERIALUI_Data2StrData),SERIALUI_Data2StrData }; + +static PARAM2STRDATA SERIALUI_Flow2StrData[]={ + {0,"None"}, {1,"Hardware (RTS/CTS)"}, {2,"Software (XON/XOFF)"} +}; +static PARAM2STR SERIALUI_Flow2Str={ SERIALUI_TABLESIZE(SERIALUI_Flow2StrData),SERIALUI_Flow2StrData }; + +/* + * Add all the fields to a combo box and highlight the current value + */ +static void SERIALUI_AddConfItems(HWND hDlg, DWORD id, LPCPARAM2STR table, DWORD dwVal) +{ + int i,n; + HWND hControl = GetDlgItem(hDlg,id); + + if(!hControl) + return; + + for(i=0; idwSize; i++) + { + n = SendMessageA(hControl, CB_ADDSTRING, 0L, (LPARAM)table->data[i].name); + if(dwVal == table->data[i].val) + { + SendMessageA(hControl, CB_SETCURSEL, (WPARAM)n, (LPARAM)0); + } + } +} + +/* + * Get the current sellection of the given combo box and set a DCB field to + * the value matching that selection. + */ +static BOOL SERIALUI_GetConfItems(HWND hDlg, DWORD id, LPCPARAM2STR table, LPDWORD lpdwVal) +{ + DWORD i; + CHAR lpEntry[20]; + HWND hControl = GetDlgItem(hDlg,id); + + if( (!hControl) || (!lpdwVal)) + { + TRACE("Couldn't get window handle for item %lx\n",id); + return FALSE; + } + + if(!GetWindowTextA(hControl, &lpEntry[0], sizeof lpEntry)) + { + TRACE("Couldn't get window text for item %lx\n",id); + return FALSE; + } + /* TRACE("%ld contains %s\n",id, lpEntry); */ + + for(i=0; idwSize; i++) + { + if(!lstrcmpA(table->data[i].name,lpEntry)) + { + *lpdwVal = table->data[i].val; + return TRUE; + } + } + + return FALSE; +} + +/* + * Both the enumerated values CBR_XXXX and integer baud rates are valid + * dcb.BaudRate. This code is to convert back and forth between CBR_ style + * and integers. The dialog box uses integer values. + */ +static DWORD SERIALUI_BaudConvertTable[] = { + CBR_110, 110, CBR_300, 300, CBR_600, 600, CBR_1200, 1200, + CBR_2400, 2400, CBR_4800, 4800, CBR_9600, 9600, CBR_14400, 14400, + CBR_19200, 19200, CBR_38400, 38400, CBR_56000, 56000, CBR_57600, 57600, + CBR_115200, 115200, CBR_128000, 128000, CBR_256000, 256000 +}; + +static BOOL SERIALUI_MakeBaudDword(LPDWORD lpdwBaudRate) +{ + int i; + + for(i=0; i<(sizeof(SERIALUI_BaudConvertTable)/sizeof(DWORD)); i+=2) + { + if(*lpdwBaudRate == SERIALUI_BaudConvertTable[i]) + { + *lpdwBaudRate = SERIALUI_BaudConvertTable[i+1]; + return TRUE; + } + } + return FALSE; +} + +static BOOL SERIALUI_MakeBaudEnum(LPDWORD lpdwBaudRate) +{ + int i; + + for(i=0; i<(sizeof(SERIALUI_BaudConvertTable)/sizeof(DWORD)); i+=2) + { + if(*lpdwBaudRate == SERIALUI_BaudConvertTable[i+1]) + { + *lpdwBaudRate = SERIALUI_BaudConvertTable[i]; + return TRUE; + } + } + return FALSE; +} + +typedef struct tagSERIALUI_DialogInfo +{ + LPCSTR lpszDevice; + LPCOMMCONFIG lpCommConfig; + BOOL bConvert; /* baud rate was converted to a DWORD */ + DWORD dwFlowControl; /* old flow control */ +} SERIALUI_DialogInfo; + +static void SERIALUI_DCBToDialogInfo(HWND hDlg, SERIALUI_DialogInfo *info) +{ + DWORD dwBaudRate, dwStopBits, dwParity, dwByteSize, dwFlowControl; + LPDCB lpdcb = &info->lpCommConfig->dcb; + + /* pass integer pointers to SERIALUI_ dialog config fns */ + dwBaudRate = lpdcb->BaudRate; + dwStopBits = lpdcb->StopBits; + dwParity = lpdcb->Parity; + dwByteSize = lpdcb->ByteSize; + + /* map flow control state, if it looks normal */ + if((lpdcb->fRtsControl == RTS_CONTROL_HANDSHAKE) || + (lpdcb->fOutxCtsFlow == TRUE)) { + dwFlowControl = 1; + } else if(lpdcb->fOutX || lpdcb->fInX) { + dwFlowControl = 2; + } else { + dwFlowControl = 0; + } + + info->bConvert = SERIALUI_MakeBaudDword(&dwBaudRate); + + SERIALUI_AddConfItems( hDlg, IDC_BAUD, &SERIALUI_Baud2Str ,dwBaudRate); + SERIALUI_AddConfItems( hDlg, IDC_STOP, &SERIALUI_Stop2Str ,dwStopBits); + SERIALUI_AddConfItems( hDlg, IDC_PARITY, &SERIALUI_Parity2Str ,dwParity); + SERIALUI_AddConfItems( hDlg, IDC_DATA, &SERIALUI_Data2Str ,dwByteSize); + SERIALUI_AddConfItems( hDlg, IDC_FLOW, &SERIALUI_Flow2Str, dwFlowControl ); + + info->dwFlowControl = dwFlowControl; +} + +static void SERIALUI_DialogInfoToDCB(HWND hDlg, SERIALUI_DialogInfo *info) +{ + DWORD dwBaudRate, dwStopBits, dwParity, dwByteSize, dwFlowControl; + LPDCB lpdcb = &info->lpCommConfig->dcb; + + SERIALUI_GetConfItems( hDlg, IDC_BAUD, &SERIALUI_Baud2Str, &dwBaudRate); + SERIALUI_GetConfItems( hDlg, IDC_STOP, &SERIALUI_Stop2Str, &dwStopBits); + SERIALUI_GetConfItems( hDlg, IDC_PARITY, &SERIALUI_Parity2Str, &dwParity); + SERIALUI_GetConfItems( hDlg, IDC_DATA, &SERIALUI_Data2Str, &dwByteSize); + SERIALUI_GetConfItems( hDlg, IDC_FLOW, &SERIALUI_Flow2Str, &dwFlowControl ); + + TRACE("baud=%ld stop=%ld parity=%ld data=%ld flow=%ld\n", + dwBaudRate, dwStopBits, dwParity, dwByteSize, dwFlowControl); + + lpdcb->BaudRate = dwBaudRate; + lpdcb->StopBits = dwStopBits; + lpdcb->Parity = dwParity; + lpdcb->ByteSize = dwByteSize; + + /* try not to change flow control if the user didn't change it */ + if(info->dwFlowControl != dwFlowControl) + { + switch(dwFlowControl) + { + case 0: + lpdcb->fOutxCtsFlow = FALSE; + lpdcb->fOutxDsrFlow = FALSE; + lpdcb->fDtrControl = DTR_CONTROL_DISABLE; + lpdcb->fOutX = FALSE; + lpdcb->fInX = FALSE; + lpdcb->fRtsControl = RTS_CONTROL_DISABLE; + break; + case 1: /* CTS/RTS */ + lpdcb->fOutxCtsFlow = TRUE; + lpdcb->fOutxDsrFlow = FALSE; + lpdcb->fDtrControl = DTR_CONTROL_DISABLE; + lpdcb->fOutX = FALSE; + lpdcb->fInX = FALSE; + lpdcb->fRtsControl = RTS_CONTROL_HANDSHAKE; + break; + case 2: + lpdcb->fOutxCtsFlow = FALSE; + lpdcb->fOutxDsrFlow = FALSE; + lpdcb->fDtrControl = DTR_CONTROL_DISABLE; + lpdcb->fOutX = TRUE; + lpdcb->fInX = TRUE; + lpdcb->fRtsControl = RTS_CONTROL_DISABLE; + break; + } + } + + if(info->bConvert) + SERIALUI_MakeBaudEnum(&lpdcb->BaudRate); +} + +/*********************************************************************** + * SERIALUI_ConfigDialogProc + * + * Shows a dialog for configuring a COMM port + */ +BOOL WINAPI SERIALUI_ConfigDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CHAR szTitle[30]; + SERIALUI_DialogInfo *info; + + switch (uMsg) + { + case WM_INITDIALOG: + info = (SERIALUI_DialogInfo*) lParam; + if(!info) + return FALSE; + SetWindowLongA(hWnd, DWL_USER, lParam); + wsnprintfA(szTitle, sizeof szTitle, "Settings for %s", info->lpszDevice); + SetWindowTextA(hWnd, szTitle); + SERIALUI_DCBToDialogInfo(hWnd, info); + return TRUE; + + case WM_COMMAND: + { + WORD wID = LOWORD(wParam); + + info = (SERIALUI_DialogInfo *) GetWindowLongA(hWnd, DWL_USER); + if(!info) + EndDialog(hWnd,0); + switch (wID) + { + case IDOK: + SERIALUI_DialogInfoToDCB(hWnd,info); + EndDialog(hWnd,1); + return TRUE; + case IDCANCEL: + EndDialog(hWnd,0); + return TRUE; +/* test code for Get/SetDefaultCommConfig begins */ + case ID_GETDEFAULT: + { + DWORD r,dwConfSize = sizeof (COMMCONFIG); + r = GetDefaultCommConfigA(info->lpszDevice, + info->lpCommConfig, &dwConfSize); + if(!r) + MessageBoxA(hWnd,"Failed","GetDefaultCommConfig",MB_OK); + } + SERIALUI_DCBToDialogInfo(hWnd, info); + break; + case ID_SETDEFAULT: + { + DWORD r; + SERIALUI_DialogInfoToDCB(hWnd,info); + r = SetDefaultCommConfigA(info->lpszDevice, + info->lpCommConfig, sizeof (COMMCONFIG)); + if(!r) + MessageBoxA(hWnd,"Failed","GetDefaultCommConfig",MB_OK); + } + break; +/* test code for Get/SetDefaultCommConfig ends */ + } + } + default: + return FALSE; + } +} + +/*********************************************************************** + * SERIALUI_CommConfigDialog (SERIALUI.3) + * + * Used by Win9x KERNEL to show a dialog for configuring a COMM port. + */ +BOOL WINAPI SERIALUI_CommConfigDialog( + LPCSTR lpszName, + HWND hWndParent, + LPCOMMCONFIG lpCommConfig +) { + SERIALUI_DialogInfo info; + + info.lpCommConfig = lpCommConfig; + info.lpszDevice = lpszName; + info.bConvert = FALSE; + info.dwFlowControl = 0; + + if(!lpCommConfig) + return FALSE; + + return DialogBoxParamA(SERIALUI_hModule, + MAKEINTRESOURCEA(IDD_SERIALUICONFIG), + hWndParent, + (DLGPROC) SERIALUI_ConfigDialogProc, + (LPARAM)&info); +} + +static LPCSTR lpszCommKey = "System\\CurrentControlSet\\Services\\Class\\Ports"; +static LPCSTR lpszDCB = "DCB"; + +/*********************************************************************** + * SERIALUI_SetDefaultCommConfig (SERIALUI.4) + * + * 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 +) { + HKEY hKeyReg=0, hKeyPort=0; + CHAR szKeyName[100]; + DWORD r,dwDCBSize; + + TRACE("%p %p %lx\n",lpszDevice,lpCommConfig,dwSize); + + if(!lpCommConfig) + return FALSE; + + if(dwSize < sizeof (COMMCONFIG)) + return FALSE; + + r = RegConnectRegistryA(NULL, HKEY_LOCAL_MACHINE, &hKeyReg); + if(r != ERROR_SUCCESS) + return FALSE; + + wsnprintfA(szKeyName, sizeof szKeyName, "%s\\%s", lpszCommKey ,lpszDevice); + r = RegCreateKeyA(hKeyReg, szKeyName, &hKeyPort); + if(r == ERROR_SUCCESS) + { + dwDCBSize = sizeof (DCB); + r = RegSetValueExA( hKeyPort, lpszDCB, NULL, REG_BINARY, + (LPSTR)&lpCommConfig->dcb,dwDCBSize); + TRACE("write key r=%ld\n",r); + RegCloseKey(hKeyPort); + } + + RegCloseKey(hKeyReg); + + return (r==ERROR_SUCCESS); +} + +/*********************************************************************** + * SERIALUI_GetDefaultCommConfig (SERIALUI.5) + * + * 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 +) { + HKEY hKeyReg, hKeyPort; + CHAR szKeyName[100]; + DWORD r,dwSize,dwType; + + TRACE("%p %p %p\n",lpszDevice,lpCommConfig,lpdwSize); + + if(!lpCommConfig) + return FALSE; + + if(!lpdwSize) + return FALSE; + + if(*lpdwSize < sizeof (COMMCONFIG)) + return FALSE; + + *lpdwSize = sizeof (COMMCONFIG); + memset(lpCommConfig, 0 , sizeof (COMMCONFIG)); + lpCommConfig->dwSize = sizeof (COMMCONFIG); + lpCommConfig->wVersion = 1; + + r = RegConnectRegistryA(NULL, HKEY_LOCAL_MACHINE, &hKeyReg); + if(r != ERROR_SUCCESS) + return FALSE; + + wsnprintfA(szKeyName, sizeof szKeyName, "%s\\%s", lpszCommKey ,lpszDevice); + r = RegOpenKeyA(hKeyReg, szKeyName, &hKeyPort); + if(r == ERROR_SUCCESS) + { + dwSize = sizeof (DCB); + dwType = 0; + r = RegQueryValueExA( hKeyPort, lpszDCB, NULL, + &dwType, (LPSTR)&lpCommConfig->dcb,&dwSize); + if ((r==ERROR_SUCCESS) && (dwType != REG_BINARY)) + r = 1; + if ((r==ERROR_SUCCESS) && (dwSize != sizeof(DCB))) + r = 1; + + RegCloseKey(hKeyPort); + } + else + { + /* FIXME: default to a hardcoded commconfig */ + + lpCommConfig->dcb.DCBlength = sizeof(DCB); + lpCommConfig->dcb.BaudRate = 9600; + lpCommConfig->dcb.fBinary = TRUE; + lpCommConfig->dcb.fParity = FALSE; + lpCommConfig->dcb.ByteSize = 8; + lpCommConfig->dcb.Parity = NOPARITY; + lpCommConfig->dcb.StopBits = ONESTOPBIT; + lpCommConfig->dcb.StopBits = ONESTOPBIT; + return TRUE; + } + + RegCloseKey(hKeyReg); + + return (r==ERROR_SUCCESS); +} diff --git a/dlls/serialui/serialui.h b/dlls/serialui/serialui.h new file mode 100644 index 00000000000..71805bc6dbe --- /dev/null +++ b/dlls/serialui/serialui.h @@ -0,0 +1,9 @@ +#define IDD_SERIALUICONFIG 0x401 +#define IDC_BAUD 0x402 +#define IDC_PARITY 0x0403 +#define IDC_STOP 0x0404 +#define IDC_FLOW 0x0405 +#define IDC_DATA 0x0406 + +#define ID_GETDEFAULT 0x410 +#define ID_SETDEFAULT 0x411 diff --git a/dlls/serialui/serialui.spec b/dlls/serialui/serialui.spec new file mode 100644 index 00000000000..bf94dc3b14e --- /dev/null +++ b/dlls/serialui/serialui.spec @@ -0,0 +1,9 @@ +name serialui +type win32 +init SERIALUI_LibMain +rsrc serialui_rc + +2 stdcall EnumPropPages(ptr ptr ptr) SERIALUI_EnumPropPages +3 stdcall drvCommConfigDialog(ptr long ptr) SERIALUI_CommConfigDialog +4 stdcall drvSetDefaultCommConfig() SERIALUI_SetDefaultCommConfig +5 stdcall drvGetDefaultCommConfig() SERIALUI_GetDefaultCommConfig diff --git a/dlls/serialui/serialui_rc.rc b/dlls/serialui/serialui_rc.rc new file mode 100644 index 00000000000..f4d8503d5cc --- /dev/null +++ b/dlls/serialui/serialui_rc.rc @@ -0,0 +1,26 @@ +#include "windef.h" +#include "winuser.h" +#include "serialui.h" + + +IDD_SERIALUICONFIG DIALOG DISCARDABLE 0, 0, 160, 159 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "Properties for " +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Baud Rate", 0,5,20,55,10 + COMBOBOX IDC_BAUD, 60, 20, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Parity", 0,5,40,55,10 + COMBOBOX IDC_PARITY, 60, 40, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Flow Control", 0,5,60,55,10 + COMBOBOX IDC_FLOW, 60, 60, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Data Bits", 0,5,80,55,10 + COMBOBOX IDC_DATA, 60, 80, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Stop Bits", 0,5,100,55,10 + COMBOBOX IDC_STOP, 60, 100, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK,30,138,50,14 + PUSHBUTTON "Cancel", IDCANCEL,85,138,50,14 + /* these two buttons are for testing Get/SetDefaultCommConfig */ + /* PUSHBUTTON "GetDefault", ID_GETDEFAULT,30,115,50,14 */ + /* PUSHBUTTON "SetDefault", ID_SETDEFAULT,85,115,50,14 */ +END