diff -r 000000000000 -r 667063e416a2 landmarks/locationlandmarks/dbmanprov/src/EPos_CPosLmDatabaseManagerImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarks/locationlandmarks/dbmanprov/src/EPos_CPosLmDatabaseManagerImpl.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,556 @@ +/* +* Copyright (c) 2005 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: This class is used to manage landmark databases. +* +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include "EPos_CPosLmDbManPluginStore.h" +#include "EPos_CPosLmDatabaseManagerImpl.h" +#include "epos_poslmdatabaseutility.h" + + +_LIT(KProtocolSeparator, "://"); +_LIT(KLocalProtocol, "file"); +_LIT(KDefaultDbNameResourceFile, "\\resource\\eposlmdefaultdbname.rsc"); + +// ================= LOCAL FUNCTIONS ======================== + +void CleanupPointerArray(TAny* aArray) + { + (static_cast*>( + aArray))->ResetAndDestroy(); + } + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CPosLmDatabaseManagerImpl::CPosLmDatabaseManagerImpl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPosLmDatabaseManagerImpl::CPosLmDatabaseManagerImpl() + { + } + +// ----------------------------------------------------------------------------- +// CPosLmLocalImportedLmIterator::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::ConstructL() + { + iSettingsHandler = CPosLmSettingsHandler::NewL(); + User::LeaveIfError(iSession.Connect()); + User::LeaveIfError(iEventListener.Open(iSession)); + iPlugins = CPosLmDbManPluginStore::NewL(&iSession); + iDefaultDatabaseDisplayName = DefaultDatabaseDisplayNameL(); + } + +// ----------------------------------------------------------------------------- +// CPosLmDatabaseManagerImpl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPosLmDatabaseManagerImpl* CPosLmDatabaseManagerImpl::NewL() + { + CPosLmDatabaseManagerImpl* self = new( ELeave ) CPosLmDatabaseManagerImpl; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// Destructor +CPosLmDatabaseManagerImpl::~CPosLmDatabaseManagerImpl() + { + delete iSettingsHandler; + delete iPlugins; + iEventListener.Close(); + iSession.Close(); + delete iDefaultDatabaseDisplayName; + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::DefaultDatabaseUriLC +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +HBufC* CPosLmDatabaseManagerImpl::DefaultDatabaseUriLC() + { + HBufC* uri = iSettingsHandler->GetDefaultDatabaseUriL(); + CleanupStack::PushL(uri); + return uri; + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::SetDefaultDatabaseUriL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::SetDefaultDatabaseUriL( + const TDesC& aDatabaseUri) + { + if (!IsLocalDatabase(aDatabaseUri)) + { + User::Leave(KErrNotSupported); + } + if (!DatabaseExistsL(aDatabaseUri)) + { + User::Leave(KErrNotFound); + } + iSettingsHandler->SetDefaultDatabaseUriL(aDatabaseUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::NotifyDatabaseEvent +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::NotifyDatabaseEvent( + TPosLmDatabaseEvent& aEvent, + TRequestStatus& aStatus) + { + iEventListener.NotifyDatabaseEvent(aEvent, aStatus); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::CancelNotifyDatabaseEvent +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CPosLmDatabaseManagerImpl::CancelNotifyDatabaseEvent() + { + return iEventListener.CancelNotifyDatabaseEvent(); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::DatabaseUriFromLastEventLC +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +HBufC* CPosLmDatabaseManagerImpl::DatabaseUriFromLastEventLC() + { + return iEventListener.DatabaseUriFromLastEventLC(); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::ListDatabasesLC +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +CDesCArray* CPosLmDatabaseManagerImpl::ListDatabasesLC( + const TDesC& aProtocol) + { + CDesCArray* resultList = NULL; + + if (aProtocol == KNullDesC) + { + TInt pluginCount = iPlugins->NumberOfInstances(); + for (TInt i = 0; i < pluginCount; i++) + { + if (i == 0) + { + resultList = iPlugins->GetInstanceAt(i)->ListDatabasesLC(); + } + else + { + CDesCArray* dbList = + iPlugins->GetInstanceAt(i)->ListDatabasesLC(); + TInt dbCount = dbList->Count(); + for (TInt j = 0; j < dbCount; j++) + { + resultList->AppendL((*dbList)[j]); + } + CleanupStack::PopAndDestroy(dbList); + } + } + } + else + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(aProtocol); + resultList = plugin->ListDatabasesLC(); + } + return resultList; + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::ListDatabasesL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::ListDatabasesL( + RPointerArray& aDatabaseInfoArray, + const TDesC& aProtocol) + { + if (aProtocol == KNullDesC) + { + TInt pluginCount = iPlugins->NumberOfInstances(); + for (TInt i = 0; i < pluginCount; i++) + { + if (i == 0) + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceAt(i); + plugin->ListDatabasesL(aDatabaseInfoArray); + FillInDbInfoListL(aDatabaseInfoArray, plugin); + } + else + { + RPointerArray dbList; + CleanupStack::PushL(TCleanupItem(CleanupPointerArray, &dbList)); + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceAt(i); + plugin->ListDatabasesL(dbList); + FillInDbInfoListL(dbList, plugin); + TInt dbCount = dbList.Count(); + for (TInt j = 0; j < dbCount; j++) + { + // transfer ownership instead of copy object + User::LeaveIfError(aDatabaseInfoArray.Append(dbList[0])); + dbList.Remove(0); + } + CleanupStack::PopAndDestroy(&dbList); + } + } + } + else + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(aProtocol); + plugin->ListDatabasesL(aDatabaseInfoArray); + FillInDbInfoListL(aDatabaseInfoArray, plugin); + } + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::RegisterDatabaseL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::RegisterDatabaseL( + HPosLmDatabaseInfo& aDatabaseInfo) + { + TPtrC uri = aDatabaseInfo.DatabaseUri(); + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(uri)); + + PosLmDbInfoExtension::SetDatabaseDrive(aDatabaseInfo, + plugin->DatabaseDrive(uri)); + PosLmDbInfoExtension::SetMediaType(aDatabaseInfo, + plugin->DatabaseMedia(uri)); + plugin->RegisterDatabaseL(aDatabaseInfo); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::UnregisterDatabaseL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::UnregisterDatabaseL( + const TDesC& aDatabaseUri) + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(aDatabaseUri)); + plugin->UnregisterDatabaseL(aDatabaseUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::UnregisterAllDatabasesL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::UnregisterAllDatabasesL( + const TDesC& aProtocol) + { + if (aProtocol == KNullDesC) + { + User::Leave(KErrArgument); + } + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(aProtocol); + plugin->UnregisterAllDatabasesL(); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::ModifyDatabaseSettingsL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::ModifyDatabaseSettingsL( + const TDesC& aDatabaseUri, + const TPosLmDatabaseSettings& aDatabaseSettings) + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(aDatabaseUri)); + plugin->ModifyDatabaseSettingsL(aDatabaseUri, aDatabaseSettings); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::GetDatabaseInfoL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::GetDatabaseInfoL( + HPosLmDatabaseInfo& aDatabaseInfo) + { + TPtrC uri = aDatabaseInfo.DatabaseUri(); + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(uri)); + HBufC* defaultDbUri = iSettingsHandler->GetDefaultDatabaseUriL(); + CleanupStack::PushL(defaultDbUri); + + // must fill in drive before sending to provider + PosLmDbInfoExtension::SetDatabaseDrive(aDatabaseInfo, + plugin->DatabaseDrive(uri)); + PosLmDbInfoExtension::SetMediaType(aDatabaseInfo, + plugin->DatabaseMedia(uri)); + + // fills in settings + plugin->GetDatabaseInfoL(aDatabaseInfo); + + // fills in the rest of the parameters + FillInDbInfoL(aDatabaseInfo, plugin, *defaultDbUri); + + CleanupStack::PopAndDestroy(defaultDbUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::DatabaseExistsL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CPosLmDatabaseManagerImpl::DatabaseExistsL( + const TDesC& aDatabaseUri) + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(aDatabaseUri)); + return plugin->DatabaseExistsL(aDatabaseUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::CreateDatabaseL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::CreateDatabaseL( + HPosLmDatabaseInfo& aDatabaseInfo) + { + TPtrC uri = aDatabaseInfo.DatabaseUri(); + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(uri)); + + TChar drive = plugin->DatabaseDrive(uri); + + __ASSERT_ALWAYS((drive >= 'a' && drive <= 'z') || + (drive >= 'A' && drive <= 'Z') || + drive == 0, User::Leave(KErrArgument) + ); + + PosLmDbInfoExtension::SetDatabaseDrive(aDatabaseInfo, drive); + + PosLmDbInfoExtension::SetMediaType(aDatabaseInfo, + plugin->DatabaseMedia(uri)); + plugin->CreateDatabaseL(aDatabaseInfo); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::DeleteDatabaseL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::DeleteDatabaseL( + const TDesC& aDatabaseUri) + { + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(GetProtocolFromUri(aDatabaseUri)); + plugin->DeleteDatabaseL(aDatabaseUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::CopyDatabaseL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::CopyDatabaseL( + const TDesC& aSourceUri, + const TDesC& aTargetUri) + { + TPtrC sourceProtocol = GetProtocolFromUri(aSourceUri); + TPtrC targetProtocol = GetProtocolFromUri(aTargetUri); + + if (sourceProtocol != targetProtocol) + { + User::Leave(KErrArgument); + } + CPosLmDatabaseManagerPluginBase* plugin = + iPlugins->GetInstanceL(sourceProtocol); + plugin->CopyDatabaseL(aSourceUri, aTargetUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::GetProtocolFromUri +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +const TPtrC CPosLmDatabaseManagerImpl::GetProtocolFromUri( + const TDesC& aUri) + { + TInt offset = aUri.Find(KProtocolSeparator); + if (offset == KErrNotFound) + { + return KLocalProtocol(); + } + else + { + return aUri.Left(offset); + } + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::IsLocalDatabase +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CPosLmDatabaseManagerImpl::IsLocalDatabase( + const TDesC& aUri) + { + return GetProtocolFromUri(aUri) == KLocalProtocol; + } + +// ----------------------------------------------------------------------------- +// CPosLmDatabaseManagerImpl::DefaultDatabaseDisplayNameL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC* CPosLmDatabaseManagerImpl::DefaultDatabaseDisplayNameL() + { + TFileName* filename = new (ELeave) TFileName(); + CleanupStack::PushL(filename); + + RFs fileSession; + CleanupClosePushL(fileSession); + User::LeaveIfError(fileSession.Connect()); + + User::LeaveIfError(PosLmFileFinder::ResourceFileL(filename, fileSession, + KDefaultDbNameResourceFile)); + + CPosLmResourceReader* resource = + CPosLmResourceReader::NewLC(*filename); + + HBufC* name = resource->ReadHBufCL(R_POS_LM_DEFAULT_DB_DISPLAY_NAME); + + CleanupStack::PopAndDestroy(3, filename); + return name; + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::FillInDbInfoListL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::FillInDbInfoListL( + RPointerArray& aDatabaseInfoArray, + CPosLmDatabaseManagerPluginBase* aPlugin) + { + // set default, database drive and media type for each database in list + HBufC* defaultDbUri = iSettingsHandler->GetDefaultDatabaseUriL(); + CleanupStack::PushL(defaultDbUri); + + TInt count = aDatabaseInfoArray.Count(); + for (TInt i = 0; i < count; i++) + { + HPosLmDatabaseInfo* dbInfo = aDatabaseInfoArray[i]; + FillInDbInfoL(*dbInfo, aPlugin, *defaultDbUri); + dbInfo = NULL; + } + CleanupStack::PopAndDestroy(defaultDbUri); + } + +// --------------------------------------------------------- +// CPosLmDatabaseManagerImpl::FillInDbInfoL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPosLmDatabaseManagerImpl::FillInDbInfoL( + HPosLmDatabaseInfo& aDatabaseInfo, + CPosLmDatabaseManagerPluginBase* aPlugin, + const TDesC& aDefaultDbUri) + { + TPtrC uri = aDatabaseInfo.DatabaseUri(); + PosLmDbInfoExtension::SetDatabaseDrive(aDatabaseInfo, + aPlugin->DatabaseDrive(uri)); + PosLmDbInfoExtension::SetMediaType(aDatabaseInfo, + aPlugin->DatabaseMedia(uri)); + + if (aPlugin->Protocol() == KNullDesC || + aPlugin->Protocol() == KLocalProtocol) + { + // Create correct URIs (they may be missing protocol) so that + // compareC will be correct + HBufC* tmpUri = PosLmDatabaseUtility::CreateDatabaseUriL(uri); + CleanupStack::PushL(tmpUri); + HBufC* tmpDefaultUri = PosLmDatabaseUtility::CreateDatabaseUriL(aDefaultDbUri); + CleanupStack::PushL(tmpDefaultUri); + + // check if default database + if (tmpUri->CompareC(*tmpDefaultUri) == KErrNone) + { + PosLmDbInfoExtension::SetDefault(aDatabaseInfo, ETrue); + // set default dispay name if no display name exists + if (aDatabaseInfo.Settings().DatabaseName() == KNullDesC) + { + aDatabaseInfo.Settings().SetDatabaseName( + *iDefaultDatabaseDisplayName); + } + } + CleanupStack::PopAndDestroy(tmpDefaultUri); + CleanupStack::PopAndDestroy(tmpUri); + } + } + +// End of File