--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pushmtm/MtmCliSrvSrc/PushMtmGcOperation.cpp Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,317 @@
+/*
+* 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 the License "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: Implementation of CPushMtmGcOperation.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "PushMtmGcOperation.h"
+#include "PushMtmCliSrvPanic.h"
+#include "PushMtmUtil.h"
+#include "PushMtmLog.h"
+#include <push/CSIPushMsgEntry.h>
+#include <msvids.h>
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::NewL
+// ---------------------------------------------------------
+//
+CPushMtmGcOperation* CPushMtmGcOperation::NewL(
+ CMsvSession& aSession,
+ TMsvId aFolderId,
+ TRequestStatus& aObserverRequestStatus )
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::NewL")
+
+ CPushMtmGcOperation* self = new (ELeave) CPushMtmGcOperation
+ ( aSession, aFolderId, aObserverRequestStatus );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::NewL")
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::~CPushMtmGcOperation
+// ---------------------------------------------------------
+//
+CPushMtmGcOperation::~CPushMtmGcOperation()
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::~CPushMtmGcOperation")
+
+ Cancel();
+ delete iEntrySel;
+ delete iEntryWrapper;
+ delete iUtil;
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::~CPushMtmGcOperation")
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::DoSyncL
+// ---------------------------------------------------------
+//
+void CPushMtmGcOperation::DoSyncL()
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::DoSyncL")
+
+ InitL();
+
+ for ( iCurrentIndex = 0; iCurrentIndex < iCount; ++iCurrentIndex )
+ {
+ // iCurrentIndex indicate the current entry in the selection.
+ GcCurrentL();
+ }
+
+ // Release unnecessary resources.
+ delete iEntrySel;
+ iEntrySel = NULL;
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::DoSyncL")
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::CPushMtmGcOperation
+// ---------------------------------------------------------
+//
+CPushMtmGcOperation::CPushMtmGcOperation( CMsvSession& aSession,
+ TMsvId aFolderId,
+ TRequestStatus& aObserverRequestStatus )
+: CPushMtmOperation( aSession, KMsvNullIndexEntryId, aObserverRequestStatus ),
+ iState( EInit ), iFolderId( aFolderId ), iCurrentIndex( 0 )
+ {
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::ConstructL
+// ---------------------------------------------------------
+//
+void CPushMtmGcOperation::ConstructL()
+ {
+ // Do nothing here.
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::InitL
+// ---------------------------------------------------------
+//
+void CPushMtmGcOperation::InitL()
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::InitL")
+
+ if ( !iUtil )
+ {
+ iUtil = CPushMtmUtil::NewL( iMsvSession );
+ }
+
+ CMsvEntrySelection* folders = NULL;
+ if ( iFolderId == KMsvNullIndexEntryId )
+ {
+ folders = iUtil->FindPushFoldersL();
+ CleanupStack::PushL( folders );
+ }
+ else
+ {
+ folders = new (ELeave) CMsvEntrySelection;
+ CleanupStack::PushL( folders );
+ folders->AppendL( iFolderId );
+ }
+
+ // Get SIs from the given folder(s).
+ delete iEntrySel;
+ iEntrySel = NULL;
+ iEntrySel = iUtil->FindMessagesL( *folders, KUidWapPushMsgSI );
+ CleanupStack::PopAndDestroy(); // folders
+
+ // Reset count.
+ iCount = iEntrySel->Count();
+ PUSHLOG_WRITE_FORMAT(" iCount: %d",iCount)
+ // Reset index.
+ iCurrentIndex = 0;
+
+ // We need a wrapper only if there is entry to delete.
+ if ( iCount && !iEntryWrapper )
+ {
+ iEntryWrapper = CSIPushMsgEntry::NewL();
+ }
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::InitL")
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::GcCurrentL
+// ---------------------------------------------------------
+//
+void CPushMtmGcOperation::GcCurrentL()
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::GcCurrentL")
+
+ PUSHLOG_WRITE_FORMAT(" iCurrentIndex: %d",iCurrentIndex)
+ TMsvId entryId( iEntrySel->At(iCurrentIndex) );
+
+#ifdef _DEBUG
+ TMsvEntry tEntry;
+ TMsvId dummyService;
+ User::LeaveIfError
+ ( iMsvSession.GetEntry( entryId, dummyService, tEntry ) );
+
+ __ASSERT_DEBUG( tEntry.iMtm == KUidMtmWapPush &&
+ tEntry.iBioType == KUidWapPushMsgSI.iUid,
+ CliSrvPanic( EPushMtmCliSrvPanBadType ) );
+#endif // _DEBUG
+
+ iEntryWrapper->RetrieveL( iMsvSession, entryId );
+ // Check expiration if expiration time was set.
+ if ( iEntryWrapper->Expires() != Time::NullTTime() )
+ {
+ TTime today;
+ today.UniversalTime();
+ if ( iEntryWrapper->Expires() < today )
+ {
+ PUSHLOG_WRITE(" Expired")
+ // The message has expired. Delete it.
+ CMsvEntry* cParent =
+ iMsvSession.GetEntryL( iEntryWrapper->Entry().Parent() );
+ CleanupStack::PushL( cParent );
+ // Delete the message.
+ cParent->DeleteL( entryId );
+ CleanupStack::PopAndDestroy(); // cParent
+ }
+ }
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::GcCurrentL")
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::RunL
+// ---------------------------------------------------------
+//
+void CPushMtmGcOperation::RunL()
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::RunL")
+
+ if ( iState == EInit )
+ {
+ InitL();
+ if ( !iCount )
+ {
+ // Ready.
+ SignalObserver( KErrNone );
+ }
+ else
+ {
+ iState = EGarbageCollecting;
+ SetActive();
+ InvokeRun();
+ }
+ }
+ else if ( iState == EGarbageCollecting )
+ {
+ __ASSERT_DEBUG( iCount,
+ CliSrvPanic( EPushMtmCliSrvPanEmptySelection ) );
+ // iCurrentIndex indicate the current entry in the selection.
+ GcCurrentL();
+ if ( ++iCurrentIndex < iCount )
+ {
+ // Delete next.
+ SetActive();
+ InvokeRun();
+ }
+ else
+ {
+ // No more to delete.
+ SignalObserver( KErrNone );
+ }
+ }
+ else
+ {
+ __ASSERT_DEBUG( EFalse,
+ CliSrvPanic( EPushMtmCliSrvPanCommandNotSupported ) );
+ }
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::RunL")
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::DoCancel
+// ---------------------------------------------------------
+//
+void CPushMtmGcOperation::DoCancel()
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::DoCancel")
+
+ CPushMtmOperation::DoCancel();
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::DoCancel")
+ }
+
+// ---------------------------------------------------------
+// CPushMtmGcOperation::RunError
+// ---------------------------------------------------------
+//
+TInt CPushMtmGcOperation::RunError( TInt aError )
+ {
+ PUSHLOG_ENTERFN("CPushMtmGcOperation::RunError")
+ PUSHLOG_WRITE_FORMAT(" aError: %d",aError)
+
+ TBool doContinue( EFalse );
+
+ PUSHLOG_WRITE_FORMAT(" iState: %d",iState)
+ if ( iState == EInit )
+ {
+ // We cannot continue.
+ }
+ else if ( iState == EGarbageCollecting )
+ {
+ if ( aError == KErrNotFound )
+ {
+ // Try to continue with next.
+ if ( ++iCurrentIndex < iCount )
+ {
+ // Delete next.
+ doContinue = ETrue;
+ SetActive();
+ InvokeRun();
+ }
+ }
+ }
+ else
+ {
+ __ASSERT_DEBUG( EFalse,
+ CliSrvPanic( EPushMtmCliSrvPanCommandNotSupported ) );
+ }
+
+ TInt ret = KErrNone;
+ if ( doContinue )
+ {
+ ret = KErrNone;
+ }
+ else
+ {
+ // Report error.
+ ret = CPushMtmOperation::RunError( aError );
+ }
+
+ PUSHLOG_LEAVEFN("CPushMtmGcOperation::RunError")
+ return ret;
+ }
+
+// End of file.