--- /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 <e32base.h>
+#include <logcli.h>
+#include <logview.h>
+#include <mmsconst.h>
+#include <LogsApiConsts.h>
+#include <AknGlobalNote.h>
+
+#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