461 lines
11 KiB
C
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" );
|
||
|
}
|
||
|
}
|