// File: sdialdlg.cpp // // Speed Dials (Friends) #include "precomp.h" #include "resource.h" #include "sdialdlg.h" #include "call.h" #include "cmd.h" #include "ConfUtil.h" #include "help_ids.h" extern BOOL FCreateSpeedDial(LPCTSTR pcszName, LPCTSTR pcszAddress, NM_ADDR_TYPE addrType = NM_ADDR_UNKNOWN, DWORD dwCallFlags = CRPCF_DEFAULT, LPCTSTR pcszRemoteConfName = NULL, LPCTSTR pcszPassword = NULL, LPCTSTR pcszPathPrefix = NULL); static const DWORD _rgHelpIdsSpeedDial[] = { IDC_STATIC_SPEED_DIAL_INSTRUCTIONS, IDH_STATIC_SPEED_DIAL_INSTRUCTIONS, IDC_CSD_SD_INFO_GROUP, IDH_CSD_SD_INFO_GROUP, IDC_STATIC_ADDRESS, IDH_CSD_ADDRESS_EDIT, IDC_CSD_ADDRESS_EDIT, IDH_CSD_ADDRESS_EDIT, IDC_STATIC_CALLUSING, IDH_CSD_CALL_USING_COMBO, IDC_CSD_CALL_USING_COMBO, IDH_CSD_CALL_USING_COMBO, IDC_CSD_CREATE_GROUPBOX, IDH_CSD_CREATE_GROUPBOX, IDC_CSD_SPEEDDIAL_LIST_RADIO, IDH_CSD_SPEEDDIAL_LIST_RADIO, IDC_CSD_SAVE_DESKTOP_RADIO, IDH_CSD_SAVE_DESKTOP_RADIO, 0, 0 // terminator }; CSpeedDialDlg::CSpeedDialDlg(HWND hwndParent, NM_ADDR_TYPE addrType) : m_hwndParent (hwndParent), m_pszAddress (NULL), m_addrType (addrType), m_hwnd (NULL) { DBGENTRY(CSpeedDialDlg::CSpeedDialDlg); } CSpeedDialDlg::~CSpeedDialDlg() { DBGENTRY(CSpeedDialDlg::~CSpeedDialDlg); // Free all strings delete m_pszAddress; } /**************************************************************************** * * CLASS: CSpeedDialDlg * * MEMBER: DoModal() * * PURPOSE: Brings up the modal dialog box * ****************************************************************************/ INT_PTR CSpeedDialDlg::DoModal(LPCTSTR pcszAddress) { DBGENTRY(CSpeedDialDlg::DoModal); if (NULL != pcszAddress) { ASSERT(NULL == m_pszAddress); m_pszAddress = PszAlloc(pcszAddress); } INT_PTR nRet = DialogBoxParam( ::GetInstanceHandle(), MAKEINTRESOURCE(IDD_CREATE_SPEED_DIAL), m_hwndParent, CSpeedDialDlg::SpeedDialDlgProc, (LPARAM) this); DebugExitINT_PTR(CSpeedDialDlg::DoModal, nRet); return nRet; } /**************************************************************************** * * CLASS: CSpeedDialDlg * * MEMBER: SpeedDialDlgProc() * * PURPOSE: Dialog Proc - handles all messages * ****************************************************************************/ INT_PTR CALLBACK CSpeedDialDlg::SpeedDialDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bMsgHandled = FALSE; ASSERT(IS_VALID_HANDLE(hDlg, WND)); switch (uMsg) { case WM_INITDIALOG: { if (NULL != lParam) { ((CSpeedDialDlg*) lParam)->m_hwnd = hDlg; ::SetWindowLongPtr(hDlg, DWLP_USER, lParam); bMsgHandled = ((CSpeedDialDlg*) lParam)->OnInitDialog(); } break; } default: { CSpeedDialDlg* psdd = (CSpeedDialDlg*) ::GetWindowLongPtr(hDlg, DWLP_USER); if (NULL != psdd) { bMsgHandled = psdd->ProcessMessage(uMsg, wParam, lParam); } } } return bMsgHandled; } BOOL CSpeedDialDlg::AddAddressType(NM_ADDR_TYPE addrType, LPCTSTR lpcszDispName) { int index = (int)::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_ADDSTRING, 0, (LPARAM) lpcszDispName); if (CB_ERR == index) return FALSE; // Set the item data: ::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_SETITEMDATA, index,addrType); if (addrType == m_addrType) { // Select the transport: ::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_SETCURSEL, index, 0); } return TRUE; } BOOL CSpeedDialDlg::AddAddressType(NM_ADDR_TYPE addrType, UINT uStringID) { TCHAR sz[MAX_PATH]; if (!FLoadString(uStringID, sz, CCHMAX(sz))) return FALSE; return AddAddressType(addrType, sz); } BOOL CSpeedDialDlg::OnInitDialog(void) { ::CheckDlgButton(m_hwnd, IDC_CSD_SPEEDDIAL_LIST_RADIO, BST_CHECKED); // Fill in the "Call Using" list: AddAddressType(NM_ADDR_IP, IDS_ACD_CT_IP); AddAddressType(NM_ADDR_ULS, IDS_ACD_CT_ILS); if (FH323GatewayEnabled()) { AddAddressType(NM_ADDR_H323_GATEWAY, IDS_GATEWAY_DISPLAY_NAME); } int iSelected = (int)::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_GETCURSEL, 0, 0); if (CB_ERR == iSelected) { // The transport that we wanted to select was not available, so // we will select the first one that we added to the list: ::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_SETCURSEL, 0, 0); m_addrType = (NM_ADDR_TYPE) ::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_GETITEMDATA, 0, 0); } if (!FEmptySz(m_pszAddress)) { ::SetDlgItemText(m_hwnd, IDC_CSD_ADDRESS_EDIT, m_pszAddress); } else if (NM_ADDR_ULS == m_addrType) { RegEntry re(ISAPI_CLIENT_KEY, HKEY_CURRENT_USER); ::SetDlgItemText(m_hwnd, IDC_CSD_ADDRESS_EDIT, re.GetString(REGVAL_ULS_RES_NAME)); } Edit_LimitText(GetDlgItem(m_hwnd, IDC_CSD_ADDRESS_EDIT), CCHMAXSZ_ADDRESS - 1); RefreshOkButton(); return TRUE; } /**************************************************************************** * * CLASS: CSpeedDialDlg * * MEMBER: ProcessMessage() * * PURPOSE: processes all messages except WM_INITDIALOG * ****************************************************************************/ BOOL CSpeedDialDlg::ProcessMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRet = FALSE; ASSERT(m_hwnd); switch (uMsg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { bRet = OnOk(); break; } case IDCANCEL: { ::EndDialog(m_hwnd, LOWORD(wParam)); bRet = TRUE; break; } case IDC_CSD_ADDRESS_EDIT: { if (EN_CHANGE == HIWORD(wParam)) { RefreshOkButton(); } break; } } break; case WM_CONTEXTMENU: DoHelpWhatsThis(wParam, _rgHelpIdsSpeedDial); break; case WM_HELP: DoHelp(lParam, _rgHelpIdsSpeedDial); break; } } return bRet; } NM_ADDR_TYPE CSpeedDialDlg::GetCurAddrType(void) { int iIndex = (int)::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_GETCURSEL, 0, 0); if (CB_ERR == iIndex) return NM_ADDR_UNKNOWN; return (NM_ADDR_TYPE) ::SendDlgItemMessage(m_hwnd, IDC_CSD_CALL_USING_COMBO, CB_GETITEMDATA, iIndex, 0); } BOOL CSpeedDialDlg::OnOk(void) { m_addrType = GetCurAddrType(); BOOL fSaveDesktop = (BST_CHECKED == ::IsDlgButtonChecked(m_hwnd, IDC_CSD_SAVE_DESKTOP_RADIO)); TCHAR szBuf[MAX_PATH]; if (0 != ::GetDlgItemText( m_hwnd, IDC_CSD_ADDRESS_EDIT, szBuf, ARRAY_ELEMENTS(szBuf))) { // Copy address into the address: delete m_pszAddress; m_pszAddress = PszAlloc(szBuf); } ::EndDialog(m_hwnd, IDOK); TRACE_OUT(("Creating Speed Dial:")); TRACE_OUT(("\tTransport ID: %d", GetAddrType())); TRACE_OUT(("\tAddress: \"%s\"", GetAddress())); TRACE_OUT(("\tSaveDesktop: %s", ::GetBOOLString(fSaveDesktop))); NM_ADDR_TYPE addrType = GetAddrType(); DWORD crpcf = (NM_ADDR_H323_GATEWAY == addrType) ? (CRPCF_AUDIO | CRPCF_VIDEO) : CRPCF_DEFAULT; if (fSaveDesktop) { // Save on desktop BOOL fSavedOk = FALSE; LPITEMIDLIST pidl = NULL; TCHAR szPathPrefix[MAX_PATH]; szPathPrefix[0] = _T('\0'); if (NMGetSpecialFolderPath(NULL, szPathPrefix, CSIDL_DESKTOP, TRUE)) { fSavedOk = ::FCreateSpeedDial( GetAddress(), // pcszName GetAddress(), // pcszAddress addrType, // addrType crpcf, // dwCallFlags NULL, // pcszRemoteConfName NULL, // pcszPassword szPathPrefix); // pcszPathPrefix } else { ERROR_OUT(("NMGetSpecialFolderPath failed!")); } ::ConfMsgBox( m_hwnd, (LPCTSTR) (fSavedOk ? (UINT_PTR)IDS_SPEED_DIAL_SAVED_ON_DESKTOP : (UINT_PTR)IDS_SPEED_DIAL_SAVE_ERROR)); } else { ::FCreateSpeedDial( GetAddress(), // pcszName GetAddress(), // pcszAddress addrType, // addrType crpcf, // dwCallFlags NULL, // pcszRemoteConfName NULL, // pcszPassword NULL); // pcszPathPrefix } return TRUE; } VOID CSpeedDialDlg::RefreshOkButton() { ::EnableWindow( GetDlgItem(m_hwnd, IDOK), 0 != ::GetWindowTextLength(::GetDlgItem(m_hwnd, IDC_CSD_ADDRESS_EDIT))); }