diff -r a36b1e19a461 -r 989d2f495d90 serviceproviders/sapi_contacts_vpbk/contactservice/src/contactiter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serviceproviders/sapi_contacts_vpbk/contactservice/src/contactiter.cpp Fri Jul 03 15:51:24 2009 +0100 @@ -0,0 +1,281 @@ +/* +* Copyright (c) 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: +* +*/ + + + +#include "contactiter.h" +#include "contactretrieveobserver.h" +#include "contactservice.hrh" +#include "getliststorelistobserver.h" +#include +#include +#include +#include +#include +#include +#include + + +//Initialize the class variable with the result of ReadContactL +void CContactIter::SetContactFetchResult(MVPbkStoreContact* aContact) + { + iContact = aContact; + } + + +/** + * Set the class variables with the parameters sent from CContactViewObserver + */ +TInt CContactIter::SetParams(MVPbkContactLinkArray * aContactLinkArray, + const TDesC& aStoreUri, + TOrder aSortOrder, + TInt aTransId, + Ttype aIndicator, + CContactService* aContactService) + { + TInt retVal = KErrNone; + + iContactLinkArray =aContactLinkArray; + iCount = aContactLinkArray->Count(); + + iStoreUri = &aStoreUri; + iSortOrder = aSortOrder; + iTransId = aTransId; + iIndicator = aIndicator; + iContactService = aContactService; + TRAPD(error, SetupEnvironL()); + if(error != KErrNone) + { + retVal = error; + } + return retVal; + } + + +void CContactIter::SetupEnvironL() + { + if((iIndicator == EContacts) && (iContactLinkArray->Count() == 1)) + { + iStoreUri = &(iContactLinkArray->At(0).ContactStore().StoreProperties().Uri().UriDes()); + } + + iSyncIter = CContactSyncIter::NewL(); + SetupDBL(); + } +/* + * NextL Function gets the next contact/group in the linkarray. + * Based on the Ascending/Desending order chosen the links are read in that order + */ + +EXPORT_C void CContactIter::NextL(CSingleContact*& aSingleContact, HBufC8*& aContactID ) + { + + MVPbkContactLink* link = NULL; + // Create the instance of CContactSyncIter class , + // which has methods for making the iterator synchronous + + if((iCount>=1) && (iCursor < (iCount-1)) && (iSortOrder == EAsc)) + { + + //Setup the Database before reading + + CContactRetrieveObserver* newObserver = CContactRetrieveObserver::NewL(this); + CleanupStack::PushL(newObserver); + // Reads the Contact/Group info + ReadContactL(((*iContactLinkArray)[++iCursor]), *newObserver); + + // for the request to be complete + iSyncIter->Wait(); + + link = const_cast(&((*iContactLinkArray)[iCursor])); + + //Set the output param + aSingleContact = CSingleContact::NewL(iContact, iIndicator); + + //Intialiaze the ContactId info using PackLC() method + aContactID = link->PackLC(); + aSingleContact->SetContactIdL(*aContactID); + + CleanupStack::Pop(aContactID); + CleanupStack::Pop(newObserver); + } + else if(iSortOrder == EDesc) + { + if(iCursor == -1) + { + iCursor = iCount; + } + if(iCursor != 0) + { + //Setup the Database before reading + + CContactRetrieveObserver* newObserver = CContactRetrieveObserver::NewL(this); + CleanupStack::PushL(newObserver); + + // Reads the Contact/Group info + ReadContactL(((*iContactLinkArray)[--iCursor]), *newObserver); + + // for the request to be complete + iSyncIter->Wait(); + + link = const_cast(&((*iContactLinkArray)[iCursor])); + + //Set the output param + aSingleContact = CSingleContact::NewL(iContact, iIndicator); + + //Intialiaze the ContactId info using PackLC() method + aContactID = link->PackLC(); + aSingleContact->SetContactIdL(*aContactID); + + CleanupStack::Pop(aContactID); + CleanupStack::Pop(newObserver); + } + else + { + aSingleContact = NULL; + aContactID = KNullDesC8().Alloc(); + } + } + else + { + aSingleContact = NULL; + aContactID = KNullDesC8().Alloc(); + } + + } + +//Method for reading the next Database name in the list of names +EXPORT_C void CContactIter::NextL(TPtrC& aDbs) + { + if(iDbArray.Count()) + { + if((iCount>=1) && (iCursor < (iCount-1))) + { + aDbs.Set(*(iDbArray[++iCursor])); + } + else + { + aDbs.Set(KNullDesC); + } + } + else + { + aDbs.Set(KNullDesC); + } + } + +//Initialises the cursor +EXPORT_C void CContactIter::Reset() + { + iCursor = -1; + } + +//Sets the array of databases and the number of them +void CContactIter::SetDbNamePtr(RPointerArray& aArray, TInt aCnt) + { + iIndicator = EDatabase; + iDbArray= aArray; + iCount = aCnt; + } + +//Sets up the database before any operation could be performed over it. +void CContactIter::SetupDBL() +{ + CVPbkContactStoreUriArray* uriList = CVPbkContactStoreUriArray::NewLC(); + uriList->AppendL( TVPbkContactStoreUriPtr( *iStoreUri ) ); + + User::LeaveIfError( iFs.Connect() ); + + iContactManager = CVPbkContactManager::NewL( *uriList ,&iFs ); + + MVPbkContactStoreList& stores = iContactManager->ContactStoresL(); + + iContactStore = &( stores.At( (stores.Count())-1 ) ); + + TDesC16* aSearchVal = NULL; + TDesC8* cntId = NULL; + CContactIter* self = this; + + + iGetListStoreListObserver = CGetListStoreListObserver::NewL(*iStoreUri, + *cntId, + *aSearchVal , + NULL, + ENULL, + NULL, + iContactService, + self, + EOthers, + iTransId, + NULL) ; + if(iContactStore) + { + iContactStore->OpenL( *iGetListStoreListObserver ); + } + + //Making opening Database Synchronous + iSyncIter->Wait(); + + CleanupStack::PopAndDestroy(uriList); + +} + + +// Method that will go and fetch individual contacts +void CContactIter::ReadContactL( const MVPbkContactLink& aLink, CContactRetrieveObserver& aObserver ) + { + MVPbkContactOperationBase* ret = iContactManager->RetrieveContactL(aLink,aObserver); + } + + +CContactIter::CContactIter() + { + iCursor = iCount = -1; + iContactLinkArray=NULL; + iContactManager = NULL; + } + +EXPORT_C CContactIter* CContactIter::NewL() + { + return new (ELeave) CContactIter(); + } + + +CContactIter::~CContactIter() + { + if(iGetListStoreListObserver) + { + delete iGetListStoreListObserver; + } + if(iContactLinkArray) + { + delete iContactLinkArray; + } + iFs.Close(); + if(iContactManager) + { + delete iContactManager; + iContactManager =NULL; + } + if(iSyncIter) + { + delete iSyncIter; + iSyncIter = NULL; + } + iDbArray.ResetAndDestroy(); + } +