authenticationservices/authenticationserver/source/server/pluginmgr.cpp
branchRCL_3
changeset 95 641f389e9157
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/source/server/pluginmgr.cpp	Tue Aug 31 17:00:08 2010 +0300
@@ -0,0 +1,254 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 CPluginMgr
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "authserver_impl.h"
+#include <authserver/authpatchdata.h>
+#include <u32hal.h>
+#include <e32svr.h> 
+using namespace AuthServer;
+
+TLinearOrder<CAuthPluginInterface> CPluginMgr::SPluginOrder(PluginCompare);
+
+TInt CPluginMgr::PluginCompare(const CAuthPluginInterface& aLhs,
+									  const CAuthPluginInterface& aRhs)
+  {
+  return aLhs.Id() - aRhs.Id();
+  }
+
+TInt CPluginMgr::FindById(const TPluginId* aId,
+						 const CAuthPluginInterface& aRhs)
+  {
+  return *aId - aRhs.Id();
+  }
+
+
+CPluginMgr* CPluginMgr::NewLC()
+  {
+  CPluginMgr* me = new (ELeave) CPluginMgr();
+  CleanupStack::PushL(me);
+  me->ConstructL();
+  return me;
+  } 
+
+CPluginMgr* CPluginMgr::NewL()
+  {
+  CPluginMgr* me = CPluginMgr::NewLC();
+  CleanupStack::Pop(me);
+  return me;
+  }
+
+CPluginMgr::~CPluginMgr()
+  {
+  ReleasePlugins();
+  ReleaseImplInfo();
+  }
+
+
+void CPluginMgr::ConstructL()
+  {
+  BuildAuthPluginsListL();
+  }
+
+CAuthPluginInterface* CPluginMgr::PluginL(const TPluginId& aId)
+  {
+  TInt idx = iPlugins.FindInOrder<>(aId, CPluginMgr::FindById);
+  CAuthPluginInterface* plugin = 0;
+  if (idx == KErrNotFound)
+	{
+	  plugin = CreatePluginImplementationL(aId);
+	  iPlugins.InsertInOrder(plugin, SPluginOrder);
+	}
+  else
+	{
+	plugin = iPlugins[idx];
+	}
+  
+  return plugin;
+  }
+
+CAuthPluginInterface* CPluginMgr::ImplementationL(TInt aIndex)
+	{
+	if( aIndex < 0 || aIndex > iPlugins.Count()-1 )
+		{
+		User::Leave(KErrArgument);
+		}
+	return iPlugins[aIndex];
+	}
+
+const RImplInfoPtrArray& CPluginMgr::ImplementationsL()
+    {
+    if (iImplArray.Count() == 0) 
+        {
+        //To load plugins from sources other than ROM the patch 
+        // data KEnablePostMarketAuthenticationPlugins must be set to True.
+        TUint32 enablePostMarketPlugin = KEnablePostMarketAuthenticationPlugins;
+
+        #ifdef __WINS__
+
+        // Default SymbianOS behavior is to only load auth plugins from ROM.
+        enablePostMarketPlugin = 0;
+
+        // For the emulator allow the constant to be patched via epoc.ini
+        UserSvr::HalFunction(EHalGroupEmulator, EEmulatorHalIntProperty,
+        (TAny*)"KEnablePostMarketAuthenticationPlugins", &enablePostMarketPlugin); // read emulator property (if present)
+
+        #endif
+          
+        if(enablePostMarketPlugin == 0)
+        	{
+         	TEComResolverParams resolverParams;
+           	REComSession::ListImplementationsL(KCAuthPluginInterfaceUid,
+        									 resolverParams,
+        									 KRomOnlyResolverUid,
+        									 iImplArray);
+        									 
+            }
+            
+         else
+         	{
+         	REComSession::ListImplementationsL(KCAuthPluginInterfaceUid, iImplArray);
+          	}
+        }
+    return iImplArray;
+    }
+
+void CPluginMgr::ReleasePlugins()
+  {
+  TInt i = iPlugins.Count();
+  while (i)
+	{
+	delete iPlugins[--i];
+	}
+  
+  i = iPluginDtorUids.Count();
+  
+  while(i)
+	  {
+	  REComSession::DestroyedImplementation(iPluginDtorUids[--i]);
+	  }
+  iPlugins.Reset();
+  iPluginDtorUids.Reset();
+  }
+
+void CPluginMgr::ForgetIdentityL(TIdentityId aId)
+  {
+  ImplementationsL();
+  
+  TInt i = iImplArray.Count();
+  while (i)
+	{
+	PluginL(iImplArray[--i]->ImplementationUid().iUid)->Forget(aId);
+	}
+  }
+
+void CPluginMgr::ReleaseImplInfo()
+  {
+  TInt i = iImplArray.Count();
+  while (i)
+	{
+	  delete iImplArray[--i];
+	}
+  
+  iImplArray.Reset();
+  }
+  
+void CPluginMgr::BuildAuthPluginsListL()
+	{
+	ReleasePlugins();
+  	ReleaseImplInfo();
+  	
+	ImplementationsL();
+  	CAuthPluginInterface* plugin = 0;
+  	for( TInt count=0; count < iImplArray.Count(); ++count)
+		{
+		plugin = CreatePluginImplementationL(iImplArray[count]->ImplementationUid().iUid);
+
+		CleanupStack::PushL(plugin);
+		User::LeaveIfError(iPlugins.InsertInOrder(plugin, SPluginOrder));
+		CleanupStack::Pop(plugin);
+		}
+	}
+
+CAuthPluginInterface* CPluginMgr::CreatePluginImplementationL(const TPluginId &aId)
+	{
+	TEComResolverParams resolverParams;
+	TBufC8<16> pluginIdTxt;
+	pluginIdTxt.Des().Format(_L8("%x"), aId);
+	pluginIdTxt.Des().UpperCase();
+	resolverParams.SetDataType(pluginIdTxt);
+		  
+	//To load plugins from sources other than ROM the patch 
+	// data KEnablePostMarketAuthenticationPlugins must be set to True.
+	TUint32 enablePostMarketPlugin = KEnablePostMarketAuthenticationPlugins;
+
+#ifdef __WINS__
+
+	// Default SymbianOS behavior is to only load auth plugins from ROM.
+	enablePostMarketPlugin = 0;
+
+	// For the emulator allow the constant to be patched via epoc.ini
+	UserSvr::HalFunction(EHalGroupEmulator, EEmulatorHalIntProperty,
+	(TAny*)"KEnablePostMarketAuthenticationPlugins", &enablePostMarketPlugin); // read emulator property (if present)
+
+#endif
+
+	TAny* plugin = 0;
+	TInt err = 0;
+	TUid dtor_ID_Key = TUid::Null();
+	if(enablePostMarketPlugin == 0) 
+	  	{
+	  	TRAP(err, plugin = 
+		REComSession::CreateImplementationL(KCAuthPluginInterfaceUid,
+											dtor_ID_Key,
+											resolverParams,
+											KRomOnlyResolverUid));
+	  	}
+		  
+	  else
+	  	{
+	  	TRAP(err, plugin = 
+		REComSession::CreateImplementationL(KCAuthPluginInterfaceUid,
+											dtor_ID_Key,
+											resolverParams));
+	  	}
+		  
+	 if (err == KErrNotFound)
+	    {
+	    err = KErrAuthServNoSuchPlugin;  
+	    }
+	 
+	 //Add key to plugin destructor keys list .
+	 TInt err2 =  iPluginDtorUids.Append(dtor_ID_Key);
+	 
+	 if(KErrNoMemory == err2)
+		 {
+		 CAuthPluginInterface* authPlugin = reinterpret_cast<CAuthPluginInterface*>(plugin);
+		 delete authPlugin;
+		 REComSession::DestroyedImplementation(dtor_ID_Key);
+		 User::LeaveNoMemory();
+		 }
+	 User::LeaveIfError(err);
+
+	return reinterpret_cast<CAuthPluginInterface*>(plugin);
+	}
+