contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp
changeset 0 79c6a41cd166
child 25 9e077f9a342c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,269 @@
+/*
+* 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 <ecom/ecom.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+#include "cpluginvalidator.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CPluginValidator* CPluginValidator::NewL( TUid aUid, 
+                                                   TAny *aParameter )
+    {
+    CPluginValidator* self = CPluginValidator::NewLC( aUid , aParameter );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CPluginValidator* CPluginValidator::NewLC( TUid aUid,
+                                                    TAny *aParameter )
+    {
+    CPluginValidator* self = new( ELeave ) CPluginValidator( aUid, 
+                                                             aParameter );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TAny* CPluginValidator::GetImplementation( TUid aUid )
+    {
+    TPluginInfo pluginInfo;
+    pluginInfo.iImplementationUid = aUid;
+    TInt index = iPluginArray.Find( pluginInfo, 
+    			TIdentityRelation< TPluginInfo >(UidMatch) );    
+    return GetImplementation( index );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TAny* CPluginValidator::GetImplementation( TInt aIndex )
+    {
+    TAny* ret( NULL ); 
+    if (( aIndex != KErrNotFound ) && ( aIndex < iPluginArray.Count() ))
+    	{
+    	ret= iPluginArray[aIndex].iPlugin;
+    	}
+    return ret;    
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CPluginValidator::GetCount( )
+    {
+    return iPluginArray.Count();
+    }
+
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+CPluginValidator::~CPluginValidator()
+    {
+    Cancel();
+    CleanPluginsTable();
+    iPluginArray.Close( );
+    if( iSession )
+        {
+        iSession->Close();
+        }
+    REComSession::FinalClose( );
+    }
+    
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CPluginValidator::RunL()
+    {
+    ManagePluginsL();
+    iSession->NotifyOnChange( iStatus );
+    SetActive();    
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CPluginValidator::DoCancel()
+    {
+    iSession->CancelNotifyOnChange( iStatus );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TInt CPluginValidator::RunError( TInt /*aError*/)
+    {
+    return KErrNone;
+    }
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+CPluginValidator::CPluginValidator( TUid aUid, TAny* aParameter ): 
+                                                  CActive(EPriorityStandard),
+                                                  iUid( aUid ),
+                                                  iParameter( aParameter )
+    {
+    
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CPluginValidator::ConstructL()
+    {
+    iSession = &REComSession::OpenL();
+    ManagePluginsL();
+    iSession->NotifyOnChange( iStatus );
+    CActiveScheduler::Add( this );
+    SetActive();
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TBool CPluginValidator::PresentInArrayL( TPluginInfo aPluginInfo, 
+		const RImplInfoPtrArray& aInfoArray )
+	{
+	TBool result(EFalse);
+	for ( TInt i = 0; i< aInfoArray.Count(); i++ )
+		{
+		if ( aPluginInfo.iImplementationUid.iUid == 
+						aInfoArray[i]->ImplementationUid().iUid)
+			{
+			result = ETrue;
+			break;
+			}
+		}
+	return result;
+	}
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//        
+void CPluginValidator::DestroyPlugin( TInt aIndex )    
+    {
+    CBase* plugin = static_cast<CBase*>( iPluginArray[aIndex].iPlugin );
+    delete plugin;
+    REComSession::DestroyedImplementation( 
+    		iPluginArray[aIndex].iDtor_ID_Key );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//        
+void CPluginValidator::CleanPluginsTable()    
+    {
+    for ( TInt i = 0; i < iPluginArray.Count(); i++ )
+    	{
+    	DestroyPlugin( i );
+    	}
+    }
+
+	
+	
+	
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CPluginValidator::ManagePluginsL()    
+    {
+    // Read info about all implementations into infoArray
+    RImplInfoPtrArray infoArray;
+    CleanupResetAndDestroyPushL( infoArray );
+	
+    REComSession::ListImplementationsL( iUid , infoArray );
+    TPluginInfo pluginInfo;   
+    //Load new plugins
+    for ( TInt i = 0; i < infoArray.Count( ); i++ )
+        {
+        pluginInfo.iImplementationUid = infoArray[i]->ImplementationUid( );
+        pluginInfo.iVersion = infoArray[i]->Version();
+        
+        TInt index = iPluginArray.Find( pluginInfo, 
+        			TIdentityRelation< TPluginInfo >(UidMatch) );
+        
+        if ( index == KErrNotFound )
+        	{
+        	//plugin wasn't present, we load it now
+			LoadPluginL( pluginInfo );
+        	}
+        else if ( pluginInfo.iVersion > iPluginArray[index].iVersion )
+        	{
+        	//plugin was present but it is a newer version, 
+        	//remove old and load a new one
+			DestroyPlugin( index );
+			iPluginArray.Remove( index );
+			LoadPluginL( pluginInfo );
+        	}
+        }
+    //Remove old plugins
+    for ( TInt i = iPluginArray.Count() - 1 ; i >= 0; i-- )
+    	{
+    	pluginInfo = iPluginArray[i];
+    	if ( !PresentInArrayL( pluginInfo, infoArray ) )
+    		{
+    		DestroyPlugin( i );
+    	    iPluginArray.Remove( i );
+    		}
+    	}
+    CleanupStack::PopAndDestroy( &infoArray );    
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CPluginValidator::LoadPluginL( TPluginInfo& aPluginInfo )    
+    {
+	TAny* plug ( NULL );
+	TInt err( KErrNone );
+	TRAP( err, plug = REComSession::CreateImplementationL( 
+										aPluginInfo.iImplementationUid, 
+										aPluginInfo.iDtor_ID_Key, iParameter ) );
+	if( err==KErrNone && plug ) 
+		{
+		CleanupStack::PushL( plug );
+		aPluginInfo.iPlugin = plug;
+		iPluginArray.AppendL( aPluginInfo );
+		CleanupStack::Pop( plug );
+		}
+   	}
+