diff -r 000000000000 -r ba25891c3a9e ncdengine/engine/src/catalogsserverengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/engine/src/catalogsserverengine.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + +#include + +#include "catalogsserverengine.h" +#include "catalogssession.h" +#include "ncdproviderimpl.h" +#include "catalogsdebug.h" +#include "catalogsconstants.h" +#include "catalogsuids.h" +#include "ncdprovidermanager.h" + +// ======== MEMBER FUNCTIONS ======== + + + +CCatalogsServerEngine::CCatalogsServerEngine() + { + } + + +void CCatalogsServerEngine::ConstructL() + { + DLTRACEIN(("")); + + // Define the Catalogs Engine maintenance lock property, if not already + // defined. + // Don't use explicit category UID, server SID instead? + // - explicit category UID requires WriteDeviceData cap. Well we have it but anyway. + + // Security policy +// TSecurityPolicy readPolicy; +// TSecurityPolicy writePolicy; + _LIT_SECURITY_POLICY_PASS( readPolicy ); + _LIT_SECURITY_POLICY_PASS( writePolicy ); + + DLINFO(( "Defining catalogs engine maintenance lock property" )); + + TInt err = RProperty::Define( + KCatalogsEnginePropertyCategory, + KCatalogsEnginePropertyKeyMaintenanceLock, + RProperty::EInt, + readPolicy, + writePolicy ); + + if( err != KErrNone && err != KErrAlreadyExists ) + { + DLERROR(( "Maintenance lock property create failed with %d", err )); + DLTRACEOUT(( "LEAVE %d", err )); + User::Leave( err ); + } + + DLINFO(( "Maintenance lock property define returned %d", err )); + + iProviderManager = CNcdProviderManager::NewL(); + + DLTRACEOUT(("")); + } + +CCatalogsServerEngine* CCatalogsServerEngine::NewL() + { + CCatalogsServerEngine* self = CCatalogsServerEngine::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +CCatalogsServerEngine* CCatalogsServerEngine::NewLC() + { + CCatalogsServerEngine* self = new( ELeave ) CCatalogsServerEngine; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CCatalogsServerEngine::~CCatalogsServerEngine() + { + DLTRACEIN(("")); + // Engine is going to be killed and we can free our reference to + // the provider + delete iProviderManager; + DLTRACEOUT(("")); + } + + +void CCatalogsServerEngine::CreateProviderL( + MCatalogsSession& aSession, + TInt aProvider, + TInt& aHandle, + TUint32 aOptions ) + { + DLTRACEIN(( "aProvider=%08x", aProvider )); + + // Providers, who we know + TInt providerUid( KNcdProviderUid ); // only one uid is known at the moment + + + if ( aProvider == providerUid ) + { + TBool created = EFalse; + + // if created==ETrue, provider's refcount is 1, otherwise it's > 1 + CNcdProvider& provider = iProviderManager->ProviderL( + aSession.Context(), created ); + + TRAPD( err, + { + provider.PrepareSessionL( aSession, aOptions ); + // AddObjectL increases provider's refcount by 1 + aHandle = aSession.AddObjectL( &provider ); + }); + + + if ( created ) + { + if ( err != KErrNone ) + { + provider.Close(); + } + + if ( provider.DatabaseClearingStatus() && err == KErrNone ) + { + DLTRACE(("Databases were cleared, status: %d", + provider.DatabaseClearingStatus() )); + User::Leave( provider.DatabaseClearingStatus() ); + } + } + + User::LeaveIfError( err ); + } + else + { + DLWARNING(( "Unknown provider" )); + User::Leave( KErrNotFound ); + } + + DLTRACEOUT(("")); + } + + +void CCatalogsServerEngine::HandleSessionRemoval( + MCatalogsSession& aSession ) + { + DLTRACEIN(("")); + CNcdProvider* provider = iProviderManager->Provider( aSession.Context() ); + + if ( provider ) + { + provider->HandleSessionRemoval( aSession ); + + // Remove provider manager's reference + if ( provider->AccessCount() == 1 ) + { + DLTRACE(("Last session, deleting provider")); + provider->Close(); + } + } + + DLTRACEOUT(("")); + }