diff -r 8173571d354e -r 1fc85118c3ae landmarksui/engine/src/CLmkSearchedLmListProvider.cpp --- a/landmarksui/engine/src/CLmkSearchedLmListProvider.cpp Thu Aug 19 09:48:36 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,625 +0,0 @@ -/* - * Copyright (c) 2002-2010 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: Filtered landmarks list provider - * - */ - -// SYSTEM INCLUDES -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// USER INCLUDES -#include "CLmkSearchedLmListProvider.h" -#include "CLmkLandmarkUiItem.h" -#include "CLmkAOOperation.h" -#include "MLmkSelectorIconMgr.h" -#include -#include "Debug.h" - -// CONSTANTS -_LIT(KSpaceTextCriteria,"* "); -_LIT(KDefaultTextCriteria,"*"); - -#if defined(_DEBUG) -/// Unnamed namespace for local definitions -namespace - { - _LIT( KPanicMsg, "CLmkSearchedLmListProvider" ); - void Panic(TPanicCode aReason) - { - User::Panic(KPanicMsg, aReason); - } - } // namespace -#endif - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CLmkSearchedLmListProvider::CLmkSearchedLmListProvider -// C++ constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CLmkSearchedLmListProvider::CLmkSearchedLmListProvider( - CPosLandmarkDatabase& aDb, CPosLmSearchCriteria& aCriteria) : - CLmkLmItemListProvider(aDb), iCriteria(aCriteria), - iIsSecondSearchStarted(EFalse) - { - } - -// ----------------------------------------------------------------------------- -// CLmkSearchedLmListProvider::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CLmkSearchedLmListProvider::ConstructL() - { - // base class 2nd phase constructor - CLmkLmItemListProvider::BaseConstructL(); - - iReadParams = CPosLmPartialReadParameters::NewLC(); - CleanupStack::Pop(); // iReadParams - iReadParams->SetRequestedAttributes(CPosLandmark::ELandmarkName - | CPosLandmark::EIcon | CPosLandmark::ECategoryInfo); - - iSearch = CPosLandmarkSearch::NewL(iDb); - } - -// ----------------------------------------------------------------------------- -// CLmkSearchedLmListProvider::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CLmkSearchedLmListProvider* CLmkSearchedLmListProvider::NewL( - CPosLandmarkDatabase& aDb, CPosLmSearchCriteria& aCriteria) - { - CLmkSearchedLmListProvider* self = - new (ELeave) CLmkSearchedLmListProvider(aDb, aCriteria); - - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - - return self; - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::~CLmkSearchedLmListProvider -// --------------------------------------------------------- -// -CLmkSearchedLmListProvider::~CLmkSearchedLmListProvider() - { - delete iReadParams; - delete iSearch; - if (iSearchAO) - { - iSearchAO->StopOperation(); - } - delete iSearchAO; - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::ItemAtL -// --------------------------------------------------------- -// -CLmkUiItemBase* CLmkSearchedLmListProvider::ItemAtL(TInt aIndex) - { - __ASSERT_DEBUG( iIconMgr, Panic( KLmkPanicNullMember ) ); - //landmark with updated icon, if associated with one cat. - CPosLandmark* landmark = GetLandmarkLC(aIndex); - TPtrC mbmFile; - TInt iconFileIndex = -1; - TInt iconListIndex = -1; - TInt iconMasktIndex = -1; - TInt result = landmark->GetIcon(mbmFile, iconFileIndex, iconMasktIndex); - if (result == KErrNone) - { - TRAPD(err, iconListIndex = - iIconMgr->GetIconL( mbmFile, iconFileIndex ) ); - if (err == KErrNotFound) // icon file not found -> fallback to default - { - iconListIndex = iIconMgr->GetDefaultIconL( - MLmkSelectorIconMgr::ELandmarkDefaultIcon); - } - } - else - { - iconListIndex = iIconMgr->GetDefaultIconL( - MLmkSelectorIconMgr::ELandmarkDefaultIcon); - } - - CLmkLandmarkUiItem* uiItem = CLmkLandmarkUiItem::NewL(landmark, - iconListIndex); - CleanupStack::Pop(); // landmark, ownership transferred - return uiItem; - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::PrepareListL -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::PrepareListL() - { - DEBUG( CLmkSearchedLmListProvider::PrepareListL start ); - iCount = 0; - - iDb.SetPartialReadParametersL(*iReadParams); - - TPosLmSortPref sortOrder(CPosLandmark::ELandmarkName, - TPosLmSortPref::EAscending); - CPosLmOperation* operation = iSearch->StartLandmarkSearchL(iCriteria, - sortOrder); - CleanupStack::PushL(operation); - if (iSearchAO) - { - iSearchAO->StopOperation(); - delete iSearchAO; // cancel possibly pending operation - iSearchAO = NULL; - } - iSearchAO = CLmkAOOperation::NewL(operation, *this, - MLmkAOOperationObserver::ESearch, iOperationNotInUse); - iOperationNotInUse = ETrue; - CleanupStack::Pop(operation); // ownership transferred - iSearchAO->StartOperation(); - DEBUG( CLmkSearchedLmListProvider::PrepareListL End ); - } - -// ----------------------------------------------------------------------------- -// CLmkSearchedLmListProvider::PrepareListL -// ----------------------------------------------------------------------------- -// -TBool CLmkSearchedLmListProvider::PrepareListL(const TDesC& aSearchPattern, - TBool aSearchOnlyInPreviousMatches) - { - iCount = 0; - iRequestFromFindBox = ETrue; - iOperationNotInUse = ETrue; - iIsSecondSearchStarted = EFalse; - DEBUG1( CLmkSearchedLmListProvider::PrepareListL 2 start with aSearchPattern = %d,aSearchPattern.Length()); - - if (aSearchPattern.Compare(KDefaultTextCriteria) == 0 - || aSearchPattern.Length() <= 0) - { - PrepareListL(); - iRequestFromFindBox = EFalse; - return ETrue; - } - - // We need to cancel if we are searching/reading landmarks. - if (iSearchAO) - { - iSearchAO->StopOperation(); - delete iSearchAO; // cancel possibly pending operation - iSearchAO = NULL; - } - - // Create the composite criterion - CPosLmCompositeCriteria* compCrit = CPosLmCompositeCriteria::NewLC( - CPosLmCompositeCriteria::ECompositionOR); - - // Create the text search criterion and add it to composite - CPosLmTextCriteria* textCrit1 = CPosLmTextCriteria::NewLC(); - - const TInt KExtraChars = 3; // 2 chars wildcards - HBufC* filterBuf = HBufC::NewLC(aSearchPattern.Length() + KExtraChars); - TPtr filter = filterBuf->Des(); - filter.Copy(KSpaceTextCriteria); - filter.Append(aSearchPattern); - - textCrit1->SetTextL(filter); - textCrit1->SetAttributesToSearch(CPosLandmark::ELandmarkName); - - User::LeaveIfError(compCrit->AddArgument(textCrit1)); - // Ownership of the text criterion has been passed to the composite - CleanupStack::PopAndDestroy(filterBuf); - CleanupStack::Pop(textCrit1); - - // Create the text search criterion and add it to composite - CPosLmTextCriteria* textCrit2 = CPosLmTextCriteria::NewLC(); - textCrit2->SetTextL(aSearchPattern); - textCrit2->SetAttributesToSearch(CPosLandmark::ELandmarkName); - - User::LeaveIfError(compCrit->AddArgument(textCrit2)); - // Ownership of the text criterion has been passed to the composite - CleanupStack::Pop(textCrit2); - - iDb.SetPartialReadParametersL(*iReadParams); - - TPosLmSortPref sortOrder(CPosLandmark::ELandmarkName, - TPosLmSortPref::EAscending); - // Start the search - // Create search operation - CPosLmOperation* operation = iSearch->StartLandmarkSearchL(*compCrit, - sortOrder, aSearchOnlyInPreviousMatches); - - CleanupStack::PopAndDestroy(compCrit); - CleanupStack::PushL(operation); - - iSearchAO = CLmkAOOperation::NewL(operation, *this, - MLmkAOOperationObserver::ESearch, ETrue); - CleanupStack::Pop(operation); // ownership transferred - - iSearchAO->StartOperation(); - DEBUG( CLmkSearchedLmListProvider::PrepareListL 2 End ); - return ETrue; - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::StartSecondSearchL -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::StartSecondSearchL() - { - DEBUG( CLmkSearchedLmListProvider::StartSecondSearchL start ); - - iIsSecondSearchStarted = ETrue; - - // Create the composite criterion - CPosLmCompositeCriteria* compCrit = CPosLmCompositeCriteria::NewLC( - CPosLmCompositeCriteria::ECompositionAND); - - // Create the category search criterion and add it to composite - CPosLmCategoryCriteria* catCrit = CPosLmCategoryCriteria::NewLC(); - catCrit->SetCategoryItemId( - (static_cast (iCriteria)).CategoryItemId()); - - User::LeaveIfError(compCrit->AddArgument(catCrit)); - // Ownership of the category criterion has been passed to the composite - CleanupStack::Pop(catCrit); - - // Create the text search criterion and add it to composite - CPosLmIdListCriteria* idListCrit = CPosLmIdListCriteria::NewLC(); - idListCrit->SetLandmarkIdsL(iIdArray); - - User::LeaveIfError(compCrit->AddArgument(idListCrit)); - // Ownership of the text criterion has been passed to the composite - CleanupStack::Pop(idListCrit); - - iDb.SetPartialReadParametersL(*iReadParams); - - TPosLmSortPref sortOrder(CPosLandmark::ELandmarkName, - TPosLmSortPref::EAscending); - // Start the search - // Create search operation - CPosLmOperation* operation = iSearch->StartLandmarkSearchL(*compCrit, - sortOrder); - - CleanupStack::PopAndDestroy(compCrit); - CleanupStack::PushL(operation); - - iSearchAO = CLmkAOOperation::NewL(operation, *this, - MLmkAOOperationObserver::ESearch, ETrue); - CleanupStack::Pop(operation); // ownership transferred - - iSearchAO->StartOperation(); - DEBUG( CLmkSearchedLmListProvider::StartSecondSearchL End ); - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::HandleOperationL -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::HandleOperationL(TOperationTypes aType, - TReal32 aProgress, TInt aStatus) - { - DEBUG1( CLmkSearchedLmListProvider::HandleOperationL start aType=%d,aType); - if (aType == MLmkAOOperationObserver::EDeleteLandmarks) - { - return; - } - if (aType == MLmkAOOperationObserver::ERemoveCategory) - { - return; - } - if (aType == MLmkAOOperationObserver::ESearch) - { - ReadItemsToArrayL(); - if (aStatus == KErrNone) - { - if (iSearchAO) - { - iSearchAO->StopOperation(); - delete iSearchAO; - iSearchAO = NULL; - } - - // reset operation values - iOperationCmd = ELmkCmdStopOperation;//temp default value - iCount = 0; - - DEBUG2( CLmkSearchedLmListProvider::HandleOperationL iRequestFromFindBox=%d iIsSecondSearchStarted=%d - ,iRequestFromFindBox,iIsSecondSearchStarted); - - if (iRequestFromFindBox && iIsSecondSearchStarted == EFalse) - { - DEBUG( CLmkSearchedLmListProvider::HandleOperationL start secondsearch ); - StartSecondSearchL(); - return; - } - - DEBUG( CLmkSearchedLmListProvider::HandleOperationL refresh list ); - - iIsSecondSearchStarted = EFalse; - - if (iOperationNotInUse == EFalse) - { - NotifyObservers(ELmkEventItemAdditionComplete); - } - else - { - if (iRequestFromFindBox) - { - NotifyObservers(ELmkEventFindListReady); - } - else - { - NotifyObservers(ELmkEventListReady); - } - } - - iOperationNotInUse = ETrue; - - if (iCatDelete) - { - NotifyObservers(ELmkEventCategoryDeleted); - iCatDelete = EFalse; - } - else if (iCatUpdate) - { - NotifyObservers(ELmkEventCategoryUpdated); - iCatUpdate = EFalse; - } - - if (iItemsDeleted < iItemsToDelete) - { - PrepareForDeleteL(); - } - else - { - if (iWaitNote) - { - iWaitNote->ProcessFinishedL(); - iWaitNote = NULL; - } - } - return; - } // end of if ( aStatus == KErrNone ) - - if (iCount == ELmkStepOne || iCount == ELmkStepTwo) - { - if (iOperationNotInUse == EFalse) - { - NotifyObservers(ELmkEventItemAdditionComplete); - } - else - { - if (iRequestFromFindBox) - { - NotifyObservers(ELmkEventFindListReady); - } - else - { - NotifyObservers(ELmkEventListReady); - } - } - iRequestFromFindBox = EFalse; - iOperationNotInUse = EFalse; - } - } - else - { // This is not this classes' operation - CLmkLmItemListProvider::HandleOperationL(aType, aProgress, aStatus); - } - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::HandleDatabaseEvent -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::HandleDatabaseEvent(TPosLmEvent& aEvent) - { - iCatDelete = EFalse; - - TBool needRefresh = ETrue; - - // check any items are selected to do operations like iconchanges or add to category. - if (iSelectedItemsCount > 0 && iOperationCmd != ELmkCmdAddToCat - && iOperationCmd != ERemoveFromCat) - { - iCount++; - if (iSelectedItemsCount == iCount) - { - iSelectedItemsCount = 0; - iCount = 0; - } - needRefresh = EFalse; - } - - switch (aEvent.iEventType) - { - case EPosLmEventLandmarkUpdated: // lm icon changes, lm renaming - case EPosLmEventLandmarkUnknownChanges: // lm multiple deletion, lm add to category - case EPosLmEventUnknownChanges: - case EPosLmEventLandmarkCreated: - case EPosLmEventCategoryDeleted: - case EPosLmEventCategoryUpdated: - { - iOperationNotInUse = EFalse; - if (aEvent.iEventType == EPosLmEventCategoryDeleted) - { - iCatDelete = ETrue; - } - if (aEvent.iEventType == EPosLmEventCategoryUpdated) - { - iCatUpdate = ETrue; - } - - if (needRefresh) - { - if (iSearchAO) - { - iSearchAO->StopOperation(); - delete iSearchAO; - iSearchAO = NULL; - } - iOperationNotInUse = EFalse; - TInt err = KErrNone; - do - { - TRAP( err, PrepareListL() ); - } - while (err == KErrLocked); - if (err) - { - HandleError(err); - } - } - else - { - NotifyObservers(ELmkEventListReady); - } - break; - } - case EPosLmEventLandmarkDeleted: - { - TInt index = iIdArray.Find(aEvent.iLandmarkItemId); - if (index != KErrNotFound && index < iIdArray.Count()) - { - iIdArray.Remove(index); - NotifyObservers(ELmkEventListReady); - } - break; - } - default: - { // Not interesting event for this provider - break; - } - } - // Remember to call base class observer method too - CLmkLmItemListProvider::HandleDatabaseEvent(aEvent); - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::ReadItemsToArrayL -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::ReadItemsToArrayL() - { - iIdArray.Reset(); - CPosLmItemIterator* iterator = iSearch->MatchIteratorL(); - CleanupStack::PushL(iterator); - iCount = iterator->NumOfItemsL(); - if (iCount > 0) - { // can only be called if there are some items - iterator->GetItemIdsL(iIdArray, 0, iCount); // array is first reseted - } - CleanupStack::PopAndDestroy(iterator); - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::RemoveLandmarksL -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::RemoveLandmarksL( - const RArray& aSelectedItems) - { - iItemsToDelete = aSelectedItems.Count(); - iSelectedForDelete.Reset(); - for (TInt i = 0; i < iItemsToDelete; i++) - iSelectedForDelete.Append(aSelectedItems[i]); - iItemsDeleted = 0; - iIsRemoveLandmarks = ETrue; - - if (iWaitNote) - { - delete iWaitNote; - iWaitNote = NULL; - } - PrepareForDeleteL(); - } - -// --------------------------------------------------------- -// CLmkSearchedLmListProvider::PrepareForDelete -// --------------------------------------------------------- -// -void CLmkSearchedLmListProvider::PrepareForDeleteL() - { - RArray lmItemsChunk; - TInt count = iItemsDeleted; - if (iItemsToDelete > (iItemsDeleted + 10)) - { - iItemsDeleted = iItemsDeleted + 10; - } - else - { - iItemsDeleted = iItemsDeleted + (iItemsToDelete - iItemsDeleted); - } - - for (TInt i = count; i < iItemsDeleted; i++) - { - lmItemsChunk.Append(iSelectedForDelete[i]); - } - - CPosLmOperation* operation = NULL; - if (iType == MLmkAOOperationObserver::EDeleteLandmarks) - { - operation = iDb.RemoveLandmarksL(lmItemsChunk); - } - if (iType == MLmkAOOperationObserver::ERemoveCategory) - { - CPosLmCategoryManager* mgr = CPosLmCategoryManager::NewL(iDb); - CleanupStack::PushL(mgr); - operation = mgr->RemoveCategoryFromLandmarksL(iCategoryId, - lmItemsChunk); - CleanupStack::PopAndDestroy();//mgr - } - User::LeaveIfNull(operation); - - CleanupStack::PushL(operation); - iSearchAO = CLmkAOOperation::NewL(operation, *this, iType, EFalse); - CleanupStack::Pop(operation); // ownership transferred - - if (iSearchAO) - { - iSearchAO->StartOperation(); - - if (!iWaitNote) - { - iWaitNote = new (ELeave) CAknWaitDialog(NULL, ETrue); - if (!iWaitNote->ExecuteLD(R_LMK_PROCESSING_WAIT_NOTE)) - { - iSearchAO->StopOperation(); - delete iSearchAO; - iSearchAO = NULL; - iWaitNote = NULL; - } - } - } - - lmItemsChunk.Close(); - } - -// End of File