diff -r ebe688cedc25 -r 7fdbb852d323 messagingappbase/mce/logengsrc/MceLogEngineReader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/mce/logengsrc/MceLogEngineReader.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -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 +#endif +#include // for CCoeEnv +#include // CLogViewEvent +#include "DllMain.h" // panic function +#include "MceLogEngineReader.h" +#include + +// ================= 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