Mercurial > vba-linux
comparison src/win32/7zip/7z/CPP/7zip/Common/MethodProps.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:8ced16adf2e1 | 1:f9f4f1b99eed |
---|---|
1 // MethodProps.cpp | |
2 | |
3 #include "StdAfx.h" | |
4 | |
5 #include "../../Common/MyCom.h" | |
6 | |
7 #include "../ICoder.h" | |
8 | |
9 #include "MethodProps.h" | |
10 | |
11 static UInt64 k_LZMA = 0x030101; | |
12 // static UInt64 k_LZMA2 = 0x030102; | |
13 | |
14 HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder) | |
15 { | |
16 bool tryReduce = false; | |
17 UInt32 reducedDictionarySize = 1 << 10; | |
18 if (inSizeForReduce != 0 && (method.Id == k_LZMA /* || methodFull.MethodID == k_LZMA2 */)) | |
19 { | |
20 for (;;) | |
21 { | |
22 const UInt32 step = (reducedDictionarySize >> 1); | |
23 if (reducedDictionarySize >= *inSizeForReduce) | |
24 { | |
25 tryReduce = true; | |
26 break; | |
27 } | |
28 reducedDictionarySize += step; | |
29 if (reducedDictionarySize >= *inSizeForReduce) | |
30 { | |
31 tryReduce = true; | |
32 break; | |
33 } | |
34 if (reducedDictionarySize >= ((UInt32)3 << 30)) | |
35 break; | |
36 reducedDictionarySize += step; | |
37 } | |
38 } | |
39 | |
40 { | |
41 int numProps = method.Props.Size(); | |
42 CMyComPtr<ICompressSetCoderProperties> setCoderProperties; | |
43 coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); | |
44 if (setCoderProperties == NULL) | |
45 { | |
46 if (numProps != 0) | |
47 return E_INVALIDARG; | |
48 } | |
49 else | |
50 { | |
51 CRecordVector<PROPID> propIDs; | |
52 NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProps]; | |
53 HRESULT res = S_OK; | |
54 try | |
55 { | |
56 for (int i = 0; i < numProps; i++) | |
57 { | |
58 const CProp &prop = method.Props[i]; | |
59 propIDs.Add(prop.Id); | |
60 NWindows::NCOM::CPropVariant &value = values[i]; | |
61 value = prop.Value; | |
62 // if (tryReduce && prop.Id == NCoderPropID::kDictionarySize && value.vt == VT_UI4 && reducedDictionarySize < value.ulVal) | |
63 if (tryReduce) | |
64 if (prop.Id == NCoderPropID::kDictionarySize) | |
65 if (value.vt == VT_UI4) | |
66 if (reducedDictionarySize < value.ulVal) | |
67 value.ulVal = reducedDictionarySize; | |
68 } | |
69 CMyComPtr<ICompressSetCoderProperties> setCoderProperties; | |
70 coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); | |
71 res = setCoderProperties->SetCoderProperties(&propIDs.Front(), values, numProps); | |
72 } | |
73 catch(...) | |
74 { | |
75 delete []values; | |
76 throw; | |
77 } | |
78 delete []values; | |
79 RINOK(res); | |
80 } | |
81 } | |
82 | |
83 /* | |
84 CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties; | |
85 coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); | |
86 if (writeCoderProperties != NULL) | |
87 { | |
88 CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; | |
89 CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); | |
90 outStreamSpec->Init(); | |
91 RINOK(writeCoderProperties->WriteCoderProperties(outStream)); | |
92 size_t size = outStreamSpec->GetSize(); | |
93 filterProps.SetCapacity(size); | |
94 memmove(filterProps, outStreamSpec->GetBuffer(), size); | |
95 } | |
96 */ | |
97 return S_OK; | |
98 } | |
99 |