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()47 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 #ifndef Z7_SFX 91 public IArchiveRequestMemoryUseCallback, 92 #endif 93 94 public COpenCallbackConsole, 95 public CMyUnknownImp 96 { 97 Z7_COM_QI_BEGIN2(IFolderArchiveExtractCallback) 98 // Z7_COM_QI_ENTRY(IArchiveExtractCallbackMessage) 99 Z7_COM_QI_ENTRY(IFolderArchiveExtractCallback2) 100 #ifndef Z7_NO_CRYPTO 101 Z7_COM_QI_ENTRY(ICryptoGetTextPassword) 102 #endif 103 #ifndef Z7_SFX 104 Z7_COM_QI_ENTRY(IArchiveRequestMemoryUseCallback) 105 #endif 106 107 Z7_COM_QI_END 108 Z7_COM_ADDREF_RELEASE 109 110 Z7_IFACE_COM7_IMP(IProgress) 111 Z7_IFACE_COM7_IMP(IFolderArchiveExtractCallback) 112 Z7_IFACE_IMP(IExtractCallbackUI) 113 // Z7_IFACE_COM7_IMP(IArchiveExtractCallbackMessage) 114 Z7_IFACE_COM7_IMP(IFolderArchiveExtractCallback2) 115 #ifndef Z7_NO_CRYPTO 116 Z7_IFACE_COM7_IMP(ICryptoGetTextPassword) 117 #endif 118 #ifndef Z7_SFX 119 Z7_IFACE_COM7_IMP(IArchiveRequestMemoryUseCallback) 120 #endif 121 122 bool _needWriteArchivePath; 123 124 public: 125 bool ThereIsError_in_Current; 126 bool ThereIsWarning_in_Current; 127 bool NeedFlush; 128 129 private: 130 AString _tempA; 131 UString _tempU; 132 133 UString _currentArchivePath; 134 UString _currentName; 135 136 #ifndef Z7_SFX 137 void PrintTo_se_Path_WithTitle(const UString &path, const char *title); 138 void Add_ArchiveName_Error(); 139 #endif 140 ClosePercents_for_so()141 void ClosePercents_for_so() 142 { 143 if (NeedPercents() && _so == _percent._so) 144 _percent.ClosePrint(false); 145 } 146 ClosePercentsAndFlush()147 void ClosePercentsAndFlush() 148 { 149 if (NeedPercents()) 150 _percent.ClosePrint(true); 151 if (_so) 152 _so->Flush(); 153 } 154 public: 155 UInt64 NumTryArcs; 156 157 UInt64 NumOkArcs; 158 UInt64 NumCantOpenArcs; 159 UInt64 NumArcsWithError; 160 UInt64 NumArcsWithWarnings; 161 162 UInt64 NumOpenArcErrors; 163 UInt64 NumOpenArcWarnings; 164 165 UInt64 NumFileErrors; 166 UInt64 NumFileErrors_in_Current; 167 168 unsigned PercentsNameLevel; 169 unsigned LogLevel; 170 CExtractCallbackConsole()171 CExtractCallbackConsole(): 172 _needWriteArchivePath(true), 173 NeedFlush(false), 174 PercentsNameLevel(1), 175 LogLevel(0) 176 {} 177 SetWindowWidth(unsigned width)178 void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } 179 Init(CStdOutStream * outStream,CStdOutStream * errorStream,CStdOutStream * percentStream)180 void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream) 181 { 182 COpenCallbackConsole::Init(outStream, errorStream, percentStream); 183 184 NumTryArcs = 0; 185 186 ThereIsError_in_Current = false; 187 ThereIsWarning_in_Current = false; 188 189 NumOkArcs = 0; 190 NumCantOpenArcs = 0; 191 NumArcsWithError = 0; 192 NumArcsWithWarnings = 0; 193 194 NumOpenArcErrors = 0; 195 NumOpenArcWarnings = 0; 196 197 NumFileErrors = 0; 198 NumFileErrors_in_Current = 0; 199 } 200 }; 201 202 #endif 203