imageeditor/ImageEditorManager/src/ImageEditorPluginScanner.cpp
changeset 1 edfc90759b9f
child 12 18b321db4884
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorManager/src/ImageEditorPluginScanner.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,537 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* Ixonos Plc
+*
+* Description:  
+*
+*/
+
+
+
+//	INCLUDES
+#include <f32file.h> 
+#include <eikenv.h> 
+#include <bautils.h> 
+#include <utf.h>
+#include <eikmenup.h>
+#include <aknutils.h>
+#include <AknIconUtils.h>
+#include <AknUtils.h>
+
+#include "ImageEditorPluginScanner.h"
+#include "ImageEditorPluginStorage.h"
+#include "PluginLoader.h"
+#include "PluginInfo.h"
+#include "ImageEditorPluginBaseDefs.h"
+#include "ImageEditorManagerDef.h"
+#include "ImageEditorError.h"
+
+//	PLUGIN TYPE DEFINITIONS
+#include "plugintypedef.h"
+
+// DEBUG LOGGER
+#include "imageeditordebugutils.h"
+
+//=============================================================================
+CPluginScanner * CPluginScanner::NewL ()
+{
+    CPluginScanner * self = new (ELeave) CPluginScanner;
+    CleanupStack::PushL (self);
+    self->ConstructL ();
+    CleanupStack::Pop();
+    return self;
+}
+
+//=============================================================================
+CPluginScanner::~CPluginScanner ()
+{
+    iStorage = NULL;
+    LOG(KImageEditorLogFile, "CPluginScanner: ~CPluginScanner");
+}
+
+//=============================================================================
+void CPluginScanner::ScanPluginsL ( TBool& aPluginStorageNeedsUpdate )
+{
+    // Check if the plugin storage internalized from disk is 
+    // valid. If the plugins have changed, we need to perform 
+    // full scan. Otherwise continue with the internalized content.
+    if ( PluginStorageNeedsUpdateL() )
+    {
+        aPluginStorageNeedsUpdate = ETrue;
+        DoScanPluginsL();
+    }
+
+    // Now the plugin infos are almost ready. Only icon bitmaps
+    // are missing...
+    LoadIconBitmapsL();
+}
+
+//=============================================================================
+TBool CPluginScanner::PluginStorageNeedsUpdateL () const
+{
+    LOG(KImageEditorLogFile, "CPluginScanner: Checking for plugin storage validity");
+
+    // First check if the plug-in storage is empty, which probably means that
+    // there was no ini file to internalize (could also mean there are no plug-ins...)
+    if ( ! iStorage->CountPlugins() )
+    {
+        LOG(KImageEditorLogFile, "CPluginScanner: No internalized plugin storage");
+        return ETrue;
+    }
+
+    RFs & fs = CEikonEnv::Static()->FsSession();
+
+    TInt matchCount = 0; // number of files from the plug-in storage matching with scanned files
+    TInt scanCount  = 0; // number of files located from the directory scan
+
+	// Find all plugins in installation directory
+    TFindFile file_finder (fs); 
+    CDir * file_list = 0; 
+         
+    TBuf<32> wildCard;
+    wildCard.Append(KResourceWild);
+    
+    TInt err = file_finder.FindWildByDir (
+		wildCard, 
+		KPluginResourcePath, 
+		file_list
+		);
+
+    // if .RSC file does not found, try to find language specific file
+    if (err)
+    {
+        // Find out what is the current language
+        TFileName resourceFile(KImageEditorResourceFile);
+ 		
+ 		CompleteWithAppPath(resourceFile);
+ 		
+        BaflUtils::NearestLanguageFile(fs, resourceFile);
+
+        TInt extPosition = resourceFile.LocateReverse(TChar('.'));
+
+        wildCard.Zero();
+        wildCard.Append('*');
+        wildCard.Append(resourceFile.Mid(extPosition));
+
+        err = file_finder.FindWildByDir (
+    		wildCard, 
+    		KPluginResourcePath, 
+    		file_list
+    		);        
+    }
+
+	//	Go through all drives
+    while (err == KErrNone)
+    {
+        CleanupStack::PushL (file_list);
+        scanCount += file_list->Count();
+
+		//	Check all plug-in candidates
+        for (TInt i = 0; i < file_list->Count(); ++i) 
+        {
+
+            /*
+            *
+            *	GET PLUG-IN FILE NAME
+            *
+            */
+
+            //	Create a full file name for plugin
+            TParse fullentry;
+            TPtrC name = (*file_list)[i].iName;
+            const TDesC* related = &(file_finder.File());
+            fullentry.Set ( name, related, 0 );
+            TFileName filename(fullentry.Name());            
+            filename.Append(KPluginExtension);
+
+            /*
+            *
+            *	SEE IF PLUG-IN FILE NAME IS IN  THE STORAGE
+            *
+            */
+
+            TInt pos; // not used
+            if ( 0 == iStorage->FindPluginDll(filename, pos) )
+            {
+                matchCount++;
+            }
+
+        }
+
+        CleanupStack::PopAndDestroy(); /// file_list
+
+		//	Try once again
+        err = file_finder.FindWild (file_list); 
+    }
+
+    // All plug-in files have been scanned. See the result.
+    if( scanCount == matchCount && matchCount == iStorage->CountPlugins() )
+    {
+        LOG(KImageEditorLogFile, "CPluginScanner: plug-in storage up to date");
+        return EFalse; // no update needed
+    }
+    else
+    {
+        LOG(KImageEditorLogFile, "CPluginScanner: plug-in storage update needed");
+        return ETrue;
+    }
+}
+
+//=============================================================================
+void CPluginScanner::DoScanPluginsL ()
+{
+    LOG(KImageEditorLogFile, "CPluginScanner: Scanning plugins");
+
+    // iStorage may contain invalidated internalized 
+    // data, so it needs to be emptied first.
+    iStorage->ResetAndDestroy();
+
+	// Create a file session
+    RFs & fs = CEikonEnv::Static()->FsSession();
+
+	// Find plugin resource files private directory. It is not allowed 
+	// to find plug-in DLLs from /sys/bin/ directory, because of 
+	// Platform Security
+    TFindFile file_finder (fs); 
+    CDir * file_list = 0; 
+    
+    TBuf<32> wildCard;
+    wildCard.Append(KResourceWild);
+    
+    TInt err = file_finder.FindWildByDir (
+		wildCard, 
+		KPluginResourcePath, 
+		file_list
+		);
+
+    // if .RSC file does not found, try to find language specific file
+    if (err)
+    {
+        // Find out what is the current language
+        TFileName resourceFile(KImageEditorResourceFile);
+ 		
+ 		CompleteWithAppPath(resourceFile);
+ 		
+        BaflUtils::NearestLanguageFile(fs, resourceFile);
+
+        TInt extPosition = resourceFile.LocateReverse(TChar('.'));
+
+        wildCard.Zero();
+        wildCard.Append('*');
+        wildCard.Append(resourceFile.Mid(extPosition));
+
+        err = file_finder.FindWildByDir (
+    		wildCard, 
+    		KPluginResourcePath, 
+    		file_list
+    		);        
+    }
+    
+	//	Go through all drives
+    while (err == KErrNone)
+    {
+        CleanupStack::PushL (file_list);
+
+		//	Check all plug-in candidates
+        for (TInt i = 0; i < file_list->Count(); ++i) 
+        {
+
+            /*
+            *
+            *	LOAD PLUG-IN
+            *
+            */
+
+            //	Create a full file name for plugin
+            TParse fullentry;
+            fullentry.Set (
+				(*file_list)[i].iName,&
+                file_finder.File(), 
+				0
+				); 
+				
+			// Use resource filename to compose DLL filename
+            TFileName name(fullentry.Name());            
+            name.Append(KPluginExtension);
+            
+            LOGFMT(KImageEditorLogFile,"CPluginScanner: Starting to load plug-in file: %S", &name);
+
+            //	Load plug-in and perform the DLL checks
+			CPluginLoader * pluginloader = 
+				CPluginLoader::NewLC (name, &TUid2, 0);
+
+
+			//	Get pointer to the plugin
+			CPluginType * plugin = pluginloader->GetPlugin();
+				
+			//	Query information and construct CPluginInfo instance
+            CPluginInfo * plugininfo = CPluginInfo::NewLC ();
+
+            /*
+            *
+            *	STORE ALL PLUG-IN INFORMATION
+            *
+            */
+
+			//	Read buffer and parser
+			TBuf<256>  	readbuf;  
+			TBuf<256> 	ureadbuf;  
+			TLex       	parser;
+
+            //	PLUG-IN DLL NAME
+		    ureadbuf.Copy (name);
+            plugininfo->PluginDll() = ( ureadbuf.AllocL() );
+
+            //	PLUG-IN UID2
+			plugininfo->Uid2() = pluginloader->GetPluginDll().Type()[1];
+
+            //	PLUG-IN UID3
+			plugininfo->Uid3() = pluginloader->GetPluginDll().Type()[2];
+
+            //	PLUG-IN UI TYPE
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginUiType, readbuf) );
+			parser.Assign (readbuf);
+			parser.Val ( plugininfo->PluginUiType() );
+
+            //	PLUG-IN FILTER TYPE
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginFilterType, readbuf) );
+			parser.Assign (readbuf);
+			parser.Val ( plugininfo->PluginFilterType() );
+
+            //	PLUG-IN FILTER SCOPE
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginScope, readbuf) );
+			parser.Assign (readbuf);
+			parser.Val ( plugininfo->PluginScope() );
+
+            //  PLUG-IN DISPLAY ORDER VALUE
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginDisplayOrder, readbuf) );
+			parser.Assign (readbuf);
+			parser.Val ( plugininfo->PluginDisplayOrder() );
+
+            //  PLUG-IN RUN-TIME ID (RID)
+            plugininfo->PluginRID() = iLastRID++;
+
+			//	PLUG-IN NAME
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginName, readbuf) );
+            ureadbuf.Copy( readbuf );
+            plugininfo->PluginName() = ureadbuf.AllocL();
+
+			//	PLUG-IN ICON FILE NAME
+			User::LeaveIfError ( plugin->GetProperty (KCapIconName, readbuf) );
+            ureadbuf.Copy( readbuf );
+			plugininfo->IconFile() = ureadbuf.AllocL();
+
+            //	PARAMETER DESCRIPTOR ARRAY
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginParamNames, readbuf) );
+			parser.Assign (readbuf);
+            TInt tempval = 0;
+			parser.Val ( tempval );
+            CDesCArray * parameters = (CDesCArray *)tempval;
+            if (parameters)
+			{
+				for (TInt j = 0; j < parameters->Count(); ++j)
+				{
+					plugininfo->Parameters().AppendL( (*parameters)[j] );
+				}
+			}
+
+			//	SOFT KEY 1 COMMAND IDS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginSk1Cmd, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            CArrayFix<TInt> * cmdids = 0;
+            cmdids = (CArrayFix<TInt> *)tempval;
+            if (cmdids)
+			{
+				for (TInt j = 0; j < cmdids->Count(); ++j)
+				{
+					plugininfo->Sk1Cmds().AppendL( (*cmdids)[j] );
+				}
+			}
+
+			//	SOFT KEY 1 TEXTS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginSk1Text, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            CDesCArray * texts = 0;
+            texts = (CDesCArray *)tempval;
+            if (texts)
+			{
+				for (TInt j = 0; j < texts->Count(); ++j)
+				{
+					plugininfo->Sk1Texts().AppendL( (*texts)[j] );
+				}
+			}
+
+			//	SOFT KEY 2 COMMAND IDS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginSk2Cmd, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            cmdids = 0;
+            cmdids = (CArrayFix<TInt> *)tempval;
+            if (cmdids)
+			{
+				for (TInt j = 0; j < cmdids->Count(); ++j)
+				{
+					plugininfo->Sk2Cmds().AppendL( (*cmdids)[j] );
+				}
+			}
+
+			//	SOFT KEY 2 TEXTS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginSk2Text, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            texts = 0;
+            texts = (CDesCArray *)tempval;
+            if (texts)
+			{
+				for (TInt j = 0; j < texts->Count(); ++j)
+				{
+					plugininfo->Sk2Texts().AppendL( (*texts)[j] );
+				}
+			}
+            
+            //	MSK COMMAND IDS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginMSKCmd, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            cmdids = 0;
+            cmdids = (CArrayFix<TInt> *)tempval;
+            if (cmdids)
+			{
+				for (TInt j = 0; j < cmdids->Count(); ++j)
+				{
+					plugininfo->MSKCmds().AppendL( (*cmdids)[j] );
+				}
+			}
+
+			//	MSK TEXTS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginMSKText, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            texts = 0;
+            texts = (CDesCArray *)tempval;
+            if (texts)
+			{
+				for (TInt j = 0; j < texts->Count(); ++j)
+				{
+					plugininfo->MSKTexts().AppendL( (*texts)[j] );
+				}
+			}
+            
+			//	MENU ITEMS
+			User::LeaveIfError ( plugin->GetProperty (KCapPluginMenuItems, readbuf) );
+			parser.Assign (readbuf);
+            tempval = 0;
+			parser.Val ( tempval );
+            CMenuItemArray * menuitems = (CMenuItemArray *)tempval;
+            if (menuitems)
+            {
+                for (TInt j = 0; j < menuitems->Count(); ++j)
+			    {
+				    plugininfo->MenuItems().AppendL ( (*menuitems)[j] );
+			    }
+            }
+
+			//	Add plugininfo to storage
+			iStorage->AddPluginInfoL (plugininfo);
+
+			CleanupStack::Pop();                // plugininfo
+			CleanupStack::PopAndDestroy ();     // pluginloader
+        }	
+    
+		CleanupStack::PopAndDestroy(); /// file_list
+
+		//	Try once again
+        err = file_finder.FindWild (file_list); 
+    }
+}
+
+//=============================================================================
+void CPluginScanner::LoadIconBitmapsL()
+{
+    ASSERT( iStorage );
+
+    for ( TInt i = 0; i < iStorage->CountPlugins(); i++)
+    {
+        CPluginInfo* plugininfo = iStorage->GetPluginInfo(i);
+
+		TFileName iconfile;
+        iconfile.Copy ( KPluginBitmapPath );
+        iconfile.Append ( plugininfo->IconFile()->Des() );
+
+        CompleteWithAppPath( iconfile );
+        if ( !BaflUtils::FileExists (CEikonEnv::Static()->FsSession(), iconfile) )
+        {
+            LOGFMT(KImageEditorLogFile,"CPluginScanner: File not found: %S", &iconfile);
+            User::Leave (KSIEEInternal);
+        }
+
+        LOGFMT(KImageEditorLogFile,"CPluginScanner: Plug-in icon file: %S", &iconfile);
+
+        // Check whether icon file is SVG graphic
+        if (AknIconUtils::IsMifFile(iconfile))
+        {
+            TInt bitmapId = 0;
+            TInt maskId = 0;
+            // Get ids for bitmap and mask
+            // NOTE: ValidateLogicalAppIconId returns same id for both!
+            AknIconUtils::ValidateLogicalAppIconId(iconfile, bitmapId, maskId);
+            AknIconUtils::CreateIconL(
+                plugininfo->Icon(),
+                plugininfo->Mask(),
+                iconfile,
+                bitmapId,
+                maskId+1);  // TEMPORARY FIX
+
+            //plugininfo->Icon()->Save(_L("icon.mbm"));
+            //plugininfo->Mask()->Save(_L("mask.mbm"));
+        }
+        else
+        {
+            //	PLUG-IN ICON BITMAP
+            CFbsBitmap * icon = new (ELeave) CFbsBitmap;
+            CleanupStack::PushL (icon);
+            User::LeaveIfError ( icon->Load (iconfile, 0) );
+            plugininfo->Icon() = icon;
+            CleanupStack::Pop(); // icon
+
+            //	PLUG-IN MASK BITMAP
+            CFbsBitmap * mask = new (ELeave) CFbsBitmap;
+            CleanupStack::PushL (mask);
+            User::LeaveIfError ( mask->Load (iconfile, 1) );
+            plugininfo->Mask() = mask;
+            CleanupStack::Pop(); // mask
+        }
+    }
+}
+
+//=============================================================================
+CPluginScanner::CPluginScanner()
+{
+
+}
+	
+//=============================================================================
+void CPluginScanner::ConstructL ()
+{
+    
+}
+
+// End of File