View Issue Details

IDProjectCategoryView StatusLast Update
0001631Far ManagerPlugins APIpublic2011-01-14 15:15
Reportersamlyukov Assigned Tovskirdin  
PrioritynormalSeverityminorReproducibilityhave not tried
Status closedResolutionfixed 
Fixed in Version2.0 
Summary0001631: добавка в PluginsControl() - PCTL_FORCEDLOADPLUGIN
Descriptionдобавка в PluginsControl() - команда PCTL_FORCEDLOADPLUGIN
позволяет сразу грузить плагин в память
TagsNo tags attached.
Build1789

Activities

samlyukov

2010-12-20 15:35

reporter  

!work.diff (4,184 bytes)   
Index: plugins.cpp
===================================================================
--- plugins.cpp	(revision 5375)
+++ plugins.cpp	(working copy)
@@ -348,7 +348,8 @@
 
 bool PluginManager::LoadPlugin(
     const wchar_t *lpwszModuleName,
-    const FAR_FIND_DATA_EX &FindData
+    const FAR_FIND_DATA_EX &FindData,
+    bool LoadToMem
 )
 {
 	Plugin *pPlugin = nullptr;
@@ -369,8 +370,11 @@
 		return false;
 	}
 
-	bool bResult = pPlugin->LoadFromCache(FindData);
+	bool bResult=false;
 
+	if (!LoadToMem)
+		bResult=pPlugin->LoadFromCache(FindData);
+
 	if (!bResult && !Opt.LoadPlug.PluginsCacheOnly)
 	{
 		bResult = pPlugin->Load();
@@ -382,25 +386,30 @@
 	return bResult;
 }
 
-bool PluginManager::LoadPluginExternal(const wchar_t *lpwszModuleName)
+bool PluginManager::LoadPluginExternal(const wchar_t *lpwszModuleName, bool LoadToMem)
 {
 	Plugin *pPlugin = GetPlugin(lpwszModuleName);
 
 	if (pPlugin)
-		return true;
-
-	FAR_FIND_DATA_EX FindData;
-
-	if (apiGetFindDataEx(lpwszModuleName, FindData))
 	{
-		if (LoadPlugin(lpwszModuleName, FindData))
+		if (LoadToMem && !pPlugin->Load())
 		{
+			RemovePlugin(pPlugin);
+			return false;
+		}
+	}
+	else
+	{
+		FAR_FIND_DATA_EX FindData;
+
+		if (apiGetFindDataEx(lpwszModuleName, FindData))
+		{
+			if (!LoadPlugin(lpwszModuleName, FindData, LoadToMem))
+				return false;
 			far_qsort(PluginsData, PluginsCount, sizeof(*PluginsData), PluginsSort);
-			return true;
 		}
 	}
-
-	return false;
+	return true;
 }
 
 int PluginManager::UnloadPlugin(Plugin *pPlugin, DWORD dwException, bool bRemove)
@@ -552,7 +561,7 @@
 			{
 				if (CmpName(L"*.dll",FindData.strFileName,false) && !(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
 				{
-					LoadPlugin(strFullName, FindData);
+					LoadPlugin(strFullName, FindData, false);
 				}
 			} // end while
 		}
@@ -581,7 +590,7 @@
 		FAR_FIND_DATA_EX FindData;
 
 		if (apiGetFindDataEx(strModuleName, FindData))
-			LoadPlugin(strModuleName, FindData);
+			LoadPlugin(strModuleName, FindData, false);
 	}
 }
 
Index: plugapi.cpp
===================================================================
--- plugapi.cpp	(revision 5375)
+++ plugapi.cpp	(working copy)
@@ -2350,6 +2350,7 @@
 	switch (Command)
 	{
 		case PCTL_LOADPLUGIN:
+		case PCTL_FORCEDLOADPLUGIN:
 		case PCTL_UNLOADPLUGIN:
 		{
 			if (Param1 == PLT_PATH)
@@ -2360,7 +2361,9 @@
 					ConvertNameToFull((const wchar_t *)Param2, strPath);
 
 					if (Command == PCTL_LOADPLUGIN)
-						return CtrlObject->Plugins.LoadPluginExternal(strPath);
+						return CtrlObject->Plugins.LoadPluginExternal(strPath, false);
+					else if (Command == PCTL_FORCEDLOADPLUGIN)
+						return CtrlObject->Plugins.LoadPluginExternal(strPath, true);
 					else
 						return CtrlObject->Plugins.UnloadPluginExternal(strPath);
 				}
Index: plugins.hpp
===================================================================
--- plugins.hpp	(revision 5375)
+++ plugins.hpp	(working copy)
@@ -174,7 +174,7 @@
 		bool TestPluginInfo(Plugin *Item,PluginInfo *Info);
 		bool TestOpenPluginInfo(Plugin *Item,OpenPluginInfo *Info);
 
-		bool LoadPlugin(const wchar_t *lpwszModuleName, const FAR_FIND_DATA_EX &FindData);
+		bool LoadPlugin(const wchar_t *lpwszModuleName, const FAR_FIND_DATA_EX &FindData, bool LoadToMem);
 
 		bool AddPlugin(Plugin *pPlugin);
 		bool RemovePlugin(Plugin *pPlugin);
@@ -191,7 +191,7 @@
 
 	public:
 
-		bool LoadPluginExternal(const wchar_t *lpwszModuleName);
+		bool LoadPluginExternal(const wchar_t *lpwszModuleName, bool LoadToMem);
 
 		int UnloadPlugin(Plugin *pPlugin, DWORD dwException, bool bRemove = false);
 		int UnloadPluginExternal(const wchar_t *lpwszModuleName);
Index: plugin.hpp
===================================================================
--- plugin.hpp	(revision 5375)
+++ plugin.hpp	(working copy)
@@ -2205,8 +2205,9 @@
 
 enum FAR_PLUGINS_CONTROL_COMMANDS
 {
-	PCTL_LOADPLUGIN = 0,
-	PCTL_UNLOADPLUGIN,
+	PCTL_LOADPLUGIN       = 0,
+	PCTL_FORCEDLOADPLUGIN = 1,
+	PCTL_UNLOADPLUGIN     = 2,
 };
 
 enum FAR_PLUGIN_LOAD_TYPE
!work.diff (4,184 bytes)   

vskirdin

2011-01-14 15:03

administrator   bugnote:0006113

build 1789

Алекс, с тебя корректировка Писания!

Issue History

Date Modified Username Field Change
2010-12-20 15:35 samlyukov New Issue
2010-12-20 15:35 samlyukov File Added: !work.diff
2011-01-14 14:39 vskirdin Assigned To => vskirdin
2011-01-14 14:39 vskirdin Status new => assigned
2011-01-14 15:03 vskirdin Note Added: 0006113
2011-01-14 15:03 vskirdin Status assigned => feedback
2011-01-14 15:15 vskirdin Build => 1789
2011-01-14 15:15 vskirdin Status feedback => closed
2011-01-14 15:15 vskirdin Resolution open => fixed
2011-01-14 15:15 vskirdin Fixed in Version => 2.0