diff -r 000000000000 -r c53acadfccc6 harvester/common/src/harvesterpluginfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/common/src/harvesterpluginfactory.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,353 @@ +/* +* Copyright (c) 2006-2009 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: Harvester plugin factory + * +*/ + + +#include +#include +#include +#include +#include +#include + +#include "harvesterpluginfactory.h" +#include "harvesterplugininfo.h" +#include "mdsutils.h" +#include "harvesterlog.h" + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CHarvesterPluginFactory::CHarvesterPluginFactory() : + iBlacklist( NULL ) + { + WRITELOG( "CHarvesterPluginFactory::CHarvesterPluginFactory()" ); + } + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CHarvesterPluginFactory* CHarvesterPluginFactory::NewL() + { + WRITELOG( "CHarvesterPluginFactory::NewL()" ); + CHarvesterPluginFactory* self = new (ELeave) CHarvesterPluginFactory(); + CleanupStack::PushL ( self); + self->ConstructL (); + CleanupStack::Pop ( self); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CHarvesterPluginFactory::~CHarvesterPluginFactory() + { + WRITELOG( "CHarvesterPluginFactory::~CHarvesterPluginFactory()" ); + iHarvesterPluginInfoArray.ResetAndDestroy(); + iHarvesterPluginInfoArray.Close(); + REComSession::FinalClose(); + } + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CHarvesterPluginFactory::ConstructL() + { + WRITELOG( "CHarvesterPluginFactory::ConstructL()" ); + SetupHarvesterPluginInfoL(); + } + +// --------------------------------------------------------------------------- +// GetObjectDef +// --------------------------------------------------------------------------- +// +EXPORT_C void CHarvesterPluginFactory::GetObjectDefL( CHarvesterData& aHD, TDes& aObjectDef ) + { + TPtrC extPtr; + if( MdsUtils::GetExt( aHD.Uri(), extPtr ) ) + { + RPointerArray supportedPlugins; + CleanupClosePushL( supportedPlugins ); + GetSupportedPluginsL( supportedPlugins, extPtr ); + + const TInt sCount = supportedPlugins.Count(); + if( sCount == 1 ) + { + CHarvesterPluginInfo* info = supportedPlugins[0]; + if( info->iObjectTypes.Count() == 1 ) + { + aObjectDef.Copy( *(info->iObjectTypes[0]) ); + aHD.SetHarvesterPluginInfo( info ); + CleanupStack::PopAndDestroy( &supportedPlugins ); + return; + } + } + for( TInt i = 0; i < sCount; i++ ) + { + CHarvesterPluginInfo* info = supportedPlugins[i]; + if ( !(info->iPlugin) ) + { + info->iPlugin = CHarvesterPlugin::NewL( info->iPluginUid ); + info->iPlugin->SetQueue( info->iQueue ); + } + info->iPlugin->GetObjectType( aHD.Uri(), aObjectDef ); + if( aObjectDef.Length() > 0 ) + { + aHD.SetHarvesterPluginInfo( info ); + break; + } + } + CleanupStack::PopAndDestroy( &supportedPlugins ); + } + else + { + aObjectDef.Zero(); + } + } + +// --------------------------------------------------------------------------- +// GetMimeType +// --------------------------------------------------------------------------- +// +EXPORT_C void CHarvesterPluginFactory::GetMimeType(const TDesC& /*aUri*/, TDes& aMimeType) + { + _LIT( KJPGMimeType, "image/jpeg" ); + aMimeType.Copy( KJPGMimeType ); + } + +// --------------------------------------------------------------------------- +// HarvestL +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CHarvesterPluginFactory::HarvestL( CHarvesterData* aHD ) + { +#ifdef _DEBUG + WRITELOG1("CHarvesterPluginFactory::HarvestL - aHD->Uri: %S", &aHD->Uri() ); +#endif + CHarvesterPluginInfo* hpi = aHD->HarvesterPluginInfo(); + + if ( hpi ) + { + if ( ! hpi->iPlugin ) + { + hpi->iPlugin = CHarvesterPlugin::NewL( hpi->iPluginUid ); + hpi->iPlugin->SetQueue( hpi->iQueue ); + hpi->iPlugin->SetBlacklist( *iBlacklist ); + } + + if( aHD->ObjectType() == EFastHarvest || aHD->Origin() == MdeConstants::Object::ECamera ) + { + hpi->iQueue.Insert( aHD, 0 ); + } + else + { + hpi->iQueue.AppendL( aHD ); + } + + hpi->iPlugin->StartHarvest(); + + return KErrNone; + } + + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// GetPluginInfos +// --------------------------------------------------------------------------- +// +EXPORT_C RPointerArray& CHarvesterPluginFactory::GetPluginInfos() + { + return iHarvesterPluginInfoArray; + } + +// --------------------------------------------------------------------------- +// SetBlacklist +// --------------------------------------------------------------------------- +// +EXPORT_C void CHarvesterPluginFactory::SetBlacklist( CHarvesterBlacklist& aBlacklist ) + { + WRITELOG( "CHarvesterPluginFactory::SetBlacklist()" ); + iBlacklist = &aBlacklist; + + TInt count = iHarvesterPluginInfoArray.Count(); + for ( TInt i = 0; i < count; i++ ) + { + iHarvesterPluginInfoArray[i]->iPlugin->SetBlacklist( *iBlacklist ); + } + + } + +// --------------------------------------------------------------------------- +// SetupHarvesterPluginInfoL +// --------------------------------------------------------------------------- +// +void CHarvesterPluginFactory::SetupHarvesterPluginInfoL() + { + WRITELOG( "CHarvesterPluginFactory::SetupHarvesterPluginInfo()" ); + + RImplInfoPtrArray infoArray; + TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray ); + CleanupStack::PushL( cleanupItem ); + + CHarvesterPlugin::ListImplementationsL( infoArray ); + + for ( TInt i = infoArray.Count(); --i >= 0; ) + { + // Parse the MIME types and resolve plug-in's uids from infoArray to iDataTypeArray + CImplementationInformation* info = infoArray[i]; + const TBufC8& type = info->DataType(); + const TBufC8& opaque = info->OpaqueData(); + TUid implUID = info->ImplementationUid(); + + AddNewPluginL( type, opaque, implUID ); + } + + CleanupStack::PopAndDestroy( &infoArray ); + } + +// --------------------------------------------------------------------------- +// AddNewPluginL +// --------------------------------------------------------------------------- +// +void CHarvesterPluginFactory::AddNewPluginL( const TDesC8& aType, + const TDesC8& aOpaque, TUid aPluginUid ) + { + WRITELOG( "CHarvesterPluginFactory::AddNewPluginL" ); + + CHarvesterPluginInfo* pluginInfo = new (ELeave) CHarvesterPluginInfo; + CleanupStack::PushL( pluginInfo ); + + // get file extensions + TLex8 lex( aOpaque ); + while ( !lex.Eos() ) + { + /* Tokenizing file extensions using TLex8 */ + lex.SkipSpaceAndMark(); + + TPtrC8 extToken = lex.NextToken(); + + HBufC* str = HBufC::NewLC( extToken.Length() ); + str->Des().Copy( extToken ); + pluginInfo->iExtensions.AppendL( str ); + CleanupStack::Pop( str ); + } + + // get object types + TLex8 lexObjectTypes( aType ); + while ( !lexObjectTypes.Eos() ) + { + /* Tokenizing object types using TLex8 */ + lexObjectTypes.SkipSpaceAndMark(); + + TPtrC8 objectTypeToken = lexObjectTypes.NextToken(); + + HBufC* str = HBufC::NewLC( objectTypeToken.Length() ); + str->Des().Copy( objectTypeToken ); + pluginInfo->iObjectTypes.AppendL( str ); + CleanupStack::Pop( str ); + } + + pluginInfo->iPluginUid = aPluginUid; + + // Load plugin + pluginInfo->iPlugin = CHarvesterPlugin::NewL( pluginInfo->iPluginUid ); + pluginInfo->iPlugin->SetQueue( pluginInfo->iQueue ); + + iHarvesterPluginInfoArray.AppendL( pluginInfo ); + CleanupStack::Pop( pluginInfo ); + } + +void CHarvesterPluginFactory::GetSupportedPluginsL( + RPointerArray& aSupportedPlugins, const TDesC& aExt ) + { + TInt pluginInfoCount = iHarvesterPluginInfoArray.Count(); + TInt extCount = 0; + for ( TInt i = pluginInfoCount; --i >= 0; ) + { + CHarvesterPluginInfo* info = iHarvesterPluginInfoArray[i]; + + extCount = info->iExtensions.Count(); + for ( TInt k = extCount; --k >= 0; ) + { + TDesC* ext = info->iExtensions[k]; + + // checking against supported plugin file extensions + const TInt result = ext->CompareF( aExt ); + if ( result == 0 ) + { + aSupportedPlugins.AppendL( info ); + break; + } + } + } + } + +EXPORT_C TBool CHarvesterPluginFactory::IsSupportedFileExtension( const TDesC& aFileName ) + { + TPtrC extPtr; + if( MdsUtils::GetExt( aFileName, extPtr ) ) + { + TInt pluginInfoCount = iHarvesterPluginInfoArray.Count(); + TInt extCount = 0; + for ( TInt i = pluginInfoCount; --i >= 0; ) + { + CHarvesterPluginInfo* info = iHarvesterPluginInfoArray[i]; + extCount = info->iExtensions.Count(); + for ( TInt k = extCount; --k >= 0; ) + { + TDesC* ext = info->iExtensions[k]; + // checking against supported plugin file extensions + TInt result = MdsUtils::Compare( *ext, extPtr ); + if ( result == 0 ) + { + return ETrue; + } + } + } + } + return EFalse; + } + +EXPORT_C TBool CHarvesterPluginFactory::IsContainerFileL( const TDesC& aURI ) + { + TBool isContainerFile = EFalse; + TPtrC extPtr; + + if( MdsUtils::GetExt( aURI, extPtr ) ) + { + RPointerArray supportedPlugins; + CleanupClosePushL( supportedPlugins ); + GetSupportedPluginsL( supportedPlugins, extPtr ); + const TInt sCount = supportedPlugins.Count(); + for( TInt i = 0; i < sCount; i++ ) + { + CHarvesterPluginInfo* info = supportedPlugins[i]; + if( info->iObjectTypes.Count() > 1 ) + { + isContainerFile = ETrue; + break; + } + } + CleanupStack::PopAndDestroy( &supportedPlugins ); + } + return isContainerFile; + }