1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// UpdateCallback.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#ifndef _7ZIP_ST
6f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#include "../../../Windows/Synchronization.h"
7f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#endif
8f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/ComTry.h"
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/IntToString.h"
11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/StringConvert.h"
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/Wildcard.h"
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/FileDir.h"
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/FileName.h"
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/PropVariant.h"
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../Common/StreamObjects.h"
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "UpdateCallback.h"
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#if defined(_WIN32) && !defined(UNDER_CE)
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define _USE_SECURITY_CODE
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/SecurityUtils.h"
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
27baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing namespace NWindows;
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyusing namespace NFile;
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
30f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#ifndef _7ZIP_ST
31f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic NSynchronization::CCriticalSection g_CriticalSection;
32f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
33f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#else
34f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#define MT_LOCK
35f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#endif
36f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
37f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef _USE_SECURITY_CODE
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool InitLocalPrivileges();
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
42baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCArchiveUpdateCallback::CArchiveUpdateCallback():
43f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _hardIndex_From((UInt32)(Int32)-1),
44f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
45f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    Callback(NULL),
46f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
47f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    DirItems(NULL),
48f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ParentDirItem(NULL),
49f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
50f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    Arc(NULL),
51f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ArcItems(NULL),
52f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    UpdatePairs(NULL),
53f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    NewNames(NULL),
54f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
55f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ShareForWrite(false),
56f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    StdInMode(false),
57f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
58f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    KeepOriginalItemNames(false),
59f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    StoreNtSecurity(false),
60f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    StoreHardLinks(false),
61f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    StoreSymLinks(false),
62f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
63f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ProcessedItemsStatuses(NULL)
64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifdef _USE_SECURITY_CODE
66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _saclEnabled = InitLocalPrivileges();
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
71baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 size)
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Callback->SetTotal(size);
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
78baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue)
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Callback->SetCompleted(completeValue);
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
85baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Callback->SetRatioInfo(inSize, outSize);
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync/*
94f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const CStatProp kProps[] =
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidPath, VT_BSTR},
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidIsDir, VT_BOOL},
98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidSize, VT_UI8},
99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidCTime, VT_FILETIME},
100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidATime, VT_FILETIME},
101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidMTime, VT_FILETIME},
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidAttrib, VT_UI4},
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { NULL, kpidIsAnti, VT_BOOL}
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
106baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **)
107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return CStatPropEnumerator::CreateEnumerator(kProps, ARRAY_SIZE(kProps), enumerator);
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync*/
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
112baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index,
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      Int32 *newData, Int32 *newProps, UInt32 *indexInArchive)
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(Callback->CheckBreak());
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  const CUpdatePair2 &up = (*UpdatePairs)[index];
118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (newData) *newData = BoolToInt(up.NewData);
119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (newProps) *newProps = BoolToInt(up.NewProps);
120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (indexInArchive)
121baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    *indexInArchive = (UInt32)(Int32)-1;
123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (up.ExistInArchive())
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      *indexInArchive = (ArcItems == 0) ? up.ArcIndex : (*ArcItems)[up.ArcIndex].IndexInServer;
125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetRootProp(PROPID propID, PROPVARIANT *value)
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  NCOM::CPropVariant prop;
133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  switch (propID)
134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case kpidIsDir:  prop = true; break;
136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case kpidAttrib: if (ParentDirItem) prop = ParentDirItem->Attrib; break;
137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case kpidCTime:  if (ParentDirItem) prop = ParentDirItem->CTime; break;
138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case kpidATime:  if (ParentDirItem) prop = ParentDirItem->ATime; break;
139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case kpidMTime:  if (ParentDirItem) prop = ParentDirItem->MTime; break;
140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  prop.Detach(value);
142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType)
146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *parentType = NParentType::kDir;
148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *parent = (UInt32)(Int32)-1;
149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetNumRawProps(UInt32 *numProps)
153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *numProps = 0;
155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (StoreNtSecurity)
156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    *numProps = 1;
157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID)
161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *name = NULL;
163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *propID = kpidNtSecure;
164cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
166cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetRootRawProp(PROPID
168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #ifdef _USE_SECURITY_CODE
169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    propID
170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    , const void **data, UInt32 *dataSize, UInt32 *propType)
172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *data = 0;
174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *dataSize = 0;
175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *propType = 0;
176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!StoreNtSecurity)
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return S_OK;
178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifdef _USE_SECURITY_CODE
179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (propID == kpidNtSecure)
180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (StdInMode)
182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return S_OK;
183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (ParentDirItem)
185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (ParentDirItem->SecureIndex < 0)
187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return S_OK;
188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      const CByteBuffer &buf = DirItems->SecureBlocks.Bufs[ParentDirItem->SecureIndex];
189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      *data = buf;
190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      *dataSize = (UInt32)buf.Size();
191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      *propType = NPropDataType::kRaw;
192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return S_OK;
193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
195f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (Arc && Arc->GetRootProps)
196f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      return Arc->GetRootProps->GetRootRawProp(propID, data, dataSize, propType);
197baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky//    #ifdef _USE_SECURITY_CODE
203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky//    #endif
204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
205cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)
206cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
207cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *data = 0;
208cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *dataSize = 0;
209cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *propType = 0;
210cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
211cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (propID == kpidNtSecure ||
212cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      propID == kpidNtReparse)
213baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
214cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (StdInMode)
215cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return S_OK;
216cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
217cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    const CUpdatePair2 &up = (*UpdatePairs)[index];
218f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (up.UseArcProps && up.ExistInArchive() && Arc->GetRawProps)
219f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      return Arc->GetRawProps->GetRawProp(
220cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          ArcItems ? (*ArcItems)[up.ArcIndex].IndexInServer : up.ArcIndex,
221cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          propID, data, dataSize, propType);
222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
223cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      /*
224cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (!up.NewData)
225cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return E_FAIL;
226cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      */
227cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (up.IsAnti)
228cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return S_OK;
229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
230cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      #ifndef UNDER_CE
231cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      const CDirItem &di = DirItems->Items[up.DirIndex];
232cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      #endif
233cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      #ifdef _USE_SECURITY_CODE
235cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (propID == kpidNtSecure)
236cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
237cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (!StoreNtSecurity)
238cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          return S_OK;
239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (di.SecureIndex < 0)
240cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          return S_OK;
241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        const CByteBuffer &buf = DirItems->SecureBlocks.Bufs[di.SecureIndex];
242cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        *data = buf;
243cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        *dataSize = (UInt32)buf.Size();
244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        *propType = NPropDataType::kRaw;
245cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
246cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      else
247cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      #endif
248cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
249cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        // propID == kpidNtReparse
250cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (!StoreSymLinks)
251cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          return S_OK;
252cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        #ifndef UNDER_CE
253cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        const CByteBuffer *buf = &di.ReparseData2;
254cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (buf->Size() == 0)
255cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          buf = &di.ReparseData;
256cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (buf->Size() != 0)
257cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
258cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          *data = *buf;
259cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          *dataSize = (UInt32)buf->Size();
260cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          *propType = NPropDataType::kRaw;
261cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
262cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        #endif
263cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
264cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
265cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return S_OK;
266cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
267cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
268cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
269cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
270cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
271cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
272cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef UNDER_CE
273cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
274cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic UString GetRelativePath(const UString &to, const UString &from)
275cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
276cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UStringVector partsTo, partsFrom;
277cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  SplitPathToParts(to, partsTo);
278cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  SplitPathToParts(from, partsFrom);
279cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
280cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned i;
281cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (i = 0;; i++)
282cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
283cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (i + 1 >= partsFrom.Size() ||
284cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        i + 1 >= partsTo.Size())
285cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      break;
286cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (CompareFileNames(partsFrom[i], partsTo[i]) != 0)
287cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      break;
288cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
289cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
290cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (i == 0)
291cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
292cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #ifdef _WIN32
293cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (NName::IsDrivePath(to) ||
294cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        NName::IsDrivePath(from))
295cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return to;
296cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
297cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
298cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
299cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString s;
300cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned k;
301cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
302cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (k = i + 1; k < partsFrom.Size(); k++)
303cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    s += L".." WSTRING_PATH_SEPARATOR;
304cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
305cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (k = i; k < partsTo.Size(); k++)
306cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
307cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (k != i)
308f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s.Add_PathSepar();
309cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    s += partsTo[k];
310cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
311cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
312cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return s;
313cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
314cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
315cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
316cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
317cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
318cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
319cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  COM_TRY_BEGIN
320cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const CUpdatePair2 &up = (*UpdatePairs)[index];
321cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  NCOM::CPropVariant prop;
322cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
323cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (up.NewData)
324cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
325cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    /*
326cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (propID == kpidIsHardLink)
327cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
328cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      prop = _isHardLink;
329cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      prop.Detach(value);
330cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return S_OK;
331cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
332cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    */
333cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (propID == kpidSymLink)
334cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
335cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (index == _hardIndex_From)
336cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
337baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        prop.Detach(value);
338baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return S_OK;
339cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
340cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (up.DirIndex >= 0)
341cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
342cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        #ifndef UNDER_CE
343cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        const CDirItem &di = DirItems->Items[up.DirIndex];
344cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        // if (di.IsDir())
345cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
346cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          CReparseAttr attr;
347cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          if (attr.Parse(di.ReparseData, di.ReparseData.Size()))
348cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          {
349cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            UString simpleName = attr.GetPath();
350cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            if (attr.IsRelative())
351cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              prop = simpleName;
352cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            else
353cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            {
354f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka              const FString phyPath = DirItems->GetPhyPath(up.DirIndex);
355cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              FString fullPath;
356f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka              if (NDir::MyGetFullPathName(phyPath, fullPath))
357cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              {
358cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky                prop = GetRelativePath(simpleName, fs2us(fullPath));
359cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              }
360cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            }
361cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            prop.Detach(value);
362cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            return S_OK;
363cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          }
364cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
365cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        #endif
366cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
367cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
368cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else if (propID == kpidHardLink)
369cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
370cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (index == _hardIndex_From)
371cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
372cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        const CKeyKeyValPair &pair = _map[_hardIndex_To];
373cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        const CUpdatePair2 &up2 = (*UpdatePairs)[pair.Value];
374cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        prop = DirItems->GetLogPath(up2.DirIndex);
375cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        prop.Detach(value);
376cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return S_OK;
377cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
378cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (up.DirIndex >= 0)
379cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
380baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        prop.Detach(value);
381baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return S_OK;
382cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
383baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
384baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
385baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
386cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (up.IsAnti
387cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      && propID != kpidIsDir
388cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      && propID != kpidPath
389cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      && propID != kpidIsAltStream)
390cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
391cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    switch (propID)
392cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
393cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case kpidSize:  prop = (UInt64)0; break;
394cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case kpidIsAnti:  prop = true; break;
395cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
396cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
397cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  else if (propID == kpidPath && up.NewNameIndex >= 0)
398cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    prop = (*NewNames)[up.NewNameIndex];
399cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  else if (propID == kpidShortName && up.NewNameIndex >= 0 && up.IsMainRenameItem)
400cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
401cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    // we can generate new ShortName here;
402cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
403f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else if ((up.UseArcProps || (KeepOriginalItemNames && (propID == kpidPath || propID == kpidIsAltStream)))
404cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      && up.ExistInArchive() && Archive)
405cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return Archive->GetProperty(ArcItems ? (*ArcItems)[up.ArcIndex].IndexInServer : up.ArcIndex, propID, value);
406cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  else if (up.ExistOnDisk())
407baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
408baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CDirItem &di = DirItems->Items[up.DirIndex];
409cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    switch (propID)
410baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
411baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case kpidPath:  prop = DirItems->GetLogPath(up.DirIndex); break;
412baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case kpidIsDir:  prop = di.IsDir(); break;
413f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      case kpidSize:  prop = di.IsDir() ? (UInt64)0 : di.Size; break;
414baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case kpidAttrib:  prop = di.Attrib; break;
415baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case kpidCTime:  prop = di.CTime; break;
416baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case kpidATime:  prop = di.ATime; break;
417baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case kpidMTime:  prop = di.MTime; break;
418cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      case kpidIsAltStream:  prop = di.IsAltStream; break;
419cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      #if defined(_WIN32) && !defined(UNDER_CE)
420cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      // case kpidShortName:  prop = di.ShortName; break;
421cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      #endif
422baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
423baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
424baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  prop.Detach(value);
425baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
426baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
427baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
428baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
429f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#ifndef _7ZIP_ST
430cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic NSynchronization::CCriticalSection CS;
431f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#endif
432cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
433f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaSTDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStream **inStream, UInt32 mode)
434baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
435baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
436cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  *inStream = NULL;
437baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  const CUpdatePair2 &up = (*UpdatePairs)[index];
438baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (!up.NewData)
439baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return E_FAIL;
440baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
441baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(Callback->CheckBreak());
442f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // RINOK(Callback->Finalize());
443baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
444cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool isDir = IsDir(up);
445cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
446baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (up.IsAnti)
447baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
448cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    UString name;
449cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (up.ArcIndex >= 0)
450cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      name = (*ArcItems)[up.ArcIndex].Name;
451cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else if (up.DirIndex >= 0)
452cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      name = DirItems->GetLogPath(up.DirIndex);
453f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    RINOK(Callback->GetStream(name, isDir, true, mode));
454cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
455cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    /* 9.33: fixed. Handlers expect real stream object for files, even for anti-file.
456cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky       so we return empty stream */
457cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
458cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (!isDir)
459cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
460cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      CBufInStream *inStreamSpec = new CBufInStream();
461cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      CMyComPtr<ISequentialInStream> inStreamLoc = inStreamSpec;
462cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      inStreamSpec->Init(NULL, 0);
463cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      *inStream = inStreamLoc.Detach();
464cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
465cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return S_OK;
466baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
467cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
468f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  RINOK(Callback->GetStream(DirItems->GetLogPath(up.DirIndex), isDir, false, mode));
469baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
470cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (isDir)
471baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return S_OK;
472baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
473baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (StdInMode)
474baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
475f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (mode != NUpdateNotifyOp::kAdd &&
476f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        mode != NUpdateNotifyOp::kUpdate)
477f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      return S_OK;
478f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
479baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CStdInFileStream *inStreamSpec = new CStdInFileStream;
480baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
481baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    *inStream = inStreamLoc.Detach();
482baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
483baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  else
484baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
485baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CInFileStream *inStreamSpec = new CInFileStream;
486baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
487cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
488cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    inStreamSpec->SupportHardLinks = StoreHardLinks;
489f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    inStreamSpec->Callback = this;
490f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    inStreamSpec->CallbackRef = index;
491cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
492f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    const FString path = DirItems->GetPhyPath(up.DirIndex);
493f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _openFiles_Indexes.Add(index);
494f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _openFiles_Paths.Add(path);
495cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
496cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #if defined(_WIN32) && !defined(UNDER_CE)
497cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (DirItems->Items[up.DirIndex].AreReparseData())
498cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
499f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (!inStreamSpec->File.OpenReparse(path))
500cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
501cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        return Callback->OpenFileError(path, ::GetLastError());
502cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
503cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
504cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    else
505cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
506f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (!inStreamSpec->OpenShared(path, ShareForWrite))
507baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
508baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return Callback->OpenFileError(path, ::GetLastError());
509baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
510cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
511cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (StoreHardLinks)
512cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
513cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      CStreamFileProps props;
514cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      if (inStreamSpec->GetProps2(&props) == S_OK)
515cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      {
516cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (props.NumLinks > 1)
517cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
518cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          CKeyKeyValPair pair;
519cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          pair.Key1 = props.VolID;
520cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          pair.Key2 = props.FileID_Low;
521cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          pair.Value = index;
522cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          unsigned numItems = _map.Size();
523cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          unsigned pairIndex = _map.AddToUniqueSorted2(pair);
524cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          if (numItems == _map.Size())
525cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          {
526cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            // const CKeyKeyValPair &pair2 = _map.Pairs[pairIndex];
527cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            _hardIndex_From = index;
528cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            _hardIndex_To = pairIndex;
529cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            // we could return NULL as stream, but it's better to return real stream
530cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            // return S_OK;
531cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          }
532cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
533cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      }
534cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
535cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
536cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (ProcessedItemsStatuses)
537cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
538f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      #ifndef _7ZIP_ST
539cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      NSynchronization::CCriticalSectionLock lock(CS);
540f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      #endif
541f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      ProcessedItemsStatuses[(unsigned)up.DirIndex] = 1;
542cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
543baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    *inStream = inStreamLoc.Detach();
544baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
545cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
546baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
547baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
548baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
549baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
550f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaSTDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 opRes)
551f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
552f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_BEGIN
553f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return Callback->SetOperationResult(opRes);
554f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_END
555f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
556f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
557f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaSTDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)
558baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
559baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
560f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return GetStream2(index, inStream,
561f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      (*UpdatePairs)[index].ArcIndex < 0 ?
562f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          NUpdateNotifyOp::kAdd :
563f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          NUpdateNotifyOp::kUpdate);
564f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_END
565f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
566f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
567f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaSTDMETHODIMP CArchiveUpdateCallback::ReportOperation(UInt32 indexType, UInt32 index, UInt32 op)
568f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
569f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_BEGIN
570f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
571f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  bool isDir = false;
572f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
573f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (indexType == NArchive::NEventIndexType::kOutArcIndex)
574f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
575f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    UString name;
576f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (index != (UInt32)(Int32)-1)
577f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
578f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      const CUpdatePair2 &up = (*UpdatePairs)[index];
579f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (up.ExistOnDisk())
580f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
581f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        name = DirItems->GetLogPath(up.DirIndex);
582f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        isDir = DirItems->Items[up.DirIndex].IsDir();
583f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
584f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
585f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    return Callback->ReportUpdateOpeartion(op, name.IsEmpty() ? NULL : name.Ptr(), isDir);
586f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
587f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
588f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  wchar_t temp[16];
589f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UString s2;
590f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  const wchar_t *s = NULL;
591f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
592f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (indexType == NArchive::NEventIndexType::kInArcIndex)
593f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
594f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (index != (UInt32)(Int32)-1)
595f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
596f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (ArcItems)
597f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
598f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        const CArcItem &ai = (*ArcItems)[index];
599f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        s = ai.Name;
600f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        isDir = ai.IsDir;
601f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
602f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      else if (Arc)
603f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
604f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        RINOK(Arc->GetItemPath(index, s2));
605f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        s = s2;
606f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        RINOK(Archive_IsItem_Dir(Arc->Archive, index, isDir));
607f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
608f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
609f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
610f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else if (indexType == NArchive::NEventIndexType::kBlockIndex)
611f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
612f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    temp[0] = '#';
613f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ConvertUInt32ToString(index, temp + 1);
614f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s = temp;
615f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
616f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
617f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (!s)
618f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s = L"";
619f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
620f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return Callback->ReportUpdateOpeartion(op, s, isDir);
621f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
622f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_END
623f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
624f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
625f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaSTDMETHODIMP CArchiveUpdateCallback::ReportExtractResult(UInt32 indexType, UInt32 index, Int32 opRes)
626f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
627f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_BEGIN
628f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
629f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  bool isEncrypted = false;
630f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  wchar_t temp[16];
631f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UString s2;
632f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  const wchar_t *s = NULL;
633f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
634f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (indexType == NArchive::NEventIndexType::kOutArcIndex)
635f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
636f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    /*
637f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    UString name;
638f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (index != (UInt32)(Int32)-1)
639f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
640f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      const CUpdatePair2 &up = (*UpdatePairs)[index];
641f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (up.ExistOnDisk())
642f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
643f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        s2 = DirItems->GetLogPath(up.DirIndex);
644f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        s = s2;
645f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
646f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
647f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    */
648f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    return E_FAIL;
649f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
650f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
651f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (indexType == NArchive::NEventIndexType::kInArcIndex)
652f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
653f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (index != (UInt32)(Int32)-1)
654f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
655f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (ArcItems)
656f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        s = (*ArcItems)[index].Name;
657f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      else if (Arc)
658f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
659f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        RINOK(Arc->GetItemPath(index, s2));
660f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        s = s2;
661f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
662f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (Archive)
663f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
664f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        RINOK(Archive_GetItemBoolProp(Archive, index, kpidEncrypted, isEncrypted));
665f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
666f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
667f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
668f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else if (indexType == NArchive::NEventIndexType::kBlockIndex)
669f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
670f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    temp[0] = '#';
671f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ConvertUInt32ToString(index, temp + 1);
672f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s = temp;
673f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
674f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
675f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return Callback->ReportExtractResult(opRes, BoolToInt(isEncrypted), s);
676f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
677baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
678baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
679baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
680baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size)
681baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
682baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (VolumesSizes.Size() == 0)
683baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return S_FALSE;
684baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (index >= (UInt32)VolumesSizes.Size())
685baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    index = VolumesSizes.Size() - 1;
686baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *size = VolumesSizes[index];
687baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
688baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
689baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
690baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream)
691baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
692baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
693cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FChar temp[16];
694baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  ConvertUInt32ToString(index + 1, temp);
695cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FString res = temp;
696cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  while (res.Len() < 2)
697cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    res.InsertAtFront(FTEXT('0'));
698cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FString fileName = VolName;
699f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  fileName += FTEXT('.');
700baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  fileName += res;
701baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  fileName += VolExt;
702baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COutFileStream *streamSpec = new COutFileStream;
703baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ISequentialOutStream> streamLoc(streamSpec);
704baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (!streamSpec->Create(fileName, false))
705baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return ::GetLastError();
706baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *volumeStream = streamLoc.Detach();
707baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
708baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
709baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
710baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
711baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
712baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
713baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
714baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Callback->CryptoGetTextPassword2(passwordIsDefined, password);
715baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
716baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
717baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
718baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword(BSTR *password)
719baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
720baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_BEGIN
721baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Callback->CryptoGetTextPassword(password);
722baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COM_TRY_END
723baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
724f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
725f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CArchiveUpdateCallback::InFileStream_On_Error(UINT_PTR val, DWORD error)
726f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
727f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (error == ERROR_LOCK_VIOLATION)
728f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
729f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    MT_LOCK
730f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    UInt32 index = (UInt32)val;
731f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    FOR_VECTOR(i, _openFiles_Indexes)
732f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
733f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_openFiles_Indexes[i] == index)
734f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
735f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        RINOK(Callback->ReadingFileError(_openFiles_Paths[i], error));
736f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        break;
737f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
738f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
739f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
740f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return HRESULT_FROM_WIN32(error);
741f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
742f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
743f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid CArchiveUpdateCallback::InFileStream_On_Destroy(UINT_PTR val)
744f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
745f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  MT_LOCK
746f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UInt32 index = (UInt32)val;
747f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FOR_VECTOR(i, _openFiles_Indexes)
748f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
749f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (_openFiles_Indexes[i] == index)
750f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
751f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _openFiles_Indexes.Delete(i);
752f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _openFiles_Paths.Delete(i);
753f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      return;
754f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
755f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
756f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  throw 20141125;
757f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
758