diff options
Diffstat (limited to 'private/unimodem/modemui/sett.c')
-rw-r--r-- | private/unimodem/modemui/sett.c | 1147 |
1 files changed, 1147 insertions, 0 deletions
diff --git a/private/unimodem/modemui/sett.c b/private/unimodem/modemui/sett.c new file mode 100644 index 000000000..0af389bc8 --- /dev/null +++ b/private/unimodem/modemui/sett.c @@ -0,0 +1,1147 @@ +//--------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation 1993-1994 +// +// File: sett.c +// +// This files contains the dialog code for the Modem Settings property page. +// +// History: +// 1-14-94 ScottH Created +// +//--------------------------------------------------------------------------- + + +///////////////////////////////////////////////////// INCLUDES + +#include "proj.h" // common headers + +#ifdef WIN95 +#include "..\..\..\..\win\core\inc\help.h" +#endif + +///////////////////////////////////////////////////// CONTROLLING DEFINES + +///////////////////////////////////////////////////// TYPEDEFS + +// Command IDs for the parity listbox +#define CMD_PARITY_EVEN 1 +#define CMD_PARITY_ODD 2 +#define CMD_PARITY_NONE 3 +#define CMD_PARITY_MARK 4 +#define CMD_PARITY_SPACE 5 + +typedef UINT (WINAPI *FEFIFOFUMPROC)(HWND, LPCTSTR); + +typedef struct tagSETT + { + HWND hdlg; // dialog handle + HWND hwndDataBits; + HWND hwndParity; + HWND hwndStopBits; + HWND hwndWait; + HWND hwndDialTimerCH; + HWND hwndDialTimerED; + HWND hwndIdleTimerCH; + HWND hwndIdleTimerED; + HWND hwndConfigPB; + + LPMODEMINFO pmi; // modeminfo struct passed into dialog + + FEFIFOFUMPROC pfnFifoDlg; + HINSTANCE hinstSerialUI; + + } SETT, FAR * PSETT; + + +// This table is the generic port settings table +// that is used to fill the various listboxes +typedef struct _PortValues + { + union { + BYTE bytesize; + BYTE cmd; + BYTE stopbits; + }; + int ids; + } PortValues, FAR * LPPORTVALUES; + + +#pragma data_seg(DATASEG_READONLY) + +// This is the structure that is used to fill the data bits listbox +static PortValues s_rgbytesize[] = { + { 4, IDS_BYTESIZE_4 }, + { 5, IDS_BYTESIZE_5 }, + { 6, IDS_BYTESIZE_6 }, + { 7, IDS_BYTESIZE_7 }, + { 8, IDS_BYTESIZE_8 }, + }; + +// This is the structure that is used to fill the parity listbox +static PortValues s_rgparity[] = { + { CMD_PARITY_EVEN, IDS_PARITY_EVEN }, + { CMD_PARITY_ODD, IDS_PARITY_ODD }, + { CMD_PARITY_NONE, IDS_PARITY_NONE }, + { CMD_PARITY_MARK, IDS_PARITY_MARK }, + { CMD_PARITY_SPACE, IDS_PARITY_SPACE }, + }; + +// This is the structure that is used to fill the stopbits listbox +static PortValues s_rgstopbits[] = { + { ONESTOPBIT, IDS_STOPBITS_1 }, + { ONE5STOPBITS, IDS_STOPBITS_1_5 }, + { TWOSTOPBITS, IDS_STOPBITS_2 }, + }; + +// This string must always be ANSI +CHAR const FAR c_szFeFiFoFum[] = "FeFiFoFum"; + +#pragma data_seg() + + +#define Sett_GetPtr(hwnd) (PSETT)GetWindowLong(hwnd, DWL_USER) +#define Sett_SetPtr(hwnd, lp) (PSETT)SetWindowLong(hwnd, DWL_USER, (LONG)(lp)) + +// These are default settings +#define DEFAULT_BYTESIZE 8 +#define DEFAULT_PARITY CMD_PARITY_NONE +#define DEFAULT_STOPBITS ONESTOPBIT + +#define DEF_TIMEOUT 60 // 60 seconds +#define DEF_INACTIVITY_TIMEOUT 30 // 30 minutes +#define SECONDS_PER_MINUTE 60 // 60 seconds in a minute + + +//----------------------------------------------------------------------------------- +// Number edit box proc +//----------------------------------------------------------------------------------- + + +/*---------------------------------------------------------- +Purpose: Handle WM_CHAR + +Returns: TRUE to let the characters by + FALSE to prohibit +Cond: -- +*/ +BOOL PRIVATE NumProc_OnChar( + HWND hwnd, + UINT ch, + int cRepeat) + { + BOOL bRet; + + // Is this a number or a backspace? + if (IsCharAlphaNumeric((TCHAR)ch) && !IsCharAlpha((TCHAR)ch) || + VK_BACK == LOBYTE(VkKeyScan((TCHAR)ch))) + { + // Yes + bRet = TRUE; + } + else + { + // No + MessageBeep(MB_OK); + bRet = FALSE; + } + return bRet; + } + + +/*---------------------------------------------------------- +Purpose: Number proc. Only allow numbers to be entered into this edit box. + +Returns: varies +Cond: -- +*/ +LRESULT CALLBACK NumberProc( + HWND hwnd, // std params + UINT message, + WPARAM wParam, + LPARAM lParam) + { + WNDPROC pfn = (WNDPROC)GetWindowLong(hwnd, GWL_USERDATA); + + // BUGBUG: doesn't handle paste correctly! + + switch (message) + { + case WM_CHAR: + if (!NumProc_OnChar(hwnd, (UINT)wParam, LOWORD(lParam))) + return 1; // Don't process this character + break; + } + + return CallWindowProc(pfn, hwnd, message, wParam, lParam); + } + + +/*---------------------------------------------------------- +Purpose: Sets an edit control to contain a string representing the + given numeric value. +Returns: -- +Cond: -- +*/ +void PRIVATE Edit_SetValue( + HWND hwnd, + int nValue) + { + TCHAR sz[MAXSHORTLEN]; + + wsprintf(sz, TEXT("%d"), nValue); + Edit_SetText(hwnd, sz); + } + + +/*---------------------------------------------------------- +Purpose: Gets a numeric value from an edit control. Supports hexadecimal. +Returns: int +Cond: -- +*/ +int PRIVATE Edit_GetValue( + HWND hwnd) + { + TCHAR sz[MAXSHORTLEN]; + int cch; + int nVal; + + cch = Edit_GetTextLength(hwnd); + ASSERT(ARRAYSIZE(sz) >= cch); + + Edit_GetText(hwnd, sz, ARRAYSIZE(sz)); + AnsiToInt(sz, &nVal); + + return nVal; + } + + +//----------------------------------------------------------------------------------- +// Settings dialog code +//----------------------------------------------------------------------------------- + + +/*---------------------------------------------------------- +Purpose: Sets the flow control related fields of one structure + given the other structure. The conversion direction + is dictated by the uFlags parameter. + +Returns: -- +Cond: -- +*/ +void PUBLIC ConvertFlowCtl( + WIN32DCB FAR * pdcb, + MODEMSETTINGS FAR * pms, + UINT uFlags) // One of CFC_ flags + { + LPDWORD pdw = &pms->dwPreferredModemOptions; + + if (IsFlagSet(uFlags, CFC_DCBTOMS)) + { + // Convert from DCB values to MODEMSETTINGS values + + // Is this hardware flow control? + if (FALSE == pdcb->fOutX && + FALSE == pdcb->fInX && + TRUE == pdcb->fOutxCtsFlow) + { + // Yes + ClearFlag(*pdw, MDM_FLOWCONTROL_SOFT); + + if (IsFlagSet(uFlags, CFC_HW_CAPABLE)) + SetFlag(*pdw, MDM_FLOWCONTROL_HARD); + else + ClearFlag(*pdw, MDM_FLOWCONTROL_HARD); + } + + // Is this software flow control? + else if (TRUE == pdcb->fOutX && + TRUE == pdcb->fInX && + FALSE == pdcb->fOutxCtsFlow) + { + // Yes + ClearFlag(*pdw, MDM_FLOWCONTROL_HARD); + + if (IsFlagSet(uFlags, CFC_SW_CAPABLE)) + SetFlag(*pdw, MDM_FLOWCONTROL_SOFT); + else + ClearFlag(*pdw, MDM_FLOWCONTROL_SOFT); + } + + // Is the flow control disabled? + else if (FALSE == pdcb->fOutX && + FALSE == pdcb->fInX && + FALSE == pdcb->fOutxCtsFlow) + { + // Yes + ClearFlag(*pdw, MDM_FLOWCONTROL_HARD); + ClearFlag(*pdw, MDM_FLOWCONTROL_SOFT); + } + else + { + ASSERT(0); // Should never get here + } + } + else if (IsFlagSet(uFlags, CFC_MSTODCB)) + { + DWORD dw = *pdw; + + // Convert from MODEMSETTINGS values to DCB values + + // Is this hardware flow control? + if (IsFlagSet(dw, MDM_FLOWCONTROL_HARD) && + IsFlagClear(dw, MDM_FLOWCONTROL_SOFT)) + { + // Yes + pdcb->fOutX = FALSE; + pdcb->fInX = FALSE; + pdcb->fOutxCtsFlow = TRUE; + pdcb->fRtsControl = RTS_CONTROL_HANDSHAKE; + } + + // Is this software flow control? + else if (IsFlagClear(dw, MDM_FLOWCONTROL_HARD) && + IsFlagSet(dw, MDM_FLOWCONTROL_SOFT)) + { + // Yes + pdcb->fOutX = TRUE; + pdcb->fInX = TRUE; + pdcb->fOutxCtsFlow = FALSE; + pdcb->fRtsControl = RTS_CONTROL_DISABLE; + } + + // Is the flow control disabled? + else if (IsFlagClear(dw, MDM_FLOWCONTROL_HARD) && + IsFlagClear(dw, MDM_FLOWCONTROL_SOFT)) + { + // Yes + pdcb->fOutX = FALSE; + pdcb->fInX = FALSE; + pdcb->fOutxCtsFlow = FALSE; + pdcb->fRtsControl = RTS_CONTROL_DISABLE; + } + else + { + ASSERT(0); // Should never get here + } + } + } + + +/*---------------------------------------------------------- +Purpose: Fills the bytesize combobox with the possible byte sizes. +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_FillDataBits( + PSETT this) + { + HWND hwndCB = this->hwndDataBits; + WIN32DCB FAR * pdcb = &this->pmi->dcb; + int i; + int iSel; + int n; + int iMatch = -1; + int iDef = -1; + TCHAR sz[MAXMEDLEN]; + + // Fill the listbox + for (i = 0; i < ARRAY_ELEMENTS(s_rgbytesize); i++) + { + n = ComboBox_AddString(hwndCB, SzFromIDS(g_hinst, s_rgbytesize[i].ids, sz, ARRAYSIZE(sz))); + ComboBox_SetItemData(hwndCB, n, s_rgbytesize[i].bytesize); + + // Keep our eyes peeled for important values + if (DEFAULT_BYTESIZE == s_rgbytesize[i].bytesize) + { + iDef = n; + } + if (pdcb->ByteSize == s_rgbytesize[i].bytesize) + { + iMatch = n; + } + } + + ASSERT(-1 != iDef); + + // Does the DCB value exist in our list? + if (-1 == iMatch) + { + // No; choose the default + iSel = iDef; + } + else + { + // Yes; choose the matched value + ASSERT(-1 != iMatch); + iSel = iMatch; + } + ComboBox_SetCurSel(hwndCB, iSel); + } + + +/*---------------------------------------------------------- +Purpose: Fills the parity combobox with the possible settings. +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_FillParity( + PSETT this) + { + HWND hwndCB = this->hwndParity; + WIN32DCB FAR * pdcb = &this->pmi->dcb; + int i; + int iSel; + int n; + int iMatch = -1; + int iDef = -1; + TCHAR sz[MAXMEDLEN]; + + // Fill the listbox + for (i = 0; i < ARRAY_ELEMENTS(s_rgparity); i++) + { + n = ComboBox_AddString(hwndCB, SzFromIDS(g_hinst, s_rgparity[i].ids, sz, ARRAYSIZE(sz))); + ComboBox_SetItemData(hwndCB, n, s_rgparity[i].cmd); + + // Keep our eyes peeled for important values + if (DEFAULT_PARITY == s_rgparity[i].cmd) + { + iDef = n; + } + switch (s_rgparity[i].cmd) + { + case CMD_PARITY_EVEN: + if (EVENPARITY == pdcb->Parity) + iMatch = n; + break; + + case CMD_PARITY_ODD: + if (ODDPARITY == pdcb->Parity) + iMatch = n; + break; + + case CMD_PARITY_NONE: + if (NOPARITY == pdcb->Parity) + iMatch = n; + break; + + case CMD_PARITY_MARK: + if (MARKPARITY == pdcb->Parity) + iMatch = n; + break; + + case CMD_PARITY_SPACE: + if (SPACEPARITY == pdcb->Parity) + iMatch = n; + break; + + default: + ASSERT(0); + break; + } + } + + ASSERT(-1 != iDef); + + // Does the DCB value exist in our list? + if (-1 == iMatch) + { + // No; choose the default + iSel = iDef; + } + else + { + // Yes; choose the matched value + ASSERT(-1 != iMatch); + iSel = iMatch; + } + ComboBox_SetCurSel(hwndCB, iSel); + } + + +/*---------------------------------------------------------- +Purpose: Fills the stopbits combobox with the possible settings. +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_FillStopBits( + PSETT this) + { + HWND hwndCB = this->hwndStopBits; + WIN32DCB FAR * pdcb = &this->pmi->dcb; + int i; + int iSel; + int n; + int iMatch = -1; + int iDef = -1; + TCHAR sz[MAXMEDLEN]; + + // Fill the listbox + for (i = 0; i < ARRAY_ELEMENTS(s_rgstopbits); i++) + { + n = ComboBox_AddString(hwndCB, SzFromIDS(g_hinst, s_rgstopbits[i].ids, sz, ARRAYSIZE(sz))); + ComboBox_SetItemData(hwndCB, n, s_rgstopbits[i].stopbits); + + // Keep our eyes peeled for important values + if (DEFAULT_STOPBITS == s_rgstopbits[i].stopbits) + { + iDef = n; + } + if (pdcb->StopBits == s_rgstopbits[i].stopbits) + { + iMatch = n; + } + } + + ASSERT(-1 != iDef); + + // Does the DCB value exist in our list? + if (-1 == iMatch) + { + // No; choose the default + iSel = iDef; + } + else + { + // Yes; choose the matched value + ASSERT(-1 != iMatch); + iSel = iMatch; + } + ComboBox_SetCurSel(hwndCB, iSel); + } + + +/*---------------------------------------------------------- +Purpose: Set the timeout controls +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_SetTimeouts( + PSETT this) + { + int nVal; + + // A note on the timeouts: + // + // For the dial timeout, the valid range is [1-255]. If the dial + // timeout checkbox is unchecked, we set the timeout value to 255. + // + // For the disconnect timeout, the valid range is [0-255]. If the + // dial timeout checkbox is unchecked, we set the timeout value + // to 0. + + // Is the dial timeout properties disabled? + if (0 == this->pmi->devcaps.dwCallSetupFailTimer) + { + // Yes; disable the box and edit + Button_Enable(this->hwndDialTimerCH, FALSE); + Edit_Enable(this->hwndDialTimerED, FALSE); + } + // No; Is the dial timeout set to the maximum? + else if (this->pmi->ms.dwCallSetupFailTimer == this->pmi->devcaps.dwCallSetupFailTimer) + { + // Yes; leave box unchecked and disable edit + Button_SetCheck(this->hwndDialTimerCH, FALSE); + + nVal = min(DEF_TIMEOUT, + LOWORD(this->pmi->devcaps.dwCallSetupFailTimer)); + Edit_SetValue(this->hwndDialTimerED, nVal); + Edit_Enable(this->hwndDialTimerED, FALSE); + } + else + { + // No; check the box and set the time value + Button_SetCheck(this->hwndDialTimerCH, TRUE); + + nVal = min(LOWORD(this->pmi->ms.dwCallSetupFailTimer), + LOWORD(this->pmi->devcaps.dwCallSetupFailTimer)); + Edit_SetValue(this->hwndDialTimerED, nVal); + } + + // Is the disconnect timeout properties disabled? + if (0 == this->pmi->devcaps.dwInactivityTimeout) + { + // Yes; disable the box and edit + Button_Enable(this->hwndIdleTimerCH, FALSE); + Edit_Enable(this->hwndIdleTimerED, FALSE); + } + // No; Is the disconnect timeout set to 0? + else if (0 == this->pmi->ms.dwInactivityTimeout) + { + // Yes; leave box unchecked and disable edit + Button_SetCheck(this->hwndIdleTimerCH, FALSE); + + Edit_SetValue(this->hwndIdleTimerED, DEF_INACTIVITY_TIMEOUT); + Edit_Enable(this->hwndIdleTimerED, FALSE); + } + else + { + // No; check the box and set the time value + Button_SetCheck(this->hwndIdleTimerCH, TRUE); + Edit_SetValue(this->hwndIdleTimerED, LOWORD(this->pmi->ms.dwInactivityTimeout)/SECONDS_PER_MINUTE); + } + } + + +/*---------------------------------------------------------- +Purpose: WM_INITDIALOG Handler +Returns: FALSE when we assign the control focus +Cond: -- +*/ +BOOL PRIVATE Sett_OnInitDialog( + PSETT this, + HWND hwndFocus, + LPARAM lParam) // expected to be PROPSHEETINFO + { + LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam; + HWND hwnd = this->hdlg; + DWORD dwOptions; + DWORD dwCapOptions; + WNDPROC pfn; + + ASSERT((LPTSTR)lppsp->lParam); + + this->pmi = (LPMODEMINFO)lppsp->lParam; + + // Save away the window handles + this->hwndDataBits = GetDlgItem(hwnd, IDC_DATABITS); + this->hwndParity = GetDlgItem(hwnd, IDC_PARITY); + this->hwndStopBits = GetDlgItem(hwnd, IDC_STOPBITS); + this->hwndWait = GetDlgItem(hwnd, IDC_WAITFORDIALTONE); + this->hwndDialTimerCH = GetDlgItem(hwnd, IDC_CH_DIALTIMER); + this->hwndDialTimerED = GetDlgItem(hwnd, IDC_ED_DIALTIMER); + this->hwndIdleTimerCH = GetDlgItem(hwnd, IDC_CH_IDLETIMER); + this->hwndIdleTimerED = GetDlgItem(hwnd, IDC_ED_IDLETIMER); + this->hwndConfigPB = GetDlgItem(hwnd, IDC_PB_CONFIGURE); + + // Subclass the edit boxes that only handle numbers + pfn = SubclassWindow(this->hwndDialTimerED, NumberProc); + SetWindowLong(this->hwndDialTimerED, GWL_USERDATA, (LONG)pfn); + + pfn = SubclassWindow(this->hwndIdleTimerED, NumberProc); + SetWindowLong(this->hwndIdleTimerED, GWL_USERDATA, (LONG)pfn); + + Edit_LimitText(this->hwndDialTimerED, 3); + Edit_LimitText(this->hwndIdleTimerED, 3); + + // Set the call preferences + dwCapOptions = this->pmi->devcaps.dwModemOptions; + dwOptions = this->pmi->ms.dwPreferredModemOptions; + Button_Enable(this->hwndWait, IsFlagSet(dwCapOptions, MDM_BLIND_DIAL)); + + Button_SetCheck(this->hwndWait, IsFlagSet(dwCapOptions, MDM_BLIND_DIAL) && + IsFlagClear(dwOptions, MDM_BLIND_DIAL)); + + Sett_SetTimeouts(this); + + // Is this a parallel port? + if (DT_PARALLEL_PORT == this->pmi->nDeviceType) + { + // Yes; hide the DCB controls + ShowWindow(GetDlgItem(hwnd, IDC_CONN_PREF), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_CONN_PREF), FALSE); + + ShowWindow(GetDlgItem(hwnd, IDC_LBL_DATABITS), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_LBL_DATABITS), FALSE); + + ShowWindow(GetDlgItem(hwnd, IDC_DATABITS), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_DATABITS), FALSE); + + ShowWindow(GetDlgItem(hwnd, IDC_LBL_PARITY), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_LBL_PARITY), FALSE); + + ShowWindow(GetDlgItem(hwnd, IDC_PARITY), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_PARITY), FALSE); + + ShowWindow(GetDlgItem(hwnd, IDC_LBL_STOPBITS), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_LBL_STOPBITS), FALSE); + + ShowWindow(GetDlgItem(hwnd, IDC_STOPBITS), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDC_STOPBITS), FALSE); + } + else + { + // No; initialize the DCB controls + Sett_FillDataBits(this); + Sett_FillParity(this); + Sett_FillStopBits(this); + } + + // Is the modem using a custom port? + if (IsFlagSet(this->pmi->uFlags, MIF_PORT_IS_CUSTOM)) + { + // Yes + this->pfnFifoDlg = NULL; + this->hinstSerialUI = NULL; + } + + // Is the modem using a parallel port? + else if (DT_PARALLEL_PORT == this->pmi->nDeviceType || + DT_PARALLEL_MODEM == this->pmi->nDeviceType) + { + // Yes; don't show the FIFO settings button + HWND hwndBtn = GetDlgItem(hwnd, IDC_PB_CONFIGURE); + + Button_Enable(hwndBtn, FALSE); + ShowWindow(hwndBtn, SW_HIDE); + + this->pfnFifoDlg = NULL; + this->hinstSerialUI = NULL; + } + + else + { + // Try to setup the FIFO settings button + + this->hinstSerialUI = LoadLibrary(c_szSerialUI); + if (ISVALIDHINSTANCE(this->hinstSerialUI)) + { + this->pfnFifoDlg = (FEFIFOFUMPROC)GetProcAddress(this->hinstSerialUI, c_szFeFiFoFum); + } + else + { + this->pfnFifoDlg = NULL; + this->hinstSerialUI = NULL; + } + + // Did getting the private entry point fail? + if (!this->pfnFifoDlg) + { + // Yes; hide the Port Settings button + HWND hwndBtn = GetDlgItem(hwnd, IDC_PB_CONFIGURE); + + Button_Enable(hwndBtn, FALSE); + ShowWindow(hwndBtn, SW_HIDE); + } + } + + return TRUE; // default initial focus + } + + +/*---------------------------------------------------------- +Purpose: Saves the connection preferences to the modeminfo + struct. + +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_SaveConnPrefs( + PSETT this) + { + int iSel; + BYTE cmd; + WIN32DCB FAR * pdcb = &this->pmi->dcb; + + // Determine new byte size + iSel = ComboBox_GetCurSel(this->hwndDataBits); + pdcb->ByteSize = (BYTE)ComboBox_GetItemData(this->hwndDataBits, iSel); + + + // Determine new parity settings + iSel = ComboBox_GetCurSel(this->hwndParity); + cmd = (BYTE)ComboBox_GetItemData(this->hwndParity, iSel); + switch (cmd) + { + case CMD_PARITY_EVEN: + pdcb->fParity = TRUE; + pdcb->Parity = EVENPARITY; + break; + + case CMD_PARITY_ODD: + pdcb->fParity = TRUE; + pdcb->Parity = ODDPARITY; + break; + + case CMD_PARITY_NONE: + pdcb->fParity = FALSE; + pdcb->Parity = NOPARITY; + break; + + case CMD_PARITY_MARK: + pdcb->fParity = TRUE; + pdcb->Parity = MARKPARITY; + break; + + case CMD_PARITY_SPACE: + pdcb->fParity = TRUE; + pdcb->Parity = SPACEPARITY; + break; + + default: + ASSERT(0); + break; + } + + // Determine new stopbits setting + iSel = ComboBox_GetCurSel(this->hwndStopBits); + pdcb->StopBits = (BYTE)ComboBox_GetItemData(this->hwndStopBits, iSel); + } + + +/*---------------------------------------------------------- +Purpose: Invokes the settings property sheet for the port + that this modem is connected to. + +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_ConfigPort( + PSETT this) + { + COMMCONFIG ccDummy; + DWORD dwSize; + DWORD dwSubType; + + if (DT_PARALLEL_MODEM == this->pmi->nDeviceType || + DT_PARALLEL_PORT == this->pmi->nDeviceType) + { + dwSubType = PST_PARALLELPORT; + } + else + { + dwSubType = PST_RS232; + + // Make sure the modeminfo DCB has the most current control settings + Sett_SaveConnPrefs(this); + } + + // Bring up the config dialog for the port that is currently selected + dwSize = 0; + ccDummy.dwProviderSubType = dwSubType; + GetDefaultCommConfig(this->pmi->szPortName, &ccDummy, &dwSize); + + ASSERT(0 < dwSize); + + // Make this check to protect us from bozo ConfigDialog providers + if (0 < dwSize) + { + LPCOMMCONFIG pcc = (LPCOMMCONFIG)LocalAlloc(LPTR, (UINT)dwSize); + if (pcc) + { + pcc->dwProviderSubType = dwSubType; + + if (GetDefaultCommConfig(this->pmi->szPortName, pcc, &dwSize)) + { + // Use the modem's DCB values + BltByte(&pcc->dcb, &this->pmi->dcb, sizeof(WIN32DCB)); + + // Invoke config dialog for port + if (CommConfigDialog(this->pmi->szPortName, this->hdlg, pcc)) + { + UINT uFlags = CFC_DCBTOMS; + + // Set the global default settings of this port + SetDefaultCommConfig(this->pmi->szPortName, pcc, dwSize); + + // Copy possibly-altered DCB back to the modem's DCB + BltByte(&this->pmi->dcb, &pcc->dcb, sizeof(WIN32DCB)); + + // Make sure related fields in the modemsettings struct + // are in-sync with the DCB values + if (IsFlagSet(this->pmi->devcaps.dwModemOptions, MDM_FLOWCONTROL_HARD)) + { + SetFlag(uFlags, CFC_HW_CAPABLE); + } + if (IsFlagSet(this->pmi->devcaps.dwModemOptions, MDM_FLOWCONTROL_SOFT)) + { + SetFlag(uFlags, CFC_SW_CAPABLE); + } + ConvertFlowCtl(&this->pmi->dcb, &this->pmi->ms, uFlags); + + // Reset the connection preference controls + ComboBox_ResetContent(this->hwndDataBits); + ComboBox_ResetContent(this->hwndParity); + ComboBox_ResetContent(this->hwndStopBits); + + Sett_FillDataBits(this); + Sett_FillParity(this); + Sett_FillStopBits(this); + } + } + LocalFree(LOCALOF(pcc)); + } + } + } + + +/*---------------------------------------------------------- +Purpose: WM_COMMAND Handler +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_OnCommand( + PSETT this, + int id, + HWND hwndCtl, + UINT uNotifyCode) + { + HWND hwnd = this->hdlg; + BOOL bCheck; + + switch (id) + { + case IDC_CH_DIALTIMER: + bCheck = Button_GetCheck(hwndCtl); + Edit_Enable(this->hwndDialTimerED, bCheck); + break; + + case IDC_CH_IDLETIMER: + bCheck = Button_GetCheck(hwndCtl); + Edit_Enable(this->hwndIdleTimerED, bCheck); + break; + + case IDC_PB_CONFIGURE: + if (IsFlagSet(this->pmi->uFlags, MIF_PORT_IS_CUSTOM)) + Sett_ConfigPort(this); + else if (this->pfnFifoDlg) + this->pfnFifoDlg(hwnd, this->pmi->szPortName); + else + ASSERT(0); + break; + + case IDC_PB_ADVANCED: + // Invoke the advanced dialog + DoModal(g_hinst, MAKEINTRESOURCE(IDD_ADV_MODEM), this->hdlg, AdvSett_WrapperProc, (LPARAM)this->pmi); + break; + + default: + break; + } + } + + +/*---------------------------------------------------------- +Purpose: PSN_APPLY handler +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_OnApply( + PSETT this) + { + BOOL bCheck; + LPMODEMSETTINGS pms = &this->pmi->ms; + + if (DT_PARALLEL_PORT != this->pmi->nDeviceType) + { + Sett_SaveConnPrefs(this); + } + + // Set the blind dialing + if (Button_GetCheck(this->hwndWait)) + ClearFlag(pms->dwPreferredModemOptions, MDM_BLIND_DIAL); + else + SetFlag(pms->dwPreferredModemOptions, MDM_BLIND_DIAL); + + // Set the dial timeout + bCheck = Button_GetCheck(this->hwndDialTimerCH); + if (bCheck) + { + int nVal = Edit_GetValue(this->hwndDialTimerED); + pms->dwCallSetupFailTimer = MAKELONG(nVal, 0); + } + else + { + pms->dwCallSetupFailTimer = this->pmi->devcaps.dwCallSetupFailTimer; + } + + // Set the idle timeout + bCheck = Button_GetCheck(this->hwndIdleTimerCH); + if (bCheck) + { + int nVal = Edit_GetValue(this->hwndIdleTimerED); + pms->dwInactivityTimeout = MAKELONG(nVal*SECONDS_PER_MINUTE, 0); + } + else + { + pms->dwInactivityTimeout = 0; + } + } + + +/*---------------------------------------------------------- +Purpose: WM_NOTIFY handler +Returns: varies +Cond: -- +*/ +LRESULT PRIVATE Sett_OnNotify( + PSETT this, + int idFrom, + NMHDR FAR * lpnmhdr) + { + LRESULT lRet = 0; + + switch (lpnmhdr->code) + { + case PSN_SETACTIVE: + break; + + case PSN_KILLACTIVE: + // N.b. This message is not sent if user clicks Cancel! + // N.b. This message is sent prior to PSN_APPLY + // + break; + + case PSN_APPLY: + Sett_OnApply(this); + break; + + default: + break; + } + + return lRet; + } + + +/*---------------------------------------------------------- +Purpose: WM_DESTROY handler + +Returns: -- +Cond: -- +*/ +void PRIVATE Sett_OnDestroy( + PSETT this) + { + if (this->hinstSerialUI) + FreeLibrary(this->hinstSerialUI); + } + + +///////////////////////////////////////////////////// EXPORTED FUNCTIONS + +static BOOL s_bSettRecurse = FALSE; + +LRESULT INLINE Sett_DefProc( + HWND hDlg, + UINT msg, + WPARAM wParam, + LPARAM lParam) + { + ENTER_X() + { + s_bSettRecurse = TRUE; + } + LEAVE_X() + + return DefDlgProc(hDlg, msg, wParam, lParam); + } + + +/*---------------------------------------------------------- +Purpose: Real dialog proc +Returns: varies +Cond: -- +*/ +LRESULT Sett_DlgProc( + PSETT this, + UINT message, + WPARAM wParam, + LPARAM lParam) + { +#pragma data_seg(DATASEG_READONLY) + const static DWORD rgHelpIDs[] = { + IDC_CONN_PREF, IDH_UNI_CON_PREFS, + IDC_LBL_DATABITS, IDH_UNI_CON_PREFS, + IDC_DATABITS, IDH_UNI_CON_PREFS, + IDC_LBL_PARITY, IDH_UNI_CON_PREFS, + IDC_PARITY, IDH_UNI_CON_PREFS, + IDC_LBL_STOPBITS, IDH_UNI_CON_PREFS, + IDC_STOPBITS, IDH_UNI_CON_PREFS, + IDC_CALL_PREF, IDH_UNI_CON_CALL_PREFS, + IDC_WAITFORDIALTONE,IDH_UNI_CON_DIALTONE, + IDC_CH_DIALTIMER, IDH_UNI_CON_CANCEL, + IDC_ED_DIALTIMER, IDH_UNI_CON_CANCEL, + IDC_SECONDS, IDH_UNI_CON_CANCEL, + IDC_CH_IDLETIMER, IDH_UNI_CON_DISCONNECT, + IDC_ED_IDLETIMER, IDH_UNI_CON_DISCONNECT, + IDC_MINUTES, IDH_UNI_CON_DISCONNECT, +// IDC_PB_CONFIGURE, IDH_UNI_CON_PORT, + IDC_PB_ADVANCED, IDH_UNI_CON_ADVANCED, + 0, 0 }; +#pragma data_seg() + + switch (message) + { + HANDLE_MSG(this, WM_INITDIALOG, Sett_OnInitDialog); + HANDLE_MSG(this, WM_COMMAND, Sett_OnCommand); + HANDLE_MSG(this, WM_NOTIFY, Sett_OnNotify); + HANDLE_MSG(this, WM_DESTROY, Sett_OnDestroy); + + case WM_HELP: + WinHelp(((LPHELPINFO)lParam)->hItemHandle, c_szWinHelpFile, HELP_WM_HELP, (DWORD)(LPVOID)rgHelpIDs); + return 0; + + case WM_CONTEXTMENU: + WinHelp((HWND)wParam, c_szWinHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)rgHelpIDs); + return 0; + + default: + return Sett_DefProc(this->hdlg, message, wParam, lParam); + } + } + + +/*---------------------------------------------------------- +Purpose: Dialog Wrapper +Returns: varies +Cond: -- +*/ +BOOL CALLBACK Sett_WrapperProc( + HWND hDlg, // std params + UINT message, + WPARAM wParam, + LPARAM lParam) + { + PSETT this; + + // Cool windowsx.h dialog technique. For full explanation, see + // WINDOWSX.TXT. This supports multiple-instancing of dialogs. + // + ENTER_X() + { + if (s_bSettRecurse) + { + s_bSettRecurse = FALSE; + LEAVE_X() + return FALSE; + } + } + LEAVE_X() + + this = Sett_GetPtr(hDlg); + if (this == NULL) + { + if (message == WM_INITDIALOG) + { + this = (PSETT)LocalAlloc(LPTR, sizeof(SETT)); + if (!this) + { + MsgBox(g_hinst, + hDlg, + MAKEINTRESOURCE(IDS_OOM_SETTINGS), + MAKEINTRESOURCE(IDS_CAP_SETTINGS), + NULL, + MB_ERROR); + EndDialog(hDlg, IDCANCEL); + return (BOOL)Sett_DefProc(hDlg, message, wParam, lParam); + } + this->hdlg = hDlg; + Sett_SetPtr(hDlg, this); + } + else + { + return (BOOL)Sett_DefProc(hDlg, message, wParam, lParam); + } + } + + if (message == WM_DESTROY) + { + Sett_DlgProc(this, message, wParam, lParam); + LocalFree((HLOCAL)OFFSETOF(this)); + Sett_SetPtr(hDlg, NULL); + return 0; + } + + return SetDlgMsgResult(hDlg, message, Sett_DlgProc(this, message, wParam, lParam)); + } |