Home | History | Annotate | Download | only in Common
      1 // HandlerOut.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #ifndef _7ZIP_ST
      6 #include "../../../Windows/System.h"
      7 #endif
      8 
      9 #include "../Common/ParseProperties.h"
     10 
     11 #include "HandlerOut.h"
     12 
     13 using namespace NWindows;
     14 
     15 namespace NArchive {
     16 
     17 static void SetMethodProp32(COneMethodInfo &m, PROPID propID, UInt32 value)
     18 {
     19   if (m.FindProp(propID) < 0)
     20     m.AddProp32(propID, value);
     21 }
     22 
     23 void CMultiMethodProps::SetGlobalLevelAndThreads(COneMethodInfo &oneMethodInfo
     24     #ifndef _7ZIP_ST
     25     , UInt32 numThreads
     26     #endif
     27     )
     28 {
     29   UInt32 level = _level;
     30   if (level != (UInt32)(Int32)-1)
     31     SetMethodProp32(oneMethodInfo, NCoderPropID::kLevel, (UInt32)level);
     32 
     33   #ifndef _7ZIP_ST
     34   SetMethodProp32(oneMethodInfo, NCoderPropID::kNumThreads, numThreads);
     35   #endif
     36 }
     37 
     38 void CMultiMethodProps::Init()
     39 {
     40   #ifndef _7ZIP_ST
     41   _numProcessors = _numThreads = NSystem::GetNumberOfProcessors();
     42   #endif
     43 
     44   _level = (UInt32)(Int32)-1;
     45   _analysisLevel = -1;
     46 
     47   _autoFilter = true;
     48   _crcSize = 4;
     49   _filterMethod.Clear();
     50   _methods.Clear();
     51 }
     52 
     53 HRESULT CMultiMethodProps::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value)
     54 {
     55   UString name = nameSpec;
     56   name.MakeLower_Ascii();
     57   if (name.IsEmpty())
     58     return E_INVALIDARG;
     59 
     60   if (name[0] == 'x')
     61   {
     62     name.Delete(0);
     63     _level = 9;
     64     return ParsePropToUInt32(name, value, _level);
     65   }
     66 
     67   if (name.IsPrefixedBy_Ascii_NoCase("yx"))
     68   {
     69     name.Delete(0, 2);
     70     UInt32 v = 9;
     71     RINOK(ParsePropToUInt32(name, value, v));
     72     _analysisLevel = (int)v;
     73     return S_OK;
     74   }
     75 
     76   if (name.IsEqualTo("crc"))
     77   {
     78     name.Delete(0, 3);
     79     _crcSize = 4;
     80     return ParsePropToUInt32(name, value, _crcSize);
     81   }
     82 
     83   UInt32 number;
     84   unsigned index = ParseStringToUInt32(name, number);
     85   UString realName = name.Ptr(index);
     86   if (index == 0)
     87   {
     88     if (name.IsPrefixedBy_Ascii_NoCase("mt"))
     89     {
     90       #ifndef _7ZIP_ST
     91       RINOK(ParseMtProp(name.Ptr(2), value, _numProcessors, _numThreads));
     92       #endif
     93 
     94       return S_OK;
     95     }
     96     if (name.IsEqualTo("f"))
     97     {
     98       HRESULT res = PROPVARIANT_to_bool(value, _autoFilter);
     99       if (res == S_OK)
    100         return res;
    101       if (value.vt != VT_BSTR)
    102         return E_INVALIDARG;
    103       return _filterMethod.ParseMethodFromPROPVARIANT(UString(), value);
    104     }
    105     number = 0;
    106   }
    107   if (number > 64)
    108     return E_FAIL;
    109   for (int j = _methods.Size(); j <= (int)number; j++)
    110     _methods.Add(COneMethodInfo());
    111   return _methods[number].ParseMethodFromPROPVARIANT(realName, value);
    112 }
    113 
    114 void CSingleMethodProps::Init()
    115 {
    116   Clear();
    117   _level = (UInt32)(Int32)-1;
    118 
    119   #ifndef _7ZIP_ST
    120   _numProcessors = _numThreads = NWindows::NSystem::GetNumberOfProcessors();
    121   AddProp_NumThreads(_numThreads);
    122   #endif
    123 }
    124 
    125 HRESULT CSingleMethodProps::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps)
    126 {
    127   Init();
    128   for (UInt32 i = 0; i < numProps; i++)
    129   {
    130     UString name = names[i];
    131     name.MakeLower_Ascii();
    132     if (name.IsEmpty())
    133       return E_INVALIDARG;
    134     const PROPVARIANT &value = values[i];
    135     if (name[0] == L'x')
    136     {
    137       UInt32 a = 9;
    138       RINOK(ParsePropToUInt32(name.Ptr(1), value, a));
    139       _level = a;
    140       AddProp_Level(a);
    141     }
    142     else if (name.IsPrefixedBy_Ascii_NoCase("mt"))
    143     {
    144       #ifndef _7ZIP_ST
    145       RINOK(ParseMtProp(name.Ptr(2), value, _numProcessors, _numThreads));
    146       AddProp_NumThreads(_numThreads);
    147       #endif
    148     }
    149     else
    150     {
    151       RINOK(ParseMethodFromPROPVARIANT(names[i], value));
    152     }
    153   }
    154   return S_OK;
    155 }
    156 
    157 }
    158