Home | History | Annotate | Download | only in Common
      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 const UInt64 k_LZMA = 0x030101;
     12 static const UInt64 k_LZMA2 = 0x21;
     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 || method.Id == 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 
    100