--- /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