mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1147 lines
31 KiB
1147 lines
31 KiB
//---------------------------------------------------------------------------
|
|
//
|
|
// 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));
|
|
}
|