windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/sdialdlg.cpp
2020-09-26 16:20:57 +08:00

349 lines
8 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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