wvuing/wvuieng/EngSrc/CCASearchManager.cpp
changeset 0 094583676ce7
--- /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<CCARequest*>( 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