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