// 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 GetCodecs; CMyComPtr GetHashers; CObjectVector Codecs; CObjectVector 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 &methods); struct CCreatedCoder { CMyComPtr Coder; CMyComPtr 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 &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 &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 &coder); HRESULT CreateFilter( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, bool encode, CMyComPtr &filter); HRESULT CreateHasher( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, AString &name, CMyComPtr &hasher); #endif