Mercurial > vba-linux
view 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 |
line wrap: on
line source
1 // MethodProps.cpp3 #include "StdAfx.h"5 #include "../../Common/MyCom.h"7 #include "../ICoder.h"9 #include "MethodProps.h"11 static UInt64 k_LZMA = 0x030101;12 // static UInt64 k_LZMA2 = 0x030102;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 }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 else50 {51 CRecordVector<PROPID> propIDs;52 NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProps];53 HRESULT res = S_OK;54 try55 {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 }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 }