1*f6dc9357SAndroid Build Coastguard Worker // CodecExports.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/7zVersion.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/ComTry.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/Defs.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/PropVariant.h"
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker #include "../Common/RegisterCodec.h"
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumCodecs;
19*f6dc9357SAndroid Build Coastguard Worker extern const CCodecInfo *g_Codecs[];
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumHashers;
22*f6dc9357SAndroid Build Coastguard Worker extern const CHasherInfo *g_Hashers[];
23*f6dc9357SAndroid Build Coastguard Worker
SetPropFromAscii(const char * s,PROPVARIANT * prop)24*f6dc9357SAndroid Build Coastguard Worker static void SetPropFromAscii(const char *s, PROPVARIANT *prop) throw()
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker const UINT len = (UINT)strlen(s);
27*f6dc9357SAndroid Build Coastguard Worker BSTR dest = ::SysAllocStringLen(NULL, len);
28*f6dc9357SAndroid Build Coastguard Worker if (dest)
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker for (UINT i = 0; i <= len; i++)
31*f6dc9357SAndroid Build Coastguard Worker dest[i] = (Byte)s[i];
32*f6dc9357SAndroid Build Coastguard Worker prop->bstrVal = dest;
33*f6dc9357SAndroid Build Coastguard Worker prop->vt = VT_BSTR;
34*f6dc9357SAndroid Build Coastguard Worker }
35*f6dc9357SAndroid Build Coastguard Worker }
36*f6dc9357SAndroid Build Coastguard Worker
SetPropGUID(const GUID & guid,PROPVARIANT * value)37*f6dc9357SAndroid Build Coastguard Worker static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) throw()
38*f6dc9357SAndroid Build Coastguard Worker {
39*f6dc9357SAndroid Build Coastguard Worker if ((value->bstrVal = ::SysAllocStringByteLen((const char *)&guid, sizeof(guid))) != NULL)
40*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_BSTR;
41*f6dc9357SAndroid Build Coastguard Worker return S_OK;
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker
MethodToClassID(UInt16 typeId,CMethodId id,PROPVARIANT * value)44*f6dc9357SAndroid Build Coastguard Worker static HRESULT MethodToClassID(UInt16 typeId, CMethodId id, PROPVARIANT *value) throw()
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker GUID clsId;
47*f6dc9357SAndroid Build Coastguard Worker clsId.Data1 = k_7zip_GUID_Data1;
48*f6dc9357SAndroid Build Coastguard Worker clsId.Data2 = k_7zip_GUID_Data2;
49*f6dc9357SAndroid Build Coastguard Worker clsId.Data3 = typeId;
50*f6dc9357SAndroid Build Coastguard Worker SetUi64(clsId.Data4, id)
51*f6dc9357SAndroid Build Coastguard Worker return SetPropGUID(clsId, value);
52*f6dc9357SAndroid Build Coastguard Worker }
53*f6dc9357SAndroid Build Coastguard Worker
FindCodecClassId(const GUID * clsid,bool isCoder2,bool isFilter,bool & encode,int & index)54*f6dc9357SAndroid Build Coastguard Worker static HRESULT FindCodecClassId(const GUID *clsid, bool isCoder2, bool isFilter, bool &encode, int &index) throw()
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker index = -1;
57*f6dc9357SAndroid Build Coastguard Worker if (clsid->Data1 != k_7zip_GUID_Data1 ||
58*f6dc9357SAndroid Build Coastguard Worker clsid->Data2 != k_7zip_GUID_Data2)
59*f6dc9357SAndroid Build Coastguard Worker return S_OK;
60*f6dc9357SAndroid Build Coastguard Worker
61*f6dc9357SAndroid Build Coastguard Worker encode = true;
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker if (clsid->Data3 == k_7zip_GUID_Data3_Decoder) encode = false;
64*f6dc9357SAndroid Build Coastguard Worker else if (clsid->Data3 != k_7zip_GUID_Data3_Encoder) return S_OK;
65*f6dc9357SAndroid Build Coastguard Worker
66*f6dc9357SAndroid Build Coastguard Worker const UInt64 id = GetUi64(clsid->Data4);
67*f6dc9357SAndroid Build Coastguard Worker
68*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < g_NumCodecs; i++)
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo &codec = *g_Codecs[i];
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker if (id != codec.Id
73*f6dc9357SAndroid Build Coastguard Worker || (encode ? !codec.CreateEncoder : !codec.CreateDecoder)
74*f6dc9357SAndroid Build Coastguard Worker || (isFilter ? !codec.IsFilter : codec.IsFilter))
75*f6dc9357SAndroid Build Coastguard Worker continue;
76*f6dc9357SAndroid Build Coastguard Worker
77*f6dc9357SAndroid Build Coastguard Worker if (codec.NumStreams == 1 ? isCoder2 : !isCoder2)
78*f6dc9357SAndroid Build Coastguard Worker return E_NOINTERFACE;
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker index = (int)i;
81*f6dc9357SAndroid Build Coastguard Worker return S_OK;
82*f6dc9357SAndroid Build Coastguard Worker }
83*f6dc9357SAndroid Build Coastguard Worker
84*f6dc9357SAndroid Build Coastguard Worker return S_OK;
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker /*
88*f6dc9357SAndroid Build Coastguard Worker #ifdef __GNUC__
89*f6dc9357SAndroid Build Coastguard Worker #ifndef __clang__
90*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wduplicated-branches"
91*f6dc9357SAndroid Build Coastguard Worker #endif
92*f6dc9357SAndroid Build Coastguard Worker #endif
93*f6dc9357SAndroid Build Coastguard Worker */
94*f6dc9357SAndroid Build Coastguard Worker
CreateCoderMain(unsigned index,bool encode,void ** coder)95*f6dc9357SAndroid Build Coastguard Worker static HRESULT CreateCoderMain(unsigned index, bool encode, void **coder)
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
98*f6dc9357SAndroid Build Coastguard Worker
99*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo &codec = *g_Codecs[index];
100*f6dc9357SAndroid Build Coastguard Worker
101*f6dc9357SAndroid Build Coastguard Worker void *c;
102*f6dc9357SAndroid Build Coastguard Worker if (encode)
103*f6dc9357SAndroid Build Coastguard Worker c = codec.CreateEncoder();
104*f6dc9357SAndroid Build Coastguard Worker else
105*f6dc9357SAndroid Build Coastguard Worker c = codec.CreateDecoder();
106*f6dc9357SAndroid Build Coastguard Worker
107*f6dc9357SAndroid Build Coastguard Worker if (c)
108*f6dc9357SAndroid Build Coastguard Worker {
109*f6dc9357SAndroid Build Coastguard Worker IUnknown *unk;
110*f6dc9357SAndroid Build Coastguard Worker unk = (IUnknown *)c;
111*f6dc9357SAndroid Build Coastguard Worker /*
112*f6dc9357SAndroid Build Coastguard Worker if (codec.IsFilter)
113*f6dc9357SAndroid Build Coastguard Worker unk = (IUnknown *)(ICompressFilter *)c;
114*f6dc9357SAndroid Build Coastguard Worker else if (codec.NumStreams != 1)
115*f6dc9357SAndroid Build Coastguard Worker unk = (IUnknown *)(ICompressCoder2 *)c;
116*f6dc9357SAndroid Build Coastguard Worker else
117*f6dc9357SAndroid Build Coastguard Worker unk = (IUnknown *)(ICompressCoder *)c;
118*f6dc9357SAndroid Build Coastguard Worker */
119*f6dc9357SAndroid Build Coastguard Worker unk->AddRef();
120*f6dc9357SAndroid Build Coastguard Worker *coder = c;
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker return S_OK;
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
125*f6dc9357SAndroid Build Coastguard Worker }
126*f6dc9357SAndroid Build Coastguard Worker
CreateCoder2(bool encode,UInt32 index,const GUID * iid,void ** outObject)127*f6dc9357SAndroid Build Coastguard Worker static HRESULT CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject)
128*f6dc9357SAndroid Build Coastguard Worker {
129*f6dc9357SAndroid Build Coastguard Worker *outObject = NULL;
130*f6dc9357SAndroid Build Coastguard Worker
131*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo &codec = *g_Codecs[index];
132*f6dc9357SAndroid Build Coastguard Worker
133*f6dc9357SAndroid Build Coastguard Worker if (encode ? !codec.CreateEncoder : !codec.CreateDecoder)
134*f6dc9357SAndroid Build Coastguard Worker return CLASS_E_CLASSNOTAVAILABLE;
135*f6dc9357SAndroid Build Coastguard Worker
136*f6dc9357SAndroid Build Coastguard Worker if (codec.IsFilter)
137*f6dc9357SAndroid Build Coastguard Worker {
138*f6dc9357SAndroid Build Coastguard Worker if (*iid != IID_ICompressFilter) return E_NOINTERFACE;
139*f6dc9357SAndroid Build Coastguard Worker }
140*f6dc9357SAndroid Build Coastguard Worker else if (codec.NumStreams != 1)
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker if (*iid != IID_ICompressCoder2) return E_NOINTERFACE;
143*f6dc9357SAndroid Build Coastguard Worker }
144*f6dc9357SAndroid Build Coastguard Worker else
145*f6dc9357SAndroid Build Coastguard Worker {
146*f6dc9357SAndroid Build Coastguard Worker if (*iid != IID_ICompressCoder) return E_NOINTERFACE;
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker
149*f6dc9357SAndroid Build Coastguard Worker return CreateCoderMain(index, encode, outObject);
150*f6dc9357SAndroid Build Coastguard Worker }
151*f6dc9357SAndroid Build Coastguard Worker
152*f6dc9357SAndroid Build Coastguard Worker
153*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateDecoder(UInt32 index, const GUID *iid, void **outObject);
CreateDecoder(UInt32 index,const GUID * iid,void ** outObject)154*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateDecoder(UInt32 index, const GUID *iid, void **outObject)
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker return CreateCoder2(false, index, iid, outObject);
157*f6dc9357SAndroid Build Coastguard Worker }
158*f6dc9357SAndroid Build Coastguard Worker
159*f6dc9357SAndroid Build Coastguard Worker
160*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateEncoder(UInt32 index, const GUID *iid, void **outObject);
CreateEncoder(UInt32 index,const GUID * iid,void ** outObject)161*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateEncoder(UInt32 index, const GUID *iid, void **outObject)
162*f6dc9357SAndroid Build Coastguard Worker {
163*f6dc9357SAndroid Build Coastguard Worker return CreateCoder2(true, index, iid, outObject);
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker
166*f6dc9357SAndroid Build Coastguard Worker
167*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);
CreateCoder(const GUID * clsid,const GUID * iid,void ** outObject)168*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject)
169*f6dc9357SAndroid Build Coastguard Worker {
170*f6dc9357SAndroid Build Coastguard Worker *outObject = NULL;
171*f6dc9357SAndroid Build Coastguard Worker
172*f6dc9357SAndroid Build Coastguard Worker bool isFilter = false;
173*f6dc9357SAndroid Build Coastguard Worker bool isCoder2 = false;
174*f6dc9357SAndroid Build Coastguard Worker const bool isCoder = (*iid == IID_ICompressCoder) != 0;
175*f6dc9357SAndroid Build Coastguard Worker if (!isCoder)
176*f6dc9357SAndroid Build Coastguard Worker {
177*f6dc9357SAndroid Build Coastguard Worker isFilter = (*iid == IID_ICompressFilter) != 0;
178*f6dc9357SAndroid Build Coastguard Worker if (!isFilter)
179*f6dc9357SAndroid Build Coastguard Worker {
180*f6dc9357SAndroid Build Coastguard Worker isCoder2 = (*iid == IID_ICompressCoder2) != 0;
181*f6dc9357SAndroid Build Coastguard Worker if (!isCoder2)
182*f6dc9357SAndroid Build Coastguard Worker return E_NOINTERFACE;
183*f6dc9357SAndroid Build Coastguard Worker }
184*f6dc9357SAndroid Build Coastguard Worker }
185*f6dc9357SAndroid Build Coastguard Worker
186*f6dc9357SAndroid Build Coastguard Worker bool encode;
187*f6dc9357SAndroid Build Coastguard Worker int codecIndex;
188*f6dc9357SAndroid Build Coastguard Worker const HRESULT res = FindCodecClassId(clsid, isCoder2, isFilter, encode, codecIndex);
189*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
190*f6dc9357SAndroid Build Coastguard Worker return res;
191*f6dc9357SAndroid Build Coastguard Worker if (codecIndex < 0)
192*f6dc9357SAndroid Build Coastguard Worker return CLASS_E_CLASSNOTAVAILABLE;
193*f6dc9357SAndroid Build Coastguard Worker
194*f6dc9357SAndroid Build Coastguard Worker return CreateCoderMain((unsigned)codecIndex, encode, outObject);
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker
197*f6dc9357SAndroid Build Coastguard Worker
198*f6dc9357SAndroid Build Coastguard Worker STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);
GetMethodProperty(UInt32 codecIndex,PROPID propID,PROPVARIANT * value)199*f6dc9357SAndroid Build Coastguard Worker STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value)
200*f6dc9357SAndroid Build Coastguard Worker {
201*f6dc9357SAndroid Build Coastguard Worker ::VariantClear((VARIANTARG *)value);
202*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo &codec = *g_Codecs[codecIndex];
203*f6dc9357SAndroid Build Coastguard Worker switch (propID)
204*f6dc9357SAndroid Build Coastguard Worker {
205*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kID:
206*f6dc9357SAndroid Build Coastguard Worker value->uhVal.QuadPart = (UInt64)codec.Id;
207*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_UI8;
208*f6dc9357SAndroid Build Coastguard Worker break;
209*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kName:
210*f6dc9357SAndroid Build Coastguard Worker SetPropFromAscii(codec.Name, value);
211*f6dc9357SAndroid Build Coastguard Worker break;
212*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kDecoder:
213*f6dc9357SAndroid Build Coastguard Worker if (codec.CreateDecoder)
214*f6dc9357SAndroid Build Coastguard Worker return MethodToClassID(k_7zip_GUID_Data3_Decoder, codec.Id, value);
215*f6dc9357SAndroid Build Coastguard Worker break;
216*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kEncoder:
217*f6dc9357SAndroid Build Coastguard Worker if (codec.CreateEncoder)
218*f6dc9357SAndroid Build Coastguard Worker return MethodToClassID(k_7zip_GUID_Data3_Encoder, codec.Id, value);
219*f6dc9357SAndroid Build Coastguard Worker break;
220*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kDecoderIsAssigned:
221*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_BOOL;
222*f6dc9357SAndroid Build Coastguard Worker value->boolVal = BoolToVARIANT_BOOL(codec.CreateDecoder != NULL);
223*f6dc9357SAndroid Build Coastguard Worker break;
224*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kEncoderIsAssigned:
225*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_BOOL;
226*f6dc9357SAndroid Build Coastguard Worker value->boolVal = BoolToVARIANT_BOOL(codec.CreateEncoder != NULL);
227*f6dc9357SAndroid Build Coastguard Worker break;
228*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kPackStreams:
229*f6dc9357SAndroid Build Coastguard Worker if (codec.NumStreams != 1)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_UI4;
232*f6dc9357SAndroid Build Coastguard Worker value->ulVal = (ULONG)codec.NumStreams;
233*f6dc9357SAndroid Build Coastguard Worker }
234*f6dc9357SAndroid Build Coastguard Worker break;
235*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kIsFilter:
236*f6dc9357SAndroid Build Coastguard Worker {
237*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_BOOL;
238*f6dc9357SAndroid Build Coastguard Worker value->boolVal = BoolToVARIANT_BOOL(codec.IsFilter);
239*f6dc9357SAndroid Build Coastguard Worker }
240*f6dc9357SAndroid Build Coastguard Worker break;
241*f6dc9357SAndroid Build Coastguard Worker /*
242*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kDecoderFlags:
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_UI4;
245*f6dc9357SAndroid Build Coastguard Worker value->ulVal = (ULONG)codec.DecoderFlags;
246*f6dc9357SAndroid Build Coastguard Worker }
247*f6dc9357SAndroid Build Coastguard Worker break;
248*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kEncoderFlags:
249*f6dc9357SAndroid Build Coastguard Worker {
250*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_UI4;
251*f6dc9357SAndroid Build Coastguard Worker value->ulVal = (ULONG)codec.EncoderFlags;
252*f6dc9357SAndroid Build Coastguard Worker }
253*f6dc9357SAndroid Build Coastguard Worker break;
254*f6dc9357SAndroid Build Coastguard Worker */
255*f6dc9357SAndroid Build Coastguard Worker }
256*f6dc9357SAndroid Build Coastguard Worker return S_OK;
257*f6dc9357SAndroid Build Coastguard Worker }
258*f6dc9357SAndroid Build Coastguard Worker
259*f6dc9357SAndroid Build Coastguard Worker
260*f6dc9357SAndroid Build Coastguard Worker STDAPI GetNumberOfMethods(UInt32 *numCodecs);
GetNumberOfMethods(UInt32 * numCodecs)261*f6dc9357SAndroid Build Coastguard Worker STDAPI GetNumberOfMethods(UInt32 *numCodecs)
262*f6dc9357SAndroid Build Coastguard Worker {
263*f6dc9357SAndroid Build Coastguard Worker *numCodecs = g_NumCodecs;
264*f6dc9357SAndroid Build Coastguard Worker return S_OK;
265*f6dc9357SAndroid Build Coastguard Worker }
266*f6dc9357SAndroid Build Coastguard Worker
267*f6dc9357SAndroid Build Coastguard Worker
268*f6dc9357SAndroid Build Coastguard Worker // ---------- Hashers ----------
269*f6dc9357SAndroid Build Coastguard Worker
FindHasherClassId(const GUID * clsid)270*f6dc9357SAndroid Build Coastguard Worker static int FindHasherClassId(const GUID *clsid) throw()
271*f6dc9357SAndroid Build Coastguard Worker {
272*f6dc9357SAndroid Build Coastguard Worker if (clsid->Data1 != k_7zip_GUID_Data1 ||
273*f6dc9357SAndroid Build Coastguard Worker clsid->Data2 != k_7zip_GUID_Data2 ||
274*f6dc9357SAndroid Build Coastguard Worker clsid->Data3 != k_7zip_GUID_Data3_Hasher)
275*f6dc9357SAndroid Build Coastguard Worker return -1;
276*f6dc9357SAndroid Build Coastguard Worker const UInt64 id = GetUi64(clsid->Data4);
277*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < g_NumCodecs; i++)
278*f6dc9357SAndroid Build Coastguard Worker if (id == g_Hashers[i]->Id)
279*f6dc9357SAndroid Build Coastguard Worker return (int)i;
280*f6dc9357SAndroid Build Coastguard Worker return -1;
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker
CreateHasher2(UInt32 index,IHasher ** hasher)283*f6dc9357SAndroid Build Coastguard Worker static HRESULT CreateHasher2(UInt32 index, IHasher **hasher)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
286*f6dc9357SAndroid Build Coastguard Worker *hasher = g_Hashers[index]->CreateHasher();
287*f6dc9357SAndroid Build Coastguard Worker if (*hasher)
288*f6dc9357SAndroid Build Coastguard Worker (*hasher)->AddRef();
289*f6dc9357SAndroid Build Coastguard Worker return S_OK;
290*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
291*f6dc9357SAndroid Build Coastguard Worker }
292*f6dc9357SAndroid Build Coastguard Worker
293*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateHasher(const GUID *clsid, IHasher **outObject);
CreateHasher(const GUID * clsid,IHasher ** outObject)294*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateHasher(const GUID *clsid, IHasher **outObject)
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
297*f6dc9357SAndroid Build Coastguard Worker *outObject = NULL;
298*f6dc9357SAndroid Build Coastguard Worker const int index = FindHasherClassId(clsid);
299*f6dc9357SAndroid Build Coastguard Worker if (index < 0)
300*f6dc9357SAndroid Build Coastguard Worker return CLASS_E_CLASSNOTAVAILABLE;
301*f6dc9357SAndroid Build Coastguard Worker return CreateHasher2((UInt32)(unsigned)index, outObject);
302*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
303*f6dc9357SAndroid Build Coastguard Worker }
304*f6dc9357SAndroid Build Coastguard Worker
305*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHasherProp(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);
GetHasherProp(UInt32 codecIndex,PROPID propID,PROPVARIANT * value)306*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHasherProp(UInt32 codecIndex, PROPID propID, PROPVARIANT *value)
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker ::VariantClear((VARIANTARG *)value);
309*f6dc9357SAndroid Build Coastguard Worker const CHasherInfo &codec = *g_Hashers[codecIndex];
310*f6dc9357SAndroid Build Coastguard Worker switch (propID)
311*f6dc9357SAndroid Build Coastguard Worker {
312*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kID:
313*f6dc9357SAndroid Build Coastguard Worker value->uhVal.QuadPart = (UInt64)codec.Id;
314*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_UI8;
315*f6dc9357SAndroid Build Coastguard Worker break;
316*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kName:
317*f6dc9357SAndroid Build Coastguard Worker SetPropFromAscii(codec.Name, value);
318*f6dc9357SAndroid Build Coastguard Worker break;
319*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kEncoder:
320*f6dc9357SAndroid Build Coastguard Worker if (codec.CreateHasher)
321*f6dc9357SAndroid Build Coastguard Worker return MethodToClassID(k_7zip_GUID_Data3_Hasher, codec.Id, value);
322*f6dc9357SAndroid Build Coastguard Worker break;
323*f6dc9357SAndroid Build Coastguard Worker case NMethodPropID::kDigestSize:
324*f6dc9357SAndroid Build Coastguard Worker value->ulVal = (ULONG)codec.DigestSize;
325*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_UI4;
326*f6dc9357SAndroid Build Coastguard Worker break;
327*f6dc9357SAndroid Build Coastguard Worker }
328*f6dc9357SAndroid Build Coastguard Worker return S_OK;
329*f6dc9357SAndroid Build Coastguard Worker }
330*f6dc9357SAndroid Build Coastguard Worker
331*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1(CHashers, IHashers) };
332*f6dc9357SAndroid Build Coastguard Worker
333*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHashers(IHashers **hashers);
334*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHashers(IHashers **hashers)
335*f6dc9357SAndroid Build Coastguard Worker {
336*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
337*f6dc9357SAndroid Build Coastguard Worker *hashers = new CHashers;
338*f6dc9357SAndroid Build Coastguard Worker if (*hashers)
339*f6dc9357SAndroid Build Coastguard Worker (*hashers)->AddRef();
340*f6dc9357SAndroid Build Coastguard Worker return S_OK;
341*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
342*f6dc9357SAndroid Build Coastguard Worker }
343*f6dc9357SAndroid Build Coastguard Worker
344*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(UInt32, CHashers::GetNumHashers())
345*f6dc9357SAndroid Build Coastguard Worker {
346*f6dc9357SAndroid Build Coastguard Worker return g_NumHashers;
347*f6dc9357SAndroid Build Coastguard Worker }
348*f6dc9357SAndroid Build Coastguard Worker
349*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHashers::GetHasherProp(UInt32 index, PROPID propID, PROPVARIANT *value))
350*f6dc9357SAndroid Build Coastguard Worker {
351*f6dc9357SAndroid Build Coastguard Worker return ::GetHasherProp(index, propID, value);
352*f6dc9357SAndroid Build Coastguard Worker }
353*f6dc9357SAndroid Build Coastguard Worker
354*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHashers::CreateHasher(UInt32 index, IHasher **hasher))
355*f6dc9357SAndroid Build Coastguard Worker {
356*f6dc9357SAndroid Build Coastguard Worker return ::CreateHasher2(index, hasher);
357*f6dc9357SAndroid Build Coastguard Worker }
358*f6dc9357SAndroid Build Coastguard Worker
359*f6dc9357SAndroid Build Coastguard Worker
360*f6dc9357SAndroid Build Coastguard Worker STDAPI GetModuleProp(PROPID propID, PROPVARIANT *value);
361*f6dc9357SAndroid Build Coastguard Worker STDAPI GetModuleProp(PROPID propID, PROPVARIANT *value)
362*f6dc9357SAndroid Build Coastguard Worker {
363*f6dc9357SAndroid Build Coastguard Worker ::VariantClear((VARIANTARG *)value);
364*f6dc9357SAndroid Build Coastguard Worker switch (propID)
365*f6dc9357SAndroid Build Coastguard Worker {
366*f6dc9357SAndroid Build Coastguard Worker case NModulePropID::kInterfaceType:
367*f6dc9357SAndroid Build Coastguard Worker {
368*f6dc9357SAndroid Build Coastguard Worker NWindows::NCOM::PropVarEm_Set_UInt32(value, NModuleInterfaceType::k_IUnknown_VirtDestructor_ThisModule);
369*f6dc9357SAndroid Build Coastguard Worker break;
370*f6dc9357SAndroid Build Coastguard Worker }
371*f6dc9357SAndroid Build Coastguard Worker case NModulePropID::kVersion:
372*f6dc9357SAndroid Build Coastguard Worker {
373*f6dc9357SAndroid Build Coastguard Worker NWindows::NCOM::PropVarEm_Set_UInt32(value, (MY_VER_MAJOR << 16) | MY_VER_MINOR);
374*f6dc9357SAndroid Build Coastguard Worker break;
375*f6dc9357SAndroid Build Coastguard Worker }
376*f6dc9357SAndroid Build Coastguard Worker }
377*f6dc9357SAndroid Build Coastguard Worker return S_OK;
378*f6dc9357SAndroid Build Coastguard Worker }
379