javaextensions/location/landmarks/src/clapilandmarkstoremanager.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/landmarks/src/clapilandmarkstoremanager.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,237 @@
+/*
+* Copyright (c) 2008 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:  Handles native landmark databases
+ *
+*/
+
+
+// INTERNAL INCLUDES
+#include    "clapilandmarkstoremanager.h"
+#include    "clapilmdatabaseeventnotifier.h"
+#include    "clapicategorymanager.h"
+#include    "clapilandmarkstore.h"
+#include    "logger.h"
+
+// EXTERNAL INCLUDES
+#include    <EPos_CPosLandmarkDatabase.h>
+#include    <EPos_CPosLmDatabaseManager.h>
+#include    <EPos_CPosLmCategoryManager.h>
+#include    <EPos_CPosLmOperation.h>
+#include    <EPos_Landmarks.h>
+#include    <EPos_HPosLmDatabaseInfo.h>
+
+namespace
+{
+// The default protocol for internal stores
+_LIT(KLAPIDefaultProtocol, "file://");
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::NewL
+// ---------------------------------------------------------------------------
+//
+CLAPILandmarkStoreManager* CLAPILandmarkStoreManager::NewL()
+{
+    JELOG2(EJavaLocation);
+    CLAPILandmarkStoreManager* self = CLAPILandmarkStoreManager::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::NewLC
+// ---------------------------------------------------------------------------
+//
+CLAPILandmarkStoreManager* CLAPILandmarkStoreManager::NewLC()
+{
+    JELOG2(EJavaLocation);
+    CLAPILandmarkStoreManager* self = new(ELeave) CLAPILandmarkStoreManager;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::~CLAPILandmarkStoreManager
+// ---------------------------------------------------------------------------
+//
+CLAPILandmarkStoreManager::~CLAPILandmarkStoreManager()
+{
+    JELOG2(EJavaLocation);
+    // The objects inside the array are not owned by this class
+    iStores.Close();
+    delete iLmDbManager;
+    // Release all landmark resources because Landmarks FW will not be used
+    // anymore. This has basicly the same effect as REComSeesion::FinalClose()
+    // All allocated memory and garbage plug-ins will be released
+    ReleaseLandmarkResources();
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::LandmarkStoresL
+// ---------------------------------------------------------------------------
+//
+CDesCArray* CLAPILandmarkStoreManager::LandmarkStoresL()
+{
+    JELOG2(EJavaLocation);
+    // List landmark databases but remove the default store from the array
+    CDesCArray* stores = iLmDbManager->ListDatabasesLC();
+    HBufC* defaultDbName = iLmDbManager->DefaultDatabaseUriLC();
+
+    // Remove the default database from the store names array. External stores
+    // are also removed because this API does not support other than stores
+    // which are located in the file system of the device
+    TInt count = stores->Count();
+    for (TInt i = 0; i < count; i++)
+    {
+        TPtrC storeUri = stores->MdcaPoint(i);
+        if (defaultDbName->CompareF(storeUri) == 0 || storeUri.FindF(
+                    KLAPIDefaultProtocol) == KErrNotFound)
+        {
+            stores->Delete(i);
+            break;
+        }
+    }
+
+    CleanupStack::PopAndDestroy(defaultDbName);
+    CleanupStack::Pop(stores);
+    return stores;
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::OpenStoreL
+// ---------------------------------------------------------------------------
+//
+CLAPILandmarkStore* CLAPILandmarkStoreManager::OpenStoreL(
+    const TDesC& aStoreUri)
+{
+    JELOG2(EJavaLocation);
+    CPosLandmarkDatabase* database(NULL);
+    // Open default landmark database if the passed URI is a null descriptor
+    database = (aStoreUri == KNullDesC() ? CPosLandmarkDatabase::OpenL()
+                : CPosLandmarkDatabase::OpenL(aStoreUri));
+
+    CleanupStack::PushL(database);
+
+    // Initialize the database if needed. Note that the store is not usable
+    // in any way if it has not been initialized
+    if (database->IsInitializingNeeded())
+    {
+        ExecuteAndDeleteLD(database->InitializeL());
+    }
+
+    // Create landmark store event notifier
+    MLAPILmDatabaseEventNotifier* notifier =
+        CLAPILmDatabaseEventNotifier::NewLC(*database);
+
+    // Create category manager
+    CLAPICategoryManager::TCtorParams managerParams;
+    managerParams.iLandmarkDatabase = database;
+    managerParams.iEventNotifier = notifier;
+    MLAPICategoryManager* manager = CLAPICategoryManager::NewLC(managerParams);
+
+    // Construct the landmark store. The store takes ownership of
+    // the native landmark database, the notifier and the category manager.
+    CLAPILandmarkStore::TCtorParams storeParams;
+    storeParams.iLandmarkDatabase = database;
+    storeParams.iCategoryManager = manager;
+    storeParams.iEventNotifier = notifier;
+    CLAPILandmarkStore* lmStore = CLAPILandmarkStore::NewLC(storeParams);
+
+    // The store is not owned but is still monitored since it is possible
+    // that an open store would be deleted which means that the store
+    // must be closed in order for successful deletion
+    iStores.AppendL(lmStore);
+
+    CleanupStack::Pop(4, database);
+    return lmStore;
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::CreateStoreL
+// ---------------------------------------------------------------------------
+//
+void CLAPILandmarkStoreManager::CreateStoreL(const TDesC& aStoreUri)
+{
+    JELOG2(EJavaLocation);
+    __ASSERT_ALWAYS(aStoreUri != KNullDesC(), User::Leave(KErrBadName));
+    // Create database info which specifies the place of the new database
+    HPosLmDatabaseInfo* dbInfo = HPosLmDatabaseInfo::NewLC(aStoreUri);
+    // Create the database. This leaves if there is already a database in
+    // the same URI location
+    iLmDbManager->CreateDatabaseL(*dbInfo);
+    CleanupStack::PopAndDestroy(dbInfo);
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::DeleteStoreL
+// ---------------------------------------------------------------------------
+//
+void CLAPILandmarkStoreManager::DeleteStoreL(const TDesC& aStoreUri)
+{
+    JELOG2(EJavaLocation);
+    __ASSERT_ALWAYS(aStoreUri != KNullDesC(), User::Leave(KErrBadName));
+    // Find if the requested store has been opened and close it before
+    // deleting the database. This is done because if some client uses
+    // the store it cannot be deleted
+    TInt storeCount = iStores.Count();
+    for (TInt i = 0; i < storeCount; i++)
+    {
+        if (iStores[i]->StoreUri().CompareF(aStoreUri) == 0)
+        {
+            // Database has been opened so close it. Make sure that all
+            // databases will be closed
+            iStores[i]->Close();
+        }
+    }
+    // Now it is safe to delete the requested store
+    iLmDbManager->DeleteDatabaseL(aStoreUri);
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::RemoveStore
+// ---------------------------------------------------------------------------
+//
+void CLAPILandmarkStoreManager::RemoveStore(CLAPILandmarkStore& aLandmarkStore)
+{
+    JELOG2(EJavaLocation);
+    TInt index = iStores.Find(&aLandmarkStore);
+    if (index != KErrNotFound)
+    {
+        // Do not delete the store since this class does not own it
+        iStores.Remove(index);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::CLAPILandmarkStoreManager
+// ---------------------------------------------------------------------------
+//
+CLAPILandmarkStoreManager::CLAPILandmarkStoreManager()
+{
+    JELOG2(EJavaLocation);
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILandmarkStoreManager::ConstructL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CLAPILandmarkStoreManager::ConstructL()
+{
+    JELOG2(EJavaLocation);
+    iLmDbManager = CPosLmDatabaseManager::NewL();
+}
+
+// End of file