tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

CreateCoder.h (5233B)


      1 // CreateCoder.h
      2 
      3 #ifndef __CREATE_CODER_H
      4 #define __CREATE_CODER_H
      5 
      6 #include "../../Common/MyCom.h"
      7 #include "../../Common/MyString.h"
      8 
      9 #include "../ICoder.h"
     10 
     11 #include "MethodId.h"
     12 
     13 /*
     14  if EXTERNAL_CODECS is not defined, the code supports only codecs that
     15      are statically linked at compile-time and link-time.
     16 
     17  if EXTERNAL_CODECS is defined, the code supports also codecs from another
     18      executable modules, that can be linked dynamically at run-time:
     19        - EXE module can use codecs from external DLL files.
     20        - DLL module can use codecs from external EXE and DLL files.
     21     
     22      CExternalCodecs contains information about codecs and interfaces to create them.
     23  
     24  The order of codecs:
     25    1) Internal codecs
     26    2) External codecs
     27 */
     28 
     29 #ifdef EXTERNAL_CODECS
     30 
     31 struct CCodecInfoEx
     32 {
     33  CMethodId Id;
     34  AString Name;
     35  UInt32 NumStreams;
     36  bool EncoderIsAssigned;
     37  bool DecoderIsAssigned;
     38  
     39  CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {}
     40 };
     41 
     42 struct CHasherInfoEx
     43 {
     44  CMethodId Id;
     45  AString Name;
     46 };
     47 
     48 #define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo,
     49 #define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo)
     50 #define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo);
     51 #define IMPL_ISetCompressCodecsInfo2(x) \
     52 STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \
     53  COM_TRY_BEGIN __externalCodecs.GetCodecs = compressCodecsInfo;  return __externalCodecs.Load(); COM_TRY_END }
     54 #define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler)
     55 
     56 struct CExternalCodecs
     57 {
     58  CMyComPtr<ICompressCodecsInfo> GetCodecs;
     59  CMyComPtr<IHashers> GetHashers;
     60 
     61  CObjectVector<CCodecInfoEx> Codecs;
     62  CObjectVector<CHasherInfoEx> Hashers;
     63 
     64  bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; }
     65 
     66  HRESULT Load();
     67 
     68  void ClearAndRelease()
     69  {
     70    Hashers.Clear();
     71    Codecs.Clear();
     72    GetHashers.Release();
     73    GetCodecs.Release();
     74  }
     75 
     76  ~CExternalCodecs()
     77  {
     78    GetHashers.Release();
     79    GetCodecs.Release();
     80  }
     81 };
     82 
     83 extern CExternalCodecs g_ExternalCodecs;
     84 
     85 #define EXTERNAL_CODECS_VARS2   (__externalCodecs.IsSet() ? &__externalCodecs : &g_ExternalCodecs)
     86 #define EXTERNAL_CODECS_VARS2_L (&__externalCodecs)
     87 #define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs)
     88 
     89 #define DECL_EXTERNAL_CODECS_VARS CExternalCodecs __externalCodecs;
     90 
     91 #define EXTERNAL_CODECS_VARS   EXTERNAL_CODECS_VARS2,
     92 #define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L,
     93 #define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G,
     94 
     95 #define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *__externalCodecs
     96 #define EXTERNAL_CODECS_LOC_VARS2 __externalCodecs
     97 
     98 #define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2,
     99 #define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2,
    100 
    101 #else
    102 
    103 #define PUBLIC_ISetCompressCodecsInfo
    104 #define QUERY_ENTRY_ISetCompressCodecsInfo
    105 #define DECL_ISetCompressCodecsInfo
    106 #define IMPL_ISetCompressCodecsInfo
    107 #define EXTERNAL_CODECS_VARS2
    108 #define DECL_EXTERNAL_CODECS_VARS
    109 #define EXTERNAL_CODECS_VARS
    110 #define EXTERNAL_CODECS_VARS_L
    111 #define EXTERNAL_CODECS_VARS_G
    112 #define DECL_EXTERNAL_CODECS_LOC_VARS2
    113 #define EXTERNAL_CODECS_LOC_VARS2
    114 #define DECL_EXTERNAL_CODECS_LOC_VARS
    115 #define EXTERNAL_CODECS_LOC_VARS
    116 
    117 #endif
    118 
    119 int FindMethod_Index(
    120    DECL_EXTERNAL_CODECS_LOC_VARS
    121    const AString &name,
    122    bool encode,
    123    CMethodId &methodId,
    124    UInt32 &numStreams);
    125 
    126 bool FindMethod(
    127    DECL_EXTERNAL_CODECS_LOC_VARS
    128    CMethodId methodId,
    129    AString &name);
    130 
    131 bool FindHashMethod(
    132    DECL_EXTERNAL_CODECS_LOC_VARS
    133    const AString &name,
    134    CMethodId &methodId);
    135 
    136 void GetHashMethods(
    137    DECL_EXTERNAL_CODECS_LOC_VARS
    138    CRecordVector<CMethodId> &methods);
    139 
    140 
    141 struct CCreatedCoder
    142 {
    143  CMyComPtr<ICompressCoder> Coder;
    144  CMyComPtr<ICompressCoder2> Coder2;
    145  
    146  bool IsExternal;
    147  bool IsFilter; // = true, if Coder was created from filter
    148  UInt32 NumStreams;
    149 
    150  // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {}
    151 };
    152 
    153 
    154 HRESULT CreateCoder_Index(
    155    DECL_EXTERNAL_CODECS_LOC_VARS
    156    unsigned codecIndex, bool encode,
    157    CMyComPtr<ICompressFilter> &filter,
    158    CCreatedCoder &cod);
    159 
    160 HRESULT CreateCoder_Index(
    161    DECL_EXTERNAL_CODECS_LOC_VARS
    162    unsigned index, bool encode,
    163    CCreatedCoder &cod);
    164 
    165 HRESULT CreateCoder_Id(
    166    DECL_EXTERNAL_CODECS_LOC_VARS
    167    CMethodId methodId, bool encode,
    168    CMyComPtr<ICompressFilter> &filter,
    169    CCreatedCoder &cod);
    170 
    171 HRESULT CreateCoder_Id(
    172    DECL_EXTERNAL_CODECS_LOC_VARS
    173    CMethodId methodId, bool encode,
    174    CCreatedCoder &cod);
    175 
    176 HRESULT CreateCoder_Id(
    177    DECL_EXTERNAL_CODECS_LOC_VARS
    178    CMethodId methodId, bool encode,
    179    CMyComPtr<ICompressCoder> &coder);
    180 
    181 HRESULT CreateFilter(
    182    DECL_EXTERNAL_CODECS_LOC_VARS
    183    CMethodId methodId, bool encode,
    184    CMyComPtr<ICompressFilter> &filter);
    185 
    186 HRESULT CreateHasher(
    187    DECL_EXTERNAL_CODECS_LOC_VARS
    188    CMethodId methodId,
    189    AString &name,
    190    CMyComPtr<IHasher> &hasher);
    191 
    192 #endif