1 #include "MultiArc.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());
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
);
52 AddPluginItem(RAR_IsArchive
, RAR_OpenArchive
, RAR_GetArcItem
, NULL
, RAR_CloseArchive
, RAR_GetFormatName
,
53 RAR_GetDefaultCommands
, RAR_SetFarInfo
, RAR_GetSFXPos
);
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
);
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
);
85 AddPluginItem(CUSTOM_IsArchive
, CUSTOM_OpenArchive
, CUSTOM_GetArcItem
, CUSTOM_LoadFormatModule
,
86 CUSTOM_CloseArchive
, CUSTOM_GetFormatName
, CUSTOM_GetDefaultCommands
, CUSTOM_SetFarInfo
,
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
);
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
;
118 BOOL
ArcPlugins::IsArchive(int ArcPluginNumber
, const char *Name
, const unsigned char *Data
, int DataSize
,
121 struct PluginItem
&CurPluginsData
= PluginsData
[ArcPluginNumber
];
122 if (CurPluginsData
.pIsArchive
&& CurPluginsData
.pIsArchive(Name
, Data
, DataSize
)) {
123 if (CurPluginsData
.pGetSFXPos
)
124 *SFXSize
= CurPluginsData
.pGetSFXPos();
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
);
140 int ArcPlugins::GetArcItem(int PluginNumber
, struct ArcItemInfo
*Info
)
142 if ((DWORD
)PluginNumber
< PluginsData
.size() && PluginsData
[PluginNumber
].pGetArcItem
)
143 return PluginsData
[PluginNumber
].pGetArcItem(Info
);
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
)
156 if ((DWORD
)PluginNumber
< PluginsData
.size() && PluginsData
[PluginNumber
].pGetFormatName
)
157 return PluginsData
[PluginNumber
].pGetFormatName(Type
, FormatName
, DefaultExt
);
161 BOOL
ArcPlugins::GetDefaultCommands(int PluginNumber
, int Type
, int Command
, char *Dest
)
164 if ((DWORD
)PluginNumber
< PluginsData
.size() && PluginsData
[PluginNumber
].pGetDefaultCommands
)
165 return PluginsData
[PluginNumber
].pGetDefaultCommands(Type
, Command
, Dest
);