diff -r fd64c38c277d -r b46a585f6909 phonebookengines_old/contactsmodel/cntmodel/src/cviewiterator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines_old/contactsmodel/cntmodel/src/cviewiterator.cpp Fri Jun 11 13:29:23 2010 +0300 @@ -0,0 +1,294 @@ +// Copyright (c) 2005-2009 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: +// + +/** + @file + @internalComponent + @released +*/ + + +#include "cviewiterator.h" + + +/** +Constructs CViewIterator object and initialises all its members. + +@param aManager MLplViewIteratorManager interface implemented by the Persistence +Layer. +@param aTextDef CContactTextDef object describing the set of fields which will +be added to each CViewContact object during iteration. +@param aViewPreferences Iteration preferences. +*/ +CViewIterator::CViewIterator(MLplViewIteratorManager& aManager,const CContactTextDef& aTextDef,TContactViewPreferences aViewPreferences) + : + iManager(aManager), + iViewPreferences(aViewPreferences), + iTextDef(aTextDef) + { + iTableMask = TableMask(aTextDef); + } + + +/** +CViewIterator destructor. +*/ +CViewIterator::~CViewIterator() + { + } + + +/** +Move the view iterator to the first view contact. +*/ +void CViewIterator::GoFirstL() + { + iCurrentItemId = -1; + } + + +/** +Move the view iterator to the next view contact and return the view contact +at the new position. + +@return View contact at the next position in the view. The return value will be +NULL if no view contact can be obtained. +*/ +CViewContact* CViewIterator::NextItemL() + { + // Parcel up parameters in 'T' class. + TItemAtLParams params; + params.iGreaterEqual = ETrue; + params.iIndex = ++iCurrentItemId; + params.iMask = iTableMask; + params.iViewPrefs = iViewPreferences; + + // Could be calling proxy if used on client side. + CViewContact *viewContact = iManager.ItemAtL(params,iTextDef, KIgnoreSessionId); + + if (viewContact) + { + iCurrentItemId = viewContact->Id(); + } + + return viewContact; + } + + +/** +Get the view contact with the given Contact ID. + +@return View contact with the given Contact ID. +*/ +CViewContact* CViewIterator::ItemAtL(TInt aCntItemId) + { + iCurrentItemId = aCntItemId; + + // Parcel up parameters in 'T' class. + TItemAtLParams params; + params.iGreaterEqual = EFalse; + params.iIndex = iCurrentItemId; + params.iMask = iTableMask; + params.iViewPrefs = iViewPreferences; + + return iManager.ItemAtL(params, iTextDef, KIgnoreSessionId); + } + + +/** +Get a table mask using the given text definition. + +@param aTextDef Text definition from which to create the table mask. + +@return MLplViewIteratorManager::EIdentityTableOnly if the text definition only +requires access to the Identity table, MLplViewIteratorManager::EAllTables +otherwise. +*/ +MLplViewIteratorManager::TTableMask CViewIterator::TableMask(const CContactTextDef& aTextDef) + { + TInt columns=0; + TInt sortDefFlags=0; + // Find out whether we can do a fast sort using the Identity table by + // looking at the text definition. + CViewIterator::ConstructBitwiseFlagsFromTextDef(sortDefFlags,columns,&aTextDef); + if( UsesIdentityTableOnly(sortDefFlags) ) + { + return MLplViewIteratorManager::EIdentityTableOnly; + } + else + { + return MLplViewIteratorManager::EAllTables; + } + } + + +/** +Update a set of find flags and an Identity table column count from the field +type UIDs in the given field definition. + +@param aFindFlags Updated with those flags which map to the field type UIDs in +aFieldDef. +@param aIdentityColumnsCount Updated with the number of field type UIDs in +aFieldDef which map to columns in the Identity table. +@param aFieldDef Field definition from which to create set of find flags and +Identity table column count. +*/ +void CViewIterator::ConstructBitwiseFindFlags(TInt& aFindFlags,TInt& aIdentityColumnsCount,const CContactItemFieldDef* aFieldDef) + { + if(aFieldDef!=NULL && aFieldDef->Count()>0) + { + for(TInt ii=0;iiCount();ii++) + { + SetFindFlagsAndColumnsCount(aFieldDef->At(ii).iUid,aFindFlags,aIdentityColumnsCount); + } + } + else + { + aFindFlags|=EFindInAllFields|EFindInAnyIdentityField; + } + } + + +/** +Update a set of find flags and an Identity table column count from the field +type UIDs in the given text definition. This can be used to tell the find +method what tables need to be searched for a given text definition. If the text +definition is NULL we search in all tables. + +@param aFindFlags Updated with those flags which map to the field type UIDs in +aTextDef. +@param aIdentityColumnsCount Updated with the number of field type UIDs in +aTextDef which map to columns in the Identity table. +@param aTextDef Text definition from which to create set of find flags and +Identity table column count. +*/ +void CViewIterator::ConstructBitwiseFlagsFromTextDef(TInt& aFindFlags,TInt& aIdentityColumnsCount,const CContactTextDef* aTextDef) + { + if(aTextDef!=NULL && aTextDef->Count()>0) + { + for(TInt ii=0;iiCount();ii++) + { + SetFindFlagsAndColumnsCount(aTextDef->At(ii).iFieldType.iUid,aFindFlags,aIdentityColumnsCount); + } + TFieldType fallback = aTextDef->FallbackField(); + if (fallback!=KUidContactFieldNone) + { + SetFindFlagsAndColumnsCount(fallback.iUid,aFindFlags,aIdentityColumnsCount); + } + } + else + { + aFindFlags|=EFindInAllFields|EFindInAnyIdentityField; + } + } + + +/** +For the given field type UID, increase aIdentityColumnsCount if the field maps +to one of the columns in the Identity table and add the relevant find flag. + +@param aUid Field type UID. +@param aFindFlags Updated with find flag which maps to the given field type UID. +@param aIdentityColumnsCount Incremented if the field type UID maps to a column +in the Identity table. +*/ +void CViewIterator::SetFindFlagsAndColumnsCount(TInt32 aUid,TInt& aFindFlags,TInt& aIdentityColumnsCount) + { + switch(aUid) + { + case KUidContactFieldGivenNameValue: + { + aIdentityColumnsCount++; + aFindFlags|=EFindFirstName; + break; + } + case KUidContactFieldFamilyNameValue: + { + aIdentityColumnsCount++; + aFindFlags|=EFindLastName; + break; + } + case KUidContactFieldCompanyNameValue: + { + aIdentityColumnsCount++; + aFindFlags|=EFindCompanyName; + break; + } + case KUidContactFieldGivenNamePronunciationValue: + { + aIdentityColumnsCount++; + aFindFlags|=EFindFirstNamePronunciation; + break; + } + case KUidContactFieldFamilyNamePronunciationValue: + { + aIdentityColumnsCount++; + aFindFlags|=EFindLastNamePronunciation; + break; + } + case KUidContactFieldCompanyNamePronunciationValue: + { + aIdentityColumnsCount++; + aFindFlags|=EFindCompanyNamePronunciation; + break; + } + case KUidContactFieldEMailValue: + { + aFindFlags|=EFindInEmailTableOnly; + break; + } + case KUidContactFieldMatchAllValue: + { + aFindFlags|=EFindInAllFields|EFindInAnyIdentityField; + break; + } + default: + aFindFlags|=EFindInAllFields; + } + } + + +/** +Determine if the Identity table requires to be searched for the given find +flags. + +@param aFindFlags Set of find flags describing which fields will be searched. + +@return ETrue If one of the flags in aFindFlags maps to a column in the Identity +table, EFalse otherwise. +*/ +TBool CViewIterator::SearchIdentityTableRequired(TInt aFindFlags) + { + return aFindFlags & + ( EFindInAnyIdentityField | EFindFirstName | EFindLastName | EFindCompanyName | + EFindFirstNamePronunciation | EFindLastNamePronunciation | EFindCompanyNamePronunciation); + } + + +/** +Determine if only the Identity table requires to be searched for the given find +flags. + +@param aFindFlags Set of find flags describing which fields will be searched. + +@return ETrue If one of the flags in aFindFlags maps to a column in the Identity +table and no columns in any other table, EFalse otherwise. +*/ +TBool CViewIterator::UsesIdentityTableOnly(TInt aFindFlags) + { + return (aFindFlags & (EFindFirstName | EFindLastName | EFindCompanyName | + EFindFirstNamePronunciation |EFindLastNamePronunciation |EFindCompanyNamePronunciation) ) && + ! (aFindFlags & (EFindInAllFields | EFindInEmailTableOnly) ); + }