diff -r 57d4cdd99204 -r edfc90759b9f imageeditor/ImageEditorManager/src/ImageEditorPluginScanner.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include + +#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 * cmdids = 0; + cmdids = (CArrayFix *)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 *)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 *)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