messagingappbase/mce/logengsrc/MceLogEngineReader.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mce/logengsrc/MceLogEngineReader.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,307 @@
+/*
+* 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:  
+*     Messaging Centre application's engine class that reads events from
+*     log DB.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <logfilterandeventconstants.hrh>
+#endif
+#include <coemain.h>            // for CCoeEnv
+#include <logview.h>            // CLogViewEvent
+#include "DllMain.h"			// panic function
+#include "MceLogEngineReader.h"
+#include <LogsApiConsts.h>
+
+// ================= MEMBER FUNCTIONS =======================
+
+CMceLogEngineReader::CMceLogEngineReader(
+    CMceLogEngine* aObserver)
+    : CActive(EPriorityStandard),
+      iObserver(aObserver)
+    {
+    }
+
+CMceLogEngineReader* CMceLogEngineReader::NewL(
+    CMceLogEngine* aObserver)
+    {
+    CMceLogEngineReader* self = new (ELeave) CMceLogEngineReader(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+void CMceLogEngineReader::ConstructL()
+    {
+    User::LeaveIfError(iFsSession.Connect());
+    iLogClient = CLogClient::NewL(iFsSession);
+    iLogViewEvent = CLogViewEvent::NewL(*iLogClient, *this);
+    SetSpecialFilterL();
+    CActiveScheduler::Add(this);
+    }
+
+CMceLogEngineReader::~CMceLogEngineReader()
+    {
+    Cancel();
+
+    delete iLogViewEvent;
+    delete iLogClient;
+
+    iFsSession.Close();
+
+    if (iFilterList)
+        {
+        iFilterList->ResetAndDestroy();
+        delete iFilterList;
+        }
+    }
+
+
+void CMceLogEngineReader::StartReadingL()
+    {
+    Cancel();
+    iEventCounter = 0;
+    iEventsInView = 0;
+    iArrayReset = EFalse;
+
+    if( iLogViewEvent->SetFilterL(*iFilterList, iStatus) )
+        {
+        iReaderState = ESettingFilter;
+        SetActive();
+        }
+    else if( iObserver )
+        {
+        iObserver->ResetArray();
+        iObserver->ReadEventsCompletedL();
+        }
+    }
+
+
+void CMceLogEngineReader::DoCancel()
+    {
+    /// cancel filter setting or event reading
+    iLogViewEvent->Cancel();
+    }
+
+TInt CMceLogEngineReader::RunError(TInt aError)
+    {
+    if( aError == KErrAccessDenied )
+        {
+        return KErrNone;
+        }
+    else
+        {
+        return aError;
+        }
+    }
+
+
+void CMceLogEngineReader::RunL()
+    {
+    CLogEvent* event;
+
+    if (iStatus != KErrNone)
+        {
+        // reading entries failed somehow.
+        iObserver->ReadEventsCompletedL( EFalse );
+        }
+    else
+        {
+        switch (iReaderState)
+            {
+            /// filter setting asyncronous request completed
+            case ESettingFilter:
+
+                if (iLogViewEvent->CountL() == 0)
+                    {
+                    iObserver->ResetArray();
+                    iObserver->ReadEventsCompletedL();
+                    }
+                else
+                    {
+                    /// start first event reading asyncronous request
+                    iReaderState = EReadingEntry;
+                    iLogViewEvent->FirstL(iStatus);
+                    SetActive();
+                    }
+                break;
+
+            /// event reading asyncronous request completed
+            case EReadingEntry:
+
+                if( ! iArrayReset )
+                    {
+                    iArrayReset = ETrue;
+                    iObserver->ResetArray();
+                    }
+
+                event = CLogEvent::NewL();
+                CleanupStack::PushL( event );
+                event->CopyL(iLogViewEvent->Event());
+
+                iEventsInView++;
+
+                if( event->Number().Length() || event->RemoteParty().Length() )
+                    {
+                    iObserver->AddEventToListL( event );
+                    CleanupStack::Pop(); // event
+                    iEventCounter++;
+                    }
+                else
+                    {
+                    CleanupStack::PopAndDestroy(); // event
+                    }
+
+                if ( iEventsInView < iLogViewEvent->CountL() &&
+                                        iEventCounter < KMceLogEngFetchLimit )
+                    {
+                    /// read next event
+                    iLogViewEvent->NextL( iStatus );
+                    SetActive();
+                    }
+                else
+                    {
+                    /// inform observer, that reading is done
+                    iObserver->ReadEventsCompletedL();
+                    }
+                break;
+
+            default:
+                break;
+
+                }
+            }
+    }
+
+
+void CMceLogEngineReader::SetSpecialFilterL()
+    {
+    /// create filter array to pass through only
+    /// events needed in Delivery Report
+
+    CLogFilter* filter;
+
+    if( iFilterList )
+        {
+        iFilterList->ResetAndDestroy();
+        delete iFilterList;
+        iFilterList = NULL;
+        }
+    iFilterList = new (ELeave) CLogFilterList();
+
+    /// Direction: OUT
+    TLogString inOutName;
+    iLogClient->GetString(inOutName, R_LOG_DIR_OUT);
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetDirection(inOutName);
+    filter->SetFlags( KLogEventRead );
+    filter->SetNullFields( ELogFlagsField );
+    iFilterList->AppendL(filter);
+    CleanupStack::Pop(); //filter
+
+    /// Event Type: SMS
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetEventType(KLogShortMessageEventTypeUid);
+    iFilterList->AppendL(filter);
+    CleanupStack::Pop(); //filter
+
+    /// Event Type: MMS
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetEventType( KLogsEngMmsEventTypeUid );
+    iFilterList->AppendL(filter);
+    CleanupStack::Pop(); //filter
+
+    /// Status: Pending
+    TLogString pending;
+    iLogClient->GetString(pending, R_LOG_DEL_PENDING);
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetStatus( pending );
+    iFilterList->AppendL(filter);
+    CleanupStack::Pop(); //filter
+
+    /// Status: Delivered
+    TLogString done;
+    iLogClient->GetString(done, R_LOG_DEL_DONE);
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetStatus( done );
+    iFilterList->AppendL(filter);
+    CleanupStack::Pop(); //filter
+
+    /// Status: Failed
+    TLogString failed;
+    iLogClient->GetString(failed, R_LOG_DEL_FAILED);
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetStatus( failed );
+    iFilterList->AppendL(filter);
+    CleanupStack::Pop(); //filter
+      
+    /// Event Type: MMS
+    /// Status: Read
+    filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetEventType( KLogsEngMmsEventTypeUid );
+    filter->SetStatus( KLogsMsgReadText );
+    iFilterList->AppendL( filter );
+    CleanupStack::Pop(); //filter
+
+    }
+
+void CMceLogEngineReader::HandleLogViewChangeEventAddedL(
+                TLogId /*aId*/,   
+                TInt /*aViewIndex*/, 
+                TInt /*aChangeIndex*/, 
+                TInt /*aTotalChangeCount*/ )
+    {
+    StartReadingL();
+    }
+
+void CMceLogEngineReader::HandleLogViewChangeEventChangedL(
+                TLogId /*aId*/,   
+                TInt /*aViewIndex*/, 
+                TInt /*aChangeIndex*/, 
+                TInt /*aTotalChangeCount*/ )
+    {
+    StartReadingL();
+    }
+
+void CMceLogEngineReader::HandleLogViewChangeEventDeletedL(
+                TLogId /*aId*/,   
+                TInt /*aViewIndex*/, 
+                TInt /*aChangeIndex*/, 
+                TInt /*aTotalChangeCount*/ )
+    {
+    StartReadingL();
+    }
+
+void CMceLogEngineReader::ClearDrListL()
+    {
+    __ASSERT_DEBUG( iLogViewEvent, LogsEnginePanic( ELogsEnginePanicPreCond ) );
+    iLogViewEvent->SetFlagsL( KLogEventRead );
+    StartReadingL();
+    }
+
+// End of file