diff -r 1fc85118c3ae -r 870918037e16 landmarksui/engine/src/CLmkDbUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/engine/src/CLmkDbUtils.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,530 @@ +/* +* Copyright (c) 2002-2006 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: This file contains utility methods for performing +* landmark database related operations like adding, deleting +* or updating a landmark and category etc. +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include +#include "LmkConsts.h" +#include "landmarks.hrh" +#include "Debug.h" +#include "CLmkAOOperation.h" +#include "MLmkAOOperationObserver.h" +#include "CLmkIconOperation.h" +#include "CLmkAddToCatOperation.h" +#include "CLmkDbUtils.h" +#include "CLmkFields.h" +#include + + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { +#if defined(_DEBUG) +_LIT( KPanicMsg, "CLmkDbUtils" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +#endif +const TInt KUrlProtocolEnds (3); +_LIT( KDoubleSlash, "//"); // Empty Mime Type indicator +} // namespace + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::CLmkDbUtils +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkDbUtils::CLmkDbUtils( +CPosLandmarkDatabase& aDb, +MLmkAOOperationObserver& aObserver, +TBool aProgressNote ) +: iDb( aDb ), + iObserver( &aObserver ), + iProgressNote( aProgressNote ) + { + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::NewL() +// ----------------------------------------------------------------------------- +// +EXPORT_C CLmkDbUtils* CLmkDbUtils::NewL( +CPosLandmarkDatabase& aDb, +MLmkAOOperationObserver& aObserver, +TBool aProgressNote ) + { + CLmkDbUtils* self = + new ( ELeave ) CLmkDbUtils( aDb, aObserver, aProgressNote ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::ConstructL() +// ----------------------------------------------------------------------------- +// +void CLmkDbUtils::ConstructL() + { + iCategoryMgr = CPosLmCategoryManager::NewL( iDb ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::~CLmkDbUtils() +// ----------------------------------------------------------------------------- +// +CLmkDbUtils::~CLmkDbUtils() + { + CancelLmOperation(); + delete iCategoryMgr; + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::HandleOperationL +// ----------------------------------------------------------------------------- +// +void CLmkDbUtils::HandleOperationL( +TOperationTypes aType, +TReal32 aProgress, +TInt aStatus ) + { + DEBUG2( CLmkDbUtils::HandleOperationL entered: progress=%d status=%d, + aProgress, aStatus ); + if ( aStatus != KPosLmOperationNotComplete ) + { + // iAOOperation usually always exists when this method is called. + // Exception may be e.g. that a leave is trapped by CLmkDbUtils user. + delete iAOOperation; + iAOOperation = NULL; + } + //this handle operation performs db compact operation. + TRAPD(err,iObserver->HandleOperationL( aType, aProgress, aStatus )); + if (err == KErrLocked) + { + //since db compact operation failed, db has to be re-initialized. + InitializeDbL(); + } + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::InitializeDbL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::InitializeDbL() + { + DEBUG( CLmkDbUtils::InitializeDbL entered ); + LeaveIfInUseL(); + + // We do not check IsInitializingNeeded() since it is better to do this + // always asynchronously to ensure consistent program flow. + + CPosLmOperation* operation = NULL; + operation = iDb.InitializeL(); + + SetupAndStartOperationL( operation, EInitialize ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::CompactDbL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::CompactDbL() + { + DEBUG( CLmkDbUtils::CompactDbL entered ); + LeaveIfInUseL(); + + CPosLmOperation* operation = iDb.CompactL(); + + SetupAndStartOperationL( operation, ECompact ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::AddCategoryL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::AddCategoryL( + CPosLandmarkCategory& aCategory, + CPosLandmarkDatabase& aDb ) + { + CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL( aDb ); + CleanupStack::PushL( categoryMgr ); + + categoryMgr->AddCategoryL( aCategory ); + + CleanupStack::PopAndDestroy( categoryMgr ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::RenameCategoryL +// ----------------------------------------------------------------------------- +// + EXPORT_C void CLmkDbUtils::RenameCategoryL( + TDesC& aCategoryName, + TPosLmItemId aId, + CPosLandmarkDatabase& aDb ) + { + CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL( aDb ); + CleanupStack::PushL( categoryMgr ); + + CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC( aId ); + category->SetCategoryNameL( aCategoryName ); + categoryMgr->UpdateCategoryL( *category ); + + CleanupStack::PopAndDestroy( 2 ); //category, categoryMgr + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::CategoryNameL +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC* CLmkDbUtils::CategoryNameL( + CPosLandmarkDatabase& aDb, + TPosLmItemId aCategoryId ) + { + CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL( aDb ); + CleanupStack::PushL( categoryMgr ); + + CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC(aCategoryId); + TPtrC catName; + User::LeaveIfError( category->GetCategoryName ( catName ) ); + HBufC* result = catName.AllocL(); + CleanupStack::PopAndDestroy( 2 ); //category, categoryMgr + return result; + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::ChangeIconL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::ChangeIconL( + CPosLandmarkDatabase& aDb, + const TPosLmItemId aId, + TLmkItemType aItemType, + const TDesC& aMbmFileName, + TInt aIconIndex, TInt aMaskIndex) + { + + if ( aItemType == ELmkItemTypeLandmark ) + { + CPosLandmark* landmark = aDb.ReadLandmarkLC( aId ); + + landmark->SetIconL( aMbmFileName, aIconIndex, aMaskIndex); //KLmkDefaultId+1 ); + aDb.UpdateLandmarkL( *landmark ); + CleanupStack::PopAndDestroy(); // landmark + } + else + { + __ASSERT_DEBUG( aItemType == ELmkItemTypeCategory, + Panic( KLmkPanicUnknownItemType ) ); + + CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL(aDb); + CleanupStack::PushL( categoryMgr ); + CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC( aId ); + category->SetIconL( aMbmFileName, aIconIndex, aMaskIndex);//KCategoryDefaultId+1); + + categoryMgr->UpdateCategoryL( *category ); + CleanupStack::PopAndDestroy( 2 ); //category, categoryMgr + } + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::ChangeIconsL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::ChangeIconsL( + const RArray& aIdArray, + TLmkItemType aItemsType, + const TDesC& aMbmFileName, + TInt aIconIndex, TInt /*aMaskIndex*/) + { + LeaveIfInUseL(); + + CPosLmOperation* operation = CLmkIconOperation::NewL( iDb, + aIdArray, + aItemsType, + aMbmFileName, + aIconIndex ); + + SetupAndStartOperationL( operation, EChangeIcons ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::DeleteCategoriesL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::DeleteCategoriesL( + const RArray& aCategoryIdArray ) + { + LeaveIfInUseL(); + + CPosLmOperation* operation = + iCategoryMgr->RemoveCategoriesL( aCategoryIdArray ); + + SetupAndStartOperationL( operation, EDeleteCategories ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::DeleteLandmarkL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::DeleteLandmarkL( + TPosLmItemId aId, + CPosLandmarkDatabase& aDb ) + { + aDb.RemoveLandmarkL( aId ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::DeleteLandmarksL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::DeleteLandmarksL( + const RArray& aLandmarkIdArray ) + { + LeaveIfInUseL(); + + CPosLmOperation* operation = + iDb.RemoveLandmarksL( aLandmarkIdArray ); + + SetupAndStartOperationL( operation, EDeleteLandmarks ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::AddLmToCategoryL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::AddLmToCategoryL( + TPosLmItemId aLandmarkId, + TPosLmItemId aCategoryId, + CPosLandmarkDatabase& aDb ) + { + CPosLandmark* landmark = aDb.ReadLandmarkLC( aLandmarkId ); + landmark->AddCategoryL( aCategoryId ); + aDb.UpdateLandmarkL( *landmark ); + CleanupStack::PopAndDestroy(); // landmark + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::AddLmToCategoriesL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::AddLmToCategoriesL( + TPosLmItemId aLandmarkId, + const RArray& aCategoryIdArray ) + { + LeaveIfInUseL(); + + CPosLmOperation* operation = + CLmkAddToCatOperation::NewL( *iCategoryMgr, + aLandmarkId, + aCategoryIdArray ); + + SetupAndStartOperationL( operation, EAddToCategory ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::AddLmsToCategoriesL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::AddLmsToCategoriesL( + const RArray& aLandmarkIdArray, + const RArray& aCategoryIdArray ) + { + LeaveIfInUseL(); + + CPosLmOperation* operation = + CLmkAddToCatOperation::NewL( *iCategoryMgr, + aLandmarkIdArray, + aCategoryIdArray ); + + SetupAndStartOperationL( operation, EAddToCategory ); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::CancelLmOperation +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::CancelLmOperation() + { + if ( iAOOperation ) + { + iAOOperation->Cancel(); + delete iAOOperation; + iAOOperation = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::LeaveIfInUseL +// ----------------------------------------------------------------------------- +// +void CLmkDbUtils::LeaveIfInUseL() + { + if ( iAOOperation ) + { + User::Leave( KErrInUse ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::SetupAndStartOperationL +// ----------------------------------------------------------------------------- +// +void CLmkDbUtils::SetupAndStartOperationL( + CPosLmOperation* aOperation, + MLmkAOOperationObserver::TOperationTypes aOpType ) + { + CleanupStack::PushL( aOperation ); + iAOOperation = + CLmkAOOperation::NewL( aOperation, + *this, + aOpType, + iProgressNote ); + CleanupStack::Pop( aOperation ); // ownership transferred + + iAOOperation->StartOperation(); + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::CategoryIdL() +// ----------------------------------------------------------------------------- +// +EXPORT_C TPosLmItemId CLmkDbUtils::CategoryIdL( + CPosLandmarkDatabase& aDb, + const TDesC& aCategoryName ) + { + + CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL( aDb ); + CleanupStack::PushL( categoryMgr ); + + TPosLmItemId categoryId = categoryMgr->GetCategoryL(aCategoryName); + if (categoryId == KPosLmNullItemId) + { + User::Leave(KErrArgument); + } + + CleanupStack::PopAndDestroy(categoryMgr); //, categoryMgr + return categoryId; + } + + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::IsLmWithThisFieldExist +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CLmkDbUtils::IsLmWithThisFieldExistL( TPositionFieldId aFieldId ) + { + RArray lmIdArray; + CleanupClosePushL( lmIdArray ); + lmIdArray.Reset(); + + TPosLmSortPref sortOrder( CPosLandmark::ELandmarkName, + TPosLmSortPref::EAscending ); + CPosLmItemIterator* iterator = iDb.LandmarkIteratorL( sortOrder ); + CleanupStack::PushL( iterator ); + TUint count = iterator->NumOfItemsL(); + if ( count > 0 ) + { // can only be called if there are some items + iterator->GetItemIdsL( lmIdArray, 0, count ); + } + CleanupStack::PopAndDestroy( iterator ); + + // search for lm with given position field + TBool lmkFieldDefined = EFalse; + for (TInt i = 0; i< lmIdArray.Count(); i++) + { + CPosLandmark* landmark = iDb.ReadLandmarkLC(lmIdArray[i]); + if ( landmark->IsPositionFieldAvailable( aFieldId ) ) + { + // Check if field info availabe or not + TPtrC fieldValue; + if (landmark->GetPositionField( aFieldId, fieldValue ) == KErrNone ) + { + if (fieldValue.Length() > 0 ) + { + lmkFieldDefined = ETrue; + CleanupStack::PopAndDestroy ( landmark ); + break; + } + } + } + CleanupStack::PopAndDestroy ( landmark ); + } + CleanupStack::PopAndDestroy( ); // LmIdArray + return lmkFieldDefined; + } + + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::CheckToTrimUrlProtocol +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::RemoveDefaultProtocolL(TPtr& aWebUrl) + { + TInt emptySlashPos(0); + if ( aWebUrl.Length() > 0 ) + { + emptySlashPos = aWebUrl.Find( KDoubleSlash ); + if ( emptySlashPos == 0 ) + { + aWebUrl.Delete(emptySlashPos, 2); + } + if(aWebUrl.Length() > KMaxUrlFieldLen) + { + TInt pos = aWebUrl.Find(KProtocol); + aWebUrl.Delete(emptySlashPos, (pos + KUrlProtocolEnds)); + } + } + } + +// ----------------------------------------------------------------------------- +// CLmkDbUtils::AddDefaultProtocolL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkDbUtils::AddDefaultProtocolL(CPosLandmark* landmark) + { + HBufC* webUrl = HBufC::NewL(KMaxBufferLen); + CleanupStack::PushL(webUrl); + TPtrC urlDes = webUrl->Des(); + landmark->GetPositionField(ELmkPositionFieldWebAddress,urlDes); + if(urlDes.Length() > KMaxUrlFieldLenWithDefaultProtocol) + { + TInt pos = urlDes.Find(KProtocol); + if (pos == KErrNotFound) + { + webUrl = webUrl->ReAllocL( KHttp().Length() + urlDes.Length() ); + TPtr url = webUrl->Des(); + webUrl->Des().Copy(urlDes); + webUrl->Des().Insert(0, KHttp); + landmark->SetPositionFieldL(ELmkPositionFieldWebAddress,webUrl->Des()); + } + } + CleanupStack::PopAndDestroy();//webUrl + } +// End of File