Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zOut.cpp

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zOut.cpp
diff --git a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zOut.cpp b/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zOut.cpp
deleted file mode 100644
index 7ac3c18ce196d6fdf5b3fdb0a7d667cf2901166f..0000000000000000000000000000000000000000
--- a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zOut.cpp
+++ /dev/null
@@ -1,876 +0,0 @@
-// 7zOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/AutoPtr.h"
-#include "../../Common/StreamObjects.h"
-
-#include "7zOut.h"
-
-extern "C"
-{
-#include "../../../../C/7zCrc.h"
-}
-
-static HRESULT WriteBytes(ISequentialOutStream *stream, const void *data, size_t size)
-{
- while (size > 0)
- {
- UInt32 curSize = (UInt32)MyMin(size, (size_t)0xFFFFFFFF);
- UInt32 processedSize;
- RINOK(stream->Write(data, curSize, &processedSize));
- if (processedSize == 0)
- return E_FAIL;
- data = (const void *)((const Byte *)data + processedSize);
- size -= processedSize;
- }
- return S_OK;
-}
-
-namespace NArchive {
-namespace N7z {
-
-HRESULT COutArchive::WriteDirect(const void *data, UInt32 size)
-{
- return ::WriteBytes(SeqStream, data, size);
-}
-
-HRESULT COutArchive::WriteSignature()
-{
- Byte buf[8];
- memcpy(buf, kSignature, kSignatureSize);
- buf[kSignatureSize] = kMajorVersion;
- buf[kSignatureSize + 1] = 3;
- return WriteDirect(buf, 8);
-}
-
-#ifdef _7Z_VOL
-HRESULT COutArchive::WriteFinishSignature()
-{
- RINOK(WriteDirect(kFinishSignature, kSignatureSize));
- CArchiveVersion av;
- av.Major = kMajorVersion;
- av.Minor = 2;
- RINOK(WriteDirectByte(av.Major));
- return WriteDirectByte(av.Minor);
-}
-#endif
-
-static void SetUInt32(Byte *p, UInt32 d)
-{
- for (int i = 0; i < 4; i++, d >>= 8)
- p[i] = (Byte)d;
-}
-
-static void SetUInt64(Byte *p, UInt64 d)
-{
- for (int i = 0; i < 8; i++, d >>= 8)
- p[i] = (Byte)d;
-}
-
-HRESULT COutArchive::WriteStartHeader(const CStartHeader &h)
-{
- Byte buf[24];
- SetUInt64(buf + 4, h.NextHeaderOffset);
- SetUInt64(buf + 12, h.NextHeaderSize);
- SetUInt32(buf + 20, h.NextHeaderCRC);
- SetUInt32(buf, CrcCalc(buf + 4, 20));
- return WriteDirect(buf, 24);
-}
-
-#ifdef _7Z_VOL
-HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h)
-{
- CCRC crc;
- crc.UpdateUInt64(h.NextHeaderOffset);
- crc.UpdateUInt64(h.NextHeaderSize);
- crc.UpdateUInt32(h.NextHeaderCRC);
- crc.UpdateUInt64(h.ArchiveStartOffset);
- crc.UpdateUInt64(h.AdditionalStartBlockSize);
- RINOK(WriteDirectUInt32(crc.GetDigest()));
- RINOK(WriteDirectUInt64(h.NextHeaderOffset));
- RINOK(WriteDirectUInt64(h.NextHeaderSize));
- RINOK(WriteDirectUInt32(h.NextHeaderCRC));
- RINOK(WriteDirectUInt64(h.ArchiveStartOffset));
- return WriteDirectUInt64(h.AdditionalStartBlockSize);
-}
-#endif
-
-HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker)
-{
- Close();
- #ifdef _7Z_VOL
- // endMarker = false;
- _endMarker = endMarker;
- #endif
- SeqStream = stream;
- if (!endMarker)
- {
- SeqStream.QueryInterface(IID_IOutStream, &Stream);
- if (!Stream)
- {
- return E_NOTIMPL;
- // endMarker = true;
- }
- }
- #ifdef _7Z_VOL
- if (endMarker)
- {
- /*
- CStartHeader sh;
- sh.NextHeaderOffset = (UInt32)(Int32)-1;
- sh.NextHeaderSize = (UInt32)(Int32)-1;
- sh.NextHeaderCRC = 0;
- WriteStartHeader(sh);
- */
- }
- else
- #endif
- {
- if (!Stream)
- return E_FAIL;
- RINOK(WriteSignature());
- RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos));
- }
- return S_OK;
-}
-
-void COutArchive::Close()
-{
- SeqStream.Release();
- Stream.Release();
-}
-
-HRESULT COutArchive::SkeepPrefixArchiveHeader()
-{
- #ifdef _7Z_VOL
- if (_endMarker)
- return S_OK;
- #endif
- return Stream->Seek(24, STREAM_SEEK_CUR, NULL);
-}
-
-UInt64 COutArchive::GetPos() const
-{
- if (_countMode)
- return _countSize;
- if (_writeToStream)
- return _outByte.GetProcessedSize();
- return _outByte2.GetPos();
-}
-
-void COutArchive::WriteBytes(const void *data, size_t size)
-{
- if (_countMode)
- _countSize += size;
- else if (_writeToStream)
- {
- _outByte.WriteBytes(data, size);
- _crc = CrcUpdate(_crc, data, size);
- }
- else
- _outByte2.WriteBytes(data, size);
-}
-
-void COutArchive::WriteByte(Byte b)
-{
- if (_countMode)
- _countSize++;
- else if (_writeToStream)
- {
- _outByte.WriteByte(b);
- _crc = CRC_UPDATE_BYTE(_crc, b);
- }
- else
- _outByte2.WriteByte(b);
-}
-
-void COutArchive::WriteUInt32(UInt32 value)
-{
- for (int i = 0; i < 4; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteUInt64(UInt64 value)
-{
- for (int i = 0; i < 8; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteNumber(UInt64 value)
-{
- Byte firstByte = 0;
- Byte mask = 0x80;
- int i;
- for (i = 0; i < 8; i++)
- {
- if (value < ((UInt64(1) << ( 7 * (i + 1)))))
- {
- firstByte |= Byte(value >> (8 * i));
- break;
- }
- firstByte |= mask;
- mask >>= 1;
- }
- WriteByte(firstByte);
- for (;i > 0; i--)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-static UInt32 GetBigNumberSize(UInt64 value)
-{
- int i;
- for (i = 1; i < 9; i++)
- if (value < (((UInt64)1 << (i * 7))))
- break;
- return i;
-}
-
-#ifdef _7Z_VOL
-UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props)
-{
- UInt32 result = GetBigNumberSize(dataSize) * 2 + 41;
- if (nameLength != 0)
- {
- nameLength = (nameLength + 1) * 2;
- result += nameLength + GetBigNumberSize(nameLength) + 2;
- }
- if (props)
- {
- result += 20;
- }
- if (result >= 128)
- result++;
- result += kSignatureSize + 2 + kFinishHeaderSize;
- return result;
-}
-
-UInt64 COutArchive::GetVolPureSize(UInt64 volSize, int nameLength, bool props)
-{
- UInt32 headersSizeBase = COutArchive::GetVolHeadersSize(1, nameLength, props);
- int testSize;
- if (volSize > headersSizeBase)
- testSize = volSize - headersSizeBase;
- else
- testSize = 1;
- UInt32 headersSize = COutArchive::GetVolHeadersSize(testSize, nameLength, props);
- UInt64 pureSize = 1;
- if (volSize > headersSize)
- pureSize = volSize - headersSize;
- return pureSize;
-}
-#endif
-
-void COutArchive::WriteFolder(const CFolder &folder)
-{
- WriteNumber(folder.Coders.Size());
- int i;
- for (i = 0; i < folder.Coders.Size(); i++)
- {
- const CCoderInfo &coder = folder.Coders[i];
- {
- size_t propsSize = coder.Props.GetCapacity();
-
- UInt64 id = coder.MethodID;
- int idSize;
- for (idSize = 1; idSize < sizeof(id); idSize++)
- if ((id >> (8 * idSize)) == 0)
- break;
- BYTE longID[15];
- for (int t = idSize - 1; t >= 0 ; t--, id >>= 8)
- longID[t] = (Byte)(id & 0xFF);
- Byte b;
- b = (Byte)(idSize & 0xF);
- bool isComplex = !coder.IsSimpleCoder();
- b |= (isComplex ? 0x10 : 0);
- b |= ((propsSize != 0) ? 0x20 : 0 );
- WriteByte(b);
- WriteBytes(longID, idSize);
- if (isComplex)
- {
- WriteNumber(coder.NumInStreams);
- WriteNumber(coder.NumOutStreams);
- }
- if (propsSize == 0)
- continue;
- WriteNumber(propsSize);
- WriteBytes(coder.Props, propsSize);
- }
- }
- for (i = 0; i < folder.BindPairs.Size(); i++)
- {
- const CBindPair &bindPair = folder.BindPairs[i];
- WriteNumber(bindPair.InIndex);
- WriteNumber(bindPair.OutIndex);
- }
- if (folder.PackStreams.Size() > 1)
- for (i = 0; i < folder.PackStreams.Size(); i++)
- {
- WriteNumber(folder.PackStreams[i]);
- }
-}
-
-void COutArchive::WriteBoolVector(const CBoolVector &boolVector)
-{
- Byte b = 0;
- Byte mask = 0x80;
- for (int i = 0; i < boolVector.Size(); i++)
- {
- if (boolVector[i])
- b |= mask;
- mask >>= 1;
- if (mask == 0)
- {
- WriteByte(b);
- mask = 0x80;
- b = 0;
- }
- }
- if (mask != 0x80)
- WriteByte(b);
-}
-
-
-void COutArchive::WriteHashDigests(
- const CRecordVector<bool> &digestsDefined,
- const CRecordVector<UInt32> &digests)
-{
- int numDefined = 0;
- int i;
- for (i = 0; i < digestsDefined.Size(); i++)
- if (digestsDefined[i])
- numDefined++;
- if (numDefined == 0)
- return;
-
- WriteByte(NID::kCRC);
- if (numDefined == digestsDefined.Size())
- WriteByte(1);
- else
- {
- WriteByte(0);
- WriteBoolVector(digestsDefined);
- }
- for (i = 0; i < digests.Size(); i++)
- if (digestsDefined[i])
- WriteUInt32(digests[i]);
-}
-
-void COutArchive::WritePackInfo(
- UInt64 dataOffset,
- const CRecordVector<UInt64> &packSizes,
- const CRecordVector<bool> &packCRCsDefined,
- const CRecordVector<UInt32> &packCRCs)
-{
- if (packSizes.IsEmpty())
- return;
- WriteByte(NID::kPackInfo);
- WriteNumber(dataOffset);
- WriteNumber(packSizes.Size());
- WriteByte(NID::kSize);
- for (int i = 0; i < packSizes.Size(); i++)
- WriteNumber(packSizes[i]);
-
- WriteHashDigests(packCRCsDefined, packCRCs);
-
- WriteByte(NID::kEnd);
-}
-
-void COutArchive::WriteUnpackInfo(const CObjectVector<CFolder> &folders)
-{
- if (folders.IsEmpty())
- return;
-
- WriteByte(NID::kUnpackInfo);
-
- WriteByte(NID::kFolder);
- WriteNumber(folders.Size());
- {
- WriteByte(0);
- for (int i = 0; i < folders.Size(); i++)
- WriteFolder(folders[i]);
- }
-
- WriteByte(NID::kCodersUnpackSize);
- int i;
- for (i = 0; i < folders.Size(); i++)
- {
- const CFolder &folder = folders[i];
- for (int j = 0; j < folder.UnpackSizes.Size(); j++)
- WriteNumber(folder.UnpackSizes[j]);
- }
-
- CRecordVector<bool> unpackCRCsDefined;
- CRecordVector<UInt32> unpackCRCs;
- for (i = 0; i < folders.Size(); i++)
- {
- const CFolder &folder = folders[i];
- unpackCRCsDefined.Add(folder.UnpackCRCDefined);
- unpackCRCs.Add(folder.UnpackCRC);
- }
- WriteHashDigests(unpackCRCsDefined, unpackCRCs);
-
- WriteByte(NID::kEnd);
-}
-
-void COutArchive::WriteSubStreamsInfo(
- const CObjectVector<CFolder> &folders,
- const CRecordVector<CNum> &numUnpackStreamsInFolders,
- const CRecordVector<UInt64> &unpackSizes,
- const CRecordVector<bool> &digestsDefined,
- const CRecordVector<UInt32> &digests)
-{
- WriteByte(NID::kSubStreamsInfo);
-
- int i;
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- {
- if (numUnpackStreamsInFolders[i] != 1)
- {
- WriteByte(NID::kNumUnpackStream);
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- WriteNumber(numUnpackStreamsInFolders[i]);
- break;
- }
- }
-
-
- bool needFlag = true;
- CNum index = 0;
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- for (CNum j = 0; j < numUnpackStreamsInFolders[i]; j++)
- {
- if (j + 1 != numUnpackStreamsInFolders[i])
- {
- if (needFlag)
- WriteByte(NID::kSize);
- needFlag = false;
- WriteNumber(unpackSizes[index]);
- }
- index++;
- }
-
- CRecordVector<bool> digestsDefined2;
- CRecordVector<UInt32> digests2;
-
- int digestIndex = 0;
- for (i = 0; i < folders.Size(); i++)
- {
- int numSubStreams = (int)numUnpackStreamsInFolders[i];
- if (numSubStreams == 1 && folders[i].UnpackCRCDefined)
- digestIndex++;
- else
- for (int j = 0; j < numSubStreams; j++, digestIndex++)
- {
- digestsDefined2.Add(digestsDefined[digestIndex]);
- digests2.Add(digests[digestIndex]);
- }
- }
- WriteHashDigests(digestsDefined2, digests2);
- WriteByte(NID::kEnd);
-}
-
-void COutArchive::SkipAlign(unsigned /* pos */, unsigned /* alignSize */)
-{
- return;
-}
-
-/*
-7-Zip 4.50 - 4.58 contain BUG, so they do not support .7z archives with Unknown field.
-
-void COutArchive::SkipAlign(unsigned pos, unsigned alignSize)
-{
- pos += (unsigned)GetPos();
- pos &= (alignSize - 1);
- if (pos == 0)
- return;
- unsigned skip = alignSize - pos;
- if (skip < 2)
- skip += alignSize;
- skip -= 2;
- WriteByte(NID::kDummy);
- WriteByte((Byte)skip);
- for (unsigned i = 0; i < skip; i++)
- WriteByte(0);
-}
-*/
-
-void COutArchive::WriteAlignedBoolHeader(const CBoolVector &v, int numDefined, Byte type, unsigned itemSize)
-{
- const UInt64 bvSize = (numDefined == v.Size()) ? 0 : (v.Size() + 7) / 8;
- const UInt64 dataSize = (UInt64)numDefined * itemSize + bvSize + 2;
- SkipAlign(3 + (unsigned)bvSize + (unsigned)GetBigNumberSize(dataSize), itemSize);
-
- WriteByte(type);
- WriteNumber(dataSize);
- if (numDefined == v.Size())
- WriteByte(1);
- else
- {
- WriteByte(0);
- WriteBoolVector(v);
- }
- WriteByte(0);
-}
-
-void COutArchive::WriteUInt64DefVector(const CUInt64DefVector &v, Byte type)
-{
- int numDefined = 0;
-
- int i;
- for (i = 0; i < v.Defined.Size(); i++)
- if (v.Defined[i])
- numDefined++;
-
- if (numDefined == 0)
- return;
-
- WriteAlignedBoolHeader(v.Defined, numDefined, type, 8);
-
- for (i = 0; i < v.Defined.Size(); i++)
- if (v.Defined[i])
- WriteUInt64(v.Values[i]);
-}
-
-HRESULT COutArchive::EncodeStream(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CEncoder &encoder, const Byte *data, size_t dataSize,
- CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders)
-{
- CSequentialInStreamImp *streamSpec = new CSequentialInStreamImp;
- CMyComPtr<ISequentialInStream> stream = streamSpec;
- streamSpec->Init(data, dataSize);
- CFolder folderItem;
- folderItem.UnpackCRCDefined = true;
- folderItem.UnpackCRC = CrcCalc(data, dataSize);
- UInt64 dataSize64 = dataSize;
- RINOK(encoder.Encode(
- EXTERNAL_CODECS_LOC_VARS
- stream, NULL, &dataSize64, folderItem, SeqStream, packSizes, NULL))
- folders.Add(folderItem);
- return S_OK;
-}
-
-HRESULT COutArchive::EncodeStream(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CEncoder &encoder, const CByteBuffer &data,
- CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders)
-{
- return EncodeStream(
- EXTERNAL_CODECS_LOC_VARS
- encoder, data, data.GetCapacity(), packSizes, folders);
-}
-
-void COutArchive::WriteHeader(
- const CArchiveDatabase &db,
- const CHeaderOptions &headerOptions,
- UInt64 &headerOffset)
-{
- int i;
-
- UInt64 packedSize = 0;
- for (i = 0; i < db.PackSizes.Size(); i++)
- packedSize += db.PackSizes[i];
-
- headerOffset = packedSize;
-
- WriteByte(NID::kHeader);
-
- // Archive Properties
-
- if (db.Folders.Size() > 0)
- {
- WriteByte(NID::kMainStreamsInfo);
- WritePackInfo(0, db.PackSizes,
- db.PackCRCsDefined,
- db.PackCRCs);
-
- WriteUnpackInfo(db.Folders);
-
- CRecordVector<UInt64> unpackSizes;
- CRecordVector<bool> digestsDefined;
- CRecordVector<UInt32> digests;
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- if (!file.HasStream)
- continue;
- unpackSizes.Add(file.Size);
- digestsDefined.Add(file.CrcDefined);
- digests.Add(file.Crc);
- }
-
- WriteSubStreamsInfo(
- db.Folders,
- db.NumUnpackStreamsVector,
- unpackSizes,
- digestsDefined,
- digests);
- WriteByte(NID::kEnd);
- }
-
- if (db.Files.IsEmpty())
- {
- WriteByte(NID::kEnd);
- return;
- }
-
- WriteByte(NID::kFilesInfo);
- WriteNumber(db.Files.Size());
-
- {
- /* ---------- Empty Streams ---------- */
- CBoolVector emptyStreamVector;
- emptyStreamVector.Reserve(db.Files.Size());
- int numEmptyStreams = 0;
- for (i = 0; i < db.Files.Size(); i++)
- if (db.Files[i].HasStream)
- emptyStreamVector.Add(false);
- else
- {
- emptyStreamVector.Add(true);
- numEmptyStreams++;
- }
- if (numEmptyStreams > 0)
- {
- WriteByte(NID::kEmptyStream);
- WriteNumber((emptyStreamVector.Size() + 7) / 8);
- WriteBoolVector(emptyStreamVector);
-
- CBoolVector emptyFileVector, antiVector;
- emptyFileVector.Reserve(numEmptyStreams);
- antiVector.Reserve(numEmptyStreams);
- CNum numEmptyFiles = 0, numAntiItems = 0;
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- if (!file.HasStream)
- {
- emptyFileVector.Add(!file.IsDir);
- if (!file.IsDir)
- numEmptyFiles++;
- bool isAnti = db.IsItemAnti(i);
- antiVector.Add(isAnti);
- if (isAnti)
- numAntiItems++;
- }
- }
-
- if (numEmptyFiles > 0)
- {
- WriteByte(NID::kEmptyFile);
- WriteNumber((emptyFileVector.Size() + 7) / 8);
- WriteBoolVector(emptyFileVector);
- }
-
- if (numAntiItems > 0)
- {
- WriteByte(NID::kAnti);
- WriteNumber((antiVector.Size() + 7) / 8);
- WriteBoolVector(antiVector);
- }
- }
- }
-
-
- {
- /* ---------- Names ---------- */
-
- int numDefined = 0;
- size_t namesDataSize = 0;
- for (int i = 0; i < db.Files.Size(); i++)
- {
- const UString &name = db.Files[i].Name;
- if (!name.IsEmpty())
- numDefined++;
- namesDataSize += (name.Length() + 1) * 2;
- }
-
- if (numDefined > 0)
- {
- namesDataSize++;
- SkipAlign(2 + GetBigNumberSize(namesDataSize), 2);
-
- WriteByte(NID::kName);
- WriteNumber(namesDataSize);
- WriteByte(0);
- for (int i = 0; i < db.Files.Size(); i++)
- {
- const UString &name = db.Files[i].Name;
- for (int t = 0; t <= name.Length(); t++)
- {
- wchar_t c = name[t];
- WriteByte((Byte)c);
- WriteByte((Byte)(c >> 8));
- }
- }
- }
- }
-
- if (headerOptions.WriteCTime) WriteUInt64DefVector(db.CTime, NID::kCTime);
- if (headerOptions.WriteATime) WriteUInt64DefVector(db.ATime, NID::kATime);
- if (headerOptions.WriteMTime) WriteUInt64DefVector(db.MTime, NID::kMTime);
- WriteUInt64DefVector(db.StartPos, NID::kStartPos);
-
- {
- /* ---------- Write Attrib ---------- */
- CBoolVector boolVector;
- boolVector.Reserve(db.Files.Size());
- int numDefined = 0;
- for (i = 0; i < db.Files.Size(); i++)
- {
- bool defined = db.Files[i].AttribDefined;
- boolVector.Add(defined);
- if (defined)
- numDefined++;
- }
- if (numDefined > 0)
- {
- WriteAlignedBoolHeader(boolVector, numDefined, NID::kWinAttributes, 4);
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- if (file.AttribDefined)
- WriteUInt32(file.Attrib);
- }
- }
- }
-
- WriteByte(NID::kEnd); // for files
- WriteByte(NID::kEnd); // for headers
-}
-
-HRESULT COutArchive::WriteDatabase(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CArchiveDatabase &db,
- const CCompressionMethodMode *options,
- const CHeaderOptions &headerOptions)
-{
- if (!db.CheckNumFiles())
- return E_FAIL;
-
- UInt64 headerOffset;
- UInt32 headerCRC;
- UInt64 headerSize;
- if (db.IsEmpty())
- {
- headerSize = 0;
- headerOffset = 0;
- headerCRC = CrcCalc(0, 0);
- }
- else
- {
- bool encodeHeaders = false;
- if (options != 0)
- if (options->IsEmpty())
- options = 0;
- if (options != 0)
- if (options->PasswordIsDefined || headerOptions.CompressMainHeader)
- encodeHeaders = true;
-
- _outByte.SetStream(SeqStream);
- _outByte.Init();
- _crc = CRC_INIT_VAL;
- _countMode = encodeHeaders;
- _writeToStream = true;
- _countSize = 0;
- WriteHeader(db, headerOptions, headerOffset);
-
- if (encodeHeaders)
- {
- CByteBuffer buf;
- buf.SetCapacity(_countSize);
- _outByte2.Init((Byte *)buf, _countSize);
-
- _countMode = false;
- _writeToStream = false;
- WriteHeader(db, headerOptions, headerOffset);
-
- if (_countSize != _outByte2.GetPos())
- return E_FAIL;
-
- CCompressionMethodMode encryptOptions;
- encryptOptions.PasswordIsDefined = options->PasswordIsDefined;
- encryptOptions.Password = options->Password;
- CEncoder encoder(headerOptions.CompressMainHeader ? *options : encryptOptions);
- CRecordVector<UInt64> packSizes;
- CObjectVector<CFolder> folders;
- RINOK(EncodeStream(
- EXTERNAL_CODECS_LOC_VARS
- encoder, (const Byte *)buf,
- _countSize, packSizes, folders));
-
- _writeToStream = true;
-
- if (folders.Size() == 0)
- throw 1;
-
- WriteID(NID::kEncodedHeader);
- WritePackInfo(headerOffset, packSizes,
- CRecordVector<bool>(), CRecordVector<UInt32>());
- WriteUnpackInfo(folders);
- WriteByte(NID::kEnd);
- for (int i = 0; i < packSizes.Size(); i++)
- headerOffset += packSizes[i];
- }
- RINOK(_outByte.Flush());
- headerCRC = CRC_GET_DIGEST(_crc);
- headerSize = _outByte.GetProcessedSize();
- }
- #ifdef _7Z_VOL
- if (_endMarker)
- {
- CFinishHeader h;
- h.NextHeaderSize = headerSize;
- h.NextHeaderCRC = headerCRC;
- h.NextHeaderOffset =
- UInt64(0) - (headerSize +
- 4 + kFinishHeaderSize);
- h.ArchiveStartOffset = h.NextHeaderOffset - headerOffset;
- h.AdditionalStartBlockSize = 0;
- RINOK(WriteFinishHeader(h));
- return WriteFinishSignature();
- }
- else
- #endif
- {
- CStartHeader h;
- h.NextHeaderSize = headerSize;
- h.NextHeaderCRC = headerCRC;
- h.NextHeaderOffset = headerOffset;
- RINOK(Stream->Seek(_prefixHeaderPos, STREAM_SEEK_SET, NULL));
- return WriteStartHeader(h);
- }
-}
-
-void CArchiveDatabase::GetFile(int index, CFileItem &file, CFileItem2 &file2) const
-{
- file = Files[index];
- file2.CTimeDefined = CTime.GetItem(index, file2.CTime);
- file2.ATimeDefined = ATime.GetItem(index, file2.ATime);
- file2.MTimeDefined = MTime.GetItem(index, file2.MTime);
- file2.StartPosDefined = StartPos.GetItem(index, file2.StartPos);
- file2.IsAnti = IsItemAnti(index);
-}
-
-void CArchiveDatabase::AddFile(const CFileItem &file, const CFileItem2 &file2)
-{
- int index = Files.Size();
- CTime.SetItem(index, file2.CTimeDefined, file2.CTime);
- ATime.SetItem(index, file2.ATimeDefined, file2.ATime);
- MTime.SetItem(index, file2.MTimeDefined, file2.MTime);
- StartPos.SetItem(index, file2.StartPosDefined, file2.StartPos);
- SetItemAnti(index, file2.IsAnti);
- Files.Add(file);
-}
-
-}}

Powered by Google App Engine
This is Rietveld 408576698