1 // LoadCodecs.h 2 3 #ifndef __LOADCODECS_H 4 #define __LOADCODECS_H 5 6 #include "../../../Common/Types.h" 7 #include "../../../Common/MyCom.h" 8 #include "../../../Common/MyString.h" 9 #include "../../../Common/Buffer.h" 10 #include "../../ICoder.h" 11 12 #ifdef EXTERNAL_CODECS 13 #include "../../../Windows/DLL.h" 14 #endif 15 16 struct CDllCodecInfo 17 { 18 CLSID Encoder; 19 CLSID Decoder; 20 bool EncoderIsAssigned; 21 bool DecoderIsAssigned; 22 int LibIndex; 23 UInt32 CodecIndex; 24 }; 25 26 #include "../../Archive/IArchive.h" 27 28 typedef IInArchive * (*CreateInArchiveP)(); 29 typedef IOutArchive * (*CreateOutArchiveP)(); 30 31 struct CArcExtInfo 32 { 33 UString Ext; 34 UString AddExt; 35 CArcExtInfo() {} 36 CArcExtInfo(const UString &ext): Ext(ext) {} 37 CArcExtInfo(const UString &ext, const UString &addExt): Ext(ext), AddExt(addExt) {} 38 }; 39 40 41 struct CArcInfoEx 42 { 43 #ifdef EXTERNAL_CODECS 44 int LibIndex; 45 UInt32 FormatIndex; 46 CLSID ClassID; 47 #endif 48 bool UpdateEnabled; 49 CreateInArchiveP CreateInArchive; 50 CreateOutArchiveP CreateOutArchive; 51 UString Name; 52 CObjectVector<CArcExtInfo> Exts; 53 #ifndef _SFX 54 CByteBuffer StartSignature; 55 // CByteBuffer FinishSignature; 56 #ifdef NEW_FOLDER_INTERFACE 57 UStringVector AssociateExts; 58 #endif 59 #endif 60 bool KeepName; 61 UString GetMainExt() const 62 { 63 if (Exts.IsEmpty()) 64 return UString(); 65 return Exts[0].Ext; 66 } 67 int FindExtension(const UString &ext) const 68 { 69 for (int i = 0; i < Exts.Size(); i++) 70 if (ext.CompareNoCase(Exts[i].Ext) == 0) 71 return i; 72 return -1; 73 } 74 UString GetAllExtensions() const 75 { 76 UString s; 77 for (int i = 0; i < Exts.Size(); i++) 78 { 79 if (i > 0) 80 s += ' '; 81 s += Exts[i].Ext; 82 } 83 return s; 84 } 85 86 void AddExts(const wchar_t* ext, const wchar_t* addExt); 87 88 CArcInfoEx(): 89 #ifdef EXTERNAL_CODECS 90 LibIndex(-1), 91 #endif 92 UpdateEnabled(false), 93 CreateInArchive(0), CreateOutArchive(0), 94 KeepName(false) 95 #ifndef _SFX 96 #endif 97 {} 98 }; 99 100 #ifdef EXTERNAL_CODECS 101 typedef UInt32 (WINAPI *GetMethodPropertyFunc)(UInt32 index, PROPID propID, PROPVARIANT *value); 102 typedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfaceID, void **outObject); 103 104 105 #ifdef NEW_FOLDER_INTERFACE 106 struct CCodecIcons 107 { 108 struct CIconPair 109 { 110 UString Ext; 111 int IconIndex; 112 }; 113 CObjectVector<CIconPair> IconPairs; 114 void LoadIcons(HMODULE m); 115 bool FindIconIndex(const UString &ext, int &iconIndex) const; 116 }; 117 #endif 118 119 struct CCodecLib 120 #ifdef NEW_FOLDER_INTERFACE 121 : public CCodecIcons 122 #endif 123 { 124 NWindows::NDLL::CLibrary Lib; 125 GetMethodPropertyFunc GetMethodProperty; 126 CreateObjectFunc CreateObject; 127 #ifdef NEW_FOLDER_INTERFACE 128 CSysString Path; 129 void LoadIcons() { CCodecIcons::LoadIcons((HMODULE)Lib); } 130 #endif 131 CCodecLib(): GetMethodProperty(0) {} 132 }; 133 #endif 134 135 class CCodecs: 136 #ifdef EXTERNAL_CODECS 137 public ICompressCodecsInfo, 138 #else 139 public IUnknown, 140 #endif 141 public CMyUnknownImp 142 { 143 public: 144 #ifdef EXTERNAL_CODECS 145 CObjectVector<CCodecLib> Libs; 146 CObjectVector<CDllCodecInfo> Codecs; 147 148 #ifdef NEW_FOLDER_INTERFACE 149 CCodecIcons InternalIcons; 150 #endif 151 152 HRESULT LoadCodecs(); 153 HRESULT LoadFormats(); 154 HRESULT LoadDll(const CSysString &path, bool needCheckDll); 155 HRESULT LoadDllsFromFolder(const CSysString &folderPrefix); 156 157 HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHandler) const 158 { 159 return Libs[ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive); 160 } 161 #endif 162 163 public: 164 CObjectVector<CArcInfoEx> Formats; 165 HRESULT Load(); 166 167 #ifndef _SFX 168 int FindFormatForArchiveName(const UString &arcPath) const; 169 int FindFormatForExtension(const UString &ext) const; 170 int FindFormatForArchiveType(const UString &arcType) const; 171 bool FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const; 172 #endif 173 174 MY_UNKNOWN_IMP 175 176 #ifdef EXTERNAL_CODECS 177 STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods); 178 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); 179 STDMETHOD(CreateDecoder)(UInt32 index, const GUID *interfaceID, void **coder); 180 STDMETHOD(CreateEncoder)(UInt32 index, const GUID *interfaceID, void **coder); 181 #endif 182 183 int GetCodecLibIndex(UInt32 index); 184 bool GetCodecEncoderIsAssigned(UInt32 index); 185 HRESULT GetCodecId(UInt32 index, UInt64 &id); 186 UString GetCodecName(UInt32 index); 187 188 HRESULT CreateInArchive(int formatIndex, CMyComPtr<IInArchive> &archive) const 189 { 190 const CArcInfoEx &ai = Formats[formatIndex]; 191 #ifdef EXTERNAL_CODECS 192 if (ai.LibIndex < 0) 193 #endif 194 { 195 archive = ai.CreateInArchive(); 196 return S_OK; 197 } 198 #ifdef EXTERNAL_CODECS 199 return CreateArchiveHandler(ai, (void **)&archive, false); 200 #endif 201 } 202 HRESULT CreateOutArchive(int formatIndex, CMyComPtr<IOutArchive> &archive) const 203 { 204 const CArcInfoEx &ai = Formats[formatIndex]; 205 #ifdef EXTERNAL_CODECS 206 if (ai.LibIndex < 0) 207 #endif 208 { 209 archive = ai.CreateOutArchive(); 210 return S_OK; 211 } 212 #ifdef EXTERNAL_CODECS 213 return CreateArchiveHandler(ai, (void **)&archive, true); 214 #endif 215 } 216 int FindOutFormatFromName(const UString &name) const 217 { 218 for (int i = 0; i < Formats.Size(); i++) 219 { 220 const CArcInfoEx &arc = Formats[i]; 221 if (!arc.UpdateEnabled) 222 continue; 223 if (arc.Name.CompareNoCase(name) == 0) 224 return i; 225 } 226 return -1; 227 } 228 229 #ifdef EXTERNAL_CODECS 230 HRESULT CreateCoder(const UString &name, bool encode, CMyComPtr<ICompressCoder> &coder) const; 231 #endif 232 233 }; 234 235 #endif 236