fix clang build
[far2l.git] / multiarc / src / arcget.cpp
blob070b5433e51441adacead7c35501f26ea94b43d3
1 #include "MultiArc.hpp"
2 #include "marclng.hpp"
3 #include <farkeys.h>
4 #include <utils.h>
5 #include <EnsureDir.h>
6 #include <errno.h>
8 class TRecur //$ 07.04.2002 AA
10 public:
11 static int Count;
12 TRecur() { Count++; }
13 ~TRecur() { Count--; }
15 int TRecur::Count = 0;
17 inline void CreateDirectory(char *FullPath) //$ 16.05.2002 AA
19 EnsureDir(FullPath);
22 int PluginClass::GetFiles(PluginPanelItem *PanelItem, int ItemsNumber, int Move, char *DestPath, int OpMode)
24 // костыль против зацикливания в FAR'е при Quick View архивов с паролем
25 TRecur Recur; //$ 07.04.2002 AA
26 if (Recur.Count > 1 && OpMode & (OPM_VIEW | OPM_QUICKVIEW))
27 return 0;
29 char SaveDirBuf[NM];
30 char *SaveDir = sdc_getcwd(SaveDirBuf, sizeof(SaveDirBuf));
31 char Command[MA_MAX_SIZE_COMMAND_NAME], AllFilesMask[MA_MAX_SIZE_COMMAND_NAME];
32 if (ItemsNumber == 0)
33 return /*0*/ 1; //$ 07.02.2002 AA чтобы многотомные CABы нормально распаковывались
34 if (*DestPath)
35 FSF.AddEndSlash(DestPath);
36 const char *PathHistoryName = "ExtrDestPath";
37 InitDialogItem InitItems[] = {
38 /* 0 */ {DI_DOUBLEBOX, 3, 1, 72, 13, 0, 0, 0, 0, (char *)MExtractTitle},
39 /* 1 */ {DI_TEXT, 5, 2, 0, 0, 0, 0, 0, 0, (char *)MExtractTo},
40 /* 2 */ {DI_EDIT, 5, 3, 70, 3, 1, (DWORD_PTR)PathHistoryName, DIF_HISTORY, 0, DestPath},
41 /* 3 */ {DI_TEXT, 3, 4, 0, 0, 0, 0, DIF_BOXCOLOR | DIF_SEPARATOR, 0, ""},
42 /* 4 */ {DI_TEXT, 5, 5, 0, 0, 0, 0, 0, 0, (char *)MExtrPassword},
43 /* 5 */ {DI_PSWEDIT, 5, 6, 35, 5, 0, 0, 0, 0, ""},
44 /* 6 */ {DI_TEXT, 3, 7, 0, 0, 0, 0, DIF_BOXCOLOR | DIF_SEPARATOR, 0, ""},
45 /* 7 */ {DI_CHECKBOX, 5, 8, 0, 0, 0, 0, 0, 0, (char *)MExtrWithoutPaths},
46 /* 8 */ {DI_CHECKBOX, 5, 9, 0, 0, 0, 0, 0, 0, (char *)MBackground},
47 /* 9 */ {DI_CHECKBOX, 5, 10, 0, 0, 0, 0, 0, 0, (char *)MExtrDel},
48 /*10 */ {DI_TEXT, 3, 11, 0, 11, 0, 0, DIF_BOXCOLOR | DIF_SEPARATOR, 0, ""},
49 /*11 */ {DI_BUTTON, 0, 12, 0, 0, 0, 0, DIF_CENTERGROUP, 1, (char *)MExtrExtract},
50 /*12 */ {DI_BUTTON, 0, 12, 0, 0, 0, 0, DIF_CENTERGROUP, 0, (char *)MExtrCancel},
53 FarDialogItem DialogItems[ARRAYSIZE(InitItems)];
54 InitDialogItems(InitItems, DialogItems, ARRAYSIZE(InitItems));
56 int AskVolume = (OpMode & (OPM_FIND | OPM_VIEW | OPM_EDIT)) == 0 && CurArcInfo.Volume && *CurDir == 0;
58 if (!AskVolume) {
59 DialogItems[7].Selected = TRUE;
60 for (int I = 0; I < ItemsNumber; I++)
61 if (PanelItem[I].FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
62 DialogItems[7].Selected = FALSE;
63 break;
67 Opt.UserBackground = 0; // $ 14.02.2001 raVen //сброс галки "фоновая архивация"
68 if ((OpMode & ~OPM_SILENT) & ~OPM_TOPLEVEL)
69 Opt.OldUserBackground = 0; // $ 03.07.02 AY: если OPM_SILENT но не из за Shift-F2 при несколько выбраных архивах
70 DialogItems[8].Selected = Opt.UserBackground;
71 DialogItems[9].Selected = Move;
73 if ((OpMode & OPM_SILENT) == 0) {
74 int AskCode = Info.Dialog(Info.ModuleNumber, -1, -1, 76, 15, "ExtrFromArc", DialogItems,
75 ARRAYSIZE(DialogItems));
76 if (AskCode != 11)
77 return -1;
78 strcpy(DestPath, DialogItems[2].Data);
79 FSF.Unquote(DestPath);
80 Opt.UserBackground = DialogItems[8].Selected;
81 Opt.OldUserBackground = Opt.UserBackground; // $ 02.07.2002 AY: запомним и не будем нигде сбрасывать
82 // SetRegKey(HKEY_CURRENT_USER,"","Background",Opt.UserBackground); // $ 06.02.2002 AA
85 LastWithoutPathsState = DialogItems[7].Selected;
87 Opt.Background = OpMode & OPM_SILENT ? Opt.OldUserBackground : Opt.UserBackground; // $ 02.07.2002 AY: Если OPM_SILENT значит выбрано несколько архивов
89 /*int SpaceOnly=TRUE;
90 for (int I=0;DestPath[I]!=0;I++)
91 if (DestPath[I]!=' ')
93 SpaceOnly=FALSE;
94 break;
97 if (!SpaceOnly)
99 for (char *ChPtr=DestPath;*ChPtr!=0;ChPtr++)
100 if (*ChPtr=='/')
102 *ChPtr=0;
103 CreateDirectory(DestPath,NULL);
104 *ChPtr='/';
106 CreateDirectory(DestPath,NULL);
108 CreateDirectory(DestPath); //$ 16.05.2002 AA
110 if (*DestPath && DestPath[strlen(DestPath) - 1] != ':')
111 FSF.AddEndSlash(DestPath);
112 GetCommandFormat(CMD_ALLFILESMASK, AllFilesMask, sizeof(AllFilesMask));
114 PluginPanelItem MaskPanelItem;
116 if (AskVolume) {
117 char VolMsg[300];
118 int MsgCode;
120 /*if(OpMode & OPM_TOPLEVEL) // $ 16.02.2002 AA
122 //?? есть разница между извлечением выделенных файлов тома и
123 //извлечением из выделенных томов. здесь можно ее учесть.
124 //как минимум - нужно изменить надпись в мессаджбоксе
125 MsgCode=1;
127 else */
129 char NameMsg[NM];
130 FSF.TruncPathStr(strncpy(NameMsg, FSF.PointToName(ArcName), sizeof(NameMsg) - 1),
131 MAX_WIDTH_MESSAGE);
132 FSF.sprintf(VolMsg, GetMsg(MExtrVolume), FSF.PointToName(NameMsg));
133 const char *MsgItems[] = {GetMsg(MExtractTitle), VolMsg, GetMsg(MExtrVolumeAsk1),
134 GetMsg(MExtrVolumeAsk2), GetMsg(MExtrVolumeSelFiles), GetMsg(MExtrAllVolumes)};
135 MsgCode = Info.Message(Info.ModuleNumber, 0, NULL, MsgItems, ARRAYSIZE(MsgItems), 2);
137 if (MsgCode < 0)
138 return -1;
139 if (MsgCode == 1) {
140 ZeroFill(MaskPanelItem);
141 ArrayCpyZ(MaskPanelItem.FindData.cFileName, AllFilesMask);
142 if (ItemsInfo.Encrypted)
143 MaskPanelItem.Flags = F_ENCRYPTED;
144 PanelItem = &MaskPanelItem;
145 ItemsNumber = 1;
149 int CommandType = LastWithoutPathsState ? CMD_EXTRACTWITHOUTPATH : CMD_EXTRACT;
150 GetCommandFormat(CommandType, Command, sizeof(Command));
152 if (*DialogItems[5].Data == 0 && strstr(Command, "%%P") != NULL)
153 for (int I = 0; I < ItemsNumber; I++)
154 if ((PanelItem[I].Flags & F_ENCRYPTED)
155 || (ItemsInfo.Encrypted
156 && (PanelItem[I].FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))) {
157 if (OpMode & OPM_FIND || !GetPassword(DialogItems[5].Data, FSF.PointToName(ArcName)))
158 return -1;
159 break;
162 if (sdc_chdir(DestPath))
163 fprintf(stderr, "sdc_chdir('%s') - %u\n", DestPath, errno);
164 int SaveHideOut = Opt.HideOutput;
165 if (OpMode & OPM_FIND)
166 Opt.HideOutput = 2;
167 int IgnoreErrors = (CurArcInfo.Flags & AF_IGNOREERRORS);
169 ArcCommand ArcCmd(PanelItem, ItemsNumber, Command, ArcName, CurDir, DialogItems[5].Data, AllFilesMask,
170 IgnoreErrors, CommandType /*(OpMode & OPM_VIEW) != 0*/, (OpMode & OPM_FIND), CurDir, ItemsInfo.Codepage);
172 // последующие операции (тестирование и тд) не должны быть фоновыми
173 Opt.Background = 0; // $ 06.02.2002 AA
175 Opt.HideOutput = SaveHideOut;
176 if (!SaveDir || !*SaveDir) {
177 fprintf(stderr, "%s: SaveDir not saved\n", __FUNCTION__);
178 } else if (sdc_chdir(SaveDir) != 0) {
179 fprintf(stderr, "%s: sdc_chdir('%s') - %u\n", __FUNCTION__, SaveDir, errno);
182 if (!IgnoreErrors && ArcCmd.GetExecCode() != 0)
183 if (!(OpMode & OPM_VIEW))
184 return 0;
186 if (DialogItems[9].Selected)
187 DeleteFiles(PanelItem, ItemsNumber, TRUE);
189 if (Opt.UpdateDescriptions)
190 for (int I = 0; I < ItemsNumber; I++)
191 PanelItem[I].Flags|= PPIF_PROCESSDESCR;
193 return 1;