1*f6dc9357SAndroid Build Coastguard Worker // RegistryPlugins.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker /* 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "IFolder.h" 11*f6dc9357SAndroid Build Coastguard Worker */ 12*f6dc9357SAndroid Build Coastguard Worker #include "RegistryPlugins.h" 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker // using namespace NWindows; 15*f6dc9357SAndroid Build Coastguard Worker // using namespace NFile; 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker /* 18*f6dc9357SAndroid Build Coastguard Worker typedef UINT32 (WINAPI * Func_GetPluginProperty)(PROPID propID, PROPVARIANT *value); 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker static bool ReadPluginInfo(CPluginInfo &plugin, bool needCheckDll) 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker if (needCheckDll) 23*f6dc9357SAndroid Build Coastguard Worker { 24*f6dc9357SAndroid Build Coastguard Worker NDLL::CLibrary lib; 25*f6dc9357SAndroid Build Coastguard Worker if (!lib.LoadEx(plugin.FilePath, LOAD_LIBRARY_AS_DATAFILE)) 26*f6dc9357SAndroid Build Coastguard Worker return false; 27*f6dc9357SAndroid Build Coastguard Worker } 28*f6dc9357SAndroid Build Coastguard Worker NDLL::CLibrary lib; 29*f6dc9357SAndroid Build Coastguard Worker if (!lib.Load(plugin.FilePath)) 30*f6dc9357SAndroid Build Coastguard Worker return false; 31*f6dc9357SAndroid Build Coastguard Worker const 32*f6dc9357SAndroid Build Coastguard Worker Func_GetPluginProperty 33*f6dc9357SAndroid Build Coastguard Worker f_GetPluginProperty = ZIP7_GET_PROC_ADDRESS( 34*f6dc9357SAndroid Build Coastguard Worker Func_GetPluginProperty, lib.Get_HMODULE(), 35*f6dc9357SAndroid Build Coastguard Worker "GetPluginProperty"); 36*f6dc9357SAndroid Build Coastguard Worker if (!f_GetPluginProperty) 37*f6dc9357SAndroid Build Coastguard Worker return false; 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop; 40*f6dc9357SAndroid Build Coastguard Worker if (f_GetPluginProperty(NPlugin::kType, &prop) != S_OK) 41*f6dc9357SAndroid Build Coastguard Worker return false; 42*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_EMPTY) 43*f6dc9357SAndroid Build Coastguard Worker plugin.Type = kPluginTypeFF; 44*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt == VT_UI4) 45*f6dc9357SAndroid Build Coastguard Worker plugin.Type = (EPluginType)prop.ulVal; 46*f6dc9357SAndroid Build Coastguard Worker else 47*f6dc9357SAndroid Build Coastguard Worker return false; 48*f6dc9357SAndroid Build Coastguard Worker prop.Clear(); 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker if (f_GetPluginProperty(NPlugin::kName, &prop) != S_OK) 51*f6dc9357SAndroid Build Coastguard Worker return false; 52*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_BSTR) 53*f6dc9357SAndroid Build Coastguard Worker return false; 54*f6dc9357SAndroid Build Coastguard Worker plugin.Name = prop.bstrVal; 55*f6dc9357SAndroid Build Coastguard Worker prop.Clear(); 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker if (f_GetPluginProperty(NPlugin::kClassID, &prop) != S_OK) 58*f6dc9357SAndroid Build Coastguard Worker return false; 59*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_EMPTY) 60*f6dc9357SAndroid Build Coastguard Worker plugin.ClassID_Defined = false; 61*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_BSTR) 62*f6dc9357SAndroid Build Coastguard Worker return false; 63*f6dc9357SAndroid Build Coastguard Worker else 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker plugin.ClassID_Defined = true; 66*f6dc9357SAndroid Build Coastguard Worker plugin.ClassID = *(const GUID *)(const void *)prop.bstrVal; 67*f6dc9357SAndroid Build Coastguard Worker } 68*f6dc9357SAndroid Build Coastguard Worker prop.Clear(); 69*f6dc9357SAndroid Build Coastguard Worker return true; 70*f6dc9357SAndroid Build Coastguard Worker */ 71*f6dc9357SAndroid Build Coastguard Worker 72*f6dc9357SAndroid Build Coastguard Worker /* 73*f6dc9357SAndroid Build Coastguard Worker { 74*f6dc9357SAndroid Build Coastguard Worker if (f_GetPluginProperty(NPlugin::kOptionsClassID, &prop) != S_OK) 75*f6dc9357SAndroid Build Coastguard Worker return false; 76*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_EMPTY) 77*f6dc9357SAndroid Build Coastguard Worker plugin.OptionsClassID_Defined = false; 78*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_BSTR) 79*f6dc9357SAndroid Build Coastguard Worker return false; 80*f6dc9357SAndroid Build Coastguard Worker else 81*f6dc9357SAndroid Build Coastguard Worker { 82*f6dc9357SAndroid Build Coastguard Worker plugin.OptionsClassID_Defined = true; 83*f6dc9357SAndroid Build Coastguard Worker plugin.OptionsClassID = *(const GUID *)(const void *)prop.bstrVal; 84*f6dc9357SAndroid Build Coastguard Worker } 85*f6dc9357SAndroid Build Coastguard Worker } 86*f6dc9357SAndroid Build Coastguard Worker */ 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker /* 89*f6dc9357SAndroid Build Coastguard Worker { 90*f6dc9357SAndroid Build Coastguard Worker // very old 7-zip used agent plugin in "7-zip.dll" 91*f6dc9357SAndroid Build Coastguard Worker // but then agent code was moved to 7zfm. 92*f6dc9357SAndroid Build Coastguard Worker // so now we don't need to load "7-zip.dll" here 93*f6dc9357SAndroid Build Coastguard Worker CPluginInfo plugin; 94*f6dc9357SAndroid Build Coastguard Worker plugin.FilePath = baseFolderPrefix + FTEXT("7-zip.dll"); 95*f6dc9357SAndroid Build Coastguard Worker if (::ReadPluginInfo(plugin, false)) 96*f6dc9357SAndroid Build Coastguard Worker if (plugin.Type == kPluginTypeFF) 97*f6dc9357SAndroid Build Coastguard Worker plugins.Add(plugin); 98*f6dc9357SAndroid Build Coastguard Worker } 99*f6dc9357SAndroid Build Coastguard Worker */ 100*f6dc9357SAndroid Build Coastguard Worker /* 101*f6dc9357SAndroid Build Coastguard Worker FString folderPath = NDLL::GetModuleDirPrefix(); 102*f6dc9357SAndroid Build Coastguard Worker folderPath += "Plugins" STRING_PATH_SEPARATOR; 103*f6dc9357SAndroid Build Coastguard Worker NFind::CEnumerator enumerator; 104*f6dc9357SAndroid Build Coastguard Worker enumerator.SetDirPrefix(folderPath); 105*f6dc9357SAndroid Build Coastguard Worker NFind::CFileInfo fi; 106*f6dc9357SAndroid Build Coastguard Worker while (enumerator.Next(fi)) 107*f6dc9357SAndroid Build Coastguard Worker { 108*f6dc9357SAndroid Build Coastguard Worker if (fi.IsDir()) 109*f6dc9357SAndroid Build Coastguard Worker continue; 110*f6dc9357SAndroid Build Coastguard Worker CPluginInfo plugin; 111*f6dc9357SAndroid Build Coastguard Worker plugin.FilePath = folderPath + fi.Name; 112*f6dc9357SAndroid Build Coastguard Worker if (::ReadPluginInfo(plugin, true)) 113*f6dc9357SAndroid Build Coastguard Worker if (plugin.Type == kPluginTypeFF) 114*f6dc9357SAndroid Build Coastguard Worker plugins.Add(plugin); 115*f6dc9357SAndroid Build Coastguard Worker } 116*f6dc9357SAndroid Build Coastguard Worker */ 117*f6dc9357SAndroid Build Coastguard Worker 118*f6dc9357SAndroid Build Coastguard Worker /* 119*f6dc9357SAndroid Build Coastguard Worker ReadPluginInfoList(plugins); 120*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < plugins.Size();) 121*f6dc9357SAndroid Build Coastguard Worker if (plugins[i].Type != kPluginTypeFF) 122*f6dc9357SAndroid Build Coastguard Worker plugins.Delete(i); 123*f6dc9357SAndroid Build Coastguard Worker else 124*f6dc9357SAndroid Build Coastguard Worker i++; 125*f6dc9357SAndroid Build Coastguard Worker */ 126*f6dc9357SAndroid Build Coastguard Worker 127*f6dc9357SAndroid Build Coastguard Worker /* 128*f6dc9357SAndroid Build Coastguard Worker void ReadFileFolderPluginInfoList(CObjectVector<CPluginInfo> &plugins) 129*f6dc9357SAndroid Build Coastguard Worker { 130*f6dc9357SAndroid Build Coastguard Worker plugins.Clear(); 131*f6dc9357SAndroid Build Coastguard Worker { 132*f6dc9357SAndroid Build Coastguard Worker } 133*f6dc9357SAndroid Build Coastguard Worker 134*f6dc9357SAndroid Build Coastguard Worker { 135*f6dc9357SAndroid Build Coastguard Worker CPluginInfo &plugin = plugins.AddNew(); 136*f6dc9357SAndroid Build Coastguard Worker // p.FilePath.Empty(); 137*f6dc9357SAndroid Build Coastguard Worker plugin.Type = kPluginTypeFF; 138*f6dc9357SAndroid Build Coastguard Worker plugin.Name = "7-Zip"; 139*f6dc9357SAndroid Build Coastguard Worker // plugin.ClassID = CLSID_CAgentArchiveHandler; 140*f6dc9357SAndroid Build Coastguard Worker // plugin.ClassID_Defined = true; 141*f6dc9357SAndroid Build Coastguard Worker // plugin.ClassID_Defined = false; 142*f6dc9357SAndroid Build Coastguard Worker // plugin.OptionsClassID_Defined = false; 143*f6dc9357SAndroid Build Coastguard Worker } 144*f6dc9357SAndroid Build Coastguard Worker } 145*f6dc9357SAndroid Build Coastguard Worker */ 146