191 lines
4.2 KiB
C++
191 lines
4.2 KiB
C++
|
/*++
|
||
|
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);
|
||
|
}
|