--- /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 <bautils.h>
+
+#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();
+ }