landmarks/locationlandmarks/dbmanprov/src/EPos_CPosLmDatabaseManagerImpl.cpp
changeset 0 667063e416a2
--- /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 <ecom/ecom.h>
+#include <epos_cposlmsettingshandler.h>
+#include <EPos_CPosLmDatabaseManagerPluginBase.h>
+#include <EPos_PosLmDbInfoExtension.h>
+#include <epos_poslmfilefinder.h>
+#include <epos_cposlmresourcereader.h>
+#include <eposlmdefaultdbname.rsg>
+#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<RPointerArray<HPosLmDatabaseInfo>*>(
+        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<HPosLmDatabaseInfo>& 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<HPosLmDatabaseInfo> 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<HPosLmDatabaseInfo>& 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