logsui/EngineSrc/CLogsMainReader.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/EngineSrc/CLogsMainReader.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,448 @@
+/*
+* 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: 
+*     Main list reader
+*
+*/
+
+
+// INCLUDE FILES
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <logengevents.h>
+#include <logfilterandeventconstants.hrh>
+#endif
+#include <logview.h>
+#include "CLogsMainReader.h"
+#include "MLogsObserver.h"
+#include "MLogsEvent.h"
+#include "MLogsReaderConfig.h"
+#include "LogsApiConsts.h"  //additional event uids
+#include "MLogsEventArray.h"
+// CONSTANTS
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::NewL
+// ----------------------------------------------------------------------------
+//
+CLogsMainReader* CLogsMainReader::NewL(
+    RFs& aFsSession,
+    MLogsEventArray& aEventArray,
+    TLogsEventStrings& aStrings,
+    TLogsModel aModelId,
+    MLogsObserver* aObserver,
+    CLogsEngine* aLogsEngineRef )
+    {
+    CLogsMainReader* self = new (ELeave) CLogsMainReader
+                                        (   aFsSession
+                                        ,   aEventArray
+                                        ,   aStrings
+                                        ,   aModelId
+                                        ,   aObserver
+                                        ,   aLogsEngineRef
+                                        );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::CLogsMainReader
+// ----------------------------------------------------------------------------
+//
+CLogsMainReader::CLogsMainReader(
+    RFs& aFsSession,
+    MLogsEventArray& aEventArray,
+    TLogsEventStrings& aStrings,
+    TLogsModel aModelId,
+    MLogsObserver* aObserver,
+    CLogsEngine* aLogsEngineRef ) :
+        CLogsBaseReader(
+            aFsSession,
+            aEventArray,
+            aStrings,
+            aModelId,
+            aObserver,
+            aLogsEngineRef )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::~CLogsMainReader
+// ----------------------------------------------------------------------------
+//
+CLogsMainReader::~CLogsMainReader()
+    {
+    Cancel();    
+    delete iLogViewEvent;
+
+    if( iFilterList )
+        {
+        iFilterList->ResetAndDestroy();
+        delete iFilterList;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::DoCancel
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::DoCancel()
+    {
+    CLogsBaseReader::DoCancel();    
+    iLogViewEvent->Cancel();
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::ConstructL()
+    {
+    BaseConstructL();   
+    iLogClientRef->SetGlobalChangeObserverL( this );
+    iLogViewEvent = CLogViewEvent::NewL( *iLogClientRef, *this );
+    CActiveScheduler::Add( this ); 
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::DoNextL
+// ----------------------------------------------------------------------------
+//
+TBool CLogsMainReader::DoNextL()
+    {
+    TBool rc( EFalse );
+
+    switch( iPhase )
+        {
+        case ERead:
+            rc = iLogViewEvent->NextL( iStatus );
+            break;
+
+        case EFilter:
+            rc = iLogViewEvent->FirstL( iStatus );
+            if( rc )
+                {
+                iPhase = ERead;
+                
+                }
+            else
+                {
+                iPhase = EDone;
+                iObserver->StateChangedL( this );
+                }
+            break;
+
+        default:
+            break;
+        } 
+
+    return rc;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::SetOneFilterLC
+// ----------------------------------------------------------------------------
+//
+CLogFilter* CLogsMainReader::SetOneFilterLC( TUid aFilterType )
+    {
+    CLogFilter* filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetEventType( aFilterType );
+
+    //For message type events we only include events that have already been 
+    //searched for remoty party information (CLogsSMSEventUpdater::RunL)
+    if( aFilterType == KLogShortMessageEventTypeUid || 
+        aFilterType == KLogsEngMmsEventTypeUid )
+        {
+        filter->SetFlags( KLogEventContactSearched );
+        }
+    return filter;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::SetOneFilterLC
+// ----------------------------------------------------------------------------
+//
+CLogFilter* CLogsMainReader::SetOneFilterLC( TLogString& aDirection )
+    {
+    CLogFilter* filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetDirection( aDirection );
+    return filter;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::SetOneFilterLC
+// ----------------------------------------------------------------------------
+//
+CLogFilter* CLogsMainReader::SetOneFilterLC(
+    const TDesC* aNumber,
+    const TDesC* aName )
+    {
+    CLogFilter* filter = CLogFilter::NewL();
+    CleanupStack::PushL( filter );
+    
+    if( aNumber->Length() > 0 )
+        {
+        filter->SetNumber( *aNumber );
+        }
+    else
+        {
+        filter->SetNullFields( ELogNumberField );
+        }
+        
+    if( aName->Length() > 0 )
+        {
+        filter->SetRemoteParty( *aName );
+        }
+    else
+        {
+        filter->SetNullFields( ELogRemotePartyField );
+        }
+        
+    return filter;
+    }    
+
+
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::SetFilterL
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::SetFilterL(
+    const TLogsFilter aFilter,
+    const TDesC* aNumber,
+    const TDesC* aName )
+    {
+    //We first empty the event array so that listing new filtered entries in the UI will always start from
+    //beginning of an empty list without any old entries. This is because user may very quickly scroll to end 
+    //of list in UI by scrolling up in the top of the list. This may cause problems because old lines will be 
+    //soon deleted or replaced by new filtered lines.
+    iEventArray.Reset();
+
+    if( iFilterList )
+        {
+        iFilterList->ResetAndDestroy();
+        delete iFilterList;
+        iFilterList = NULL;
+        }
+        
+    iFilterList = new ( ELeave ) CLogFilterList;
+
+    switch( aFilter )
+        {
+        case ELogsFilterVoice:
+            iFilterList->AppendL( SetOneFilterLC( KLogCallEventTypeUid ) );
+            CleanupStack::Pop();
+            //Show also Poc info events here
+            iFilterList->AppendL( SetOneFilterLC( KLogsEngPocInfoEventTypeUid ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterData:
+            iFilterList->AppendL( SetOneFilterLC( KLogDataEventTypeUid ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterMessages:
+            iFilterList->AppendL( SetOneFilterLC( KLogShortMessageEventTypeUid ) );
+            CleanupStack::Pop();
+            // Mms events not (yet) logged to log db:
+            // iFilterList->AppendL( SetOneFilterLC( KLogsEngMmsEventTypeUid ) );
+            // CleanupStack::Pop();
+            break;
+
+        case ELogsFilterPacket:
+            iFilterList->AppendL( SetOneFilterLC( KLogPacketDataEventTypeUid ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterWlan:
+            iFilterList->AppendL( SetOneFilterLC( KLogsEngWlanEventTypeUid ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterPerson:
+            iFilterList->AppendL( SetOneFilterLC( aNumber, aName ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterIncoming:
+            iFilterList->AppendL( SetOneFilterLC( iStrings.iInDirection ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( iStrings.iInDirectionAlt ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterOutgoing:
+            iFilterList->AppendL( SetOneFilterLC( iStrings.iOutDirection ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( iStrings.iOutDirectionAlt ) );
+            CleanupStack::Pop();
+            break;
+
+        case ELogsFilterAllComms:
+            iFilterList->AppendL( SetOneFilterLC( KLogShortMessageEventTypeUid ) );
+            CleanupStack::Pop();
+            // Mms events not (yet) logged to log db:            
+            // iFilterList->AppendL( SetOneFilterLC( KLogsEngMmsEventTypeUid ) );
+            // CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( KLogCallEventTypeUid ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( KLogDataEventTypeUid ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( KLogFaxEventTypeUid ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( KLogPacketDataEventTypeUid ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( KLogsEngWlanEventTypeUid ) );
+            CleanupStack::Pop();
+            iFilterList->AppendL( SetOneFilterLC( KLogsEngPocInfoEventTypeUid ) );
+            CleanupStack::Pop();
+            break;
+
+        default:            
+            break;
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::Stop
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::Stop()
+    {
+    Cancel();
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::StartL
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::StartL()
+    {
+    iIndex = 0;
+    Cancel();
+    iDirty = EFalse;
+    iInterrupted = EFalse;
+   
+    TBool rc( EFalse );
+
+    if( ! iFilterList )
+        {
+        // opened first time
+        SetFilterL( ELogsFilterAllComms );
+        }
+
+    if( iFilterList )
+        {
+        TRAPD(  err
+             ,  rc = iLogViewEvent->SetFilterParseFilterByFilterL
+                                        (   *iFilterList
+                                        ,   iStatus
+                                        )
+             );
+        if( err == KErrAccessDenied )
+            {
+            iDirty = ETrue;
+            return;
+            }
+        User::LeaveIfError(err);
+        }
+    
+    if( rc )
+        {
+        iPhase = EFilter;
+        iState = EStateInitializing;
+        SetActive();
+        }
+    else if( iObserver )
+        {
+        iEventArray.Reset();
+        iPhase = EDone;
+        iState = EStateFinished;
+        iObserver->StateChangedL( this );
+        }
+    } 
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::ConfigureL
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::ConfigureL( const MLogsReaderConfig* aConfig ) 
+    {
+    SetFilterL
+        (   aConfig->Filter()
+        ,   &aConfig->Number()
+        ,   &aConfig->RemoteParty()
+        );
+    }
+       
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::ViewCountL
+// ----------------------------------------------------------------------------
+//
+TInt CLogsMainReader::ViewCountL() const
+    {
+    return iLogViewEvent->CountL();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::Event
+// ----------------------------------------------------------------------------
+//
+CLogEvent& CLogsMainReader::Event() const
+    {
+    //The RVCT compiler provides warnings "type qualifier on return type is meaningless"
+    //for functions that return const values. In order to avoid these numerous warnings and 
+    //const cascading, the CLogEvent is const_casted here.
+    return const_cast<CLogEvent&>( iLogViewEvent->Event() );
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::ConstructEventL
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::ConstructEventL(
+    MLogsEvent& aDest,
+    const CLogEvent& aSource )
+    {
+    BaseConstructEventL( aDest, aSource );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsMainReader::HandleLogClientChangeEventL
+//
+// Called by Log Database engine when it notifies a change in database (e.g.
+// Log database cleared)
+// ----------------------------------------------------------------------------
+//
+void CLogsMainReader::HandleLogClientChangeEventL(
+    TUid aChangeType,
+    TInt /*aChangeParam1*/,
+    TInt /*aChangeParam2*/,
+    TInt /*aChangeParam3*/ )
+    {
+    if( aChangeType == KLogClientChangeEventLogCleared )
+        {
+        HandleViewChangeL();
+        }
+    }