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