--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/EngineSrc/CLogsClearDuplicates.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,243 @@
+/*
+* 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:
+* Recent list duplicate cleaner
+*
+*/
+
+
+// INCLUDE FILES
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <logfilterandeventconstants.hrh>
+#endif
+#include <logview.h>
+#include "CLogsClearDuplicates.h"
+
+// MODULE DATA STRUCTURES
+
+
+// CONSTANTS
+
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::NewL
+// ----------------------------------------------------------------------------
+//
+CLogsClearDuplicates* CLogsClearDuplicates::NewL( RFs& aFsSession )
+ {
+ CLogsClearDuplicates* self = new (ELeave) CLogsClearDuplicates( aFsSession );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::CLogsClearDuplicates
+// ----------------------------------------------------------------------------
+//
+CLogsClearDuplicates::CLogsClearDuplicates( RFs& aFsSession ) :
+ CActive( EPriorityStandard ),
+ iFsSession( aFsSession )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::ConstructL()
+ {
+ iLogClient = CLogClient::NewL( iFsSession );
+
+ // Initialize database view for log events having "read" flag unset
+ iFlagClearView = CLogViewRecent::NewL( *iLogClient, *this );
+ iFilterFlagClear = CLogFilter::NewL();
+ iFilterFlagClear->SetFlags( KLogEventRead );
+ iFilterFlagClear->SetNullFields( ELogFlagsField );
+
+ // Initialize database view for log events having "ALS" flag set
+ iFlagClearViewALS = CLogViewRecent::NewL( *iLogClient, *this );
+ iFilterFlagClearALS = CLogFilter::NewL();
+ iFilterFlagClearALS->SetFlags( KLogEventALS );
+ iClearViewALSIsSet = EFalse;
+
+ CActiveScheduler::Add( this );
+ SetFlagClearViewL();
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::~CLogsClearDuplicates
+// ----------------------------------------------------------------------------
+//
+CLogsClearDuplicates::~CLogsClearDuplicates()
+ {
+ Cancel();
+ delete iFlagClearView;
+ delete iFilterFlagClear;
+
+ delete iFlagClearViewALS;
+ delete iFilterFlagClearALS;
+
+ delete iLogClient;
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::DoCancel
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::DoCancel()
+ {
+ if( iFlagClearView )
+ {
+ iFlagClearView->Cancel();
+ }
+
+ if( iFlagClearViewALS )
+ {
+ iFlagClearViewALS->Cancel();
+ }
+
+ if( iLogClient )
+ {
+ iLogClient->Cancel();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::RunL
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::RunL()
+ {
+ // If iClearViewALSIsSet is false, the asynchronous request made in
+ // SetFlagClearViewL is finished. So we can proceed to call SetFlagClearViewALSL.
+ if ( !iClearViewALSIsSet )
+ {
+ SetFlagClearViewALSL();
+ }
+
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::SetFlagClearViewALSL
+//
+// Note: this will only get called if CLogsClearDuplicates::SetFlagClearViewL()
+// calls SetActive (there are unread events in the view)
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::SetFlagClearViewALSL()
+ {
+ Cancel();
+
+ if( iFlagClearViewALS->SetRecentListL( ELogsMissedModel, *iFilterFlagClearALS, iStatus ))
+ {
+ iClearViewALSIsSet = ETrue; // Set to ETrue, so RunL won't call this again
+ SetActive();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::SetFlagClearViewL
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::SetFlagClearViewL()
+ {
+ Cancel();
+
+ if( iFlagClearView->SetRecentListL( ELogsMissedModel, *iFilterFlagClear, iStatus ) )
+ {
+ SetActive();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::HandleLogViewChangeEventAddedL
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::HandleLogViewChangeEventAddedL(
+ TLogId /*aId*/,
+ TInt /*aViewIndex*/,
+ TInt /*aChangeIndex*/,
+ TInt aTotalChangeCount )
+ {
+ if( aTotalChangeCount && !IsActive() )
+ {
+ iClearViewALSIsSet = EFalse;
+ SetFlagClearViewL();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::HandleLogViewChangeEventChangedL
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::HandleLogViewChangeEventChangedL(
+ TLogId /*aId*/,
+ TInt /*aViewIndex*/,
+ TInt /*aChangeIndex*/,
+ TInt /*aTotalChangeCount*/ ) // no need to do anything in change notification
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::HandleLogViewChangeEventDeletedL
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::HandleLogViewChangeEventDeletedL(
+ TLogId /*aId*/,
+ TInt /*aViewIndex*/,
+ TInt /*aChangeIndex*/,
+ TInt /*aTotalChangeCount*/ ) // no need to do anything in delete notification
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CLogsClearDuplicates::ClearDuplicatesL
+// ----------------------------------------------------------------------------
+//
+void CLogsClearDuplicates::ClearDuplicatesL(
+ TBool aDuplicates,
+ CLogViewRecent* aView )
+ {
+ // aDuplicates is true if there are events in missed view that have duplicates.
+ // Clear all duplicates from provided CLogViewRecent
+ if( aDuplicates && aView )
+ {
+ aView->ClearDuplicatesL();
+ }
+
+
+ // First flag all "not read" events to the secondary number (ALS) as "read".
+ // This has to be done separately cause just calling
+ // iFlagClearView->SetFlagsL(KLogEventRead) below would overwrite the ALS flag.
+ if( aView && iFlagClearViewALS->CountL() )
+ {
+ iFlagClearViewALS->SetFlagsL( KLogEventRead | KLogEventALS );
+ }
+
+ //Then flag all remaining "not read" events to "read" status. The "read" flag needs to be set
+ //to prevent the already processd duplicates to show up later again. This is
+ //because an existing event turn to be a duplicate again if a new similar event
+ //is later inserted to db. So ClearDuplicatesL() just is not enough for this.
+ if( aView && iFlagClearView->CountL() )
+ {
+ iFlagClearView->SetFlagsL( KLogEventRead );
+ }
+
+ //
+ iClearViewALSIsSet = EFalse;
+
+ }