// 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" ); } }