Windows2003-3790/base/remoteboot/admin/newcmptr.cpp
2020-09-30 16:53:55 +02:00

440 lines
9.5 KiB
C++

//
// Copyright 1997 - Microsoft
//
//
// NEWCMPTR.CPP - The "New Client" dialog box
//
#include "pch.h"
#include "newcmptr.h"
#include "mangdlg.h"
#include "ccomputr.h"
DEFINE_MODULE("IMADMUI")
DEFINE_THISCLASS("CNewComputerExtensions")
#define THISCLASS CNewComputerExtensions
#define LPTHISCLASS LPCNewComputerExtensions
//
// CNewComputerExtensions_CreateInstance( )
//
LPVOID
CNewComputerExtensions_CreateInstance( void )
{
TraceFunc( "CNewComputerExtensions_CreateInstance()\n" );
LPTHISCLASS lpcc = new THISCLASS( );
if ( !lpcc ) {
RETURN(lpcc);
}
HRESULT hr = THR( lpcc->Init( ) );
if ( FAILED(hr) ) {
delete lpcc;
RETURN(NULL);
}
RETURN(lpcc);
}
//
// Constructor
//
THISCLASS::THISCLASS( ) :
_padsContainerObj(NULL),
_pManagedDialog(NULL),
_pHostServerDialog(NULL),
_pads(NULL),
_fActivatePages(FALSE),
_pszWizTitle(NULL),
_pszContDisplayName(NULL),
_hIcon(NULL)
{
TraceClsFunc( "CNewComputerExtensions( )\n" );
InterlockIncrement( g_cObjects );
TraceFuncExit();
}
//
// Init( )
//
HRESULT
THISCLASS::Init( )
{
TraceClsFunc( "Init( )\n" );
HRESULT hr;
// IUnknown stuff
BEGIN_QITABLE_IMP( CNewComputerExtensions, IDsAdminNewObjExt );
QITABLE_IMP( IDsAdminNewObjExt );
END_QITABLE_IMP( CNewComputerExtensions );
Assert( _cRef == 0);
AddRef( );
hr = CheckClipboardFormats( );
Assert( !_padsContainerObj );
Assert( !_pManagedDialog );
Assert( !_pHostServerDialog );
Assert( !_pszWizTitle );
Assert( !_pszContDisplayName );
Assert( !_hIcon );
HRETURN(hr);
}
//
// Destructor
//
THISCLASS::~THISCLASS( )
{
TraceClsFunc( "~CNewComputerExtensions( )\n" );
if ( _padsContainerObj )
_padsContainerObj->Release( );
if ( _pszWizTitle )
TraceFree( _pszWizTitle );
if ( _pszContDisplayName )
TraceFree( _pszContDisplayName );
InterlockDecrement( g_cObjects );
TraceFuncExit();
}
// ************************************************************************
//
// IUnknown
//
// ************************************************************************
//
// QueryInterface()
//
STDMETHODIMP
THISCLASS::QueryInterface(
REFIID riid,
LPVOID *ppv )
{
TraceClsFunc( "" );
HRESULT hr = ::QueryInterface( this, _QITable, riid, ppv );
QIRETURN( hr, riid );
}
//
// AddRef()
//
STDMETHODIMP_(ULONG)
THISCLASS::AddRef( void )
{
TraceClsFunc( "[IUnknown] AddRef( )\n" );
InterlockIncrement( _cRef );
RETURN(_cRef);
}
//
// Release()
//
STDMETHODIMP_(ULONG)
THISCLASS::Release( void )
{
TraceClsFunc( "[IUnknown] Release( )\n" );
InterlockDecrement( _cRef );
if ( _cRef )
RETURN(_cRef);
TraceDo( delete this );
RETURN(0);
}
// ************************************************************************
//
// IDsAdminNewObjExt
//
// ************************************************************************
//
// Initialize( )
//
STDMETHODIMP
THISCLASS::Initialize(IADsContainer* pADsContainerObj,
IADs* pADsCopySource,
LPCWSTR lpszClassName,
IDsAdminNewObj* pDsAdminNewObj,
LPDSA_NEWOBJ_DISPINFO pDispInfo)
{
TraceClsFunc( "[IDsAdminNewObjExt] Initialize(" );
TraceMsg( TF_FUNC, " pADsContainerObj = 0x%08x, lpszClassName = '%s', pDispInfo = 0x%08x )\n",
pADsContainerObj, lpszClassName, pDispInfo );
UNREFERENCED_PARAMETER(pADsCopySource);
if ( !pADsContainerObj || !pDispInfo || !lpszClassName ) {
HRETURN(E_POINTER);
}
if ( pDispInfo->dwSize != sizeof(*pDispInfo) ) {
HRETURN(E_INVALIDARG);
}
if ( _wcsicmp( lpszClassName, COMPUTER_CLASS_NAME ) !=0 )
HRETURN(E_INVALIDARG);
HRESULT hr = S_OK;
_padsContainerObj = pADsContainerObj;
_padsContainerObj->AddRef( );
// deep copy DSA_NEWOBJ_DISPINFO
_pszWizTitle = (LPWSTR) TraceStrDup( pDispInfo->lpszWizTitle );
_pszContDisplayName = (LPWSTR) TraceStrDup( pDispInfo->lpszContDisplayName );
_hIcon = pDispInfo->hObjClassIcon;
if (!_pszWizTitle || !_pszContDisplayName) {
hr = E_OUTOFMEMORY;
}
HRETURN(hr);
}
//
// AddPages( )
//
STDMETHODIMP
THISCLASS::AddPages(
LPFNADDPROPSHEETPAGE lpfnAddPage,
LPARAM lParam)
{
TraceClsFunc( "[IDsAdminNewObjExt] AddPages(" );
TraceMsg( TF_FUNC, " lpfnAddPage = 0x%08x, lParam = 0x%08x )\n", lpfnAddPage, lParam );
HRESULT hr;
hr = THR( ::AddPagesEx( (ITab**)&_pManagedDialog,
CManagedPage_CreateInstance,
lpfnAddPage,
lParam,
(LPUNKNOWN) NULL ) );
if (FAILED( hr ))
goto Error;
_pManagedDialog->_pNewComputerExtension = this;
_pManagedDialog->AllowActivation( &_fActivatePages );
hr = THR( ::AddPagesEx( (ITab**)&_pHostServerDialog,
CHostServerPage_CreateInstance,
lpfnAddPage,
lParam,
(LPUNKNOWN) NULL ) );
if (FAILED( hr ))
goto Error;
_pHostServerDialog->_pNewComputerExtension = this;
_pHostServerDialog->AllowActivation( &_fActivatePages );
Error:
HRETURN(hr);
}
//
// SetObject( )
//
STDMETHODIMP
THISCLASS::SetObject(
IADs* pADsObj)
{
TraceClsFunc( "[IDsAdminNewObjExt] SetObject(" );
TraceMsg( TF_FUNC, " pADsObj = 0x%08x )\n", pADsObj );
if ( !pADsObj )
HRETURN(E_POINTER);
HRESULT hr = S_OK;
_pads = pADsObj;
_pads->AddRef( );
HRETURN(hr);
}
//
// WriteData( )
//
STDMETHODIMP
THISCLASS::WriteData(
HWND hWnd,
ULONG uContext)
{
TraceClsFunc( "[IDsAdminNewObjExt] WriteData(" );
TraceMsg( TF_FUNC, " hWnd = 0x%08x, uContext = %d )\n", hWnd, uContext );
HRESULT hr = S_OK;
LPWSTR pszGuid = NULL;
LPWSTR pszServer = NULL;
LPCOMPUTER lpc = NULL;
//
// we should set our data during PRECOMMIT, so that the data
// get's set during the initial SetCommit(). This way we never have
// to actually commit the data ourselves.
//
if ( uContext != DSA_NEWOBJ_CTX_PRECOMMIT ) {
goto Cleanup;
}
lpc = (LPCOMPUTER) CreateIntelliMirrorClientComputer( _pads );
if ( !lpc )
goto Error;
hr = THR( _pManagedDialog->QueryInformation( NETBOOTGUID, &pszGuid ) );
if (FAILED( hr )) {
goto Error;
}
if ( pszGuid && pszGuid[0] ) {
hr = THR( lpc->SetGUID( pszGuid ) );
if (FAILED( hr ))
goto Error;
}
hr = THR( _pHostServerDialog->QueryInformation( NETBOOTSERVER, &pszServer ) );
if (FAILED( hr ))
goto Error;
if ( pszServer && pszServer[0] ) {
hr = THR( lpc->SetServerName( pszServer ) );
if (FAILED( hr ))
goto Error;
}
Assert( hr == S_OK );
Cleanup:
if ( pszGuid ){
TraceFree( pszGuid );
}
if ( pszServer ){
TraceFree( pszServer );
}
if ( lpc ) {
lpc->Release( );
}
HRETURN(hr);
Error:
MessageBoxFromHResult( NULL, IDS_ERROR_WRITINGTOCOMPUTERACCOUNT, hr );
goto Cleanup;
}
//
// OnError( )
//
STDMETHODIMP
THISCLASS::OnError(
HWND hWnd,
HRESULT hr,
ULONG uContext)
{
TraceClsFunc( "[IDsAdminNewObjExt] OnError(" );
TraceMsg( TF_FUNC, " hWnd = 0x%08x, uContext = %d )\n", hWnd, uContext );
HRESULT hrRet = E_NOTIMPL;
HRETURN(hrRet);
}
//
// GetSummaryInfo( )
//
STDMETHODIMP
THISCLASS::GetSummaryInfo(
BSTR* pBstrText)
{
TraceClsFunc( "[IDsAdminNewObjExt] GetSummaryInfo( ... )\n" );
if ( !pBstrText )
HRETURN(E_POINTER);
HRESULT hr;
DWORD dw;
WCHAR szManagedPC[ 256 ];
LPWSTR pszGuid = NULL;
LPWSTR pszServer = NULL;
LPWSTR pszOut = NULL;
*pBstrText = NULL;
hr = _pManagedDialog->QueryInformation( L"Guid", &pszGuid );
if (FAILED(hr) ||pszGuid == NULL) {
goto Cleanup;
}
dw = LoadString( g_hInstance, IDS_MANAGED_PC, szManagedPC, ARRAYSIZE(szManagedPC) );
Assert( dw );
if (!dw) {
hr = E_FAIL;
goto Cleanup;
}
hr = THR( _pHostServerDialog->QueryInformation( L"Server", &pszServer ) );
if ( FAILED(hr) ) {
goto Cleanup;
}
// Make a buffer
dw += wcslen( pszGuid ) + 1;
if ( pszServer ) {
dw += wcslen( pszServer ) + 1;
}
if (!(pszOut = (LPWSTR) TraceAllocString( LMEM_FIXED, dw )) ||
_snwprintf(
pszOut,
dw,
szManagedPC,
pszGuid,
pszServer) < 0 ) {
hr = E_OUTOFMEMORY;
goto Cleanup;
}
*pBstrText = SysAllocString( pszOut );
if ( !*pBstrText ) {
hr = E_OUTOFMEMORY;
goto Cleanup;
}
hr = S_OK;
Cleanup:
if ( pszOut )
TraceFree( pszOut );
if ( pszServer )
TraceFree( pszServer );
if ( pszGuid )
TraceFree( pszGuid );
HRETURN(hr);
}