1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
// FileFolderPluginOpen.cpp
#include "StdAfx.h"
#include "Common/StringConvert.h"
#include "Windows/Defs.h"
#include "Windows/FileDir.h"
#include "Windows/FileName.h"
#include "Windows/DLL.h"
#include "IFolder.h"
#include "RegistryAssociations.h"
#include "RegistryPlugins.h"
#include "OpenCallback.h"
#include "PluginLoader.h"
using namespace NWindows;
using namespace NRegistryAssociations;
static int FindPlugin(const CObjectVector<CPluginInfo> &plugins,
const UString &pluginName)
{
for (int i = 0; i < plugins.Size(); i++)
if (plugins[i].Name.CompareNoCase(pluginName) == 0)
return i;
return -1;
}
HRESULT OpenFileFolderPlugin(
const UString &path,
HMODULE *module,
IFolderFolder **resultFolder,
HWND parentWindow,
bool &encrypted)
{
encrypted = false;
CObjectVector<CPluginInfo> plugins;
ReadFileFolderPluginInfoList(plugins);
UString extension;
UString name, pureName, dot;
if(!NFile::NDirectory::GetOnlyName(path, name))
return E_FAIL;
NFile::NName::SplitNameToPureNameAndExtension(name, pureName, dot, extension);
int slashPos = path.ReverseFind(L'\\');
UString dirPrefix;
UString fileName;
if (slashPos >= 0)
{
dirPrefix = path.Left(slashPos + 1);
fileName = path.Mid(slashPos + 1);
}
else
fileName = path;
if (!extension.IsEmpty())
{
CExtInfo extInfo;
if (ReadInternalAssociation(extension, extInfo))
{
for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--)
{
int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]);
if (pluginIndex >= 0)
{
const CPluginInfo plugin = plugins[pluginIndex];
plugins.Delete(pluginIndex);
plugins.Insert(0, plugin);
}
}
}
}
for (int i = 0; i < plugins.Size(); i++)
{
const CPluginInfo &plugin = plugins[i];
CPluginLibrary library;
CMyComPtr<IFolderManager> folderManager;
CMyComPtr<IFolderFolder> folder;
HRESULT result = library.LoadAndCreateManager(
plugin.FilePath, plugin.ClassID, &folderManager);
if (result != S_OK)
continue;
COpenArchiveCallback *openCallbackSpec = new COpenArchiveCallback;
CMyComPtr<IProgress> openCallback = openCallbackSpec;
openCallbackSpec->PasswordIsDefined = false;
openCallbackSpec->ParentWindow = parentWindow;
openCallbackSpec->LoadFileInfo(dirPrefix, fileName);
result = folderManager->OpenFolderFile(path, &folder, openCallback);
if (openCallbackSpec->PasswordWasAsked)
encrypted = true;
if (result == S_OK)
{
*module = library.Detach();
*resultFolder = folder.Detach();
return S_OK;
}
continue;
/*
if (result != S_FALSE)
return result;
*/
}
return S_FALSE;
}
|