diff -r 000000000000 -r 72b543305e3a messagingappbase/msgerrorwatcher/src/MsgLogsObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/msgerrorwatcher/src/MsgLogsObserver.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,417 @@ +/* +* 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: +* CMsgLogsObserver implementation file +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "MsgErrorWatcher.h" +#include "MsgLogsObserver.h" + +#include "MsgErrorWatcherLogging.h" + +// CONSTANTS +_LIT(KMmsLogEventTypeName, "MMS"); + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CMsgLogsObserver::CMsgLogsObserver +// +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CMsgLogsObserver::CMsgLogsObserver( CMsgErrorWatcher* aWatcher, RFs& aFs ) + : CActive( CActive::EPriorityStandard ), + iWatcher( aWatcher ), + iFs( aFs ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// CMsgLogsObserver::NewL +// +// Two-phased constructor. +// --------------------------------------------------------- +// +CMsgLogsObserver* CMsgLogsObserver::NewL( CMsgErrorWatcher* aWatcher, RFs& aFs ) + { + CMsgLogsObserver* self = new ( ELeave ) CMsgLogsObserver( aWatcher, aFs ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------- +// CMsgLogsObserver::~CMsgLogsObserver +// +// Destructor +// --------------------------------------------------------- +// +CMsgLogsObserver::~CMsgLogsObserver() + { + Cancel(); + if (iFilterList) + { + iFilterList->ResetAndDestroy(); // destroy old log filters + } + delete iFilterList; + delete iLogViewEvent; + delete iLogEvent; + delete iDummyLogEvent1; + delete iDummyLogEvent2; + delete iLogClient; + delete iLogEventType; + + } + +// --------------------------------------------------------- +// CMsgLogsObserver::ConstructL() +// +// Symbian OS default constructor can leave. +// --------------------------------------------------------- +// +void CMsgLogsObserver::ConstructL() + { + iLogClient = CLogClient::NewL( iFs ); + iLogEvent = CLogEvent::NewL(); + + iLogViewEvent = CLogViewEvent::NewL( *iLogClient, *this ); + iFilterList = new ( ELeave ) CLogFilterList(); + iLogClient->GetString( iDelivered, R_LOG_DEL_DONE ); + + + //AddNewEventType for dummy event + AddEventTypeL(); + } + +// --------------------------------------------------------- +// CMsgLogsObserver::AppendFiltersL +// --------------------------------------------------------- +// +void CMsgLogsObserver::AppendFiltersL() + { + CLogFilter* filter; + + /// Event Type: MMS + /// Status: Delivered + filter = CLogFilter::NewL(); + CleanupStack::PushL( filter ); + filter->SetEventType( KLogMmsEventTypeUid ); + filter->SetStatus( iDelivered ); + iFilterList->AppendL( filter ); + CleanupStack::Pop(); //filter + + // Event Type: MMS + // Status: Read + filter = CLogFilter::NewL(); + CleanupStack::PushL( filter ); + filter->SetEventType( KLogMmsEventTypeUid ); + filter->SetStatus( KLogsMsgReadText ); + iFilterList->AppendL( filter ); + CleanupStack::Pop(); //filter + return; + } + +// --------------------------------------------------------- +// CMsgLogsObserver::CreateFiltersL +// --------------------------------------------------------- +// +void CMsgLogsObserver::CreateFiltersL() + { +MEWLOGGER_WRITE( "CreateFiltersL()" ); + iState = EMsgLogsCreatingFilters; + AppendFiltersL(); + if( !IsActive() ) + { + if ( iLogViewEvent->SetFilterL( *iFilterList, iStatus ) ) + { + MEWLOGGER_WRITE( "Setting filter succesfully started" ); + SetActive(); + } + else + { + MEWLOGGER_WRITE( "Setting filter: CompleteSelf();" ); + CompleteSelf(); + } + } + } + +// --------------------------------------------------------- +// CMsgLogsObserver::DoCancel +// +// From active object framework +// --------------------------------------------------------- +// +void CMsgLogsObserver::DoCancel() + { + if ( iLogViewEvent ) + { + iLogViewEvent->Cancel(); + } + if ( iLogClient ) + { + iLogClient->Cancel(); + } + } + +// --------------------------------------------------------- +// CMsgLogsObserver::RunL +// +// From active object framework +// --------------------------------------------------------- +// +void CMsgLogsObserver::RunL() + { + switch ( iState ) + { + case EMsgLogsIdle: + MEWLOGGER_WRITE( "Idle state in RunL" ); + break; + case EMsgLogsGettingEvent: + { + MEWLOGGER_WRITE( "call ShowNoteL() in RunL" ); + TRAP_IGNORE( ShowNoteL() ); + iState = EMsgLogsIdle; + break; + } + case EMsgLogsDeletingDummyEvent1: + MEWLOGGER_WRITE( "call DeleteDummyEvent2() in RunL" ); + DeleteDummyEvent2(); + break; + case EMsgLogsDeletingDummyEvent2: + iState = EMsgLogsIdle; + break; + case EMsgLogsCreatingFilters: + MEWLOGGER_WRITE( "call DeleteDummyEvent1() in RunL" ); + DeleteDummyEvent1(); + break; + case EMsgLogsAddingEventType: + //Event type already exists + if ( iStatus.Int() == KErrAlreadyExists) + { + MEWLOGGER_WRITE( "Event type already exists in RunL" ); + //No need to create any dummy entrys + //This not first boot + iState = EMsgLogsAddingDummyEvent2; + CompleteSelf(); + } + else + { + MEWLOGGER_WRITE( "call AddDummyEvent1L() in RunL" ); + TRAP_IGNORE( AddDummyEvent1L() ); + } + break; + case EMsgLogsAddingDummyEvent1: + MEWLOGGER_WRITE( "call AddDummyEvent2L() in RunL" ); + TRAP_IGNORE( AddDummyEvent2L() ); + break; + case EMsgLogsAddingDummyEvent2: + MEWLOGGER_WRITE( "call CreateFiltersL() in RunL" ); + TRAP_IGNORE( CreateFiltersL() ); + break; + default: + // Nothing to do but wait. + iState = EMsgLogsIdle; + break; + } + } + +// --------------------------------------------------------- +// CMsgLogsObserver::HandleLogViewChangeEventAddedL +// --------------------------------------------------------- +// +void CMsgLogsObserver::HandleLogViewChangeEventAddedL(TLogId aId, TInt /*aViewIndex*/, TInt /*aChangeIndex*/, TInt /*aTotalChangeCount*/) + { + GetLogEventL( aId ); + } + +// --------------------------------------------------------- +// CMsgLogsObserver::HandleLogViewChangeEventChangedL +// --------------------------------------------------------- +// +void CMsgLogsObserver::HandleLogViewChangeEventChangedL(TLogId aId, TInt /*aViewIndex*/, TInt /*aChangeIndex*/, TInt /*aTotalChangeCount*/) + { + GetLogEventL( aId ); + } + +// --------------------------------------------------------- +// CMsgLogsObserver::HandleLogViewChangeEventDeletedL +// --------------------------------------------------------- +// +void CMsgLogsObserver::HandleLogViewChangeEventDeletedL(TLogId /*aId*/, TInt /*aViewIndex*/, TInt /*aChangeIndex*/, TInt /*aTotalChangeCount*/) + { + // We're not interested. + } + +// --------------------------------------------------------- +// CMsgLogsObserver::GetLogEventL +// --------------------------------------------------------- +// +void CMsgLogsObserver::GetLogEventL( TLogId aId ) + { + if ( !IsActive() ) + { + iState = EMsgLogsGettingEvent; + iLogEvent->SetId( aId ); + iLogClient->GetEvent( *iLogEvent, iStatus ); + SetActive(); + } + // else we missed this one! + } + +// --------------------------------------------------------- +// CMsgLogsObserver::Delivered +// --------------------------------------------------------- +// +void CMsgLogsObserver::ShowNoteL() + { + if ( iDelivered.Compare( iLogEvent->Status() ) == 0 && + !( iLogEvent->Flags() & KLogEventRead ) ) + { + iWatcher->ShowDeliveredNoteL( iLogEvent->RemoteParty() ); + } + else if ( iLogEvent->Status().Compare( KLogsMsgReadText ) == 0 && + !( iLogEvent->Flags() & KLogEventRead ) ) + { + iWatcher->ShowReadNoteL( iLogEvent->RemoteParty() ); + } + } + + +// --------------------------------------------------------- +// CMsgLogsObserver::AddEventTypeL +// +// --------------------------------------------------------- +// +void CMsgLogsObserver::AddEventTypeL() + { + iState = EMsgLogsAddingEventType; + if (!IsActive() ) + { + iLogEventType = CLogEventType::NewL(); + iLogEventType->SetUid( KLogMmsEventTypeUid ); + iLogEventType->SetDescription( KMmsLogEventTypeName ); + iLogEventType->SetLoggingEnabled( ETrue ); + iLogClient->AddEventType( *iLogEventType, iStatus ); + SetActive(); + } + } + +// --------------------------------------------------------- +// CMsgLogsObserver::AddDummyEvent1L +// +// --------------------------------------------------------- +// +void CMsgLogsObserver::AddDummyEvent1L() + { + iState = EMsgLogsAddingDummyEvent1; + if (!IsActive()) + { + iDummyLogEvent1 = CLogEvent::NewL(); + iDummyLogEvent1->SetEventType( KLogMmsEventTypeUid ); + iDummyLogEvent1->SetStatus( iDelivered ); + iLogClient->AddEvent( *iDummyLogEvent1, iStatus ); + SetActive(); + } + } + + +// --------------------------------------------------------- +// CMsgLogsObserver::AddDummyEvent2L +// +// --------------------------------------------------------- +// +void CMsgLogsObserver::AddDummyEvent2L() + { + iState = EMsgLogsAddingDummyEvent2; + if (!IsActive()) + { + iDummyLogEvent2 = CLogEvent::NewL(); + iDummyLogEvent2->SetEventType( KLogMmsEventTypeUid ); + iDummyLogEvent2->SetStatus( KLogsMsgReadText ); + iLogClient->AddEvent( *iDummyLogEvent2, iStatus ); + SetActive(); + } + } + +// --------------------------------------------------------- +// CMsgLogsObserver::DeleteDummyEvent1 +// +// --------------------------------------------------------- +// +void CMsgLogsObserver::DeleteDummyEvent1() + { + iState = EMsgLogsDeletingDummyEvent1; + if (!IsActive() && iDummyLogEvent1 ) + { + TLogId dummyId = iDummyLogEvent1->Id(); + iLogClient->DeleteEvent( dummyId, iStatus ); + SetActive(); + } + else + { + iState = EMsgLogsIdle; + CompleteSelf(); + } + } + +// --------------------------------------------------------- +// CMsgLogsObserver::DeleteDummyEvent2 +// +// --------------------------------------------------------- +// +void CMsgLogsObserver::DeleteDummyEvent2() + { + iState = EMsgLogsDeletingDummyEvent2; + if (!IsActive() && iDummyLogEvent2 ) + { + TLogId dummyId = iDummyLogEvent2->Id(); + iLogClient->DeleteEvent( dummyId, iStatus ); + SetActive(); + } + else + { + iState = EMsgLogsIdle; + CompleteSelf(); + } + } + +void CMsgLogsObserver::CompleteSelf() + { + // If no events complete self to get to RunL() + TRequestStatus* status = &iStatus; + iStatus = KRequestPending; + SetActive(); + User::RequestComplete( status, KErrNone ); + } + +// ================= OTHER EXPORTED FUNCTIONS ============== + +// End of File