//+---------------------------------------------------------------------------- // // Copyright (C) 2000, Microsoft Corporation // // File: DfsADBlobRootFolder.hxx // // Contents: the Root DFS Folder class for ADBlob Store // // Classes: DfsADBlobRootFolder // // History: Dec. 8 2000, Author: udayh // April 10, 2001 Rohanp - Added ADSI specific function calls // //----------------------------------------------------------------------------- #ifndef __DFS_ADBLOB_ROOT_FOLDER__ #define __DFS_ADBLOB_ROOT_FOLDER__ #include "DfsRootFolder.hxx" #include "DfsADBlobStore.hxx" #include "DfsAdBlobCache.hxx" #include #include #include //+---------------------------------------------------------------------------- // // Class: DfsADBlobRootFolder // // Synopsis: This class implements The Dfs ADBlob root folder. // //----------------------------------------------------------------------------- class DfsADBlobRootFolder: public DfsRootFolder { private: DfsADBlobStore *_pStore; // Pointer to registered store // that owns this root. DfsADBlobCache * _pBlobCache; protected: DfsStore * GetMetadataStore() { return _pStore; } DfsADBlobCache * GetMetadataBlobCache() { return _pBlobCache; } // // Force a flush of the entire cache whether the direct mode // is set or not // DFSSTATUS Flush() { return GetMetadataBlobCache()->WriteBlobToAd(TRUE); } DFSSTATUS UpdateRootFromBlob( BOOLEAN fForceSync, BOOLEAN FromPDC); // // Function GetMetadataKey: Gets the ADBlob metadata key for // this root folder. // DFSSTATUS GetMetadataHandle( PDFS_METADATA_HANDLE pRootHandle ) { DFSSTATUS Status = STATUS_SUCCESS; HRESULT hr = S_OK; DfsADBlobCache * pBlobCache = NULL; Status = GetMetadataKey( &pBlobCache ); if(pBlobCache != NULL) { *pRootHandle = CreateMetadataHandle(pBlobCache); } return Status; } VOID ReleaseMetadataHandle( DFS_METADATA_HANDLE RootHandle ) { DfsADBlobCache * pBlobCache = NULL; pBlobCache = (DfsADBlobCache*)ExtractFromMetadataHandle(RootHandle); ReleaseMetadataKey(pBlobCache); // // review: pContainer? where did this come from! // DestroyMetadataHandle(pContainer); return; } private: DFSSTATUS GetMetadataKey( DfsADBlobCache * *pBlobCache ) { DFSSTATUS Status = ERROR_SUCCESS; *pBlobCache = GetMetadataBlobCache(); if(*pBlobCache == NULL) { Status = ERROR_FILE_NOT_FOUND; } return Status; } VOID ReleaseMetadataKey( DfsADBlobCache * pBlobCache ) { UNREFERENCED_PARAMETER(pBlobCache); return NOTHING; } public: // // Function DfsADBlobRootFolder: Constructor. // Initializes the ADBlobRootFolder class instance. // DfsADBlobRootFolder( LPWSTR NameContext, LPWSTR RootRegKeyName, PUNICODE_STRING pLogicalName, PUNICODE_STRING pPhysicalShare, DfsADBlobStore *pParentStore, DFSSTATUS *pStatus ); ~DfsADBlobRootFolder() { DfsReleaseDomainName(&_DfsVisibleContext); if (_pBlobCache != NULL) { _pBlobCache->ReleaseReference(); _pBlobCache = NULL; } if (_pStore != NULL) { _pStore->ReleaseReference(); _pStore = NULL; } } // // Function Synchronize: This function overrides the synchronize // defined in the base class. // The synchronize function updates the root folder's children // with the uptodate information available in the store's metadata. // DFSSTATUS Synchronize(BOOLEAN fForceSynch = FALSE, BOOLEAN CalledByAPi = FALSE); DFSSTATUS EnumerateBlobCacheAndCreateFolders(void); DFSSTATUS GetMetadataLogicalToLinkName( PUNICODE_STRING pIn, PUNICODE_STRING pOut ) { UNICODE_STRING ServerComp; UNICODE_STRING ShareComp; return DfsGetPathComponents( pIn, &ServerComp, &ShareComp, pOut ); } VOID ReleaseMetadataLogicalToLinkName( PUNICODE_STRING pIn ) { UNREFERENCED_PARAMETER(pIn); return NOTHING; } DFSSTATUS ReSynchronize(BOOLEAN fForceSync) { DFSSTATUS Status; Status = Synchronize(fForceSync); return Status; } DFSSTATUS RootRequestPrologue( LPWSTR DCName ) { LPWSTR UseDCName = DCName; DfsString *pPDC = NULL; PVOID pHandle; DFSSTATUS Status = ERROR_SUCCESS; if (UseDCName == NULL) { Status = DfsGetBlobPDCName( &pPDC, DFS_FORCE_DC_QUERY ); if(Status != ERROR_SUCCESS) { return Status; } UseDCName = pPDC->GetString(); } Status = GetMetadataBlobCache()->GetADObject(&pHandle, UseDCName ); DfsReleaseBlobPDCName(pPDC); return Status; } VOID RootRequestEpilogue() { GetMetadataBlobCache()->ReleaseADObject(NULL); } DFSSTATUS RootApiRequestPrologue(BOOLEAN WriteRequest, LPWSTR DCName = NULL) { DFSSTATUS Status; Status = RootRequestPrologue(DCName); if (Status == ERROR_SUCCESS) { Status = CommonRootApiPrologue( WriteRequest ); if (Status != ERROR_SUCCESS) { GetMetadataBlobCache()->ReleaseADObject(NULL); } } return Status; } VOID RootApiRequestEpilogue( BOOLEAN WriteRequest, DFSSTATUS CompletionStatus ) { if ((WriteRequest == TRUE) && (CompletionStatus == ERROR_SUCCESS) && (!DfsCheckDirectMode())) { SynchronizeRoots(); } RootRequestEpilogue(); return NOTHING; } DFSSTATUS RenameLinks( IN LPWSTR OldDomainName, IN LPWSTR NewDomainName); VOID SynchronizeRoots(); ULONG GetBlobSize() { return GetMetadataBlobCache()->GetBlobSize(); } DFSSTATUS GetSiteBlob(PVOID *ppBuffer, PULONG pSize) { return GetMetadataBlobCache()->GetSiteBlob(ppBuffer, pSize); } DFSSTATUS SetSiteBlob(PVOID pBuffer, ULONG Size) { return GetMetadataBlobCache()->SetSiteBlob(pBuffer, Size); } DFSSTATUS CheckResynchronizeAccess( DFSSTATUS AccessCheckStatus ) { UNREFERENCED_PARAMETER(AccessCheckStatus); return ERROR_SUCCESS; } }; #endif // __DFS_ADBLOB_ROOT_FOLDER__