You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
485 lines
13 KiB
485 lines
13 KiB
/////////////////////////////////////////////////////////////////////////////
|
|
// 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 <Objsel.h> //DSOP_SCOPE_INIT_INFO for DsObjectPicker
|
|
|
|
#include <windns.h> //DNS_MAX_NAME_BUFFER_LENGTH
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWzConnectToServer
|
|
|
|
CWzConnectToServer::CWzConnectToServer(CSnapInItem *pNode)
|
|
: CSnapInPropertyPageImpl<CWzConnectToServer>(NULL)
|
|
{
|
|
m_pRoot = static_cast<CFaxServerNode *>(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;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|