landmarks/locationlandmarks/dbmanprov/src/EPos_CPosLmDatabaseManagerImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 11 May 2010 16:36:36 +0300
branchRCL_3
changeset 23 5944cae565c9
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201017 Kit: 201019

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