pushmtm/MtmCliSrvSrc/PushMtmGcOperation.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /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.