landmarks/locationlandmarks/localaccess/src/EPos_CPosLmLocalRemoveLandmarksOp.cpp
changeset 0 667063e416a2
child 20 2b4ea9893b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/localaccess/src/EPos_CPosLmLocalRemoveLandmarksOp.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,261 @@
+/*
+* Copyright (c) 2002-2005 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: Operation for removing landmarks from a database.
+*
+*
+*/
+
+
+#include    <epos_cposlmresourcereader.h>
+#include    <eposlmasyncops.rsg>
+#include    <EPos_LandmarksErrors.h>
+#include    <epos_cposlmdiskutilities.h>
+#include    <epos_cposlmlocaldbaccess.h>
+#include    <epos_poslmlandmarkhandler.h>
+
+#include    "epos_cposlmlocaldatabase.h"
+#include    "EPos_LocalLandmarks.h"
+#include    "EPos_CPosLmLocalLandmarkIterator.h"
+#include    "epos_rposlmlocalnameindex.h"
+#include    "EPos_RPosLmLocalAccessSubsession.h"
+#include    "EPos_CPosLmLocalRemoveLandmarksOp.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CPosLmLocalRemoveLandmarksOp::CPosLmLocalRemoveLandmarksOp( CPosLmLocalDatabase& aDb ) :
+    CPosLmLocalModifyOp(aDb)
+    {
+    iUsesServerData = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CPosLmLocalRemoveLandmarksOp::ConstructL(
+    const RArray<TPosLmItemId>& aLandmarkIdArray,
+    TInt aResourceId )
+    {
+    if ( aLandmarkIdArray.Count() == 0 )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    BaseConstructL();
+
+    ReadInfoFromResourceFileL( aResourceId );
+
+    iLandmarkIdArray.ReserveL( aLandmarkIdArray.Count() ); // to avoid heap fragmentation
+    for ( TInt i = 0; i < aLandmarkIdArray.Count(); i++ )
+        {
+        iLandmarkIdArray.Append( aLandmarkIdArray[i] );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CPosLmLocalRemoveLandmarksOp::ConstructL()
+    {
+    BaseConstructL();
+
+    CPosLmItemIterator* iterator =
+        CPosLmLocalLandmarkIterator::NewL( *iDb, ETrue );
+    CleanupStack::PushL( iterator );
+
+    if ( iterator->NumOfItemsL() > 0 )
+        {
+        iterator->GetItemIdsL( iLandmarkIdArray, 0, iterator->NumOfItemsL() );
+        }
+
+    CleanupStack::PopAndDestroy( iterator );
+
+    if ( iLandmarkIdArray.Count() > 0 )
+        {
+        // Check disk space
+        CPosLmDiskUtilities* diskutil = CPosLmDiskUtilities::NewL();
+        CleanupStack::PushL(diskutil);
+        diskutil->DiskSpaceBelowCriticalLevelL(
+            diskutil->EstimatedDiskSizeOfLmOperation(
+                CPosLmDiskUtilities::ERemoveLandmarksOp,
+                iLandmarkIdArray), iDb->DatabaseDrive());
+        CleanupStack::PopAndDestroy(diskutil);
+
+        ReadInfoFromResourceFileL( R_POS_LM_LOCAL_REMOVE_ALL_LMS_OP );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CPosLmLocalRemoveLandmarksOp* CPosLmLocalRemoveLandmarksOp::NewL(
+    CPosLmLocalDatabase& aDb,
+    const RArray<TPosLmItemId>& aLandmarkIdArray)
+    {
+    CPosLmLocalRemoveLandmarksOp* self = new (ELeave)
+        CPosLmLocalRemoveLandmarksOp(aDb);
+    CleanupStack::PushL(self);
+    self->ConstructL(aLandmarkIdArray, R_POS_LM_LOCAL_REMOVE_LMS_OP);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CPosLmLocalRemoveLandmarksOp* CPosLmLocalRemoveLandmarksOp::NewL(
+    CPosLmLocalDatabase& aDb)
+    {
+    CPosLmLocalRemoveLandmarksOp* self = new (ELeave)
+        CPosLmLocalRemoveLandmarksOp(aDb);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CPosLmLocalRemoveLandmarksOp::~CPosLmLocalRemoveLandmarksOp()
+    {
+    RollbackAndGenerateEventIfNeeded(Progress());
+
+    iLandmarkIdArray.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CPosLmLocalRemoveLandmarksOp::DoNextStepPreL(
+    TReal32& aProgress)
+    {
+    if ( iLandmarkIdArray.Count() == 0 )
+        {
+        aProgress = 1;
+        }
+    else
+        {
+        RArray<TPosLmItemId> removed;
+        CleanupClosePushL( removed );
+        for (TInt i = 0; i < iNoOfSubOperations &&
+            iCurrent < iLandmarkIdArray.Count(); i++)
+            {
+            PosLmLandmarkHandler::RemoveLandmarkL(
+                *iDb->DatabaseAccess(), iLandmarkIdArray[iCurrent] );
+            removed.AppendL( iLandmarkIdArray[iCurrent] );
+
+            iCurrent++;
+            }
+        iDb->NameIndex().RemoveL( removed );
+        CleanupStack::PopAndDestroy( &removed );
+
+        // Set progress
+        aProgress = TReal32(iCurrent)/iLandmarkIdArray.Count();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CPosLmLocalRemoveLandmarksOp::DoNextStepPostL(
+    TReal32& aProgress)
+    {
+    if (iCurrent < iLandmarkIdArray.Count())
+        {
+        return ETrue;
+        }
+
+    User::LeaveIfError(GenerateEventIfNeeded(aProgress));
+    iStatusFlag = KErrNone;
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TReal32 CPosLmLocalRemoveLandmarksOp::Step()
+    {
+    if (iLandmarkIdArray.Count() == 0)
+        {
+        return 1.0f;
+        }
+    return 1.0f/iLandmarkIdArray.Count();
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CPosLmLocalRemoveLandmarksOp::CheckResourceValue(
+    TInt /*aResourceId*/,
+    TInt aNoOfSubOperations)
+    {
+    __ASSERT_ALWAYS(aNoOfSubOperations > 0, Panic(KPosLandmarksClientPanic,
+        EPosInvalidValueSpecifiedInResourceFile));
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CPosLmLocalRemoveLandmarksOp::HandleError(
+    TInt& aError)
+    {
+    iStatusFlag = aError;
+    RollbackAndGenerateEventIfNeeded(Progress());
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CPosLmLocalRemoveLandmarksOp::RollbackAndGenerateEventIfNeeded(
+    TReal32 aProgress)
+    {
+    RollbackIfNeeded();
+
+    GenerateEventIfNeeded(aProgress);
+
+    // Reset flag: rollback and event generation should not be done twice.
+    iStatusFlag = KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt CPosLmLocalRemoveLandmarksOp::GenerateEventIfNeeded(
+    TReal32 aProgress)
+    {
+    if (iStatusFlag != KErrNone && aProgress > 0)
+        {
+        // If only one landmark has been removed, a more specific event can be
+        // reported.
+        if (iCurrent == 1)
+            {
+            return iDb->RegisterEvent(EPosLmEventLandmarkDeleted,
+                iLandmarkIdArray[0]);
+            }
+
+        // If more than one landmark have been removed, a general event is
+        // reported.
+        if (iCurrent > 0)
+            {
+            return iDb->RegisterEvent(EPosLmEventLandmarkUnknownChanges);
+            }
+
+        }
+    // Nothing has happend, don't report event.
+    return KErrNone;
+    }
+