1*f6dc9357SAndroid Build Coastguard Worker // LoadCodecs.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker /*
4*f6dc9357SAndroid Build Coastguard Worker Z7_EXTERNAL_CODECS
5*f6dc9357SAndroid Build Coastguard Worker ---------------
6*f6dc9357SAndroid Build Coastguard Worker CCodecs::Load() tries to detect the directory with plugins.
7*f6dc9357SAndroid Build Coastguard Worker It stops the checking, if it can find any of the following items:
8*f6dc9357SAndroid Build Coastguard Worker - 7z.dll file
9*f6dc9357SAndroid Build Coastguard Worker - "Formats" subdir
10*f6dc9357SAndroid Build Coastguard Worker - "Codecs" subdir
11*f6dc9357SAndroid Build Coastguard Worker The order of check:
12*f6dc9357SAndroid Build Coastguard Worker 1) directory of client executable
13*f6dc9357SAndroid Build Coastguard Worker 2) WIN32: directory for REGISTRY item [HKEY_*\Software\7-Zip\Path**]
14*f6dc9357SAndroid Build Coastguard Worker The order for HKEY_* : Path** :
15*f6dc9357SAndroid Build Coastguard Worker - HKEY_CURRENT_USER : PathXX
16*f6dc9357SAndroid Build Coastguard Worker - HKEY_LOCAL_MACHINE : PathXX
17*f6dc9357SAndroid Build Coastguard Worker - HKEY_CURRENT_USER : Path
18*f6dc9357SAndroid Build Coastguard Worker - HKEY_LOCAL_MACHINE : Path
19*f6dc9357SAndroid Build Coastguard Worker PathXX is Path32 in 32-bit code
20*f6dc9357SAndroid Build Coastguard Worker PathXX is Path64 in 64-bit code
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker EXPORT_CODECS
24*f6dc9357SAndroid Build Coastguard Worker -------------
25*f6dc9357SAndroid Build Coastguard Worker if (Z7_EXTERNAL_CODECS) is defined, then the code exports internal
26*f6dc9357SAndroid Build Coastguard Worker codecs of client from CCodecs object to external plugins.
27*f6dc9357SAndroid Build Coastguard Worker 7-Zip doesn't use that feature. 7-Zip uses the scheme:
28*f6dc9357SAndroid Build Coastguard Worker - client application without internal plugins.
29*f6dc9357SAndroid Build Coastguard Worker - 7z.dll module contains all (or almost all) plugins.
30*f6dc9357SAndroid Build Coastguard Worker 7z.dll can use codecs from another plugins, if required.
31*f6dc9357SAndroid Build Coastguard Worker */
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker
34*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
37*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
38*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
41*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileIO.h"
42*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
43*f6dc9357SAndroid Build Coastguard Worker
44*f6dc9357SAndroid Build Coastguard Worker #include "LoadCodecs.h"
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker #include "../../ICoder.h"
47*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/RegisterArc.h"
48*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/RegisterCodec.h"
49*f6dc9357SAndroid Build Coastguard Worker
50*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
51*f6dc9357SAndroid Build Coastguard Worker // #define EXPORT_CODECS
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker
54*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
55*f6dc9357SAndroid Build Coastguard Worker
56*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
57*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
60*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
61*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Registry.h"
62*f6dc9357SAndroid Build Coastguard Worker #endif
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
65*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
66*f6dc9357SAndroid Build Coastguard Worker
67*f6dc9357SAndroid Build Coastguard Worker
68*f6dc9357SAndroid Build Coastguard Worker #define kCodecsFolderName FTEXT("Codecs")
69*f6dc9357SAndroid Build Coastguard Worker #define kFormatsFolderName FTEXT("Formats")
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker static CFSTR const kMainDll =
73*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
74*f6dc9357SAndroid Build Coastguard Worker FTEXT("7z.dll");
75*f6dc9357SAndroid Build Coastguard Worker #else
76*f6dc9357SAndroid Build Coastguard Worker FTEXT("7z.so");
77*f6dc9357SAndroid Build Coastguard Worker #endif
78*f6dc9357SAndroid Build Coastguard Worker
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
81*f6dc9357SAndroid Build Coastguard Worker
82*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kRegistryPath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-zip");
83*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kProgramPathValue = L"Path";
84*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kProgramPath2Value = L"Path"
85*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN64
86*f6dc9357SAndroid Build Coastguard Worker L"64";
87*f6dc9357SAndroid Build Coastguard Worker #else
88*f6dc9357SAndroid Build Coastguard Worker L"32";
89*f6dc9357SAndroid Build Coastguard Worker #endif
90*f6dc9357SAndroid Build Coastguard Worker
ReadPathFromRegistry(HKEY baseKey,LPCWSTR value,FString & path)91*f6dc9357SAndroid Build Coastguard Worker static bool ReadPathFromRegistry(HKEY baseKey, LPCWSTR value, FString &path)
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker NRegistry::CKey key;
94*f6dc9357SAndroid Build Coastguard Worker if (key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker UString pathU;
97*f6dc9357SAndroid Build Coastguard Worker if (key.QueryValue(value, pathU) == ERROR_SUCCESS)
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker path = us2fs(pathU);
100*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(path);
101*f6dc9357SAndroid Build Coastguard Worker return NFind::DoesFileExist_Raw(path + kMainDll);
102*f6dc9357SAndroid Build Coastguard Worker }
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker return false;
105*f6dc9357SAndroid Build Coastguard Worker }
106*f6dc9357SAndroid Build Coastguard Worker
107*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_EXTERNAL_CODECS
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker
112*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumArcsMax = 72;
113*f6dc9357SAndroid Build Coastguard Worker static unsigned g_NumArcs = 0;
114*f6dc9357SAndroid Build Coastguard Worker static const CArcInfo *g_Arcs[kNumArcsMax];
115*f6dc9357SAndroid Build Coastguard Worker
RegisterArc(const CArcInfo * arcInfo)116*f6dc9357SAndroid Build Coastguard Worker void RegisterArc(const CArcInfo *arcInfo) throw()
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker if (g_NumArcs < kNumArcsMax)
119*f6dc9357SAndroid Build Coastguard Worker {
120*f6dc9357SAndroid Build Coastguard Worker g_Arcs[g_NumArcs] = arcInfo;
121*f6dc9357SAndroid Build Coastguard Worker g_NumArcs++;
122*f6dc9357SAndroid Build Coastguard Worker }
123*f6dc9357SAndroid Build Coastguard Worker // else throw 1;
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker /*
127*f6dc9357SAndroid Build Coastguard Worker static void SplitString(const UString &srcString, UStringVector &destStrings)
128*f6dc9357SAndroid Build Coastguard Worker {
129*f6dc9357SAndroid Build Coastguard Worker destStrings.Clear();
130*f6dc9357SAndroid Build Coastguard Worker UString s;
131*f6dc9357SAndroid Build Coastguard Worker unsigned len = srcString.Len();
132*f6dc9357SAndroid Build Coastguard Worker if (len == 0)
133*f6dc9357SAndroid Build Coastguard Worker return;
134*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
135*f6dc9357SAndroid Build Coastguard Worker {
136*f6dc9357SAndroid Build Coastguard Worker wchar_t c = srcString[i];
137*f6dc9357SAndroid Build Coastguard Worker if (c == L' ')
138*f6dc9357SAndroid Build Coastguard Worker {
139*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
140*f6dc9357SAndroid Build Coastguard Worker {
141*f6dc9357SAndroid Build Coastguard Worker destStrings.Add(s);
142*f6dc9357SAndroid Build Coastguard Worker s.Empty();
143*f6dc9357SAndroid Build Coastguard Worker }
144*f6dc9357SAndroid Build Coastguard Worker }
145*f6dc9357SAndroid Build Coastguard Worker else
146*f6dc9357SAndroid Build Coastguard Worker s += c;
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
149*f6dc9357SAndroid Build Coastguard Worker destStrings.Add(s);
150*f6dc9357SAndroid Build Coastguard Worker }
151*f6dc9357SAndroid Build Coastguard Worker */
152*f6dc9357SAndroid Build Coastguard Worker
FindExtension(const UString & ext) const153*f6dc9357SAndroid Build Coastguard Worker int CArcInfoEx::FindExtension(const UString &ext) const
154*f6dc9357SAndroid Build Coastguard Worker {
155*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Exts)
156*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEqualTo_NoCase(Exts[i].Ext))
157*f6dc9357SAndroid Build Coastguard Worker return (int)i;
158*f6dc9357SAndroid Build Coastguard Worker return -1;
159*f6dc9357SAndroid Build Coastguard Worker }
160*f6dc9357SAndroid Build Coastguard Worker
AddExts(const UString & ext,const UString & addExt)161*f6dc9357SAndroid Build Coastguard Worker void CArcInfoEx::AddExts(const UString &ext, const UString &addExt)
162*f6dc9357SAndroid Build Coastguard Worker {
163*f6dc9357SAndroid Build Coastguard Worker UStringVector exts, addExts;
164*f6dc9357SAndroid Build Coastguard Worker SplitString(ext, exts);
165*f6dc9357SAndroid Build Coastguard Worker SplitString(addExt, addExts);
166*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, exts)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker CArcExtInfo extInfo;
169*f6dc9357SAndroid Build Coastguard Worker extInfo.Ext = exts[i];
170*f6dc9357SAndroid Build Coastguard Worker if (i < addExts.Size())
171*f6dc9357SAndroid Build Coastguard Worker {
172*f6dc9357SAndroid Build Coastguard Worker extInfo.AddExt = addExts[i];
173*f6dc9357SAndroid Build Coastguard Worker if (extInfo.AddExt == L"*")
174*f6dc9357SAndroid Build Coastguard Worker extInfo.AddExt.Empty();
175*f6dc9357SAndroid Build Coastguard Worker }
176*f6dc9357SAndroid Build Coastguard Worker Exts.Add(extInfo);
177*f6dc9357SAndroid Build Coastguard Worker }
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker
180*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
181*f6dc9357SAndroid Build Coastguard Worker
ParseSignatures(const Byte * data,unsigned size,CObjectVector<CByteBuffer> & signatures)182*f6dc9357SAndroid Build Coastguard Worker static bool ParseSignatures(const Byte *data, unsigned size, CObjectVector<CByteBuffer> &signatures)
183*f6dc9357SAndroid Build Coastguard Worker {
184*f6dc9357SAndroid Build Coastguard Worker signatures.Clear();
185*f6dc9357SAndroid Build Coastguard Worker while (size != 0)
186*f6dc9357SAndroid Build Coastguard Worker {
187*f6dc9357SAndroid Build Coastguard Worker const unsigned len = *data++;
188*f6dc9357SAndroid Build Coastguard Worker size--;
189*f6dc9357SAndroid Build Coastguard Worker if (len > size)
190*f6dc9357SAndroid Build Coastguard Worker return false;
191*f6dc9357SAndroid Build Coastguard Worker signatures.AddNew().CopyFrom(data, len);
192*f6dc9357SAndroid Build Coastguard Worker data += len;
193*f6dc9357SAndroid Build Coastguard Worker size -= len;
194*f6dc9357SAndroid Build Coastguard Worker }
195*f6dc9357SAndroid Build Coastguard Worker return true;
196*f6dc9357SAndroid Build Coastguard Worker }
197*f6dc9357SAndroid Build Coastguard Worker
198*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_SFX
199*f6dc9357SAndroid Build Coastguard Worker
200*f6dc9357SAndroid Build Coastguard Worker // #include <stdio.h>
201*f6dc9357SAndroid Build Coastguard Worker
202*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
203*f6dc9357SAndroid Build Coastguard Worker
GetBaseFolderPrefixFromRegistry()204*f6dc9357SAndroid Build Coastguard Worker static FString GetBaseFolderPrefixFromRegistry()
205*f6dc9357SAndroid Build Coastguard Worker {
206*f6dc9357SAndroid Build Coastguard Worker FString moduleFolderPrefix = NDLL::GetModuleDirPrefix();
207*f6dc9357SAndroid Build Coastguard Worker
208*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
209*f6dc9357SAndroid Build Coastguard Worker if ( !NFind::DoesFileOrDirExist(moduleFolderPrefix + kMainDll)
210*f6dc9357SAndroid Build Coastguard Worker && !NFind::DoesFileOrDirExist(moduleFolderPrefix + kCodecsFolderName)
211*f6dc9357SAndroid Build Coastguard Worker && !NFind::DoesFileOrDirExist(moduleFolderPrefix + kFormatsFolderName))
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker FString path;
214*f6dc9357SAndroid Build Coastguard Worker if (ReadPathFromRegistry(HKEY_CURRENT_USER, kProgramPath2Value, path)) return path;
215*f6dc9357SAndroid Build Coastguard Worker if (ReadPathFromRegistry(HKEY_LOCAL_MACHINE, kProgramPath2Value, path)) return path;
216*f6dc9357SAndroid Build Coastguard Worker if (ReadPathFromRegistry(HKEY_CURRENT_USER, kProgramPathValue, path)) return path;
217*f6dc9357SAndroid Build Coastguard Worker if (ReadPathFromRegistry(HKEY_LOCAL_MACHINE, kProgramPathValue, path)) return path;
218*f6dc9357SAndroid Build Coastguard Worker }
219*f6dc9357SAndroid Build Coastguard Worker #endif
220*f6dc9357SAndroid Build Coastguard Worker
221*f6dc9357SAndroid Build Coastguard Worker // printf("\nmoduleFolderPrefix = %s\n", (const char *)GetAnsiString(moduleFolderPrefix));
222*f6dc9357SAndroid Build Coastguard Worker return moduleFolderPrefix;
223*f6dc9357SAndroid Build Coastguard Worker }
224*f6dc9357SAndroid Build Coastguard Worker
225*f6dc9357SAndroid Build Coastguard Worker
GetCoderClass(Func_GetMethodProperty getMethodProperty,UInt32 index,PROPID propId,CLSID & clsId,bool & isAssigned)226*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetCoderClass(Func_GetMethodProperty getMethodProperty, UInt32 index,
227*f6dc9357SAndroid Build Coastguard Worker PROPID propId, CLSID &clsId, bool &isAssigned)
228*f6dc9357SAndroid Build Coastguard Worker {
229*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
230*f6dc9357SAndroid Build Coastguard Worker isAssigned = false;
231*f6dc9357SAndroid Build Coastguard Worker RINOK(getMethodProperty(index, propId, &prop))
232*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
233*f6dc9357SAndroid Build Coastguard Worker {
234*f6dc9357SAndroid Build Coastguard Worker if (::SysStringByteLen(prop.bstrVal) != sizeof(GUID))
235*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
236*f6dc9357SAndroid Build Coastguard Worker isAssigned = true;
237*f6dc9357SAndroid Build Coastguard Worker clsId = *(const GUID *)(const void *)prop.bstrVal;
238*f6dc9357SAndroid Build Coastguard Worker }
239*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
240*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
241*f6dc9357SAndroid Build Coastguard Worker return S_OK;
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker
244*f6dc9357SAndroid Build Coastguard Worker
GetMethodBoolProp(Func_GetMethodProperty getMethodProperty,UInt32 index,PROPID propId,bool & resVal,bool & isAssigned)245*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetMethodBoolProp(Func_GetMethodProperty getMethodProperty, UInt32 index,
246*f6dc9357SAndroid Build Coastguard Worker PROPID propId, bool &resVal, bool &isAssigned)
247*f6dc9357SAndroid Build Coastguard Worker {
248*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
249*f6dc9357SAndroid Build Coastguard Worker resVal = false;
250*f6dc9357SAndroid Build Coastguard Worker isAssigned = false;
251*f6dc9357SAndroid Build Coastguard Worker RINOK(getMethodProperty(index, propId, &prop))
252*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BOOL)
253*f6dc9357SAndroid Build Coastguard Worker {
254*f6dc9357SAndroid Build Coastguard Worker isAssigned = true;
255*f6dc9357SAndroid Build Coastguard Worker resVal = VARIANT_BOOLToBool(prop.boolVal);
256*f6dc9357SAndroid Build Coastguard Worker }
257*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
258*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
259*f6dc9357SAndroid Build Coastguard Worker return S_OK;
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker #if defined(__clang__)
263*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wc++98-compat-pedantic"
264*f6dc9357SAndroid Build Coastguard Worker #endif
265*f6dc9357SAndroid Build Coastguard Worker
266*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
267*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
268*f6dc9357SAndroid Build Coastguard Worker #endif
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker #define MY_GET_FUNC(dest, type, lib, func) \
271*f6dc9357SAndroid Build Coastguard Worker dest = Z7_GET_PROC_ADDRESS(type, lib.Get_HMODULE(), func);
272*f6dc9357SAndroid Build Coastguard Worker // #define MY_GET_FUNC(dest, type, func) dest = (type)(func);
273*f6dc9357SAndroid Build Coastguard Worker
274*f6dc9357SAndroid Build Coastguard Worker #define MY_GET_FUNC_LOC(dest, type, lib, func) \
275*f6dc9357SAndroid Build Coastguard Worker type dest; MY_GET_FUNC(dest, type, lib, func)
276*f6dc9357SAndroid Build Coastguard Worker
LoadCodecs()277*f6dc9357SAndroid Build Coastguard Worker HRESULT CCodecs::LoadCodecs()
278*f6dc9357SAndroid Build Coastguard Worker {
279*f6dc9357SAndroid Build Coastguard Worker CCodecLib &lib = Libs.Back();
280*f6dc9357SAndroid Build Coastguard Worker
281*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC (lib.CreateDecoder, Func_CreateDecoder, lib.Lib, "CreateDecoder")
282*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC (lib.CreateEncoder, Func_CreateEncoder, lib.Lib, "CreateEncoder")
283*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC (lib.GetMethodProperty, Func_GetMethodProperty, lib.Lib, "GetMethodProperty")
284*f6dc9357SAndroid Build Coastguard Worker
285*f6dc9357SAndroid Build Coastguard Worker if (lib.GetMethodProperty)
286*f6dc9357SAndroid Build Coastguard Worker {
287*f6dc9357SAndroid Build Coastguard Worker UInt32 numMethods = 1;
288*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (getNumberOfMethods, Func_GetNumberOfMethods, lib.Lib, "GetNumberOfMethods")
289*f6dc9357SAndroid Build Coastguard Worker if (getNumberOfMethods)
290*f6dc9357SAndroid Build Coastguard Worker {
291*f6dc9357SAndroid Build Coastguard Worker RINOK(getNumberOfMethods(&numMethods))
292*f6dc9357SAndroid Build Coastguard Worker }
293*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numMethods; i++)
294*f6dc9357SAndroid Build Coastguard Worker {
295*f6dc9357SAndroid Build Coastguard Worker CDllCodecInfo info;
296*f6dc9357SAndroid Build Coastguard Worker info.LibIndex = Libs.Size() - 1;
297*f6dc9357SAndroid Build Coastguard Worker info.CodecIndex = i;
298*f6dc9357SAndroid Build Coastguard Worker RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kEncoder, info.Encoder, info.EncoderIsAssigned))
299*f6dc9357SAndroid Build Coastguard Worker RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kDecoder, info.Decoder, info.DecoderIsAssigned))
300*f6dc9357SAndroid Build Coastguard Worker RINOK(GetMethodBoolProp(lib.GetMethodProperty, i, NMethodPropID::kIsFilter, info.IsFilter, info.IsFilter_Assigned))
301*f6dc9357SAndroid Build Coastguard Worker Codecs.Add(info);
302*f6dc9357SAndroid Build Coastguard Worker }
303*f6dc9357SAndroid Build Coastguard Worker }
304*f6dc9357SAndroid Build Coastguard Worker
305*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (getHashers, Func_GetHashers, lib.Lib, "GetHashers")
306*f6dc9357SAndroid Build Coastguard Worker if (getHashers)
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker RINOK(getHashers(&lib.ComHashers))
309*f6dc9357SAndroid Build Coastguard Worker if (lib.ComHashers)
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker UInt32 numMethods = lib.ComHashers->GetNumHashers();
312*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numMethods; i++)
313*f6dc9357SAndroid Build Coastguard Worker {
314*f6dc9357SAndroid Build Coastguard Worker CDllHasherInfo info;
315*f6dc9357SAndroid Build Coastguard Worker info.LibIndex = Libs.Size() - 1;
316*f6dc9357SAndroid Build Coastguard Worker info.HasherIndex = i;
317*f6dc9357SAndroid Build Coastguard Worker Hashers.Add(info);
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker }
320*f6dc9357SAndroid Build Coastguard Worker }
321*f6dc9357SAndroid Build Coastguard Worker
322*f6dc9357SAndroid Build Coastguard Worker return S_OK;
323*f6dc9357SAndroid Build Coastguard Worker }
324*f6dc9357SAndroid Build Coastguard Worker
GetProp(Func_GetHandlerProperty getProp,Func_GetHandlerProperty2 getProp2,UInt32 index,PROPID propID,NCOM::CPropVariant & prop)325*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetProp(
326*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty getProp,
327*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty2 getProp2,
328*f6dc9357SAndroid Build Coastguard Worker UInt32 index, PROPID propID, NCOM::CPropVariant &prop)
329*f6dc9357SAndroid Build Coastguard Worker {
330*f6dc9357SAndroid Build Coastguard Worker if (getProp2)
331*f6dc9357SAndroid Build Coastguard Worker return getProp2(index, propID, &prop);
332*f6dc9357SAndroid Build Coastguard Worker return getProp(propID, &prop);
333*f6dc9357SAndroid Build Coastguard Worker }
334*f6dc9357SAndroid Build Coastguard Worker
GetProp_Bool(Func_GetHandlerProperty getProp,Func_GetHandlerProperty2 getProp2,UInt32 index,PROPID propID,bool & res)335*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetProp_Bool(
336*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty getProp,
337*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty2 getProp2,
338*f6dc9357SAndroid Build Coastguard Worker UInt32 index, PROPID propID, bool &res)
339*f6dc9357SAndroid Build Coastguard Worker {
340*f6dc9357SAndroid Build Coastguard Worker res = false;
341*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
342*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp(getProp, getProp2, index, propID, prop))
343*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BOOL)
344*f6dc9357SAndroid Build Coastguard Worker res = VARIANT_BOOLToBool(prop.boolVal);
345*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
346*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
347*f6dc9357SAndroid Build Coastguard Worker return S_OK;
348*f6dc9357SAndroid Build Coastguard Worker }
349*f6dc9357SAndroid Build Coastguard Worker
GetProp_UInt32(Func_GetHandlerProperty getProp,Func_GetHandlerProperty2 getProp2,UInt32 index,PROPID propID,UInt32 & res,bool & defined)350*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetProp_UInt32(
351*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty getProp,
352*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty2 getProp2,
353*f6dc9357SAndroid Build Coastguard Worker UInt32 index, PROPID propID, UInt32 &res, bool &defined)
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker res = 0;
356*f6dc9357SAndroid Build Coastguard Worker defined = false;
357*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
358*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp(getProp, getProp2, index, propID, prop))
359*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
360*f6dc9357SAndroid Build Coastguard Worker {
361*f6dc9357SAndroid Build Coastguard Worker res = prop.ulVal;
362*f6dc9357SAndroid Build Coastguard Worker defined = true;
363*f6dc9357SAndroid Build Coastguard Worker }
364*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
365*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
366*f6dc9357SAndroid Build Coastguard Worker return S_OK;
367*f6dc9357SAndroid Build Coastguard Worker }
368*f6dc9357SAndroid Build Coastguard Worker
GetProp_String(Func_GetHandlerProperty getProp,Func_GetHandlerProperty2 getProp2,UInt32 index,PROPID propID,UString & res)369*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetProp_String(
370*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty getProp,
371*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty2 getProp2,
372*f6dc9357SAndroid Build Coastguard Worker UInt32 index, PROPID propID, UString &res)
373*f6dc9357SAndroid Build Coastguard Worker {
374*f6dc9357SAndroid Build Coastguard Worker res.Empty();
375*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
376*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp(getProp, getProp2, index, propID, prop))
377*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
378*f6dc9357SAndroid Build Coastguard Worker res.SetFromBstr(prop.bstrVal);
379*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
380*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
381*f6dc9357SAndroid Build Coastguard Worker return S_OK;
382*f6dc9357SAndroid Build Coastguard Worker }
383*f6dc9357SAndroid Build Coastguard Worker
GetProp_RawData(Func_GetHandlerProperty getProp,Func_GetHandlerProperty2 getProp2,UInt32 index,PROPID propID,CByteBuffer & bb)384*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetProp_RawData(
385*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty getProp,
386*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty2 getProp2,
387*f6dc9357SAndroid Build Coastguard Worker UInt32 index, PROPID propID, CByteBuffer &bb)
388*f6dc9357SAndroid Build Coastguard Worker {
389*f6dc9357SAndroid Build Coastguard Worker bb.Free();
390*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
391*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp(getProp, getProp2, index, propID, prop))
392*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
393*f6dc9357SAndroid Build Coastguard Worker {
394*f6dc9357SAndroid Build Coastguard Worker UINT len = ::SysStringByteLen(prop.bstrVal);
395*f6dc9357SAndroid Build Coastguard Worker bb.CopyFrom((const Byte *)prop.bstrVal, len);
396*f6dc9357SAndroid Build Coastguard Worker }
397*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
398*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
399*f6dc9357SAndroid Build Coastguard Worker return S_OK;
400*f6dc9357SAndroid Build Coastguard Worker }
401*f6dc9357SAndroid Build Coastguard Worker
402*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kArcFlagsPars[] =
403*f6dc9357SAndroid Build Coastguard Worker {
404*f6dc9357SAndroid Build Coastguard Worker NArchive::NHandlerPropID::kKeepName, NArcInfoFlags::kKeepName,
405*f6dc9357SAndroid Build Coastguard Worker NArchive::NHandlerPropID::kAltStreams, NArcInfoFlags::kAltStreams,
406*f6dc9357SAndroid Build Coastguard Worker NArchive::NHandlerPropID::kNtSecure, NArcInfoFlags::kNtSecure
407*f6dc9357SAndroid Build Coastguard Worker };
408*f6dc9357SAndroid Build Coastguard Worker
LoadFormats()409*f6dc9357SAndroid Build Coastguard Worker HRESULT CCodecs::LoadFormats()
410*f6dc9357SAndroid Build Coastguard Worker {
411*f6dc9357SAndroid Build Coastguard Worker const NDLL::CLibrary &lib = Libs.Back().Lib;
412*f6dc9357SAndroid Build Coastguard Worker
413*f6dc9357SAndroid Build Coastguard Worker Func_GetHandlerProperty getProp = NULL;
414*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (getProp2, Func_GetHandlerProperty2, lib, "GetHandlerProperty2")
415*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (getIsArc, Func_GetIsArc, lib, "GetIsArc")
416*f6dc9357SAndroid Build Coastguard Worker
417*f6dc9357SAndroid Build Coastguard Worker UInt32 numFormats = 1;
418*f6dc9357SAndroid Build Coastguard Worker
419*f6dc9357SAndroid Build Coastguard Worker if (getProp2)
420*f6dc9357SAndroid Build Coastguard Worker {
421*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (getNumberOfFormats, Func_GetNumberOfFormats, lib, "GetNumberOfFormats")
422*f6dc9357SAndroid Build Coastguard Worker if (getNumberOfFormats)
423*f6dc9357SAndroid Build Coastguard Worker {
424*f6dc9357SAndroid Build Coastguard Worker RINOK(getNumberOfFormats(&numFormats))
425*f6dc9357SAndroid Build Coastguard Worker }
426*f6dc9357SAndroid Build Coastguard Worker }
427*f6dc9357SAndroid Build Coastguard Worker else
428*f6dc9357SAndroid Build Coastguard Worker {
429*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC (getProp, Func_GetHandlerProperty, lib, "GetHandlerProperty")
430*f6dc9357SAndroid Build Coastguard Worker if (!getProp)
431*f6dc9357SAndroid Build Coastguard Worker return S_OK;
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker
434*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numFormats; i++)
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker CArcInfoEx item;
437*f6dc9357SAndroid Build Coastguard Worker item.LibIndex = (int)(Libs.Size() - 1);
438*f6dc9357SAndroid Build Coastguard Worker item.FormatIndex = i;
439*f6dc9357SAndroid Build Coastguard Worker
440*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_String(getProp, getProp2, i, NArchive::NHandlerPropID::kName, item.Name))
441*f6dc9357SAndroid Build Coastguard Worker
442*f6dc9357SAndroid Build Coastguard Worker {
443*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
444*f6dc9357SAndroid Build Coastguard Worker if (GetProp(getProp, getProp2, i, NArchive::NHandlerPropID::kClassID, prop) != S_OK)
445*f6dc9357SAndroid Build Coastguard Worker continue;
446*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_BSTR)
447*f6dc9357SAndroid Build Coastguard Worker continue;
448*f6dc9357SAndroid Build Coastguard Worker if (::SysStringByteLen(prop.bstrVal) != sizeof(GUID))
449*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
450*f6dc9357SAndroid Build Coastguard Worker item.ClassID = *(const GUID *)(const void *)prop.bstrVal;
451*f6dc9357SAndroid Build Coastguard Worker prop.Clear();
452*f6dc9357SAndroid Build Coastguard Worker }
453*f6dc9357SAndroid Build Coastguard Worker
454*f6dc9357SAndroid Build Coastguard Worker UString ext, addExt;
455*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_String(getProp, getProp2, i, NArchive::NHandlerPropID::kExtension, ext))
456*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_String(getProp, getProp2, i, NArchive::NHandlerPropID::kAddExtension, addExt))
457*f6dc9357SAndroid Build Coastguard Worker item.AddExts(ext, addExt);
458*f6dc9357SAndroid Build Coastguard Worker
459*f6dc9357SAndroid Build Coastguard Worker GetProp_Bool(getProp, getProp2, i, NArchive::NHandlerPropID::kUpdate, item.UpdateEnabled);
460*f6dc9357SAndroid Build Coastguard Worker bool flags_Defined = false;
461*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kFlags, item.Flags, flags_Defined))
462*f6dc9357SAndroid Build Coastguard Worker item.NewInterface = flags_Defined;
463*f6dc9357SAndroid Build Coastguard Worker if (!flags_Defined) // && item.UpdateEnabled
464*f6dc9357SAndroid Build Coastguard Worker {
465*f6dc9357SAndroid Build Coastguard Worker // support for DLL version before 9.31:
466*f6dc9357SAndroid Build Coastguard Worker for (unsigned j = 0; j < Z7_ARRAY_SIZE(kArcFlagsPars); j += 2)
467*f6dc9357SAndroid Build Coastguard Worker {
468*f6dc9357SAndroid Build Coastguard Worker bool val = false;
469*f6dc9357SAndroid Build Coastguard Worker GetProp_Bool(getProp, getProp2, i, kArcFlagsPars[j], val);
470*f6dc9357SAndroid Build Coastguard Worker if (val)
471*f6dc9357SAndroid Build Coastguard Worker item.Flags |= kArcFlagsPars[j + 1];
472*f6dc9357SAndroid Build Coastguard Worker }
473*f6dc9357SAndroid Build Coastguard Worker }
474*f6dc9357SAndroid Build Coastguard Worker
475*f6dc9357SAndroid Build Coastguard Worker {
476*f6dc9357SAndroid Build Coastguard Worker bool defined = false;
477*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kTimeFlags, item.TimeFlags, defined))
478*f6dc9357SAndroid Build Coastguard Worker }
479*f6dc9357SAndroid Build Coastguard Worker
480*f6dc9357SAndroid Build Coastguard Worker CByteBuffer sig;
481*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_RawData(getProp, getProp2, i, NArchive::NHandlerPropID::kSignature, sig))
482*f6dc9357SAndroid Build Coastguard Worker if (sig.Size() != 0)
483*f6dc9357SAndroid Build Coastguard Worker item.Signatures.Add(sig);
484*f6dc9357SAndroid Build Coastguard Worker else
485*f6dc9357SAndroid Build Coastguard Worker {
486*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_RawData(getProp, getProp2, i, NArchive::NHandlerPropID::kMultiSignature, sig))
487*f6dc9357SAndroid Build Coastguard Worker ParseSignatures(sig, (unsigned)sig.Size(), item.Signatures);
488*f6dc9357SAndroid Build Coastguard Worker }
489*f6dc9357SAndroid Build Coastguard Worker
490*f6dc9357SAndroid Build Coastguard Worker bool signatureOffset_Defined;
491*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kSignatureOffset, item.SignatureOffset, signatureOffset_Defined))
492*f6dc9357SAndroid Build Coastguard Worker
493*f6dc9357SAndroid Build Coastguard Worker // bool version_Defined;
494*f6dc9357SAndroid Build Coastguard Worker // RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kVersion, item.Version, version_Defined));
495*f6dc9357SAndroid Build Coastguard Worker
496*f6dc9357SAndroid Build Coastguard Worker if (getIsArc)
497*f6dc9357SAndroid Build Coastguard Worker getIsArc(i, &item.IsArcFunc);
498*f6dc9357SAndroid Build Coastguard Worker
499*f6dc9357SAndroid Build Coastguard Worker Formats.Add(item);
500*f6dc9357SAndroid Build Coastguard Worker }
501*f6dc9357SAndroid Build Coastguard Worker return S_OK;
502*f6dc9357SAndroid Build Coastguard Worker }
503*f6dc9357SAndroid Build Coastguard Worker
504*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LARGE_PAGES
505*f6dc9357SAndroid Build Coastguard Worker extern "C"
506*f6dc9357SAndroid Build Coastguard Worker {
507*f6dc9357SAndroid Build Coastguard Worker extern SIZE_T g_LargePageSize;
508*f6dc9357SAndroid Build Coastguard Worker }
509*f6dc9357SAndroid Build Coastguard Worker #endif
510*f6dc9357SAndroid Build Coastguard Worker
511*f6dc9357SAndroid Build Coastguard Worker
AddLastError(const FString & path)512*f6dc9357SAndroid Build Coastguard Worker void CCodecs::AddLastError(const FString &path)
513*f6dc9357SAndroid Build Coastguard Worker {
514*f6dc9357SAndroid Build Coastguard Worker const HRESULT res = GetLastError_noZero_HRESULT();
515*f6dc9357SAndroid Build Coastguard Worker CCodecError &error = Errors.AddNew();
516*f6dc9357SAndroid Build Coastguard Worker error.Path = path;
517*f6dc9357SAndroid Build Coastguard Worker error.ErrorCode = res;
518*f6dc9357SAndroid Build Coastguard Worker }
519*f6dc9357SAndroid Build Coastguard Worker
520*f6dc9357SAndroid Build Coastguard Worker
IsSupportedDll(CCodecLib & lib)521*f6dc9357SAndroid Build Coastguard Worker static bool IsSupportedDll(CCodecLib &lib)
522*f6dc9357SAndroid Build Coastguard Worker {
523*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (
524*f6dc9357SAndroid Build Coastguard Worker f_GetModuleProp,
525*f6dc9357SAndroid Build Coastguard Worker Func_GetModuleProp, lib.Lib,
526*f6dc9357SAndroid Build Coastguard Worker "GetModuleProp")
527*f6dc9357SAndroid Build Coastguard Worker /* p7zip and 7-Zip before v23 used virtual destructor in IUnknown,
528*f6dc9357SAndroid Build Coastguard Worker if _WIN32 is not defined */
529*f6dc9357SAndroid Build Coastguard Worker UInt32 flags =
530*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
531*f6dc9357SAndroid Build Coastguard Worker NModuleInterfaceType::k_IUnknown_VirtDestructor_No;
532*f6dc9357SAndroid Build Coastguard Worker #else
533*f6dc9357SAndroid Build Coastguard Worker NModuleInterfaceType::k_IUnknown_VirtDestructor_Yes;
534*f6dc9357SAndroid Build Coastguard Worker #endif
535*f6dc9357SAndroid Build Coastguard Worker if (f_GetModuleProp)
536*f6dc9357SAndroid Build Coastguard Worker {
537*f6dc9357SAndroid Build Coastguard Worker {
538*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
539*f6dc9357SAndroid Build Coastguard Worker if (f_GetModuleProp(NModulePropID::kInterfaceType, &prop) == S_OK)
540*f6dc9357SAndroid Build Coastguard Worker {
541*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
542*f6dc9357SAndroid Build Coastguard Worker flags = prop.ulVal;
543*f6dc9357SAndroid Build Coastguard Worker else if (prop.vt != VT_EMPTY)
544*f6dc9357SAndroid Build Coastguard Worker return false;
545*f6dc9357SAndroid Build Coastguard Worker }
546*f6dc9357SAndroid Build Coastguard Worker }
547*f6dc9357SAndroid Build Coastguard Worker {
548*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
549*f6dc9357SAndroid Build Coastguard Worker if (f_GetModuleProp(NModulePropID::kVersion, &prop) == S_OK)
550*f6dc9357SAndroid Build Coastguard Worker {
551*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
552*f6dc9357SAndroid Build Coastguard Worker lib.Version = prop.ulVal;
553*f6dc9357SAndroid Build Coastguard Worker }
554*f6dc9357SAndroid Build Coastguard Worker }
555*f6dc9357SAndroid Build Coastguard Worker }
556*f6dc9357SAndroid Build Coastguard Worker if (
557*f6dc9357SAndroid Build Coastguard Worker flags
558*f6dc9357SAndroid Build Coastguard Worker // (flags & NModuleFlags::kMask)
559*f6dc9357SAndroid Build Coastguard Worker != NModuleInterfaceType::k_IUnknown_VirtDestructor_ThisModule)
560*f6dc9357SAndroid Build Coastguard Worker return false;
561*f6dc9357SAndroid Build Coastguard Worker return true;
562*f6dc9357SAndroid Build Coastguard Worker }
563*f6dc9357SAndroid Build Coastguard Worker
564*f6dc9357SAndroid Build Coastguard Worker
LoadDll(const FString & dllPath,bool needCheckDll,bool * loadedOK)565*f6dc9357SAndroid Build Coastguard Worker HRESULT CCodecs::LoadDll(const FString &dllPath, bool needCheckDll, bool *loadedOK)
566*f6dc9357SAndroid Build Coastguard Worker {
567*f6dc9357SAndroid Build Coastguard Worker if (loadedOK)
568*f6dc9357SAndroid Build Coastguard Worker *loadedOK = false;
569*f6dc9357SAndroid Build Coastguard Worker
570*f6dc9357SAndroid Build Coastguard Worker // needCheckDll = 1;
571*f6dc9357SAndroid Build Coastguard Worker
572*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
573*f6dc9357SAndroid Build Coastguard Worker if (needCheckDll)
574*f6dc9357SAndroid Build Coastguard Worker {
575*f6dc9357SAndroid Build Coastguard Worker NDLL::CLibrary lib;
576*f6dc9357SAndroid Build Coastguard Worker if (!lib.LoadEx(dllPath, LOAD_LIBRARY_AS_DATAFILE))
577*f6dc9357SAndroid Build Coastguard Worker {
578*f6dc9357SAndroid Build Coastguard Worker /* if is not win32
579*f6dc9357SAndroid Build Coastguard Worker // %1 is not a valid Win32 application.
580*f6dc9357SAndroid Build Coastguard Worker // #define ERROR_BAD_EXE_FORMAT 193L
581*f6dc9357SAndroid Build Coastguard Worker */
582*f6dc9357SAndroid Build Coastguard Worker // return GetLastError_noZero_HRESULT();
583*f6dc9357SAndroid Build Coastguard Worker const DWORD lastError = GetLastError();
584*f6dc9357SAndroid Build Coastguard Worker if (lastError != ERROR_BAD_EXE_FORMAT)
585*f6dc9357SAndroid Build Coastguard Worker {
586*f6dc9357SAndroid Build Coastguard Worker CCodecError &error = Errors.AddNew();
587*f6dc9357SAndroid Build Coastguard Worker error.Path = dllPath;
588*f6dc9357SAndroid Build Coastguard Worker error.Message = "cannot load file as datafile library";
589*f6dc9357SAndroid Build Coastguard Worker error.ErrorCode = HRESULT_FROM_WIN32(lastError);
590*f6dc9357SAndroid Build Coastguard Worker }
591*f6dc9357SAndroid Build Coastguard Worker return S_OK;
592*f6dc9357SAndroid Build Coastguard Worker }
593*f6dc9357SAndroid Build Coastguard Worker }
594*f6dc9357SAndroid Build Coastguard Worker #else
595*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(needCheckDll)
596*f6dc9357SAndroid Build Coastguard Worker #endif
597*f6dc9357SAndroid Build Coastguard Worker
598*f6dc9357SAndroid Build Coastguard Worker Libs.AddNew();
599*f6dc9357SAndroid Build Coastguard Worker CCodecLib &lib = Libs.Back();
600*f6dc9357SAndroid Build Coastguard Worker lib.Path = dllPath;
601*f6dc9357SAndroid Build Coastguard Worker bool used = false;
602*f6dc9357SAndroid Build Coastguard Worker // HRESULT res = S_OK;
603*f6dc9357SAndroid Build Coastguard Worker
604*f6dc9357SAndroid Build Coastguard Worker if (lib.Lib.Load(dllPath))
605*f6dc9357SAndroid Build Coastguard Worker {
606*f6dc9357SAndroid Build Coastguard Worker if (!IsSupportedDll(lib))
607*f6dc9357SAndroid Build Coastguard Worker {
608*f6dc9357SAndroid Build Coastguard Worker CCodecError &error = Errors.AddNew();
609*f6dc9357SAndroid Build Coastguard Worker error.Path = dllPath;
610*f6dc9357SAndroid Build Coastguard Worker error.Message = "the module is not compatible with program";
611*f6dc9357SAndroid Build Coastguard Worker }
612*f6dc9357SAndroid Build Coastguard Worker else
613*f6dc9357SAndroid Build Coastguard Worker {
614*f6dc9357SAndroid Build Coastguard Worker if (loadedOK)
615*f6dc9357SAndroid Build Coastguard Worker *loadedOK = true;
616*f6dc9357SAndroid Build Coastguard Worker /*
617*f6dc9357SAndroid Build Coastguard Worker #ifdef NEW_FOLDER_INTERFACE
618*f6dc9357SAndroid Build Coastguard Worker lib.LoadIcons();
619*f6dc9357SAndroid Build Coastguard Worker #endif
620*f6dc9357SAndroid Build Coastguard Worker */
621*f6dc9357SAndroid Build Coastguard Worker
622*f6dc9357SAndroid Build Coastguard Worker /*
623*f6dc9357SAndroid Build Coastguard Worker {
624*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (_libStartup, Func_libStartup, lib.Lib, "LibStartup")
625*f6dc9357SAndroid Build Coastguard Worker if (_libStartup)
626*f6dc9357SAndroid Build Coastguard Worker {
627*f6dc9357SAndroid Build Coastguard Worker HRESULT res = _libStartup();
628*f6dc9357SAndroid Build Coastguard Worker if (res != 0)
629*f6dc9357SAndroid Build Coastguard Worker {
630*f6dc9357SAndroid Build Coastguard Worker CCodecError &error = Errors.AddNew();
631*f6dc9357SAndroid Build Coastguard Worker error.Path = dllPath;
632*f6dc9357SAndroid Build Coastguard Worker error.ErrorCode = res;
633*f6dc9357SAndroid Build Coastguard Worker }
634*f6dc9357SAndroid Build Coastguard Worker }
635*f6dc9357SAndroid Build Coastguard Worker }
636*f6dc9357SAndroid Build Coastguard Worker */
637*f6dc9357SAndroid Build Coastguard Worker
638*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LARGE_PAGES
639*f6dc9357SAndroid Build Coastguard Worker if (g_LargePageSize != 0)
640*f6dc9357SAndroid Build Coastguard Worker {
641*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (setLargePageMode, Func_SetLargePageMode, lib.Lib, "SetLargePageMode")
642*f6dc9357SAndroid Build Coastguard Worker if (setLargePageMode)
643*f6dc9357SAndroid Build Coastguard Worker setLargePageMode();
644*f6dc9357SAndroid Build Coastguard Worker }
645*f6dc9357SAndroid Build Coastguard Worker #endif
646*f6dc9357SAndroid Build Coastguard Worker
647*f6dc9357SAndroid Build Coastguard Worker if (CaseSensitive_Change)
648*f6dc9357SAndroid Build Coastguard Worker {
649*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (setCaseSensitive, Func_SetCaseSensitive, lib.Lib, "SetCaseSensitive")
650*f6dc9357SAndroid Build Coastguard Worker if (setCaseSensitive)
651*f6dc9357SAndroid Build Coastguard Worker setCaseSensitive(CaseSensitive ? 1 : 0);
652*f6dc9357SAndroid Build Coastguard Worker }
653*f6dc9357SAndroid Build Coastguard Worker
654*f6dc9357SAndroid Build Coastguard Worker /*
655*f6dc9357SAndroid Build Coastguard Worker {
656*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC_LOC (setClientVersion, Func_SetClientVersion, lib.Lib, "SetClientVersion")
657*f6dc9357SAndroid Build Coastguard Worker if (setClientVersion)
658*f6dc9357SAndroid Build Coastguard Worker {
659*f6dc9357SAndroid Build Coastguard Worker // const UInt32 kVersion = (MY_VER_MAJOR << 16) | MY_VER_MINOR;
660*f6dc9357SAndroid Build Coastguard Worker setClientVersion(g_ClientVersion);
661*f6dc9357SAndroid Build Coastguard Worker }
662*f6dc9357SAndroid Build Coastguard Worker }
663*f6dc9357SAndroid Build Coastguard Worker */
664*f6dc9357SAndroid Build Coastguard Worker
665*f6dc9357SAndroid Build Coastguard Worker
666*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC (lib.CreateObject, Func_CreateObject, lib.Lib, "CreateObject")
667*f6dc9357SAndroid Build Coastguard Worker {
668*f6dc9357SAndroid Build Coastguard Worker unsigned startSize = Codecs.Size() + Hashers.Size();
669*f6dc9357SAndroid Build Coastguard Worker HRESULT res = LoadCodecs();
670*f6dc9357SAndroid Build Coastguard Worker if (startSize != Codecs.Size() + Hashers.Size())
671*f6dc9357SAndroid Build Coastguard Worker used = true;
672*f6dc9357SAndroid Build Coastguard Worker if (res == S_OK && lib.CreateObject)
673*f6dc9357SAndroid Build Coastguard Worker {
674*f6dc9357SAndroid Build Coastguard Worker startSize = Formats.Size();
675*f6dc9357SAndroid Build Coastguard Worker res = LoadFormats();
676*f6dc9357SAndroid Build Coastguard Worker if (startSize != Formats.Size())
677*f6dc9357SAndroid Build Coastguard Worker used = true;
678*f6dc9357SAndroid Build Coastguard Worker }
679*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
680*f6dc9357SAndroid Build Coastguard Worker {
681*f6dc9357SAndroid Build Coastguard Worker CCodecError &error = Errors.AddNew();
682*f6dc9357SAndroid Build Coastguard Worker error.Path = dllPath;
683*f6dc9357SAndroid Build Coastguard Worker error.ErrorCode = res;
684*f6dc9357SAndroid Build Coastguard Worker }
685*f6dc9357SAndroid Build Coastguard Worker }
686*f6dc9357SAndroid Build Coastguard Worker // plugins can use non-7-zip dlls, so we silently ignore non7zip DLLs
687*f6dc9357SAndroid Build Coastguard Worker /*
688*f6dc9357SAndroid Build Coastguard Worker if (!used)
689*f6dc9357SAndroid Build Coastguard Worker {
690*f6dc9357SAndroid Build Coastguard Worker CCodecError &error = Errors.AddNew();
691*f6dc9357SAndroid Build Coastguard Worker error.Path = dllPath;
692*f6dc9357SAndroid Build Coastguard Worker error.Message = "no 7-Zip code";
693*f6dc9357SAndroid Build Coastguard Worker }
694*f6dc9357SAndroid Build Coastguard Worker */
695*f6dc9357SAndroid Build Coastguard Worker }
696*f6dc9357SAndroid Build Coastguard Worker }
697*f6dc9357SAndroid Build Coastguard Worker else
698*f6dc9357SAndroid Build Coastguard Worker {
699*f6dc9357SAndroid Build Coastguard Worker AddLastError(dllPath);
700*f6dc9357SAndroid Build Coastguard Worker }
701*f6dc9357SAndroid Build Coastguard Worker
702*f6dc9357SAndroid Build Coastguard Worker if (!used)
703*f6dc9357SAndroid Build Coastguard Worker Libs.DeleteBack();
704*f6dc9357SAndroid Build Coastguard Worker
705*f6dc9357SAndroid Build Coastguard Worker return S_OK;
706*f6dc9357SAndroid Build Coastguard Worker }
707*f6dc9357SAndroid Build Coastguard Worker
LoadDllsFromFolder(const FString & folderPath)708*f6dc9357SAndroid Build Coastguard Worker HRESULT CCodecs::LoadDllsFromFolder(const FString &folderPath)
709*f6dc9357SAndroid Build Coastguard Worker {
710*f6dc9357SAndroid Build Coastguard Worker if (!NFile::NFind::DoesDirExist_FollowLink(folderPath))
711*f6dc9357SAndroid Build Coastguard Worker // if (!NFile::NFind::DoesDirExist(folderPath))
712*f6dc9357SAndroid Build Coastguard Worker {
713*f6dc9357SAndroid Build Coastguard Worker // AddLastError(folderPath);
714*f6dc9357SAndroid Build Coastguard Worker return S_OK;
715*f6dc9357SAndroid Build Coastguard Worker }
716*f6dc9357SAndroid Build Coastguard Worker
717*f6dc9357SAndroid Build Coastguard Worker FString folderPrefix = folderPath;
718*f6dc9357SAndroid Build Coastguard Worker folderPrefix.Add_PathSepar();
719*f6dc9357SAndroid Build Coastguard Worker
720*f6dc9357SAndroid Build Coastguard Worker NFile::NFind::CEnumerator enumerator;
721*f6dc9357SAndroid Build Coastguard Worker enumerator.SetDirPrefix(folderPrefix);
722*f6dc9357SAndroid Build Coastguard Worker NFile::NFind::CDirEntry fi;
723*f6dc9357SAndroid Build Coastguard Worker for (;;)
724*f6dc9357SAndroid Build Coastguard Worker {
725*f6dc9357SAndroid Build Coastguard Worker bool found;
726*f6dc9357SAndroid Build Coastguard Worker if (!enumerator.Next(fi, found))
727*f6dc9357SAndroid Build Coastguard Worker {
728*f6dc9357SAndroid Build Coastguard Worker // it can be wrong Symbolic link to folder here
729*f6dc9357SAndroid Build Coastguard Worker AddLastError(folderPath);
730*f6dc9357SAndroid Build Coastguard Worker break;
731*f6dc9357SAndroid Build Coastguard Worker // return GetLastError_noZero_HRESULT();
732*f6dc9357SAndroid Build Coastguard Worker }
733*f6dc9357SAndroid Build Coastguard Worker if (!found)
734*f6dc9357SAndroid Build Coastguard Worker break;
735*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
736*f6dc9357SAndroid Build Coastguard Worker if (fi.IsDir())
737*f6dc9357SAndroid Build Coastguard Worker continue;
738*f6dc9357SAndroid Build Coastguard Worker #else
739*f6dc9357SAndroid Build Coastguard Worker if (enumerator.DirEntry_IsDir(fi, true)) // followLink
740*f6dc9357SAndroid Build Coastguard Worker continue;
741*f6dc9357SAndroid Build Coastguard Worker #endif
742*f6dc9357SAndroid Build Coastguard Worker
743*f6dc9357SAndroid Build Coastguard Worker RINOK(LoadDll(folderPrefix + fi.Name, true))
744*f6dc9357SAndroid Build Coastguard Worker }
745*f6dc9357SAndroid Build Coastguard Worker return S_OK;
746*f6dc9357SAndroid Build Coastguard Worker }
747*f6dc9357SAndroid Build Coastguard Worker
CloseLibs()748*f6dc9357SAndroid Build Coastguard Worker void CCodecs::CloseLibs()
749*f6dc9357SAndroid Build Coastguard Worker {
750*f6dc9357SAndroid Build Coastguard Worker // OutputDebugStringA("~CloseLibs start");
751*f6dc9357SAndroid Build Coastguard Worker /*
752*f6dc9357SAndroid Build Coastguard Worker WIN32: FreeLibrary() (CLibrary::Free()) function doesn't work as expected,
753*f6dc9357SAndroid Build Coastguard Worker if it's called from another FreeLibrary() call.
754*f6dc9357SAndroid Build Coastguard Worker So we need to call FreeLibrary() before global destructors.
755*f6dc9357SAndroid Build Coastguard Worker
756*f6dc9357SAndroid Build Coastguard Worker Also we free global links from DLLs to object of this module before CLibrary::Free() call.
757*f6dc9357SAndroid Build Coastguard Worker */
758*f6dc9357SAndroid Build Coastguard Worker
759*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, Libs)
760*f6dc9357SAndroid Build Coastguard Worker {
761*f6dc9357SAndroid Build Coastguard Worker const CCodecLib &lib = Libs[i];
762*f6dc9357SAndroid Build Coastguard Worker if (lib.SetCodecs)
763*f6dc9357SAndroid Build Coastguard Worker lib.SetCodecs(NULL);
764*f6dc9357SAndroid Build Coastguard Worker }
765*f6dc9357SAndroid Build Coastguard Worker
766*f6dc9357SAndroid Build Coastguard Worker // OutputDebugStringA("~CloseLibs after SetCodecs");
767*f6dc9357SAndroid Build Coastguard Worker Libs.Clear();
768*f6dc9357SAndroid Build Coastguard Worker // OutputDebugStringA("~CloseLibs end");
769*f6dc9357SAndroid Build Coastguard Worker }
770*f6dc9357SAndroid Build Coastguard Worker
771*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_EXTERNAL_CODECS
772*f6dc9357SAndroid Build Coastguard Worker
773*f6dc9357SAndroid Build Coastguard Worker
Load()774*f6dc9357SAndroid Build Coastguard Worker HRESULT CCodecs::Load()
775*f6dc9357SAndroid Build Coastguard Worker {
776*f6dc9357SAndroid Build Coastguard Worker /*
777*f6dc9357SAndroid Build Coastguard Worker #ifdef NEW_FOLDER_INTERFACE
778*f6dc9357SAndroid Build Coastguard Worker InternalIcons.LoadIcons(g_hInstance);
779*f6dc9357SAndroid Build Coastguard Worker #endif
780*f6dc9357SAndroid Build Coastguard Worker */
781*f6dc9357SAndroid Build Coastguard Worker
782*f6dc9357SAndroid Build Coastguard Worker Formats.Clear();
783*f6dc9357SAndroid Build Coastguard Worker
784*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
785*f6dc9357SAndroid Build Coastguard Worker Errors.Clear();
786*f6dc9357SAndroid Build Coastguard Worker MainDll_ErrorPath.Empty();
787*f6dc9357SAndroid Build Coastguard Worker Codecs.Clear();
788*f6dc9357SAndroid Build Coastguard Worker Hashers.Clear();
789*f6dc9357SAndroid Build Coastguard Worker #endif
790*f6dc9357SAndroid Build Coastguard Worker
791*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < g_NumArcs; i++)
792*f6dc9357SAndroid Build Coastguard Worker {
793*f6dc9357SAndroid Build Coastguard Worker const CArcInfo &arc = *g_Arcs[i];
794*f6dc9357SAndroid Build Coastguard Worker CArcInfoEx item;
795*f6dc9357SAndroid Build Coastguard Worker
796*f6dc9357SAndroid Build Coastguard Worker item.Name = arc.Name;
797*f6dc9357SAndroid Build Coastguard Worker item.CreateInArchive = arc.CreateInArchive;
798*f6dc9357SAndroid Build Coastguard Worker item.IsArcFunc = arc.IsArc;
799*f6dc9357SAndroid Build Coastguard Worker item.Flags = arc.Flags;
800*f6dc9357SAndroid Build Coastguard Worker
801*f6dc9357SAndroid Build Coastguard Worker {
802*f6dc9357SAndroid Build Coastguard Worker UString e, ae;
803*f6dc9357SAndroid Build Coastguard Worker if (arc.Ext)
804*f6dc9357SAndroid Build Coastguard Worker e = arc.Ext;
805*f6dc9357SAndroid Build Coastguard Worker if (arc.AddExt)
806*f6dc9357SAndroid Build Coastguard Worker ae = arc.AddExt;
807*f6dc9357SAndroid Build Coastguard Worker item.AddExts(e, ae);
808*f6dc9357SAndroid Build Coastguard Worker }
809*f6dc9357SAndroid Build Coastguard Worker
810*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
811*f6dc9357SAndroid Build Coastguard Worker
812*f6dc9357SAndroid Build Coastguard Worker item.CreateOutArchive = arc.CreateOutArchive;
813*f6dc9357SAndroid Build Coastguard Worker item.UpdateEnabled = (arc.CreateOutArchive != NULL);
814*f6dc9357SAndroid Build Coastguard Worker item.SignatureOffset = arc.SignatureOffset;
815*f6dc9357SAndroid Build Coastguard Worker // item.Version = MY_VER_MIX;
816*f6dc9357SAndroid Build Coastguard Worker item.NewInterface = true;
817*f6dc9357SAndroid Build Coastguard Worker
818*f6dc9357SAndroid Build Coastguard Worker if (arc.IsMultiSignature())
819*f6dc9357SAndroid Build Coastguard Worker ParseSignatures(arc.Signature, arc.SignatureSize, item.Signatures);
820*f6dc9357SAndroid Build Coastguard Worker else
821*f6dc9357SAndroid Build Coastguard Worker {
822*f6dc9357SAndroid Build Coastguard Worker if (arc.SignatureSize != 0) // 21.04
823*f6dc9357SAndroid Build Coastguard Worker item.Signatures.AddNew().CopyFrom(arc.Signature, arc.SignatureSize);
824*f6dc9357SAndroid Build Coastguard Worker }
825*f6dc9357SAndroid Build Coastguard Worker
826*f6dc9357SAndroid Build Coastguard Worker #endif
827*f6dc9357SAndroid Build Coastguard Worker
828*f6dc9357SAndroid Build Coastguard Worker Formats.Add(item);
829*f6dc9357SAndroid Build Coastguard Worker }
830*f6dc9357SAndroid Build Coastguard Worker
831*f6dc9357SAndroid Build Coastguard Worker // printf("\nLoad codecs \n");
832*f6dc9357SAndroid Build Coastguard Worker
833*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
834*f6dc9357SAndroid Build Coastguard Worker const FString baseFolder = GetBaseFolderPrefixFromRegistry();
835*f6dc9357SAndroid Build Coastguard Worker {
836*f6dc9357SAndroid Build Coastguard Worker bool loadedOK;
837*f6dc9357SAndroid Build Coastguard Worker RINOK(LoadDll(baseFolder + kMainDll, false, &loadedOK))
838*f6dc9357SAndroid Build Coastguard Worker if (!loadedOK)
839*f6dc9357SAndroid Build Coastguard Worker MainDll_ErrorPath = kMainDll;
840*f6dc9357SAndroid Build Coastguard Worker }
841*f6dc9357SAndroid Build Coastguard Worker RINOK(LoadDllsFromFolder(baseFolder + kCodecsFolderName))
842*f6dc9357SAndroid Build Coastguard Worker RINOK(LoadDllsFromFolder(baseFolder + kFormatsFolderName))
843*f6dc9357SAndroid Build Coastguard Worker
844*f6dc9357SAndroid Build Coastguard Worker NeedSetLibCodecs = true;
845*f6dc9357SAndroid Build Coastguard Worker
846*f6dc9357SAndroid Build Coastguard Worker if (Libs.Size() == 0)
847*f6dc9357SAndroid Build Coastguard Worker NeedSetLibCodecs = false;
848*f6dc9357SAndroid Build Coastguard Worker else if (Libs.Size() == 1)
849*f6dc9357SAndroid Build Coastguard Worker {
850*f6dc9357SAndroid Build Coastguard Worker // we don't need to set ISetCompressCodecsInfo, if all arcs and codecs are in one external module.
851*f6dc9357SAndroid Build Coastguard Worker #ifndef EXPORT_CODECS
852*f6dc9357SAndroid Build Coastguard Worker if (g_NumArcs == 0)
853*f6dc9357SAndroid Build Coastguard Worker NeedSetLibCodecs = false;
854*f6dc9357SAndroid Build Coastguard Worker #endif
855*f6dc9357SAndroid Build Coastguard Worker }
856*f6dc9357SAndroid Build Coastguard Worker
857*f6dc9357SAndroid Build Coastguard Worker if (NeedSetLibCodecs)
858*f6dc9357SAndroid Build Coastguard Worker {
859*f6dc9357SAndroid Build Coastguard Worker /* 15.00: now we call global function in DLL: SetCompressCodecsInfo(c)
860*f6dc9357SAndroid Build Coastguard Worker old versions called only ISetCompressCodecsInfo::SetCompressCodecsInfo(c) for each archive handler */
861*f6dc9357SAndroid Build Coastguard Worker
862*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, Libs)
863*f6dc9357SAndroid Build Coastguard Worker {
864*f6dc9357SAndroid Build Coastguard Worker CCodecLib &lib = Libs[i];
865*f6dc9357SAndroid Build Coastguard Worker MY_GET_FUNC (lib.SetCodecs, Func_SetCodecs, lib.Lib, "SetCodecs")
866*f6dc9357SAndroid Build Coastguard Worker if (lib.SetCodecs)
867*f6dc9357SAndroid Build Coastguard Worker {
868*f6dc9357SAndroid Build Coastguard Worker RINOK(lib.SetCodecs(this))
869*f6dc9357SAndroid Build Coastguard Worker }
870*f6dc9357SAndroid Build Coastguard Worker }
871*f6dc9357SAndroid Build Coastguard Worker }
872*f6dc9357SAndroid Build Coastguard Worker
873*f6dc9357SAndroid Build Coastguard Worker #endif
874*f6dc9357SAndroid Build Coastguard Worker
875*f6dc9357SAndroid Build Coastguard Worker // we sort Formats to get fixed order of Formats after compilation.
876*f6dc9357SAndroid Build Coastguard Worker Formats.Sort();
877*f6dc9357SAndroid Build Coastguard Worker return S_OK;
878*f6dc9357SAndroid Build Coastguard Worker }
879*f6dc9357SAndroid Build Coastguard Worker
880*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
881*f6dc9357SAndroid Build Coastguard Worker
FindFormatForArchiveName(const UString & arcPath) const882*f6dc9357SAndroid Build Coastguard Worker int CCodecs::FindFormatForArchiveName(const UString &arcPath) const
883*f6dc9357SAndroid Build Coastguard Worker {
884*f6dc9357SAndroid Build Coastguard Worker int dotPos = arcPath.ReverseFind_Dot();
885*f6dc9357SAndroid Build Coastguard Worker if (dotPos <= arcPath.ReverseFind_PathSepar())
886*f6dc9357SAndroid Build Coastguard Worker return -1;
887*f6dc9357SAndroid Build Coastguard Worker const UString ext = arcPath.Ptr((unsigned)(dotPos + 1));
888*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEmpty())
889*f6dc9357SAndroid Build Coastguard Worker return -1;
890*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEqualTo_Ascii_NoCase("exe"))
891*f6dc9357SAndroid Build Coastguard Worker return -1;
892*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Formats)
893*f6dc9357SAndroid Build Coastguard Worker {
894*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &arc = Formats[i];
895*f6dc9357SAndroid Build Coastguard Worker /*
896*f6dc9357SAndroid Build Coastguard Worker if (!arc.UpdateEnabled)
897*f6dc9357SAndroid Build Coastguard Worker continue;
898*f6dc9357SAndroid Build Coastguard Worker */
899*f6dc9357SAndroid Build Coastguard Worker if (arc.FindExtension(ext) >= 0)
900*f6dc9357SAndroid Build Coastguard Worker return (int)i;
901*f6dc9357SAndroid Build Coastguard Worker }
902*f6dc9357SAndroid Build Coastguard Worker return -1;
903*f6dc9357SAndroid Build Coastguard Worker }
904*f6dc9357SAndroid Build Coastguard Worker
FindFormatForExtension(const UString & ext) const905*f6dc9357SAndroid Build Coastguard Worker int CCodecs::FindFormatForExtension(const UString &ext) const
906*f6dc9357SAndroid Build Coastguard Worker {
907*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEmpty())
908*f6dc9357SAndroid Build Coastguard Worker return -1;
909*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Formats)
910*f6dc9357SAndroid Build Coastguard Worker if (Formats[i].FindExtension(ext) >= 0)
911*f6dc9357SAndroid Build Coastguard Worker return (int)i;
912*f6dc9357SAndroid Build Coastguard Worker return -1;
913*f6dc9357SAndroid Build Coastguard Worker }
914*f6dc9357SAndroid Build Coastguard Worker
FindFormatForArchiveType(const UString & arcType) const915*f6dc9357SAndroid Build Coastguard Worker int CCodecs::FindFormatForArchiveType(const UString &arcType) const
916*f6dc9357SAndroid Build Coastguard Worker {
917*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Formats)
918*f6dc9357SAndroid Build Coastguard Worker if (Formats[i].Name.IsEqualTo_NoCase(arcType))
919*f6dc9357SAndroid Build Coastguard Worker return (int)i;
920*f6dc9357SAndroid Build Coastguard Worker return -1;
921*f6dc9357SAndroid Build Coastguard Worker }
922*f6dc9357SAndroid Build Coastguard Worker
FindFormatForArchiveType(const UString & arcType,CIntVector & formatIndices) const923*f6dc9357SAndroid Build Coastguard Worker bool CCodecs::FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const
924*f6dc9357SAndroid Build Coastguard Worker {
925*f6dc9357SAndroid Build Coastguard Worker formatIndices.Clear();
926*f6dc9357SAndroid Build Coastguard Worker for (unsigned pos = 0; pos < arcType.Len();)
927*f6dc9357SAndroid Build Coastguard Worker {
928*f6dc9357SAndroid Build Coastguard Worker int pos2 = arcType.Find(L'.', pos);
929*f6dc9357SAndroid Build Coastguard Worker if (pos2 < 0)
930*f6dc9357SAndroid Build Coastguard Worker pos2 = (int)arcType.Len();
931*f6dc9357SAndroid Build Coastguard Worker const UString name = arcType.Mid(pos, (unsigned)pos2 - pos);
932*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty())
933*f6dc9357SAndroid Build Coastguard Worker return false;
934*f6dc9357SAndroid Build Coastguard Worker int index = FindFormatForArchiveType(name);
935*f6dc9357SAndroid Build Coastguard Worker if (index < 0 && name != L"*")
936*f6dc9357SAndroid Build Coastguard Worker {
937*f6dc9357SAndroid Build Coastguard Worker formatIndices.Clear();
938*f6dc9357SAndroid Build Coastguard Worker return false;
939*f6dc9357SAndroid Build Coastguard Worker }
940*f6dc9357SAndroid Build Coastguard Worker formatIndices.Add(index);
941*f6dc9357SAndroid Build Coastguard Worker pos = (unsigned)pos2 + 1;
942*f6dc9357SAndroid Build Coastguard Worker }
943*f6dc9357SAndroid Build Coastguard Worker return true;
944*f6dc9357SAndroid Build Coastguard Worker }
945*f6dc9357SAndroid Build Coastguard Worker
946*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_SFX
947*f6dc9357SAndroid Build Coastguard Worker
948*f6dc9357SAndroid Build Coastguard Worker
949*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
950*f6dc9357SAndroid Build Coastguard Worker
951*f6dc9357SAndroid Build Coastguard Worker // #define EXPORT_CODECS
952*f6dc9357SAndroid Build Coastguard Worker
953*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
954*f6dc9357SAndroid Build Coastguard Worker
955*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumCodecs;
956*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateDecoder(UInt32 index, const GUID *iid, void **outObject);
957*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateEncoder(UInt32 index, const GUID *iid, void **outObject);
958*f6dc9357SAndroid Build Coastguard Worker STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);
959*f6dc9357SAndroid Build Coastguard Worker #define NUM_EXPORT_CODECS g_NumCodecs
960*f6dc9357SAndroid Build Coastguard Worker
961*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumHashers;
962*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateHasher(UInt32 index, IHasher **hasher);
963*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHasherProp(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);
964*f6dc9357SAndroid Build Coastguard Worker #define NUM_EXPORT_HASHERS g_NumHashers
965*f6dc9357SAndroid Build Coastguard Worker
966*f6dc9357SAndroid Build Coastguard Worker #else // EXPORT_CODECS
967*f6dc9357SAndroid Build Coastguard Worker
968*f6dc9357SAndroid Build Coastguard Worker #define NUM_EXPORT_CODECS 0
969*f6dc9357SAndroid Build Coastguard Worker #define NUM_EXPORT_HASHERS 0
970*f6dc9357SAndroid Build Coastguard Worker
971*f6dc9357SAndroid Build Coastguard Worker #endif // EXPORT_CODECS
972*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCodecs::GetNumMethods (UInt32 * numMethods))973*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCodecs::GetNumMethods(UInt32 *numMethods))
974*f6dc9357SAndroid Build Coastguard Worker {
975*f6dc9357SAndroid Build Coastguard Worker *numMethods = NUM_EXPORT_CODECS
976*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
977*f6dc9357SAndroid Build Coastguard Worker + Codecs.Size()
978*f6dc9357SAndroid Build Coastguard Worker #endif
979*f6dc9357SAndroid Build Coastguard Worker ;
980*f6dc9357SAndroid Build Coastguard Worker return S_OK;
981*f6dc9357SAndroid Build Coastguard Worker }
982*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCodecs::GetProperty (UInt32 index,PROPID propID,PROPVARIANT * value))983*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCodecs::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value))
984*f6dc9357SAndroid Build Coastguard Worker {
985*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
986*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
987*f6dc9357SAndroid Build Coastguard Worker return GetMethodProperty(index, propID, value);
988*f6dc9357SAndroid Build Coastguard Worker #endif
989*f6dc9357SAndroid Build Coastguard Worker
990*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
991*f6dc9357SAndroid Build Coastguard Worker const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
992*f6dc9357SAndroid Build Coastguard Worker
993*f6dc9357SAndroid Build Coastguard Worker if (propID == NMethodPropID::kDecoderIsAssigned ||
994*f6dc9357SAndroid Build Coastguard Worker propID == NMethodPropID::kEncoderIsAssigned)
995*f6dc9357SAndroid Build Coastguard Worker {
996*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
997*f6dc9357SAndroid Build Coastguard Worker prop = (bool)((propID == NMethodPropID::kDecoderIsAssigned) ?
998*f6dc9357SAndroid Build Coastguard Worker ci.DecoderIsAssigned :
999*f6dc9357SAndroid Build Coastguard Worker ci.EncoderIsAssigned);
1000*f6dc9357SAndroid Build Coastguard Worker prop.Detach(value);
1001*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1002*f6dc9357SAndroid Build Coastguard Worker }
1003*f6dc9357SAndroid Build Coastguard Worker
1004*f6dc9357SAndroid Build Coastguard Worker if (propID == NMethodPropID::kIsFilter && ci.IsFilter_Assigned)
1005*f6dc9357SAndroid Build Coastguard Worker {
1006*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1007*f6dc9357SAndroid Build Coastguard Worker prop = (bool)ci.IsFilter;
1008*f6dc9357SAndroid Build Coastguard Worker prop.Detach(value);
1009*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1010*f6dc9357SAndroid Build Coastguard Worker }
1011*f6dc9357SAndroid Build Coastguard Worker
1012*f6dc9357SAndroid Build Coastguard Worker const CCodecLib &lib = Libs[ci.LibIndex];
1013*f6dc9357SAndroid Build Coastguard Worker return lib.GetMethodProperty(ci.CodecIndex, propID, value);
1014*f6dc9357SAndroid Build Coastguard Worker #else
1015*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1016*f6dc9357SAndroid Build Coastguard Worker #endif
1017*f6dc9357SAndroid Build Coastguard Worker }
1018*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCodecs::CreateDecoder (UInt32 index,const GUID * iid,void ** coder))1019*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCodecs::CreateDecoder(UInt32 index, const GUID *iid, void **coder))
1020*f6dc9357SAndroid Build Coastguard Worker {
1021*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1022*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
1023*f6dc9357SAndroid Build Coastguard Worker return CreateDecoder(index, iid, coder);
1024*f6dc9357SAndroid Build Coastguard Worker #endif
1025*f6dc9357SAndroid Build Coastguard Worker
1026*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1027*f6dc9357SAndroid Build Coastguard Worker const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
1028*f6dc9357SAndroid Build Coastguard Worker if (ci.DecoderIsAssigned)
1029*f6dc9357SAndroid Build Coastguard Worker {
1030*f6dc9357SAndroid Build Coastguard Worker const CCodecLib &lib = Libs[ci.LibIndex];
1031*f6dc9357SAndroid Build Coastguard Worker if (lib.CreateDecoder)
1032*f6dc9357SAndroid Build Coastguard Worker return lib.CreateDecoder(ci.CodecIndex, iid, (void **)coder);
1033*f6dc9357SAndroid Build Coastguard Worker if (lib.CreateObject)
1034*f6dc9357SAndroid Build Coastguard Worker return lib.CreateObject(&ci.Decoder, iid, (void **)coder);
1035*f6dc9357SAndroid Build Coastguard Worker }
1036*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1037*f6dc9357SAndroid Build Coastguard Worker #else
1038*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1039*f6dc9357SAndroid Build Coastguard Worker #endif
1040*f6dc9357SAndroid Build Coastguard Worker }
1041*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCodecs::CreateEncoder (UInt32 index,const GUID * iid,void ** coder))1042*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCodecs::CreateEncoder(UInt32 index, const GUID *iid, void **coder))
1043*f6dc9357SAndroid Build Coastguard Worker {
1044*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1045*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
1046*f6dc9357SAndroid Build Coastguard Worker return CreateEncoder(index, iid, coder);
1047*f6dc9357SAndroid Build Coastguard Worker #endif
1048*f6dc9357SAndroid Build Coastguard Worker
1049*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1050*f6dc9357SAndroid Build Coastguard Worker const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
1051*f6dc9357SAndroid Build Coastguard Worker if (ci.EncoderIsAssigned)
1052*f6dc9357SAndroid Build Coastguard Worker {
1053*f6dc9357SAndroid Build Coastguard Worker const CCodecLib &lib = Libs[ci.LibIndex];
1054*f6dc9357SAndroid Build Coastguard Worker if (lib.CreateEncoder)
1055*f6dc9357SAndroid Build Coastguard Worker return lib.CreateEncoder(ci.CodecIndex, iid, (void **)coder);
1056*f6dc9357SAndroid Build Coastguard Worker if (lib.CreateObject)
1057*f6dc9357SAndroid Build Coastguard Worker return lib.CreateObject(&ci.Encoder, iid, (void **)coder);
1058*f6dc9357SAndroid Build Coastguard Worker }
1059*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1060*f6dc9357SAndroid Build Coastguard Worker #else
1061*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1062*f6dc9357SAndroid Build Coastguard Worker #endif
1063*f6dc9357SAndroid Build Coastguard Worker }
1064*f6dc9357SAndroid Build Coastguard Worker
1065*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF2(UInt32,CCodecs::GetNumHashers ())1066*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(UInt32, CCodecs::GetNumHashers())
1067*f6dc9357SAndroid Build Coastguard Worker {
1068*f6dc9357SAndroid Build Coastguard Worker return NUM_EXPORT_HASHERS
1069*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1070*f6dc9357SAndroid Build Coastguard Worker + Hashers.Size()
1071*f6dc9357SAndroid Build Coastguard Worker #endif
1072*f6dc9357SAndroid Build Coastguard Worker ;
1073*f6dc9357SAndroid Build Coastguard Worker }
1074*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCodecs::GetHasherProp (UInt32 index,PROPID propID,PROPVARIANT * value))1075*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCodecs::GetHasherProp(UInt32 index, PROPID propID, PROPVARIANT *value))
1076*f6dc9357SAndroid Build Coastguard Worker {
1077*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1078*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumHashers)
1079*f6dc9357SAndroid Build Coastguard Worker return ::GetHasherProp(index, propID, value);
1080*f6dc9357SAndroid Build Coastguard Worker #endif
1081*f6dc9357SAndroid Build Coastguard Worker
1082*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1083*f6dc9357SAndroid Build Coastguard Worker const CDllHasherInfo &ci = Hashers[index - NUM_EXPORT_HASHERS];
1084*f6dc9357SAndroid Build Coastguard Worker return Libs[ci.LibIndex].ComHashers->GetHasherProp(ci.HasherIndex, propID, value);
1085*f6dc9357SAndroid Build Coastguard Worker #else
1086*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1087*f6dc9357SAndroid Build Coastguard Worker #endif
1088*f6dc9357SAndroid Build Coastguard Worker }
1089*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCodecs::CreateHasher (UInt32 index,IHasher ** hasher))1090*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCodecs::CreateHasher(UInt32 index, IHasher **hasher))
1091*f6dc9357SAndroid Build Coastguard Worker {
1092*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1093*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumHashers)
1094*f6dc9357SAndroid Build Coastguard Worker return CreateHasher(index, hasher);
1095*f6dc9357SAndroid Build Coastguard Worker #endif
1096*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1097*f6dc9357SAndroid Build Coastguard Worker const CDllHasherInfo &ci = Hashers[index - NUM_EXPORT_HASHERS];
1098*f6dc9357SAndroid Build Coastguard Worker return Libs[ci.LibIndex].ComHashers->CreateHasher(ci.HasherIndex, hasher);
1099*f6dc9357SAndroid Build Coastguard Worker #else
1100*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1101*f6dc9357SAndroid Build Coastguard Worker #endif
1102*f6dc9357SAndroid Build Coastguard Worker }
1103*f6dc9357SAndroid Build Coastguard Worker
GetCodec_LibIndex(UInt32 index) const1104*f6dc9357SAndroid Build Coastguard Worker int CCodecs::GetCodec_LibIndex(UInt32 index) const
1105*f6dc9357SAndroid Build Coastguard Worker {
1106*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1107*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
1108*f6dc9357SAndroid Build Coastguard Worker return -1;
1109*f6dc9357SAndroid Build Coastguard Worker #endif
1110*f6dc9357SAndroid Build Coastguard Worker
1111*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1112*f6dc9357SAndroid Build Coastguard Worker const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
1113*f6dc9357SAndroid Build Coastguard Worker return (int)ci.LibIndex;
1114*f6dc9357SAndroid Build Coastguard Worker #else
1115*f6dc9357SAndroid Build Coastguard Worker return -1;
1116*f6dc9357SAndroid Build Coastguard Worker #endif
1117*f6dc9357SAndroid Build Coastguard Worker }
1118*f6dc9357SAndroid Build Coastguard Worker
GetHasherLibIndex(UInt32 index)1119*f6dc9357SAndroid Build Coastguard Worker int CCodecs::GetHasherLibIndex(UInt32 index)
1120*f6dc9357SAndroid Build Coastguard Worker {
1121*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1122*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumHashers)
1123*f6dc9357SAndroid Build Coastguard Worker return -1;
1124*f6dc9357SAndroid Build Coastguard Worker #endif
1125*f6dc9357SAndroid Build Coastguard Worker
1126*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1127*f6dc9357SAndroid Build Coastguard Worker const CDllHasherInfo &ci = Hashers[index - NUM_EXPORT_HASHERS];
1128*f6dc9357SAndroid Build Coastguard Worker return (int)ci.LibIndex;
1129*f6dc9357SAndroid Build Coastguard Worker #else
1130*f6dc9357SAndroid Build Coastguard Worker return -1;
1131*f6dc9357SAndroid Build Coastguard Worker #endif
1132*f6dc9357SAndroid Build Coastguard Worker }
1133*f6dc9357SAndroid Build Coastguard Worker
GetCodec_DecoderIsAssigned(UInt32 index) const1134*f6dc9357SAndroid Build Coastguard Worker bool CCodecs::GetCodec_DecoderIsAssigned(UInt32 index) const
1135*f6dc9357SAndroid Build Coastguard Worker {
1136*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1137*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
1138*f6dc9357SAndroid Build Coastguard Worker {
1139*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1140*f6dc9357SAndroid Build Coastguard Worker if (GetProperty(index, NMethodPropID::kDecoderIsAssigned, &prop) == S_OK)
1141*f6dc9357SAndroid Build Coastguard Worker {
1142*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BOOL)
1143*f6dc9357SAndroid Build Coastguard Worker return VARIANT_BOOLToBool(prop.boolVal);
1144*f6dc9357SAndroid Build Coastguard Worker }
1145*f6dc9357SAndroid Build Coastguard Worker return false;
1146*f6dc9357SAndroid Build Coastguard Worker }
1147*f6dc9357SAndroid Build Coastguard Worker #endif
1148*f6dc9357SAndroid Build Coastguard Worker
1149*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1150*f6dc9357SAndroid Build Coastguard Worker return Codecs[index - NUM_EXPORT_CODECS].DecoderIsAssigned;
1151*f6dc9357SAndroid Build Coastguard Worker #else
1152*f6dc9357SAndroid Build Coastguard Worker return false;
1153*f6dc9357SAndroid Build Coastguard Worker #endif
1154*f6dc9357SAndroid Build Coastguard Worker }
1155*f6dc9357SAndroid Build Coastguard Worker
1156*f6dc9357SAndroid Build Coastguard Worker
GetCodec_EncoderIsAssigned(UInt32 index) const1157*f6dc9357SAndroid Build Coastguard Worker bool CCodecs::GetCodec_EncoderIsAssigned(UInt32 index) const
1158*f6dc9357SAndroid Build Coastguard Worker {
1159*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1160*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
1161*f6dc9357SAndroid Build Coastguard Worker {
1162*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1163*f6dc9357SAndroid Build Coastguard Worker if (GetProperty(index, NMethodPropID::kEncoderIsAssigned, &prop) == S_OK)
1164*f6dc9357SAndroid Build Coastguard Worker {
1165*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BOOL)
1166*f6dc9357SAndroid Build Coastguard Worker return VARIANT_BOOLToBool(prop.boolVal);
1167*f6dc9357SAndroid Build Coastguard Worker }
1168*f6dc9357SAndroid Build Coastguard Worker return false;
1169*f6dc9357SAndroid Build Coastguard Worker }
1170*f6dc9357SAndroid Build Coastguard Worker #endif
1171*f6dc9357SAndroid Build Coastguard Worker
1172*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1173*f6dc9357SAndroid Build Coastguard Worker return Codecs[index - NUM_EXPORT_CODECS].EncoderIsAssigned;
1174*f6dc9357SAndroid Build Coastguard Worker #else
1175*f6dc9357SAndroid Build Coastguard Worker return false;
1176*f6dc9357SAndroid Build Coastguard Worker #endif
1177*f6dc9357SAndroid Build Coastguard Worker }
1178*f6dc9357SAndroid Build Coastguard Worker
1179*f6dc9357SAndroid Build Coastguard Worker
GetCodec_IsFilter(UInt32 index,bool & isAssigned) const1180*f6dc9357SAndroid Build Coastguard Worker bool CCodecs::GetCodec_IsFilter(UInt32 index, bool &isAssigned) const
1181*f6dc9357SAndroid Build Coastguard Worker {
1182*f6dc9357SAndroid Build Coastguard Worker isAssigned = false;
1183*f6dc9357SAndroid Build Coastguard Worker #ifdef EXPORT_CODECS
1184*f6dc9357SAndroid Build Coastguard Worker if (index < g_NumCodecs)
1185*f6dc9357SAndroid Build Coastguard Worker {
1186*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1187*f6dc9357SAndroid Build Coastguard Worker if (GetProperty(index, NMethodPropID::kIsFilter, &prop) == S_OK)
1188*f6dc9357SAndroid Build Coastguard Worker {
1189*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BOOL)
1190*f6dc9357SAndroid Build Coastguard Worker {
1191*f6dc9357SAndroid Build Coastguard Worker isAssigned = true;
1192*f6dc9357SAndroid Build Coastguard Worker return VARIANT_BOOLToBool(prop.boolVal);
1193*f6dc9357SAndroid Build Coastguard Worker }
1194*f6dc9357SAndroid Build Coastguard Worker }
1195*f6dc9357SAndroid Build Coastguard Worker return false;
1196*f6dc9357SAndroid Build Coastguard Worker }
1197*f6dc9357SAndroid Build Coastguard Worker #endif
1198*f6dc9357SAndroid Build Coastguard Worker
1199*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1200*f6dc9357SAndroid Build Coastguard Worker {
1201*f6dc9357SAndroid Build Coastguard Worker const CDllCodecInfo &c = Codecs[index - NUM_EXPORT_CODECS];
1202*f6dc9357SAndroid Build Coastguard Worker isAssigned = c.IsFilter_Assigned;
1203*f6dc9357SAndroid Build Coastguard Worker return c.IsFilter;
1204*f6dc9357SAndroid Build Coastguard Worker }
1205*f6dc9357SAndroid Build Coastguard Worker #else
1206*f6dc9357SAndroid Build Coastguard Worker return false;
1207*f6dc9357SAndroid Build Coastguard Worker #endif
1208*f6dc9357SAndroid Build Coastguard Worker }
1209*f6dc9357SAndroid Build Coastguard Worker
1210*f6dc9357SAndroid Build Coastguard Worker
GetCodec_NumStreams(UInt32 index)1211*f6dc9357SAndroid Build Coastguard Worker UInt32 CCodecs::GetCodec_NumStreams(UInt32 index)
1212*f6dc9357SAndroid Build Coastguard Worker {
1213*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1214*f6dc9357SAndroid Build Coastguard Worker if (GetProperty(index, NMethodPropID::kPackStreams, &prop) != S_OK)
1215*f6dc9357SAndroid Build Coastguard Worker return 0;
1216*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI4)
1217*f6dc9357SAndroid Build Coastguard Worker return (UInt32)prop.ulVal;
1218*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_EMPTY)
1219*f6dc9357SAndroid Build Coastguard Worker return 1;
1220*f6dc9357SAndroid Build Coastguard Worker return 0;
1221*f6dc9357SAndroid Build Coastguard Worker }
1222*f6dc9357SAndroid Build Coastguard Worker
GetCodec_Id(UInt32 index,UInt64 & id)1223*f6dc9357SAndroid Build Coastguard Worker HRESULT CCodecs::GetCodec_Id(UInt32 index, UInt64 &id)
1224*f6dc9357SAndroid Build Coastguard Worker {
1225*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1226*f6dc9357SAndroid Build Coastguard Worker RINOK(GetProperty(index, NMethodPropID::kID, &prop))
1227*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_UI8)
1228*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
1229*f6dc9357SAndroid Build Coastguard Worker id = prop.uhVal.QuadPart;
1230*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1231*f6dc9357SAndroid Build Coastguard Worker }
1232*f6dc9357SAndroid Build Coastguard Worker
GetCodec_Name(UInt32 index)1233*f6dc9357SAndroid Build Coastguard Worker AString CCodecs::GetCodec_Name(UInt32 index)
1234*f6dc9357SAndroid Build Coastguard Worker {
1235*f6dc9357SAndroid Build Coastguard Worker AString s;
1236*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1237*f6dc9357SAndroid Build Coastguard Worker if (GetProperty(index, NMethodPropID::kName, &prop) == S_OK)
1238*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
1239*f6dc9357SAndroid Build Coastguard Worker s.SetFromWStr_if_Ascii(prop.bstrVal);
1240*f6dc9357SAndroid Build Coastguard Worker return s;
1241*f6dc9357SAndroid Build Coastguard Worker }
1242*f6dc9357SAndroid Build Coastguard Worker
GetHasherId(UInt32 index)1243*f6dc9357SAndroid Build Coastguard Worker UInt64 CCodecs::GetHasherId(UInt32 index)
1244*f6dc9357SAndroid Build Coastguard Worker {
1245*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1246*f6dc9357SAndroid Build Coastguard Worker if (GetHasherProp(index, NMethodPropID::kID, &prop) != S_OK)
1247*f6dc9357SAndroid Build Coastguard Worker return 0;
1248*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_UI8)
1249*f6dc9357SAndroid Build Coastguard Worker return 0;
1250*f6dc9357SAndroid Build Coastguard Worker return prop.uhVal.QuadPart;
1251*f6dc9357SAndroid Build Coastguard Worker }
1252*f6dc9357SAndroid Build Coastguard Worker
GetHasherName(UInt32 index)1253*f6dc9357SAndroid Build Coastguard Worker AString CCodecs::GetHasherName(UInt32 index)
1254*f6dc9357SAndroid Build Coastguard Worker {
1255*f6dc9357SAndroid Build Coastguard Worker AString s;
1256*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1257*f6dc9357SAndroid Build Coastguard Worker if (GetHasherProp(index, NMethodPropID::kName, &prop) == S_OK)
1258*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
1259*f6dc9357SAndroid Build Coastguard Worker s.SetFromWStr_if_Ascii(prop.bstrVal);
1260*f6dc9357SAndroid Build Coastguard Worker return s;
1261*f6dc9357SAndroid Build Coastguard Worker }
1262*f6dc9357SAndroid Build Coastguard Worker
GetHasherDigestSize(UInt32 index)1263*f6dc9357SAndroid Build Coastguard Worker UInt32 CCodecs::GetHasherDigestSize(UInt32 index)
1264*f6dc9357SAndroid Build Coastguard Worker {
1265*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
1266*f6dc9357SAndroid Build Coastguard Worker if (GetHasherProp(index, NMethodPropID::kDigestSize, &prop) != S_OK)
1267*f6dc9357SAndroid Build Coastguard Worker return 0;
1268*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_UI4)
1269*f6dc9357SAndroid Build Coastguard Worker return 0;
1270*f6dc9357SAndroid Build Coastguard Worker return prop.ulVal;
1271*f6dc9357SAndroid Build Coastguard Worker }
1272*f6dc9357SAndroid Build Coastguard Worker
GetCodecsErrorMessage(UString & s)1273*f6dc9357SAndroid Build Coastguard Worker void CCodecs::GetCodecsErrorMessage(UString &s)
1274*f6dc9357SAndroid Build Coastguard Worker {
1275*f6dc9357SAndroid Build Coastguard Worker s.Empty();
1276*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Errors)
1277*f6dc9357SAndroid Build Coastguard Worker {
1278*f6dc9357SAndroid Build Coastguard Worker const CCodecError &ce = Errors[i];
1279*f6dc9357SAndroid Build Coastguard Worker s += "Codec Load Error: ";
1280*f6dc9357SAndroid Build Coastguard Worker s += fs2us(ce.Path);
1281*f6dc9357SAndroid Build Coastguard Worker if (ce.ErrorCode != 0)
1282*f6dc9357SAndroid Build Coastguard Worker {
1283*f6dc9357SAndroid Build Coastguard Worker s += " : ";
1284*f6dc9357SAndroid Build Coastguard Worker s += NWindows::NError::MyFormatMessage(ce.ErrorCode);
1285*f6dc9357SAndroid Build Coastguard Worker }
1286*f6dc9357SAndroid Build Coastguard Worker if (!ce.Message.IsEmpty())
1287*f6dc9357SAndroid Build Coastguard Worker {
1288*f6dc9357SAndroid Build Coastguard Worker s += " : ";
1289*f6dc9357SAndroid Build Coastguard Worker s += ce.Message;
1290*f6dc9357SAndroid Build Coastguard Worker }
1291*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1292*f6dc9357SAndroid Build Coastguard Worker }
1293*f6dc9357SAndroid Build Coastguard Worker }
1294*f6dc9357SAndroid Build Coastguard Worker
1295*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_EXTERNAL_CODECS
1296*f6dc9357SAndroid Build Coastguard Worker
1297*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
1298*f6dc9357SAndroid Build Coastguard Worker
1299*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumCodecs;
1300*f6dc9357SAndroid Build Coastguard Worker extern const CCodecInfo *g_Codecs[];
1301*f6dc9357SAndroid Build Coastguard Worker
Get_CodecsInfoUser_Vector(CObjectVector<CCodecInfoUser> & v)1302*f6dc9357SAndroid Build Coastguard Worker void CCodecs::Get_CodecsInfoUser_Vector(CObjectVector<CCodecInfoUser> &v)
1303*f6dc9357SAndroid Build Coastguard Worker {
1304*f6dc9357SAndroid Build Coastguard Worker v.Clear();
1305*f6dc9357SAndroid Build Coastguard Worker {
1306*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < g_NumCodecs; i++)
1307*f6dc9357SAndroid Build Coastguard Worker {
1308*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo &cod = *g_Codecs[i];
1309*f6dc9357SAndroid Build Coastguard Worker CCodecInfoUser &u = v.AddNew();
1310*f6dc9357SAndroid Build Coastguard Worker u.EncoderIsAssigned = (cod.CreateEncoder != NULL);
1311*f6dc9357SAndroid Build Coastguard Worker u.DecoderIsAssigned = (cod.CreateDecoder != NULL);
1312*f6dc9357SAndroid Build Coastguard Worker u.IsFilter_Assigned = true;
1313*f6dc9357SAndroid Build Coastguard Worker u.IsFilter = cod.IsFilter;
1314*f6dc9357SAndroid Build Coastguard Worker u.NumStreams = cod.NumStreams;
1315*f6dc9357SAndroid Build Coastguard Worker u.Name = cod.Name;
1316*f6dc9357SAndroid Build Coastguard Worker }
1317*f6dc9357SAndroid Build Coastguard Worker }
1318*f6dc9357SAndroid Build Coastguard Worker
1319*f6dc9357SAndroid Build Coastguard Worker
1320*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1321*f6dc9357SAndroid Build Coastguard Worker {
1322*f6dc9357SAndroid Build Coastguard Worker UInt32 numMethods;
1323*f6dc9357SAndroid Build Coastguard Worker if (GetNumMethods(&numMethods) == S_OK)
1324*f6dc9357SAndroid Build Coastguard Worker for (UInt32 j = 0; j < numMethods; j++)
1325*f6dc9357SAndroid Build Coastguard Worker {
1326*f6dc9357SAndroid Build Coastguard Worker CCodecInfoUser &u = v.AddNew();
1327*f6dc9357SAndroid Build Coastguard Worker u.EncoderIsAssigned = GetCodec_EncoderIsAssigned(j);
1328*f6dc9357SAndroid Build Coastguard Worker u.DecoderIsAssigned = GetCodec_DecoderIsAssigned(j);
1329*f6dc9357SAndroid Build Coastguard Worker u.IsFilter = GetCodec_IsFilter(j, u.IsFilter_Assigned);
1330*f6dc9357SAndroid Build Coastguard Worker u.NumStreams = GetCodec_NumStreams(j);
1331*f6dc9357SAndroid Build Coastguard Worker u.Name = GetCodec_Name(j);
1332*f6dc9357SAndroid Build Coastguard Worker }
1333*f6dc9357SAndroid Build Coastguard Worker }
1334*f6dc9357SAndroid Build Coastguard Worker #endif
1335*f6dc9357SAndroid Build Coastguard Worker }
1336*f6dc9357SAndroid Build Coastguard Worker
1337*f6dc9357SAndroid Build Coastguard Worker #endif
1338