diff options
Diffstat (limited to '7zip/Archive/7z/7zUpdate.cpp')
-rwxr-xr-x | 7zip/Archive/7z/7zUpdate.cpp | 116 |
1 files changed, 53 insertions, 63 deletions
diff --git a/7zip/Archive/7z/7zUpdate.cpp b/7zip/Archive/7z/7zUpdate.cpp index 5722aba4..e5d82764 100755 --- a/7zip/Archive/7z/7zUpdate.cpp +++ b/7zip/Archive/7z/7zUpdate.cpp @@ -89,11 +89,13 @@ UString CUpdateItem::GetExtension() const return Name.Mid(GetExtensionPos()); } +/* struct CFolderRef { const CArchiveDatabaseEx *Database; int FolderIndex; }; +*/ #define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } @@ -159,31 +161,31 @@ static int CompareFiles(const CFileItem &f1, const CFileItem &f2) return MyStringCollateNoCase(f1.Name, f2.Name); } -static int __cdecl CompareFolderRefs(const void *p1, const void *p2) +static int CompareFolderRefs(const int *p1, const int *p2, void *param) { - const CFolderRef &a1 = *((const CFolderRef *)p1); - const CFolderRef &a2 = *((const CFolderRef *)p2); - const CArchiveDatabaseEx &d1 = *a1.Database; - const CArchiveDatabaseEx &d2 = *a2.Database; + int i1 = *p1; + int i2 = *p2; + const CArchiveDatabaseEx &db = *(const CArchiveDatabaseEx *)param; RINOZ(CompareFolders( - d1.Folders[a1.FolderIndex], - d2.Folders[a2.FolderIndex])); + db.Folders[i1], + db.Folders[i2])); RINOZ(MyCompare( - d1.NumUnPackStreamsVector[a1.FolderIndex], - d2.NumUnPackStreamsVector[a2.FolderIndex])); - if (d1.NumUnPackStreamsVector[a1.FolderIndex] == 0) + db.NumUnPackStreamsVector[i1], + db.NumUnPackStreamsVector[i2])); + if (db.NumUnPackStreamsVector[i1] == 0) return 0; return CompareFiles( - d1.Files[d1.FolderStartFileIndex[a1.FolderIndex]], - d2.Files[d2.FolderStartFileIndex[a2.FolderIndex]]); + db.Files[db.FolderStartFileIndex[i1]], + db.Files[db.FolderStartFileIndex[i2]]); } //////////////////////////////////////////////////////////// -static int __cdecl CompareEmptyItems(const void *p1, const void *p2) +static int CompareEmptyItems(const int *p1, const int *p2, void *param) { - const CUpdateItem &u1 = **((CUpdateItem **)p1); - const CUpdateItem &u2 = **((CUpdateItem **)p2); + const CObjectVector<CUpdateItem> &updateItems = *(const CObjectVector<CUpdateItem> *)param; + const CUpdateItem &u1 = updateItems[*p1]; + const CUpdateItem &u2 = updateItems[*p2]; if (u1.IsDirectory != u2.IsDirectory) { if (u1.IsDirectory) @@ -234,10 +236,10 @@ struct CRefItem } }; -static int __cdecl CompareUpdateItems(const void *p1, const void *p2) +static int CompareUpdateItems(const CRefItem *p1, const CRefItem *p2, void *param) { - const CRefItem &a1 = *((CRefItem *)p1); - const CRefItem &a2 = *((CRefItem *)p2); + const CRefItem &a1 = *p1; + const CRefItem &a2 = *p2; const CUpdateItem &u1 = *a1.UpdateItem; const CUpdateItem &u2 = *a2.UpdateItem; int n; @@ -455,7 +457,7 @@ static void FromUpdateItemToFileItem(const CUpdateItem &updateItem, static HRESULT Update2( IInStream *inStream, const CArchiveDatabaseEx *database, - CObjectVector<CUpdateItem> &updateItems, + const CObjectVector<CUpdateItem> &updateItems, ISequentialOutStream *seqOutStream, IArchiveUpdateCallback *updateCallback, const CUpdateOptions &options) @@ -496,38 +498,32 @@ static HRESULT Update2( fileIndexToUpdateIndexMap[index] = i; } - CRecordVector<CFolderRef> folderRefs; + CRecordVector<int> folderRefs; if (database != 0) { - for(i = 0; i < database->Folders.Size(); i++) - { - CNum indexInFolder = 0; - CNum numCopyItems = 0; - CNum numUnPackStreams = database->NumUnPackStreamsVector[i]; - for (CNum fileIndex = database->FolderStartFileIndex[i]; - indexInFolder < numUnPackStreams; fileIndex++) + for(i = 0; i < database->Folders.Size(); i++) { - if (database->Files[fileIndex].HasStream) + CNum indexInFolder = 0; + CNum numCopyItems = 0; + CNum numUnPackStreams = database->NumUnPackStreamsVector[i]; + for (CNum fileIndex = database->FolderStartFileIndex[i]; + indexInFolder < numUnPackStreams; fileIndex++) { - indexInFolder++; - int updateIndex = fileIndexToUpdateIndexMap[fileIndex]; - if (updateIndex >= 0) - if (!updateItems[updateIndex].NewData) - numCopyItems++; + if (database->Files[fileIndex].HasStream) + { + indexInFolder++; + int updateIndex = fileIndexToUpdateIndexMap[fileIndex]; + if (updateIndex >= 0) + if (!updateItems[updateIndex].NewData) + numCopyItems++; + } } + if (numCopyItems != numUnPackStreams && numCopyItems != 0) + return E_NOTIMPL; // It needs repacking !!! + if (numCopyItems > 0) + folderRefs.Add(i); } - if (numCopyItems != numUnPackStreams && numCopyItems != 0) - return E_NOTIMPL; // It needs repacking !!! - if (numCopyItems > 0) - { - CFolderRef folderRef; - folderRef.Database = database; - folderRef.FolderIndex = i; - folderRefs.Add(folderRef); - } - } - qsort(&folderRefs.Front(), folderRefs.Size(), sizeof(folderRefs[0]), - CompareFolderRefs); + folderRefs.Sort(CompareFolderRefs, (void *)database); } CArchiveDatabase newDatabase; @@ -535,7 +531,7 @@ static HRESULT Update2( ///////////////////////////////////////// // Write Empty Files & Folders - CRecordVector<const CUpdateItem *> emptyRefs; + CRecordVector<int> emptyRefs; for(i = 0; i < updateItems.Size(); i++) { const CUpdateItem &updateItem = updateItems[i]; @@ -548,13 +544,12 @@ static HRESULT Update2( if (updateItem.IndexInArchive != -1) if (database->Files[updateItem.IndexInArchive].HasStream) continue; - emptyRefs.Add(&updateItem); + emptyRefs.Add(i); } - qsort(&emptyRefs.Front(), emptyRefs.Size(), sizeof(emptyRefs[0]), - CompareEmptyItems); + emptyRefs.Sort(CompareEmptyItems, (void *)&updateItems); for(i = 0; i < emptyRefs.Size(); i++) { - const CUpdateItem &updateItem = *emptyRefs[i]; + const CUpdateItem &updateItem = updateItems[emptyRefs[i]]; CFileItem file; if (updateItem.NewProperties) FromUpdateItemToFileItem(updateItem, file); @@ -566,11 +561,11 @@ static HRESULT Update2( //////////////////////////// COutArchive archive; - archive.Create(seqOutStream, false); + RINOK(archive.Create(seqOutStream, false)); RINOK(archive.SkeepPrefixArchiveHeader()); UInt64 complexity = 0; for(i = 0; i < folderRefs.Size(); i++) - complexity += database->GetFolderFullPackSize(folderRefs[i].FolderIndex); + complexity += database->GetFolderFullPackSize(folderRefs[i]); for(i = 0; i < updateItems.Size(); i++) { const CUpdateItem &updateItem = updateItems[i]; @@ -586,7 +581,7 @@ static HRESULT Update2( for(i = 0; i < folderRefs.Size(); i++) { - int folderIndex = folderRefs[i].FolderIndex; + int folderIndex = folderRefs[i]; RINOK(WriteRange(inStream, archive.SeqStream, database->GetFolderStreamPos(folderIndex, 0), @@ -652,7 +647,7 @@ static HRESULT Update2( for (i = 0; i < numFiles; i++) refItems.Add(CRefItem(group.Indices[i], updateItems[group.Indices[i]], numSolidFiles > 1)); - qsort(&refItems.Front(), refItems.Size(), sizeof(refItems[0]), CompareUpdateItems); + refItems.Sort(CompareUpdateItems, 0); CRecordVector<UInt32> indices; indices.Reserve(numFiles); @@ -862,7 +857,7 @@ HRESULT UpdateVolume( RINOK(volumeCallback->GetVolumeStream(volumeIndex, &volumeStream)); COutArchive archive; - archive.Create(volumeStream, true); + RINOK(archive.Create(volumeStream, true)); RINOK(archive.SkeepPrefixArchiveHeader()); CSequentialInStreamWithCRC *inCrcStreamSpec = new CSequentialInStreamWithCRC; @@ -914,7 +909,6 @@ public: HRESULT Flush(); STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(WritePart)(const void *data, UInt32 size, UInt32 *processedSize); }; HRESULT COutVolumeStream::Flush() @@ -943,7 +937,7 @@ STDMETHODIMP COutVolumeStream::Write(const void *data, UInt32 size, UInt32 *proc RINOK(VolumeCallback->GetVolumeStream(_volIndex, &_volumeStream)); _volIndex++; _curPos = 0; - _archive.Create(_volumeStream, true); + RINOK(_archive.Create(_volumeStream, true)); RINOK(_archive.SkeepPrefixArchiveHeader()); _crc.Init(); continue; @@ -959,7 +953,7 @@ STDMETHODIMP COutVolumeStream::Write(const void *data, UInt32 size, UInt32 *proc if(processedSize != NULL) *processedSize += realProcessed; _curPos += realProcessed; - if (realProcessed != curSize) + if (realProcessed != curSize && realProcessed == 0) return E_FAIL; if (_curPos == pureSize) { @@ -969,16 +963,12 @@ STDMETHODIMP COutVolumeStream::Write(const void *data, UInt32 size, UInt32 *proc return S_OK; } -STDMETHODIMP COutVolumeStream::WritePart(const void *data, UInt32 size, UInt32 *processedSize) -{ - return Write(data, size, processedSize); -} #endif HRESULT Update( IInStream *inStream, const CArchiveDatabaseEx *database, - CObjectVector<CUpdateItem> &updateItems, + const CObjectVector<CUpdateItem> &updateItems, ISequentialOutStream *seqOutStream, IArchiveUpdateCallback *updateCallback, const CUpdateOptions &options) |