messagingappbase/msgerrorwatcher/src/MsgLogsObserver.cpp
changeset 0 72b543305e3a
--- /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