//+------------------------------------------------------------------ // // Copyright (C) 1991-1997 Microsoft Corporation. // // File: defprop.cxx // // Contents: Deferred property retriever for filesystems // // Classes: CCiCDeferredPropRetriever // // History: 12-Jan-97 SitaramR Created // //------------------------------------------------------------------- #include #pragma hdrstop #include #include #include #include //+--------------------------------------------------------------------------- // // Member: CCiCDeferredPropRetriever::CCiCDeferredPropRetriever // // Synopsis: Constructor // // Arguments: [cat] -- Catalog // [secCache] -- Cache of AccessCheck() results // [fUsePathAlias] -- TRUE if client is going through rdr/svr // // History: 12-Jan-97 SitaramR Created // //---------------------------------------------------------------------------- CCiCDeferredPropRetriever::CCiCDeferredPropRetriever( PCatalog & cat, CSecurityCache & secCache, BOOL fUsePathAlias ) : _cat( cat ), _secCache( secCache ), _remoteAccess( cat.GetImpersonationTokenCache() ), _fUsePathAlias( fUsePathAlias ), _cRefs( 1 ) { } //+--------------------------------------------------------------------------- // // Member: CCiCDeferredPropRetriever::~CCiCDeferredPropRetriever // // Synopsis: Destructor // // History: 12-Jan-97 SitaramR Created // //---------------------------------------------------------------------------- CCiCDeferredPropRetriever::~CCiCDeferredPropRetriever() { } //+--------------------------------------------------------------------------- // // Member: CCiCDeferredPropRetriever::RetrieveDeferredValueByPropSpec // // Effects: Fetch value from the property cache and/or from docfile // // Arguments: [wid] -- Workid // [pPropSpec] -- Property to fetch // [pPropVar] -- Value returned here // // Notes: It's the responsibility of the caller to free the variant // by calling VariantClear on pVar // // History: 12-Jan-97 SitaramR Created // //---------------------------------------------------------------------------- SCODE STDMETHODCALLTYPE CCiCDeferredPropRetriever::RetrieveDeferredValueByPropSpec( WORKID wid, const FULLPROPSPEC * pPropSpec, PROPVARIANT * pVar ) { // // Set up the failure case // pVar->vt = VT_EMPTY; if ( widInvalid == wid ) return CI_E_WORKID_NOTVALID; SCODE sc = S_OK; TRY { // // First check the security access // // 8-byte align this memory XArray xBuf( sizeof_CCompositePropRecord ); XCompositeRecord rec( _cat, wid, xBuf.Get() ); SDID sdid = _cat.FetchSDID( rec.Get(), wid ); BOOL fGranted = _secCache.IsGranted( sdid, FILE_READ_DATA ); if ( fGranted ) { CFullPropSpec *pPS = (CFullPropSpec *) pPropSpec; PROPID pid = _cat.PropertyToPropId( *pPS, TRUE ); if ( ! _cat.FetchValue( rec.Get(), pid, *pVar ) ) { // // Try fetching the value from the docfile // rec.Free(); CFunnyPath funnyPath; SIZE_T cwc = _cat.WorkIdToPath( wid, funnyPath ); if ( cwc > 0 ) { XGrowable xVPath; cwc = _cat.WorkIdToVirtualPath( wid, 0, xVPath ); if ( CImpersonateRemoteAccess::IsNetPath( funnyPath.GetActualPath() ) ) _remoteAccess.ImpersonateIf( funnyPath.GetActualPath(), cwc != 0 ? xVPath.Get() : 0 ); else if ( _remoteAccess.IsImpersonated() ) _remoteAccess.Release(); COLEPropManager propMgr; propMgr.Open( funnyPath ); propMgr.ReadProperty( *pPS, *pVar ); } } } else { vqDebugOut(( DEB_ERROR, "CCiCDeferredPropRetriever::RetrieveDeferredValueByPropSpec, security check failed\n" )); } } CATCH( CException, e ) { sc = e.GetErrorCode(); vqDebugOut(( DEB_ERROR, "CCiCDeferredPropRetriever::RetrieveDeferredValueByPropSpec - Exception caught 0x%x\n", sc )); } END_CATCH; return sc; } //RetrieveDeferredValueByPropSpec //+------------------------------------------------------------------------- // // Method: CCiCDeferredPropRetriever::AddRef // // Synopsis: Increments refcount // // History: 12-Jan-1997 SitaramR Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CCiCDeferredPropRetriever::AddRef() { return InterlockedIncrement( (long *) &_cRefs ); } //+------------------------------------------------------------------------- // // Method: CCiCDeferredPropRetriever::Release // // Synopsis: Decrement refcount. Delete if necessary. // // History: 12-Jan-1997 SitaramR Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CCiCDeferredPropRetriever::Release() { Win4Assert( _cRefs > 0 ); ULONG uTmp = InterlockedDecrement( (long *) &_cRefs ); if ( 0 == uTmp ) delete this; return uTmp; } //+------------------------------------------------------------------------- // // Method: CCiCDeferredPropRetriever::QueryInterface // // Synopsis: Rebind to other interface // // Arguments: [riid] -- IID of new interface // [ppvObject] -- New interface * returned here // // Returns: S_OK if bind succeeded, E_NOINTERFACE if bind failed // // History: 12-Jan-1997 SitaramR Created // //-------------------------------------------------------------------------- SCODE STDMETHODCALLTYPE CCiCDeferredPropRetriever::QueryInterface( REFIID riid, void ** ppvObject) { IUnknown *pUnkTemp = 0; SCODE sc = S_OK; if ( IID_ICiCDeferredPropRetriever == riid ) pUnkTemp = (IUnknown *)(ICiCDeferredPropRetriever *) this; else if ( IID_IUnknown == riid ) pUnkTemp = (IUnknown *) this; else sc = E_NOINTERFACE; if( 0 != pUnkTemp ) { *ppvObject = (void * )pUnkTemp; pUnkTemp->AddRef(); } else { *ppvObject = 0; } return sc; } //QueryInterface