Leaked source code of windows server 2003
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

/////////////////////////////////////////////////////////////////////////////
// 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;
}
/////////////////////////////////////////////////////////////////////////////