/*++ Module Name: MRoots.cpp Abstract: This module contains the Implementation of CMultiRoots. This class displays the Pick DFS Roots Dialog. */ #include "stdafx.h" #include "utils.h" #include "MRoots.h" #include "dfshelp.h" ///////////////////////////////////////////////////////////////////////////// // CMultiRoots CMultiRoots::CMultiRoots() : m_pRootList(NULL) { } CMultiRoots::~CMultiRoots() { FreeNetNameList(&m_SelectedRootList); } HRESULT CMultiRoots::Init(BSTR i_bstrScope, ROOTINFOLIST *i_pRootList) { if (!i_bstrScope || !*i_bstrScope || !i_pRootList || !(i_pRootList->size())) return E_INVALIDARG; SAFE_SYSFREESTRING(&m_bstrScope); m_bstrScope = i_bstrScope; SAFE_SYSFREESTRING(&m_bstrText); HRESULT hr = FormatResourceString(IDS_MROOTS_TEXT, i_bstrScope, &m_bstrText); RETURN_IF_FAILED(hr); m_pRootList = i_pRootList; FreeNetNameList(&m_SelectedRootList); return S_OK; } LRESULT CMultiRoots::OnInitDialog ( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { SetDlgItemText(IDC_MROOTS_TEXT, m_bstrText); HWND hwnd = GetDlgItem(IDC_MROOTS_LIST); HIMAGELIST hImageList = NULL; int nIconIDs[] = {IDI_16x16_FTROOT, IDI_16x16_SAROOT}; HRESULT hr = CreateSmallImageList( _Module.GetResourceInstance(), nIconIDs, sizeof(nIconIDs) / sizeof(nIconIDs[0]), &hImageList); if (SUCCEEDED(hr)) { ListView_SetImageList(hwnd, hImageList, LVSIL_SMALL); for(ROOTINFOLIST::iterator i = m_pRootList->begin(); i != m_pRootList->end(); i++) { if ((*i)->bstrRootName) { LVITEM lvItem = {0}; lvItem.mask = LVIF_TEXT | LVIF_IMAGE; lvItem.pszText = (*i)->bstrRootName; lvItem.iSubItem = 0; lvItem.iImage = ((*i)->enumRootType == DFS_TYPE_FTDFS ? 0 : 1); ListView_InsertItem(hwnd, &lvItem); } } } return TRUE; // Let the system set the focus } /*++ This function is called when a user clicks the ? in the top right of a property sheet and then clciks a control, or when they hit F1 in a control. --*/ LRESULT CMultiRoots::OnCtxHelp( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { LPHELPINFO lphi = (LPHELPINFO) i_lParam; if (!lphi || lphi->iContextType != HELPINFO_WINDOW || lphi->iCtrlId < 0) return FALSE; ::WinHelp((HWND)(lphi->hItemHandle), DFS_CTX_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(PVOID)g_aHelpIDs_IDD_MROOTS); return TRUE; } /*++ This function handles "What's This" help when a user right clicks the control --*/ LRESULT CMultiRoots::OnCtxMenuHelp( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { ::WinHelp((HWND)i_wParam, DFS_CTX_HELP_FILE, HELP_CONTEXTMENU, (DWORD_PTR)(PVOID)g_aHelpIDs_IDD_MROOTS); return TRUE; } LRESULT CMultiRoots::OnOK ( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled ) { CWaitCursor wait; FreeNetNameList(&m_SelectedRootList); HRESULT hr = S_OK; HWND hwnd = GetDlgItem(IDC_MROOTS_LIST); int nIndex = -1; TCHAR szText[MAX_PATH]; do { while (-1 != (nIndex = ListView_GetNextItem(hwnd, nIndex, LVNI_SELECTED))) { ListView_GetItemText(hwnd, nIndex, 0, szText, MAX_PATH); NETNAME* pCurrent = new NETNAME; BREAK_OUTOFMEMORY_IF_NULL(pCurrent, &hr); pCurrent->bstrNetName = szText; if (!(pCurrent->bstrNetName)) { delete pCurrent; hr = E_OUTOFMEMORY; break; } m_SelectedRootList.push_back(pCurrent); } } while (0); if (FAILED(hr)) { FreeNetNameList(&m_SelectedRootList); DisplayMessageBoxForHR(hr); return FALSE; } EndDialog(S_OK); return TRUE; } LRESULT CMultiRoots::OnCancel ( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled ) { EndDialog(S_FALSE); return(true); }