// maindoc.cpp : implementation of the CMainDoc class // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1995 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "schclss.h" #include "viewex.h" #include "enterdlg.h" #include "fltrdlg.h" #include "qstatus.h" #include "newobj.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif TCHAR szOpen[ MAX_PATH ]; ///////////////////////////////////////////////////////////////////////////// // CMainDoc IMPLEMENT_SERIAL(CMainDoc, CDocument, 0 /* schema number*/ ) BEGIN_MESSAGE_MAP(CMainDoc, CDocument) //{{AFX_MSG_MAP(CMainDoc) ON_COMMAND(IDM_CHANGEDATA, OnChangeData) ON_COMMAND(IDM_FILTER, OnSetFilter) ON_COMMAND(IDM_DISABLEFILTER, OnDisableFilter) ON_UPDATE_COMMAND_UI(IDM_DISABLEFILTER, OnUpdateDisablefilter) ON_COMMAND(IDM_USEGENERIC, OnUseGeneric) ON_UPDATE_COMMAND_UI(IDM_USEGENERIC, OnUpdateUseGeneric) ON_UPDATE_COMMAND_UI(IDM_USEGETEXPUTEX, OnUpdateUseGetExPutEx) ON_COMMAND(IDM_USEGETEXPUTEX, OnUseGetExPutEx) ON_COMMAND(IDM_USEPROPERTIESLIST, OnUsepropertiesList) ON_UPDATE_COMMAND_UI(IDM_USEPROPERTIESLIST, OnUpdateUsepropertiesList) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMainDoc construction/destruction //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** CMainDoc::CMainDoc() { m_pClasses = new CMapStringToOb; m_pItems = new CMapStringToOb; m_bApplyFilter = FALSE; m_dwRoot = 0L; m_bUseGeneric = TRUE; m_bUseGetEx = TRUE; //m_bUseGetEx = FALSE; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** CMainDoc::~CMainDoc() { POSITION pos; CObject* pItem; CString strItem; COleDsObject* pRoot; if( NULL != m_pClasses ) { for( pos = m_pClasses->GetStartPosition(); pos != NULL; ) { m_pClasses->GetNextAssoc( pos, strItem, pItem ); delete pItem; #ifdef _DEBUG //afxDump << strItem << "\n"; #endif } m_pClasses->RemoveAll( ); delete m_pClasses; } if( NULL != m_pItems ) { for( pos = m_pItems->GetStartPosition(); pos != NULL; ) { m_pItems->GetNextAssoc( pos, strItem, pItem ); delete pItem; /*#ifdef _DEBUG afxDump << strItem << "\n"; #endif*/ } m_pItems->RemoveAll( ); delete m_pItems; } pRoot = GetObject( &m_dwRoot ); if( pRoot ) delete pRoot; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::CreateFakeSchema( ) { CClass* pClass; CProperty* pProperty; pClass = new CClass( _T("Class"), IID_IADsClass ); pProperty = new CProperty( _T("PrimaryInterface"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("CLSID"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("OID"), _T("String") ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Abstract"), _T("Boolean") ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Auxiliary"), _T("Boolean") ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("MandatoryProperties"), _T("String"), TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("OptionalProperties"), _T("String"), TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("NamingProperties"), _T("String"), TRUE ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("DerivedFrom"), _T("String"), TRUE ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("AuxDerivedFrom"), _T("String"), TRUE ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("PossibleSuperiors"), _T("String"), TRUE ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Containment"), _T("String"), TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Container"), _T("Boolean") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("HelpFileName"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("HelpFileContext"), _T("Integer") ); pClass->AddProperty( pProperty ); m_pClasses->SetAt( _T("Class"), pClass ); // Property pClass = new CClass( _T("Property"), IID_IADsProperty ); pProperty = new CProperty( _T("OID"), _T("String") ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Syntax"), _T("String") ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("MaxRange"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("MinRange"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("MultiValued"), _T("Boolean") ); pProperty->SetMandatory( TRUE ); pClass->AddProperty( pProperty ); m_pClasses->SetAt( _T("Property"), pClass ); // Syntax pClass = new CClass( _T("Syntax"), IID_IADsSyntax ); pProperty = new CProperty( _T("OleAutoDataType"), _T("Integer") ); pClass->AddProperty( pProperty ); m_pClasses->SetAt( _T("Syntax"), pClass ); // AccessControlEntry pClass = new CClass( _T("ACE"), IID_IADsAccessControlEntry ); pProperty = new CProperty( _T("Trustee"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("AccessMask"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("AceType"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("AceFlags"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Flags"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("ObjectType"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("InheritedObjectType"), _T("String") ); pClass->AddProperty( pProperty ); m_pClasses->SetAt( _T("ACE"), pClass ); // SecurityDescriptor pClass = new CClass( _T("SecurityDescriptor"), IID_IADsSecurityDescriptor ); pProperty = new CProperty( _T("Revision"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Control"), _T("Integer") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Owner"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("OwnerDefaulted"), _T("Boolean") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("Group"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("GroupDefaulted"), _T("Boolean") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("SaclDefaulted"), _T("Boolean") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("DaclDefaulted"), _T("Boolean") ); pClass->AddProperty( pProperty ); m_pClasses->SetAt( _T("SecurityDescriptor"), pClass ); // ROOTDSE pClass = new CClass( _T("ROOTDSE"), IID_IADs ); pProperty = new CProperty( _T("currentTime"), _T("UTCTime") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("subschemaSubentry"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("serverName"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("namingContexts"), _T("String"), TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("defaultNamingContext"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("schemaNamingContext"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("configurationNamingContext"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("rootDomainNamingContext"), _T("String") ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("supportedControl"), _T("String"), TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("supportedVersion"), _T("Integer"), TRUE ); pClass->AddProperty( pProperty ); pProperty = new CProperty( _T("highestCommittedUsn"), _T("Integer8") ); pClass->AddProperty( pProperty ); m_pClasses->SetAt( _T("ROOTDSE"), pClass ); return TRUE; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** DWORD CMainDoc::GetToken( void* pVoid ) { DWORD dwToken; dwToken = *(DWORD*) pVoid; return dwToken; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** COleDsObject* CMainDoc::GetObject( void* pVoid ) { COleDsObject* pObject; pObject = *(COleDsObject**) pVoid; return pObject; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::SetCurrentItem( DWORD dwToken ) { m_dwToken = dwToken; if( NewActiveItem( ) ) { UpdateAllViews( NULL ); } } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** DWORD CMainDoc::GetChildItemList( DWORD dwToken, DWORD* pTokens, DWORD dwMaxChildren ) { CQueryStatus aQueryStatus; COleDsObject* pOleDsObject = NULL; DWORD dwFilters, dwChildrenCount=0L; pOleDsObject = GetObject( &dwToken ); if( !pOleDsObject->HasChildren( ) ) { return 0L; } aQueryStatus.Create( IDD_QUERYSTATUS ); aQueryStatus.ShowWindow( SW_SHOW ); aQueryStatus.UpdateWindow( ); if( ! pOleDsObject->CreateTheObject( ) ) { TRACE( _T("Warning: could not create the object\n") ); } else { dwFilters = m_bApplyFilter ? LIMIT : 0; dwChildrenCount = pOleDsObject->GetChildren( pTokens, dwMaxChildren, &aQueryStatus, m_arrFilters, dwFilters ); pOleDsObject->ReleaseIfNotTransient( ); } aQueryStatus.DestroyWindow( ); return dwChildrenCount; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::OnOpenDocument( LPCTSTR lpszName ) { BOOL bRez; TCHAR szString[ 1024 ]; GetPrivateProfileString( _T("Open_ADsPath"), _T("Value_1"), _T(""), szString, 1023, ADSVW_INI_FILE ); WritePrivateProfileString( _T("Open_ADsPath"), _T("Value_1"), lpszName, ADSVW_INI_FILE ); bRez = OnNewDocument( ); WritePrivateProfileString( _T("Open_ADsPath"), _T("Value_1"), szString, ADSVW_INI_FILE ); return bRez; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::OnNewDocument() { CNewObject aNewObject; HRESULT hResult; if (!CDocument::OnNewDocument()) return FALSE; if( aNewObject.DoModal( ) != IDOK ) return FALSE; m_strRoot = aNewObject.m_strPath; m_strUser = aNewObject.m_strOpenAs; m_strPassword = aNewObject.m_strPassword; m_bUseOpenObject = aNewObject.m_bUseOpen; m_bSecure = aNewObject.m_bSecure; m_bEncryption = aNewObject.m_bEncryption; m_bUseVBStyle = !(aNewObject.m_bUseExtendedSyntax); m_bUsePropertiesList = FALSE; hResult = CreateRoot( ); if( FAILED( hResult ) ) { CString strErrorText; strErrorText = OleDsGetErrorText ( hResult ); AfxMessageBox( strErrorText ); } else { SetTitle( m_strRoot ); } return SUCCEEDED( hResult ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::NewActiveItem( ) { BOOL bRez = TRUE; /* TCHAR szQName[ 128 ]; CString strName; COleDsObject* pNewObject; MakeQualifiedName( szQName, m_strItemName.GetBuffer( 128 ), m_dwItemType ); strName = szQName; bRez = m_pItems->Lookup( strName, (CObject*&) pNewObject ); ASSERT( bRez ); m_strDisplayName = szQName; if( m_pObject != NULL ) { m_pObject->ReleaseIfNotTransient( ); } m_pObject = pNewObject; pNewObject->CreateTheObject( );*/ return bRez; } ///////////////////////////////////////////////////////////////////////////// // CMainDoc serialization //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::Serialize(CArchive&) { ASSERT(FALSE); // this example program does not store data } ///////////////////////////////////////////////////////////////////////////// // CMainDoc commands //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnChangeData() { CEnterDlg dlg; if (dlg.DoModal() != IDOK) return; UpdateAllViews(NULL); // general update } ///////////////////////////////////////////////////////////////////////////// //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnSetFilter() { // TODO: Add your command handler code here CFilterDialog aFilterDialog; aFilterDialog.SetDisplayFilter( m_arrFilters ); aFilterDialog.DoModal( ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnDisableFilter() { // TODO: Add your command handler code here m_bApplyFilter = !m_bApplyFilter; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** COleDsObject* CMainDoc::GetCurrentObject( void ) { return GetObject( &m_dwToken ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::GetUseGeneric( ) { return m_bUseGeneric; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::UseVBStyle( ) { return m_bUseVBStyle; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::UsePropertiesList( ) { return m_bUsePropertiesList; } //*********************************************************** // Function: CMainDoc::XOleDsGetObject // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** BOOL CMainDoc::GetUseGetEx( ) { return m_bUseGetEx; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** CClass* CMainDoc::CreateClass( COleDsObject* pObject ) { CClass* pClass; CString strSchema; CString strClass; strSchema = pObject->GetSchemaPath( ); strClass = pObject->GetClass( ); if( !strClass.CompareNoCase( _T("Class") ) || !strClass.CompareNoCase( _T("Property") ) || !strClass.CompareNoCase( _T("Syntax") ) ) { if( !strSchema.IsEmpty( ) ) { TRACE(_T("[OLEDS] Error, nonempty schema path for Class, Property or Syntax objects\n" ) ); } strSchema.Empty( ); } if( strSchema.IsEmpty( ) ) { strSchema = strClass; } if( 0 == (pObject->GetItemName( ).CompareNoCase( _T("ROOTDSE") ) ) ) { strSchema = _T("ROOTDSE"); } if( ! m_pClasses->Lookup( strSchema, ( CObject*& )pClass ) ) { // we must create a new class item HCURSOR oldCursor, newCursor; newCursor = LoadCursor( NULL, IDC_WAIT ); oldCursor = SetCursor( newCursor ); pClass = new CClass( strSchema, this ); ASSERT( NULL != pClass ); if( !strClass.CompareNoCase( _T("User") ) ) { pClass->LoadMethodsInformation( _T("IADsUser") ); } if( !strClass.CompareNoCase( _T("Computer") ) ) { pClass->LoadMethodsInformation( _T("IADsComputerOperations") ); } if( !strClass.CompareNoCase( _T("Service") ) ) { pClass->LoadMethodsInformation( _T("IADsServiceOperations") ); } if( !strClass.CompareNoCase( _T("FileService") ) ) { pClass->LoadMethodsInformation( _T("IADsFileServiceOperations") ); } if( !strClass.CompareNoCase( _T("FPNWFileService") ) ) { pClass->LoadMethodsInformation( _T("IADsFileServiceOperations") ); } if( !strClass.CompareNoCase( _T("PrintQueue") ) ) { pClass->LoadMethodsInformation( _T("IADsPrintQueueOperations") ); } if( !strClass.CompareNoCase( _T("Queue") ) ) { pClass->LoadMethodsInformation( _T("IADsPrintQueueOperations") ); } if( !strClass.CompareNoCase( _T("PrintJob") ) ) { pClass->LoadMethodsInformation( _T("IADsPrintJobOperations") ); } if( !strClass.CompareNoCase( _T("Group") ) ) { pClass->LoadMethodsInformation( _T("IADsGroup") ); } if( !strClass.CompareNoCase( _T("localGroup") ) ) { pClass->LoadMethodsInformation( _T("IADsGroup") ); } if( !strClass.CompareNoCase( _T("GlobalGroup") ) ) { pClass->LoadMethodsInformation( _T("IADsGroup") ); } if( !strClass.CompareNoCase( _T("GroupOfNames") ) ) { pClass->LoadMethodsInformation( _T("IADsGroup") ); } if( !strClass.CompareNoCase( _T("GroupOfUniqueNames") ) ) { pClass->LoadMethodsInformation( _T("IADsGroup") ); } if( !strClass.CompareNoCase( _T("person") ) ) { pClass->LoadMethodsInformation( _T("IADsUser") ); } if( !strClass.CompareNoCase( _T("organizationalPerson") ) ) { pClass->LoadMethodsInformation( _T("IADsUser") ); } if( !strClass.CompareNoCase( _T("residentialPerson") ) ) { pClass->LoadMethodsInformation( _T("IADsUser") ); } m_pClasses->SetAt( strSchema, pClass ); SetCursor( oldCursor ); } return pClass; } //*********************************************************** // Function: CMainDoc::XOleDsGetObject // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** HRESULT CMainDoc::XOleDsGetObject( WCHAR* pszwPath, REFIID refiid, void** pVoid ) { // cahged to add the hack for Win95. HRESULT hResult; WCHAR szOpenAs[ MAX_PATH ]; WCHAR szPassword[ MAX_PATH ]; LONG lCode = 0L; Convert( szOpenAs, m_strUser.GetBuffer( MAX_PATH ) ); Convert( szPassword, m_strPassword.GetBuffer( MAX_PATH ) ); if( !m_bUseOpenObject ) { hResult = ADsGetObject( pszwPath, refiid, pVoid ); } else { if( m_bSecure ) { lCode |= ADS_SECURE_AUTHENTICATION; } if( m_bEncryption ) { lCode |= ADS_USE_ENCRYPTION; } // hack fo rDavid... //if( L':' == pszwPath[ 3 ] ) if( FALSE ) { IADsOpenDSObject* pINamespace; hResult = ADsGetObject( L"NDS:", IID_IADsOpenDSObject, (void**)&pINamespace ); ASSERT( SUCCEEDED( hResult ) ); if( SUCCEEDED( hResult ) ) { IDispatch* pIDisp; hResult = pINamespace->OpenDSObject( pszwPath, _wcsicmp( szOpenAs, L"NULL") ? szOpenAs : NULL, _wcsicmp( szPassword, L"NULL") ? szPassword : NULL, lCode, &pIDisp ); if( SUCCEEDED( hResult ) ) { hResult = pIDisp->QueryInterface( refiid, pVoid ); pIDisp->Release( ); } pINamespace->Release( ); } } else { hResult = ADsOpenObject( pszwPath, _wcsicmp( szOpenAs, L"NULL") ? szOpenAs : NULL, _wcsicmp( szPassword, L"NULL") ? szPassword : NULL, lCode, refiid, pVoid ); } } return hResult; } /******************************************************************* Function: XGetOleDsObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT CMainDoc::PurgeObject( IUnknown* pIUnknown, LPWSTR pszPrefix ) { IADs* pObject; HRESULT hResult; BSTR bstrParent = NULL; IADsContainer* pParent; while( TRUE ) { hResult = pIUnknown->QueryInterface( IID_IADs, (void**)&pObject ); if( FAILED( hResult ) ) break; hResult = pObject->get_Parent( &bstrParent ); pObject->Release( ); if( NULL != bstrParent ) { hResult = XOleDsGetObject( bstrParent, IID_IADsContainer, (void**)&pParent ); if( SUCCEEDED( hResult ) ) { hResult = ::PurgeObject( pParent, pIUnknown, pszPrefix ); pParent->Release( ); } } SysFreeString( bstrParent ); break; } return hResult; } /******************************************************************* Function: XGetOleDsObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT CMainDoc::XOleDsGetObject( CHAR* pszPath, REFIID refiid, void** pVoid ) { int nLength; WCHAR* pszwPath; HRESULT hResult; nLength = strlen( pszPath ); pszwPath = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) ); memset( pszwPath, 0, ( nLength + 1 ) * sizeof(WCHAR) ); MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszPath, nLength, pszwPath, nLength + 1 ); hResult = XOleDsGetObject( pszwPath, refiid, pVoid ); free( pszwPath ); return hResult; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** DWORD CMainDoc::CreateOleDsItem( COleDsObject* pParent, IADs* pIOleDs ) { COleDsObject* pObject = NULL; HRESULT hResult; IUnknown* pIUnk; BSTR bstrOleDsPath = NULL; BSTR bstrClass; hResult = pIOleDs->QueryInterface( IID_IUnknown, (void**)&pIUnk ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) return 0L; hResult = pIOleDs->get_Class( &bstrClass ); hResult = pIOleDs->get_ADsPath( &bstrOleDsPath ); //if( FAILED( hResult ) || NULL == bstrOleDsPath ); pObject = CreateOleDsObject( TypeFromString( bstrClass ), pIUnk ); pIUnk->Release( ); pObject->SetParent( pParent ); pObject->SetDocument( this ); return GetToken( &pObject ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** HRESULT CMainDoc::CreateRoot( ) { IADs* pIOleDs; HRESULT hResult; HCURSOR oldCursor, newCursor; BSTR bstrPath; CreateFakeSchema( ); newCursor = LoadCursor( NULL, IDC_WAIT ); oldCursor = SetCursor( newCursor ); bstrPath = AllocBSTR( m_strRoot.GetBuffer( 1024 ) ); hResult = XOleDsGetObject( bstrPath, IID_IADs, (void**) &pIOleDs ); SysFreeString( bstrPath ); if( SUCCEEDED( hResult ) ) { m_dwToken = CreateOleDsItem( NULL, pIOleDs ); m_dwRoot = m_dwToken; pIOleDs->Release( ); } SetCursor( oldCursor ); return hResult; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::DeleteAllItems( ) { COleDsObject* pObject; POSITION pos; CString strItem; CObject* pItem; if( NULL != m_pClasses ) { for( pos = m_pClasses->GetStartPosition(); pos != NULL; ) { m_pClasses->GetNextAssoc( pos, strItem, pItem ); delete pItem; #ifdef _DEBUG //afxDump << strItem << "\n"; #endif } m_pClasses->RemoveAll( ); } pObject = GetObject( &m_dwRoot ); delete pObject; CreateRoot( ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUpdateDisablefilter(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck( !m_bApplyFilter ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUseGeneric() { // TODO: Add your command handler code here m_bUseGeneric = !m_bUseGeneric; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUpdateUseGeneric(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck( m_bUseGeneric ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUpdateUseGetExPutEx(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck( m_bUseGetEx ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUseGetExPutEx() { // TODO: Add your command handler code here m_bUseGetEx = !m_bUseGetEx; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUsepropertiesList() { // TODO: Add your command handler code here m_bUsePropertiesList = !m_bUsePropertiesList; } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::OnUpdateUsepropertiesList(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck( m_bUsePropertiesList ); } //*********************************************************** // Function: // Arguments: // Return: // Purpose: // Author(s): // Revision: // Date: //*********************************************************** void CMainDoc::SetUseGeneric( BOOL bUseGeneric ) { m_bUseGeneric = bUseGeneric; }