///////////////////////////////////////////////////////////////////////////// // FILE : WzConnectToServer.cpp // // // // DESCRIPTION : This file implements the dialog for retargeting to // // another running Microsoft Fax Server. // // // // AUTHOR : yossg // // // // HISTORY : // // Jun 26 2000 yossg Create // // // // Copyright (C) 2000 Microsoft Corporation All Rights Reserved // ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "WzConnectToServer.h" #include "Snapin.h" #include "FxsValid.h" #include "dlgutils.h" #include //DSOP_SCOPE_INIT_INFO for DsObjectPicker #include //DNS_MAX_NAME_BUFFER_LENGTH ///////////////////////////////////////////////////////////////////////////// // CWzConnectToServer CWzConnectToServer::CWzConnectToServer(CSnapInItem *pNode) : CSnapInPropertyPageImpl(NULL) { m_pRoot = static_cast(pNode); } CWzConnectToServer::~CWzConnectToServer() { } /* + CWzConnectToServer::OnInitDialog + * Purpose: * Initiate all dialog controls. * * Arguments: * [in] uMsg : Value identifying the event. * [in] lParam : Message-specific value. * [in] wParam : Message-specific value. * [in] bHandled : bool value. * - Return: - 0 or 1 */ LRESULT CWzConnectToServer::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CWzConnectToServer::OnInitDialog")); HRESULT hRc = S_OK; // // Attach controls // m_ServerNameEdit.Attach(GetDlgItem(IDC_CONNECT_COMPUTER_NAME_EDIT)); // // Set length limit // m_ServerNameEdit.SetLimitText(DNS_MAX_NAME_BUFFER_LENGTH); // // Init the other controls // CheckDlgButton(IDC_CONNECT_LOCAL_RADIO1, BST_CHECKED); CheckDlgButton(IDC_CONNECT_ANOTHER_RADIO2, BST_UNCHECKED); CheckDlgButton(IDC_CONNECT_OVERRIDE_CHECK, BST_UNCHECKED); // // Disable remote computer controls // EnableSpecifiedServerControls(FALSE); return 1; } /* + CWzConnectToServer::OnSetActive + * Purpose: * * * Arguments: * - Return: - TRUE or FALSE */ BOOL CWzConnectToServer::OnSetActive() { DEBUG_FUNCTION_NAME( _T("CWzConnectToServer::OnSetActive")); // // Must use post message during the setactive message. // CWindow( GetParent() ).PostMessage( PSM_SETWIZBUTTONS, 0, PSWIZB_FINISH ); return TRUE; } /* + CWzConnectToServer::OnWizardFinish + * Purpose: * To apply data when wizard finish . * * Arguments: * [in] uMsg : Value identifying the event. * [in] lParam : Message-specific value. * [in] wParam : Message-specific value. * [in] bHandled : bool value. * - Return: - 0 or 1 */ BOOL CWzConnectToServer::OnWizardFinish() { DEBUG_FUNCTION_NAME( _T("CWzConnectToServer::OnWizardFinish")); ATLASSERT (m_pRoot); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; BOOL fIsLocalServer = TRUE; CComBSTR bstrServerName = L""; BOOL fAllowOverrideServerName = FALSE; // // Step 1: get data // fIsLocalServer = ( IsDlgButtonChecked(IDC_CONNECT_LOCAL_RADIO1) == BST_CHECKED ); if(fIsLocalServer) { bstrServerName = L""; if (!bstrServerName) { hRc = E_OUTOFMEMORY; goto Exit; } } else //!fIsLocalServer => the other server radio button was clicked. { // // 1.a: PreApply Checks // if ( !m_ServerNameEdit.GetWindowText(&bstrServerName)) { DebugPrintEx( DEBUG_ERR, TEXT("Failed to GetWindowText(&m_bstrGroupName)")); DlgMsgBox(this, IDS_FAIL2READ_GROUPNAME); ::SetFocus(GetDlgItem(IDC_CONNECT_COMPUTER_NAME_EDIT)); hRc = S_FALSE; goto Exit; } // // Server Name initial \\ trancation (if they are there) // if ( ( _tcslen(bstrServerName.m_str) > 2 ) && ( 0 == wcsncmp( bstrServerName.m_str , _T("\\\\") , 2 )) ) { CComBSTR bstrTmp = _tcsninc(bstrServerName.m_str, 2); if (!bstrTmp) { DebugPrintEx(DEBUG_ERR, _T("Out of memory -bstr allocation error.")); DlgMsgBox(this, IDS_MEMORY); ::SetFocus(GetDlgItem(IDC_CONNECT_COMPUTER_NAME_EDIT)); hRc = S_FALSE; goto Exit; } bstrServerName.Empty(); bstrServerName = bstrTmp; // operator = is actually copy() here. } // // Server Name validity checks // UINT uRetIDS = 0; if (!IsValidServerNameString(bstrServerName, &uRetIDS, TRUE /*DNS Name Length*/)) { ATLASSERT ( 0 == uRetIDS); DebugPrintEx(DEBUG_ERR, _T("Non valid server name.")); DlgMsgBox(this, uRetIDS); ::SetFocus(GetDlgItem(IDC_CONNECT_COMPUTER_NAME_EDIT)); hRc = S_FALSE; goto Exit; } if ( IsLocalServerName(bstrServerName.m_str) ) { DebugPrintEx( DEBUG_MSG, _T("The computer name %ws is the same as the name of the current managed server."), bstrServerName.m_str); bstrServerName = L""; } } // // Allow override // if (IsDlgButtonChecked(IDC_CONNECT_OVERRIDE_CHECK) == BST_CHECKED) { fAllowOverrideServerName = TRUE; } //else: fAllowOverrideServerName = FALSE is the default; // // Step 2: passed the machine name and the permission to override // // // Redraw main node display name // hRc = m_pRoot->SetServerNameOnSnapinAddition(bstrServerName, fAllowOverrideServerName); if (S_OK != hRc ) { //error message given by the called function DebugPrintEx( DEBUG_ERR, _T("Failed to SetServerNameOnSnapinAddition(bstrServerName)")); goto Exit; } // // Step 3: Close the dialog // ATLASSERT(S_OK == hRc && ERROR_SUCCESS == ec); DebugPrintEx( DEBUG_MSG, _T("The connection to the new server was done successfully.")); goto Exit; Exit: return (S_OK != hRc) ? FALSE : TRUE; } /* - CWzConnectToServer::OnComputerRadioButtonClicked - * Purpose: * Check status OnComputerRadioButtonClicked * * Arguments: * * Return: * 1 */ LRESULT CWzConnectToServer::OnComputerRadioButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { UNREFERENCED_PARAMETER (wNotifyCode); UNREFERENCED_PARAMETER (wID); UNREFERENCED_PARAMETER (hWndCtl); UNREFERENCED_PARAMETER (bHandled); DEBUG_FUNCTION_NAME( _T("CWzConnectToServer::OnComputerRadioButtonClicked")); if ( IsDlgButtonChecked(IDC_CONNECT_ANOTHER_RADIO2) == BST_CHECKED ) { EnableSpecifiedServerControls(TRUE); ::SetFocus(GetDlgItem(IDC_CONNECT_COMPUTER_NAME_EDIT)); } else //connect to local server { EnableSpecifiedServerControls(FALSE); } return 1; } /* - CWzConnectToServer::OnTextChanged - * Purpose: * Check the validity of text in side the text box. * * Arguments: * * Return: * 1 */ LRESULT CWzConnectToServer::OnTextChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { UNREFERENCED_PARAMETER (wNotifyCode); UNREFERENCED_PARAMETER (wID); UNREFERENCED_PARAMETER (hWndCtl); UNREFERENCED_PARAMETER (bHandled); DEBUG_FUNCTION_NAME( _T("CWzConnectToServer::OnTextChanged")); //actually in the current design, do nothing return 1; } /* - CWzConnectToServer::EnableSpecifiedServerControls - * Purpose: * Enable/disable the specified server controls. * * Arguments: * [in] state - boolean value to enable TRUE or FALSE to disable * * Return: * void */ void CWzConnectToServer::EnableSpecifiedServerControls(BOOL fState) { // // enable/disable controls // ::EnableWindow(GetDlgItem(IDC_CONNECT_COMPUTER_NAME_EDIT), fState); ::EnableWindow(GetDlgItem(IDC_CONNECT_BROWSE4SERVER_BUTTON), fState); } /* - CWzConnectToServer::OnBrowseForMachine - * Purpose: * Enable/disable the specified server controls. * * Arguments: * * Return: * OLE error code */ static UINT g_cfDsObjectPicker = RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST); LRESULT CWzConnectToServer::OnBrowseForMachine(UINT /*uMsg*/, WPARAM /*wParam*/, HWND /*hwnd*/, BOOL& /*bHandled*/) { HRESULT hr = S_OK; static const int SCOPE_INIT_COUNT = 1; DSOP_SCOPE_INIT_INFO aScopeInit[SCOPE_INIT_COUNT]; DEBUG_FUNCTION_NAME( _T("CWzConnectToServer::OnBrowseForMachine")); ZeroMemory(aScopeInit, sizeof(DSOP_SCOPE_INIT_INFO) * SCOPE_INIT_COUNT); // // Since we just want computer objects from every scope, combine them // all in a single scope initializer. // aScopeInit[0].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); aScopeInit[0].flType = DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN | DSOP_SCOPE_TYPE_GLOBAL_CATALOG | DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN | DSOP_SCOPE_TYPE_WORKGROUP | DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE | DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE; aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; // // Put the scope init array into the object picker init array // DSOP_INIT_INFO InitInfo; ZeroMemory(&InitInfo, sizeof(InitInfo)); InitInfo.cbSize = sizeof(InitInfo); InitInfo.pwzTargetComputer = NULL; // NULL == local machine InitInfo.cDsScopeInfos = SCOPE_INIT_COUNT; InitInfo.aDsScopeInfos = aScopeInit; // // Note object picker makes its own copy of InitInfo. Also note // that Initialize may be called multiple times, last call wins. // IDsObjectPicker *pDsObjectPicker = NULL; IDataObject *pdo = NULL; bool fGotStgMedium = false; STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL, NULL }; do { hr = CoCreateInstance(CLSID_DsObjectPicker, NULL, CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, (void **) &pDsObjectPicker); if(FAILED(hr)) break; hr = pDsObjectPicker->Initialize(&InitInfo); if(FAILED(hr)) break; hr = pDsObjectPicker->InvokeDialog(m_hWnd, &pdo); if(FAILED(hr)) break; // Quit if user hit Cancel if (hr == S_FALSE) { break; } FORMATETC formatetc = { (CLIPFORMAT)g_cfDsObjectPicker, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; hr = pdo->GetData(&formatetc, &stgmedium); if(FAILED(hr)) break; fGotStgMedium = true; PDS_SELECTION_LIST pDsSelList = (PDS_SELECTION_LIST) GlobalLock(stgmedium.hGlobal); if (!pDsSelList) { break; } ATLASSERT(pDsSelList->cItems == 1); // // Put the machine name in the edit control // SetDlgItemText(IDC_CONNECT_COMPUTER_NAME_EDIT, pDsSelList->aDsSelection[0].pwzName); GlobalUnlock(stgmedium.hGlobal); } while (0); if (fGotStgMedium) { ReleaseStgMedium(&stgmedium); } if (pDsObjectPicker) { pDsObjectPicker->Release(); } return hr; } /////////////////////////////////////////////////////////////////////////////