messagingappbase/mce/logengsrc/MceLogPbkMatcher.cpp
branchRCL_3
changeset 60 7fdbb852d323
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mce/logengsrc/MceLogPbkMatcher.cpp	Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,297 @@
+/*
+* Copyright (c) 2002 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:  
+*     Defines methods for CMceLogPbkMatcher
+*
+*/
+
+
+
+// INCLUDE FILES
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <logfilterandeventconstants.hrh>
+#include <logengevents.h> 
+#endif
+#include <e32base.h>
+#include <CPbkContactEngine.h>
+#include <CPbkContactItem.h>
+#include <CPbkFieldsInfo.h>
+#include <logview.h>
+#include <logcli.h>
+
+#include "MceLogPbkMatcher.h"
+#include "MceLogPbkMatcherObserver.h"
+#include "MceLogEngine.hrh"
+
+#include "CPhoneNumberMatcher.h"
+#include <LogsApiConsts.h>
+
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+CMceLogPbkMatcher::CMceLogPbkMatcher(  
+    RFs& aFsSession,
+                    MMceLogPbkMatcherObserver* aObserver)
+                    : CActive( EPriorityHigh ),
+                    iFsSession( aFsSession ),
+                    iObserver( aObserver )
+    {
+    }
+
+
+CMceLogPbkMatcher* CMceLogPbkMatcher::NewL(   
+    RFs& aFsSession,
+                                        MMceLogPbkMatcherObserver* aObserver )
+    {
+    CMceLogPbkMatcher* self = new ( ELeave ) CMceLogPbkMatcher( 
+        aFsSession,
+        aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+void CMceLogPbkMatcher::ConstructL()
+    {
+    iReaderState = ECreated;
+    iLogClient = CLogClient::NewL( iFsSession );
+    iLogViewEvent = CLogViewEvent::NewL( *iLogClient, *this );
+    iEvent = CLogEvent::NewL();
+    SetFiltersL();
+    CActiveScheduler::Add( this );
+    iPbkS60Matcher = CPhoneNumberMatcher::NewL( iFsSession );
+    }
+
+
+CMceLogPbkMatcher::~CMceLogPbkMatcher()
+    {
+    Cancel();
+    delete iPbkS60Matcher;
+    delete iLogViewEvent;
+    delete iLogClient;
+    delete iEvent;
+    if( iFilterList )
+        {
+        iFilterList->ResetAndDestroy();
+        delete iFilterList;
+        }
+    }
+
+void CMceLogPbkMatcher::StartL()
+    {
+    Cancel();
+    
+    if ( iReaderState == ECreated || iReaderState == EOpeningDefaultMatchStores )
+        {
+        iPbkS60Matcher->OpenDefaultMatchStoresL( iStatus );
+        iReaderState = EOpeningDefaultMatchStores;
+        SetActive();
+        }
+    else
+        {
+        SetFiltersToLogsL();
+        }
+    }
+    
+void CMceLogPbkMatcher::SetFiltersToLogsL()
+    {
+    TBool rc = ( EFalse );
+    iReaderState = EFilteringEvent;
+
+    TRAPD( err, ( rc = iLogViewEvent->SetFilterL( *iFilterList, iStatus ) ) );
+    if( err )
+        {
+        if( err == KErrAccessDenied ) // backup active
+            {
+            return;
+            }
+        else 
+            {
+            User::Leave( err );
+            }
+        }
+
+    if( rc )
+        {
+        SetActive();
+        }
+    }
+
+
+void CMceLogPbkMatcher::SetFiltersL()
+    {
+    if( iFilterList )
+        {
+        iFilterList->ResetAndDestroy();
+        delete iFilterList;
+        iFilterList = NULL;
+        }
+    iFilterList = new ( ELeave ) CLogFilterList();
+
+    /// Event type: SMS
+    iFilterList->AppendL( SetOneFilterLC( KLogShortMessageEventTypeUid ) );
+    CleanupStack::Pop();    // filter set in SetOneFilterLC
+
+    /// Event type: MMS
+    iFilterList->AppendL( SetOneFilterLC( KLogsEngMmsEventTypeUid ) );
+    CleanupStack::Pop();
+
+    // Set filter with empty remote party
+    CLogFilter* filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetNullFields( ELogRemotePartyField );
+    iFilterList->AppendL( filter );
+    CleanupStack::Pop();    // filter
+    }
+
+
+CLogFilter* CMceLogPbkMatcher::SetOneFilterLC( TUid aFilterType )
+    {
+    CLogFilter* filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetEventType( aFilterType ); // certain type;
+    filter->SetFlags( KLogEventContactSearched ); // no flag or remoteparty
+    filter->SetFlags( KLogEventRead ); // event has not been cleared
+    filter->SetNullFields( ELogFlagsField | ELogRemotePartyField );
+    return filter;
+    }
+
+
+
+void CMceLogPbkMatcher::DoCancel()
+    {
+    iPbkS60Matcher->CancelOperation();
+    iLogClient->Cancel();
+    iLogViewEvent->Cancel();
+    }
+
+
+TBool CMceLogPbkMatcher::GetRemotePartyL()
+    {
+    TBool result (EFalse );
+    if( iPbkS60Matcher->MatchCountL( iEvent->Number()) == 1 )
+        {
+        result = ETrue;
+        }
+    return result;
+    }
+
+void CMceLogPbkMatcher::RunL()
+    {
+
+    if( iStatus == KErrNone )
+        {
+        switch( iReaderState )
+            {
+            case EOpeningDefaultMatchStores:
+                // now stores are open, continue with filtering
+                SetFiltersToLogsL();
+            break;
+            case EFilteringEvent:
+                if( iLogViewEvent->FirstL( iStatus ) )
+                    {
+                    iReaderState = EReadingEvent;
+                    SetActive();
+                    }
+                else if( iObserver )
+                    {
+//                    iObserver->PbkMatchingDoneL();
+                    }
+
+                break;
+
+            case EReadingEvent:
+
+                iEvent->CopyL( iLogViewEvent->Event() );
+                iEvent->SetFlags( KLogEventContactSearched ); 
+                if( GetRemotePartyL() )
+                    {
+                    iEvent->SetRemoteParty( iPbkS60Matcher->GetUniqueName() );
+                    }
+                iReaderState = EUpdatingEvent;
+                iLogClient->ChangeEvent( *iEvent, iStatus );
+                SetActive();
+                break;
+
+            case EUpdatingEvent:
+
+                if( iLogViewEvent->FirstL( iStatus ) )
+                    {
+                    iReaderState = EReadingEvent;
+                    SetActive();
+                    }
+
+                else if( iObserver )
+                    {
+//                    iObserver->PbkMatchingDoneL();
+                    }
+
+                break;
+
+            default:
+                break;
+
+            }
+        }
+    else if ( iReaderState == EOpeningDefaultMatchStores )
+        {
+        iReaderState = ECreated;
+        }
+    }
+
+TInt CMceLogPbkMatcher::RunError(TInt aError)
+    {
+    if( aError == KErrAccessDenied || aError == KErrInUse ) // backup active
+        {
+        return KErrNone;
+        }
+    else
+        {
+        return aError;
+        }
+    }
+
+void CMceLogPbkMatcher::HandleLogViewChangeEventAddedL(
+                TLogId /*aId*/,   
+                TInt /*aViewIndex*/, 
+                TInt /*aChangeIndex*/, 
+                TInt /*aTotalChangeCount*/)
+    {
+    StartL();
+    }
+
+void CMceLogPbkMatcher::HandleLogViewChangeEventChangedL(
+                TLogId /*aId*/,   
+                TInt /*aViewIndex*/, 
+                TInt /*aChangeIndex*/, 
+                TInt /*aTotalChangeCount*/)
+    {
+    StartL();
+    }
+
+void CMceLogPbkMatcher::HandleLogViewChangeEventDeletedL(
+                TLogId /*aId*/,   
+                TInt /*aViewIndex*/, 
+                TInt /*aChangeIndex*/, 
+                TInt /*aTotalChangeCount*/)
+    {
+    StartL();
+    }
+
+
+// End of File
+