diff -r 000000000000 -r 14df0fbfcc4e sapi_contacts_vpbk/src/contactiterator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sapi_contacts_vpbk/src/contactiterator.cpp Mon Mar 30 12:51:10 2009 +0300 @@ -0,0 +1,291 @@ +/* +* Copyright (c) 2006-2007 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: Iterator in the output of GetList +* +*/ + + +#include "contactiterator.h" +#include "contactinterface.hrh" + +/* +----------------------------------------------------------------------------- + CContactIterator::~CContactIterator() + Description : Destructor + Return values : N/A +----------------------------------------------------------------------------- +*/ +CContactIterator::~CContactIterator() + { + delete iContactIter; + } + + +/* +----------------------------------------------------------------------------- + CContactIterator::NewL() + Description : Allocates memory + Return values : Returns class instance +----------------------------------------------------------------------------- +*/ + +CContactIterator* CContactIterator::NewL(CContactIter* aIter) + { + return (new (ELeave) CContactIterator(aIter)); + } + + +/* +----------------------------------------------------------------------------- + CContactIterator::CContactIterator() + Description : Constructor- Initializes data + Return values : N/A +----------------------------------------------------------------------------- +*/ +CContactIterator::CContactIterator(CContactIter* aIter) + { + iContactIter = aIter; + iIndex = -1; + } + +/* +----------------------------------------------------------------------------- + CContactIterator::Reset() + Description : Resets the cursor of the iterator to -1 + Return values : N/A +----------------------------------------------------------------------------- +*/ +void CContactIterator:: Reset() + { + iIndex=-1; + } + +/* +----------------------------------------------------------------------------- + CContactIterator::GetContactIDUTF() + Description : Converts to UTF format + Return values : N/A +----------------------------------------------------------------------------- +*/ +void CContactIterator :: ContactIDToUTF(HBufC* aContactID) + { + TInt len = aContactID->Length(); + TUint16* ptr16 = const_cast (aContactID->Des().Ptr()); + for(TInt i=0; iiIndicator == EContacts) + { + CSingleContact* contact = NULL; + HBufC8* cntId = NULL ; + CSingleContactField* field = NULL; + HBufC* cntIdUnicode = NULL; + + //Get the next contact on the list + iContactIter->NextL(contact, cntId); + + if(contact) + { + TPtrC8 fieldName; + TPtrC fieldLabel; + TPtrC fieldValue; + TTime fieldTime; + TBool date = EFalse; + + CleanupStack :: PushL(contact); + + pContactMap = CLiwDefaultMap::NewL(); + CleanupStack :: PushL(pContactMap); + + cntIdUnicode = HBufC::NewL(cntId->Length()); + CleanupStack :: PushL(cntIdUnicode); + cntIdUnicode->Des().Copy(*cntId); + delete cntId; + cntId = NULL; + ContactIDToUTF(cntIdUnicode); + pContactMap->InsertL(KContactId,TLiwVariant(*cntIdUnicode)); + CleanupStack :: Pop(cntIdUnicode); + + TLiwVariant val; + CleanupStack::PushL( TCleanupItem( TLiwVariant::VariantCleanup , &val) ); + + TInt fieldCount = contact->FieldCount(); + for(TInt i=0 ; i< fieldCount ; i++) + { + CLiwMap* pFieldLinkedMap = CLiwDefaultMap::NewL(); + CleanupClosePushL(*pFieldLinkedMap); + //Get the next field + field = contact->FieldAt(i); + + //Get field data and populate the map structure + field->GetFieldDataL(fieldName, fieldLabel, fieldValue); + if((fieldName.Compare(KDate) == 0) || (fieldName.Compare(KAnniversary) == 0)) + { + date = ETrue; + fieldTime = field->GetDateTime(); + } + + if(EFalse != pContactMap->FindL(fieldName,val)) + { + //In case there are multiple values for a given Fieldkey, add "Next" key to the map. + // and create a linked list of label-value pairs for a given key + pFieldLinkedMap->InsertL(KFieldLabel,TLiwVariant(fieldLabel)); + if(date) + { + pFieldLinkedMap->InsertL(KFieldValue,TLiwVariant(fieldTime)); + } + else + { + pFieldLinkedMap->InsertL(KFieldValue,TLiwVariant(fieldValue)); + } + pFieldLinkedMap->InsertL(KFieldNext,TLiwVariant(val)); + } + else + { + //In case its the first time the FieldKey is being read, just have label-value pair inserted + pFieldLinkedMap->InsertL(KFieldLabel,TLiwVariant(fieldLabel)); + if(date) + { + date = EFalse; + pFieldLinkedMap->InsertL(KFieldValue,TLiwVariant(fieldTime)); + } + else + { + pFieldLinkedMap->InsertL(KFieldValue,TLiwVariant(fieldValue)); + } + } + //For the given Fieldkey insert the label-value pair + pContactMap->InsertL(fieldName, TLiwVariant(pFieldLinkedMap)); + CleanupStack::PopAndDestroy(pFieldLinkedMap); + } + CleanupStack::Pop(&val); + val.Reset(); + CleanupStack::Pop(pContactMap); + CleanupStack::PopAndDestroy(contact); + retVal = ETrue; + } + else + { + delete cntId; + } + } + //In case the iterator is iterating over a list of groups + else if(iContactIter->iIndicator == EGroups) + { + CSingleContact* contact; + HBufC8* grpID; + CSingleContactField* field; + HBufC* grpUnicode = NULL; + //Get the next group + iContactIter->NextL(contact, grpID); + + if(contact) + { + CleanupStack::PushL(contact); + + TPtrC groupLabel; + RPointerArray array; + CleanupClosePushL(array); + pContactMap = CLiwDefaultMap::NewL(); + CleanupStack::PushL(pContactMap); + + grpUnicode = HBufC::NewL(grpID->Length()); + grpUnicode->Des().Copy(*grpID); + delete grpID; + grpID = NULL; + ContactIDToUTF(grpUnicode); + CleanupStack::PushL(grpUnicode); + //Insert the contact id + pContactMap->InsertL(KGroupId,TLiwVariant(*grpUnicode)); + CleanupStack::Pop(grpUnicode); + + field = contact->FieldAt(0); + + //Get the field data of the group + field->GetFieldDataL(groupLabel, array); + + //Insert group label + pContactMap->InsertL(KGroupLabel,TLiwVariant(groupLabel)); + + CLiwList* pContentsList = CLiwDefaultList::NewL(); + CleanupClosePushL(*pContentsList); + TInt count = array.Count(); + if(count) + { + for(TInt i=0; iLength()); + cntidUni->Des().Copy(*array[i]); + CleanupStack::PushL(cntidUni); + ContactIDToUTF(cntidUni); + pContentsList->AppendL(*cntidUni); + CleanupStack::Pop(cntidUni); + } + //Insert the list of contacts for the given group + pContactMap->InsertL(KContents,TLiwVariant(pContentsList)); + } + CleanupStack::PopAndDestroy(pContentsList); + CleanupStack :: Pop(pContactMap); + CleanupStack :: PopAndDestroy(); + CleanupStack :: PopAndDestroy(contact); + + retVal = ETrue; + } + else + { + delete grpID; + } + } + //In case iterator is iterating over list of databases + else if(iContactIter->iIndicator == EDatabase) + { + TPtrC DbName; + //Get the next database name + iContactIter->NextL(DbName); + if(DbName.Compare(KNullDesC) != 0) + { + pContactMap = CLiwDefaultMap::NewL(); + CleanupStack::PushL(pContactMap); + //Insert DbName into the map + pContactMap->InsertL(KDBUri,TLiwVariant(DbName)); + CleanupStack::Pop(pContactMap); + retVal = ETrue; + } + } + if(pContactMap) + { + CleanupClosePushL(*pContactMap); + aEntry.SetL(pContactMap); + CleanupStack::PopAndDestroy(pContactMap); + } + return retVal; + }