/*++ 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(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; }