fix clang build
[far2l.git] / multiarc / src / ArcPlg.cpp
blob4575dcd6400668b7b0197f6729a463ceb0c72e22
1 #include "MultiArc.hpp"
2 #include "marclng.hpp"
4 extern std::string gMultiArcPluginPath;
6 void ArcPlugins::AddPluginItem(PLUGINISARCHIVE pIsArchive, PLUGINOPENARCHIVE pOpenArchive,
7 PLUGINGETARCITEM pGetArcItem, PLUGINLOADFORMATMODULE pLoadFormatModule,
8 PLUGINCLOSEARCHIVE pCloseArchive, PLUGINGETFORMATNAME pGetFormatName,
9 PLUGINGETDEFAULTCOMMANDS pGetDefaultCommands, PLUGINSETFARINFO pSetFarInfo,
10 PLUGINGETSFXPOS pGetSFXPos)
12 PluginsData.emplace_back();
13 PluginItem &item = PluginsData.back();
15 item.pIsArchive = pIsArchive;
16 item.pOpenArchive = pOpenArchive;
17 item.pGetArcItem = pGetArcItem;
18 item.pLoadFormatModule = pLoadFormatModule;
19 item.pCloseArchive = pCloseArchive;
20 item.pGetFormatName = pGetFormatName;
21 item.pGetDefaultCommands = pGetDefaultCommands;
22 item.pSetFarInfo = pSetFarInfo;
23 item.pGetSFXPos = pGetSFXPos;
25 if (pLoadFormatModule)
26 pLoadFormatModule(gMultiArcPluginPath.c_str());
28 if (pSetFarInfo) {
29 // Дабы FMT не испортил оригинальный PluginStartupInfo дадим ему
30 // временную "переменную"
31 memcpy(&item.Info, &Info, sizeof(struct PluginStartupInfo));
32 memcpy(&item.FSF, &FSF, sizeof(struct FarStandardFunctions));
33 item.Info.FSF = &item.FSF;
34 pSetFarInfo(&item.Info);
38 #include "formats/all.h" //use enum_all.sh to update it
40 ArcPlugins::ArcPlugins(const char *ModuleName)
42 // AddPluginItem(_IsArchive, _OpenArchive, _GetArcItem, _LoadFormatModule,
43 // _CloseArchive, _GetFormatName, _GetDefaultCommands, _SetFarInfo, _GetSFXPos);
45 // following initialization defines order in which IsArchive invoked, so most-likely formats should be first
47 #ifndef HAVE_LIBARCHIVE
48 AddPluginItem(TARGZ_IsArchive, TARGZ_OpenArchive, TARGZ_GetArcItem, NULL, TARGZ_CloseArchive,
49 TARGZ_GetFormatName, TARGZ_GetDefaultCommands, TARGZ_SetFarInfo, TARGZ_GetSFXPos);
50 #endif
51 #ifdef HAVE_UNRAR
52 AddPluginItem(RAR_IsArchive, RAR_OpenArchive, RAR_GetArcItem, NULL, RAR_CloseArchive, RAR_GetFormatName,
53 RAR_GetDefaultCommands, RAR_SetFarInfo, RAR_GetSFXPos);
54 #endif
56 AddPluginItem(ZIP_IsArchive, ZIP_OpenArchive, ZIP_GetArcItem, NULL, ZIP_CloseArchive, ZIP_GetFormatName,
57 ZIP_GetDefaultCommands, NULL, ZIP_GetSFXPos);
59 #ifndef ENDIAN_IS_BIG // these not yet adaptated to big endian build
60 AddPluginItem(SEVENZ_IsArchive, SEVENZ_OpenArchive, SEVENZ_GetArcItem, NULL, SEVENZ_CloseArchive,
61 SEVENZ_GetFormatName, SEVENZ_GetDefaultCommands, NULL, NULL);
63 AddPluginItem(ACE_IsArchive, ACE_OpenArchive, ACE_GetArcItem, NULL, ACE_CloseArchive, ACE_GetFormatName,
64 ACE_GetDefaultCommands, NULL, ACE_GetSFXPos);
66 AddPluginItem(ARC_IsArchive, ARC_OpenArchive, ARC_GetArcItem, NULL, ARC_CloseArchive, ARC_GetFormatName,
67 ARC_GetDefaultCommands, NULL, ARC_GetSFXPos);
69 AddPluginItem(ARJ_IsArchive, ARJ_OpenArchive, ARJ_GetArcItem, NULL, ARJ_CloseArchive, ARJ_GetFormatName,
70 ARJ_GetDefaultCommands, NULL, ARJ_GetSFXPos);
72 #ifndef HAVE_LIBARCHIVE
73 AddPluginItem(CAB_IsArchive, CAB_OpenArchive, CAB_GetArcItem, NULL, CAB_CloseArchive, CAB_GetFormatName,
74 CAB_GetDefaultCommands, NULL, CAB_GetSFXPos);
75 #endif
77 AddPluginItem(HA_IsArchive, HA_OpenArchive, HA_GetArcItem, NULL, HA_CloseArchive, HA_GetFormatName,
78 HA_GetDefaultCommands, HA_SetFarInfo, NULL);
80 AddPluginItem(LZH_IsArchive, LZH_OpenArchive, LZH_GetArcItem, NULL, LZH_CloseArchive, LZH_GetFormatName,
81 LZH_GetDefaultCommands, LZH_SetFarInfo, LZH_GetSFXPos);
82 #endif
84 //#ifdef HAVE_PCRE
85 AddPluginItem(CUSTOM_IsArchive, CUSTOM_OpenArchive, CUSTOM_GetArcItem, CUSTOM_LoadFormatModule,
86 CUSTOM_CloseArchive, CUSTOM_GetFormatName, CUSTOM_GetDefaultCommands, CUSTOM_SetFarInfo,
87 CUSTOM_GetSFXPos);
88 //#endif
90 #ifdef HAVE_LIBARCHIVE
91 // must be last cuz recognizes essentially most of above formats, but not handles them full-featurable
92 AddPluginItem(LIBARCH_IsArchive, LIBARCH_OpenArchive, LIBARCH_GetArcItem, NULL, LIBARCH_CloseArchive,
93 LIBARCH_GetFormatName, LIBARCH_GetDefaultCommands, NULL, NULL);
94 #endif
97 ArcPlugins::~ArcPlugins() {}
99 int ArcPlugins::IsArchive(const char *Name, const unsigned char *Data, int DataSize)
101 DWORD MinSFXSize = 0xffffffff;
102 int MinSFXSizeI = -1;
104 for (size_t I = 0; I < PluginsData.size(); I++) {
105 DWORD CurSFXSize = 0;
106 if (IsArchive(I, Name, Data, DataSize, &CurSFXSize)) {
107 if (MinSFXSize > CurSFXSize || MinSFXSizeI == -1) {
108 MinSFXSize = CurSFXSize;
109 MinSFXSizeI = I;
110 if (CurSFXSize == 0)
111 break;
115 return MinSFXSizeI;
118 BOOL ArcPlugins::IsArchive(int ArcPluginNumber, const char *Name, const unsigned char *Data, int DataSize,
119 DWORD *SFXSize)
121 struct PluginItem &CurPluginsData = PluginsData[ArcPluginNumber];
122 if (CurPluginsData.pIsArchive && CurPluginsData.pIsArchive(Name, Data, DataSize)) {
123 if (CurPluginsData.pGetSFXPos)
124 *SFXSize = CurPluginsData.pGetSFXPos();
125 else
126 *SFXSize = 0;
127 return TRUE;
129 return FALSE;
132 BOOL ArcPlugins::OpenArchive(int PluginNumber, const char *Name, int *Type, bool Silent)
134 *Type = 0; //$ AA 12.11.2001
135 if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pOpenArchive)
136 return PluginsData[PluginNumber].pOpenArchive(Name, Type, Silent);
137 return FALSE;
140 int ArcPlugins::GetArcItem(int PluginNumber, struct ArcItemInfo *Info)
142 if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pGetArcItem)
143 return PluginsData[PluginNumber].pGetArcItem(Info);
144 return FALSE;
147 void ArcPlugins::CloseArchive(int PluginNumber, struct ArcInfo *Info)
149 if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pCloseArchive)
150 PluginsData[PluginNumber].pCloseArchive(Info);
153 BOOL ArcPlugins::GetFormatName(int PluginNumber, int Type, char *FormatName, char *DefaultExt)
155 *FormatName = 0;
156 if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pGetFormatName)
157 return PluginsData[PluginNumber].pGetFormatName(Type, FormatName, DefaultExt);
158 return FALSE;
161 BOOL ArcPlugins::GetDefaultCommands(int PluginNumber, int Type, int Command, char *Dest)
163 *Dest = 0;
164 if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pGetDefaultCommands)
165 return PluginsData[PluginNumber].pGetDefaultCommands(Type, Command, Dest);
166 return FALSE;