|
|
//Copyright (c) 1998 - 1999 Microsoft Corporation
// Compdata.cpp : Implementation of CCompdata
#include "stdafx.h"
#include <ntverp.h>
#include "tscc.h"
#include "dataobj.h"
#include "Compdata.h"
#include "comp.h"
#include <regapi.h>
#include "cfgbkend_i.c"
void ErrMessage( HWND hwndOwner , INT_PTR iResourceID );
extern void xxxErrMessage( HWND hwnd , INT_PTR nResMessageId , INT_PTR nResTitleId , UINT nFlags );
extern void TscAccessDeniedMsg( HWND hwnd );
extern void TscGeneralErrMsg( HWND hwnd );
void InitWarningThread( PVOID pvParam );
extern "C" BOOL IsWhistlerAdvanceServer();
BOOL g_bAppSrvMode = FALSE;
#ifdef DBG
bool g_fDebug = false;
#endif
//extern "C" BOOL RegisterCheckListWndClass( void );
/////////////////////////////////////////////////////////////////////////////
// CCompdata
//----------------------------------------------------------------------------------------------------------
CCompdata::CCompdata( ) { m_pConsole = NULL;
m_pConsoleNameSpace = NULL;
m_pCfgcomp = NULL;
m_pMainRoot[ 0 ] = NULL;
m_pMainRoot[ 1 ] = NULL;
}
//----------------------------------------------------------------------------------------------------------
// NDMGR is asking for us to return a view of our doc ( MFC talk )
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::CreateComponent( LPCOMPONENT * ppComponent) { *ppComponent = ( LPCOMPONENT )new CComp( this );
if( *ppComponent == NULL ) { return E_OUTOFMEMORY; }
return S_OK; }
//----------------------------------------------------------------------------------------------------------
// Obtain interfaces used by for the scope pane
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Initialize( LPUNKNOWN pUnk ) { HRESULT hr;
#ifdef DBG
HKEY hKey;
LONG lStatus;
// To control debug spewage add/remove this regkey
lStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE , L"Software\\Microsoft\\TSCC\\Debug", 0, KEY_READ, &hKey );
if( lStatus == ERROR_SUCCESS ) { g_fDebug = true;
RegCloseKey( hKey ); }
#endif
hr = pUnk->QueryInterface( IID_IConsole , ( LPVOID *)&m_pConsole );
if( FAILED( hr ) ) { return hr; }
hr = pUnk->QueryInterface( IID_IConsoleNameSpace , ( LPVOID * )&m_pConsoleNameSpace );
if( FAILED( hr ) ) { return hr; } hr = CoCreateInstance( CLSID_CfgComp , NULL , CLSCTX_INPROC_SERVER , IID_ICfgComp , ( LPVOID *)&m_pCfgcomp );
if( FAILED( hr ) ) { return hr; }
hr = m_pCfgcomp->Initialize( );
if( FAILED( hr ) ) { return hr; }
// RegisterCheckListWndClass( );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_MAINFOLDERNAME , m_tchMainFolderName , SIZE_OF_BUFFER( m_tchMainFolderName ) ) );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_SETTINGSFOLDER , m_tchSettingsFolderName , SIZE_OF_BUFFER( m_tchSettingsFolderName ) ) );
hr = BuildSettingsNodes( );
if( FAILED( hr ) ) { return hr; } hr = BuildResultNodes( ); return hr; }
//----------------------------------------------------------------------------------------------------------
// Dispatch to notification handlers
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Notify( LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param) { HRESULT hr = NOERROR;
switch( event ) { case MMCN_RENAME:
ODS( L"IComponentdata -- MMCN_RENAME\n");
break;
case MMCN_EXPAND:
ODS( L"IComponentdata -- MMCN_EXPAND\n" );
ExpandScopeTree( lpDataObject , ( BOOL ) arg , ( HSCOPEITEM )param );
break;
case MMCN_DELETE:
ODS( L"IComponentdata -- MMCN_DELETE\n" ); break;
case MMCN_PROPERTY_CHANGE:
ODS( L"IComponentdata -- MMCN_PROPERTY_CHANGE\n" );
break;
default: ODS( L"CCompdata::Notify - - event not defined!\n" ); hr = E_NOTIMPL; }
return hr; }
//----------------------------------------------------------------------------------------------------------
// Prepareing for parent entry
BOOL CCompdata::ExpandScopeTree( LPDATAOBJECT pRoot , BOOL bExpand , HSCOPEITEM hConsole ) { SCOPEDATAITEM sdi;
if( !bExpand ) { return FALSE; }
CBaseNode *pNode = dynamic_cast< CBaseNode *>( pRoot );
if( pNode == NULL ) { return FALSE; }
if( pNode->GetNodeType( ) != 0 ) // ROOT_NODE add subscope items
{ return FALSE; }
// make sure we're not re-adding
for( int i = 0 ; i < 2 ; i++ ) { if( m_pMainRoot[ i ] != NULL ) { return TRUE; } }
for( i = 0 ; i < 2 ; i++ ) { m_pMainRoot[ i ] = ( CBaseNode * )new CBaseNode; if( m_pMainRoot[ i ] == NULL ) { ODS( L"TSCC: Scope node failed allocation\n" );
return FALSE; }
m_pMainRoot[ i ]->SetNodeType( i + MAIN_NODE );
//m_pMainRoot[ i ]->AddRef( );
ZeroMemory( &sdi , sizeof( SCOPEDATAITEM ) );
sdi.mask = SDI_STR | SDI_PARAM | SDI_PARENT; sdi.displayname = MMC_CALLBACK;
sdi.relativeID = hConsole;
sdi.lParam = (LPARAM)m_pMainRoot[ i ];
if( FAILED( m_pConsoleNameSpace->InsertItem( &sdi ) ) ) { //sdi.ID;
return FALSE; } }
return TRUE; }
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::CompareObjects( LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB) { if( lpDataObjectA == lpDataObjectB ) { return S_OK; }
return E_FAIL; }
//----------------------------------------------------------------------------------------------------------
// Not yet finished
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetDisplayInfo( LPSCOPEDATAITEM pItem) { CBaseNode *pNode = ( CBaseNode * )pItem->lParam;
if( pItem->mask & SDI_STR ) { if( pNode->GetNodeType( ) == MAIN_NODE ) { //pItem->displayname = ( LPOLESTR )L"Connections";
pItem->displayname = ( LPOLESTR )m_tchMainFolderName; } else if( pNode->GetNodeType( ) == SETTINGS_NODE ) { // pItem->displayname = ( LPOLESTR )L"Server Settings";
pItem->displayname = ( LPOLESTR )m_tchSettingsFolderName; } } return S_OK; }
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::QueryDataObject( MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT * ppDataObject) { *ppDataObject = NULL;
switch( type ) {
case CCT_SCOPE: case CCT_SNAPIN_MANAGER:
if( cookie == 0 ) { *ppDataObject = ( LPDATAOBJECT )new CBaseNode( ); } else { *ppDataObject = ( LPDATAOBJECT )cookie;
// this is the only scopenode keep this one alive
( ( LPDATAOBJECT )*ppDataObject)->AddRef( ); }
break;
case CCT_RESULT: // here we can cast from cookie for each node
break;
case CCT_UNINITIALIZED:
// ok thanks
break;
} return ( *ppDataObject == NULL ) ? E_FAIL : S_OK ; }
//----------------------------------------------------------------------------------------------------------
// Free all used interfaces
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Destroy( ) { if( m_pConsole != NULL ) { m_pConsole->Release( ); }
if( m_pConsoleNameSpace != NULL ) { m_pConsoleNameSpace->Release( ); }
if( m_pMainRoot[ 0 ] != NULL ) { DWORD dwRef = m_pMainRoot[ 0 ]->Release( ); DBGMSG( TEXT("Ref count for main node ended in %d\n" ) , dwRef );
}
if( m_pMainRoot[ 1 ] != NULL ) { DWORD dwRef = m_pMainRoot[ 1 ]->Release( ); DBGMSG( TEXT("Ref count for settings node ended in %d\n" ) , dwRef ); }
int items = m_rnNodes.GetSize( );
for( int idx = 0 ; idx < items; ++idx ) { CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode != NULL ) { pNode->FreeServer( );
pNode->Release( ); } }
m_rnNodes.DeleteArray( );
items = m_rgsNodes.GetSize( );
for( idx = 0 ; idx < items; idx++ ) { CSettingNode *pNode = *m_rgsNodes.GetAt( idx );
if( pNode != NULL ) { delete pNode; } }
m_rgsNodes.DeleteArray( ); if( m_pCfgcomp != NULL ) { m_pCfgcomp->Release( ); }
return S_OK; }
//----------------------------------------------------------------------------------------------------------
// Places our menu items as spec'd
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::AddMenuItems( LPDATAOBJECT pNode , LPCONTEXTMENUCALLBACK pCtxMenu , PLONG plInsertion ) { TCHAR tchBuffer1[ 128 ];
TCHAR tchBuffer2[ 128 ];
ASSERT( pNode != NULL );
ASSERT( pCtxMenu != NULL );
ASSERT( plInsertion != NULL );
if( pNode != m_pMainRoot[ 0 ] ) { return S_FALSE; }
CONTEXTMENUITEM ctxmi;
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_CTXM_NAME , tchBuffer1 , SIZE_OF_BUFFER( tchBuffer1 ) ) );
ctxmi.strName = tchBuffer1;
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_CTXM_STATUS , tchBuffer2 , SIZE_OF_BUFFER( tchBuffer2 ) ) );
ctxmi.strStatusBarText = tchBuffer2;
ctxmi.lCommandID = IDM_CREATECON;
ctxmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP ;
ctxmi.fFlags = 0;
ctxmi.fSpecialFlags = 0;
*plInsertion |= CCM_INSERTIONALLOWED_TOP;
//VERIFY_S( S_OK , pCtxMenu->AddItem( &ctxmi ) );
//ctxmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_NEW;
return pCtxMenu->AddItem( &ctxmi );
}
//----------------------------------------------------------------------------------------------------------
// This is where the wizard will kick off
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Command( LONG lCommand , LPDATAOBJECT pNode ) { HWND hMain;
if( pNode != m_pMainRoot[ 0 ] ) { return S_FALSE; }
if( lCommand == IDM_CREATECON ) { // insure that no other connections are being edited
for( int i = 0 ; i < m_rnNodes.GetSize( ); i++ ) { CResultNode *pNd = *m_rnNodes.GetAt( i );
if( pNd != NULL ) { if( pNd->m_bEditMode ) { if( FAILED( m_pConsole->GetMainWindow( &hMain ) ) ) { hMain = NULL; } xxxErrMessage( hMain , IDS_ERR_INEDITMODE , IDS_WARN_TITLE , MB_OK | MB_ICONWARNING ); return E_FAIL; } } }
// check for admin rights.
BOOL bReadOnly;
m_pCfgcomp->IsSessionReadOnly( &bReadOnly );
if( bReadOnly ) { if( FAILED( m_pConsole->GetMainWindow( &hMain ) ) ) { hMain = NULL; } // report access denied
TscAccessDeniedMsg( hMain );
return S_FALSE; }
if( !InitDialogObjects( ) ) { return E_FAIL; }
BuildWizardPath( );
FreeDialogObjects( ); }
m_pConsole->UpdateAllViews( ( LPDATAOBJECT )m_rnNodes.GetAt( 0 ) , 0 , 0 );
return S_OK; }
//----------------------------------------------------------------------------------------------------------
// Try to allocate
BOOL CCompdata::InitDialogObjects( ) { try { m_pDlg[ 0 ] = ( CDialogWizBase * )new CWelcome( );
m_pDlg[ 1 ] = ( CDialogWizBase * )new CConType( this );
m_pDlg[ 2 ] = ( CDialogWizBase * )new CSecurity( this );
// m_pDlg[ 3 ] = ( CDialogWizBase * )new CTimeout( );
// m_pDlg[ 4 ] = ( CDialogWizBase * )new CAutoLogon( );
// m_pDlg[ 5 ] = ( CDialogWizBase * )new CInitProg( );
m_pDlg[ 3 ] = ( CDialogWizBase * )new CRemotectrl( );
// m_pDlg[ 7 ] = ( CDialogWizBase * )new CWallPaper( );
m_pDlg[ 4 ] = ( CDialogWizBase * )new CConProp( this );
m_pDlg[ 5 ] = ( CDialogWizBase * )new CLan( this );
m_pDlg[ 6 ] = ( CDialogWizBase * )new CAsync( this );
m_pDlg[ 7 ] = ( CDialogWizBase * )new CFin( this ); } catch(...) { return FALSE; }
return TRUE; }
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::BuildWizardPath( ) { // build up ms propsheetheader
PROPSHEETPAGE psp;
PROPSHEETHEADER psh;
for( int idx = 0 ; idx < MS_DIALOG_COUNT ; ++idx ) { if( m_pDlg[ idx ] != NULL ) { m_pDlg[ idx ]->GetPropertySheetPage( psp );
m_hPages.Insert( CreatePropertySheetPage( &psp ) ); } }
// obtain clsid of IExtendwizard object
// forward IWizardProvider to object
// add last page CFin
ZeroMemory( &psh , sizeof( PROPSHEETHEADER ) );
psh.dwSize = sizeof( PROPSHEETHEADER );
psh.hInstance = _Module.GetModuleInstance( );
if( m_pConsole != NULL ) { m_pConsole->GetMainWindow( &psh.hwndParent ); }
//psh.pszCaption = MAKEINTRESOURCE( IDS_WIZARDTITLE ); //NULL
psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER ;
psh.pszbmWatermark = MAKEINTRESOURCE( IDB_TSCC_LOGO );
psh.pszbmHeader = MAKEINTRESOURCE( IDB_TSCC_ICON );
psh.phpage = m_hPages.ExposeArray( );
psh.nStartPage = 0;
psh.nPages = m_hPages.GetSize( );
PropertySheet( &psh ); return TRUE; }
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::FreeDialogObjects( ) { for( int idx = 0 ; idx < MS_DIALOG_COUNT ; ++idx ) { if( m_pDlg[ idx ] != NULL ) { delete m_pDlg[ idx ]; } }
m_hPages.DeleteArray( );
return TRUE; }
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::IsConnectionFolder( LPDATAOBJECT pObject ) { if( SUCCEEDED( CompareObjects( pObject , m_pMainRoot[ 0 ] ) ) ) { return TRUE; } return FALSE; }
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::IsSettingsFolder( LPDATAOBJECT pObject ) { if( SUCCEEDED( CompareObjects( pObject , m_pMainRoot[ 1 ] ) ) ) { return TRUE; }
return FALSE; }
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::UpdateAllResultNodes( ) { HWND hMain; if( FAILED( m_pConsole->GetMainWindow( &hMain ) ) ) { hMain = NULL; }
int items = m_rnNodes.GetSize( );
for( int idx = 0 ; idx < items; ++idx ) { CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode != NULL ) { if( pNode->m_bEditMode ) { // ErrMessage( NULL , IDS_ERR_INEDITMODE );
xxxErrMessage( hMain , IDS_ERR_INEDITMODE , IDS_WARN_TITLE , MB_OK | MB_ICONWARNING );
return E_FAIL; } } }
HRESULT hr = m_pCfgcomp->Refresh( ); if( FAILED( hr ) ) { ODS( L"m_pCfgcomp->Refresh - failed\n" );
if( hr == E_ACCESSDENIED ) { TscAccessDeniedMsg( hMain ); } else { TscGeneralErrMsg( hMain ); }
return hr; }
for( idx = 0 ; idx < items; ++idx ) { CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode != NULL ) { pNode->FreeServer( );
pNode->Release( ); } }
m_rnNodes.DeleteArray( ); return BuildResultNodes( ); }
//----------------------------------------------------------------------------------------------------------
BOOL IsAppServerMode() { OSVERSIONINFOEX osVersionInfo; DWORDLONG dwlConditionMask = 0; BOOL fSuiteTerminal = FALSE; BOOL fSuiteSingleUserTS = FALSE;
ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX)); osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL;
VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND ); fSuiteTerminal = VerifyVersionInfo(&osVersionInfo, VER_SUITENAME, dwlConditionMask);
osVersionInfo.wSuiteMask = VER_SUITE_SINGLEUSERTS; fSuiteSingleUserTS = VerifyVersionInfo(&osVersionInfo, VER_SUITENAME, dwlConditionMask);
if( (FALSE == fSuiteSingleUserTS) && (TRUE == fSuiteTerminal) ) { return TRUE; } else { return FALSE; } }
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::BuildSettingsNodes( ) {
// Resource ID for item move to snodes.h
//INT rgResid[] = {
// IDS_DELTEMPONEXIT,
// IDS_USETEMPDIR,
/* IDS_DEFCONSEC, */ // IDS_LICENSING,
// IDS_ADS_ATTR,
// IDS_USERPERM,
// IDS_SINGLE_SESSION,
// -1};
DWORD dwNumItems = sizeof( RGRESID ) / sizeof( RGRESID[0] );
BOOL bAdvanceServer = IsWhistlerAdvanceServer();
BOOL bAppSrvMode = FALSE;
TCHAR tchbuffer[ 256 ];
TCHAR tchKey[ ] = L"Software\\Microsoft\\TSCC\\CLSID";
HKEY hKey; DWORD dwStatus; TCHAR szSubKeyName[ 256 ];
DWORD dwSubKeyNameLength; CLSID clsidOther;
INT nObjectId = 0;
ISettingsComp *pSettings = NULL; IExtendServerSettings *pExtendServerSettings = NULL;
if( m_pCfgcomp == NULL || FAILED( m_pCfgcomp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ) ) { return E_FAIL; }
ASSERT( sizeof( RGRESID ) / sizeof( RGRESID[0] ) == sizeof(VALIDOBJECTONSERVER)/sizeof(VALIDOBJECTONSERVER[0]) ); ASSERT( sizeof(VALIDOBJECTONSERVER)/sizeof(VALIDOBJECTONSERVER[0]) == sizeof(VALIDOBJECTONADS)/sizeof(VALIDOBJECTONADS[0]) );
for( DWORD idx = 0; idx < dwNumItems ; idx++ ) { // error checking, do go over array boundary
if( !bAdvanceServer ) { if( idx > sizeof(VALIDOBJECTONSERVER)/sizeof(VALIDOBJECTONSERVER[0]) ) { ASSERT(FALSE); continue; } } else { if( idx > sizeof(VALIDOBJECTONADS)/sizeof(VALIDOBJECTONADS[0]) ) { ASSERT(FALSE); continue; } }
if( ( bAdvanceServer && VALIDOBJECTONADS[idx] ) || (!bAdvanceServer && VALIDOBJECTONSERVER[idx] ) ) {
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , RGRESID[ idx ] , tchbuffer , SIZE_OF_BUFFER( tchbuffer ) ) );
// ASSERT( idx < MAX_SETTINGS );
CSettingNode *pSet = ( CSettingNode * )new CSettingNode( ); if( pSet != NULL ) { pSet->SetObjectId( nObjectId );
pSet->SetInterface( ( LPUNKNOWN )pSettings );
if( !pSet->SetAttributeName( tchbuffer ) ) { ODS( L"TSCC: BuildSettingsNodes -- SetItemName failed\n" ); }
m_rgsNodes.Insert( pSet );
nObjectId++; } } else { nObjectId++; } }
pSettings->Release( );
// Find out how many extension nodes are out there.
// First we need to get the specific tssd component supplied for session
// directory services, but only on application servers.
bAppSrvMode = IsAppServerMode(); if( bAppSrvMode && ( dwStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE , REG_CONTROL_TSERVER , 0, KEY_READ, &hKey ) ) == ERROR_SUCCESS ) { DBGMSG( L"RegOpenKeyEx tssd ok at %s\n" , REG_CONTROL_TSERVER );
dwSubKeyNameLength = sizeof( szSubKeyName );
dwStatus = RegQueryValueEx( hKey , REG_TS_SESSDIRCLSID , NULL , NULL , ( LPBYTE )szSubKeyName , &dwSubKeyNameLength );
DBGMSG( L"tssd RegQueryValueEx for %s\n" , REG_TS_SESSDIRCLSID );
DBGMSG( L"tssd RegQueryValueEx ret 0x%x\n" , dwStatus );
if( dwStatus == ERROR_SUCCESS ) { DBGMSG( L"CCompdata!BuildSettingsNode key name %s\n" , szSubKeyName );
if( SUCCEEDED( CLSIDFromString( szSubKeyName , &clsidOther ) ) ) { if( SUCCEEDED( CoCreateInstance( clsidOther , NULL , CLSCTX_INPROC_SERVER , IID_IExtendServerSettings , ( LPVOID *) &pExtendServerSettings ) ) ) { if( pExtendServerSettings != NULL ) { CSettingNode *pSet = ( CSettingNode * )new CSettingNode( ); if( pSet != NULL ) { pSet->SetObjectId( nObjectId );
pSet->SetInterface( ( LPUNKNOWN )pExtendServerSettings );
pExtendServerSettings->GetAttributeName( tchbuffer );
if( !pSet->SetAttributeName( tchbuffer ) ) { ODS( L"TSCC: BuildSettingsNodes -- SetItemName failed\n" ); }
m_rgsNodes.Insert( pSet );
nObjectId++; } } pExtendServerSettings->Release(); } } }
RegCloseKey( hKey ); }
// look for other custom components at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TSCC\CLSID
idx = 0; if( ( dwStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE , tchKey , 0, KEY_READ, &hKey ) ) == ERROR_SUCCESS ) { while( dwStatus == ERROR_SUCCESS ) { dwSubKeyNameLength = SIZE_OF_BUFFER( szSubKeyName );
dwStatus = RegEnumKeyEx( hKey , ( DWORD )idx, szSubKeyName , &dwSubKeyNameLength, NULL , NULL , NULL , NULL ); if( dwStatus != ERROR_SUCCESS ) { DBGMSG( L"RegEnumKeyEx failed with 0x%x\n" , dwStatus );
break; } DBGMSG( L"CCompdata!BuildSettingsNode key name %s\n" , szSubKeyName );
idx++; if( FAILED( CLSIDFromString( szSubKeyName , &clsidOther ) ) ) { continue; } if( SUCCEEDED( CoCreateInstance( clsidOther , NULL , CLSCTX_INPROC_SERVER , IID_IExtendServerSettings , ( LPVOID *) &pExtendServerSettings ) ) ) {
if( pExtendServerSettings != NULL ) { CSettingNode *pSet = ( CSettingNode * )new CSettingNode( ); if( pSet != NULL ) { pSet->SetObjectId( nObjectId );
pSet->SetInterface( ( LPUNKNOWN )pExtendServerSettings );
pExtendServerSettings->GetAttributeName( tchbuffer );
if( !pSet->SetAttributeName( tchbuffer ) ) { ODS( L"TSCC: BuildSettingsNodes -- SetItemName failed\n" ); }
m_rgsNodes.Insert( pSet );
nObjectId++; } }
pExtendServerSettings->Release(); } } // while
RegCloseKey( hKey ); } // if
return S_OK; }
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::BuildResultNodes( ) { CResultNode *pResultNode; WS *pWs;
ULONG ulitems = 0; ULONG cbSize = 0;
ULONG cItems = 0;
BOOL bValid = TRUE; PGUIDTBL pGuidtbl = NULL;
TCHAR szOldPdName[ MAX_PATH ];
HRESULT hr = E_FAIL;
if( SUCCEEDED( m_pCfgcomp->GetWinstationList( &ulitems , &cbSize , &pWs ) ) ) { // Get valid lanids
for( ULONG i = 0 ; i < ulitems ; ++i ) { // do not list console
if( lstrcmpi( pWs[ i ].Name , L"console" ) == 0 ) { continue; }
pResultNode = new CResultNode( );
if( pResultNode == NULL ) { return E_OUTOFMEMORY; }
pResultNode->SetConName( pWs[ i ].Name , lstrlen( pWs[ i ].Name ) );
pResultNode->SetTTName( pWs[ i ].pdName , lstrlen( pWs[ i ].pdName ) );
pResultNode->SetTypeName( pWs[ i ].wdName , lstrlen( pWs[ i ].wdName ) );
pResultNode->SetComment( pWs[ i ].Comment , lstrlen( pWs[ i ].Comment ) );
pResultNode->EnableConnection( pWs[ i ].fEnableWinstation );
pResultNode->SetImageIdx( ( pWs[ i ].fEnableWinstation ? 1 : 2 ) );
pResultNode->SetServer( m_pCfgcomp );
if( lstrcmpi( pWs[i].pdName , szOldPdName ) != 0 ) { if( pGuidtbl != NULL ) { CoTaskMemFree( pGuidtbl );
pGuidtbl = NULL; }
hr = m_pCfgcomp->GetLanAdapterList2( pWs[ i ].pdName , &cItems , &pGuidtbl );
lstrcpy( szOldPdName , pWs[i].pdName ); }
if( pGuidtbl != NULL && SUCCEEDED( hr ) ) { BOOL bFoundaMatch = FALSE;
for( int k = 0; k < ( int )cItems ; ++k ) { if( ( pGuidtbl[ k ].dwStatus == ERROR_SUCCESS ) && ( pGuidtbl[ k ].dwLana == pWs[ i ].LanAdapter ) ) { bFoundaMatch = TRUE;
break; } }
if( !bFoundaMatch ) { DWORD dwStatus;
ODS( L"TSCC:BuildResultNodes we found an invalid lanaid\n" );
pWs[ i ].fEnableWinstation = 0;
m_pCfgcomp->UpDateWS( pWs , UPDATE_ENABLEWINSTATION , &dwStatus, TRUE );
pResultNode->EnableConnection( 0 ); pResultNode->SetImageIdx( 2 ); }
if( bValid ) // once set to false we know we have a winstation that has an invalid lanaid
{ bValid = bFoundaMatch; }
} if( m_rnNodes.Insert( pResultNode ) == 0 ) { return E_OUTOFMEMORY; } }
if( pGuidtbl != NULL ) { CoTaskMemFree( pGuidtbl ); }
CoTaskMemFree( pWs );
if( !bValid ) { HWND hwnd;
BOOL bReadOnly = FALSE;
m_pCfgcomp->IsSessionReadOnly( &bReadOnly );
if( bReadOnly ) { return S_OK; }
if( m_pConsole != NULL ) { m_pConsole->GetMainWindow( &hwnd );
DWORD dwTid;
HANDLE hThread = CreateThread( NULL , 0 , ( LPTHREAD_START_ROUTINE )InitWarningThread, hwnd , 0 , &dwTid );
CloseHandle( hThread ); } } return S_OK; }
return E_FAIL; }
//----------------------------------------------------------------------------------------------------------
//BOOL CCompdata::GetResultNode( int idx , CResultNode** pRn )
CResultNode * CCompdata::GetResultNode( int idx ) { return *m_rnNodes.GetAt( idx ); /*
if( *pRn == NULL ) { return FALSE; }
return TRUE; */ }
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::InsertSettingItems( LPRESULTDATA pResultData ) { RESULTDATAITEM rdi;
HRESULT hr; CSettingNode *pSettingNode = NULL;
ASSERT( pResultData != NULL );
if( pResultData == NULL ) { return E_INVALIDARG; }
ZeroMemory( &rdi , sizeof(RESULTDATAITEM) );
rdi.mask = RDI_STR | RDI_PARAM | RDI_IMAGE; rdi.str = MMC_CALLBACK;
if (NULL != m_pCfgcomp) { DWORD nVal, dwStatus; ISettingsComp* pISettingComp = NULL;
hr = m_pCfgcomp->QueryInterface( IID_ISettingsComp, (void **) &pISettingComp );
if (SUCCEEDED(hr)) { hr = pISettingComp->GetTermSrvMode( &nVal, &dwStatus ); if (SUCCEEDED(hr)) { g_bAppSrvMode = nVal; }
pISettingComp->Release(); } }
int nMax = m_rgsNodes.GetSize();
for( int idx = 0 ; idx < nMax ; ++idx ) { // init object -- if it fails skip over it
pSettingNode = *m_rgsNodes.GetAt( idx );
if( pSettingNode != NULL ) { if( FAILED( pSettingNode->GetNodeStatus( ) ) ) { continue; }
/*
if( m_rgsNodes[ idx ].GetObjectId() == USERSECURITY ) { // check to see if we're remote admin mode
// if so skip over usersecurity
if( !bDisplayUserPerm ) { continue; } } */ rdi.itemID = 1; // unique from connection items
rdi.lParam = ( LPARAM )pSettingNode;
rdi.nImage = pSettingNode->GetImageIdx( );
hr = pResultData->InsertItem( &rdi );
if( FAILED( hr ) ) { return hr; } } }
return S_OK; }
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::InsertFolderItems( LPRESULTDATA pResultData ) { RESULTDATAITEM rdi;
HRESULT hr;
// TCHAR tchBuffer[80];
ASSERT( pResultData != NULL );
if( pResultData == NULL ) { return E_INVALIDARG; }
ZeroMemory( &rdi , sizeof(RESULTDATAITEM) );
rdi.mask = RDI_STR | RDI_PARAM | RDI_IMAGE; rdi.str = MMC_CALLBACK;
int items = m_rnNodes.GetSize( );
for( int idx = 0 ; idx < items ; ++idx ) { CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode == NULL ) { return E_FAIL; }
rdi.lParam = ( LPARAM )pNode;
rdi.nImage = pNode->GetImageIdx( );
hr = pResultData->InsertItem( &rdi );
if( FAILED( hr ) ) { return hr; } }
return S_OK; }
//----------------------------------------------------------------------------------------------------------
int CCompdata::GetServer( ICfgComp **ppCfgcomp ) { if( m_pCfgcomp != NULL ) { *ppCfgcomp = m_pCfgcomp;
return ( ( ICfgComp * )*ppCfgcomp )->AddRef( ); }
return 0; }
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::OnDeleteItem( LPDATAOBJECT pDo) { ICfgComp *pCfgcomp;
CResultNode *pNode = dynamic_cast< CResultNode *>( pDo );
if( pNode != NULL ) { HWND hWnd = NULL;
m_pConsole->GetMainWindow( &hWnd ); if( pNode->GetServer( &pCfgcomp ) == 0 ) { return FALSE; }
TCHAR tchWarnText[ 512 ];
TCHAR tchmsg[ 256 ];
TCHAR tchDeleteTitle[ 80 ];
LONG lCount; // check to see if anyone is connected
pCfgcomp->QueryLoggedOnCount( pNode->GetConName( ) , &lCount ); if( lCount > 0 ) { VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DELETELIVECON , tchmsg , SIZE_OF_BUFFER( tchmsg ) ) );
wsprintf( tchWarnText , tchmsg , pNode->GetConName( ) ); } else { VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DELETETEXT , tchWarnText , SIZE_OF_BUFFER( tchWarnText ) ) ); }
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DELTITLE , tchDeleteTitle , SIZE_OF_BUFFER( tchDeleteTitle ) ) );
if( MessageBox( hWnd , tchWarnText , tchDeleteTitle , MB_YESNO | MB_ICONEXCLAMATION ) == IDNO ) { return FALSE; } if( FAILED( pCfgcomp->DeleteWS( pNode->GetConName( ) ) ) ) { // WARN USER
ErrMessage( hWnd , IDS_ERR_DELFAIL );
return FALSE; } else { VERIFY_S( S_OK , pCfgcomp->ForceUpdate( ) ); } pCfgcomp->Release( ); }
BOOL bFound;
int idx = m_rnNodes.FindItem( pNode , bFound );
if( bFound ) { pNode->FreeServer( );
pNode->Release( );
m_rnNodes.DeleteItemAt( idx ); }
m_pConsole->UpdateAllViews( ( LPDATAOBJECT )m_rnNodes.GetAt( 0 ) , 0 , 0 );
return TRUE; }
//----------------------------------------------------------------------------------------------------------
// MMC Free up ppStr when it's done
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetSnapinDescription( LPOLESTR *ppStr ) { TCHAR tchDescription[ 1024 ];
int iCharCount = LoadString( _Module.GetResourceInstance( ) , IDS_DESCRIPTION , tchDescription , SIZE_OF_BUFFER( tchDescription ) );
*ppStr = ( LPOLESTR )CoTaskMemAlloc( iCharCount * sizeof( TCHAR ) + sizeof( TCHAR ) );
if( *ppStr != NULL ) { lstrcpy( *ppStr , tchDescription ); return S_OK; }
return E_OUTOFMEMORY; }
//----------------------------------------------------------------------------------------------------------
// MMC Free up ppStr when it's done
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetProvider( LPOLESTR *ppStr ) { TCHAR tchProvider[ 128 ]; int iCharCount = LoadString( _Module.GetResourceInstance( ) , IDS_PROVIDER , tchProvider , SIZE_OF_BUFFER( tchProvider ) );
*ppStr = ( LPOLESTR )CoTaskMemAlloc( iCharCount * sizeof( TCHAR ) + sizeof( TCHAR ) );
if( *ppStr != NULL ) { lstrcpy( *ppStr , tchProvider ); return S_OK; }
return E_OUTOFMEMORY; }
//----------------------------------------------------------------------------------------------------------
// MMC Free up ppStr when it's done
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetSnapinVersion( LPOLESTR *ppStr ) { char chVersion[ 32 ] = VER_PRODUCTVERSION_STR;
TCHAR tchVersion[ 32 ];
int iCharCount = MultiByteToWideChar( CP_ACP , 0 , chVersion , sizeof( chVersion ) , tchVersion , SIZE_OF_BUFFER( tchVersion ) ); *ppStr = ( LPOLESTR )CoTaskMemAlloc( ( iCharCount + 1 ) * sizeof( TCHAR ) ); if( *ppStr != NULL && iCharCount != 0 ) { lstrcpy( *ppStr , tchVersion ); return S_OK; }
return E_OUTOFMEMORY; }
//----------------------------------------------------------------------------------------------------------
// Supply an icon here for the main icon in the about box
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetSnapinImage( HICON *phIcon ) { //*phIcon = ( HICON )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDI_ICON_ABOUT ) , IMAGE_ICON , 37 ,37 , LR_DEFAULTCOLOR );
*phIcon = ( HICON )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDI_ICON_GENERAL2 ) , IMAGE_ICON , 32 ,32 , LR_DEFAULTCOLOR );
return S_OK; }
//----------------------------------------------------------------------------------------------------------
// Supply an icon here for the main icon in the about box
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetStaticFolderImage( HBITMAP *phSmallImage , HBITMAP *phSmallImageOpen , HBITMAP *phLargeImage, COLORREF *pClr ) { *phSmallImage = ( HBITMAP )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDB_BITMAP_GENSMALL ) , IMAGE_BITMAP , 16 ,16 , LR_DEFAULTCOLOR );
*phSmallImageOpen = ( HBITMAP )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDB_BITMAP_GENSMALL ) , IMAGE_BITMAP , 16 ,16 , LR_DEFAULTCOLOR );
*phLargeImage = ( HBITMAP )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDB_BITMAP_GENLARGE ) , IMAGE_BITMAP , 32 ,32 , LR_DEFAULTCOLOR );
*pClr = RGB( 255 , 0 , 255 );
//return E_NOTIMPL;
return S_OK; }
//----------------------------------------------------------------------------------------------------------
// MMC will ask for our help file
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetHelpTopic( LPOLESTR *ppszHelpFile ) { ODS( L"CCompdata::GetHelpTopic called\n" );
if( ppszHelpFile == NULL ) { return E_INVALIDARG; }
TCHAR tchHelpFile[ MAX_PATH ];
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_TSCCSNAPHELP , tchHelpFile , SIZE_OF_BUFFER( tchHelpFile ) ) ); // mmc will call CoTaskMemFree
*ppszHelpFile = ( LPOLESTR )CoTaskMemAlloc( sizeof( tchHelpFile ) );
if( *ppszHelpFile != NULL ) { if( GetSystemWindowsDirectory( *ppszHelpFile , MAX_PATH ) != 0 ) { lstrcat( *ppszHelpFile , tchHelpFile ); } else { lstrcpy( *ppszHelpFile , tchHelpFile ); }
ODS( *ppszHelpFile );
ODS( L"\n" );
return S_OK; }
return E_OUTOFMEMORY; } //----------------------------------------------------------------------------------------------------------
// Helper methods for fixing the column lengths
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::GetMaxTextLengthSetting( LPTSTR pszText , PINT pnMaxLen ) { INT nIndex = 0;
INT nCurrentMax = 0;
INT nMax;
*pnMaxLen = 0;
nMax = m_rgsNodes.GetSize( );
CSettingNode *pSettingNode;
for( int idx = 0 ; idx < nMax ; ++idx ) { pSettingNode = *m_rgsNodes.GetAt( idx );
if( pSettingNode != NULL && pSettingNode->GetAttributeName( ) != NULL ) { nCurrentMax = lstrlen( pSettingNode->GetAttributeName( ) );
if( *pnMaxLen < nCurrentMax ) { *pnMaxLen = nCurrentMax;
nIndex = idx; } } }
pSettingNode = *m_rgsNodes.GetAt( nIndex );
if (pSettingNode != NULL && pSettingNode->GetAttributeName( ) != NULL) {
lstrcpy( pszText , pSettingNode->GetAttributeName( ) ); }
return TRUE; }
//----------------------------------------------------------------------------------------------------------
// Helper methods for fixing the column lengths
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::GetMaxTextLengthAttribute( LPTSTR pszText , PINT pnMaxLen ) { INT nIndex = 0;
INT nCurrentMax = 0;
INT nMax;
*pnMaxLen = 0;
nMax = m_rgsNodes.GetSize( );
CSettingNode *pSettingNode = NULL;
for( int idx = 0 ; idx < nMax ; ++idx ) { pSettingNode = *m_rgsNodes.GetAt( idx );
if (pSettingNode != NULL && pSettingNode->GetAttributeName( ) != NULL ) {
nCurrentMax = lstrlen( pSettingNode->GetAttributeValue( ) );
DBGMSG( L"CCompdata!GetMaxTextLengthAttribute AttributeValue = %s\n", pSettingNode->GetAttributeValue( ) );
if( *pnMaxLen < nCurrentMax ) { *pnMaxLen = nCurrentMax;
nIndex = idx; } } }
pSettingNode = *m_rgsNodes.GetAt( nIndex ); if (pSettingNode != NULL) { LPTSTR pszValue = pSettingNode->GetAttributeValue( );
if(pszValue != NULL) { lstrcpy( pszText , pszValue ); } else { return FALSE; } }
return TRUE; }
void InitWarningThread( PVOID pvParam ) { HWND hwnd = ( HWND )pvParam;
TCHAR tchMessage[ 256 ];
TCHAR tchTitle[ 80 ];
Sleep( 200 );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DISABNETWORK , tchMessage , SIZE_OF_BUFFER( tchMessage ) ) );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_TSCERRTITLE , tchTitle , SIZE_OF_BUFFER( tchTitle ) ) ); MessageBox( hwnd , tchMessage , tchTitle , MB_ICONINFORMATION | MB_OK );
}
|