1 // ExtractCallbackConsole.h
2 
3 #ifndef ZIP7_INC_EXTRACT_CALLBACK_CONSOLE_H
4 #define ZIP7_INC_EXTRACT_CALLBACK_CONSOLE_H
5 
6 #include "../../../Common/StdOutStream.h"
7 
8 #include "../../IPassword.h"
9 
10 #include "../../Archive/IArchive.h"
11 
12 #include "../Common/ArchiveExtractCallback.h"
13 
14 #include "PercentPrinter.h"
15 
16 #include "OpenCallbackConsole.h"
17 
18 /*
19 struct CErrorPathCodes2
20 {
21   FStringVector Paths;
22   CRecordVector<DWORD> Codes;
23 
24   void AddError(const FString &path, DWORD systemError)
25   {
26     Paths.Add(path);
27     Codes.Add(systemError);
28   }
29   void Clear()
30   {
31     Paths.Clear();
32     Codes.Clear();
33   }
34 };
35 */
36 
37 class CExtractScanConsole Z7_final: public IDirItemsCallback
38 {
39   Z7_IFACE_IMP(IDirItemsCallback)
40 
41   CStdOutStream *_so;
42   CStdOutStream *_se;
43   CPercentPrinter _percent;
44 
45   // CErrorPathCodes2 ScanErrors;
46 
NeedPercents() const47   bool NeedPercents() const { return _percent._so != NULL; }
48 
ClosePercentsAndFlush()49   void ClosePercentsAndFlush()
50   {
51     if (NeedPercents())
52       _percent.ClosePrint(true);
53     if (_so)
54       _so->Flush();
55   }
56 
57 public:
58 
Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)59   void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)
60   {
61     _so = outStream;
62     _se = errorStream;
63     _percent._so = percentStream;
64   }
65 
SetWindowWidth(unsigned width)66   void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
67 
68   void StartScanning();
69 
CloseScanning()70   void CloseScanning()
71   {
72     if (NeedPercents())
73       _percent.ClosePrint(true);
74   }
75 
76   void PrintStat(const CDirItemsStat &st);
77 };
78 
79 
80 
81 
82 class CExtractCallbackConsole Z7_final:
83   public IFolderArchiveExtractCallback,
84   public IExtractCallbackUI,
85   // public IArchiveExtractCallbackMessage,
86   public IFolderArchiveExtractCallback2,
87  #ifndef Z7_NO_CRYPTO
88   public ICryptoGetTextPassword,
89  #endif
90   public COpenCallbackConsole,
91   public CMyUnknownImp
92 {
93   Z7_COM_QI_BEGIN2(IFolderArchiveExtractCallback)
94   // Z7_COM_QI_ENTRY(IArchiveExtractCallbackMessage)
95   Z7_COM_QI_ENTRY(IFolderArchiveExtractCallback2)
96  #ifndef Z7_NO_CRYPTO
97   Z7_COM_QI_ENTRY(ICryptoGetTextPassword)
98  #endif
99   Z7_COM_QI_END
100   Z7_COM_ADDREF_RELEASE
101 
102   Z7_IFACE_COM7_IMP(IProgress)
103   Z7_IFACE_COM7_IMP(IFolderArchiveExtractCallback)
104   Z7_IFACE_IMP(IExtractCallbackUI)
105   // Z7_IFACE_COM7_IMP(IArchiveExtractCallbackMessage)
106   Z7_IFACE_COM7_IMP(IFolderArchiveExtractCallback2)
107  #ifndef Z7_NO_CRYPTO
108   Z7_IFACE_COM7_IMP(ICryptoGetTextPassword)
109  #endif
110 
111 
112   AString _tempA;
113   UString _tempU;
114 
115   UString _currentName;
116 
ClosePercents_for_so()117   void ClosePercents_for_so()
118   {
119     if (NeedPercents() && _so == _percent._so)
120       _percent.ClosePrint(false);
121   }
122 
ClosePercentsAndFlush()123   void ClosePercentsAndFlush()
124   {
125     if (NeedPercents())
126       _percent.ClosePrint(true);
127     if (_so)
128       _so->Flush();
129   }
130 public:
131   UInt64 NumTryArcs;
132 
133   bool ThereIsError_in_Current;
134   bool ThereIsWarning_in_Current;
135 
136   UInt64 NumOkArcs;
137   UInt64 NumCantOpenArcs;
138   UInt64 NumArcsWithError;
139   UInt64 NumArcsWithWarnings;
140 
141   UInt64 NumOpenArcErrors;
142   UInt64 NumOpenArcWarnings;
143 
144   UInt64 NumFileErrors;
145   UInt64 NumFileErrors_in_Current;
146 
147   bool NeedFlush;
148   unsigned PercentsNameLevel;
149   unsigned LogLevel;
150 
CExtractCallbackConsole()151   CExtractCallbackConsole():
152       NeedFlush(false),
153       PercentsNameLevel(1),
154       LogLevel(0)
155       {}
156 
SetWindowWidth(unsigned width)157   void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
158 
Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)159   void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)
160   {
161     COpenCallbackConsole::Init(outStream, errorStream, percentStream);
162 
163     NumTryArcs = 0;
164 
165     ThereIsError_in_Current = false;
166     ThereIsWarning_in_Current = false;
167 
168     NumOkArcs = 0;
169     NumCantOpenArcs = 0;
170     NumArcsWithError = 0;
171     NumArcsWithWarnings = 0;
172 
173     NumOpenArcErrors = 0;
174     NumOpenArcWarnings = 0;
175 
176     NumFileErrors = 0;
177     NumFileErrors_in_Current = 0;
178   }
179 };
180 
181 #endif
182