xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/LoadCodecs.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LoadCodecs.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LOAD_CODECS_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LOAD_CODECS_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker /*
7*f6dc9357SAndroid Build Coastguard Worker Client application uses LoadCodecs.* to load plugins to
8*f6dc9357SAndroid Build Coastguard Worker CCodecs object, that contains 3 lists of plugins:
9*f6dc9357SAndroid Build Coastguard Worker   1) Formats - internal and external archive handlers
10*f6dc9357SAndroid Build Coastguard Worker   2) Codecs  - external codecs
11*f6dc9357SAndroid Build Coastguard Worker   3) Hashers - external hashers
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker Z7_EXTERNAL_CODECS
14*f6dc9357SAndroid Build Coastguard Worker ---------------
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker   if Z7_EXTERNAL_CODECS is defined, then the code tries to load external
17*f6dc9357SAndroid Build Coastguard Worker   plugins from DLL files (shared libraries).
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker   There are two types of executables in 7-Zip:
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker   1) Executable that uses external plugins must be compiled
22*f6dc9357SAndroid Build Coastguard Worker      with Z7_EXTERNAL_CODECS defined:
23*f6dc9357SAndroid Build Coastguard Worker        - 7z.exe, 7zG.exe, 7zFM.exe
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker      Note: Z7_EXTERNAL_CODECS is used also in CPP/7zip/Common/CreateCoder.h
26*f6dc9357SAndroid Build Coastguard Worker            that code is used in plugin module (7z.dll).
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker   2) Standalone modules are compiled without Z7_EXTERNAL_CODECS:
29*f6dc9357SAndroid Build Coastguard Worker     - SFX modules: 7z.sfx, 7zCon.sfx
30*f6dc9357SAndroid Build Coastguard Worker     - standalone versions of console 7-Zip: 7za.exe, 7zr.exe
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker   if Z7_EXTERNAL_CODECS is defined, CCodecs class implements interfaces:
33*f6dc9357SAndroid Build Coastguard Worker     - ICompressCodecsInfo : for Codecs
34*f6dc9357SAndroid Build Coastguard Worker     - IHashers            : for Hashers
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker   The client application can send CCodecs object to each plugin module.
37*f6dc9357SAndroid Build Coastguard Worker   And plugin module can use ICompressCodecsInfo or IHashers interface to access
38*f6dc9357SAndroid Build Coastguard Worker   another plugins.
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker   There are 2 ways to send (ICompressCodecsInfo * compressCodecsInfo) to plugin
41*f6dc9357SAndroid Build Coastguard Worker     1) for old versions:
42*f6dc9357SAndroid Build Coastguard Worker         a) request ISetCompressCodecsInfo from created archive handler.
43*f6dc9357SAndroid Build Coastguard Worker         b) call ISetCompressCodecsInfo::SetCompressCodecsInfo(compressCodecsInfo)
44*f6dc9357SAndroid Build Coastguard Worker     2) for new versions:
45*f6dc9357SAndroid Build Coastguard Worker         a) request "SetCodecs" function from DLL file
46*f6dc9357SAndroid Build Coastguard Worker         b) call SetCodecs(compressCodecsInfo) function from DLL file
47*f6dc9357SAndroid Build Coastguard Worker */
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
50*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
51*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h"
52*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/ComTry.h"
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
55*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
56*f6dc9357SAndroid Build Coastguard Worker #endif
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker #include "../../ICoder.h"
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h"
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker struct CDllCodecInfo
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker   unsigned LibIndex;
68*f6dc9357SAndroid Build Coastguard Worker   UInt32 CodecIndex;
69*f6dc9357SAndroid Build Coastguard Worker   bool EncoderIsAssigned;
70*f6dc9357SAndroid Build Coastguard Worker   bool DecoderIsAssigned;
71*f6dc9357SAndroid Build Coastguard Worker   bool IsFilter;
72*f6dc9357SAndroid Build Coastguard Worker   bool IsFilter_Assigned;
73*f6dc9357SAndroid Build Coastguard Worker   CLSID Encoder;
74*f6dc9357SAndroid Build Coastguard Worker   CLSID Decoder;
75*f6dc9357SAndroid Build Coastguard Worker };
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker struct CDllHasherInfo
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker   unsigned LibIndex;
80*f6dc9357SAndroid Build Coastguard Worker   UInt32 HasherIndex;
81*f6dc9357SAndroid Build Coastguard Worker };
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker #endif
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker struct CArcExtInfo
86*f6dc9357SAndroid Build Coastguard Worker {
87*f6dc9357SAndroid Build Coastguard Worker   UString Ext;
88*f6dc9357SAndroid Build Coastguard Worker   UString AddExt;
89*f6dc9357SAndroid Build Coastguard Worker 
CArcExtInfoCArcExtInfo90*f6dc9357SAndroid Build Coastguard Worker   CArcExtInfo() {}
CArcExtInfoCArcExtInfo91*f6dc9357SAndroid Build Coastguard Worker   CArcExtInfo(const UString &ext): Ext(ext) {}
CArcExtInfoCArcExtInfo92*f6dc9357SAndroid Build Coastguard Worker   CArcExtInfo(const UString &ext, const UString &addExt): Ext(ext), AddExt(addExt) {}
93*f6dc9357SAndroid Build Coastguard Worker };
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker struct CArcInfoEx
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags;
99*f6dc9357SAndroid Build Coastguard Worker   UInt32 TimeFlags;
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker   Func_CreateInArchive CreateInArchive;
102*f6dc9357SAndroid Build Coastguard Worker   Func_IsArc IsArcFunc;
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker   UString Name;
105*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CArcExtInfo> Exts;
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
108*f6dc9357SAndroid Build Coastguard Worker     Func_CreateOutArchive CreateOutArchive;
109*f6dc9357SAndroid Build Coastguard Worker     bool UpdateEnabled;
110*f6dc9357SAndroid Build Coastguard Worker     bool NewInterface;
111*f6dc9357SAndroid Build Coastguard Worker     // UInt32 Version;
112*f6dc9357SAndroid Build Coastguard Worker     UInt32 SignatureOffset;
113*f6dc9357SAndroid Build Coastguard Worker     CObjectVector<CByteBuffer> Signatures;
114*f6dc9357SAndroid Build Coastguard Worker     /*
115*f6dc9357SAndroid Build Coastguard Worker     #ifdef NEW_FOLDER_INTERFACE
116*f6dc9357SAndroid Build Coastguard Worker       UStringVector AssociateExts;
117*f6dc9357SAndroid Build Coastguard Worker     #endif
118*f6dc9357SAndroid Build Coastguard Worker     */
119*f6dc9357SAndroid Build Coastguard Worker   #endif
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
122*f6dc9357SAndroid Build Coastguard Worker     int LibIndex;
123*f6dc9357SAndroid Build Coastguard Worker     UInt32 FormatIndex;
124*f6dc9357SAndroid Build Coastguard Worker     CLSID ClassID;
125*f6dc9357SAndroid Build Coastguard Worker   #endif
126*f6dc9357SAndroid Build Coastguard Worker 
CompareCArcInfoEx127*f6dc9357SAndroid Build Coastguard Worker   int Compare(const CArcInfoEx &a) const
128*f6dc9357SAndroid Build Coastguard Worker   {
129*f6dc9357SAndroid Build Coastguard Worker     const int res = Name.Compare(a.Name);
130*f6dc9357SAndroid Build Coastguard Worker     if (res != 0)
131*f6dc9357SAndroid Build Coastguard Worker       return res;
132*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
133*f6dc9357SAndroid Build Coastguard Worker     return MyCompare(LibIndex, a.LibIndex);
134*f6dc9357SAndroid Build Coastguard Worker     #else
135*f6dc9357SAndroid Build Coastguard Worker     return 0;
136*f6dc9357SAndroid Build Coastguard Worker     #endif
137*f6dc9357SAndroid Build Coastguard Worker     /*
138*f6dc9357SAndroid Build Coastguard Worker     if (LibIndex < a.LibIndex) return -1;
139*f6dc9357SAndroid Build Coastguard Worker     if (LibIndex > a.LibIndex) return 1;
140*f6dc9357SAndroid Build Coastguard Worker     return 0;
141*f6dc9357SAndroid Build Coastguard Worker     */
142*f6dc9357SAndroid Build Coastguard Worker   }
143*f6dc9357SAndroid Build Coastguard Worker 
Flags_KeepNameCArcInfoEx144*f6dc9357SAndroid Build Coastguard Worker   bool Flags_KeepName() const { return (Flags & NArcInfoFlags::kKeepName) != 0; }
Flags_FindSignatureCArcInfoEx145*f6dc9357SAndroid Build Coastguard Worker   bool Flags_FindSignature() const { return (Flags & NArcInfoFlags::kFindSignature) != 0; }
146*f6dc9357SAndroid Build Coastguard Worker 
Flags_AltStreamsCArcInfoEx147*f6dc9357SAndroid Build Coastguard Worker   bool Flags_AltStreams() const { return (Flags & NArcInfoFlags::kAltStreams) != 0; }
Flags_NtSecurityCArcInfoEx148*f6dc9357SAndroid Build Coastguard Worker   bool Flags_NtSecurity() const { return (Flags & NArcInfoFlags::kNtSecure) != 0; }
Flags_SymLinksCArcInfoEx149*f6dc9357SAndroid Build Coastguard Worker   bool Flags_SymLinks() const { return (Flags & NArcInfoFlags::kSymLinks) != 0; }
Flags_HardLinksCArcInfoEx150*f6dc9357SAndroid Build Coastguard Worker   bool Flags_HardLinks() const { return (Flags & NArcInfoFlags::kHardLinks) != 0; }
151*f6dc9357SAndroid Build Coastguard Worker 
Flags_UseGlobalOffsetCArcInfoEx152*f6dc9357SAndroid Build Coastguard Worker   bool Flags_UseGlobalOffset() const { return (Flags & NArcInfoFlags::kUseGlobalOffset) != 0; }
Flags_StartOpenCArcInfoEx153*f6dc9357SAndroid Build Coastguard Worker   bool Flags_StartOpen() const { return (Flags & NArcInfoFlags::kStartOpen) != 0; }
Flags_BackwardOpenCArcInfoEx154*f6dc9357SAndroid Build Coastguard Worker   bool Flags_BackwardOpen() const { return (Flags & NArcInfoFlags::kBackwardOpen) != 0; }
Flags_PreArcCArcInfoEx155*f6dc9357SAndroid Build Coastguard Worker   bool Flags_PreArc() const { return (Flags & NArcInfoFlags::kPreArc) != 0; }
Flags_PureStartOpenCArcInfoEx156*f6dc9357SAndroid Build Coastguard Worker   bool Flags_PureStartOpen() const { return (Flags & NArcInfoFlags::kPureStartOpen) != 0; }
Flags_ByExtOnlyOpenCArcInfoEx157*f6dc9357SAndroid Build Coastguard Worker   bool Flags_ByExtOnlyOpen() const { return (Flags & NArcInfoFlags::kByExtOnlyOpen) != 0; }
Flags_HashHandlerCArcInfoEx158*f6dc9357SAndroid Build Coastguard Worker   bool Flags_HashHandler() const { return (Flags & NArcInfoFlags::kHashHandler) != 0; }
159*f6dc9357SAndroid Build Coastguard Worker 
Flags_CTimeCArcInfoEx160*f6dc9357SAndroid Build Coastguard Worker   bool Flags_CTime() const { return (Flags & NArcInfoFlags::kCTime) != 0; }
Flags_ATimeCArcInfoEx161*f6dc9357SAndroid Build Coastguard Worker   bool Flags_ATime() const { return (Flags & NArcInfoFlags::kATime) != 0; }
Flags_MTimeCArcInfoEx162*f6dc9357SAndroid Build Coastguard Worker   bool Flags_MTime() const { return (Flags & NArcInfoFlags::kMTime) != 0; }
163*f6dc9357SAndroid Build Coastguard Worker 
Flags_CTime_DefaultCArcInfoEx164*f6dc9357SAndroid Build Coastguard Worker   bool Flags_CTime_Default() const { return (Flags & NArcInfoFlags::kCTime_Default) != 0; }
Flags_ATime_DefaultCArcInfoEx165*f6dc9357SAndroid Build Coastguard Worker   bool Flags_ATime_Default() const { return (Flags & NArcInfoFlags::kATime_Default) != 0; }
Flags_MTime_DefaultCArcInfoEx166*f6dc9357SAndroid Build Coastguard Worker   bool Flags_MTime_Default() const { return (Flags & NArcInfoFlags::kMTime_Default) != 0; }
167*f6dc9357SAndroid Build Coastguard Worker 
Get_TimePrecFlagsCArcInfoEx168*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_TimePrecFlags() const
169*f6dc9357SAndroid Build Coastguard Worker   {
170*f6dc9357SAndroid Build Coastguard Worker     return (TimeFlags >> NArcInfoTimeFlags::kTime_Prec_Mask_bit_index) &
171*f6dc9357SAndroid Build Coastguard Worker       (((UInt32)1 << NArcInfoTimeFlags::kTime_Prec_Mask_num_bits) - 1);
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker 
Get_DefaultTimePrecCArcInfoEx174*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_DefaultTimePrec() const
175*f6dc9357SAndroid Build Coastguard Worker   {
176*f6dc9357SAndroid Build Coastguard Worker     return (TimeFlags >> NArcInfoTimeFlags::kTime_Prec_Default_bit_index) &
177*f6dc9357SAndroid Build Coastguard Worker       (((UInt32)1 << NArcInfoTimeFlags::kTime_Prec_Default_num_bits) - 1);
178*f6dc9357SAndroid Build Coastguard Worker   }
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker 
GetMainExtCArcInfoEx181*f6dc9357SAndroid Build Coastguard Worker   UString GetMainExt() const
182*f6dc9357SAndroid Build Coastguard Worker   {
183*f6dc9357SAndroid Build Coastguard Worker     if (Exts.IsEmpty())
184*f6dc9357SAndroid Build Coastguard Worker       return UString();
185*f6dc9357SAndroid Build Coastguard Worker     return Exts[0].Ext;
186*f6dc9357SAndroid Build Coastguard Worker   }
187*f6dc9357SAndroid Build Coastguard Worker   int FindExtension(const UString &ext) const;
188*f6dc9357SAndroid Build Coastguard Worker 
Is_7zCArcInfoEx189*f6dc9357SAndroid Build Coastguard Worker   bool Is_7z()    const { return Name.IsEqualTo_Ascii_NoCase("7z"); }
Is_SplitCArcInfoEx190*f6dc9357SAndroid Build Coastguard Worker   bool Is_Split() const { return Name.IsEqualTo_Ascii_NoCase("Split"); }
Is_XzCArcInfoEx191*f6dc9357SAndroid Build Coastguard Worker   bool Is_Xz()    const { return Name.IsEqualTo_Ascii_NoCase("xz"); }
Is_BZip2CArcInfoEx192*f6dc9357SAndroid Build Coastguard Worker   bool Is_BZip2() const { return Name.IsEqualTo_Ascii_NoCase("bzip2"); }
Is_GZipCArcInfoEx193*f6dc9357SAndroid Build Coastguard Worker   bool Is_GZip()  const { return Name.IsEqualTo_Ascii_NoCase("gzip"); }
Is_TarCArcInfoEx194*f6dc9357SAndroid Build Coastguard Worker   bool Is_Tar()   const { return Name.IsEqualTo_Ascii_NoCase("tar"); }
Is_ZipCArcInfoEx195*f6dc9357SAndroid Build Coastguard Worker   bool Is_Zip()   const { return Name.IsEqualTo_Ascii_NoCase("zip"); }
Is_RarCArcInfoEx196*f6dc9357SAndroid Build Coastguard Worker   bool Is_Rar()   const { return Name.IsEqualTo_Ascii_NoCase("rar"); }
Is_ZstdCArcInfoEx197*f6dc9357SAndroid Build Coastguard Worker   bool Is_Zstd()  const { return Name.IsEqualTo_Ascii_NoCase("zstd"); }
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker   /*
200*f6dc9357SAndroid Build Coastguard Worker   UString GetAllExtensions() const
201*f6dc9357SAndroid Build Coastguard Worker   {
202*f6dc9357SAndroid Build Coastguard Worker     UString s;
203*f6dc9357SAndroid Build Coastguard Worker     for (int i = 0; i < Exts.Size(); i++)
204*f6dc9357SAndroid Build Coastguard Worker     {
205*f6dc9357SAndroid Build Coastguard Worker       if (i > 0)
206*f6dc9357SAndroid Build Coastguard Worker         s.Add_Space();
207*f6dc9357SAndroid Build Coastguard Worker       s += Exts[i].Ext;
208*f6dc9357SAndroid Build Coastguard Worker     }
209*f6dc9357SAndroid Build Coastguard Worker     return s;
210*f6dc9357SAndroid Build Coastguard Worker   }
211*f6dc9357SAndroid Build Coastguard Worker   */
212*f6dc9357SAndroid Build Coastguard Worker 
213*f6dc9357SAndroid Build Coastguard Worker   void AddExts(const UString &ext, const UString &addExt);
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker 
CArcInfoExCArcInfoEx216*f6dc9357SAndroid Build Coastguard Worker   CArcInfoEx():
217*f6dc9357SAndroid Build Coastguard Worker       Flags(0),
218*f6dc9357SAndroid Build Coastguard Worker       TimeFlags(0),
219*f6dc9357SAndroid Build Coastguard Worker       CreateInArchive(NULL),
220*f6dc9357SAndroid Build Coastguard Worker       IsArcFunc(NULL)
221*f6dc9357SAndroid Build Coastguard Worker       #ifndef Z7_SFX
222*f6dc9357SAndroid Build Coastguard Worker       , CreateOutArchive(NULL)
223*f6dc9357SAndroid Build Coastguard Worker       , UpdateEnabled(false)
224*f6dc9357SAndroid Build Coastguard Worker       , NewInterface(false)
225*f6dc9357SAndroid Build Coastguard Worker       // , Version(0)
226*f6dc9357SAndroid Build Coastguard Worker       , SignatureOffset(0)
227*f6dc9357SAndroid Build Coastguard Worker       #endif
228*f6dc9357SAndroid Build Coastguard Worker       #ifdef Z7_EXTERNAL_CODECS
229*f6dc9357SAndroid Build Coastguard Worker       , LibIndex(-1)
230*f6dc9357SAndroid Build Coastguard Worker       #endif
231*f6dc9357SAndroid Build Coastguard Worker   {}
232*f6dc9357SAndroid Build Coastguard Worker };
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker 
235*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
236*f6dc9357SAndroid Build Coastguard Worker 
237*f6dc9357SAndroid Build Coastguard Worker struct CCodecLib
238*f6dc9357SAndroid Build Coastguard Worker {
239*f6dc9357SAndroid Build Coastguard Worker   NWindows::NDLL::CLibrary Lib;
240*f6dc9357SAndroid Build Coastguard Worker   FString Path;
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   Func_CreateObject CreateObject;
243*f6dc9357SAndroid Build Coastguard Worker   Func_GetMethodProperty GetMethodProperty;
244*f6dc9357SAndroid Build Coastguard Worker   Func_CreateDecoder CreateDecoder;
245*f6dc9357SAndroid Build Coastguard Worker   Func_CreateEncoder CreateEncoder;
246*f6dc9357SAndroid Build Coastguard Worker   Func_SetCodecs SetCodecs;
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IHashers> ComHashers;
249*f6dc9357SAndroid Build Coastguard Worker 
250*f6dc9357SAndroid Build Coastguard Worker   UInt32 Version;
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker   /*
253*f6dc9357SAndroid Build Coastguard Worker   #ifdef NEW_FOLDER_INTERFACE
254*f6dc9357SAndroid Build Coastguard Worker   CCodecIcons CodecIcons;
255*f6dc9357SAndroid Build Coastguard Worker   void LoadIcons() { CodecIcons.LoadIcons((HMODULE)Lib); }
256*f6dc9357SAndroid Build Coastguard Worker   #endif
257*f6dc9357SAndroid Build Coastguard Worker   */
258*f6dc9357SAndroid Build Coastguard Worker 
CCodecLibCCodecLib259*f6dc9357SAndroid Build Coastguard Worker   CCodecLib():
260*f6dc9357SAndroid Build Coastguard Worker       CreateObject(NULL),
261*f6dc9357SAndroid Build Coastguard Worker       GetMethodProperty(NULL),
262*f6dc9357SAndroid Build Coastguard Worker       CreateDecoder(NULL),
263*f6dc9357SAndroid Build Coastguard Worker       CreateEncoder(NULL),
264*f6dc9357SAndroid Build Coastguard Worker       SetCodecs(NULL),
265*f6dc9357SAndroid Build Coastguard Worker       Version(0)
266*f6dc9357SAndroid Build Coastguard Worker       {}
267*f6dc9357SAndroid Build Coastguard Worker };
268*f6dc9357SAndroid Build Coastguard Worker 
269*f6dc9357SAndroid Build Coastguard Worker #endif
270*f6dc9357SAndroid Build Coastguard Worker 
271*f6dc9357SAndroid Build Coastguard Worker struct CCodecError
272*f6dc9357SAndroid Build Coastguard Worker {
273*f6dc9357SAndroid Build Coastguard Worker   FString Path;
274*f6dc9357SAndroid Build Coastguard Worker   HRESULT ErrorCode;
275*f6dc9357SAndroid Build Coastguard Worker   AString Message;
CCodecErrorCCodecError276*f6dc9357SAndroid Build Coastguard Worker   CCodecError(): ErrorCode(0) {}
277*f6dc9357SAndroid Build Coastguard Worker };
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker 
280*f6dc9357SAndroid Build Coastguard Worker struct CCodecInfoUser
281*f6dc9357SAndroid Build Coastguard Worker {
282*f6dc9357SAndroid Build Coastguard Worker   // unsigned LibIndex;
283*f6dc9357SAndroid Build Coastguard Worker   // UInt32 CodecIndex;
284*f6dc9357SAndroid Build Coastguard Worker   // UInt64 id;
285*f6dc9357SAndroid Build Coastguard Worker   bool EncoderIsAssigned;
286*f6dc9357SAndroid Build Coastguard Worker   bool DecoderIsAssigned;
287*f6dc9357SAndroid Build Coastguard Worker   bool IsFilter;
288*f6dc9357SAndroid Build Coastguard Worker   bool IsFilter_Assigned;
289*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStreams;
290*f6dc9357SAndroid Build Coastguard Worker   AString Name;
291*f6dc9357SAndroid Build Coastguard Worker };
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker class CCodecs Z7_final:
295*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
296*f6dc9357SAndroid Build Coastguard Worker     public ICompressCodecsInfo,
297*f6dc9357SAndroid Build Coastguard Worker     public IHashers,
298*f6dc9357SAndroid Build Coastguard Worker   #else
299*f6dc9357SAndroid Build Coastguard Worker     public IUnknown,
300*f6dc9357SAndroid Build Coastguard Worker   #endif
301*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
302*f6dc9357SAndroid Build Coastguard Worker {
303*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
304*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_2(ICompressCodecsInfo, IHashers)
305*f6dc9357SAndroid Build Coastguard Worker #else
306*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_0
307*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_EXTERNAL_CODECS
308*f6dc9357SAndroid Build Coastguard Worker 
309*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CCodecs)
310*f6dc9357SAndroid Build Coastguard Worker public:
311*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
312*f6dc9357SAndroid Build Coastguard Worker 
313*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CCodecLib> Libs;
314*f6dc9357SAndroid Build Coastguard Worker   FString MainDll_ErrorPath;
315*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CCodecError> Errors;
316*f6dc9357SAndroid Build Coastguard Worker 
317*f6dc9357SAndroid Build Coastguard Worker   void AddLastError(const FString &path);
318*f6dc9357SAndroid Build Coastguard Worker   void CloseLibs();
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker   class CReleaser
321*f6dc9357SAndroid Build Coastguard Worker   {
Z7_CLASS_NO_COPY(CReleaser)322*f6dc9357SAndroid Build Coastguard Worker     Z7_CLASS_NO_COPY(CReleaser)
323*f6dc9357SAndroid Build Coastguard Worker 
324*f6dc9357SAndroid Build Coastguard Worker     /* CCodecsReleaser object releases CCodecs links.
325*f6dc9357SAndroid Build Coastguard Worker          1) CCodecs is COM object that is deleted when all links to that object will be released/
326*f6dc9357SAndroid Build Coastguard Worker          2) CCodecs::Libs[i] can hold (ICompressCodecsInfo *) link to CCodecs object itself.
327*f6dc9357SAndroid Build Coastguard Worker        To break that reference loop, we must close all CCodecs::Libs in CCodecsReleaser desttructor. */
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker     CCodecs *_codecs;
330*f6dc9357SAndroid Build Coastguard Worker 
331*f6dc9357SAndroid Build Coastguard Worker     public:
332*f6dc9357SAndroid Build Coastguard Worker     CReleaser(): _codecs(NULL) {}
Set(CCodecs * codecs)333*f6dc9357SAndroid Build Coastguard Worker     void Set(CCodecs *codecs) { _codecs = codecs; }
~CReleaser()334*f6dc9357SAndroid Build Coastguard Worker     ~CReleaser() { if (_codecs) _codecs->CloseLibs(); }
335*f6dc9357SAndroid Build Coastguard Worker   };
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker   bool NeedSetLibCodecs; // = false, if we don't need to set codecs for archive handler via ISetCompressCodecsInfo
338*f6dc9357SAndroid Build Coastguard Worker 
339*f6dc9357SAndroid Build Coastguard Worker   HRESULT LoadCodecs();
340*f6dc9357SAndroid Build Coastguard Worker   HRESULT LoadFormats();
341*f6dc9357SAndroid Build Coastguard Worker   HRESULT LoadDll(const FString &path, bool needCheckDll, bool *loadedOK = NULL);
342*f6dc9357SAndroid Build Coastguard Worker   HRESULT LoadDllsFromFolder(const FString &folderPrefix);
343*f6dc9357SAndroid Build Coastguard Worker 
CreateArchiveHandler(const CArcInfoEx & ai,bool outHandler,void ** archive)344*f6dc9357SAndroid Build Coastguard Worker   HRESULT CreateArchiveHandler(const CArcInfoEx &ai, bool outHandler, void **archive) const
345*f6dc9357SAndroid Build Coastguard Worker   {
346*f6dc9357SAndroid Build Coastguard Worker     return Libs[(unsigned)ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive);
347*f6dc9357SAndroid Build Coastguard Worker   }
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker   #endif
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker   /*
352*f6dc9357SAndroid Build Coastguard Worker   #ifdef NEW_FOLDER_INTERFACE
353*f6dc9357SAndroid Build Coastguard Worker   CCodecIcons InternalIcons;
354*f6dc9357SAndroid Build Coastguard Worker   #endif
355*f6dc9357SAndroid Build Coastguard Worker   */
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CArcInfoEx> Formats;
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
360*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CDllCodecInfo> Codecs;
361*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CDllHasherInfo> Hashers;
362*f6dc9357SAndroid Build Coastguard Worker   #endif
363*f6dc9357SAndroid Build Coastguard Worker 
364*f6dc9357SAndroid Build Coastguard Worker   bool CaseSensitive_Change;
365*f6dc9357SAndroid Build Coastguard Worker   bool CaseSensitive;
366*f6dc9357SAndroid Build Coastguard Worker 
CCodecs()367*f6dc9357SAndroid Build Coastguard Worker   CCodecs():
368*f6dc9357SAndroid Build Coastguard Worker       #ifdef Z7_EXTERNAL_CODECS
369*f6dc9357SAndroid Build Coastguard Worker       NeedSetLibCodecs(true),
370*f6dc9357SAndroid Build Coastguard Worker       #endif
371*f6dc9357SAndroid Build Coastguard Worker       CaseSensitive_Change(false),
372*f6dc9357SAndroid Build Coastguard Worker       CaseSensitive(false)
373*f6dc9357SAndroid Build Coastguard Worker       {}
374*f6dc9357SAndroid Build Coastguard Worker 
~CCodecs()375*f6dc9357SAndroid Build Coastguard Worker   ~CCodecs()
376*f6dc9357SAndroid Build Coastguard Worker   {
377*f6dc9357SAndroid Build Coastguard Worker     // OutputDebugStringA("~CCodecs");
378*f6dc9357SAndroid Build Coastguard Worker   }
379*f6dc9357SAndroid Build Coastguard Worker 
GetFormatNamePtr(int formatIndex)380*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *GetFormatNamePtr(int formatIndex) const
381*f6dc9357SAndroid Build Coastguard Worker   {
382*f6dc9357SAndroid Build Coastguard Worker     return formatIndex < 0 ? L"#" : (const wchar_t *)Formats[(unsigned)formatIndex].Name;
383*f6dc9357SAndroid Build Coastguard Worker   }
384*f6dc9357SAndroid Build Coastguard Worker 
385*f6dc9357SAndroid Build Coastguard Worker   HRESULT Load();
386*f6dc9357SAndroid Build Coastguard Worker 
387*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
388*f6dc9357SAndroid Build Coastguard Worker   int FindFormatForArchiveName(const UString &arcPath) const;
389*f6dc9357SAndroid Build Coastguard Worker   int FindFormatForExtension(const UString &ext) const;
390*f6dc9357SAndroid Build Coastguard Worker   int FindFormatForArchiveType(const UString &arcType) const;
391*f6dc9357SAndroid Build Coastguard Worker   bool FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const;
392*f6dc9357SAndroid Build Coastguard Worker   #endif
393*f6dc9357SAndroid Build Coastguard Worker 
394*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
395*f6dc9357SAndroid Build Coastguard Worker 
396*f6dc9357SAndroid Build Coastguard Worker   int GetCodec_LibIndex(UInt32 index) const;
397*f6dc9357SAndroid Build Coastguard Worker   bool GetCodec_DecoderIsAssigned(UInt32 index) const;
398*f6dc9357SAndroid Build Coastguard Worker   bool GetCodec_EncoderIsAssigned(UInt32 index) const;
399*f6dc9357SAndroid Build Coastguard Worker   bool GetCodec_IsFilter(UInt32 index, bool &isAssigned) const;
400*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetCodec_NumStreams(UInt32 index);
401*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetCodec_Id(UInt32 index, UInt64 &id);
402*f6dc9357SAndroid Build Coastguard Worker   AString GetCodec_Name(UInt32 index);
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker   int GetHasherLibIndex(UInt32 index);
405*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetHasherId(UInt32 index);
406*f6dc9357SAndroid Build Coastguard Worker   AString GetHasherName(UInt32 index);
407*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetHasherDigestSize(UInt32 index);
408*f6dc9357SAndroid Build Coastguard Worker 
409*f6dc9357SAndroid Build Coastguard Worker   void GetCodecsErrorMessage(UString &s);
410*f6dc9357SAndroid Build Coastguard Worker 
411*f6dc9357SAndroid Build Coastguard Worker   #endif
412*f6dc9357SAndroid Build Coastguard Worker 
CreateInArchive(unsigned formatIndex,CMyComPtr<IInArchive> & archive)413*f6dc9357SAndroid Build Coastguard Worker   HRESULT CreateInArchive(unsigned formatIndex, CMyComPtr<IInArchive> &archive) const
414*f6dc9357SAndroid Build Coastguard Worker   {
415*f6dc9357SAndroid Build Coastguard Worker     const CArcInfoEx &ai = Formats[formatIndex];
416*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
417*f6dc9357SAndroid Build Coastguard Worker     if (ai.LibIndex < 0)
418*f6dc9357SAndroid Build Coastguard Worker     #endif
419*f6dc9357SAndroid Build Coastguard Worker     {
420*f6dc9357SAndroid Build Coastguard Worker       COM_TRY_BEGIN
421*f6dc9357SAndroid Build Coastguard Worker       archive = ai.CreateInArchive();
422*f6dc9357SAndroid Build Coastguard Worker       return S_OK;
423*f6dc9357SAndroid Build Coastguard Worker       COM_TRY_END
424*f6dc9357SAndroid Build Coastguard Worker     }
425*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
426*f6dc9357SAndroid Build Coastguard Worker     return CreateArchiveHandler(ai, false, (void **)&archive);
427*f6dc9357SAndroid Build Coastguard Worker     #endif
428*f6dc9357SAndroid Build Coastguard Worker   }
429*f6dc9357SAndroid Build Coastguard Worker 
430*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
431*f6dc9357SAndroid Build Coastguard Worker 
CreateOutArchive(unsigned formatIndex,CMyComPtr<IOutArchive> & archive)432*f6dc9357SAndroid Build Coastguard Worker   HRESULT CreateOutArchive(unsigned formatIndex, CMyComPtr<IOutArchive> &archive) const
433*f6dc9357SAndroid Build Coastguard Worker   {
434*f6dc9357SAndroid Build Coastguard Worker     const CArcInfoEx &ai = Formats[formatIndex];
435*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
436*f6dc9357SAndroid Build Coastguard Worker     if (ai.LibIndex < 0)
437*f6dc9357SAndroid Build Coastguard Worker     #endif
438*f6dc9357SAndroid Build Coastguard Worker     {
439*f6dc9357SAndroid Build Coastguard Worker       COM_TRY_BEGIN
440*f6dc9357SAndroid Build Coastguard Worker       archive = ai.CreateOutArchive();
441*f6dc9357SAndroid Build Coastguard Worker       return S_OK;
442*f6dc9357SAndroid Build Coastguard Worker       COM_TRY_END
443*f6dc9357SAndroid Build Coastguard Worker     }
444*f6dc9357SAndroid Build Coastguard Worker 
445*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
446*f6dc9357SAndroid Build Coastguard Worker     return CreateArchiveHandler(ai, true, (void **)&archive);
447*f6dc9357SAndroid Build Coastguard Worker     #endif
448*f6dc9357SAndroid Build Coastguard Worker   }
449*f6dc9357SAndroid Build Coastguard Worker 
FindOutFormatFromName(const UString & name)450*f6dc9357SAndroid Build Coastguard Worker   int FindOutFormatFromName(const UString &name) const
451*f6dc9357SAndroid Build Coastguard Worker   {
452*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Formats)
453*f6dc9357SAndroid Build Coastguard Worker     {
454*f6dc9357SAndroid Build Coastguard Worker       const CArcInfoEx &arc = Formats[i];
455*f6dc9357SAndroid Build Coastguard Worker       if (!arc.UpdateEnabled)
456*f6dc9357SAndroid Build Coastguard Worker         continue;
457*f6dc9357SAndroid Build Coastguard Worker       if (arc.Name.IsEqualTo_NoCase(name))
458*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
459*f6dc9357SAndroid Build Coastguard Worker     }
460*f6dc9357SAndroid Build Coastguard Worker     return -1;
461*f6dc9357SAndroid Build Coastguard Worker   }
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker   void Get_CodecsInfoUser_Vector(CObjectVector<CCodecInfoUser> &v);
464*f6dc9357SAndroid Build Coastguard Worker 
465*f6dc9357SAndroid Build Coastguard Worker   #endif // Z7_SFX
466*f6dc9357SAndroid Build Coastguard Worker };
467*f6dc9357SAndroid Build Coastguard Worker 
468*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
469*f6dc9357SAndroid Build Coastguard Worker   #define CREATE_CODECS_OBJECT \
470*f6dc9357SAndroid Build Coastguard Worker     CCodecs *codecs = new CCodecs; \
471*f6dc9357SAndroid Build Coastguard Worker     CExternalCodecs _externalCodecs; \
472*f6dc9357SAndroid Build Coastguard Worker     _externalCodecs.GetCodecs = codecs; \
473*f6dc9357SAndroid Build Coastguard Worker     _externalCodecs.GetHashers = codecs; \
474*f6dc9357SAndroid Build Coastguard Worker     CCodecs::CReleaser codecsReleaser; \
475*f6dc9357SAndroid Build Coastguard Worker     codecsReleaser.Set(codecs);
476*f6dc9357SAndroid Build Coastguard Worker #else
477*f6dc9357SAndroid Build Coastguard Worker   #define CREATE_CODECS_OBJECT \
478*f6dc9357SAndroid Build Coastguard Worker     CCodecs *codecs = new CCodecs; \
479*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IUnknown> _codecsRef = codecs;
480*f6dc9357SAndroid Build Coastguard Worker #endif
481*f6dc9357SAndroid Build Coastguard Worker 
482*f6dc9357SAndroid Build Coastguard Worker #endif
483