Home | History | Annotate | Download | only in 7z
      1 // 7z/Handler.h
      2 
      3 #ifndef __7Z_HANDLER_H
      4 #define __7Z_HANDLER_H
      5 
      6 #include "../../ICoder.h"
      7 #include "../IArchive.h"
      8 
      9 #include "../../Common/CreateCoder.h"
     10 
     11 #ifndef EXTRACT_ONLY
     12 #include "../Common/HandlerOut.h"
     13 #endif
     14 
     15 #include "7zCompressionMode.h"
     16 #include "7zIn.h"
     17 
     18 namespace NArchive {
     19 namespace N7z {
     20 
     21 const UInt32 k_Copy = 0x0;
     22 const UInt32 k_Delta = 3;
     23 const UInt32 k_LZMA2 = 0x21;
     24 const UInt32 k_LZMA  = 0x030101;
     25 const UInt32 k_PPMD  = 0x030401;
     26 const UInt32 k_BCJ  = 0x03030103;
     27 const UInt32 k_BCJ2 = 0x0303011B;
     28 const UInt32 k_Deflate = 0x040108;
     29 const UInt32 k_BZip2   = 0x040202;
     30 
     31 #ifndef __7Z_SET_PROPERTIES
     32 
     33 #ifdef EXTRACT_ONLY
     34 #if !defined(_7ZIP_ST) && !defined(_SFX)
     35 #define __7Z_SET_PROPERTIES
     36 #endif
     37 #else
     38 #define __7Z_SET_PROPERTIES
     39 #endif
     40 
     41 #endif
     42 
     43 
     44 #ifndef EXTRACT_ONLY
     45 
     46 class COutHandler: public CMultiMethodProps
     47 {
     48   HRESULT SetSolidFromString(const UString &s);
     49   HRESULT SetSolidFromPROPVARIANT(const PROPVARIANT &value);
     50 public:
     51   bool _removeSfxBlock;
     52 
     53   UInt64 _numSolidFiles;
     54   UInt64 _numSolidBytes;
     55   bool _numSolidBytesDefined;
     56   bool _solidExtension;
     57 
     58   bool _compressHeaders;
     59   bool _encryptHeadersSpecified;
     60   bool _encryptHeaders;
     61   // bool _useParents; 9.26
     62 
     63   CBoolPair Write_CTime;
     64   CBoolPair Write_ATime;
     65   CBoolPair Write_MTime;
     66 
     67   bool _volumeMode;
     68 
     69   void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); }
     70   void InitSolidSize()  { _numSolidBytes = (UInt64)(Int64)(-1); }
     71   void InitSolid()
     72   {
     73     InitSolidFiles();
     74     InitSolidSize();
     75     _solidExtension = false;
     76     _numSolidBytesDefined = false;
     77   }
     78 
     79   void InitProps();
     80 
     81   COutHandler() { InitProps(); }
     82 
     83   HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value);
     84 };
     85 
     86 #endif
     87 
     88 class CHandler:
     89   public IInArchive,
     90   public IArchiveGetRawProps,
     91   #ifdef __7Z_SET_PROPERTIES
     92   public ISetProperties,
     93   #endif
     94   #ifndef EXTRACT_ONLY
     95   public IOutArchive,
     96   #endif
     97   PUBLIC_ISetCompressCodecsInfo
     98   public CMyUnknownImp
     99   #ifndef EXTRACT_ONLY
    100   , public COutHandler
    101   #endif
    102 {
    103 public:
    104   MY_QUERYINTERFACE_BEGIN2(IInArchive)
    105   MY_QUERYINTERFACE_ENTRY(IArchiveGetRawProps)
    106   #ifdef __7Z_SET_PROPERTIES
    107   MY_QUERYINTERFACE_ENTRY(ISetProperties)
    108   #endif
    109   #ifndef EXTRACT_ONLY
    110   MY_QUERYINTERFACE_ENTRY(IOutArchive)
    111   #endif
    112   QUERY_ENTRY_ISetCompressCodecsInfo
    113   MY_QUERYINTERFACE_END
    114   MY_ADDREF_RELEASE
    115 
    116   INTERFACE_IInArchive(;)
    117   INTERFACE_IArchiveGetRawProps(;)
    118 
    119   #ifdef __7Z_SET_PROPERTIES
    120   STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps);
    121   #endif
    122 
    123   #ifndef EXTRACT_ONLY
    124   INTERFACE_IOutArchive(;)
    125   #endif
    126 
    127   DECL_ISetCompressCodecsInfo
    128 
    129   CHandler();
    130 
    131 private:
    132   CMyComPtr<IInStream> _inStream;
    133   NArchive::N7z::CDbEx _db;
    134   #ifndef _NO_CRYPTO
    135   bool _isEncrypted;
    136   bool _passwordIsDefined;
    137   #endif
    138 
    139   #ifdef EXTRACT_ONLY
    140 
    141   #ifdef __7Z_SET_PROPERTIES
    142   UInt32 _numThreads;
    143   #endif
    144 
    145   UInt32 _crcSize;
    146 
    147   #else
    148 
    149   CRecordVector<CBind> _binds;
    150 
    151   HRESULT PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m);
    152   HRESULT SetHeaderMethod(CCompressionMethodMode &headerMethod);
    153   void AddDefaultMethod();
    154   HRESULT SetMainMethod(CCompressionMethodMode &method,
    155       CObjectVector<COneMethodInfo> &methodsInfo
    156       #ifndef _7ZIP_ST
    157       , UInt32 numThreads
    158       #endif
    159       );
    160 
    161 
    162   #endif
    163 
    164   bool IsFolderEncrypted(CNum folderIndex) const;
    165   #ifndef _SFX
    166 
    167   CRecordVector<UInt64> _fileInfoPopIDs;
    168   void FillPopIDs();
    169   void AddMethodName(AString &s, UInt64 id);
    170   HRESULT SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const;
    171 
    172   #endif
    173 
    174   DECL_EXTERNAL_CODECS_VARS
    175 };
    176 
    177 }}
    178 
    179 #endif
    180