diff -r 0efa10d348c0 -r a5a39a295112 contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentpublishingsrv/contentpublishingutils/pluginvalidator/src/cpluginvalidator.cpp Wed Sep 01 12:22:09 2010 +0100 @@ -0,0 +1,266 @@ +/* +* 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 +#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( 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 ); + } + } +