1 #include "MultiArc.hpp"
8 class TRecur
//$ 07.04.2002 AA
13 ~TRecur() { Count
--; }
15 int TRecur::Count
= 0;
17 inline void CreateDirectory(char *FullPath
) //$ 16.05.2002 AA
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
))
30 char *SaveDir
= sdc_getcwd(SaveDirBuf
, sizeof(SaveDirBuf
));
31 char Command
[MA_MAX_SIZE_COMMAND_NAME
], AllFilesMask
[MA_MAX_SIZE_COMMAND_NAME
];
33 return /*0*/ 1; //$ 07.02.2002 AA чтобы многотомные CABы нормально распаковывались
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;
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
;
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
));
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 значит выбрано несколько архивов
90 for (int I=0;DestPath[I]!=0;I++)
99 for (char *ChPtr=DestPath;*ChPtr!=0;ChPtr++)
103 CreateDirectory(DestPath,NULL);
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
;
120 /*if(OpMode & OPM_TOPLEVEL) // $ 16.02.2002 AA
122 //?? есть разница между извлечением выделенных файлов тома и
123 //извлечением из выделенных томов. здесь можно ее учесть.
124 //как минимум - нужно изменить надпись в мессаджбоксе
130 FSF
.TruncPathStr(strncpy(NameMsg
, FSF
.PointToName(ArcName
), sizeof(NameMsg
) - 1),
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);
140 ZeroFill(MaskPanelItem
);
141 ArrayCpyZ(MaskPanelItem
.FindData
.cFileName
, AllFilesMask
);
142 if (ItemsInfo
.Encrypted
)
143 MaskPanelItem
.Flags
= F_ENCRYPTED
;
144 PanelItem
= &MaskPanelItem
;
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
)))
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
)
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
))
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
;