PECengine/PresenceManager2/SrcSearch/CPEngSearchHandler.cpp
changeset 0 094583676ce7
--- /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
+
+