1 // Purely user interface function. Gets and returns user input.
uiAskReplace(wchar * Name,size_t MaxNameSize,int64 FileSize,RarTime * FileTime,uint Flags)2 UIASKREP_RESULT uiAskReplace(wchar *Name,size_t MaxNameSize,int64 FileSize,RarTime *FileTime,uint Flags)
3 {
4 wchar SizeText1[20],DateStr1[50],SizeText2[20],DateStr2[50];
5
6 FindData ExistingFD;
7 memset(&ExistingFD,0,sizeof(ExistingFD)); // In case find fails.
8 FindFile::FastFind(Name,&ExistingFD);
9 itoa(ExistingFD.Size,SizeText1);
10 ExistingFD.mtime.GetText(DateStr1,ASIZE(DateStr1),true,false);
11
12 itoa(FileSize,SizeText2);
13 FileTime->GetText(DateStr2,ASIZE(DateStr2),true,false);
14
15 eprintf(St(MAskReplace),Name,SizeText1,DateStr1,SizeText2,DateStr2);
16
17 bool AllowRename=(Flags & UIASKREP_F_NORENAME)==0;
18 int Choice=0;
19 do
20 {
21 Choice=Ask(St(AllowRename ? MYesNoAllRenQ : MYesNoAllQ));
22 } while (Choice==0); // 0 means invalid input.
23 switch(Choice)
24 {
25 case 1:
26 return UIASKREP_R_REPLACE;
27 case 2:
28 return UIASKREP_R_SKIP;
29 case 3:
30 return UIASKREP_R_REPLACEALL;
31 case 4:
32 return UIASKREP_R_SKIPALL;
33 }
34 if (AllowRename && Choice==5)
35 {
36 mprintf(St(MAskNewName));
37 if (getwstr(Name,MaxNameSize))
38 return UIASKREP_R_RENAME;
39 else
40 return UIASKREP_R_SKIP; // Process fwgets failure as if user answered 'No'.
41 }
42 return UIASKREP_R_CANCEL;
43 }
44
45
46
47
uiStartArchiveExtract(bool Extract,const wchar * ArcName)48 void uiStartArchiveExtract(bool Extract,const wchar *ArcName)
49 {
50 mprintf(St(Extract ? MExtracting : MExtrTest), ArcName);
51 }
52
53
uiStartFileExtract(const wchar * FileName,bool Extract,bool Test,bool Skip)54 bool uiStartFileExtract(const wchar *FileName,bool Extract,bool Test,bool Skip)
55 {
56 return true;
57 }
58
59
uiExtractProgress(int64 CurFileSize,int64 TotalFileSize,int64 CurSize,int64 TotalSize)60 void uiExtractProgress(int64 CurFileSize,int64 TotalFileSize,int64 CurSize,int64 TotalSize)
61 {
62 int CurPercent=ToPercent(CurSize,TotalSize);
63 mprintf(L"\b\b\b\b%3d%%",CurPercent);
64 }
65
66
uiProcessProgress(const char * Command,int64 CurSize,int64 TotalSize)67 void uiProcessProgress(const char *Command,int64 CurSize,int64 TotalSize)
68 {
69 int CurPercent=ToPercent(CurSize,TotalSize);
70 mprintf(L"\b\b\b\b%3d%%",CurPercent);
71 }
72
73
Msg()74 void uiMsgStore::Msg()
75 {
76 switch(Code)
77 {
78 case UIERROR_SYSERRMSG:
79 case UIERROR_GENERALERRMSG:
80 Log(NULL,L"\n%ls",Str[0]);
81 break;
82 case UIERROR_CHECKSUM:
83 Log(Str[0],St(MCRCFailed),Str[1]);
84 break;
85 case UIERROR_CHECKSUMENC:
86 Log(Str[0],St(MEncrBadCRC),Str[1]);
87 break;
88 case UIERROR_CHECKSUMPACKED:
89 Log(Str[0],St(MDataBadCRC),Str[1],Str[0]);
90 break;
91 case UIERROR_BADPSW:
92 Log(Str[0],St(MWrongPassword));
93 break;
94 case UIERROR_MEMORY:
95 Log(NULL,St(MErrOutMem));
96 break;
97 case UIERROR_FILEOPEN:
98 Log(Str[0],St(MCannotOpen),Str[1]);
99 break;
100 case UIERROR_FILECREATE:
101 Log(Str[0],St(MCannotCreate),Str[1]);
102 break;
103 case UIERROR_FILECLOSE:
104 Log(NULL,St(MErrFClose),Str[0]);
105 break;
106 case UIERROR_FILESEEK:
107 Log(NULL,St(MErrSeek),Str[0]);
108 break;
109 case UIERROR_FILEREAD:
110 Log(Str[0],St(MErrRead),Str[1]);
111 break;
112 case UIERROR_FILEWRITE:
113 Log(Str[0],St(MErrWrite),Str[1]);
114 break;
115 #ifndef SFX_MODULE
116 case UIERROR_FILEDELETE:
117 Log(Str[0],St(MCannotDelete),Str[1]);
118 break;
119 case UIERROR_FILERENAME:
120 Log(Str[0],St(MErrRename),Str[1],Str[2]);
121 break;
122 #endif
123 case UIERROR_FILEATTR:
124 Log(Str[0],St(MErrChangeAttr),Str[1]);
125 break;
126 case UIERROR_FILECOPY:
127 Log(Str[0],St(MCopyError),Str[1],Str[2]);
128 break;
129 case UIERROR_FILECOPYHINT:
130 Log(Str[0],St(MCopyErrorHint));
131 break;
132 case UIERROR_DIRCREATE:
133 Log(Str[0],St(MExtrErrMkDir),Str[1]);
134 break;
135 case UIERROR_SLINKCREATE:
136 Log(Str[0],St(MErrCreateLnkS),Str[1]);
137 break;
138 case UIERROR_HLINKCREATE:
139 Log(NULL,St(MErrCreateLnkH),Str[0]);
140 break;
141 case UIERROR_NEEDADMIN:
142 Log(NULL,St(MNeedAdmin));
143 break;
144 case UIERROR_ARCBROKEN:
145 Log(Str[0],St(MErrBrokenArc));
146 break;
147 case UIERROR_HEADERBROKEN:
148 Log(Str[0],St(MHeaderBroken));
149 break;
150 case UIERROR_MHEADERBROKEN:
151 Log(Str[0],St(MMainHeaderBroken));
152 break;
153 case UIERROR_FHEADERBROKEN:
154 Log(Str[0],St(MLogFileHead),Str[1]);
155 break;
156 case UIERROR_SUBHEADERBROKEN:
157 Log(Str[0],St(MSubHeadCorrupt));
158 break;
159 case UIERROR_SUBHEADERUNKNOWN:
160 Log(Str[0],St(MSubHeadUnknown));
161 break;
162 case UIERROR_SUBHEADERDATABROKEN:
163 Log(Str[0],St(MSubHeadDataCRC),Str[1]);
164 break;
165 case UIERROR_RRDAMAGED:
166 Log(Str[0],St(MRRDamaged));
167 break;
168 case UIERROR_UNKNOWNMETHOD:
169 Log(Str[0],St(MUnknownMeth),Str[1]);
170 break;
171 case UIERROR_UNKNOWNENCMETHOD:
172 Log(Str[0],St(MUnkEncMethod),Str[1]);
173 break;
174 #ifndef SFX_MODULE
175 case UIERROR_RENAMING:
176 Log(Str[0],St(MRenaming),Str[1],Str[2]);
177 break;
178 case UIERROR_NEWERRAR:
179 Log(Str[0],St(MNewerRAR));
180 break;
181 #endif
182 case UIERROR_RECVOLDIFFSETS:
183 Log(NULL,St(MRecVolDiffSets),Str[0],Str[1]);
184 break;
185 case UIERROR_RECVOLALLEXIST:
186 mprintf(St(MRecVolAllExist));
187 break;
188 case UIERROR_RECONSTRUCTING:
189 mprintf(St(MReconstructing));
190 break;
191 case UIERROR_RECVOLCANNOTFIX:
192 mprintf(St(MRecVolCannotFix));
193 break;
194 case UIERROR_UNEXPEOF:
195 Log(Str[0],St(MLogUnexpEOF));
196 break;
197 case UIERROR_BADARCHIVE:
198 Log(Str[0],St(MBadArc),Str[0]);
199 break;
200 case UIERROR_CMTBROKEN:
201 Log(Str[0],St(MLogCommBrk));
202 break;
203 case UIERROR_INVALIDNAME:
204 Log(Str[0],St(MInvalidName),Str[1]);
205 break;
206 #ifndef SFX_MODULE
207 case UIERROR_NEWRARFORMAT:
208 Log(Str[0],St(MNewRarFormat));
209 break;
210 #endif
211 case UIERROR_NOFILESTOEXTRACT:
212 mprintf(St(MExtrNoFiles));
213 break;
214 case UIERROR_MISSINGVOL:
215 Log(Str[0],St(MAbsNextVol),Str[0]);
216 break;
217 #ifndef SFX_MODULE
218 case UIERROR_NEEDPREVVOL:
219 Log(Str[0],St(MUnpCannotMerge),Str[1]);
220 break;
221 case UIERROR_UNKNOWNEXTRA:
222 Log(Str[0],St(MUnknownExtra),Str[1]);
223 break;
224 #endif
225 #if !defined(SFX_MODULE) && defined(_WIN_ALL)
226 case UIERROR_NTFSREQUIRED:
227 Log(NULL,St(MNTFSRequired),Str[0]);
228 break;
229 #endif
230 #if !defined(SFX_MODULE) && defined(_WIN_ALL)
231 case UIERROR_ACLBROKEN:
232 Log(Str[0],St(MACLBroken),Str[1]);
233 break;
234 case UIERROR_ACLUNKNOWN:
235 Log(Str[0],St(MACLUnknown),Str[1]);
236 break;
237 case UIERROR_ACLSET:
238 Log(Str[0],St(MACLSetError),Str[1]);
239 break;
240 case UIERROR_STREAMBROKEN:
241 Log(Str[0],St(MStreamBroken),Str[1]);
242 break;
243 case UIERROR_STREAMUNKNOWN:
244 Log(Str[0],St(MStreamUnknown),Str[1]);
245 break;
246 #endif
247 case UIERROR_INCOMPATSWITCH:
248 mprintf(St(MIncompatSwitch),Str[0],Num[0]);
249 break;
250 case UIERROR_PATHTOOLONG:
251 Log(NULL,L"\n%ls%ls%ls",Str[0],Str[1],Str[2]);
252 Log(NULL,St(MPathTooLong));
253 break;
254 #ifndef SFX_MODULE
255 case UIERROR_DIRSCAN:
256 Log(NULL,St(MScanError),Str[0]);
257 break;
258 #endif
259 case UIERROR_UOWNERBROKEN:
260 Log(Str[0],St(MOwnersBroken),Str[1]);
261 break;
262 case UIERROR_UOWNERGETOWNERID:
263 Log(Str[0],St(MErrGetOwnerID),Str[1]);
264 break;
265 case UIERROR_UOWNERGETGROUPID:
266 Log(Str[0],St(MErrGetGroupID),Str[1]);
267 break;
268 case UIERROR_UOWNERSET:
269 Log(Str[0],St(MSetOwnersError),Str[1]);
270 break;
271 case UIERROR_ULINKREAD:
272 Log(NULL,St(MErrLnkRead),Str[0]);
273 break;
274 case UIERROR_ULINKEXIST:
275 Log(NULL,St(MSymLinkExists),Str[0]);
276 break;
277
278
279 #ifndef SFX_MODULE
280 case UIMSG_STRING:
281 mprintf(L"\n%s",Str[0]);
282 break;
283 #endif
284 case UIMSG_CORRECTINGNAME:
285 Log(Str[0],St(MCorrectingName));
286 break;
287 case UIMSG_BADARCHIVE:
288 mprintf(St(MBadArc),Str[0]);
289 break;
290 case UIMSG_CREATING:
291 mprintf(St(MCreating),Str[0]);
292 break;
293 case UIMSG_RENAMING:
294 mprintf(St(MRenaming),Str[0],Str[1]);
295 break;
296 case UIMSG_RECVOLCALCCHECKSUM:
297 mprintf(St(MCalcCRCAllVol));
298 break;
299 case UIMSG_RECVOLFOUND:
300 mprintf(St(MRecVolFound),Num[0]);
301 break;
302 case UIMSG_RECVOLMISSING:
303 mprintf(St(MRecVolMissing),Num[0]);
304 break;
305 case UIMSG_MISSINGVOL:
306 mprintf(St(MAbsNextVol),Str[0]);
307 break;
308 case UIMSG_RECONSTRUCTING:
309 mprintf(St(MReconstructing));
310 break;
311 case UIMSG_CHECKSUM:
312 mprintf(St(MCRCFailed),Str[0]);
313 break;
314 case UIMSG_FAT32SIZE:
315 mprintf(St(MFAT32Size));
316 mprintf(L" "); // For progress percent.
317 break;
318
319
320
321 case UIEVENT_RRTESTINGSTART:
322 mprintf(L"%s ",St(MTestingRR));
323 break;
324 }
325 }
326
327
uiGetPassword(UIPASSWORD_TYPE Type,const wchar * FileName,SecPassword * Password)328 bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password)
329 {
330 return GetConsolePassword(Type,FileName,Password);
331 }
332
333
uiAlarm(UIALARM_TYPE Type)334 void uiAlarm(UIALARM_TYPE Type)
335 {
336 if (uiSoundEnabled)
337 {
338 static clock_t LastTime=clock();
339 if ((clock()-LastTime)/CLOCKS_PER_SEC>5)
340 {
341 #ifdef _WIN_ALL
342 MessageBeep(-1);
343 #else
344 putwchar('\007');
345 #endif
346 }
347 }
348 }
349
350
351
352
uiAskNextVolume(wchar * VolName,size_t MaxSize)353 bool uiAskNextVolume(wchar *VolName,size_t MaxSize)
354 {
355 eprintf(St(MAskNextVol),VolName);
356 return Ask(St(MContinueQuit))!=2;
357 }
358
359
uiAskRepeatRead(const wchar * FileName)360 bool uiAskRepeatRead(const wchar *FileName)
361 {
362 mprintf(L"\n");
363 Log(NULL,St(MErrRead),FileName);
364 return Ask(St(MRetryAbort))==1;
365 }
366
367
uiAskRepeatWrite(const wchar * FileName,bool DiskFull)368 bool uiAskRepeatWrite(const wchar *FileName,bool DiskFull)
369 {
370 mprintf(L"\n");
371 Log(NULL,St(DiskFull ? MNotEnoughDisk:MErrWrite),FileName);
372 return Ask(St(MRetryAbort))==1;
373 }
374
375
376 #ifndef SFX_MODULE
uiGetMonthName(int Month)377 const wchar *uiGetMonthName(int Month)
378 {
379 static MSGID MonthID[12]={
380 MMonthJan,MMonthFeb,MMonthMar,MMonthApr,MMonthMay,MMonthJun,
381 MMonthJul,MMonthAug,MMonthSep,MMonthOct,MMonthNov,MMonthDec
382 };
383 return St(MonthID[Month]);
384 }
385 #endif
386