Merge pull request #2436 from m32/master
[far2l.git] / multiarc / src / MultiArc.hpp
blobb85a0823a996fbf4a938651d3916033ae1189770
1 #ifndef __MULTIARC_HPP__
2 #define __MULTIARC_HPP__
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <sys/stat.h>
7 #include <windows.h>
8 #include <sudo.h>
9 #include <string>
10 #include <vector>
11 #include <utils.h>
12 #include <KeyFileHelper.h>
13 #include <PathParts.h>
14 #include <farplug-mb.h>
15 using namespace oldfar;
16 #include "fmt.hpp"
18 #define INI_LOCATION (InMyConfig("plugins/multiarc/config.ini"))
19 #define INI_SECTION ("Settings")
21 #define OLD_DIALOG_STYLE 1
22 #define _ARC_UNDER_CURSOR_
23 #define _GROUP_NAME_
25 #ifndef LIGHTGRAY
26 #define LIGHTGRAY 7
27 #endif
29 #define RETEXEC_ARCNOTFOUND 0x40000
31 #define F_ENCRYPTED 1
33 // #define MAX_COMMAND_LENGTH 32768
34 #define MA_MAX_SIZE_COMMAND_NAME 512
36 #define SUPER_PUPER_ZERO (0)
38 #define USER_DATA_MAGIC 0xfeedf00d
40 enum
42 CMD_EXTRACT = 0,
43 CMD_EXTRACTWITHOUTPATH,
44 CMD_TEST,
45 CMD_DELETE,
46 CMD_COMMENT,
47 CMD_COMMENTFILES,
48 CMD_SFX,
49 CMD_LOCK,
50 CMD_PROTECT,
51 CMD_RECOVER,
52 CMD_ADD,
53 CMD_MOVE,
54 CMD_ADDRECURSE,
55 CMD_MOVERECURSE,
56 CMD_ALLFILESMASK,
57 CMD_DEFEXT
60 typedef DWORD(WINAPI *PLUGINLOADFORMATMODULE)(const char *ModuleName);
61 typedef BOOL(WINAPI *PLUGINISARCHIVE)(const char *Name, const unsigned char *Data, int DataSize);
62 typedef BOOL(WINAPI *PLUGINOPENARCHIVE)(const char *Name, int *Type, bool Silent);
63 typedef int(WINAPI *PLUGINGETARCITEM)(struct ArcItemInfo *Info);
64 typedef BOOL(WINAPI *PLUGINCLOSEARCHIVE)(struct ArcInfo *Info);
65 typedef BOOL(WINAPI *PLUGINGETFORMATNAME)(int Type, std::string &FormatName, std::string &DefaultExt);
66 typedef BOOL(WINAPI *PLUGINGETDEFAULTCOMMANDS)(int Type, int Command, std::string &Dest);
67 typedef void(WINAPI *PLUGINSETFARINFO)(const struct PluginStartupInfo *plg);
68 typedef DWORD(WINAPI *PLUGINGETSFXPOS)(void);
70 struct PluginItem
72 DWORD Flags;
73 struct PluginStartupInfo Info;
74 struct FarStandardFunctions FSF;
76 PLUGINLOADFORMATMODULE pLoadFormatModule;
77 PLUGINISARCHIVE pIsArchive;
78 PLUGINOPENARCHIVE pOpenArchive;
79 PLUGINGETARCITEM pGetArcItem;
80 PLUGINCLOSEARCHIVE pCloseArchive;
81 PLUGINGETFORMATNAME pGetFormatName;
82 PLUGINGETDEFAULTCOMMANDS pGetDefaultCommands;
83 PLUGINSETFARINFO pSetFarInfo;
84 PLUGINGETSFXPOS pGetSFXPos;
87 typedef PathNode<ArcItemAttributes> ArcItemNode;
89 class ArcPlugins
91 private:
92 std::vector<PluginItem> PluginsData;
94 void
95 AddPluginItem(PLUGINISARCHIVE pIsArchive, PLUGINOPENARCHIVE pOpenArchive, PLUGINGETARCITEM pGetArcItem,
96 PLUGINLOADFORMATMODULE pLoadFormatModule = NULL, PLUGINCLOSEARCHIVE pCloseArchive = NULL,
97 PLUGINGETFORMATNAME pGetFormatName = NULL, PLUGINGETDEFAULTCOMMANDS pGetDefaultCommands = NULL,
98 PLUGINSETFARINFO pSetFarInfo = NULL, PLUGINGETSFXPOS pGetSFXPos = NULL);
100 public:
101 ArcPlugins(const char *ModuleName);
102 ~ArcPlugins();
104 public:
105 int IsArchive(const char *Name, const unsigned char *Data, int DataSize);
106 BOOL
107 IsArchive(int ArcPluginNumber, const char *Name, const unsigned char *Data, int DataSize, DWORD *SFXSize);
108 BOOL OpenArchive(int PluginNumber, const char *Name, int *Type, bool Silent);
109 int GetArcItem(int PluginNumber, struct ArcItemInfo *Info);
110 void CloseArchive(int PluginNumber, struct ArcInfo *Info);
111 BOOL GetFormatName(int PluginNumber, int Type, std::string &FormatName, std::string &DefaultExt);
112 BOOL GetDefaultCommands(int PluginNumber, int Type, int Command, std::string &Dest);
113 int FmtCount() { return (int)PluginsData.size(); }
114 static int WINAPI LoadFmtModules(const WIN32_FIND_DATA *FData, const char *FullName, ArcPlugins *plugins);
115 static int __cdecl CompareFmtModules(const void *elem1, const void *elem2);
118 class PluginClass
120 private:
121 std::string ArcName;
122 char CurDir[NM];
123 ArcItemNode ArcData;
124 size_t ArcDataCount = 0;
125 struct stat ArcStat {};
126 int ArcPluginNumber;
127 int ArcPluginType;
128 int LastTestState, LastWithoutPathsState;
129 struct ArcItemInfo ItemsInfo;
130 struct ArcInfo CurArcInfo;
131 int64_t TotalSize;
132 int64_t PackedSize;
133 int DizPresent;
135 std::string farlang;
137 bool bGOPIFirstCall;
138 std::string PanelTitle;
139 std::string FormatName;
140 std::string DefExt;
141 struct InfoPanelLine InfoLines[15];
142 struct KeyBarTitles KeyBar;
143 std::string Format;
144 char *DescrFiles[32];
145 char DescrFilesString[256];
147 private:
148 void SetInfoLineSZ(size_t Index, int TextID, const char *Data);
149 void SetInfoLine(size_t Index, int TextID, const std::string &Data);
150 void SetInfoLine(size_t Index, int TextID, int DataID);
152 std::string GetGroupName(PluginPanelItem *Items, int Count); //$ AA 29.11.2001
153 BOOL GetCursorName(std::string &ArcName, std::string &ArcFormat, std::string &ArcExt, PanelInfo *pi); //$ AA 29.11.2001
154 BOOL GetFormatName(std::string &FormatName, std::string &DefExt); //$ AA 25.11.2001
155 BOOL GetFormatName(std::string &FormatName);
156 std::string GetCommandFormat(int Command);
157 void FreeArcData();
158 bool FarLangChanged();
159 bool EnsureFindDataUpToDate(int OpMode);
160 int ReadArchive(const char *Name, int OpMode);
162 public:
163 PluginClass(int ArcPluginNumber);
164 ~PluginClass();
166 public:
167 int PreReadArchive(const char *Name);
168 int GetFindData(PluginPanelItem **pPanelItem, int *pItemsNumber, int OpMode);
169 void FreeFindData(PluginPanelItem *PanelItem, int ItemsNumber);
170 int SetDirectory(const char *Dir, int OpMode);
171 void GetOpenPluginInfo(struct OpenPluginInfo *Info);
172 int DeleteFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int OpMode);
173 int ProcessHostFile(struct PluginPanelItem *PanelItem, int ItemsNumber, int OpMode);
174 int GetFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int Move, char *DestPath, int OpMode);
175 int PutFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int Move, int OpMode);
176 int ProcessKey(int Key, unsigned int ControlState);
177 static bool SelectFormat(std::string &ArcFormat, int AddOnly = FALSE);
178 static bool FormatToPlugin(const std::string &Format, int &PluginNumber, int &PluginType);
179 static LONG_PTR WINAPI PutDlgProc(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2);
182 class ArcCommand
184 private:
185 bool NeedSudo;
186 struct PluginPanelItem *PanelItem;
187 int ItemsNumber;
188 std::string ArcName;
189 std::string ArcDir;
190 std::string RealArcDir;
191 std::string Password;
192 std::string AllFilesMask;
193 std::string TempPath;
194 std::string NextFileName;
195 int NameNumber;
196 int PrevFileNameNumber;
197 std::string PrefixFileName;
198 std::string ListFileName;
199 unsigned int ExecCode;
200 unsigned int MaxAllowedExitCode;
201 int Silent; // $ 07.02.2002 AA
202 int DefaultCodepage;
204 std::string CommentFileName; //$ AA 25.11.2001
206 private:
207 bool ProcessCommand(std::string FormatString, int CommandType, int IgnoreErrors, const char *pcListFileName = nullptr);
208 void DeleteBraces(std::string &Command);
209 int ReplaceVar(std::string &Command);
210 int MakeListFile(int QuoteName, int UseSlash, int FolderName, int NameOnly, int PathOnly, int FolderMask, const char *LocalAllFilesMask);
212 public:
213 ArcCommand(struct PluginPanelItem *PanelItem, int ItemsNumber, const std::string &FormatString,
214 const std::string &ArcName, const std::string &ArcDir, const std::string &Password, const std::string &AllFilesMask,
215 int IgnoreErrors, int CommandType, int Silent, const char *RealArcDir, int DefaultCodepage);
216 ~ArcCommand(); //$ AA 25.11.2001
218 public:
219 int GetExecCode() { return (ExecCode); };
222 struct InitDialogItem
224 unsigned char Type;
225 unsigned char X1, Y1, X2, Y2;
226 unsigned char Focus;
227 DWORD_PTR Selected;
228 unsigned int Flags;
229 unsigned char DefaultButton;
230 const char *Data;
233 /* $ 13.09.2000 tran
234 разное для ожидания процесса, чтобы убить лист-файл */
235 struct KillStruct
237 char ListFileName[260];
238 HANDLE hProcess;
239 HANDLE hThread;
241 /* tran 13.09.2000 $ */
243 struct MAAdvFlags
245 unsigned ExactArcName : 1;
246 unsigned AutoResetExactArcName : 1;
247 unsigned GroupName : 1;
248 unsigned ArcUnderCursor : 1;
249 unsigned MenuWrapMode : 2;
250 unsigned PutDialogStyle : 1;
251 unsigned : 25;
253 operator int32_t() { return *((int32_t *)this); }
254 MAAdvFlags &operator=(int32_t Flags)
256 *((int32_t *)this) = Flags;
257 return *this;
261 struct Options
263 int HideOutput;
264 int ProcessShiftF1;
265 std::string DescriptionNames;
266 int ReadDescriptions;
267 int UpdateDescriptions;
268 /* $ 13.09.2000 tran
269 запуск процесса в фоне */
270 int UserBackground;
271 int Background;
272 int PriorityClass;
273 /* tran 13.09.2000 $ */
274 int OldUserBackground; // $ 02.07.2002 AY
275 int UseLastHistory; // $ 18.05.2001 SVS
276 int AllowChangeDir; // $ 05.08.2001 SVS
277 // int DeleteExtFile; // $ 12.07.2001 SVS
278 // int AddExtArchive; // $ 16.07.2001 SVS
279 // BOOL AutoResetExactArcName; // $ 2?.11.2001 AA
280 // BOOL ExactArcName; // $ 30.11.2001 AA
281 MAAdvFlags AdvFlags; //$ 06.03.2002 AA
282 char CommandPrefix1[50]; //$ 23.01.2003 AY
286 Global Data
288 extern struct FarStandardFunctions FSF;
289 extern struct Options Opt;
290 extern struct PluginStartupInfo Info;
291 extern class ArcPlugins *ArcPlugin;
292 extern const char *CmdNames[];
294 extern DWORD PriorityProcessCode[];
297 Functions
300 std::string MakeFullName(const char *name);
302 bool ConfigGeneral();
303 bool ConfigCommands(const std::string &ArcFormat, int IDFocus = 2, bool FastAccess = false, int PluginNumber = 0, int PluginType = 0);
305 const char *GetMsg(int MsgId);
306 int Execute(HANDLE hPlugin, const std::string &CmdStr,
307 int HideOutput, int Silent, int NeedSudo, int ShowTitle, const char *ListFileName = 0);
308 size_t FindExt(const std::string &Name);
309 bool AddExt(std::string &Name, const std::string &Ext); //$ AA 28.11.2001
310 bool DelExt(std::string &Name, const std::string &Ext);
311 std::string FormatMessagePath(const char *path, bool extract_name, int truncate = 0);
312 std::string GetDialogControlText(HANDLE hDlg, int id);
313 void SetDialogControlText(HANDLE hDlg, int id, const char *str);
314 void SetDialogControlText(HANDLE hDlg, int id, const std::string &str);
315 // void StartThreadForKillListFile(PROCESS_INFORMATION *pi,char *list);
316 char *QuoteText(char *Str);
317 void InitDialogItems(const struct InitDialogItem *Init, struct FarDialogItem *Item, int ItemsNumber);
318 std::string NumberWithCommas(unsigned long long Number);
319 int MA_ToPercent(long N1, long N2);
320 int MA_ToPercent(int64_t N1, int64_t N2);
321 int IsCaseMixed(const char *Str);
322 int CheckForEsc();
323 int LocalStrnicmp(const char *Str1, const char *Str2, int Length);
324 int __isspace(int Chr);
325 int FindExecuteFile(char *OriginalName, char *DestName, int SizeDest);
326 char *GetCommaWord(char *Src, char *Word, char Separator);
327 BOOL GoToFile(const char *Target, BOOL AllowChangeDir);
328 BOOL FileExists(const char *Name);
329 int GetScrX(void);
330 void NormalizePath(const char *SrcName, char *DestName);
331 std::string &ExpandEnv(std::string &str);
332 std::string &NormalizePath(std::string &path);
334 int WINAPI GetPassword(std::string &Password, const char *FileName);
335 void WINAPI UnixTimeToFileTime(DWORD UnixTime, FILETIME *FileTime);
337 #ifdef __GNUC__
338 #define I64(x) x##ll
339 #else
340 #define I64(x) x##i64
341 #endif
343 #endif // __MULTIARC_HPP__