1 // 7z/Handler.h
2 
3 #ifndef __7Z_HANDLER_H
4 #define __7Z_HANDLER_H
5 
6 #include "../../ICoder.h"
7 #include "../IArchive.h"
8 
9 #include "../../Common/CreateCoder.h"
10 
11 #ifndef EXTRACT_ONLY
12 #include "../Common/HandlerOut.h"
13 #endif
14 
15 #include "7zCompressionMode.h"
16 #include "7zIn.h"
17 
18 namespace NArchive {
19 namespace N7z {
20 
21 const UInt32 k_Copy = 0x0;
22 const UInt32 k_Delta = 3;
23 const UInt32 k_LZMA2 = 0x21;
24 const UInt32 k_LZMA  = 0x030101;
25 const UInt32 k_PPMD  = 0x030401;
26 const UInt32 k_BCJ  = 0x03030103;
27 const UInt32 k_BCJ2 = 0x0303011B;
28 const UInt32 k_Deflate = 0x040108;
29 const UInt32 k_BZip2   = 0x040202;
30 
31 #ifndef __7Z_SET_PROPERTIES
32 
33 #ifdef EXTRACT_ONLY
34 #if !defined(_7ZIP_ST) && !defined(_SFX)
35 #define __7Z_SET_PROPERTIES
36 #endif
37 #else
38 #define __7Z_SET_PROPERTIES
39 #endif
40 
41 #endif
42 
43 
44 #ifndef EXTRACT_ONLY
45 
46 class COutHandler: public CMultiMethodProps
47 {
48   HRESULT SetSolidFromString(const UString &s);
49   HRESULT SetSolidFromPROPVARIANT(const PROPVARIANT &value);
50 public:
51   bool _removeSfxBlock;
52 
53   UInt64 _numSolidFiles;
54   UInt64 _numSolidBytes;
55   bool _numSolidBytesDefined;
56   bool _solidExtension;
57 
58   bool _compressHeaders;
59   bool _encryptHeadersSpecified;
60   bool _encryptHeaders;
61   // bool _useParents; 9.26
62 
63   CBoolPair Write_CTime;
64   CBoolPair Write_ATime;
65   CBoolPair Write_MTime;
66 
67   bool _volumeMode;
68 
InitSolidFiles()69   void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); }
InitSolidSize()70   void InitSolidSize()  { _numSolidBytes = (UInt64)(Int64)(-1); }
InitSolid()71   void InitSolid()
72   {
73     InitSolidFiles();
74     InitSolidSize();
75     _solidExtension = false;
76     _numSolidBytesDefined = false;
77   }
78 
79   void InitProps();
80 
COutHandler()81   COutHandler() { InitProps(); }
82 
83   HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value);
84 };
85 
86 #endif
87 
88 class CHandler:
89   public IInArchive,
90   public IArchiveGetRawProps,
91   #ifdef __7Z_SET_PROPERTIES
92   public ISetProperties,
93   #endif
94   #ifndef EXTRACT_ONLY
95   public IOutArchive,
96   #endif
97   PUBLIC_ISetCompressCodecsInfo
98   public CMyUnknownImp
99   #ifndef EXTRACT_ONLY
100   , public COutHandler
101   #endif
102 {
103 public:
104   MY_QUERYINTERFACE_BEGIN2(IInArchive)
105   MY_QUERYINTERFACE_ENTRY(IArchiveGetRawProps)
106   #ifdef __7Z_SET_PROPERTIES
107   MY_QUERYINTERFACE_ENTRY(ISetProperties)
108   #endif
109   #ifndef EXTRACT_ONLY
110   MY_QUERYINTERFACE_ENTRY(IOutArchive)
111   #endif
112   QUERY_ENTRY_ISetCompressCodecsInfo
113   MY_QUERYINTERFACE_END
114   MY_ADDREF_RELEASE
115 
116   INTERFACE_IInArchive(;)
117   INTERFACE_IArchiveGetRawProps(;)
118 
119   #ifdef __7Z_SET_PROPERTIES
120   STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps);
121   #endif
122 
123   #ifndef EXTRACT_ONLY
124   INTERFACE_IOutArchive(;)
125   #endif
126 
127   DECL_ISetCompressCodecsInfo
128 
129   CHandler();
130 
131 private:
132   CMyComPtr<IInStream> _inStream;
133   NArchive::N7z::CDbEx _db;
134   #ifndef _NO_CRYPTO
135   bool _isEncrypted;
136   bool _passwordIsDefined;
137   #endif
138 
139   #ifdef EXTRACT_ONLY
140 
141   #ifdef __7Z_SET_PROPERTIES
142   UInt32 _numThreads;
143   #endif
144 
145   UInt32 _crcSize;
146 
147   #else
148 
149   CRecordVector<CBind> _binds;
150 
151   HRESULT PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m);
152   HRESULT SetHeaderMethod(CCompressionMethodMode &headerMethod);
153   void AddDefaultMethod();
154   HRESULT SetMainMethod(CCompressionMethodMode &method,
155       CObjectVector<COneMethodInfo> &methodsInfo
156       #ifndef _7ZIP_ST
157       , UInt32 numThreads
158       #endif
159       );
160 
161 
162   #endif
163 
164   bool IsFolderEncrypted(CNum folderIndex) const;
165   #ifndef _SFX
166 
167   CRecordVector<UInt64> _fileInfoPopIDs;
168   void FillPopIDs();
169   void AddMethodName(AString &s, UInt64 id);
170   HRESULT SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const;
171 
172   #endif
173 
174   DECL_EXTERNAL_CODECS_VARS
175 };
176 
177 }}
178 
179 #endif
180