diff -r 000000000000 -r 72b543305e3a messagingappbase/mce/src/MceChangeFlagOperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/mce/src/MceChangeFlagOperation.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,256 @@ +/* +* Copyright (c) 2003 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: +* Changes message flag. +* +*/ + + + +// INCLUDE FILES +#include "MceChangeFlagOperation.h" // header + +#include // KMsvRootIndexEntryId + +// CONSTANTS + +_LIT8 ( KMceSpace8, " " ); // 8 bit space + + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------- +// CMceRemoveNewFlag::NewL +// Two-phased constructor. +// ---------------------------------------------------- +CMceRemoveNewFlag* CMceRemoveNewFlag::NewL( + TUint32 aRemoveFlags, + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + CMsvEntrySelection* aSelection ) + { + CMceRemoveNewFlag* self=new (ELeave) CMceRemoveNewFlag( + aRemoveFlags, aMsvSession, aObserverRequestStatus, KMsvRootIndexEntryId, aSelection ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::CMceRemoveNewFlag +// Constructor. +// ---------------------------------------------------- +CMceRemoveNewFlag::CMceRemoveNewFlag( + TUint32 aRemoveFlags, + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + TMsvId aFolderId, + CMsvEntrySelection* aSelection ) + : + CMsvOperation(aMsvSession, CActive::EPriorityStandard, aObserverRequestStatus), + iFolderId( aFolderId ), + iEntrySelection( aSelection ), + iBlank( KMceSpace8 ) + { + CActiveScheduler::Add( this ); + iRemoveFlags.SetMceFlag( aRemoveFlags ); + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::~CMceRemoveNewFlag +// Destructor. +// ---------------------------------------------------- +CMceRemoveNewFlag::~CMceRemoveNewFlag() + { + Cancel(); + delete iOperation; + delete iEntry; + delete iEntrySelection; + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::ConstructL +// Constructor.. +// ---------------------------------------------------- +void CMceRemoveNewFlag::ConstructL() + { + iCount = iEntrySelection->Count(); + iEntry = CMsvEntry::NewL( iMsvSession, iFolderId, TMsvSelectionOrdering() ); + + if ( iEntrySelection->Count() == 0 ) + { + iStatus=KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + else + { + TMsvId serviceId; // not used + TMsvEntry entry; + for ( TInt loop=iCount-1; loop>=0; loop-- ) + { + const TMsvId id = iEntrySelection->At( loop ); + User::LeaveIfError( iMsvSession.GetEntry( id, serviceId, entry ) ); + DeleteFromSelection( loop, entry.Unread() ); + } + if ( iEntrySelection->Count() > 0 ) + { + RemoveNextNewFlagL(); + } + else + { + //all were read + iStatus=KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + } + } + +// +// ---------------------------------------------------------------------------- +// CMceRemoveNewFlag::DeleteFromSelection() +// ---------------------------------------------------------------------------- +// +void CMceRemoveNewFlag::DeleteFromSelection( TInt aIndex, TBool aUnread ) + { + // Remove from selection, + // when read and setting to read or + // when unread and setting to unread + if ( iRemoveFlags.MceFlag( + EMceRemoveEntryFlagUnread ) && !aUnread || + iRemoveFlags.MceFlag( + EMceRemoveEntryFlagNew ) && aUnread ) //Changed from EMceRestoreEntryFlagRead + { + //remove read entries from selection + iEntrySelection->Delete( aIndex ); + } + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::RemoveNextNewFlagL +// Starts handling next message to mark it read. +// ---------------------------------------------------- +void CMceRemoveNewFlag::RemoveNextNewFlagL() + { + delete iOperation; + iOperation = NULL; + + TMsvId serviceId; // not used + TMsvEntry entry; + const TMsvId id = iEntrySelection->At( 0 ); + User::LeaveIfError( iMsvSession.GetEntry( id, serviceId, entry ) ); + + TRAPD( err, MakeNextRemoveL() ); + + // whether error or not, remove the data for this operation + iEntrySelection->Delete( 0 ); + // and set active + iStatus=KRequestPending; + SetActive(); + // if error then complete this pass with the error code + if ( err ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + } + + +// ---------------------------------------------------- +// CMceRemoveNewFlag::MakeNextRemoveL +// Marks message read. +// ---------------------------------------------------- +void CMceRemoveNewFlag::MakeNextRemoveL() + { + iEntry->SetEntryL( (*iEntrySelection)[0] ); + iNewEntry = iEntry->Entry(); + + // In no case that mce should set a message new + // it used to be "!iRemoveFlags.MceFlag( EMceRemoveEntryFlagNew )" for some unknown reason + iNewEntry.SetNew( EFalse ); + iNewEntry.SetUnread( !iRemoveFlags.MceFlag( EMceRemoveEntryFlagUnread ) ); + iOperation=iEntry->ChangeL( iNewEntry, iStatus ); + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::DoCancel +// Cancels active object. +// ---------------------------------------------------- +void CMceRemoveNewFlag::DoCancel() + { + if ( iOperation ) + { + iOperation->Cancel(); + } + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete( status, iStatus.Int() ); + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::RunL +// Runs active object. +// ---------------------------------------------------- +void CMceRemoveNewFlag::RunL() + { + if ( iEntrySelection->Count()==0 ) + { + // nothing left to process, so complete the observer + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete( status, iStatus.Int() ); + } + else + { + // start the next pass + RemoveNextNewFlagL(); + } + } + +// ---------------------------------------------------- +// CMceRemoveNewFlag::ProgressL +// Progressing of active object. +// ---------------------------------------------------- +const TDesC8& CMceRemoveNewFlag::ProgressL() + { + if ( iOperation ) + { + return iOperation->ProgressL(); + } + return iBlank; + } + +// --------------------------------------------------------- +// CMceRemoveNewFlag::DecodeProgress +// +// --------------------------------------------------------- +// +TInt CMceRemoveNewFlag::DecodeProgress( + const TDesC8& /*aProgress*/, + TBuf& aReturnString, + TInt& aTotalEntryCount, + TInt& aEntriesDone, + TInt& aCurrentEntrySize, + TInt& aCurrentBytesTrans, + TBool /*aInternal*/ ) + { + aCurrentEntrySize = aTotalEntryCount = iCount; + aCurrentBytesTrans = aEntriesDone = iCount - (iEntrySelection->Count()); + aReturnString.Copy( _L("") ); + return KErrNone; + } + +// End of file