OLD | NEW |
| (Empty) |
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(addEx
t) {} | |
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, PROP
VARIANT *value); | |
102 typedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfa
ceID, void **outObject); | |
103 | |
104 | |
105 struct CCodecLib | |
106 { | |
107 NWindows::NDLL::CLibrary Lib; | |
108 GetMethodPropertyFunc GetMethodProperty; | |
109 CreateObjectFunc CreateObject; | |
110 #ifdef NEW_FOLDER_INTERFACE | |
111 struct CIconPair | |
112 { | |
113 UString Ext; | |
114 UInt32 IconIndex; | |
115 }; | |
116 CSysString Path; | |
117 CObjectVector<CIconPair> IconPairs; | |
118 void LoadIcons(); | |
119 int FindIconIndex(const UString &ext) const; | |
120 #endif | |
121 CCodecLib(): GetMethodProperty(0) {} | |
122 }; | |
123 #endif | |
124 | |
125 class CCodecs: | |
126 #ifdef EXTERNAL_CODECS | |
127 public ICompressCodecsInfo, | |
128 #else | |
129 public IUnknown, | |
130 #endif | |
131 public CMyUnknownImp | |
132 { | |
133 public: | |
134 #ifdef EXTERNAL_CODECS | |
135 CObjectVector<CCodecLib> Libs; | |
136 CObjectVector<CDllCodecInfo> Codecs; | |
137 HRESULT LoadCodecs(); | |
138 HRESULT LoadFormats(); | |
139 HRESULT LoadDll(const CSysString &path); | |
140 HRESULT LoadDllsFromFolder(const CSysString &folderPrefix); | |
141 | |
142 HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHan
dler) const | |
143 { | |
144 return Libs[ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArc
hive : &IID_IInArchive, (void **)archive); | |
145 } | |
146 #endif | |
147 | |
148 public: | |
149 CObjectVector<CArcInfoEx> Formats; | |
150 HRESULT Load(); | |
151 | |
152 #ifndef _SFX | |
153 int FindFormatForArchiveName(const UString &arcPath) const; | |
154 int FindFormatForExtension(const UString &ext) const; | |
155 int FindFormatForArchiveType(const UString &arcType) const; | |
156 bool FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndice
s) const; | |
157 #endif | |
158 | |
159 MY_UNKNOWN_IMP | |
160 | |
161 #ifdef EXTERNAL_CODECS | |
162 STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods); | |
163 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); | |
164 STDMETHOD(CreateDecoder)(UInt32 index, const GUID *interfaceID, void **coder); | |
165 STDMETHOD(CreateEncoder)(UInt32 index, const GUID *interfaceID, void **coder); | |
166 #endif | |
167 | |
168 int GetCodecLibIndex(UInt32 index); | |
169 bool GetCodecEncoderIsAssigned(UInt32 index); | |
170 HRESULT GetCodecId(UInt32 index, UInt64 &id); | |
171 UString GetCodecName(UInt32 index); | |
172 | |
173 HRESULT CreateInArchive(int formatIndex, CMyComPtr<IInArchive> &archive) const | |
174 { | |
175 const CArcInfoEx &ai = Formats[formatIndex]; | |
176 #ifdef EXTERNAL_CODECS | |
177 if (ai.LibIndex < 0) | |
178 #endif | |
179 { | |
180 archive = ai.CreateInArchive(); | |
181 return S_OK; | |
182 } | |
183 #ifdef EXTERNAL_CODECS | |
184 return CreateArchiveHandler(ai, (void **)&archive, false); | |
185 #endif | |
186 } | |
187 HRESULT CreateOutArchive(int formatIndex, CMyComPtr<IOutArchive> &archive) con
st | |
188 { | |
189 const CArcInfoEx &ai = Formats[formatIndex]; | |
190 #ifdef EXTERNAL_CODECS | |
191 if (ai.LibIndex < 0) | |
192 #endif | |
193 { | |
194 archive = ai.CreateOutArchive(); | |
195 return S_OK; | |
196 } | |
197 #ifdef EXTERNAL_CODECS | |
198 return CreateArchiveHandler(ai, (void **)&archive, true); | |
199 #endif | |
200 } | |
201 int FindOutFormatFromName(const UString &name) const | |
202 { | |
203 for (int i = 0; i < Formats.Size(); i++) | |
204 { | |
205 const CArcInfoEx &arc = Formats[i]; | |
206 if (!arc.UpdateEnabled) | |
207 continue; | |
208 if (arc.Name.CompareNoCase(name) == 0) | |
209 return i; | |
210 } | |
211 return -1; | |
212 } | |
213 | |
214 #ifdef EXTERNAL_CODECS | |
215 HRESULT CreateCoder(const UString &name, bool encode, CMyComPtr<ICompressCoder
> &coder) const; | |
216 #endif | |
217 | |
218 }; | |
219 | |
220 #endif | |
OLD | NEW |