--- /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