tor-browser

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

MethodProps.h (7023B)


      1 // MethodProps.h
      2 
      3 #ifndef __7Z_METHOD_PROPS_H
      4 #define __7Z_METHOD_PROPS_H
      5 
      6 #include "../../Common/MyString.h"
      7 #include "../../Common/Defs.h"
      8 
      9 #include "../../Windows/Defs.h"
     10 
     11 #include "../../Windows/PropVariant.h"
     12 
     13 #include "../ICoder.h"
     14 
     15 bool StringToBool(const wchar_t *s, bool &res);
     16 HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest);
     17 unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number);
     18 HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue);
     19 
     20 HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads);
     21 
     22 struct CProp
     23 {
     24  PROPID Id;
     25  bool IsOptional;
     26  NWindows::NCOM::CPropVariant Value;
     27  CProp(): IsOptional(false) {}
     28 };
     29 
     30 struct CProps
     31 {
     32  CObjectVector<CProp> Props;
     33 
     34  void Clear() { Props.Clear(); }
     35 
     36  bool AreThereNonOptionalProps() const
     37  {
     38    FOR_VECTOR (i, Props)
     39      if (!Props[i].IsOptional)
     40        return true;
     41    return false;
     42  }
     43 
     44  void AddProp32(PROPID propid, UInt32 val);
     45  
     46  void AddPropBool(PROPID propid, bool val);
     47 
     48  void AddProp_Ascii(PROPID propid, const char *s)
     49  {
     50    CProp &prop = Props.AddNew();
     51    prop.IsOptional = true;
     52    prop.Id = propid;
     53    prop.Value = s;
     54  }
     55 
     56  HRESULT SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const;
     57 };
     58 
     59 class CMethodProps: public CProps
     60 {
     61  HRESULT SetParam(const UString &name, const UString &value);
     62 public:
     63  int GetLevel() const;
     64  int Get_NumThreads() const
     65  {
     66    int i = FindProp(NCoderPropID::kNumThreads);
     67    if (i >= 0)
     68      if (Props[i].Value.vt == VT_UI4)
     69        return (int)Props[i].Value.ulVal;
     70    return -1;
     71  }
     72 
     73  bool Get_DicSize(UInt32 &res) const
     74  {
     75    res = 0;
     76    int i = FindProp(NCoderPropID::kDictionarySize);
     77    if (i >= 0)
     78      if (Props[i].Value.vt == VT_UI4)
     79      {
     80        res = Props[i].Value.ulVal;
     81        return true;
     82      }
     83    return false;
     84  }
     85 
     86  int FindProp(PROPID id) const;
     87 
     88  UInt32 Get_Lzma_Algo() const
     89  {
     90    int i = FindProp(NCoderPropID::kAlgorithm);
     91    if (i >= 0)
     92      if (Props[i].Value.vt == VT_UI4)
     93        return Props[i].Value.ulVal;
     94    return GetLevel() >= 5 ? 1 : 0;
     95  }
     96 
     97  UInt32 Get_Lzma_DicSize() const
     98  {
     99    int i = FindProp(NCoderPropID::kDictionarySize);
    100    if (i >= 0)
    101      if (Props[i].Value.vt == VT_UI4)
    102        return Props[i].Value.ulVal;
    103    int level = GetLevel();
    104    return level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26));
    105  }
    106 
    107  bool Get_Lzma_Eos() const
    108  {
    109    int i = FindProp(NCoderPropID::kEndMarker);
    110    if (i >= 0)
    111    {
    112      const NWindows::NCOM::CPropVariant &val = Props[i].Value;
    113      if (val.vt == VT_BOOL)
    114        return VARIANT_BOOLToBool(val.boolVal);
    115    }
    116    return false;
    117  }
    118 
    119  bool Are_Lzma_Model_Props_Defined() const
    120  {
    121    if (FindProp(NCoderPropID::kPosStateBits) >= 0) return true;
    122    if (FindProp(NCoderPropID::kLitContextBits) >= 0) return true;
    123    if (FindProp(NCoderPropID::kLitPosBits) >= 0) return true;
    124    return false;
    125  }
    126 
    127  UInt32 Get_Lzma_NumThreads() const
    128  {
    129    if (Get_Lzma_Algo() == 0)
    130      return 1;
    131    int numThreads = Get_NumThreads();
    132    if (numThreads >= 0)
    133      return numThreads < 2 ? 1 : 2;
    134    return 2;
    135  }
    136 
    137  int Get_Xz_NumThreads(UInt32 &lzmaThreads) const
    138  {
    139    lzmaThreads = 1;
    140    int numThreads = Get_NumThreads();
    141    if (numThreads >= 0 && numThreads <= 1)
    142      return 1;
    143    if (Get_Lzma_Algo() != 0)
    144      lzmaThreads = 2;
    145    return numThreads;
    146  }
    147 
    148  UInt64 GetProp_BlockSize(PROPID id) const
    149  {
    150    int i = FindProp(id);
    151    if (i >= 0)
    152    {
    153      const NWindows::NCOM::CPropVariant &val = Props[i].Value;
    154      if (val.vt == VT_UI4) { return val.ulVal; }
    155      if (val.vt == VT_UI8) { return val.uhVal.QuadPart; }
    156    }
    157    return 0;
    158  }
    159 
    160  UInt64 Get_Xz_BlockSize() const
    161  {
    162    {
    163      UInt64 blockSize1 = GetProp_BlockSize(NCoderPropID::kBlockSize);
    164      UInt64 blockSize2 = GetProp_BlockSize(NCoderPropID::kBlockSize2);
    165      UInt64 minSize = MyMin(blockSize1, blockSize2);
    166      if (minSize != 0)
    167        return minSize;
    168      UInt64 maxSize = MyMax(blockSize1, blockSize2);
    169      if (maxSize != 0)
    170        return maxSize;
    171    }
    172    const UInt32 kMinSize = (UInt32)1 << 20;
    173    const UInt32 kMaxSize = (UInt32)1 << 28;
    174    UInt32 dictSize = Get_Lzma_DicSize();
    175    UInt64 blockSize = (UInt64)dictSize << 2;
    176    if (blockSize < kMinSize) blockSize = kMinSize;
    177    if (blockSize > kMaxSize) blockSize = kMaxSize;
    178    if (blockSize < dictSize) blockSize = dictSize;
    179    blockSize += (kMinSize - 1);
    180    blockSize &= ~(UInt64)(kMinSize - 1);
    181    return blockSize;
    182  }
    183 
    184 
    185  UInt32 Get_BZip2_NumThreads(bool &fixedNumber) const
    186  {
    187    fixedNumber = false;
    188    int numThreads = Get_NumThreads();
    189    if (numThreads >= 0)
    190    {
    191      fixedNumber = true;
    192      if (numThreads < 1) return 1;
    193      const unsigned kNumBZip2ThreadsMax = 64;
    194      if (numThreads > kNumBZip2ThreadsMax) return kNumBZip2ThreadsMax;
    195      return numThreads;
    196    }
    197    return 1;
    198  }
    199 
    200  UInt32 Get_BZip2_BlockSize() const
    201  {
    202    int i = FindProp(NCoderPropID::kDictionarySize);
    203    if (i >= 0)
    204      if (Props[i].Value.vt == VT_UI4)
    205      {
    206        UInt32 blockSize = Props[i].Value.ulVal;
    207        const UInt32 kDicSizeMin = 100000;
    208        const UInt32 kDicSizeMax = 900000;
    209        if (blockSize < kDicSizeMin) blockSize = kDicSizeMin;
    210        if (blockSize > kDicSizeMax) blockSize = kDicSizeMax;
    211        return blockSize;
    212      }
    213    int level = GetLevel();
    214    return 100000 * (level >= 5 ? 9 : (level >= 1 ? level * 2 - 1: 1));
    215  }
    216 
    217  UInt32 Get_Ppmd_MemSize() const
    218  {
    219    int i = FindProp(NCoderPropID::kUsedMemorySize);
    220    if (i >= 0)
    221      if (Props[i].Value.vt == VT_UI4)
    222        return Props[i].Value.ulVal;
    223    int level = GetLevel();
    224    return level >= 9 ? (192 << 20) : ((UInt32)1 << (level + 19));
    225  }
    226 
    227  void AddProp_Level(UInt32 level)
    228  {
    229    AddProp32(NCoderPropID::kLevel, level);
    230  }
    231 
    232  void AddProp_NumThreads(UInt32 numThreads)
    233  {
    234    AddProp32(NCoderPropID::kNumThreads, numThreads);
    235  }
    236 
    237  void AddProp_EndMarker_if_NotFound(bool eos)
    238  {
    239    if (FindProp(NCoderPropID::kEndMarker) < 0)
    240      AddPropBool(NCoderPropID::kEndMarker, eos);
    241  }
    242 
    243  HRESULT ParseParamsFromString(const UString &srcString);
    244  HRESULT ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
    245 };
    246 
    247 class COneMethodInfo: public CMethodProps
    248 {
    249 public:
    250  AString MethodName;
    251  UString PropsString;
    252  
    253  void Clear()
    254  {
    255    CMethodProps::Clear();
    256    MethodName.Empty();
    257    PropsString.Empty();
    258  }
    259  bool IsEmpty() const { return MethodName.IsEmpty() && Props.IsEmpty(); }
    260  HRESULT ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
    261  HRESULT ParseMethodFromString(const UString &s);
    262 };
    263 
    264 #endif