501 lines
15 KiB
C++
501 lines
15 KiB
C++
/*++
|
|
Module Name:
|
|
|
|
pubProp.cpp
|
|
|
|
Abstract:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "utils.h"
|
|
#include "pubProp.h"
|
|
#include "mvEdit.h"
|
|
#include "dfshelp.h"
|
|
#include "ldaputils.h"
|
|
|
|
CPublishPropPage::CPublishPropPage() :
|
|
m_lNotifyHandle(0),
|
|
m_lNotifyParam(0),
|
|
CQWizardPageImpl<CPublishPropPage>(false)
|
|
{
|
|
m_bPublish = FALSE;
|
|
}
|
|
|
|
CPublishPropPage::~CPublishPropPage()
|
|
{
|
|
// do not call MMCFreeNotifyHandle(m_lNotifyHandle);
|
|
//
|
|
// It should only be called once, and is already called
|
|
// by the main property page
|
|
}
|
|
|
|
void CPublishPropPage::_Load()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
CComBSTR bstrUNCPath;
|
|
do {
|
|
if (!m_piDfsRoot)
|
|
{
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
}
|
|
|
|
DFS_TYPE lDfsType = DFS_TYPE_UNASSIGNED;
|
|
hr = m_piDfsRoot->get_DfsType((long *)&lDfsType);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
if (lDfsType != DFS_TYPE_FTDFS)
|
|
{
|
|
CComBSTR bstrServerName, bstrShareName;
|
|
hr = m_piDfsRoot->GetOneDfsHost(&bstrServerName, &bstrShareName);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
if (lstrlen(bstrShareName) > MAX_RDN_KEY_SIZE)
|
|
{
|
|
LoadStringFromResource(IDS_PUBPAGE_ERRMSG_64, &m_bstrError);
|
|
return;
|
|
}
|
|
|
|
bstrUNCPath = _T("\\\\");
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
bstrUNCPath += bstrServerName;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
bstrUNCPath += _T("\\");
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
bstrUNCPath += bstrShareName;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
|
|
hr = ReadSharePublishInfoOnSARoot(
|
|
bstrServerName,
|
|
bstrShareName,
|
|
&m_bPublish,
|
|
&m_bstrUNCPath,
|
|
&m_bstrDescription,
|
|
&m_bstrKeywords,
|
|
&m_bstrManagedBy
|
|
);
|
|
BREAK_IF_FAILED(hr);
|
|
} else
|
|
{
|
|
CComBSTR bstrDomainName;
|
|
hr = m_piDfsRoot->get_DomainName(&bstrDomainName);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
CComBSTR bstrDfsName;
|
|
hr = m_piDfsRoot->get_DfsName(&bstrDfsName);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
bstrUNCPath = _T("\\\\");
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
bstrUNCPath += bstrDomainName;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
bstrUNCPath += _T("\\");
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
bstrUNCPath += bstrDfsName;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrUNCPath, &hr);
|
|
|
|
hr = ReadSharePublishInfoOnFTRoot(
|
|
bstrDomainName,
|
|
bstrDfsName,
|
|
&m_bPublish,
|
|
&m_bstrUNCPath,
|
|
&m_bstrDescription,
|
|
&m_bstrKeywords,
|
|
&m_bstrManagedBy
|
|
);
|
|
BREAK_IF_FAILED(hr);
|
|
}
|
|
} while (0);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
_Reset();
|
|
GetMessage(&m_bstrError, hr, IDS_PUBPAGE_ERRMSG);
|
|
}
|
|
|
|
if (!m_bstrUNCPath || !*m_bstrUNCPath)
|
|
m_bstrUNCPath = bstrUNCPath;
|
|
}
|
|
|
|
HRESULT CPublishPropPage::_Save(
|
|
IN BOOL i_bPublish,
|
|
IN BSTR i_bstrDescription,
|
|
IN BSTR i_bstrKeywords,
|
|
IN BSTR i_bstrManagedBy
|
|
)
|
|
{
|
|
RETURN_INVALIDARG_IF_NULL((IDfsRoot *)m_piDfsRoot);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
do {
|
|
if (m_bPublish == i_bPublish &&
|
|
PROPSTRNOCHNG((BSTR)m_bstrDescription, i_bstrDescription) &&
|
|
PROPSTRNOCHNG((BSTR)m_bstrKeywords, i_bstrKeywords) &&
|
|
PROPSTRNOCHNG((BSTR)m_bstrManagedBy, i_bstrManagedBy) )
|
|
break; // no change
|
|
|
|
DFS_TYPE lDfsType = DFS_TYPE_UNASSIGNED;
|
|
hr = m_piDfsRoot->get_DfsType((long *)&lDfsType);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
if (lDfsType != DFS_TYPE_FTDFS)
|
|
{
|
|
CComBSTR bstrServerName, bstrShareName;
|
|
hr = m_piDfsRoot->GetOneDfsHost(&bstrServerName, &bstrShareName);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
hr = ModifySharePublishInfoOnSARoot(
|
|
bstrServerName,
|
|
bstrShareName,
|
|
i_bPublish,
|
|
m_bstrUNCPath,
|
|
i_bstrDescription,
|
|
i_bstrKeywords,
|
|
i_bstrManagedBy
|
|
);
|
|
if (S_OK == hr)
|
|
{
|
|
m_bPublish = i_bPublish;
|
|
m_bstrDescription = i_bstrDescription;
|
|
m_bstrKeywords = i_bstrKeywords;
|
|
m_bstrManagedBy = i_bstrManagedBy;
|
|
} else if (S_FALSE == hr)
|
|
hr = S_OK; // ignore non-existing object
|
|
|
|
BREAK_IF_FAILED(hr);
|
|
} else
|
|
{
|
|
CComBSTR bstrDomainName;
|
|
hr = m_piDfsRoot->get_DomainName(&bstrDomainName);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
CComBSTR bstrDfsName;
|
|
hr = m_piDfsRoot->get_DfsName(&bstrDfsName);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
hr = ModifySharePublishInfoOnFTRoot(
|
|
bstrDomainName,
|
|
bstrDfsName,
|
|
i_bPublish,
|
|
m_bstrUNCPath,
|
|
i_bstrDescription,
|
|
i_bstrKeywords,
|
|
i_bstrManagedBy
|
|
);
|
|
if (S_OK == hr)
|
|
{
|
|
m_bPublish = i_bPublish;
|
|
m_bstrDescription = i_bstrDescription;
|
|
m_bstrKeywords = i_bstrKeywords;
|
|
m_bstrManagedBy = i_bstrManagedBy;
|
|
}
|
|
BREAK_IF_FAILED(hr);
|
|
}
|
|
} while (0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnInitDialog(
|
|
IN UINT i_uMsg,
|
|
IN WPARAM i_wParam,
|
|
LPARAM i_lParam,
|
|
IN OUT BOOL& io_bHandled
|
|
)
|
|
{
|
|
CWaitCursor wait;
|
|
|
|
_Load();
|
|
|
|
CheckDlgButton(IDC_PUBPROP_PUBLISH, (m_bPublish ? BST_CHECKED : BST_UNCHECKED));
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_UNCPATH_LABEL), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_UNCPATH), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_DESCRIPTION_LABEL), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_DESCRIPTION), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS_LABEL), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS_EDIT), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_MANAGEDBY_LABEL), m_bPublish);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_MANAGEDBY), m_bPublish);
|
|
|
|
SetDlgItemText(IDC_PUBPROP_ERROR, ((BSTR)m_bstrError) ? m_bstrError : _T(""));
|
|
SetDlgItemText(IDC_PUBPROP_UNCPATH, ((BSTR)m_bstrUNCPath) ? m_bstrUNCPath : _T(""));
|
|
SetDlgItemText(IDC_PUBPROP_DESCRIPTION, ((BSTR)m_bstrDescription) ? m_bstrDescription : _T(""));
|
|
SetDlgItemText(IDC_PUBPROP_KEYWORDS, ((BSTR)m_bstrKeywords) ? m_bstrKeywords : _T(""));
|
|
SetDlgItemText(IDC_PUBPROP_MANAGEDBY, ((BSTR)m_bstrManagedBy) ? m_bstrManagedBy : _T(""));
|
|
|
|
if (!m_bstrError)
|
|
{
|
|
::SendMessage(GetDlgItem(IDC_PUBPROP_DESCRIPTION), EM_LIMITTEXT, 1024, 0); // AD schema defines its upper to be 1024
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_ERROR), FALSE);
|
|
} else
|
|
{
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_PUBLISH), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_UNCPATH), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_UNCPATH_LABEL), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_DESCRIPTION), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_DESCRIPTION_LABEL), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS_LABEL), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS_EDIT), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_MANAGEDBY), FALSE);
|
|
MyShowWindow(GetDlgItem(IDC_PUBPROP_MANAGEDBY_LABEL), FALSE);
|
|
}
|
|
|
|
return TRUE; // To let the dialg set the control
|
|
}
|
|
|
|
/*++
|
|
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 CPublishPropPage::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_PUBLISH_PROP);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*++
|
|
This function handles "What's This" help when a user right clicks the control
|
|
--*/
|
|
LRESULT CPublishPropPage::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_PUBLISH_PROP);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CPublishPropPage::_Reset()
|
|
{
|
|
m_bPublish = FALSE;
|
|
|
|
m_bstrUNCPath.Empty();
|
|
m_bstrDescription.Empty();
|
|
m_bstrKeywords.Empty();
|
|
m_bstrManagedBy.Empty();
|
|
}
|
|
|
|
HRESULT CPublishPropPage::Initialize(
|
|
IN IDfsRoot* i_piDfsRoot
|
|
)
|
|
{
|
|
RETURN_INVALIDARG_IF_NULL(i_piDfsRoot);
|
|
|
|
if ((IDfsRoot *)m_piDfsRoot)
|
|
m_piDfsRoot.Release();
|
|
|
|
m_piDfsRoot = i_piDfsRoot;
|
|
|
|
_Reset();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnApply()
|
|
{
|
|
CWaitCursor wait;
|
|
|
|
HRESULT hr = S_OK;
|
|
DWORD dwTextLength = 0;
|
|
int idControl = 0;
|
|
int idString = 0;
|
|
BOOL bValidInput = FALSE;
|
|
|
|
BOOL bPublish = IsDlgButtonChecked(IDC_PUBPROP_PUBLISH);
|
|
CComBSTR bstrDescription;
|
|
CComBSTR bstrKeywords;
|
|
CComBSTR bstrManagedBy;
|
|
do {
|
|
idControl = IDC_PUBPROP_DESCRIPTION;
|
|
hr = GetInputText(GetDlgItem(idControl), &bstrDescription, &dwTextLength);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
idControl = IDC_PUBPROP_KEYWORDS;
|
|
hr = GetInputText(GetDlgItem(idControl), &bstrKeywords, &dwTextLength);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
idControl = IDC_PUBPROP_MANAGEDBY;
|
|
hr = GetInputText(GetDlgItem(idControl), &bstrManagedBy, &dwTextLength);
|
|
BREAK_IF_FAILED(hr);
|
|
|
|
bValidInput = TRUE;
|
|
|
|
} while (0);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
SetActivePropertyPage(GetParent(), m_hWnd);
|
|
DisplayMessageBoxForHR(hr);
|
|
::SetFocus(GetDlgItem(idControl));
|
|
return FALSE;
|
|
} else if (bValidInput)
|
|
{
|
|
hr = _Save(bPublish, bstrDescription, bstrKeywords, bstrManagedBy);
|
|
if (FAILED(hr))
|
|
{
|
|
SetActivePropertyPage(GetParent(), m_hWnd);
|
|
if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
|
|
DisplayMessageBox(::GetActiveWindow(), MB_OK, 0, IDS_FAILED_TO_PUBLISH_DFSROOT_BADUSER);
|
|
else
|
|
DisplayMessageBox(::GetActiveWindow(), MB_OK, hr, IDS_FAILED_TO_PUBLISH_DFSROOT, m_bstrUNCPath);
|
|
return FALSE;
|
|
} else if (S_FALSE == hr) // no dfs root object in the DS
|
|
{
|
|
SetActivePropertyPage(GetParent(), m_hWnd);
|
|
DisplayMessageBox(::GetActiveWindow(), MB_OK, 0, IDS_FAILED_TO_PUBLISH_NOROOTOBJ);
|
|
return FALSE;
|
|
}
|
|
|
|
::SendMessage(GetParent(), PSM_UNCHANGED, (WPARAM)m_hWnd, 0);
|
|
|
|
if (m_lNotifyHandle && m_lNotifyParam)
|
|
MMCPropertyChangeNotify(m_lNotifyHandle, m_lNotifyParam);
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
SetActivePropertyPage(GetParent(), m_hWnd);
|
|
if (idString)
|
|
DisplayMessageBoxWithOK(idString);
|
|
::SetFocus(GetDlgItem(idControl));
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnPublish(
|
|
IN WORD i_wNotifyCode,
|
|
IN WORD i_wID,
|
|
IN HWND i_hWndCtl,
|
|
IN OUT BOOL& io_bHandled
|
|
)
|
|
{
|
|
if (BN_CLICKED == i_wNotifyCode)
|
|
{
|
|
::SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0);
|
|
|
|
BOOL bEnable = (BST_CHECKED == IsDlgButtonChecked(i_wID));
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_UNCPATH_LABEL), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_UNCPATH), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_DESCRIPTION_LABEL), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_DESCRIPTION), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS_LABEL), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_KEYWORDS_EDIT), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_MANAGEDBY_LABEL), bEnable);
|
|
::EnableWindow(GetDlgItem(IDC_PUBPROP_MANAGEDBY), bEnable);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnDescription(
|
|
IN WORD i_wNotifyCode,
|
|
IN WORD i_wID,
|
|
IN HWND i_hWndCtl,
|
|
IN OUT BOOL& io_bHandled
|
|
)
|
|
{
|
|
if (EN_CHANGE == i_wNotifyCode)
|
|
{
|
|
::SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnEditKeywords(
|
|
IN WORD i_wNotifyCode,
|
|
IN WORD i_wID,
|
|
IN HWND i_hWndCtl,
|
|
IN OUT BOOL& io_bHandled
|
|
)
|
|
{
|
|
DWORD dwTextLength = 0;
|
|
CComBSTR bstrKeywords;
|
|
GetInputText(GetDlgItem(IDC_PUBPROP_KEYWORDS), &bstrKeywords, &dwTextLength);
|
|
|
|
if (S_OK == InvokeMultiValuedStringEditDlg(
|
|
&bstrKeywords,
|
|
_T(";"),
|
|
IDS_MVSTRINGEDIT_TITLE_KEYWORDS,
|
|
IDS_MVSTRINGEDIT_TEXT_KEYWORDS,
|
|
KEYTWORDS_UPPER_RANGER))
|
|
{
|
|
SetDlgItemText(IDC_PUBPROP_KEYWORDS, bstrKeywords);
|
|
::SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnManagedBy(
|
|
IN WORD i_wNotifyCode,
|
|
IN WORD i_wID,
|
|
IN HWND i_hWndCtl,
|
|
IN OUT BOOL& io_bHandled
|
|
)
|
|
{
|
|
if (EN_CHANGE == i_wNotifyCode)
|
|
{
|
|
::SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT
|
|
CPublishPropPage::OnParentClosing(
|
|
IN UINT i_uMsg,
|
|
IN WPARAM i_wParam,
|
|
LPARAM i_lParam,
|
|
IN OUT BOOL& io_bHandled
|
|
)
|
|
{
|
|
::SendMessage(GetParent(), PSM_PRESSBUTTON, PSBTN_CANCEL, 0);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
HRESULT
|
|
CPublishPropPage::SetNotifyData(
|
|
IN LONG_PTR i_lNotifyHandle,
|
|
IN LPARAM i_lParam
|
|
)
|
|
{
|
|
m_lNotifyHandle = i_lNotifyHandle;
|
|
m_lNotifyParam = i_lParam;
|
|
|
|
return S_OK;
|
|
}
|