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