1 // 7zEncode.h
2 
3 #ifndef __7Z_ENCODE_H
4 #define __7Z_ENCODE_H
5 
6 #include "7zCompressionMode.h"
7 
8 #include "../Common/CoderMixer2.h"
9 
10 #include "7zItem.h"
11 
12 namespace NArchive {
13 namespace N7z {
14 
15 class CMtEncMultiProgress:
16   public ICompressProgressInfo,
17   public CMyUnknownImp
18 {
19   CMyComPtr<ICompressProgressInfo> _progress;
20   #ifndef _7ZIP_ST
21   NWindows::NSynchronization::CCriticalSection CriticalSection;
22   #endif
23 
24 public:
25   UInt64 OutSize;
26 
CMtEncMultiProgress()27   CMtEncMultiProgress(): OutSize(0) {}
28 
29   void Init(ICompressProgressInfo *progress);
30 
AddOutSize(UInt64 addOutSize)31   void AddOutSize(UInt64 addOutSize)
32   {
33     #ifndef _7ZIP_ST
34     NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
35     #endif
36     OutSize += addOutSize;
37   }
38 
39   MY_UNKNOWN_IMP1(ICompressProgressInfo)
40 
41   STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
42 };
43 
44 class CEncoder
45 {
46   #ifdef USE_MIXER_ST
47     NCoderMixer2::CMixerST *_mixerST;
48   #endif
49   #ifdef USE_MIXER_MT
50     NCoderMixer2::CMixerMT *_mixerMT;
51   #endif
52 
53   NCoderMixer2::CMixer *_mixer;
54   CMyComPtr<IUnknown> _mixerRef;
55 
56   CCompressionMethodMode _options;
57   NCoderMixer2::CBindInfo _bindInfo;
58   CRecordVector<CMethodId> _decompressionMethods;
59 
60   CRecordVector<UInt32> _SrcIn_to_DestOut;
61   CRecordVector<UInt32> _SrcOut_to_DestIn;
62   // CRecordVector<UInt32> _DestIn_to_SrcOut;
63   CRecordVector<UInt32> _DestOut_to_SrcIn;
64 
65   void InitBindConv();
66   void SetFolder(CFolder &folder);
67 
68   HRESULT CreateMixerCoder(DECL_EXTERNAL_CODECS_LOC_VARS
69       const UInt64 *inSizeForReduce);
70 
71   bool _constructed;
72 public:
73 
74   CEncoder(const CCompressionMethodMode &options);
75   ~CEncoder();
76   HRESULT EncoderConstr();
77   HRESULT Encode(
78       DECL_EXTERNAL_CODECS_LOC_VARS
79       ISequentialInStream *inStream,
80       // const UInt64 *inStreamSize,
81       const UInt64 *inSizeForReduce,
82       CFolder &folderItem,
83       CRecordVector<UInt64> &coderUnpackSizes,
84       UInt64 &unpackSize,
85       ISequentialOutStream *outStream,
86       CRecordVector<UInt64> &packSizes,
87       ICompressProgressInfo *compressProgress);
88 };
89 
90 }}
91 
92 #endif
93