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