| // CreateCoder.h |
| |
| #ifndef ZIP7_INC_CREATE_CODER_H |
| #define ZIP7_INC_CREATE_CODER_H |
| |
| #include "../../Common/MyCom.h" |
| #include "../../Common/MyString.h" |
| |
| #include "../ICoder.h" |
| |
| #include "MethodId.h" |
| |
| /* |
| if Z7_EXTERNAL_CODECS is not defined, the code supports only codecs that |
| are statically linked at compile-time and link-time. |
| |
| if Z7_EXTERNAL_CODECS is defined, the code supports also codecs from another |
| executable modules, that can be linked dynamically at run-time: |
| - EXE module can use codecs from external DLL files. |
| - DLL module can use codecs from external EXE and DLL files. |
| |
| CExternalCodecs contains information about codecs and interfaces to create them. |
| |
| The order of codecs: |
| 1) Internal codecs |
| 2) External codecs |
| */ |
| |
| #ifdef Z7_EXTERNAL_CODECS |
| |
| struct CCodecInfoEx |
| { |
| CMethodId Id; |
| AString Name; |
| UInt32 NumStreams; |
| bool EncoderIsAssigned; |
| bool DecoderIsAssigned; |
| bool IsFilter; // it's unused |
| |
| CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false), IsFilter(false) {} |
| }; |
| |
| struct CHasherInfoEx |
| { |
| CMethodId Id; |
| AString Name; |
| }; |
| |
| #define Z7_PUBLIC_ISetCompressCodecsInfo_IFEC \ |
| public ISetCompressCodecsInfo, |
| #define Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC \ |
| Z7_COM_QI_ENTRY(ISetCompressCodecsInfo) |
| #define DECL_ISetCompressCodecsInfo \ |
| Z7_COM7F_IMP(SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo)) |
| #define IMPL_ISetCompressCodecsInfo2(cls) \ |
| Z7_COM7F_IMF(cls::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo)) \ |
| { COM_TRY_BEGIN _externalCodecs.GetCodecs = compressCodecsInfo; \ |
| return _externalCodecs.Load(); COM_TRY_END } |
| #define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler) |
| |
| struct CExternalCodecs |
| { |
| CMyComPtr<ICompressCodecsInfo> GetCodecs; |
| CMyComPtr<IHashers> GetHashers; |
| |
| CObjectVector<CCodecInfoEx> Codecs; |
| CObjectVector<CHasherInfoEx> Hashers; |
| |
| bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; } |
| |
| HRESULT Load(); |
| |
| void ClearAndRelease() |
| { |
| Hashers.Clear(); |
| Codecs.Clear(); |
| GetHashers.Release(); |
| GetCodecs.Release(); |
| } |
| |
| ~CExternalCodecs() |
| { |
| GetHashers.Release(); |
| GetCodecs.Release(); |
| } |
| }; |
| |
| extern CExternalCodecs g_ExternalCodecs; |
| |
| #define EXTERNAL_CODECS_VARS2 (_externalCodecs.IsSet() ? &_externalCodecs : &g_ExternalCodecs) |
| #define EXTERNAL_CODECS_VARS2_L (&_externalCodecs) |
| #define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs) |
| |
| #define DECL_EXTERNAL_CODECS_VARS CExternalCodecs _externalCodecs; |
| |
| #define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2, |
| #define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L, |
| #define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G, |
| |
| #define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *_externalCodecs |
| #define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2, |
| #define DECL_EXTERNAL_CODECS_LOC_VARS_DECL DECL_EXTERNAL_CODECS_LOC_VARS2; |
| |
| #define EXTERNAL_CODECS_LOC_VARS2 _externalCodecs |
| #define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2, |
| |
| #else |
| |
| #define Z7_PUBLIC_ISetCompressCodecsInfo_IFEC |
| #define Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC |
| #define DECL_ISetCompressCodecsInfo |
| #define IMPL_ISetCompressCodecsInfo |
| #define EXTERNAL_CODECS_VARS2 |
| #define DECL_EXTERNAL_CODECS_VARS |
| #define EXTERNAL_CODECS_VARS |
| #define EXTERNAL_CODECS_VARS_L |
| #define EXTERNAL_CODECS_VARS_G |
| #define DECL_EXTERNAL_CODECS_LOC_VARS2 |
| #define DECL_EXTERNAL_CODECS_LOC_VARS |
| #define DECL_EXTERNAL_CODECS_LOC_VARS_DECL |
| #define EXTERNAL_CODECS_LOC_VARS2 |
| #define EXTERNAL_CODECS_LOC_VARS |
| |
| #endif |
| |
| int FindMethod_Index( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| const AString &name, |
| bool encode, |
| CMethodId &methodId, |
| UInt32 &numStreams, |
| bool &isFilter); |
| |
| bool FindMethod( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CMethodId methodId, |
| AString &name); |
| |
| bool FindHashMethod( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| const AString &name, |
| CMethodId &methodId); |
| |
| void GetHashMethods( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CRecordVector<CMethodId> &methods); |
| |
| |
| struct CCreatedCoder |
| { |
| CMyComPtr<ICompressCoder> Coder; |
| CMyComPtr<ICompressCoder2> Coder2; |
| |
| bool IsExternal; |
| bool IsFilter; // = true, if Coder was created from filter |
| UInt32 NumStreams; |
| |
| // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {} |
| }; |
| |
| |
| HRESULT CreateCoder_Index( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| unsigned codecIndex, bool encode, |
| CMyComPtr<ICompressFilter> &filter, |
| CCreatedCoder &cod); |
| |
| HRESULT CreateCoder_Index( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| unsigned index, bool encode, |
| CCreatedCoder &cod); |
| |
| HRESULT CreateCoder_Id( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CMethodId methodId, bool encode, |
| CMyComPtr<ICompressFilter> &filter, |
| CCreatedCoder &cod); |
| |
| HRESULT CreateCoder_Id( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CMethodId methodId, bool encode, |
| CCreatedCoder &cod); |
| |
| HRESULT CreateCoder_Id( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CMethodId methodId, bool encode, |
| CMyComPtr<ICompressCoder> &coder); |
| |
| HRESULT CreateFilter( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CMethodId methodId, bool encode, |
| CMyComPtr<ICompressFilter> &filter); |
| |
| HRESULT CreateHasher( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CMethodId methodId, |
| AString &name, |
| CMyComPtr<IHasher> &hasher); |
| |
| #endif |