--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/PhoneCntFinder/ContactService/src/cphcntcontactstoreuris.cpp Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,346 @@
+/*
+* Copyright (c) 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: Contact store Uris
+*
+*/
+
+#include <CVPbkContactStoreUriArray.h>
+#include <VPbkContactStoreUris.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <centralrepository.h>
+#include <talogger.h>
+
+#include "telinternalcrkeys.h"
+#include "cphcntcontactstoreuris.h"
+#include "mphcntcontactstoreeventobserver.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Static constructor
+// ---------------------------------------------------------------------------
+//
+CPhCntContactStoreUris* CPhCntContactStoreUris::NewL()
+ {
+ TEFLOGSTRING( KTAOBJECT, "CNT CPhCntContactStoreUris::NewL" );
+ CPhCntContactStoreUris* self = new( ELeave ) CPhCntContactStoreUris;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPhCntContactStoreUris::~CPhCntContactStoreUris()
+ {
+ TEFLOGSTRING( KTAOBJECT, "CNT CPhCntContactStoreUris::~CPhCntContactStoreUris" );
+ delete iContactStoreUriArray;
+ delete iAdditionalContactStoreUriArray;
+ iContactStoreStates.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// Contact store uris
+// ---------------------------------------------------------------------------
+//
+CVPbkContactStoreUriArray& CPhCntContactStoreUris::ContactStores() const
+ {
+ return *iContactStoreUriArray;
+ }
+
+// ---------------------------------------------------------------------------
+// Currently active contact stores.
+// ---------------------------------------------------------------------------
+//
+CVPbkContactStoreUriArray* CPhCntContactStoreUris::ActiveContactStoresL() const
+ {
+ TEFLOGSTRING( KTAOBJECT, "CNT CPhCntContactStoreUris::ActiveContactStoresL" );
+ CVPbkContactStoreUriArray* array = CVPbkContactStoreUriArray::NewLC();
+ const TInt count( iContactStoreStates.Count() );
+ for( TInt i = 0; i < count; i++ )
+ {
+ const TPhCntContactStoreState& storeState = iContactStoreStates[i];
+ if( storeState.IsAvailable() )
+ {
+ TEFLOGSTRING2( KTAOBJECT,
+ "CNT CPhCntContactStoreUris::ActiveContactStoresL - Append store: %S",
+ &storeState.ContactStoreUri().UriDes() );
+ array->AppendL( storeState.ContactStoreUri() );
+ }
+ }
+ CleanupStack::Pop( array );
+ return array;
+ }
+
+// ---------------------------------------------------------------------------
+// Updates store availability
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::StoreReady(
+ TVPbkContactStoreUriPtr& aContactStoreUri )
+ {
+ TEFLOGSTRING2( KTAOBJECT, "CNT CPhCntContactStoreUris::StoreReady = %S",
+ &aContactStoreUri.UriDes() );
+ SetContactStoreAvailability( aContactStoreUri, ETrue );
+ }
+
+// ---------------------------------------------------------------------------
+// Updates store availability
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::StoreUnavailable(
+ TVPbkContactStoreUriPtr& aContactStoreUri )
+ {
+ TEFLOGSTRING2( KTAOBJECT, "CNT CPhCntContactStoreUris::StoreUnavailable = %S",
+ &aContactStoreUri.UriDes() );
+ SetContactStoreAvailability( aContactStoreUri, EFalse );
+ }
+
+// ---------------------------------------------------------------------------
+// Sets observer
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::SetObserver(
+ MPhCntContactStoreEventObserver& aObserver )
+ {
+ iObserver = &aObserver;
+ }
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CPhCntContactStoreUris::CPhCntContactStoreUris()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::ConstructL()
+ {
+ TEFLOGSTRING( KTAOBJECT, "CNT CPhCntContactStoreUris::ConstructL" );
+ iAdditionalContactStoreUriArray = CVPbkContactStoreUriArray::NewL();
+
+ // Read additional, product configured contact stores.
+ HBufC* productSpecificList = HBufC::NewLC(
+ NCentralRepositoryConstants::KMaxUnicodeStringLength );
+ TPtr productSpecificListPtr( productSpecificList->Des() );
+ ReadAdditionalContactStoreL( &productSpecificListPtr );
+
+ // Append additional stores to contact store array
+ TInt count( iAdditionalContactStoreUriArray->Count() );
+ for( TInt i = 0; i < count; i++ )
+ {
+ iContactStoreStates.AppendL( (*iAdditionalContactStoreUriArray)[i] );
+ }
+
+ iContactStoreStates.AppendL(
+ TVPbkContactStoreUriPtr(
+ VPbkContactStoreUris::DefaultCntDbUri() ) );
+ iContactStoreStates.AppendL(
+ TVPbkContactStoreUriPtr(
+ VPbkContactStoreUris::SimGlobalOwnNumberUri() ) );
+ iContactStoreStates.AppendL(
+ TVPbkContactStoreUriPtr(
+ VPbkContactStoreUris::SimGlobalAdnUri() ) );
+ iContactStoreStates.AppendL(
+ TVPbkContactStoreUriPtr(
+ VPbkContactStoreUris::SimGlobalFdnUri() ) );
+ iContactStoreStates.AppendL(
+ TVPbkContactStoreUriPtr(
+ VPbkContactStoreUris::SimGlobalSdnUri() ) );
+
+ const TInt count_2( iContactStoreStates.Count() );
+ iContactStoreUriArray = CVPbkContactStoreUriArray::NewL();
+ for( TInt i = 0; i < count_2; i++ )
+ {
+ TEFLOGSTRING3( KTAOBJECT,
+ "CNT CPhCntContactStoreUris::ConstructL - Append store = %S, Available: %d",
+ &iContactStoreStates[i].ContactStoreUri().UriDes(),
+ iContactStoreStates[i].IsAvailable() );
+ iContactStoreUriArray->AppendL( iContactStoreStates[i].ContactStoreUri() );
+ }
+ CleanupStack::PopAndDestroy( productSpecificList );
+ }
+
+// ---------------------------------------------------------------------------
+// Sets contact stores availability
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::SetContactStoreAvailability(
+ TVPbkContactStoreUriPtr& aStoreUri,
+ TBool aIsAvailable )
+ {
+ TEFLOGSTRING( KTAOBJECT, "CPhCntContactStoreUris::SetContactStoreAvailability" );
+ const TInt count( iContactStoreStates.Count() );
+ for( TInt i = 0; i < count; i++ )
+ {
+ TPhCntContactStoreState& storeState = iContactStoreStates[i];
+ if( storeState.ContactStoreUri().Compare(
+ aStoreUri,
+ TVPbkContactStoreUriPtr::EContactStoreUriAllComponents )
+ == KErrNone )
+ {
+ TEFLOGSTRING2( KTAOBJECT, "SetAvailability: %d", aIsAvailable );
+ storeState.SetAvailability( aIsAvailable );
+ }
+ }
+ if( iObserver )
+ {
+ iObserver->ContactStoreAvailabilityChanged();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Read list of additional contact stores from cenrep
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::ReadAdditionalContactStoreL( TDes* aProductSpecificList )
+ {
+ // Read The product specific VPBK stores from cenrep
+ CRepository* repository = CRepository::NewLC( KCRUidTelVariation );
+
+ TInt err( KErrNone );
+ err = repository->Get( KTelAdditionalStores, *aProductSpecificList );
+
+ if ( err == KErrNone && aProductSpecificList->Length() )
+ {
+ ParseStoresL( *aProductSpecificList );
+ } // if ( err == KErrNone && product...
+ CleanupStack::PopAndDestroy( repository );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Adds contact store.
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::AddContactStoreL(
+ const TVPbkContactStoreUriPtr& aContactStoreUri )
+ {
+ TPhCntContactStoreState candidate
+ = TPhCntContactStoreState( aContactStoreUri );
+
+ TInt index = iContactStoreStates.Find( candidate, MatchUris );
+ if ( KErrNotFound == index )
+ {
+ iContactStoreStates.AppendL( candidate );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Removes contact store.
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::RemoveContactStore(
+ const TVPbkContactStoreUriPtr& aContactStoreUri )
+ {
+ TPhCntContactStoreState candidate
+ = TPhCntContactStoreState( aContactStoreUri );
+
+ TInt index = iContactStoreStates.Find( candidate, MatchUris );
+ if ( KErrNotFound != index )
+ {
+ iContactStoreStates.Remove( index );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Parses store names from comma separated list.
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactStoreUris::ParseStoresL( const TDesC& aProductSpecificList )
+ {
+ const TChar KStoreSeparatorComma = ',';
+ TChar chr;
+ TLex storeToken ( aProductSpecificList );
+ HBufC* db;
+
+ while ( !storeToken.Eos() )
+ {
+ // Skip spaces
+ // e.g. " store1,store2"
+ storeToken.SkipSpaceAndMark();
+
+ // if several commas in row, skip them all.
+ while ( storeToken.Peek() == KStoreSeparatorComma )
+ {
+ // e.g. ",,store1,store2"
+ storeToken.SkipAndMark(1);
+ // Or ",[space],,"
+ storeToken.SkipSpaceAndMark();
+ }
+
+ // Loop until ',' or eof to parse next store
+ do
+ {
+ chr = storeToken.Get();
+ }
+ while ( chr != KStoreSeparatorComma && !storeToken.Eos() );
+
+ if ( !storeToken.Eos() )
+ {
+ // Reverse not to include comma.
+ storeToken.UnGet();
+ }
+
+ if ( storeToken.TokenLength() )
+ {
+ // Append to parsed stores array, so that visibility of
+ // all additional DB URIs is maintained.
+ db = HBufC::NewLC( storeToken.TokenLength() );
+ db->Des().Copy( storeToken.MarkedToken() );
+
+ // Append to additional store array.
+ iAdditionalContactStoreUriArray->AppendL( TVPbkContactStoreUriPtr( *db ) );
+ CleanupStack::PopAndDestroy( db );
+ //CleanupStack::Pop( db );
+ }
+
+ } // while ( !storeToken.Eos() )..
+ }
+
+// ---------------------------------------------------------------------------
+// Additional Contact store uris
+// ---------------------------------------------------------------------------
+//
+const CVPbkContactStoreUriArray& CPhCntContactStoreUris::AdditionalContactStores() const
+ {
+ return *iAdditionalContactStoreUriArray;
+ }
+
+// ---------------------------------------------------------------------------
+// Implements TIdentityRelation for class TPhCntContactStoreState.
+// ---------------------------------------------------------------------------
+//
+TBool CPhCntContactStoreUris::MatchUris(
+ const TPhCntContactStoreState& aState1,
+ const TPhCntContactStoreState& aState2 )
+ {
+ TVPbkContactStoreUriPtr uri1( aState1.ContactStoreUri() );
+ TVPbkContactStoreUriPtr uri2( aState2.ContactStoreUri() );
+
+ return (
+ uri1.Compare( uri2,
+ TVPbkContactStoreUriPtr::EContactStoreUriAllComponents )
+ == 0 );
+ }
+
+