diff -r 000000000000 -r 094583676ce7 PECengine/PresenceManager2/SrcSearch/CPEngSearchHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceManager2/SrcSearch/CPEngSearchHandler.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,376 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: this class handls the search operation +* +*/ + +// INCLUDE FILES +#include "CPEngSearchHandler.h" +#include "CPEngSearchResultEntry.h" +#include "PEngWVSearchPanics.h" +#include "PresenceDebugPrint.h" + +#include +#include +#include + + +//MACROS + +#define RETURN_IF_NOT_PENDING( aId ) \ + { \ + if( !IsRequestPending( aId ) ) \ + { \ + return; \ + } \ + } \ + + + + + +// ============================ LOCAL FUNCTIONS ================================ + +// ----------------------------------------------------------------------------- +// PEngElement2WVElementL() +// +// +// +// ----------------------------------------------------------------------------- +TImpsSearchElement PEngElement2WVElementL( TInt aElement ) + { + TImpsSearchElement wvElement( EImpsUserAlias ); + switch ( aElement ) + { + case EPEngWVSearchUserAlias: + { + wvElement = EImpsUserAlias; + break; + } + + case EPEngWVSearchUserOnlineStatus: + { + wvElement = EImpsUserOnlineStatus; + break; + } + + case EPEngWVSearchUserEmailAddress: + { + wvElement = EImpsUserEmailAddress; + break; + } + + case EPEngWVSearchUserFirstName: + { + wvElement = EImpsUserFirstName; + break; + } + + case EPEngWVSearchUserID: + { + wvElement = EImpsUserID; + break; + } + + case EPEngWVSearchUserLastName: + { + wvElement = EImpsUserLastName; + break; + } + + case EPEngWVSearchUserMobileNumber: + { + wvElement = EImpsUserMobileNumber; + break; + } + + default: + { + SearchPanicOrLeaveL( EPEngSearchElementUnknown, KErrUnknown ); + break; + } + } + + return wvElement; + } + + + +// ----------------------------------------------------------------------------- +// PEngCriteria2WVReqLC() +// ----------------------------------------------------------------------------- +CImpsSearchRequest* PEngCriteria2WVReqLC( const CPEngSearchCriteria2& aCriteria ) + { + CImpsSearchRequest* req = CImpsSearchRequest::NewL(); + CleanupStack::PushL( req ); + + TImpsSearchElement wvElement = PEngElement2WVElementL( aCriteria.Element() ); + TPtrC searchValue( aCriteria.SearchValue() ); + + req->SetRequestL( wvElement, searchValue ); + return req; + } + + + + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::NewL() +// ----------------------------------------------------------------------------- +CPEngSearchHandler* CPEngSearchHandler::NewL( TInt aPriority, + RImpsEng& aImpsEngine, + CPEngSearchResultEntry& aResultContainer, + const RPointerArray< CPEngSearchCriteria2 >& aCriterias, + TInt aSearchLimit ) + { + CPEngSearchHandler* self = new ( ELeave ) CPEngSearchHandler( aResultContainer, aSearchLimit ); + CleanupStack::PushL( self ); + self->ConstructL( aPriority, aImpsEngine, aCriterias ); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::~CPEngSearchHandler() +// ----------------------------------------------------------------------------- +CPEngSearchHandler::~CPEngSearchHandler() + { + if ( iSearchId != KErrNotFound ) + { + TRAP_IGNORE( iFundClient.StopSearchL( iSearchId ) ) + } + + iFundClient.Unregister(); + + if ( iSearchPairs ) + { + iSearchPairs->ResetAndDestroy(); + } + + delete iSearchPairs; + + + if ( iRequest ) + { + User::RequestComplete( iRequest, KErrCancel ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::CPEngSearchHandler() +// ----------------------------------------------------------------------------- +CPEngSearchHandler::CPEngSearchHandler( CPEngSearchResultEntry& aResultContainer, + TInt aSearchLimit ) + : iResultContainer( aResultContainer ), + iSearchLimit( aSearchLimit ), + iOpId( KErrNotFound ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::ConstructL() +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::ConstructL( TInt aPriority, + RImpsEng& aImpsEngine, + const RPointerArray< CPEngSearchCriteria2 >& aCriterias ) + { + iFundClient.RegisterL( aImpsEngine, this, NULL, KNullDesC, EFalse, aPriority ); + iFundClient.RegisterErrorObserverL( *this ); + + iSearchPairs = new ( ELeave ) CSearchPairs( 5 ); + + const TInt count = aCriterias.Count(); + for ( TInt ix = 0; ix < count; ix++ ) + { + CPEngSearchCriteria2* pengCriteria = aCriterias[ ix ]; + CImpsSearchRequest* impsReg = PEngCriteria2WVReqLC( *pengCriteria ); + iSearchPairs->AppendL( impsReg ); + CleanupStack::Pop( impsReg ); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::SearchL() +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::SearchL( TRequestStatus& aStatus ) + { + __ASSERT_ALWAYS( !iRequest, User::Leave( KErrAlreadyExists ) ); + __ASSERT_ALWAYS( iOpId == KErrNotFound, User::Leave( KErrAlreadyExists ) ); + + iOpId = iFundClient.SearchFirstL( *iSearchPairs, iSearchLimit ); + iSearchId = KErrNotFound; + + iRequest = &aStatus; + *iRequest = KRequestPending; + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::ContinueSearchL() +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::ContinueSearchL( TInt aContinueIndex, + TRequestStatus& aStatus ) + { + __ASSERT_ALWAYS( !iRequest, User::Leave( KErrAlreadyExists ) ); + __ASSERT_ALWAYS( iOpId == KErrNotFound, User::Leave( KErrAlreadyExists ) ); + __ASSERT_ALWAYS( iSearchId != KErrNotFound, User::Leave( KErrNotReady ) ); + + iOpId = iFundClient.SearchNextL( iSearchId, aContinueIndex ); + + iRequest = &aStatus; + *iRequest = KRequestPending; + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::StopSearchL() +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::StopSearchL( TRequestStatus& aStatus ) + { + __ASSERT_ALWAYS( !iRequest, User::Leave( KErrAlreadyExists ) ); + __ASSERT_ALWAYS( iOpId == KErrNotFound, User::Leave( KErrAlreadyExists ) ); + + if ( iSearchId != KErrNotFound ) + { + iOpId = iFundClient.StopSearchL( iSearchId ); + + iRequest = &aStatus; + *iRequest = KRequestPending; + } + else + { + //If no WV engine search pending - complete stop directly without errors + TRequestStatus* tmpStatus = &aStatus; + User::RequestComplete( tmpStatus, KErrNone ); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::IsRequestPending() +// ----------------------------------------------------------------------------- +TBool CPEngSearchHandler::IsRequestPending( TInt aId ) + { + if ( ( aId == iOpId ) && iRequest ) + { + return ETrue; + } + + return EFalse; + } + + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::HandleSearchL() +// From MImpsSearchHandler2 +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::HandleSearchL( TInt aOpId, + TInt aSearchId, + TInt aIndex, + TInt aResultsFound, + TBool aCompleted, + TImpsSearchResultType aType, + MDesCArray* aResults , + TImpsCspIdentifier& /*aCspId*/ ) + { + PENG_DP( D_PENG_LIT( "CPEngSearchHandler::HandleSearchL( aOpId(%d), aSearchId(%d), aIndex(%d), aResultsFound(%d), aCompleted(%d), aType(%i), results(%d) )" ), + aOpId, aSearchId, aIndex, aResultsFound, aCompleted, aType, aResults ? aResults->MdcaCount() : 0 ); + + RETURN_IF_NOT_PENDING( aOpId ); + + //Init operation & search ID's + iOpId = KErrNotFound; + if ( iSearchId == KErrNotFound ) + { + iSearchId = aSearchId; + } + + //Fill result container + iResultContainer.Reset(); + iResultContainer.SetDetails( aResultsFound, aIndex, aCompleted ); + + TInt err = KErrNone; + if ( ( aType == EImpsUserResult ) && aResults ) + { + TRAP( err, + { + const TInt resultCount = aResults->MdcaCount(); + for ( TInt ix = 0; ix < resultCount; ix++ ) + { + iResultContainer.UserResults().AppendL( aResults->MdcaPoint( ix ) ); + } + } ); + } + + + User::RequestComplete( iRequest, err ); + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::HandleSearchStoppedL() +// From MImpsSearchHandler2 +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::HandleSearchStoppedL( TInt aOpId, + TInt aSearchId, + TImpsCspIdentifier& /*aCspId*/ ) + { + + PENG_DP( D_PENG_LIT( "CPEngSearchHandler::HandleSearchStoppedL( aOpId(%d), aStatus(%d), aSearchId(%d) )" ), + aOpId, aSearchId ); + + RETURN_IF_NOT_PENDING( aOpId ); + + iOpId = KErrNotFound; + iSearchId = KErrNotFound; + iResultContainer.Reset(); + User::RequestComplete( iRequest, KErrNone ); + } + + +// ----------------------------------------------------------------------------- +// CPEngSearchHandler::HandleErrorL() +// From MImpsErrorHandler2 +// ----------------------------------------------------------------------------- +void CPEngSearchHandler::HandleErrorL( TInt aStatus, + TInt aOpId, + const TDesC* /*aDescription*/, + const CImpsDetailed* /*aDetailedRes*/, + TImpsCspIdentifier& /*aCspId*/ ) + { + PENG_DP( D_PENG_LIT( "CPEngSearchHandler::HandleErrorL( aStatus(%i), aOpId(%i) )" ), aStatus, aOpId ); + + RETURN_IF_NOT_PENDING( aOpId ); + + iOpId = KErrNotFound; + iSearchId = KErrNotFound; + + iResultContainer.Reset(); + User::RequestComplete( iRequest, aStatus ); + } + + + +// End of file + +