diff -r a36b1e19a461 -r 989d2f495d90 serviceproviders/sapi_landmarks/landmarksservice/src/clandmarkmanagehandlers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serviceproviders/sapi_landmarks/landmarksservice/src/clandmarkmanagehandlers.cpp Fri Jul 03 15:51:24 2009 +0100 @@ -0,0 +1,251 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: CLandmarkManageHandlers class implementation + * +*/ + + +#include +#include +#include +#include +#include "clandmarkmanagehandlers.h" + +//class CLandmarkManageHandlers +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CLandmarkManageHandlers* CLandmarkManageHandlers::NewL( ) + { + CLandmarkManageHandlers* self = new (ELeave) CLandmarkManageHandlers(); + return self; + } + +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::CLandmarkManageHandlers() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CLandmarkManageHandlers::CLandmarkManageHandlers( ) + { + } + +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::~CLandmarkManageHandlers() +// Destructor. +// ----------------------------------------------------------------------------- +// +CLandmarkManageHandlers::~CLandmarkManageHandlers( ) + { + iHandlers.ResetAndDestroy ( ); + iHandlers.Close(); + } + +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::CloseHandler( CLandmarkHandler* aHandler ) +// Closes the passed CLandmarkHandler handle and removes it from the array. +// ----------------------------------------------------------------------------- +// +void CLandmarkManageHandlers::CloseHandler( CLandmarkHandler* aHandler ) + { + TInt index = iHandlers.Find (aHandler ); + if ( index != KErrNotFound ) + { + delete iHandlers[index]; + iHandlers[index] = NULL; + iHandlers.Remove (index ); + } + } +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::CreateHandlerL(TDesC & aDatabaseUri) +// Creates and Returns the handle of CLandmarkHandler instance. +// ----------------------------------------------------------------------------- +// +CLandmarkHandler* CLandmarkManageHandlers::CreateHandlerL( + const TDesC& aDatabaseUri ) + { + //create a database handle and append to the array. + CLandmarkHandler* handler = CLandmarkHandler::CreateL (aDatabaseUri ); + CleanupStack::PushL (handler ); + iHandlers.AppendL (handler ); + CleanupStack::Pop (handler ); + //if there is no default handler then set default as device default + if( !iDefaultHandler && aDatabaseUri == KNullDesC ) + { + iDefaultHandler = handler; + } + return handler; + } + +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::GetHandlerL(TDesC & aDatabaseUri) +// Returns the handle of CLandmarkHandler instance. +// ----------------------------------------------------------------------------- +// +CLandmarkHandler* CLandmarkManageHandlers::GetHandlerL(const TDesC& aDatabaseUri ) + { + _LIT(KDriveSeparatorSymbol, ":"); + _LIT(KDefaultDriveLocal, "c"); + _LIT(KProtocolSeparatorLocal, "://"); + _LIT(KLocalProtocolString, "file"); + + CLandmarkHandler* handler= NULL; + //if aDatabaseUri is KNullDesC then return the default handler + if ( aDatabaseUri == KNullDesC ) + { + if ( iDefaultHandler ) + { + iDefaultHandler->InitL ( ); + } + handler = iDefaultHandler; + } + //else compare the passed URI with the stored handle's URI + else + { + //Simple parsing. Have to implement better parsing + TBuf dbName; + TInt offset = aDatabaseUri.Find (KProtocolSeparatorLocal ); + if ( KErrNotFound == offset ) + { + dbName.Copy (KLocalProtocolString ); + dbName.Append (KProtocolSeparatorLocal ); + } + if ( aDatabaseUri.Find (KDriveSeparatorSymbol )<= offset ) + { + dbName.Append (KDefaultDriveLocal ); + dbName.Append (KDriveSeparatorSymbol ); + } + //Check for Length < KPosLmDatabaseName + if ( (aDatabaseUri.Length() + dbName.Length()) > KPosLmDatabaseName ) + { + User::Leave ( KErrBadName ); + } + //create the complete db uri + dbName.Append (aDatabaseUri ); + //normalize to lower + dbName.LowerCase ( ); + TInt count = iHandlers.Count ( ); + TPtrC dbUri; + while ( count ) + { + //Retrieve the handles from end + handler = iHandlers[--count]; + handler->GetDatabaseUri (dbUri ); + if ( dbUri == dbName ) + { + handler->InitL ( ); + break; + } + //if no handle found then NULL + handler = NULL; + } + } + return handler; + } + +// ----------------------------------------------------------------------------- +// CLandmarkManageHandlers::SetDefaultHandler(CLandmarkHandler* aHandler) +// Sets the default handler. +// ----------------------------------------------------------------------------- +// +void CLandmarkManageHandlers::SetDefaultHandler( CLandmarkHandler* aHandler ) + { + iDefaultHandler = aHandler; + } + +//Class CLandmarkHandler +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLandmarkHandler::CreateL( TDesC & aDatabaseUri ) +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CLandmarkHandler* CLandmarkHandler::CreateL( const TDesC& aDatabaseUri ) + { + CLandmarkHandler* self = new (ELeave) CLandmarkHandler(); + CleanupStack::PushL ( self ); + self->ConstructL (aDatabaseUri ); + CleanupStack::Pop ( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CLandmarkHandler::ConstructL( TDesC & aDatabaseUri ) +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLandmarkHandler::ConstructL( const TDesC& aDatabaseUri ) + { + //Open default database or the database requested depending on paramater aDatabaseUri + if ( aDatabaseUri != KNullDesC ) + { + iLandmarkDatabaseHandle = CPosLandmarkDatabase::OpenL (aDatabaseUri ); + } + else + { + iLandmarkDatabaseHandle = CPosLandmarkDatabase::OpenL ( ); + } + iDatabaseUri = iLandmarkDatabaseHandle->DatabaseUriLC ( ); + CleanupStack::Pop (iDatabaseUri ); + //Normalize to lower + iDatabaseUri->Des().LowerCase ( ); + //initialize the database for further opertaions on the database. + ExecuteAndDeleteLD (iLandmarkDatabaseHandle->InitializeL ( ) ); + //Create other handles with respect to the open database + iLmCategoryManagerHandle = CPosLmCategoryManager::NewL (*iLandmarkDatabaseHandle ); + iLandmarkSearchHandle = CPosLandmarkSearch::NewL (*iLandmarkDatabaseHandle ); + } + +// ----------------------------------------------------------------------------- +// CLandmarkHandler::CLandmarkHandler() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CLandmarkHandler::CLandmarkHandler( ) + { + } + +// ----------------------------------------------------------------------------- +// CLandmarkHandler::~CLandmarkHandler() +// Destructor. +// ----------------------------------------------------------------------------- +// +CLandmarkHandler::~CLandmarkHandler( ) + { + delete iLandmarkSearchHandle; + delete iLmCategoryManagerHandle; + delete iLandmarkDatabaseHandle; + delete iDatabaseUri; + } + +// ----------------------------------------------------------------------------- +// CLandmarkHandler::InitL() +// Initialize the databse if required. +// ----------------------------------------------------------------------------- +// +void CLandmarkHandler::InitL( ) + { + if (iLandmarkDatabaseHandle->IsInitializingNeeded ( ) ) + { + //Initialize the database for further opertaions on the database. + ExecuteAndDeleteLD (iLandmarkDatabaseHandle->InitializeL ( ) ); + } + } + +// End of File