diff -r 000000000000 -r 094583676ce7 wvuing/wvuieng/EngSrc/CCASearchManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuieng/EngSrc/CCASearchManager.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,371 @@ +/* +* Copyright (c) 2002-2005 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 offers the search services +* +*/ + + +// INCLUDE FILES +#include "CCARequest.h" +#include "CCARequestMapper.h" +#include "CCASearchData.h" +#include "CCASearchManager.h" +#include "MCASearchObserverInterface.h" +#include "PublicEngineDefinitions.h" +#include "PrivateEngineDefinitions.h" +#include "ImpsCSPAllErrors.h" +#include "MCAImpsFactory.h" + +#include "ChatDebugPrint.h" + +// ================= MEMBER FUNCTIONS ======================= + +// Two-phased constructor. +CCASearchManager* CCASearchManager::NewL( + MCAImpsFactory* aIMPSFactory, + CCARequestMapper* aRequestMapper ) + { + CCASearchManager* self = new ( ELeave ) CCASearchManager( + aIMPSFactory, + aRequestMapper ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// Destructor +CCASearchManager::~CCASearchManager() + { + delete iOwnGrouplistCreatorId; + delete iResults; + delete iCreatedGroups; + } + +// --------------------------------------------------------- +// CCASearchManager::SetSearchSupported +// --------------------------------------------------------- +// +void CCASearchManager::SetSearchSupported( TBool aSearchSupported ) + { + iSearchSupported = aSearchSupported; + } + +// --------------------------------------------------------- +// CCASearchManager::StartSearchL +// --------------------------------------------------------- +// +EXPORT_C TInt CCASearchManager::StartSearchL( + const CSearchPairs& aPairs, + TInt aSearchLimit, + MCASearchObserverInterface* aObserver ) + { + CHAT_DP_TXT( "CCASearchManager::StartSearchL()...starts" ); + + if ( !iSearchSupported ) + { + User::Leave( ESearchNotSupported ); + } + + // Set data + iSearchLimit = aSearchLimit; + iState = ESearchStartRequested; + + // Create the request + CHAT_DP_FUNC_DP( "StartSearchL", "Creating request" ); + TInt opId = iImpsFundClient->SearchFirstL( aPairs, + aSearchLimit ); + CCARequest* request = iRequestMapper->CreateRequestL( opId, EFalse ); + + // remember the observer (synchronous, so only one observer used) + iObserver = aObserver; + + CHAT_DP_FUNC_DP( "StartSearchL", "Waiting for completion" ); + + request->StartWait(); + + // execution continues from here + TInt errorCode( KErrNone ); + errorCode = request->ErrorCode(); + + iRequestMapper->RemoveRequest( request ); + iObserver = NULL; + + CHAT_DP_TXT( "CCASearchManager::StartSearchL()...over" ); + + return errorCode; + } + + +// --------------------------------------------------------- +// CCASearchManager::EndSearchL +// --------------------------------------------------------- +// +EXPORT_C TInt CCASearchManager::EndSearchL() + { + CHAT_DP_TXT( "CCASearchManager::EndSearchL()...starts" ); + + if ( !iSearchSupported ) + { + User::Leave( ESearchNotSupported ); + } + + // Create the request and start waiting + CCARequest* request = iRequestMapper->CreateRequestL( + iImpsFundClient->StopSearchL( iSearchID ), + EFalse ); + + request->StartWait(); + + TInt errorCode( KErrNone ); + + // Execution continues from here + errorCode = request->ErrorCode(); + CHAT_DP( D_CHAT_LIT( "EndSearchL() error code %d" ), errorCode ); + + iRequestMapper->RemoveRequest( request ); + iObserver = NULL; + + CHAT_DP_TXT( "CCASearchManager::EndSearchL()...over" ); + + return errorCode; + } + +// --------------------------------------------------------- +// CCASearchManager::SearchNextL +// --------------------------------------------------------- +// +EXPORT_C TInt CCASearchManager::SearchNextL( TInt aIndex, + MCASearchObserverInterface* aObserver ) + { + CHAT_DP_FUNC_ENTER( "SearchNextL" ); + CHAT_DP( D_CHAT_LIT( "SearchNextL index is %d" ), aIndex ); + + if ( !iSearchSupported ) + { + User::Leave( ESearchNotSupported ); + } + + if ( aIndex >= SearchDataInterface()->HowManyResultsAvailable() && + iResults->NoMoreResultsAvailable() ) + { + CHAT_DP_TXT( "!!!NO MORE RESULTS!!!" ); + iObserver = NULL; + User::Leave( ERequestedResultsButNotAvailable ); + } + + if ( iResults->WeHaveData( aIndex ) ) + { + CHAT_DP_TXT( " We have results" ); + CHAT_DP_FUNC_DONE( "SearchNextL" ); + iObserver = NULL; + return KErrNone; + } + else + { + CHAT_DP_TXT( " We do not have results" ); + CHAT_DP( D_CHAT_LIT( "Next index %d" ), iResults->NextSearchIndex() ); + + // Start waiting + TInt opId = iImpsFundClient->SearchNextL( iSearchID, + iResults->NextSearchIndex() ); + CCARequest* request = iRequestMapper->CreateRequestL( opId, EFalse ); + + // remember the observer for this operation + iObserver = aObserver; + + request->StartWait(); + + // execution continues from here + TInt errorCode( KErrNone ); + errorCode = request->ErrorCode(); + + iRequestMapper->RemoveRequest( request ); + + CHAT_DP_FUNC_DONE( "SearchNextL" ); + iObserver = NULL; + + return errorCode; + } + } + +// --------------------------------------------------------- +// CCASearchManager::SearchDataInterface +// --------------------------------------------------------- +// +EXPORT_C MCASearchData* CCASearchManager::SearchDataInterface() const + { + return iResults; + } + +// --------------------------------------------------------- +// CCASearchManager::HandleSearchL +// --------------------------------------------------------- +// +void CCASearchManager::HandleSearchL( TInt aId, + TInt aSearchId, + TInt aIndex, + TInt aResultsFound, + TBool aCompleted, + TImpsSearchResultType aType, + MDesCArray* aResults , + TImpsCspIdentifier& /* aCspId */ ) + { + // NOTES about response API + // 1. After the search has been started 2nd search and from that point on + // the aSearchId is not available (see SCR) + CHAT_DP_FUNC_ENTER( "HandleSearchL" ); + CHAT_DP( D_CHAT_LIT( " aIndex = %d" ), aIndex ); + CHAT_DP( D_CHAT_LIT( " aSearchId = %d" ), aSearchId ); + CHAT_DP( D_CHAT_LIT( " iSearchID = %d" ), iSearchID ); + + TInt leave( KErrNone ); + + // Find the request + CCARequest* request = + const_cast( iRequestMapper->FindRequest( aId ) ); + + if ( request ) + { + if ( iState == ESearchStartRequested ) + { + iResults->ClearResults(); + } + + iResults->UpdateMaximumPossibleResults( aResultsFound ); + + TRAP( leave, SaveResultsL( aIndex, aCompleted, aType, aResults ) ); + if ( leave != KErrNone ) + { + CHAT_DP_FUNC_DP( "HandleSearchL", "Got an error" ); + + if ( iObserver ) + { + iObserver->HandleSearchError( EECouldntSaveSearchResults ); + } + } + else + { + if ( iState == ESearchStartRequested ) + { + // Update search ID for the first and only time + iSearchID = aSearchId; + + // Update state + iState = ESearchGoingOn; + } + } + } + + // If code added/changed before HandleRequest, then make sure that + // code does not Leave before HandleRequest, because request + // response waiting does not stop (and waitnote) before calling + // HandleRequest + CHAT_DP_FUNC_DP( "HandleSearchL", "Handling request" ); + TInt status( KErrNone ); + if ( leave ) + { + status = leave; + } + iRequestMapper->HandleRequest( aId, status ); + + if ( iObserver ) + { + CHAT_DP_FUNC_DP( "HandleSearchL", "Invoking observer" ); + iObserver->HandleSearchFinished(); + } + + // leave on system errors + if ( leave > Imps_ERROR_BASE ) + { + User::LeaveIfError( leave ); + } + + CHAT_DP_FUNC_DONE( "HandleSearchL" ); + } + +// --------------------------------------------------------- +// CCASearchManager::HandleSearchStoppedL +// --------------------------------------------------------- +// +void CCASearchManager::HandleSearchStoppedL( TInt aId, + TInt /* aSearchId */, + TImpsCspIdentifier& /* aCspId */ ) + { + CHAT_DP_FUNC_ENTER( "HandleSearchStoppedL" ); + + iResults->ClearResults(); + + iState = ENoActivity; + + // If code added/changed before HandleRequest, then make sure that + // code does not Leave before HandleRequest, because request + // response waiting does not stop (and waitnote) before calling + // HandleRequest + + iRequestMapper->HandleRequest( aId, KErrNone ); + + iObserver = NULL; + CHAT_DP_FUNC_DONE( "HandleSearchStoppedL" ); + } + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCASearchManager::CCASearchManager( + MCAImpsFactory* aIMPSFactory, + CCARequestMapper* aRequestMapper ) + : iImpsFactory( aIMPSFactory ), + iState( ENoActivity ), + iRequestMapper( aRequestMapper ) + { + } + +// Symbian OS default constructor can leave. +void CCASearchManager::ConstructL() + { + CHAT_DP_TXT( "CCASearchManager::ConstructL...starts" ); + + iImpsFundClient = iImpsFactory->CreateFundClientL(); + + iResults = CCASearchData::NewL(); + iCreatedGroups = new( ELeave ) CDesCArrayFlat( KArrayGranularity ); + + CHAT_DP_TXT( "CCASearchManager::ConstructL...ends" ); + } + +// --------------------------------------------------------- +// CCASearchManager::SaveResultsL +// --------------------------------------------------------- +// +void CCASearchManager::SaveResultsL( TInt aIndex, + TBool aCompleted, + TImpsSearchResultType aType, + MDesCArray* aResults ) + { + CHAT_DP_TXT( "CCASearchManager::SaveResultsL...starts" ); + + iResults->UpdateDataL( + aIndex, + aCompleted, + aType, + aResults, + iSearchLimit ); + + CHAT_DP_TXT( "CCASearchManager::SaveResultsL...over" ); + } + +// End of File