1 // MethodProps.h 2 3 #ifndef __7Z_METHOD_PROPS_H 4 #define __7Z_METHOD_PROPS_H 5 6 #include "../../Common/MyString.h" 7 8 #include "../../Windows/PropVariant.h" 9 10 #include "../ICoder.h" 11 12 bool StringToBool(const UString &s, bool &res); 13 HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest); 14 unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number); 15 HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); 16 17 HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads); 18 19 struct CProp 20 { 21 PROPID Id; 22 bool IsOptional; 23 NWindows::NCOM::CPropVariant Value; CPropCProp24 CProp(): IsOptional(false) {} 25 }; 26 27 struct CProps 28 { 29 CObjectVector<CProp> Props; 30 ClearCProps31 void Clear() { Props.Clear(); } 32 AreThereNonOptionalPropsCProps33 bool AreThereNonOptionalProps() const 34 { 35 FOR_VECTOR (i, Props) 36 if (!Props[i].IsOptional) 37 return true; 38 return false; 39 } 40 41 void AddProp32(PROPID propid, UInt32 level); 42 AddPropStringCProps43 void AddPropString(PROPID propid, const wchar_t *s) 44 { 45 CProp prop; 46 prop.IsOptional = true; 47 prop.Id = propid; 48 prop.Value = s; 49 Props.Add(prop); 50 } 51 52 HRESULT SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const; 53 }; 54 55 class CMethodProps: public CProps 56 { 57 HRESULT SetParam(const UString &name, const UString &value); 58 public: 59 int GetLevel() const; Get_NumThreads()60 int Get_NumThreads() const 61 { 62 int i = FindProp(NCoderPropID::kNumThreads); 63 if (i >= 0) 64 if (Props[i].Value.vt == VT_UI4) 65 return (int)Props[i].Value.ulVal; 66 return -1; 67 } 68 Get_DicSize(UInt32 & res)69 bool Get_DicSize(UInt32 &res) const 70 { 71 res = 0; 72 int i = FindProp(NCoderPropID::kDictionarySize); 73 if (i >= 0) 74 if (Props[i].Value.vt == VT_UI4) 75 { 76 res = Props[i].Value.ulVal; 77 return true; 78 } 79 return false; 80 } 81 82 int FindProp(PROPID id) const; 83 Get_Lzma_Algo()84 UInt32 Get_Lzma_Algo() const 85 { 86 int i = FindProp(NCoderPropID::kAlgorithm); 87 if (i >= 0) 88 if (Props[i].Value.vt == VT_UI4) 89 return Props[i].Value.ulVal; 90 return GetLevel() >= 5 ? 1 : 0; 91 } 92 Get_Lzma_DicSize()93 UInt32 Get_Lzma_DicSize() const 94 { 95 int i = FindProp(NCoderPropID::kDictionarySize); 96 if (i >= 0) 97 if (Props[i].Value.vt == VT_UI4) 98 return Props[i].Value.ulVal; 99 int level = GetLevel(); 100 return level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)); 101 } 102 Get_Lzma_NumThreads(bool & fixedNumber)103 UInt32 Get_Lzma_NumThreads(bool &fixedNumber) const 104 { 105 fixedNumber = false; 106 int numThreads = Get_NumThreads(); 107 if (numThreads >= 0) 108 { 109 fixedNumber = true; 110 return numThreads < 2 ? 1 : 2; 111 } 112 return Get_Lzma_Algo() == 0 ? 1 : 2; 113 } 114 Get_BZip2_NumThreads(bool & fixedNumber)115 UInt32 Get_BZip2_NumThreads(bool &fixedNumber) const 116 { 117 fixedNumber = false; 118 int numThreads = Get_NumThreads(); 119 if (numThreads >= 0) 120 { 121 fixedNumber = true; 122 if (numThreads < 1) return 1; 123 if (numThreads > 64) return 64; 124 return numThreads; 125 } 126 return 1; 127 } 128 Get_BZip2_BlockSize()129 UInt32 Get_BZip2_BlockSize() const 130 { 131 int i = FindProp(NCoderPropID::kDictionarySize); 132 if (i >= 0) 133 if (Props[i].Value.vt == VT_UI4) 134 { 135 UInt32 blockSize = Props[i].Value.ulVal; 136 const UInt32 kDicSizeMin = 100000; 137 const UInt32 kDicSizeMax = 900000; 138 if (blockSize < kDicSizeMin) blockSize = kDicSizeMin; 139 if (blockSize > kDicSizeMax) blockSize = kDicSizeMax; 140 return blockSize; 141 } 142 int level = GetLevel(); 143 return 100000 * (level >= 5 ? 9 : (level >= 1 ? level * 2 - 1: 1)); 144 } 145 Get_Ppmd_MemSize()146 UInt32 Get_Ppmd_MemSize() const 147 { 148 int i = FindProp(NCoderPropID::kUsedMemorySize); 149 if (i >= 0) 150 if (Props[i].Value.vt == VT_UI4) 151 return Props[i].Value.ulVal; 152 int level = GetLevel(); 153 return level >= 9 ? (192 << 20) : ((UInt32)1 << (level + 19)); 154 } 155 AddLevelProp(UInt32 level)156 void AddLevelProp(UInt32 level) 157 { 158 AddProp32(NCoderPropID::kLevel, level); 159 } 160 AddNumThreadsProp(UInt32 numThreads)161 void AddNumThreadsProp(UInt32 numThreads) 162 { 163 AddProp32(NCoderPropID::kNumThreads, numThreads); 164 } 165 166 HRESULT ParseParamsFromString(const UString &srcString); 167 HRESULT ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value); 168 }; 169 170 class COneMethodInfo: public CMethodProps 171 { 172 public: 173 UString MethodName; 174 Clear()175 void Clear() 176 { 177 CMethodProps::Clear(); 178 MethodName.Empty(); 179 } IsEmpty()180 bool IsEmpty() const { return MethodName.IsEmpty() && Props.IsEmpty(); } 181 HRESULT ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value); 182 HRESULT ParseMethodFromString(const UString &s); 183 }; 184 185 #endif 186