diff -r 000000000000 -r e686773b3f54 logsui/EngineSrc/CLogsClearDuplicates.cpp --- /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 +#endif +#include +#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; + + }