windows-nt/Source/XPSP1/NT/net/rras/ras/ui/rasdlg/mlink.c
2020-09-26 16:20:57 +08:00

461 lines
11 KiB
C

// Copyright (c) 1995, Microsoft Corporation, all rights reserved
//
// mlink.c
// Remote Access Common Dialog APIs
// Multi-link configuration dialogs
//
// 01/23/96 Steve Cobb
#include "rasdlgp.h"
//----------------------------------------------------------------------------
// Help maps
//----------------------------------------------------------------------------
static DWORD g_adwDmHelp[] =
{
CID_DM_ST_Explain, HID_DM_ST_Explain,
CID_DM_ST_Dial, HID_DM_LB_DialPercent,
CID_DM_LB_DialPercent, HID_DM_LB_DialPercent,
CID_DM_ST_DialOrMore, HID_DM_LB_DialTime,
CID_DM_LB_DialTime, HID_DM_LB_DialTime,
CID_DM_ST_HangUp, HID_DM_LB_HangUpPercent,
CID_DM_LB_HangUpPercent, HID_DM_LB_HangUpPercent,
CID_DM_ST_HangUpOrLess, HID_DM_LB_HangUpTime,
CID_DM_LB_HangUpTime, HID_DM_LB_HangUpTime,
0, 0
};
//-----------------------------------------------------------------------------
// Local datatypes
//-----------------------------------------------------------------------------
// Multi-link dialing dialog context block.
//
typedef struct
_DMINFO
{
// Stub API argument.
//
PBENTRY* pEntry;
// Handle of this dialog and some of it's controls.
//
HWND hwndDlg;
HWND hwndLbDialPercents;
HWND hwndLbDialTimes;
HWND hwndLbHangUpPercents;
HWND hwndLbHangUpTimes;
}
DMINFO;
//----------------------------------------------------------------------------
// Local prototypes (alphabetically)
//----------------------------------------------------------------------------
BOOL
DmCommand(
IN HWND hwnd,
IN WORD wNotification,
IN WORD wId,
IN HWND hwndCtrl );
INT_PTR CALLBACK
DmDlgProc(
IN HWND hwnd,
IN UINT unMsg,
IN WPARAM wparam,
IN LPARAM lparam );
BOOL
DmInit(
IN HWND hwndDlg,
IN PBENTRY* pEntry );
VOID
DmSave(
IN DMINFO* pInfo );
VOID
DmTerm(
IN HWND hwndDlg );
//----------------------------------------------------------------------------
// Multi-link dialing dialog
// Listed alphabetically following stub API and dialog proc
//----------------------------------------------------------------------------
BOOL
MultiLinkDialingDlg(
IN HWND hwndOwner,
OUT PBENTRY* pEntry )
// Popup the Multi-link dialing dialog. 'HwndOwner' is the owner of the
// dialog. 'PEntry' is a phonebook entry to edit.
//
// Returns true if user pressed OK and succeeded, false if user pressed
// Cancel or encountered an error.
{
INT_PTR nStatus;
TRACE( "MultiLinkConfigureDlg" );
nStatus =
DialogBoxParam(
g_hinstDll,
MAKEINTRESOURCE( DID_DM_DialingMultipleLines ),
hwndOwner,
DmDlgProc,
(LPARAM )pEntry );
if (nStatus == -1)
{
ErrorDlg( hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL );
nStatus = FALSE;
}
return (nStatus) ? TRUE : FALSE;
}
INT_PTR CALLBACK
DmDlgProc(
IN HWND hwnd,
IN UINT unMsg,
IN WPARAM wparam,
IN LPARAM lparam )
// DialogProc callback for the Multi-Link dialing dialog. Parameters and
// return value are as described for standard windows 'DialogProc's.
//
{
#if 0
TRACE4( "DmDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)",
(DWORD )hwnd, (DWORD )unMsg, (DWORD )wparam, (DWORD )lparam );
#endif
switch (unMsg)
{
case WM_INITDIALOG:
{
return DmInit( hwnd, (PBENTRY* )lparam );
}
case WM_HELP:
case WM_CONTEXTMENU:
{
ContextHelp( g_adwDmHelp, hwnd, unMsg, wparam, lparam );
break;
}
case WM_COMMAND:
{
return DmCommand(
hwnd, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam );
}
case WM_DESTROY:
{
DmTerm( hwnd );
break;
}
}
return FALSE;
}
BOOL
DmCommand(
IN HWND hwnd,
IN WORD wNotification,
IN WORD wId,
IN HWND hwndCtrl )
// Called on WM_COMMAND. 'Hwnd' is the dialog window. 'WNotification' is
// the notification code of the command. 'wId' is the control/menu
// identifier of the command. 'HwndCtrl' is the control window handle of
// the command.
//
// Returns true if processed message, false otherwise.
//
{
DWORD dwErr;
TRACE3( "DmCommand(n=%d,i=%d,c=$%x)",
(DWORD )wNotification, (DWORD )wId, (ULONG_PTR )hwndCtrl );
switch (wId)
{
case IDOK:
{
DMINFO* pInfo;
pInfo = (DMINFO* )GetWindowLongPtr( hwnd, DWLP_USER );
ASSERT( pInfo );
DmSave( pInfo );
EndDialog( hwnd, TRUE );
return TRUE;
}
case IDCANCEL:
{
TRACE( "Cancel pressed" );
EndDialog( hwnd, FALSE );
return TRUE;
}
}
return FALSE;
}
BOOL
DmInit(
IN HWND hwndDlg,
IN PBENTRY* pEntry )
// Called on WM_INITDIALOG. 'hwndDlg' is the handle of the owning window.
// 'PEntry' is the caller's stub API argument.
//
// Return false if focus was set, true otherwise, i.e. as defined for
// WM_INITDIALOG.
//
{
DWORD dwErr;
DMINFO* pInfo;
TRACE( "DmInit" );
// Allocate the dialog context block. Initialize minimally for proper
// cleanup, then attach to the dialog window.
//
{
pInfo = Malloc( sizeof(*pInfo) );
if (!pInfo)
{
ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL );
EndDialog( hwndDlg, FALSE );
return TRUE;
}
ZeroMemory( pInfo, sizeof(*pInfo) );
pInfo->pEntry = pEntry;
pInfo->hwndDlg = hwndDlg;
SetWindowLongPtr( hwndDlg, DWLP_USER, (ULONG_PTR )pInfo );
TRACE( "Context set" );
}
pInfo->hwndLbDialPercents = GetDlgItem( hwndDlg, CID_DM_LB_DialPercent );
ASSERT( pInfo->hwndLbDialPercents );
pInfo->hwndLbDialTimes = GetDlgItem( hwndDlg, CID_DM_LB_DialTime );
ASSERT( pInfo->hwndLbDialTimes );
pInfo->hwndLbHangUpPercents = GetDlgItem( hwndDlg, CID_DM_LB_HangUpPercent );
ASSERT( pInfo->hwndLbHangUpPercents );
pInfo->hwndLbHangUpTimes = GetDlgItem( hwndDlg, CID_DM_LB_HangUpTime );
ASSERT( pInfo->hwndLbHangUpTimes );
// Initialize the drop lists contents and selections.
//
{
INT i;
INT iSel;
DWORD* pdwPercent;
LBTABLEITEM* pItem;
static LBTABLEITEM aTimes[] =
{
SID_Time3s, 3,
SID_Time5s, 5,
SID_Time10s, 10,
SID_Time30s, 30,
SID_Time1m, 60,
SID_Time2m, 120,
SID_Time5m, 300,
SID_Time10m, 600,
SID_Time30m, 1800,
SID_Time1h, 3600,
0, 0
};
static DWORD aDialPercents[] =
{
1, 5, 10, 25, 50, 75, 90, 95, 100, 0xFFFFFFFF
};
static DWORD aHangUpPercents[] =
{
0, 5, 10, 25, 50, 75, 90, 95, 99, 0xFFFFFFFF
};
// Initialize the Dial Percents list and set the selection.
//
iSel = -1;
for (pdwPercent = aDialPercents, i = 0;
*pdwPercent != 0xFFFFFFFF;
++pdwPercent, ++i)
{
TCHAR achPercent[ 12 ];
wsprintf( achPercent, TEXT("%d%%"), *pdwPercent );
ComboBox_AddItem( pInfo->hwndLbDialPercents, achPercent,
(VOID* )UlongToPtr(*pdwPercent));
if (iSel < 0 && pEntry->dwDialPercent <= *pdwPercent)
{
iSel = i;
ComboBox_SetCurSel( pInfo->hwndLbDialPercents, iSel );
}
}
if (iSel < 0)
{
ComboBox_SetCurSel( pInfo->hwndLbDialPercents, i - 1 );
}
// Initialize the Hang Up Percents list and set the selection.
//
iSel = -1;
for (pdwPercent = aHangUpPercents, i = 0;
*pdwPercent != 0xFFFFFFFF;
++pdwPercent, ++i)
{
TCHAR achPercent[ 12 ];
wsprintf( achPercent, TEXT("%d%%"), *pdwPercent );
ComboBox_AddItem( pInfo->hwndLbHangUpPercents, achPercent,
(VOID* )UlongToPtr(*pdwPercent));
if (iSel < 0 && pEntry->dwHangUpPercent <= *pdwPercent)
{
iSel = i;
ComboBox_SetCurSel( pInfo->hwndLbHangUpPercents, iSel );
}
}
if (iSel < 0)
{
ComboBox_SetCurSel( pInfo->hwndLbHangUpPercents, i - 1 );
}
// Initialize the Dial times list.
//
iSel = -1;
for (pItem = aTimes, i = 0;
pItem->sidItem;
++pItem, ++i )
{
ComboBox_AddItemFromId( g_hinstDll, pInfo->hwndLbDialTimes,
pItem->sidItem, (VOID* )UlongToPtr(pItem->dwData));
if (iSel < 0 && pEntry->dwDialSeconds <= pItem->dwData)
{
iSel = i;
ComboBox_SetCurSel( pInfo->hwndLbDialTimes, iSel );
}
}
if (iSel < 0)
{
ComboBox_SetCurSel( pInfo->hwndLbDialTimes, i - 1 );
}
// Initialize the Hang Up times list.
//
iSel = -1;
for (pItem = aTimes, i = 0;
pItem->sidItem;
++pItem, ++i )
{
ComboBox_AddItemFromId( g_hinstDll, pInfo->hwndLbHangUpTimes,
pItem->sidItem, (VOID* )UlongToPtr(pItem->dwData));
if (iSel < 0 && pEntry->dwHangUpSeconds <= pItem->dwData)
{
iSel = i;
ComboBox_SetCurSel( pInfo->hwndLbHangUpTimes, iSel );
}
}
if (iSel < 0)
{
ComboBox_SetCurSel( pInfo->hwndLbDialTimes, i - 1 );
}
}
// Center dialog on the owner window.
//
CenterWindow( hwndDlg, GetParent( hwndDlg ) );
// Add context help button to title bar. Dlgedit.exe doesn't currently
// support this at resource edit time. When that's fixed set
// DS_CONTEXTHELP there and remove this call.
//
AddContextHelpButton( hwndDlg );
return TRUE;
}
VOID
DmSave(
IN DMINFO* pInfo )
// Save the current dialog state in the stub API entry buffer. 'PInfo' is
// the dialog context.
//
{
INT iSel;
TRACE( "DmSave" );
iSel = ComboBox_GetCurSel( pInfo->hwndLbDialPercents );
ASSERT( iSel >= 0 );
pInfo->pEntry->dwDialPercent =
PtrToUlong( ComboBox_GetItemDataPtr( pInfo->hwndLbDialPercents, iSel ) );
iSel = ComboBox_GetCurSel( pInfo->hwndLbDialTimes );
ASSERT( iSel >= 0 );
pInfo->pEntry->dwDialSeconds =
PtrToUlong( ComboBox_GetItemDataPtr( pInfo->hwndLbDialTimes, iSel ) );
iSel = ComboBox_GetCurSel( pInfo->hwndLbHangUpPercents );
ASSERT( iSel >= 0 );
pInfo->pEntry->dwHangUpPercent =
PtrToUlong( ComboBox_GetItemDataPtr( pInfo->hwndLbHangUpPercents, iSel ) );
iSel = ComboBox_GetCurSel( pInfo->hwndLbHangUpTimes );
ASSERT( iSel >= 0 );
pInfo->pEntry->dwHangUpSeconds =
PtrToUlong( ComboBox_GetItemDataPtr( pInfo->hwndLbHangUpTimes, iSel ) );
pInfo->pEntry->fDirty = TRUE;
}
VOID
DmTerm(
IN HWND hwndDlg )
/* Dialog termination. Releases the context block. 'HwndDlg' is the
** handle of a dialog.
*/
{
DMINFO* pInfo;
TRACE( "DmTerm" );
pInfo = (DMINFO* )GetWindowLongPtr( hwndDlg, DWLP_USER );
if (pInfo)
{
Free( pInfo );
TRACE( "Context freed" );
}
}