diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/src/ncdprovidermanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/server/src/ncdprovidermanager.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,214 @@ +/* +* 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: Implementation of CNcdProviderManager +* +*/ + + +#include "ncdprovidermanager.h" + +#include + +#include "ncdproviderimpl.h" +#include "catalogsconstants.h" +#include "catalogstransportimpl.h" +#include "ncdproviderutils.h" +#include "ncdstoragemanagerimpl.h" +#include "catalogsutils.h" + +#include "catalogsdebug.h" + +// ======== MEMBER FUNCTIONS ======== + +CNcdProviderManager* CNcdProviderManager::NewL() + { + CNcdProviderManager* self = new (ELeave) CNcdProviderManager; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CNcdProviderManager::CNcdProviderManager() + { + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CNcdProviderManager::~CNcdProviderManager() + { + // Providers are not owned by the array + iProviders.Close(); + delete iEngineRootPath; + delete iTransport; + delete iStorageManager; + delete iProviderUtils; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdProviderManager::ConstructL() + { + DLTRACEIN(("")); + // create provider utils, fs is used as the global fs returned by + // CNcdProviderUtils::FileSession so it must not be closed here + iProviderUtils = CNcdProviderUtils::NewL( + KCatalogsConfigFile ); + + iEngineRootPath = WritableEnginePathL( CNcdProviderUtils::FileSession() ); + + // Create transport + iTransport = CCatalogsTransport::NewL( + CNcdProviderUtils::InstallationServiceL().DocumentHandler() ); + + iStorageManager = CNcdStorageManager::NewL( + CNcdProviderUtils::FileSession(), *iEngineRootPath ); + DLTRACE(("iStorageManager ok")); + + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CNcdProvider& CNcdProviderManager::ProviderL( + const MCatalogsContext& aContext, + TBool& aCreated ) + { + DLTRACEIN(("")); + TInt index = FindFamily( aContext ); + aCreated = EFalse; + + if ( index == KErrNotFound ) + { + DLTRACE(("Creating new provider")); + CNcdProvider* provider = CNcdProvider::NewLC( + aContext.FamilyId(), + *this, + *iEngineRootPath, + *iTransport, + *iStorageManager ); + + iProviders.AppendL( provider ); + + CleanupStack::Pop( provider ); + index = iProviders.Count() - 1; + aCreated = ETrue; + } + + return *iProviders[ index ]; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CNcdProvider* CNcdProviderManager::Provider( + const MCatalogsContext& aContext ) const + { + TInt index = FindFamily( aContext ); + CNcdProvider* provider = NULL; + if ( index != KErrNotFound ) + { + provider = iProviders[ index ]; + } + return provider; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdProviderManager::ProviderClosed( CNcdProvider& aProvider ) + { + DLTRACEIN(("")); + + TInt index = iProviders.Find( &aProvider ); + if ( index != KErrNotFound ) + { + DLTRACE(("Removing provider: %x", &aProvider)); + iProviders.Remove( index ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CNcdProviderManager::FindFamily( const MCatalogsContext& aContext ) const + { + TInt count = iProviders.Count(); + TInt index = KErrNotFound; + while( count-- ) + { + if ( aContext.FamilyId() == iProviders[ count ]->FamilyId() ) + { + index = count; + break; + } + } + return index; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +HBufC* CNcdProviderManager::WritableEnginePathL( RFs& aFs ) + { + DLTRACEIN( ( "" ) ); + // Determine the installation path from the location of the + // engine's config file + HBufC* fullPath = FindEngineFileL( aFs, KCatalogsConfigFile ); + TParsePtrC parse( *fullPath ); + TPath path( parse.DriveAndPath() ); + delete fullPath; + + if ( path.Length() < 1 ) + { + DLERROR(("No path")); + User::Leave( KErrArgument ); + } + + // If it is in ROM, default to C. + if ( IsRomDriveL( aFs, path[0] ) ) + { + DLTRACE(("Config on ROM, use C:")); + path[0] = DriveToCharL( EDriveC ); + } + + TDriveName drive; + drive.Append( path[0] ); + drive.Append( KDriveDelimiter ); + + CreatePrivatePathL( aFs, drive, path ); + BaflUtils::EnsurePathExistsL( aFs, path ); + + DLTRACEOUT( ( _L("Path: %S"), &path ) ); + return path.AllocL(); + }