Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/FileManager/RegistryPlugins.cpp')
-rwxr-xr-xCPP/7zip/FileManager/RegistryPlugins.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/CPP/7zip/FileManager/RegistryPlugins.cpp b/CPP/7zip/FileManager/RegistryPlugins.cpp
new file mode 100755
index 00000000..cad3b43d
--- /dev/null
+++ b/CPP/7zip/FileManager/RegistryPlugins.cpp
@@ -0,0 +1,130 @@
+// RegistryPlugins.cpp
+
+#include "StdAfx.h"
+
+#include "Common/StringConvert.h"
+// #include "Windows/Registry.h"
+// #include "Windows/Synchronization.h"
+// #include "Windows/COM.h"
+
+#include "Windows/DLL.h"
+#include "Windows/PropVariant.h"
+#include "Windows/FileFind.h"
+
+#include "RegistryPlugins.h"
+#include "IFolder.h"
+
+using namespace NWindows;
+using namespace NFile;
+// using namespace NRegistry;
+// using namespace NCOM;
+
+/*
+static const TCHAR *kLMBasePath = TEXT("Software\\7-Zip\\FM");
+
+static const TCHAR *kPluginsKeyName = TEXT("Plugins");
+static const TCHAR *kPluginsOpenClassIDValue = TEXT("CLSID");
+static const TCHAR *kPluginsOptionsClassIDValue = TEXT("Options");
+static const TCHAR *kPluginsTypeValue = TEXT("Type");
+
+static CSysString GetFileFolderPluginsKeyName()
+{
+ return CSysString(kLMBasePath) + CSysString(TEXT('\\')) +
+ CSysString(kPluginsKeyName);
+}
+
+static NSynchronization::CCriticalSection g_CriticalSection;
+*/
+typedef UINT32 (WINAPI * GetPluginPropertyFunc)(
+ PROPID propID, PROPVARIANT *value);
+
+static bool ReadPluginInfo(CPluginInfo &pluginInfo)
+{
+ {
+ NDLL::CLibrary library;
+ if (!library.LoadEx(pluginInfo.FilePath, LOAD_LIBRARY_AS_DATAFILE))
+ return false;
+ }
+ NDLL::CLibrary library;
+ if (!library.Load(pluginInfo.FilePath))
+ return false;
+ GetPluginPropertyFunc getPluginProperty = (GetPluginPropertyFunc)
+ library.GetProcAddress("GetPluginProperty");
+ if (getPluginProperty == NULL)
+ return false;
+
+ NCOM::CPropVariant propVariant;
+ if (getPluginProperty(NPlugin::kName, &propVariant) != S_OK)
+ return false;
+ if (propVariant.vt != VT_BSTR)
+ return false;
+ pluginInfo.Name = propVariant.bstrVal;
+ propVariant.Clear();
+
+ if (getPluginProperty(NPlugin::kClassID, &propVariant) != S_OK)
+ return false;
+ if (propVariant.vt != VT_BSTR)
+ return false;
+ pluginInfo.ClassID = *(const GUID *)propVariant.bstrVal;
+ propVariant.Clear();
+
+ if (getPluginProperty(NPlugin::kOptionsClassID, &propVariant) != S_OK)
+ return false;
+ if (propVariant.vt == VT_EMPTY)
+ pluginInfo.OptionsClassIDDefined = false;
+ else if (propVariant.vt != VT_BSTR)
+ return false;
+ else
+ {
+ pluginInfo.OptionsClassIDDefined = true;
+ pluginInfo.OptionsClassID = *(const GUID *)propVariant.bstrVal;
+ }
+ propVariant.Clear();
+
+ if (getPluginProperty(NPlugin::kType, &propVariant) != S_OK)
+ return false;
+ if (propVariant.vt == VT_EMPTY)
+ pluginInfo.Type = kPluginTypeFF;
+ else if (propVariant.vt == VT_UI4)
+ pluginInfo.Type = (EPluginType)propVariant.ulVal;
+ else
+ return false;
+ return true;
+}
+
+UString GetProgramFolderPrefix();
+
+void ReadPluginInfoList(CObjectVector<CPluginInfo> &plugins)
+{
+ plugins.Clear();
+
+ UString baseFolderPrefix = GetProgramFolderPrefix();
+ {
+ CPluginInfo pluginInfo;
+ pluginInfo.FilePath = baseFolderPrefix + L"7-zip.dll";
+ if (::ReadPluginInfo(pluginInfo))
+ plugins.Add(pluginInfo);
+ }
+ UString folderPath = baseFolderPrefix + L"Plugins\\";
+ NFind::CEnumeratorW enumerator(folderPath + L"*");
+ NFind::CFileInfoW fileInfo;
+ while (enumerator.Next(fileInfo))
+ {
+ if (fileInfo.IsDirectory())
+ continue;
+ CPluginInfo pluginInfo;
+ pluginInfo.FilePath = folderPath + fileInfo.Name;
+ if (::ReadPluginInfo(pluginInfo))
+ plugins.Add(pluginInfo);
+ }
+}
+
+void ReadFileFolderPluginInfoList(CObjectVector<CPluginInfo> &plugins)
+{
+ ReadPluginInfoList(plugins);
+ for (int i = 0; i < plugins.Size();)
+ if (plugins[i].Type != kPluginTypeFF)
+ plugins.Delete(i);
+ else
+ i++;
+}