harvester/common/src/harvesterpluginfactory.cpp
branchRCL_3
changeset 8 6752808b2036
parent 0 c53acadfccc6
child 15 3cebc1a84278
--- a/harvester/common/src/harvesterpluginfactory.cpp	Tue Feb 02 00:24:33 2010 +0200
+++ b/harvester/common/src/harvesterpluginfactory.cpp	Fri Feb 19 23:14:48 2010 +0200
@@ -22,18 +22,22 @@
 #include <harvesterplugin.h>
 #include <mdeobject.h>
 #include <harvesterdata.h>
-
+#include "harvestereventmanager.h"
 #include "harvesterpluginfactory.h"
 #include "harvesterplugininfo.h"
 #include "mdsutils.h"
 #include "harvesterlog.h"
 
+const TInt KCacheItemCountForEventCaching = 1;
+
 // ---------------------------------------------------------------------------
 // Constructor
 // ---------------------------------------------------------------------------
 //
 CHarvesterPluginFactory::CHarvesterPluginFactory() :
-    iBlacklist( NULL )
+    iBlacklist( NULL ),
+    iHarvesting( NULL ),
+    iHarvesterEventManager( NULL )
 	{
 	WRITELOG( "CHarvesterPluginFactory::CHarvesterPluginFactory()" );
 	}
@@ -60,6 +64,12 @@
 CHarvesterPluginFactory::~CHarvesterPluginFactory()
 	{
 	WRITELOG( "CHarvesterPluginFactory::~CHarvesterPluginFactory()" );
+	
+    if (iHarvesterEventManager)
+        {
+        iHarvesterEventManager->ReleaseInstance();
+        }
+	
 	iHarvesterPluginInfoArray.ResetAndDestroy();
 	iHarvesterPluginInfoArray.Close();
 	REComSession::FinalClose();
@@ -72,6 +82,7 @@
 void CHarvesterPluginFactory::ConstructL()
 	{
 	WRITELOG( "CHarvesterPluginFactory::ConstructL()" );
+	iHarvesterEventManager = CHarvesterEventManager::GetInstanceL();
 	SetupHarvesterPluginInfoL();
 	}
 
@@ -107,6 +118,8 @@
 				{
 				info->iPlugin = CHarvesterPlugin::NewL( info->iPluginUid );
 				info->iPlugin->SetQueue( info->iQueue );
+				info->iPlugin->SetHarvesterPluginFactory( *this );  
+				info->iPlugin->SetBlacklist( *iBlacklist );
 				}
 			info->iPlugin->GetObjectType( aHD.Uri(), aObjectDef );
 			if( aObjectDef.Length() > 0 )
@@ -127,10 +140,42 @@
 // GetMimeType
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void CHarvesterPluginFactory::GetMimeType(const TDesC& /*aUri*/, TDes& aMimeType)
+EXPORT_C void CHarvesterPluginFactory::GetMimeType(const TDesC& aUri, TDes& aMimeType)
 	{
-	_LIT( KJPGMimeType, "image/jpeg" );
-	aMimeType.Copy( KJPGMimeType );
+    TPtrC extPtr;
+    if( MdsUtils::GetExt( aUri, extPtr ) )
+        {
+        RPointerArray<CHarvesterPluginInfo> supportedPlugins;
+        TRAP_IGNORE( GetSupportedPluginsL( supportedPlugins, extPtr ) );
+        
+        const TInt sCount = supportedPlugins.Count();
+        for( TInt i = 0; i < sCount; i++ )
+            {
+            CHarvesterPluginInfo* info = supportedPlugins[i];
+            if ( !(info->iPlugin) )
+                {
+                TRAPD( error, info->iPlugin = CHarvesterPlugin::NewL( info->iPluginUid ) );
+                if( error != KErrNone )
+                    {
+                    aMimeType.Zero();
+                    return;
+                    }
+                info->iPlugin->SetQueue( info->iQueue );
+                info->iPlugin->SetHarvesterPluginFactory( *this );  
+                info->iPlugin->SetBlacklist( *iBlacklist );
+                }
+                info->iPlugin->GetMimeType( aUri, aMimeType );
+                if( aMimeType.Length() > 0 )
+                    {
+                    break;
+                    }
+            }
+        supportedPlugins.Close();
+        }
+    else
+        {
+        aMimeType.Zero();
+        }
 	}
 
 // ---------------------------------------------------------------------------
@@ -143,20 +188,31 @@
 	WRITELOG1("CHarvesterPluginFactory::HarvestL - aHD->Uri: %S", &aHD->Uri() );
 #endif
 	CHarvesterPluginInfo* hpi = aHD->HarvesterPluginInfo();
-		
+	
+	if( !hpi )
+	    {
+	    SetPluginInfo( aHD );
+	    hpi = aHD->HarvesterPluginInfo();
+	    }
+	
 	if ( hpi )
 		{
 		if ( ! hpi->iPlugin )
 	   		{
 	   		hpi->iPlugin = CHarvesterPlugin::NewL( hpi->iPluginUid );
 	   		hpi->iPlugin->SetQueue( hpi->iQueue );
+	   		hpi->iPlugin->SetHarvesterPluginFactory( *this );  
 	   		hpi->iPlugin->SetBlacklist( *iBlacklist );
 	   		}
 			
 		if( aHD->ObjectType() == EFastHarvest || aHD->Origin() == MdeConstants::Object::ECamera )
 		   	{
 		   	hpi->iQueue.Insert( aHD, 0 );
-		    	}
+		   	if( !hpi->iPlugin->IsActive() )
+		   	    {
+	            hpi->iPlugin->SetPriority( KHarvesterPriorityHarvestingPlugin + 2 );
+		   	    }
+		    }
 	    else
 			{
 			hpi->iQueue.AppendL( aHD );
@@ -270,7 +326,8 @@
     
     // Load plugin
     pluginInfo->iPlugin = CHarvesterPlugin::NewL( pluginInfo->iPluginUid );
-    pluginInfo->iPlugin->SetQueue( pluginInfo->iQueue );    
+    pluginInfo->iPlugin->SetQueue( pluginInfo->iQueue );
+    pluginInfo->iPlugin->SetHarvesterPluginFactory( *this );  
     
     iHarvesterPluginInfoArray.AppendL( pluginInfo );
     CleanupStack::Pop( pluginInfo );
@@ -279,7 +336,7 @@
 void CHarvesterPluginFactory::GetSupportedPluginsL(
 		RPointerArray<CHarvesterPluginInfo>& aSupportedPlugins, const TDesC& aExt )
 	{
-	TInt pluginInfoCount = iHarvesterPluginInfoArray.Count();
+	const TInt pluginInfoCount = iHarvesterPluginInfoArray.Count();
 	TInt extCount = 0;
 	for ( TInt i = pluginInfoCount; --i >= 0; )
         {
@@ -351,3 +408,53 @@
 		}
 	return isContainerFile;
 	}
+
+void CHarvesterPluginFactory::SetPluginInfo( CHarvesterData* aHD )
+    {
+    TPtrC extPtr;
+    if( MdsUtils::GetExt( aHD->Uri(), extPtr ) )
+        {
+        RPointerArray<CHarvesterPluginInfo> supportedPlugins;
+        TRAP_IGNORE( GetSupportedPluginsL( supportedPlugins, extPtr ) );
+        
+        if( supportedPlugins.Count() > 0 )
+            {
+            CHarvesterPluginInfo* info = supportedPlugins[0];
+            aHD->SetHarvesterPluginInfo( info );
+            }
+
+        supportedPlugins.Close();
+        }
+    }
+
+EXPORT_C void CHarvesterPluginFactory::SendHarvestingStatusEventL( TBool aStarted )
+    {
+    const TInt pluginInfoCount = iHarvesterPluginInfoArray.Count();
+    TBool itemsLeft( EFalse );
+    for ( TInt i = pluginInfoCount; --i >= 0; )
+        {
+        CHarvesterPluginInfo* info = iHarvesterPluginInfoArray[i];
+        if( info && info->iQueue.Count() )
+            {
+            itemsLeft = ETrue;
+            break;
+            }
+        }
+    
+    if( !iHarvesting && itemsLeft && aStarted )
+        {
+        iHarvesting = ETrue;
+        iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateStarted );
+        // This next line is for caching the harvester started event for observers registering
+        // after harvesting has already started
+        iHarvesterEventManager->IncreaseItemCount( EHEObserverTypeOverall, KCacheItemCountForEventCaching );
+        return;
+        }
+    else if( iHarvesting && !itemsLeft && !aStarted )
+        {
+        iHarvesting = EFalse;                       
+        iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateFinished );
+        iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeOverall, KCacheItemCountForEventCaching );
+        }
+    }
+