1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// 7zHandlerOut.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../../Common/ComTry.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../../Common/StringToInt.h"
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/Wildcard.h"
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/ItemNameUtils.h"
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/ParseProperties.h"
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "7zHandler.h"
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "7zOut.h"
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "7zUpdate.h"
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
16baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing namespace NWindows;
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
18baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NArchive {
19baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace N7z {
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
21f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *k_LZMA_Name = "LZMA";
22f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kDefaultMethodName = "LZMA2";
23f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *k_Copy_Name = "Copy";
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
25f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *k_MatchFinder_ForHeaders = "BT2";
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic const UInt32 k_NumFastBytes_ForHeaders = 273;
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic const UInt32 k_Level_ForHeaders = 5;
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic const UInt32 k_Dictionary_ForHeaders =
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifdef UNDER_CE
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  1 << 18;
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #else
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  1 << 20;
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
35baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *type = NFileTimeType::kWindows;
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CHandler::PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m)
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!FindMethod(
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      EXTERNAL_CODECS_VARS
45f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      m.MethodName, dest.Id, dest.NumStreams))
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return E_INVALIDARG;
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  (CProps &)dest = (CProps &)m;
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CHandler::SetHeaderMethod(CCompressionMethodMode &headerMethod)
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!_compressHeaders)
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return S_OK;
55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  COneMethodInfo m;
56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  m.MethodName = k_LZMA_Name;
57f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  m.AddProp_Ascii(NCoderPropID::kMatchFinder, k_MatchFinder_ForHeaders);
58f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  m.AddProp_Level(k_Level_ForHeaders);
59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  m.AddProp32(NCoderPropID::kNumFastBytes, k_NumFastBytes_ForHeaders);
60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  m.AddProp32(NCoderPropID::kDictionarySize, k_Dictionary_ForHeaders);
61f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  m.AddProp_NumThreads(1);
62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
63f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CMethodFull &methodFull = headerMethod.Methods.AddNew();
64f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return PropsMethod_To_FullMethod(methodFull, m);
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CHandler::SetMainMethod(
68f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    CCompressionMethodMode &methodMode
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    #ifndef _7ZIP_ST
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    , UInt32 numThreads
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    #endif
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    )
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
74f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  methodMode.Bonds = _bonds;
75f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
76f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CObjectVector<COneMethodInfo> methods = _methods;
77f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
78f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
79f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    FOR_VECTOR (i, methods)
80f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
81f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      AString &methodName = methods[i].MethodName;
82f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (methodName.IsEmpty())
83f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        methodName = kDefaultMethodName;
84f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
85f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (methods.IsEmpty())
86f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
87f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      COneMethodInfo &m = methods.AddNew();
88f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      m.MethodName = (GetLevel() == 0 ? k_Copy_Name : kDefaultMethodName);
89f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      methodMode.DefaultMethod_was_Inserted = true;
90f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
91f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
92f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
93f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (!_filterMethod.MethodName.IsEmpty())
94f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
95f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    // if (methodMode.Bonds.IsEmpty())
96f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
97f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      FOR_VECTOR (k, methodMode.Bonds)
98f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
99f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        CBond2 &bond = methodMode.Bonds[k];
100f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        bond.InCoder++;
101f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        bond.OutCoder++;
102f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
103f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      methods.Insert(0, _filterMethod);
104f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      methodMode.Filter_was_Inserted = true;
105f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
106f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const UInt64 kSolidBytes_Min = (1 << 24);
109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const UInt64 kSolidBytes_Max = ((UInt64)1 << 32) - 1;
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool needSolid = false;
112f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FOR_VECTOR (i, methods)
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    COneMethodInfo &oneMethodInfo = methods[i];
116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    SetGlobalLevelAndThreads(oneMethodInfo
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #ifndef _7ZIP_ST
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      , numThreads
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #endif
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      );
121baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
122f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    CMethodFull &methodFull = methodMode.Methods.AddNew();
123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    RINOK(PropsMethod_To_FullMethod(methodFull, oneMethodInfo));
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (methodFull.Id != k_Copy)
126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      needSolid = true;
127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (_numSolidBytesDefined)
129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      continue;
130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    UInt32 dicSize;
132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    switch (methodFull.Id)
133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case k_LZMA:
135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case k_LZMA2: dicSize = oneMethodInfo.Get_Lzma_DicSize(); break;
136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case k_PPMD: dicSize = oneMethodInfo.Get_Ppmd_MemSize(); break;
137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case k_Deflate: dicSize = (UInt32)1 << 15; break;
138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case k_BZip2: dicSize = oneMethodInfo.Get_BZip2_BlockSize(); break;
139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      default: continue;
140baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
141f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _numSolidBytes = (UInt64)dicSize << 7;
143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (_numSolidBytes < kSolidBytes_Min) _numSolidBytes = kSolidBytes_Min;
144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (_numSolidBytes > kSolidBytes_Max) _numSolidBytes = kSolidBytes_Max;
145baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _numSolidBytesDefined = true;
146baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!_numSolidBytesDefined)
149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (needSolid)
150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _numSolidBytes = kSolidBytes_Max;
151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else
152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _numSolidBytes = 0;
153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _numSolidBytesDefined = true;
154baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
156baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic HRESULT GetTime(IArchiveUpdateCallback *updateCallback, int index, PROPID propID, UInt64 &ft, bool &ftDefined)
158baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // ft = 0;
160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // ftDefined = false;
161baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  NCOM::CPropVariant prop;
162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(updateCallback->GetProperty(index, propID, &prop));
163baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (prop.vt == VT_FILETIME)
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ft = prop.filetime.dwLowDateTime | ((UInt64)prop.filetime.dwHighDateTime << 32);
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ftDefined = true;
167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  else if (prop.vt != VT_EMPTY)
169baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return E_INVALIDARG;
170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  else
171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    ft = 0;
173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    ftDefined = false;
174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/*
179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef _WIN32
181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic const wchar_t kDirDelimiter1 = L'\\';
182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic const wchar_t kDirDelimiter2 = L'/';
184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic inline bool IsCharDirLimiter(wchar_t c)
186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return (
188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #ifdef _WIN32
189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    c == kDirDelimiter1 ||
190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    c == kDirDelimiter2);
192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic int FillSortIndex(CObjectVector<CTreeFolder> &treeFolders, int cur, int curSortIndex)
195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CTreeFolder &tf = treeFolders[cur];
197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  tf.SortIndex = curSortIndex++;
198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (int i = 0; i < tf.SubFolders.Size(); i++)
199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    curSortIndex = FillSortIndex(treeFolders, tf.SubFolders[i], curSortIndex);
200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  tf.SortIndexEnd = curSortIndex;
201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return curSortIndex;
202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic int FindSubFolder(const CObjectVector<CTreeFolder> &treeFolders, int cur, const UString &name, int &insertPos)
205cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
206cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const CIntVector &subFolders = treeFolders[cur].SubFolders;
207cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int left = 0, right = subFolders.Size();
208cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  insertPos = -1;
209cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (;;)
210cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
211cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (left == right)
212cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
213cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      insertPos = left;
214cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return -1;
215cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
216cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    int mid = (left + right) / 2;
217cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    int midFolder = subFolders[mid];
218cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    int compare = CompareFileNames(name, treeFolders[midFolder].Name);
219cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (compare == 0)
220cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return midFolder;
221cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (compare < 0)
222cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      right = mid;
223cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else
224cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      left = mid + 1;
225cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
226cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
227cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
228cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic int AddFolder(CObjectVector<CTreeFolder> &treeFolders, int cur, const UString &name)
229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
230cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int insertPos;
231cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int folderIndex = FindSubFolder(treeFolders, cur, name, insertPos);
232cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (folderIndex < 0)
233cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    folderIndex = treeFolders.Size();
235cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CTreeFolder &newFolder = treeFolders.AddNew();
236cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    newFolder.Parent = cur;
237cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    newFolder.Name = name;
238cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    treeFolders[cur].SubFolders.Insert(insertPos, folderIndex);
239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
240cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // else if (treeFolders[folderIndex].IsAltStreamFolder != isAltStreamFolder) throw 1123234234;
241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return folderIndex;
242cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
243cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/
244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
245baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
246baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    IArchiveUpdateCallback *updateCallback)
247baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
248baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
249baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
250cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const CDbEx *db = 0;
251baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifdef _7Z_VOL
252baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_volumes.Size() > 1)
253baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return E_FAIL;
254baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  const CVolume *volume = 0;
255baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_volumes.Size() == 1)
256baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
257baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    volume = &_volumes.Front();
258baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    db = &volume->Database;
259baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
260baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #else
261baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_inStream != 0)
262baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    db = &_db;
263baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
264baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
265cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  /*
266cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMyComPtr<IArchiveGetRawProps> getRawProps;
267cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  updateCallback->QueryInterface(IID_IArchiveGetRawProps, (void **)&getRawProps);
268cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
269cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CUniqBlocks secureBlocks;
270cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  secureBlocks.AddUniq(NULL, 0);
271cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
272cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CObjectVector<CTreeFolder> treeFolders;
273cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
274cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CTreeFolder folder;
275cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    folder.Parent = -1;
276cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    treeFolders.Add(folder);
277cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
278cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  */
279cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
280baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CObjectVector<CUpdateItem> updateItems;
281cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
282cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool need_CTime = (Write_CTime.Def && Write_CTime.Val);
283cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool need_ATime = (Write_ATime.Def && Write_ATime.Val);
284cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool need_MTime = (Write_MTime.Def && Write_MTime.Val || !Write_MTime.Def);
285f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
286f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (db && !db->Files.IsEmpty())
287cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
288cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (!Write_CTime.Def) need_CTime = !db->CTime.Defs.IsEmpty();
289cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (!Write_ATime.Def) need_ATime = !db->ATime.Defs.IsEmpty();
290cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (!Write_MTime.Def) need_MTime = !db->MTime.Defs.IsEmpty();
291cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
292cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
293cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString s;
294cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
295baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (UInt32 i = 0; i < numItems; i++)
296baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
297baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    Int32 newData, newProps;
298baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 indexInArchive;
299baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (!updateCallback)
300baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return E_FAIL;
301baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(updateCallback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive));
302baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CUpdateItem ui;
303baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ui.NewProps = IntToBool(newProps);
304baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ui.NewData = IntToBool(newData);
305baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ui.IndexInArchive = indexInArchive;
306baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ui.IndexInClient = i;
307baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ui.IsAnti = false;
308baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    ui.Size = 0;
309baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
310cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    UString name;
311cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    // bool isAltStream = false;
312baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (ui.IndexInArchive != -1)
313baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
314cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (db == 0 || (unsigned)ui.IndexInArchive >= db->Files.Size())
315baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return E_INVALIDARG;
316baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const CFileItem &fi = db->Files[ui.IndexInArchive];
317cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (!ui.NewProps)
318cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
319cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        _db.GetPath(ui.IndexInArchive, name);
320cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
321baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      ui.IsDir = fi.IsDir;
322baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      ui.Size = fi.Size;
323cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      // isAltStream = fi.IsAltStream;
324baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      ui.IsAnti = db->IsItemAnti(ui.IndexInArchive);
325baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
326cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (!ui.NewProps)
327cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
328cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.CTimeDefined = db->CTime.GetItem(ui.IndexInArchive, ui.CTime);
329cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.ATimeDefined = db->ATime.GetItem(ui.IndexInArchive, ui.ATime);
330cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.MTimeDefined = db->MTime.GetItem(ui.IndexInArchive, ui.MTime);
331cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
332baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
333baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
334baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (ui.NewProps)
335baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
336baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      bool folderStatusIsDefined;
337baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
338baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        NCOM::CPropVariant prop;
339baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        RINOK(updateCallback->GetProperty(i, kpidAttrib, &prop));
340baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (prop.vt == VT_EMPTY)
341baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          ui.AttribDefined = false;
342baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else if (prop.vt != VT_UI4)
343baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          return E_INVALIDARG;
344baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else
345baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        {
346baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          ui.Attrib = prop.ulVal;
347baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          ui.AttribDefined = true;
348baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        }
349baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
350baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
351baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      // we need MTime to sort files.
352cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (need_CTime) RINOK(GetTime(updateCallback, i, kpidCTime, ui.CTime, ui.CTimeDefined));
353cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (need_ATime) RINOK(GetTime(updateCallback, i, kpidATime, ui.ATime, ui.ATimeDefined));
354cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (need_MTime) RINOK(GetTime(updateCallback, i, kpidMTime, ui.MTime, ui.MTimeDefined));
355cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
356cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      /*
357cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (getRawProps)
358cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
359cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        const void *data;
360cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        UInt32 dataSize;
361cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        UInt32 propType;
362cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
363cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        getRawProps->GetRawProp(i, kpidNtSecure, &data, &dataSize, &propType);
364cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (dataSize != 0 && propType != NPropDataType::kRaw)
365cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          return E_FAIL;
366cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.SecureIndex = secureBlocks.AddUniq((const Byte *)data, dataSize);
367cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
368cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      */
369baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
370baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
371baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        NCOM::CPropVariant prop;
372baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        RINOK(updateCallback->GetProperty(i, kpidPath, &prop));
373baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (prop.vt == VT_EMPTY)
374cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
375cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
376baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else if (prop.vt != VT_BSTR)
377baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          return E_INVALIDARG;
378baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else
379baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        {
380cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          name = NItemName::MakeLegalName(prop.bstrVal);
381baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        }
382baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
383baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
384baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        NCOM::CPropVariant prop;
385baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        RINOK(updateCallback->GetProperty(i, kpidIsDir, &prop));
386baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (prop.vt == VT_EMPTY)
387baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          folderStatusIsDefined = false;
388baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else if (prop.vt != VT_BOOL)
389baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          return E_INVALIDARG;
390baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else
391baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        {
392baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          ui.IsDir = (prop.boolVal != VARIANT_FALSE);
393baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          folderStatusIsDefined = true;
394baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        }
395baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
396baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
397baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
398baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        NCOM::CPropVariant prop;
399baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        RINOK(updateCallback->GetProperty(i, kpidIsAnti, &prop));
400baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (prop.vt == VT_EMPTY)
401baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          ui.IsAnti = false;
402baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else if (prop.vt != VT_BOOL)
403baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          return E_INVALIDARG;
404baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        else
405baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          ui.IsAnti = (prop.boolVal != VARIANT_FALSE);
406baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
407baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
408cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      /*
409cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
410cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        NCOM::CPropVariant prop;
411cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        RINOK(updateCallback->GetProperty(i, kpidIsAltStream, &prop));
412cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (prop.vt == VT_EMPTY)
413cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          isAltStream = false;
414cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        else if (prop.vt != VT_BOOL)
415cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          return E_INVALIDARG;
416cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        else
417cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          isAltStream = (prop.boolVal != VARIANT_FALSE);
418cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
419cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      */
420cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
421baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (ui.IsAnti)
422baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
423baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ui.AttribDefined = false;
424baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
425baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ui.CTimeDefined = false;
426baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ui.ATimeDefined = false;
427baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ui.MTimeDefined = false;
428baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
429baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ui.Size = 0;
430baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
431baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
432baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (!folderStatusIsDefined && ui.AttribDefined)
433baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ui.SetDirStatusFromAttrib();
434baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
435cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else
436cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
437cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      /*
438cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (_db.SecureIDs.IsEmpty())
439cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.SecureIndex = secureBlocks.AddUniq(NULL, 0);
440cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      else
441cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
442cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        int id = _db.SecureIDs[ui.IndexInArchive];
443cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        size_t offs = _db.SecureOffsets[id];
444cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        size_t size = _db.SecureOffsets[id + 1] - offs;
445cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.SecureIndex = secureBlocks.AddUniq(_db.SecureBuf + offs, size);
446cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
447cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      */
448cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
449cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
450cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    /*
451cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
452cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      int folderIndex = 0;
453cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (_useParents)
454cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
455cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        int j;
456cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        s.Empty();
457cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        for (j = 0; j < name.Len(); j++)
458cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
459cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          wchar_t c = name[j];
460cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          if (IsCharDirLimiter(c))
461cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          {
462cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            folderIndex = AddFolder(treeFolders, folderIndex, s);
463cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            s.Empty();
464cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            continue;
465cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          }
466cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          s += c;
467cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
468cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (isAltStream)
469cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
470cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          int colonPos = s.Find(':');
471cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          if (colonPos < 0)
472cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          {
473cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            // isAltStream = false;
474cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            return E_INVALIDARG;
475cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          }
476cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          UString mainName = s.Left(colonPos);
477cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          int newFolderIndex = AddFolder(treeFolders, folderIndex, mainName);
478cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          if (treeFolders[newFolderIndex].UpdateItemIndex < 0)
479cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          {
480cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            for (int j = updateItems.Size() - 1; j >= 0; j--)
481cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            {
482cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              CUpdateItem &ui2 = updateItems[j];
483cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              if (ui2.ParentFolderIndex == folderIndex
484cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky                  && ui2.Name == mainName)
485cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              {
486cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky                ui2.TreeFolderIndex = newFolderIndex;
487cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky                treeFolders[newFolderIndex].UpdateItemIndex = j;
488cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              }
489cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            }
490cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          }
491cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          folderIndex = newFolderIndex;
492cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          s.Delete(0, colonPos + 1);
493cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
494cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.Name = s;
495cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
496cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      else
497cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.Name = name;
498cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      ui.IsAltStream = isAltStream;
499cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      ui.ParentFolderIndex = folderIndex;
500cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      ui.TreeFolderIndex = -1;
501cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (ui.IsDir && !s.IsEmpty())
502cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
503cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        ui.TreeFolderIndex = AddFolder(treeFolders, folderIndex, s);
504cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        treeFolders[ui.TreeFolderIndex].UpdateItemIndex = updateItems.Size();
505cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
506cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
507cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    */
508cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    ui.Name = name;
509baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
510baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (ui.NewData)
511baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
512f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      ui.Size = 0;
513f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (!ui.IsDir)
514f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
515f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        NCOM::CPropVariant prop;
516f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        RINOK(updateCallback->GetProperty(i, kpidSize, &prop));
517f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (prop.vt != VT_UI8)
518f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          return E_INVALIDARG;
519f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        ui.Size = (UInt64)prop.uhVal.QuadPart;
520f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (ui.Size != 0 && ui.IsAnti)
521f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          return E_INVALIDARG;
522f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
523baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
524f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
525baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    updateItems.Add(ui);
526baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
527baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
528cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  /*
529cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FillSortIndex(treeFolders, 0, 0);
530cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (i = 0; i < (UInt32)updateItems.Size(); i++)
531cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
532cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CUpdateItem &ui = updateItems[i];
533cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    ui.ParentSortIndex = treeFolders[ui.ParentFolderIndex].SortIndex;
534cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    ui.ParentSortIndexEnd = treeFolders[ui.ParentFolderIndex].SortIndexEnd;
535cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
536cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  */
537cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
538baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CCompressionMethodMode methodMode, headerMethod;
539cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
540f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  HRESULT res = SetMainMethod(methodMode
541cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #ifndef _7ZIP_ST
542cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    , _numThreads
543cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
544cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    );
545cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  RINOK(res);
546cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
547cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  RINOK(SetHeaderMethod(headerMethod));
548f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
549baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifndef _7ZIP_ST
550baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  methodMode.NumThreads = _numThreads;
551f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  methodMode.MultiThreadMixer = _useMultiThreadMixer;
552baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  headerMethod.NumThreads = 1;
553f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  headerMethod.MultiThreadMixer = _useMultiThreadMixer;
554baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
555baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
556baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ICryptoGetTextPassword2> getPassword2;
557baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  updateCallback->QueryInterface(IID_ICryptoGetTextPassword2, (void **)&getPassword2);
558baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
559cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  methodMode.PasswordIsDefined = false;
560cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  methodMode.Password.Empty();
561baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (getPassword2)
562baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
563baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CMyComBSTR password;
564baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    Int32 passwordIsDefined;
565baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(getPassword2->CryptoGetTextPassword2(&passwordIsDefined, &password));
566baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    methodMode.PasswordIsDefined = IntToBool(passwordIsDefined);
567f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (methodMode.PasswordIsDefined && password)
568baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      methodMode.Password = password;
569baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
570baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
571baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool compressMainHeader = _compressHeaders;  // check it
572baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
573baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool encryptHeaders = false;
574baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
575f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #ifndef _NO_CRYPTO
576f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (!methodMode.PasswordIsDefined && _passwordIsDefined)
577f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
578f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    // if header is compressed, we use that password for updated archive
579f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    methodMode.PasswordIsDefined = true;
580f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    methodMode.Password = _password;
581f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
582f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #endif
583f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
584baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (methodMode.PasswordIsDefined)
585baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
586baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_encryptHeadersSpecified)
587baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      encryptHeaders = _encryptHeaders;
588baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    #ifndef _NO_CRYPTO
589baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    else
590baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      encryptHeaders = _passwordIsDefined;
591baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    #endif
592baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    compressMainHeader = true;
593baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (encryptHeaders)
594baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
595baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      headerMethod.PasswordIsDefined = methodMode.PasswordIsDefined;
596baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      headerMethod.Password = methodMode.Password;
597baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
598baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
599baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
600baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (numItems < 2)
601baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    compressMainHeader = false;
602baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
603f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  int level = GetLevel();
604f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
605baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CUpdateOptions options;
606baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  options.Method = &methodMode;
607f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  options.HeaderMethod = (_compressHeaders || encryptHeaders) ? &headerMethod : NULL;
608f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  options.UseFilters = (level != 0 && _autoFilter && !methodMode.Filter_was_Inserted);
609f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  options.MaxFilter = (level >= 8);
610f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  options.AnalysisLevel = GetAnalysisLevel();
611baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
612baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  options.HeaderOptions.CompressMainHeader = compressMainHeader;
613cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  /*
614cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  options.HeaderOptions.WriteCTime = Write_CTime;
615cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  options.HeaderOptions.WriteATime = Write_ATime;
616cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  options.HeaderOptions.WriteMTime = Write_MTime;
617cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  */
618baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
619baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  options.NumSolidFiles = _numSolidFiles;
620baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  options.NumSolidBytes = _numSolidBytes;
621baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  options.SolidExtension = _solidExtension;
622f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  options.UseTypeSorting = _useTypeSorting;
623f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
624baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  options.RemoveSfxBlock = _removeSfxBlock;
625f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // options.VolumeMode = _volumeMode;
626f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
627f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  options.MultiThreadMixer = _useMultiThreadMixer;
628baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
629baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COutArchive archive;
630cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CArchiveDatabaseOut newDatabase;
631baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
632baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ICryptoGetTextPassword> getPassword;
633baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  updateCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getPassword);
634baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
635cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  /*
636cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (secureBlocks.Sorted.Size() > 1)
637cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
638cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    secureBlocks.GetReverseMap();
639cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    for (int i = 0; i < updateItems.Size(); i++)
640cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
641cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      int &secureIndex = updateItems[i].SecureIndex;
642cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      secureIndex = secureBlocks.BufIndexToSortedIndex[secureIndex];
643cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
644cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
645cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  */
646cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
647cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  res = Update(
648baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      EXTERNAL_CODECS_VARS
649baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #ifdef _7Z_VOL
650baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      volume ? volume->Stream: 0,
651baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      volume ? db : 0,
652baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #else
653baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _inStream,
654baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      db,
655baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #endif
656baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      updateItems,
657cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      // treeFolders,
658cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      // secureBlocks,
659baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      archive, newDatabase, outStream, updateCallback, options
660baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #ifndef _NO_CRYPTO
661baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      , getPassword
662baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      #endif
663baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      );
664baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
665baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(res);
666baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
667baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  updateItems.ClearAndFree();
668baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
669baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return archive.WriteDatabase(EXTERNAL_CODECS_VARS
670baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      newDatabase, options.HeaderMethod, options.HeaderOptions);
671baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
672baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
673baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
674baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
675f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic HRESULT ParseBond(UString &srcString, UInt32 &coder, UInt32 &stream)
676baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
677baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  stream = 0;
678f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
679f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    unsigned index = ParseStringToUInt32(srcString, coder);
680f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (index == 0)
681f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      return E_INVALIDARG;
682f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    srcString.DeleteFrontal(index);
683f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
684cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (srcString[0] == 's')
685baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
686baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    srcString.Delete(0);
687f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    unsigned index = ParseStringToUInt32(srcString, stream);
688baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (index == 0)
689baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return E_INVALIDARG;
690f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    srcString.DeleteFrontal(index);
691baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
692baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
693baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
694baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
695cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyvoid COutHandler::InitProps()
696baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
697cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMultiMethodProps::Init();
698cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
699cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _removeSfxBlock = false;
700cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _compressHeaders = true;
701cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _encryptHeadersSpecified = false;
702cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _encryptHeaders = false;
703cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // _useParents = false;
704cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
705cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  Write_CTime.Init();
706cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  Write_ATime.Init();
707cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  Write_MTime.Init();
708cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
709f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  _useMultiThreadMixer = true;
710f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
711f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // _volumeMode = false;
712f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
713cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  InitSolid();
714f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  _useTypeSorting = false;
715cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
716cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
717cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT COutHandler::SetSolidFromString(const UString &s)
718cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
719cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString s2 = s;
720cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  s2.MakeLower_Ascii();
721cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (unsigned i = 0; i < s2.Len();)
722cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
723cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    const wchar_t *start = ((const wchar_t *)s2) + i;
724cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    const wchar_t *end;
725cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    UInt64 v = ConvertStringToUInt64(start, &end);
726cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (start == end)
727cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
728cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (s2[i++] != 'e')
729cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return E_INVALIDARG;
730cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _solidExtension = true;
731cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      continue;
732cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
733cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    i += (int)(end - start);
734cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (i == s2.Len())
735cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return E_INVALIDARG;
736cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    wchar_t c = s2[i++];
737cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (c == 'f')
738cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
739cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (v < 1)
740cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        v = 1;
741cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _numSolidFiles = v;
742cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
743cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else
744cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
745cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      unsigned numBits;
746cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      switch (c)
747cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
748cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        case 'b': numBits =  0; break;
749cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        case 'k': numBits = 10; break;
750cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        case 'm': numBits = 20; break;
751cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        case 'g': numBits = 30; break;
752cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        case 't': numBits = 40; break;
753cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        default: return E_INVALIDARG;
754cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
755cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _numSolidBytes = (v << numBits);
756cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _numSolidBytesDefined = true;
757cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
758cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
759cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
760cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
761cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
762cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT COutHandler::SetSolidFromPROPVARIANT(const PROPVARIANT &value)
763cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
764cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool isSolid;
765cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  switch (value.vt)
766cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
767cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case VT_EMPTY: isSolid = true; break;
768cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case VT_BOOL: isSolid = (value.boolVal != VARIANT_FALSE); break;
769cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case VT_BSTR:
770cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (StringToBool(value.bstrVal, isSolid))
771cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        break;
772cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return SetSolidFromString(value.bstrVal);
773cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    default: return E_INVALIDARG;
774cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
775cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (isSolid)
776cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    InitSolid();
777cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  else
778cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _numSolidFiles = 1;
779cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
780cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
781cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
782cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic HRESULT PROPVARIANT_to_BoolPair(const PROPVARIANT &prop, CBoolPair &dest)
783cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
784cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  RINOK(PROPVARIANT_to_bool(prop, dest.Val));
785cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  dest.Def = true;
786baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
787baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
788baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
789cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value)
790cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
791cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString name = nameSpec;
792cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  name.MakeLower_Ascii();
793cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (name.IsEmpty())
794cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return E_INVALIDARG;
795cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
796cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (name[0] == L's')
797cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
798cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    name.Delete(0);
799cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEmpty())
800cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return SetSolidFromPROPVARIANT(value);
801cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (value.vt != VT_EMPTY)
802cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return E_INVALIDARG;
803cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return SetSolidFromString(name);
804cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
805cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
806cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt32 number;
807cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int index = ParseStringToUInt32(name, number);
808f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // UString realName = name.Ptr(index);
809cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (index == 0)
810cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
811cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("rsfx")) return PROPVARIANT_to_bool(value, _removeSfxBlock);
812cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("hc")) return PROPVARIANT_to_bool(value, _compressHeaders);
813cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    // if (name.IsEqualToNoCase(L"HS")) return PROPVARIANT_to_bool(value, _useParents);
814cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
815cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("hcf"))
816cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
817cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      bool compressHeadersFull = true;
818cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      RINOK(PROPVARIANT_to_bool(value, compressHeadersFull));
819cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return compressHeadersFull ? S_OK: E_INVALIDARG;
820cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
821cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
822cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("he"))
823cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
824cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      RINOK(PROPVARIANT_to_bool(value, _encryptHeaders));
825cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _encryptHeadersSpecified = true;
826cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return S_OK;
827cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
828cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
829cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("tc")) return PROPVARIANT_to_BoolPair(value, Write_CTime);
830cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("ta")) return PROPVARIANT_to_BoolPair(value, Write_ATime);
831cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name.IsEqualTo("tm")) return PROPVARIANT_to_BoolPair(value, Write_MTime);
832cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
833f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (name.IsEqualTo("mtf")) return PROPVARIANT_to_bool(value, _useMultiThreadMixer);
834f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
835f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (name.IsEqualTo("qs")) return PROPVARIANT_to_bool(value, _useTypeSorting);
836f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
837f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    // if (name.IsEqualTo("v"))  return PROPVARIANT_to_bool(value, _volumeMode);
838cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
839cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return CMultiMethodProps::SetProperty(name, value);
840cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
841cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
842f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaSTDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps)
843baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
844baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
845f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  _bonds.Clear();
846cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  InitProps();
847baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
848cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (UInt32 i = 0; i < numProps; i++)
849baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
850baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UString name = names[i];
851cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    name.MakeLower_Ascii();
852baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (name.IsEmpty())
853baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return E_INVALIDARG;
854baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
855baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const PROPVARIANT &value = values[i];
856baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
857cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (name[0] == 'b')
858baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
859cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (value.vt != VT_EMPTY)
860cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return E_INVALIDARG;
861baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      name.Delete(0);
862f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
863f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      CBond2 bond;
864f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      RINOK(ParseBond(name, bond.OutCoder, bond.OutStream));
865cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (name[0] != ':')
866cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return E_INVALIDARG;
867cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      name.Delete(0);
868f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      UInt32 inStream = 0;
869f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      RINOK(ParseBond(name, bond.InCoder, inStream));
870f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (inStream != 0)
871f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        return E_INVALIDARG;
872cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (!name.IsEmpty())
873cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return E_INVALIDARG;
874f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _bonds.Add(bond);
875baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      continue;
876baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
877baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
878baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(SetProperty(name, value));
879baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
880baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
881cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned numEmptyMethods = GetNumEmptyMethods();
882cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (numEmptyMethods > 0)
883cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
884cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    unsigned k;
885f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    for (k = 0; k < _bonds.Size(); k++)
886cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
887f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      const CBond2 &bond = _bonds[k];
888f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (bond.InCoder < (UInt32)numEmptyMethods ||
889f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          bond.OutCoder < (UInt32)numEmptyMethods)
890cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return E_INVALIDARG;
891cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
892f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    for (k = 0; k < _bonds.Size(); k++)
893cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
894f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      CBond2 &bond = _bonds[k];
895f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      bond.InCoder -= (UInt32)numEmptyMethods;
896f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      bond.OutCoder -= (UInt32)numEmptyMethods;
897cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
898cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _methods.DeleteFrontal(numEmptyMethods);
899cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
900cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
901f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FOR_VECTOR (k, _bonds)
902cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
903f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    const CBond2 &bond = _bonds[k];
904f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (bond.InCoder >= (UInt32)_methods.Size() ||
905f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        bond.OutCoder >= (UInt32)_methods.Size())
906cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return E_INVALIDARG;
907cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
908cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
909baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
910baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
911baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
912baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
913baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}}
914