// LoadCodecs.h #ifndef __LOADCODECS_H #define __LOADCODECS_H #include "../../../Common/Types.h" #include "../../../Common/MyCom.h" #include "../../../Common/MyString.h" #include "../../../Common/Buffer.h" #include "../../ICoder.h" #ifdef EXTERNAL_CODECS #include "../../../Windows/DLL.h" #endif struct CDllCodecInfo { CLSID Encoder; CLSID Decoder; bool EncoderIsAssigned; bool DecoderIsAssigned; int LibIndex; UInt32 CodecIndex; }; #include "../../Archive/IArchive.h" typedef IInArchive * (*CreateInArchiveP)(); typedef IOutArchive * (*CreateOutArchiveP)(); struct CArcExtInfo { UString Ext; UString AddExt; CArcExtInfo() {} CArcExtInfo(const UString &ext): Ext(ext) {} CArcExtInfo(const UString &ext, const UString &addExt): Ext(ext), AddExt(addExt) {} }; struct CArcInfoEx { #ifdef EXTERNAL_CODECS int LibIndex; UInt32 FormatIndex; CLSID ClassID; #endif bool UpdateEnabled; CreateInArchiveP CreateInArchive; CreateOutArchiveP CreateOutArchive; UString Name; CObjectVector Exts; #ifndef _SFX CByteBuffer StartSignature; // CByteBuffer FinishSignature; #ifdef NEW_FOLDER_INTERFACE UStringVector AssociateExts; #endif #endif bool KeepName; UString GetMainExt() const { if (Exts.IsEmpty()) return UString(); return Exts[0].Ext; } int FindExtension(const UString &ext) const { for (int i = 0; i < Exts.Size(); i++) if (ext.CompareNoCase(Exts[i].Ext) == 0) return i; return -1; } UString GetAllExtensions() const { UString s; for (int i = 0; i < Exts.Size(); i++) { if (i > 0) s += ' '; s += Exts[i].Ext; } return s; } void AddExts(const wchar_t* ext, const wchar_t* addExt); CArcInfoEx(): #ifdef EXTERNAL_CODECS LibIndex(-1), #endif UpdateEnabled(false), CreateInArchive(0), CreateOutArchive(0), KeepName(false) #ifndef _SFX #endif {} }; #ifdef EXTERNAL_CODECS typedef UInt32 (WINAPI *GetMethodPropertyFunc)(UInt32 index, PROPID propID, PROPVARIANT *value); typedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfaceID, void **outObject); #ifdef NEW_FOLDER_INTERFACE struct CCodecIcons { struct CIconPair { UString Ext; int IconIndex; }; CObjectVector IconPairs; void LoadIcons(HMODULE m); bool FindIconIndex(const UString &ext, int &iconIndex) const; }; #endif struct CCodecLib #ifdef NEW_FOLDER_INTERFACE : public CCodecIcons #endif { NWindows::NDLL::CLibrary Lib; GetMethodPropertyFunc GetMethodProperty; CreateObjectFunc CreateObject; #ifdef NEW_FOLDER_INTERFACE CSysString Path; void LoadIcons() { CCodecIcons::LoadIcons((HMODULE)Lib); } #endif CCodecLib(): GetMethodProperty(0) {} }; #endif class CCodecs: #ifdef EXTERNAL_CODECS public ICompressCodecsInfo, #else public IUnknown, #endif public CMyUnknownImp { public: #ifdef EXTERNAL_CODECS CObjectVector Libs; CObjectVector Codecs; #ifdef NEW_FOLDER_INTERFACE CCodecIcons InternalIcons; #endif HRESULT LoadCodecs(); HRESULT LoadFormats(); HRESULT LoadDll(const CSysString &path, bool needCheckDll); HRESULT LoadDllsFromFolder(const CSysString &folderPrefix); HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHandler) const { return Libs[ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive); } #endif public: CObjectVector Formats; HRESULT Load(); #ifndef _SFX int FindFormatForArchiveName(const UString &arcPath) const; int FindFormatForExtension(const UString &ext) const; int FindFormatForArchiveType(const UString &arcType) const; bool FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const; #endif MY_UNKNOWN_IMP #ifdef EXTERNAL_CODECS STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods); STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); STDMETHOD(CreateDecoder)(UInt32 index, const GUID *interfaceID, void **coder); STDMETHOD(CreateEncoder)(UInt32 index, const GUID *interfaceID, void **coder); #endif int GetCodecLibIndex(UInt32 index); bool GetCodecEncoderIsAssigned(UInt32 index); HRESULT GetCodecId(UInt32 index, UInt64 &id); UString GetCodecName(UInt32 index); HRESULT CreateInArchive(int formatIndex, CMyComPtr &archive) const { const CArcInfoEx &ai = Formats[formatIndex]; #ifdef EXTERNAL_CODECS if (ai.LibIndex < 0) #endif { archive = ai.CreateInArchive(); return S_OK; } #ifdef EXTERNAL_CODECS return CreateArchiveHandler(ai, (void **)&archive, false); #endif } HRESULT CreateOutArchive(int formatIndex, CMyComPtr &archive) const { const CArcInfoEx &ai = Formats[formatIndex]; #ifdef EXTERNAL_CODECS if (ai.LibIndex < 0) #endif { archive = ai.CreateOutArchive(); return S_OK; } #ifdef EXTERNAL_CODECS return CreateArchiveHandler(ai, (void **)&archive, true); #endif } int FindOutFormatFromName(const UString &name) const { for (int i = 0; i < Formats.Size(); i++) { const CArcInfoEx &arc = Formats[i]; if (!arc.UpdateEnabled) continue; if (arc.Name.CompareNoCase(name) == 0) return i; } return -1; } #ifdef EXTERNAL_CODECS HRESULT CreateCoder(const UString &name, bool encode, CMyComPtr &coder) const; #endif }; #endif