Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '7zip/Archive/7z/7zUpdate.cpp')
-rwxr-xr-x7zip/Archive/7z/7zUpdate.cpp116
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)