ximpfw/core/srcdatamodel/ximpfeaturepluginholder.cpp
changeset 0 e6b17d312c8b
--- /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 <e32base.h>
+#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<MApiDataObjFactoryAccessor*>* 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<MApiDataObjFactoryAccessor*>(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
+
+