diff -r 000000000000 -r e6b17d312c8b ximpfw/core/srcdatamodel/ximpfeaturepluginholder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ximpfw/core/srcdatamodel/ximpfeaturepluginholder.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,198 @@ +/* +* Copyright (c) 2007 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: Presence Service Connection globals holder + * +*/ + + +#include +#include "ximpfeaturepluginholder.h" +#include "apidataobjfactoryaccessor.h" + +const TInt KPluginArrayGranularity = 3; + +// ============================ HELPER CLASS =============================== + + +/** + * Nested structure to hold global accessor objects. + */ + +// FIXME: probably better would be to encapsulate the struct to CBase object +NONSHARABLE_STRUCT( SAccessorHolder ) + { + /** + * Presence obj factory accessor + * Owned. + */ + MApiDataObjFactoryAccessor* iPresenceAccessor; + + + // array of accessor plugins + CArrayFixFlat* iAccessorPlugins; + + /** + * TODO: Add here more accessors + */ + + /** + * Reference counter + */ + TInt iRefCount; + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void FeaturePluginHolder::InitializeL( ) + { + SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls(); + + if( !singleton ) + { + singleton = new ( ELeave ) SAccessorHolder; + Dll::SetTls( singleton ); + + // Initialize the variables + singleton->iRefCount = 0; + singleton->iPresenceAccessor = NULL; + + TRAP_IGNORE( singleton->iPresenceAccessor = MApiDataObjFactoryAccessor::NewPresenceAccessorL( ) ); + + //added to hold accessor plugins + singleton->iAccessorPlugins = new(ELeave)CArrayFixFlat(KPluginArrayGranularity); + + FeaturePluginHolder::LoadAccessorPluginsL() ; + } + else + { + // increase the reference counter + singleton->iRefCount++; + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +EXPORT_C MApiDataObjFactoryAccessor* FeaturePluginHolder::PresenceObjFactoryAccessor() + { + SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls(); + if( !singleton ) + { + User::Panic( _L("cximpglobals"), KErrNotFound ); + } + + return singleton->iPresenceAccessor; + } + + +// ----------------------------------------------------------------------------- +// FeaturePluginHolder::Release() +// ----------------------------------------------------------------------------- +// +EXPORT_C void FeaturePluginHolder::Release( ) + { + SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls(); + if ( !singleton->iRefCount ) + { + // No more users, clean the TLS up + delete singleton->iPresenceAccessor; + if ( singleton->iAccessorPlugins ) + { + TInt idx = KErrNotFound; + while( singleton->iAccessorPlugins->Count() ) + { + idx = singleton->iAccessorPlugins->Count() - 1; + // Delete object + delete singleton->iAccessorPlugins->At( idx ); + // Delete element + singleton->iAccessorPlugins->Delete( idx ); + } + } + + delete singleton->iAccessorPlugins; + REComSession::FinalClose(); + + delete singleton; + Dll::SetTls(NULL); + } + else + { + singleton->iRefCount--; + } + } + +void FeaturePluginHolder::LoadAccessorPluginsL() +{ + SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls(); + if(!singleton) + { + User::Panic( _L("cximpglobals"), KErrNotFound ); + } + else + { + RImplInfoPtrArray pluginArray; + MApiDataObjFactoryAccessor::ListAllImplementationsL(pluginArray) ; + if ( pluginArray.Count() ) + { + for( TInt i = 0; i < pluginArray.Count(); i++ ) + { + MApiDataObjFactoryAccessor* implementation = NULL ; + + CImplementationInformation* info = pluginArray[ i ]; + + TUid id = info->ImplementationUid(); + TRAPD(err, implementation = MApiDataObjFactoryAccessor::NewL(id) ); + CleanupStack::PushL(implementation); + if(err == KErrNone) + { + singleton->iAccessorPlugins->AppendL( implementation ); + } + CleanupStack::Pop(implementation); + } + } + pluginArray.ResetAndDestroy(); + } +} + +EXPORT_C TInt FeaturePluginHolder::AccessorCount() +{ + SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls(); + if(!singleton) + { + User::Panic( _L("cximpglobals"), KErrNotFound ); + } + + return singleton->iAccessorPlugins->Count() ; + +} + +EXPORT_C MApiDataObjFactoryAccessor* FeaturePluginHolder::Accessor(TInt index) +{ + SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls(); + if(!singleton) + { + User::Panic( _L("cximpglobals"), KErrNotFound ); + } + + return singleton->iAccessorPlugins->At(index) ; +} + +// End of file + +