--- /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();
+ }
+ }