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