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