//+------------------------------------------------------------ // // Copyright (C) 1998, Microsoft Corporation // // File: icatasync.cpp // // Contents: Implementation of CICategorizerAsyncContextIMP // // Classes: CICategorizerAsyncContextIMP // // Functions: // // History: // jstamerj 1998/07/16 11:25:20: Created. // //------------------------------------------------------------- #include "precomp.h" #include "simparray.cpp" //+------------------------------------------------------------ // // Function: QueryInterface // // Synopsis: Returns pointer to this object for IUnknown and ICategorizerAsyncContext // // Arguments: // iid -- interface ID // ppv -- pvoid* to fill in with pointer to interface // // Returns: // S_OK: Success // E_NOINTERFACE: Don't support that interface // // History: // jstamerj 980612 14:07:57: Created. // //------------------------------------------------------------- STDMETHODIMP CICategorizerAsyncContextIMP::QueryInterface( REFIID iid, LPVOID *ppv) { *ppv = NULL; if(iid == IID_IUnknown) { *ppv = (LPVOID) this; } else if (iid == IID_ICategorizerAsyncContext) { *ppv = (LPVOID) this; } else { return E_NOINTERFACE; } AddRef(); return S_OK; } //+------------------------------------------------------------ // // Function: AddRef // // Synopsis: adds a reference to this object // // Arguments: NONE // // Returns: New reference count // // History: // jstamerj 980611 20:07:14: Created. // //------------------------------------------------------------- ULONG CICategorizerAsyncContextIMP::AddRef() { return InterlockedIncrement((PLONG)&m_cRef); } //+------------------------------------------------------------ // // Function: Release // // Synopsis: releases a reference, deletes this object when the // refcount hits zero. // // Arguments: NONE // // Returns: New reference count // // History: // jstamerj 980611 20:07:33: Created. // //------------------------------------------------------------- ULONG CICategorizerAsyncContextIMP::Release() { LONG lNewRefCount; lNewRefCount = InterlockedDecrement((PLONG)&m_cRef); return lNewRefCount; } //+------------------------------------------------------------ // // Function: CICategorizerAsyncContext::CompleteQuery // // Synopsis: Accept async completion from a sink // // Arguments: // pvQueryContext: pvoid query context (really a PEVENTPARAMS_SENDQUERY) // hrResolutionStatus: S_OK unless there was an error talking to DS // dwcResults: The number of ICategorizerItemAttributes returned // rgpItemAttributes: Array of pointers to the ICategorizerItemAttributes // fFinalCompletion: // FALSE: This is a completion for // pending results; there will be another completion // called with more results // TRUE: This is the final completion call // // Returns: // S_OK: Success // // History: // jstamerj 1998/07/16 11:27:47: Created. // //------------------------------------------------------------- STDMETHODIMP CICategorizerAsyncContextIMP::CompleteQuery( IN PVOID pvQueryContext, IN HRESULT hrResolutionStatus, IN DWORD dwcResults, IN ICategorizerItemAttributes **rgpItemAttributes, IN BOOL fFinalCompletion) { HRESULT hr; PEVENTPARAMS_CATSENDQUERY pParams; CSearchRequestBlock *pBlock; CatFunctEnterEx((LPARAM)this, "CICategorizerAsyncContextIMP::CompleteQuery"); DebugTrace((LPARAM)this, "hrResolutionStatus is %08lx", hrResolutionStatus); DebugTrace((LPARAM)this, "dwcResults for this sink is %ld", dwcResults); DebugTrace((LPARAM)this, "fFinalCompletion is %d", fFinalCompletion); pParams = (PEVENTPARAMS_CATSENDQUERY)pvQueryContext; pBlock = (CSearchRequestBlock *) pParams->pblk; // // If the old hrResolutionStatus (saved in pParams) indicates failure, don't do any more work // if(SUCCEEDED(pParams->hrResolutionStatus)) { hr = hrResolutionStatus; if(SUCCEEDED(hr) && (dwcResults > 0) && (rgpItemAttributes)) { // // Add the new array of ICatItemAttrs to the existing array // hr = pBlock->AddResults( dwcResults, rgpItemAttributes); if(FAILED(hr)) { ERROR_LOG("pBlock->AddResults"); } } if(FAILED(hr)) { // // Remember something failed in pParams // pParams->hrResolutionStatus = hr; ERROR_LOG("--async--"); } } if(fFinalCompletion) { if((pParams->pIMailTransportNotify) && FAILED(pParams->hrResolutionStatus)) { ErrorTrace((LPARAM)this, "Stoping resoltion, error encountered: %08ld", pParams->hrResolutionStatus); // // If the resolution sink is indicating an error, set the error // and return S_FALSE to the SEO dispatcher so that it will stop // calling resolve sinks (we're going to fail now anyway, after // all) // hr = pParams->pIMailTransportNotify->Notify( S_FALSE, pParams->pvNotifyContext); _ASSERT(SUCCEEDED(hr)); } else { if(pParams->pIMailTransportNotify) { // // Call the SEO dispatcher completion routine // hr = pParams->pIMailTransportNotify->Notify( S_OK, pParams->pvNotifyContext); } else { // // Events are disabled; call completion directly // hr = CSearchRequestBlock::HrSendQueryCompletion( S_OK, pParams); } _ASSERT(SUCCEEDED(hr)); } } CatFunctLeaveEx((LPARAM)this); return S_OK; }