--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Presentation/src/CPbk2StoreConfigurationImpl.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,540 @@
+/*
+* Copyright (c) 2002-2007 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2StoreConfigurationImpl.h"
+
+// Phonebook2
+#include "CPbk2StoreConfigurationMonitor.h"
+#include "CPbk2DefaultSavingStoreMonitor.h"
+#include <Phonebook2InternalCRKeys.h>
+
+// Virtual Phonebook
+#include <TVPbkContactStoreUriPtr.h>
+#include <CVPbkContactStoreUriArray.h>
+
+// System includes
+#include <centralrepository.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+// Unnamed namespace for local definitions
+namespace {
+
+// Definition for contact initial contact store uri size
+const TInt KInitialStoreUriSize = 1;
+
+} // namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::CPbk2StoreConfigurationImpl
+// --------------------------------------------------------------------------
+//
+CPbk2StoreConfigurationImpl::CPbk2StoreConfigurationImpl()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::~CPbk2StoreConfigurationImpl
+// --------------------------------------------------------------------------
+//
+CPbk2StoreConfigurationImpl::~CPbk2StoreConfigurationImpl()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::~CPbk2StoreConfigurationImpl(0x%x)"), this);
+
+ iObservers.Reset();
+ iDefaultStoreObservers.Reset();
+ delete iDefaultSavingStoreMonitor;
+ delete iConfigurationMonitor;
+ delete iRepository;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2StoreConfigurationImpl* CPbk2StoreConfigurationImpl::NewL()
+ {
+ CPbk2StoreConfigurationImpl* self = new(ELeave) CPbk2StoreConfigurationImpl;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::ConstructL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::ConstructL(0x%x)"), this);
+
+ iRepository = CRepository::NewL
+ (TUid::Uid(KCRUidPhonebookStoreConfiguration));
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::ConstructL(0x%x) Repository created"), this);
+
+ iConfigurationMonitor = CPbk2StoreConfigurationMonitor::NewL
+ ( *iRepository, *this );
+
+ iDefaultSavingStoreMonitor = CPbk2DefaultSavingStoreMonitor::NewL
+ ( *iRepository, *this );
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::ConstructL(0x%x) end"), this);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::CurrentConfigurationL
+// --------------------------------------------------------------------------
+//
+CVPbkContactStoreUriArray*
+ CPbk2StoreConfigurationImpl::CurrentConfigurationL() const
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::CurrentConfigurationL(0x%x)"), this);
+
+ CVPbkContactStoreUriArray* result = CVPbkContactStoreUriArray::NewLC();
+
+ RArray<TUint32> configurationKeys;
+ CleanupClosePushL(configurationKeys);
+
+ iRepository->FindL(KPhonebookCurrentConfigurationPartialKey,
+ KPhonebookCurrentConfigurationMask,
+ configurationKeys);
+
+ HBufC* buffer = HBufC::NewLC(KInitialStoreUriSize);
+ const TInt keyCount = configurationKeys.Count();
+ for (TInt i = 0; i < keyCount; ++i)
+ {
+ TPtr ptr = buffer->Des();
+ ptr.Zero();
+ TInt actualSize = 0;
+ TInt ret = iRepository->Get(configurationKeys[i], ptr, actualSize);
+ if (ret == KErrOverflow)
+ {
+ CleanupStack::PopAndDestroy(); // buffer
+ buffer = HBufC::NewLC(actualSize);
+ ptr.Set(buffer->Des());
+ User::LeaveIfError(iRepository->Get(configurationKeys[i], ptr));
+ }
+ else
+ {
+ User::LeaveIfError(ret);
+ }
+ if( !result->IsIncluded( TVPbkContactStoreUriPtr( ptr ) ) ) // Only append if the uri is not yet included
+ {
+ result->AppendL( ptr );
+ }
+
+ }
+ CleanupStack::PopAndDestroy(); // buffer
+
+ CleanupStack::PopAndDestroy(); // configurationKeys
+ CleanupStack::Pop(result); // result
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::CurrentConfigurationL(0x%x) end"), this);
+
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::SearchStoreConfigurationL
+// --------------------------------------------------------------------------
+//
+CVPbkContactStoreUriArray*
+ CPbk2StoreConfigurationImpl::SearchStoreConfigurationL()
+ {
+ CVPbkContactStoreUriArray* result = CVPbkContactStoreUriArray::NewLC();
+
+ // The default saving store shall be appended to the result array
+ // as an first element, when it becomes available
+
+ // Finally append the current Phonebook configuration for searching
+ CVPbkContactStoreUriArray* currentConfiguration = CurrentConfigurationL();
+ CleanupStack::PushL(currentConfiguration);
+ result->AppendAllL(*currentConfiguration);
+ CleanupStack::PopAndDestroy(currentConfiguration);
+ CleanupStack::Pop(result);
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::SupportedStoreConfigurationL
+// --------------------------------------------------------------------------
+//
+CVPbkContactStoreUriArray*
+ CPbk2StoreConfigurationImpl::SupportedStoreConfigurationL() const
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::SupportedStoreConfigurationL(0x%x)"), this);
+
+ CVPbkContactStoreUriArray* result = CVPbkContactStoreUriArray::NewLC();
+
+ RArray<TUint32> configurationKeys;
+ CleanupClosePushL( configurationKeys );
+
+ User::LeaveIfError( iRepository->FindL(
+ KPhonebookSupportedConfigurationPartialKey,
+ KPhonebookSupportedConfigurationMask,
+ configurationKeys ) );
+
+ HBufC* buffer = HBufC::NewLC(KInitialStoreUriSize);
+ const TInt keyCount = configurationKeys.Count();
+ for (TInt i = 0; i < keyCount; ++i)
+ {
+ TPtr ptr = buffer->Des();
+ ptr.Zero();
+ TInt actualSize = 0;
+ TInt ret = iRepository->Get(configurationKeys[i], ptr, actualSize);
+ if (ret == KErrOverflow)
+ {
+ CleanupStack::PopAndDestroy(); // buffer
+ buffer = HBufC::NewLC(actualSize);
+ ptr.Set(buffer->Des());
+ User::LeaveIfError(iRepository->Get(configurationKeys[i], ptr));
+ }
+ else
+ {
+ User::LeaveIfError(ret);
+ }
+ result->AppendL(ptr);
+ }
+ CleanupStack::PopAndDestroy(); // buffer
+
+ CleanupStack::PopAndDestroy(); // configurationKeys
+ CleanupStack::Pop(result); // result
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::SupportedStoreConfigurationL(0x%x) end"), this);
+
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::DefaultSavingStoreL
+// --------------------------------------------------------------------------
+//
+TVPbkContactStoreUriPtr
+ CPbk2StoreConfigurationImpl::DefaultSavingStoreL() const
+ {
+ return iDefaultSavingStoreMonitor->DefaultSavingStoreL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::AddContactStoreURIL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::AddContactStoreURIL
+ (TVPbkContactStoreUriPtr aURI)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::AddContactStoreURIL(0x%x)"), this);
+
+ RArray<TUint32> configurationKeys;
+ CleanupClosePushL(configurationKeys);
+
+ iRepository->FindL(
+ KPhonebookCurrentConfigurationPartialKey,
+ KPhonebookCurrentConfigurationMask,
+ configurationKeys);
+
+ if ( AlreadyRegisteredL( aURI, configurationKeys ) )
+ {
+ User::Leave( KErrAlreadyExists );
+ }
+
+ // Find the first free key starting from
+ // KPhonebookCurrentConfigurationFirstKey
+ TBool keyFound = EFalse;
+ TUint32 newKey = KPhonebookCurrentConfigurationFirstKey;
+ for (TInt i = KPhonebookCurrentConfigurationFirstKey;
+ i < KPhonebookCurrentConfigurationLastKey && !keyFound; ++i)
+ {
+ if (configurationKeys.Find(i) == KErrNotFound)
+ {
+ newKey = i;
+ keyFound = ETrue;
+ }
+ }
+
+ if (!keyFound)
+ {
+ User::Leave(KErrOverflow);
+ }
+
+ TInt err = iRepository->Create(newKey, aURI.UriDes());
+ User::LeaveIfError(err);
+
+ CleanupStack::PopAndDestroy(); // configurationKeys
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::AddContactStoreURIL(0x%x) end"), this);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::RemoveContactStoreURIL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::RemoveContactStoreURIL
+ (TVPbkContactStoreUriPtr aURI)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::RemoveContactStoreURIL(0x%x)"), this);
+
+ RArray<TUint32> configurationKeys;
+ CleanupClosePushL(configurationKeys);
+
+ iRepository->FindEqL(
+ KPhonebookCurrentConfigurationPartialKey,
+ KPhonebookCurrentConfigurationMask,
+ aURI.UriDes(),
+ configurationKeys);
+
+ const TInt keyCount = configurationKeys.Count();
+ for (TInt i = 0; i < keyCount; ++i)
+ {
+ iRepository->Delete(configurationKeys[i]);
+ }
+ CleanupStack::PopAndDestroy(); // configurationKeys
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::RemoveContactStoreURIL(0x%x) end"), this);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::AddObserverL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::AddObserverL
+ (MPbk2StoreConfigurationObserver& aObserver)
+ {
+ iObservers.Append( &aObserver );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::RemoveObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::RemoveObserver
+ (MPbk2StoreConfigurationObserver& aObserver)
+ {
+ TInt index = iObservers.Find(&aObserver);
+ if (index != KErrNotFound)
+ {
+ iObservers.Remove(index);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::AddDefaultSavingStoreObserverL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::AddDefaultSavingStoreObserverL
+ ( MPbk2DefaultSavingStoreObserver& aObserver )
+ {
+ TInt index = iDefaultStoreObservers.Find(&aObserver);
+ if (index == KErrNotFound)
+ {
+ // Insert to the beginning so that the observers will get the
+ // events in the order they have registere
+ // This has to be done because events are sent from last to first
+ // in the ConfigurationChanged function
+ iDefaultStoreObservers.InsertL(&aObserver, 0);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::RemoveDefaultSavingStoreObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::RemoveDefaultSavingStoreObserver
+ ( MPbk2DefaultSavingStoreObserver& aObserver )
+ {
+ TInt index = iDefaultStoreObservers.Find(&aObserver);
+ if (index != KErrNotFound)
+ {
+ iDefaultStoreObservers.Remove(index);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::AddSupportedContactStoreURIL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::AddSupportedContactStoreURIL
+ ( TVPbkContactStoreUriPtr aURI )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::AddSupportedContactStoreURIL(0x%x)"), this);
+
+ RArray<TUint32> configurationKeys;
+ CleanupClosePushL(configurationKeys);
+
+ iRepository->FindL(
+ KPhonebookSupportedConfigurationPartialKey,
+ KPhonebookSupportedConfigurationMask,
+ configurationKeys);
+
+ if ( AlreadyRegisteredL( aURI, configurationKeys ) )
+ {
+ User::Leave( KErrAlreadyExists );
+ }
+
+ // Find the first free key starting from
+ // KPhonebookSupportedConfigurationFirstKey
+ TBool keyFound = EFalse;
+ TUint32 newKey = KPhonebookSupportedConfigurationFirstKey;
+ for (TInt i = KPhonebookSupportedConfigurationFirstKey;
+ i < KPhonebookSupportedConfigurationLastKey && !keyFound; ++i)
+ {
+ if (configurationKeys.Find(i) == KErrNotFound)
+ {
+ newKey = i;
+ keyFound = ETrue;
+ }
+ }
+
+ if (!keyFound)
+ {
+ User::Leave(KErrOverflow);
+ }
+
+ TInt err = iRepository->Create(newKey, aURI.UriDes());
+ User::LeaveIfError(err);
+
+ CleanupStack::PopAndDestroy(); // configurationKeys
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::AddSupportedContactStoreURIL(0x%x) end"), this);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::RemoveSupportedContactStoreURIL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::RemoveSupportedContactStoreURIL
+ ( TVPbkContactStoreUriPtr aURI )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::RemoveSupportedContactStoreURIL(0x%x)"), this);
+
+ RArray<TUint32> configurationKeys;
+ CleanupClosePushL(configurationKeys);
+
+ iRepository->FindEqL(
+ KPhonebookSupportedConfigurationPartialKey,
+ KPhonebookSupportedConfigurationMask,
+ aURI.UriDes(),
+ configurationKeys);
+
+ const TInt keyCount = configurationKeys.Count();
+ for (TInt i = 0; i < keyCount; ++i)
+ {
+ iRepository->Delete(configurationKeys[i]);
+ }
+ CleanupStack::PopAndDestroy(); // configurationKeys
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2StoreConfigurationImpl::RemoveSupportedContactStoreURIL(0x%x) end"), this);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::ConfigurationChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::ConfigurationChanged()
+ {
+ for (TInt i = iObservers.Count() - 1; i >= 0; --i)
+ {
+ iObservers[i]->ConfigurationChanged();
+ }
+
+ for (TInt i = iObservers.Count() - 1; i >= 0; --i)
+ {
+ iObservers[i]->ConfigurationChangedComplete();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::ConfigurationChangedComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::ConfigurationChangedComplete()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::SavingStoreChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreConfigurationImpl::SavingStoreChanged()
+ {
+ for (TInt i = iDefaultStoreObservers.Count() - 1; i >= 0; --i)
+ {
+ iDefaultStoreObservers[i]->SavingStoreChanged();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreConfigurationImpl::AlreadyRegisteredL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2StoreConfigurationImpl::AlreadyRegisteredL
+ ( TVPbkContactStoreUriPtr aURI, RArray<TUint32> aKeys )
+ {
+ TBool already = EFalse;
+
+ HBufC* buffer = HBufC::NewLC(KInitialStoreUriSize);
+ const TInt keyCount = aKeys.Count();
+ for (TInt j = 0; j < keyCount; ++j)
+ {
+ TPtr ptr = buffer->Des();
+ ptr.Zero();
+ TInt actualSize = 0;
+ TInt ret = iRepository->Get(aKeys[j], ptr, actualSize);
+ if (ret == KErrOverflow)
+ {
+ CleanupStack::PopAndDestroy(); // buffer
+ buffer = HBufC::NewLC(actualSize);
+ ptr.Set(buffer->Des());
+ User::LeaveIfError(iRepository->Get(aKeys[j], ptr));
+ }
+
+ TVPbkContactStoreUriPtr uri( *buffer );
+ if ( uri.Compare( aURI,
+ TVPbkContactStoreUriPtr::EContactStoreUriAllComponents ) == 0 )
+ {
+ already = ETrue;
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // buffer
+
+ return already;
+ }
+
+// End of File