PECengine/PresenceManager2/SrcSearch/CPEngSearchControl.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/PresenceManager2/SrcSearch/CPEngSearchControl.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,471 @@
+/*
+* 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 search operation
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngSearchControl.h"
+#include "CPEngSearchResultEntry.h"
+#include "CPEngNWSessionSlotStorageProxy.h"
+#include "MPEngAdvTransactionStatus2.h"
+#include "CPEngTransactionStatus.h"
+
+#include "CPEngSearchSessionHandler.h"
+#include "CPEngSearchHandler.h"
+#include "CPEngSearchTransaction2Imp.h"
+#include "PEngWVSearchPanics.h"
+
+#include <CPEngSearchTransaction2.h>
+#include <MPEngSearchTransactionObserver2.h>
+#include <CPEngSearchCriteria2.h>
+#include <PEngPresenceEngineConsts2.h>
+#include <CPEngNWSessionSlotNotifier2.h>
+#include <CPEngNWSessionSlotEvent2.h>
+
+
+
+//MACROS
+#define RETURN_ERR_IF_NOT_READY()               \
+        {                                           \
+        if( IsActive() )                            \
+            {                                       \
+            return KErrInUse;                       \
+            }                                       \
+        \
+        if( iSearchState != EPEngSrch_Searching )   \
+            {                                       \
+            return KErrNotReady;                    \
+            }                                       \
+        }                                           \
+     
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::NewL()
+// -----------------------------------------------------------------------------
+CPEngSearchControl* CPEngSearchControl::NewL(
+    TInt aPriority,
+    const CPEngNWSessionSlotID2& aNWSessionSlotID,
+    const RPointerArray< CPEngSearchCriteria2 >& aCriterias,
+    TInt aSearchLimit,
+    MPEngSearchTransactionObserver2& aObserver )
+    {
+    CPEngSearchControl* self = new ( ELeave ) CPEngSearchControl( aPriority,
+                                                                  aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aPriority,
+                      aNWSessionSlotID,
+                      aCriterias,
+                      aSearchLimit );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::~CPEngSearchControl()
+// -----------------------------------------------------------------------------
+CPEngSearchControl::~CPEngSearchControl()
+    {
+    Cancel();
+
+    if ( iSlotNotifier )
+        {
+        iSlotNotifier->RemoveObserver( *this );
+        }
+    delete iSlotNotifier;
+
+    delete iSearchHandler;
+    delete iSearchSessionHandler;
+
+    delete iTransactionStatus;
+    delete iSearchResult;
+
+    if ( iOwner )
+        {
+        iOwner->HandleSearchDestruction( this );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::CPEngSearchControl()
+// -----------------------------------------------------------------------------
+CPEngSearchControl::CPEngSearchControl( TInt aPriority,
+                                        MPEngSearchTransactionObserver2& aObserver )
+        : CActive( aPriority ),
+        iObserver( aObserver ),
+        iTransactionOp( KErrNotFound ),
+        iCancelling( EFalse ),
+        iSearchState( EPEngSrch_Idle ),
+        iDelayedErr( KErrNone )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::ConstructL()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::ConstructL( TInt aPriority,
+                                     const CPEngNWSessionSlotID2& aNWSessionSlotID,
+                                     const RPointerArray< CPEngSearchCriteria2 >& aCriterias,
+                                     TInt aSearchLimit )
+    {
+    ValidateSearchCriteriasL( aCriterias );
+    iSearchResult = CPEngSearchResultEntry::NewL();
+
+    iSearchSessionHandler = CPEngSearchSessionHandler::NewL( aPriority,
+                                                             aNWSessionSlotID );
+    iSearchHandler = CPEngSearchHandler::NewL( aPriority,
+                                               iSearchSessionHandler->ImpsEngine(),
+                                               *iSearchResult,
+                                               aCriterias,
+                                               aSearchLimit );
+
+    iSlotNotifier = CPEngNWSessionSlotNotifier2::NewL( aPriority );
+    User::LeaveIfError( iSlotNotifier->AddObserver( *this ) );
+    User::LeaveIfError( iSlotNotifier->Start( aNWSessionSlotID ) );
+
+    iTransactionStatus = CPEngTransactionStatus::NewL();
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::SetOwner()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::SetOwner( CPEngSearchTransaction2Imp& aOwner )
+    {
+    iOwner = &aOwner;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::IssueSearch()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::IssueSearch()
+    {
+    iDelayedErr = KErrNone;
+    iTransactionOp = EPEngTransOpNetworkSearchStart;
+
+    TRAPD( err, iSearchSessionHandler->OpenCspSessionL( iStatus ) );
+    HandleStepIssued( EPEngSrch_OpeningCspSession, err );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::IssueContinueSearchFromNetwork()
+// -----------------------------------------------------------------------------
+TInt CPEngSearchControl::IssueContinueSearchFromNetwork( TInt aContinueIndex )
+    {
+    RETURN_ERR_IF_NOT_READY();
+
+    iDelayedErr = KErrNone;
+    iTransactionOp = EPEngTransOpNetworkSearchContinue;
+
+    TRAPD( err, iSearchHandler->ContinueSearchL( aContinueIndex, iStatus ) );
+    HandleStepIssued( EPEngSrch_Searching,
+                      err );
+
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::IssueStopSearchFromNetwork()
+// -----------------------------------------------------------------------------
+TInt CPEngSearchControl::IssueStopSearchFromNetwork()
+    {
+    RETURN_ERR_IF_NOT_READY();
+
+    iDelayedErr = KErrNone;
+    iTransactionOp = EPEngTransOpNetworkSearchStop;
+
+    TRAPD( err, iSearchHandler->StopSearchL( iStatus ) );
+    HandleStepIssued( EPEngSrch_StoppingSearch, err );
+
+    return KErrNone;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::RunL()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::RunL()
+    {
+    TInt err = iStatus.Int();
+
+    switch ( iSearchState )
+        {
+        case EPEngSrch_OpeningCspSession:
+            {
+            //Session open failed - close session
+            if ( err != KErrNone )
+                {
+                iDelayedErr = err;
+                TRAPD( err, iSearchSessionHandler->CloseCspSessionL( iStatus ) );
+                HandleStepIssued( EPEngSrch_ClosingCspSession, err );
+                }
+
+            else
+                {
+                TRAPD( err, iSearchHandler->SearchL( iStatus ) );
+                HandleStepIssued( EPEngSrch_Searching, err );
+                }
+            break;
+            }
+
+        case EPEngSrch_Searching:
+            {
+            DoNotifyObserver( err );
+            break;
+            }
+
+        case EPEngSrch_StoppingSearch:
+            {
+            iDelayedErr = err;
+            TRAPD( err, iSearchSessionHandler->CloseCspSessionL( iStatus ) );
+            HandleStepIssued( EPEngSrch_ClosingCspSession, err );
+            break;
+            }
+
+        case EPEngSrch_ClosingCspSession:
+            {
+            DoNotifyObserver( err );
+            delete this;
+            break;
+            }
+
+        default:
+            {
+            SearchPanicOrLeaveL( EPEngSearchControlRunStateMismatch, KErrGeneral );
+            break;
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::RunError()
+// -----------------------------------------------------------------------------
+TInt CPEngSearchControl::RunError( TInt /*aError*/ )
+    {
+    delete this;
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CPEngSearchControl::DoCancel()
+    {
+    delete iSearchHandler;
+    iSearchHandler = NULL;
+
+    delete iSearchSessionHandler;
+    iSearchSessionHandler = NULL;
+
+    DoNotifyObserver( KErrCancel );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::Cancel()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::Cancel()
+    {
+    if ( iCancelling )
+        {
+        return;
+        }
+
+    iCancelling = ETrue;
+    CActive::Cancel();
+    iCancelling = EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::HandleNWSessionSlotChangeL()
+// From MPEngNWSessionSlotObserver2
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::HandleNWSessionSlotChangeL(
+    CPEngNWSessionSlotNotifier2& /*aNotifier*/,
+    CPEngNWSessionSlotEvent2& aEvent )
+    {
+    if ( ( aEvent.Event() == EPEngEventAppNWPresenceSessionClosed ) ||
+         ( aEvent.Event() == EPEngEventNWSessionClosedByServer ) )
+        {
+        iSlotNotifier->RemoveObserver( *this );
+        AsyncTerminateSearch();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::HandleNWSessionSlotError()
+// From MPEngNWSessionSlotObserver2
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::HandleNWSessionSlotError(
+    TInt /*aError*/,
+    CPEngNWSessionSlotNotifier2& /*aNotifier*/ )
+    {
+    iSlotNotifier->RemoveObserver( *this );
+    AsyncTerminateSearch();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::AsyncTerminateSearch()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::AsyncTerminateSearch()
+    {
+    //Called when slots network session is closed
+    //==> Search operation must release owned WV Engine sessions
+
+    //This might be called when:
+    // 1. WV Engine session open is pending -> cancel open
+    // 2. Session open, search request pending on WV Engine side
+    // 3. Session open, no pending search request
+    // 4. Session open, search stop request pending on WV Engine side
+    // 5. Session open, session close pending on WV Engine side
+
+    //Cancel any pending operation
+    if ( IsActive() )
+        {
+        Cancel();
+        }
+
+    //And terminate the search
+    HandleStepIssued( EPEngSrch_ClosingCspSession, KErrCancel );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::ValidateSearchCriteriasL()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::ValidateSearchCriteriasL(
+    const RPointerArray< CPEngSearchCriteria2 >& aCriterias )
+    {
+    //Validate search elements & search values
+    const TInt criteriaCount( aCriterias.Count() );
+    if ( criteriaCount == 0 )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    TInt ii;
+    TInt jj;
+
+    //Verify all values
+    for ( ii = 0; ii < criteriaCount; ii++ )
+        {
+
+        if ( aCriterias[ii]->SearchValue().Length() == 0 )
+            {
+            User::Leave( KErrArgument );
+            }
+
+        if ( aCriterias[ii]->Element() == KPEngNullSearchElement )
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+
+
+    //Chechk  duplicates
+    for ( ii = 0; ii < criteriaCount - 1; ii++ )
+        {
+        for ( jj = ii + 1 ; jj < criteriaCount; jj++ )
+            {
+            if ( aCriterias[ii]->Element() == aCriterias[jj]->Element() )
+                {
+                User::Leave( KErrAlreadyExists );
+                }
+            }
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::DoNotifyObserver()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::DoNotifyObserver( TInt aErr )
+    {
+    //Don't notify client if no client issued transaction pending
+    if ( iTransactionOp == KErrNotFound )
+        {
+        return;
+        }
+
+    //Determine which error to report client
+    if ( iDelayedErr != KErrNone )
+        {
+        iTransactionStatus->SetStatus( iDelayedErr );
+        }
+    else
+        {
+        iTransactionStatus->SetStatus( aErr );
+        }
+
+    CPEngSearchTransaction2& transInterface = iOwner->Interface();
+
+
+    //Notify client
+    TRAPD( err, iObserver.HandleSearchTransactionCompleteL( *iTransactionStatus,
+                                                            transInterface,
+                                                            iSearchResult->Interface(),
+                                                            iTransactionOp ) );
+
+    if ( err != KErrNone )
+        {
+        iObserver.HandleSearchTransactionError( err,
+                                                transInterface,
+                                                iTransactionOp );
+        }
+
+    iTransactionOp = KErrNotFound;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngSearchControl::HandleStepIssued()
+// -----------------------------------------------------------------------------
+void CPEngSearchControl::HandleStepIssued( TPEngSearchState aState,
+                                           TInt aErr )
+    {
+    iSearchState = aState;
+    if ( aErr != KErrNone )
+        {
+        TRequestStatus* tmpStatus = &iStatus;
+        User::RequestComplete( tmpStatus, aErr );
+        }
+
+    SetActive();
+    }
+
+
+
+
+// End of file