xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/CreateCoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // CreateCoder.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CREATE_CODER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CREATE_CODER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyString.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "MethodId.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker /*
14*f6dc9357SAndroid Build Coastguard Worker   if Z7_EXTERNAL_CODECS is not defined, the code supports only codecs that
15*f6dc9357SAndroid Build Coastguard Worker       are statically linked at compile-time and link-time.
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker   if Z7_EXTERNAL_CODECS is defined, the code supports also codecs from another
18*f6dc9357SAndroid Build Coastguard Worker       executable modules, that can be linked dynamically at run-time:
19*f6dc9357SAndroid Build Coastguard Worker         - EXE module can use codecs from external DLL files.
20*f6dc9357SAndroid Build Coastguard Worker         - DLL module can use codecs from external EXE and DLL files.
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker       CExternalCodecs contains information about codecs and interfaces to create them.
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker   The order of codecs:
25*f6dc9357SAndroid Build Coastguard Worker     1) Internal codecs
26*f6dc9357SAndroid Build Coastguard Worker     2) External codecs
27*f6dc9357SAndroid Build Coastguard Worker */
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker struct CCodecInfoEx
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker   CMethodId Id;
34*f6dc9357SAndroid Build Coastguard Worker   AString Name;
35*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStreams;
36*f6dc9357SAndroid Build Coastguard Worker   bool EncoderIsAssigned;
37*f6dc9357SAndroid Build Coastguard Worker   bool DecoderIsAssigned;
38*f6dc9357SAndroid Build Coastguard Worker   bool IsFilter; // it's unused
39*f6dc9357SAndroid Build Coastguard Worker 
CCodecInfoExCCodecInfoEx40*f6dc9357SAndroid Build Coastguard Worker   CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false), IsFilter(false) {}
41*f6dc9357SAndroid Build Coastguard Worker };
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker struct CHasherInfoEx
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker   CMethodId Id;
46*f6dc9357SAndroid Build Coastguard Worker   AString Name;
47*f6dc9357SAndroid Build Coastguard Worker };
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker #define Z7_PUBLIC_ISetCompressCodecsInfo_IFEC \
50*f6dc9357SAndroid Build Coastguard Worker     public ISetCompressCodecsInfo,
51*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC \
52*f6dc9357SAndroid Build Coastguard Worker     Z7_COM_QI_ENTRY(ISetCompressCodecsInfo)
53*f6dc9357SAndroid Build Coastguard Worker #define DECL_ISetCompressCodecsInfo \
54*f6dc9357SAndroid Build Coastguard Worker     Z7_COM7F_IMP(SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo))
55*f6dc9357SAndroid Build Coastguard Worker #define IMPL_ISetCompressCodecsInfo2(cls) \
56*f6dc9357SAndroid Build Coastguard Worker     Z7_COM7F_IMF(cls::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo)) \
57*f6dc9357SAndroid Build Coastguard Worker     { COM_TRY_BEGIN _externalCodecs.GetCodecs = compressCodecsInfo; \
58*f6dc9357SAndroid Build Coastguard Worker     return _externalCodecs.Load(); COM_TRY_END }
59*f6dc9357SAndroid Build Coastguard Worker #define IMPL_ISetCompressCodecsInfo  IMPL_ISetCompressCodecsInfo2(CHandler)
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker struct CExternalCodecs
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressCodecsInfo> GetCodecs;
64*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IHashers> GetHashers;
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CCodecInfoEx> Codecs;
67*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CHasherInfoEx> Hashers;
68*f6dc9357SAndroid Build Coastguard Worker 
IsSetCExternalCodecs69*f6dc9357SAndroid Build Coastguard Worker   bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; }
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   HRESULT Load();
72*f6dc9357SAndroid Build Coastguard Worker 
ClearAndReleaseCExternalCodecs73*f6dc9357SAndroid Build Coastguard Worker   void ClearAndRelease()
74*f6dc9357SAndroid Build Coastguard Worker   {
75*f6dc9357SAndroid Build Coastguard Worker     Hashers.Clear();
76*f6dc9357SAndroid Build Coastguard Worker     Codecs.Clear();
77*f6dc9357SAndroid Build Coastguard Worker     GetHashers.Release();
78*f6dc9357SAndroid Build Coastguard Worker     GetCodecs.Release();
79*f6dc9357SAndroid Build Coastguard Worker   }
80*f6dc9357SAndroid Build Coastguard Worker 
~CExternalCodecsCExternalCodecs81*f6dc9357SAndroid Build Coastguard Worker   ~CExternalCodecs()
82*f6dc9357SAndroid Build Coastguard Worker   {
83*f6dc9357SAndroid Build Coastguard Worker     GetHashers.Release();
84*f6dc9357SAndroid Build Coastguard Worker     GetCodecs.Release();
85*f6dc9357SAndroid Build Coastguard Worker   }
86*f6dc9357SAndroid Build Coastguard Worker };
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker extern CExternalCodecs g_ExternalCodecs;
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2   (_externalCodecs.IsSet() ? &_externalCodecs : &g_ExternalCodecs)
91*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2_L (&_externalCodecs)
92*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs)
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_VARS CExternalCodecs _externalCodecs;
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS   EXTERNAL_CODECS_VARS2,
97*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L,
98*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G,
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS2      const CExternalCodecs *_externalCodecs
101*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS       DECL_EXTERNAL_CODECS_LOC_VARS2,
102*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS_DECL  DECL_EXTERNAL_CODECS_LOC_VARS2;
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS2   _externalCodecs
105*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS    EXTERNAL_CODECS_LOC_VARS2,
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker #else
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker #define Z7_PUBLIC_ISetCompressCodecsInfo_IFEC
110*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC
111*f6dc9357SAndroid Build Coastguard Worker #define DECL_ISetCompressCodecsInfo
112*f6dc9357SAndroid Build Coastguard Worker #define IMPL_ISetCompressCodecsInfo
113*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2
114*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_VARS
115*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS
116*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_L
117*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_G
118*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS2
119*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS
120*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS_DECL
121*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS2
122*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker #endif
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker int FindMethod_Index(
127*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
128*f6dc9357SAndroid Build Coastguard Worker     const AString &name,
129*f6dc9357SAndroid Build Coastguard Worker     bool encode,
130*f6dc9357SAndroid Build Coastguard Worker     CMethodId &methodId,
131*f6dc9357SAndroid Build Coastguard Worker     UInt32 &numStreams,
132*f6dc9357SAndroid Build Coastguard Worker     bool &isFilter);
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker bool FindMethod(
135*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
136*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId,
137*f6dc9357SAndroid Build Coastguard Worker     AString &name);
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker bool FindHashMethod(
140*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
141*f6dc9357SAndroid Build Coastguard Worker     const AString &name,
142*f6dc9357SAndroid Build Coastguard Worker     CMethodId &methodId);
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker void GetHashMethods(
145*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
146*f6dc9357SAndroid Build Coastguard Worker     CRecordVector<CMethodId> &methods);
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker struct CCreatedCoder
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressCoder> Coder;
152*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressCoder2> Coder2;
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker   bool IsExternal;
155*f6dc9357SAndroid Build Coastguard Worker   bool IsFilter; // = true, if Coder was created from filter
156*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStreams;
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker   // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {}
159*f6dc9357SAndroid Build Coastguard Worker };
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Index(
163*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
164*f6dc9357SAndroid Build Coastguard Worker     unsigned codecIndex, bool encode,
165*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressFilter> &filter,
166*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod);
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Index(
169*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
170*f6dc9357SAndroid Build Coastguard Worker     unsigned index, bool encode,
171*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod);
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id(
174*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
175*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
176*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressFilter> &filter,
177*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod);
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id(
180*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
181*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
182*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod);
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id(
185*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
186*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
187*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressCoder> &coder);
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateFilter(
190*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
191*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
192*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressFilter> &filter);
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateHasher(
195*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
196*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId,
197*f6dc9357SAndroid Build Coastguard Worker     AString &name,
198*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IHasher> &hasher);
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker #endif
201