--- /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 <ImpsFundamental.h>
+#include <CPEngSearchCriteria2.h>
+#include <PEngWVPresenceSearch2.h>
+
+
+//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
+
+