--- /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 <msvids.h> // 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<CBaseMtmUi::EProgressStringMaxLen>& 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