diff options
Diffstat (limited to 'CPP/7zip/Archive/7z/7zOut.cpp')
-rw-r--r-- | CPP/7zip/Archive/7z/7zOut.cpp | 90 |
1 files changed, 42 insertions, 48 deletions
diff --git a/CPP/7zip/Archive/7z/7zOut.cpp b/CPP/7zip/Archive/7z/7zOut.cpp index 2786bf2..7f8fa5b 100644 --- a/CPP/7zip/Archive/7z/7zOut.cpp +++ b/CPP/7zip/Archive/7z/7zOut.cpp | |||
@@ -14,16 +14,14 @@ | |||
14 | namespace NArchive { | 14 | namespace NArchive { |
15 | namespace N7z { | 15 | namespace N7z { |
16 | 16 | ||
17 | HRESULT COutArchive::WriteSignature() | 17 | static void FillSignature(Byte *buf) |
18 | { | 18 | { |
19 | Byte buf[8]; | ||
20 | memcpy(buf, kSignature, kSignatureSize); | 19 | memcpy(buf, kSignature, kSignatureSize); |
21 | buf[kSignatureSize] = kMajorVersion; | 20 | buf[kSignatureSize] = kMajorVersion; |
22 | buf[kSignatureSize + 1] = 4; | 21 | buf[kSignatureSize + 1] = 4; |
23 | return WriteDirect(buf, 8); | ||
24 | } | 22 | } |
25 | 23 | ||
26 | #ifdef _7Z_VOL | 24 | #ifdef Z7_7Z_VOL |
27 | HRESULT COutArchive::WriteFinishSignature() | 25 | HRESULT COutArchive::WriteFinishSignature() |
28 | { | 26 | { |
29 | RINOK(WriteDirect(kFinishSignature, kSignatureSize)); | 27 | RINOK(WriteDirect(kFinishSignature, kSignatureSize)); |
@@ -49,15 +47,16 @@ static void SetUInt64(Byte *p, UInt64 d) | |||
49 | 47 | ||
50 | HRESULT COutArchive::WriteStartHeader(const CStartHeader &h) | 48 | HRESULT COutArchive::WriteStartHeader(const CStartHeader &h) |
51 | { | 49 | { |
52 | Byte buf[24]; | 50 | Byte buf[32]; |
53 | SetUInt64(buf + 4, h.NextHeaderOffset); | 51 | FillSignature(buf); |
54 | SetUInt64(buf + 12, h.NextHeaderSize); | 52 | SetUInt64(buf + 8 + 4, h.NextHeaderOffset); |
55 | SetUInt32(buf + 20, h.NextHeaderCRC); | 53 | SetUInt64(buf + 8 + 12, h.NextHeaderSize); |
56 | SetUInt32(buf, CrcCalc(buf + 4, 20)); | 54 | SetUInt32(buf + 8 + 20, h.NextHeaderCRC); |
57 | return WriteDirect(buf, 24); | 55 | SetUInt32(buf + 8, CrcCalc(buf + 8 + 4, 20)); |
56 | return WriteDirect(buf, sizeof(buf)); | ||
58 | } | 57 | } |
59 | 58 | ||
60 | #ifdef _7Z_VOL | 59 | #ifdef Z7_7Z_VOL |
61 | HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h) | 60 | HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h) |
62 | { | 61 | { |
63 | CCRC crc; | 62 | CCRC crc; |
@@ -75,15 +74,15 @@ HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h) | |||
75 | } | 74 | } |
76 | #endif | 75 | #endif |
77 | 76 | ||
78 | HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) | 77 | HRESULT COutArchive::Create_and_WriteStartPrefix(ISequentialOutStream *stream /* , bool endMarker */) |
79 | { | 78 | { |
80 | Close(); | 79 | Close(); |
81 | #ifdef _7Z_VOL | 80 | #ifdef Z7_7Z_VOL |
82 | // endMarker = false; | 81 | // endMarker = false; |
83 | _endMarker = endMarker; | 82 | _endMarker = endMarker; |
84 | #endif | 83 | #endif |
85 | SeqStream = stream; | 84 | SeqStream = stream; |
86 | if (!endMarker) | 85 | // if (!endMarker) |
87 | { | 86 | { |
88 | SeqStream.QueryInterface(IID_IOutStream, &Stream); | 87 | SeqStream.QueryInterface(IID_IOutStream, &Stream); |
89 | if (!Stream) | 88 | if (!Stream) |
@@ -91,8 +90,13 @@ HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) | |||
91 | return E_NOTIMPL; | 90 | return E_NOTIMPL; |
92 | // endMarker = true; | 91 | // endMarker = true; |
93 | } | 92 | } |
93 | RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_signatureHeaderPos)) | ||
94 | Byte buf[32]; | ||
95 | FillSignature(buf); | ||
96 | memset(&buf[8], 0, 32 - 8); | ||
97 | return WriteDirect(buf, sizeof(buf)); | ||
94 | } | 98 | } |
95 | #ifdef _7Z_VOL | 99 | #ifdef Z7_7Z_VOL |
96 | if (endMarker) | 100 | if (endMarker) |
97 | { | 101 | { |
98 | /* | 102 | /* |
@@ -101,17 +105,10 @@ HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) | |||
101 | sh.NextHeaderSize = (UInt32)(Int32)-1; | 105 | sh.NextHeaderSize = (UInt32)(Int32)-1; |
102 | sh.NextHeaderCRC = 0; | 106 | sh.NextHeaderCRC = 0; |
103 | WriteStartHeader(sh); | 107 | WriteStartHeader(sh); |
108 | return S_OK; | ||
104 | */ | 109 | */ |
105 | } | 110 | } |
106 | else | ||
107 | #endif | 111 | #endif |
108 | { | ||
109 | if (!Stream) | ||
110 | return E_FAIL; | ||
111 | RINOK(WriteSignature()); | ||
112 | RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos)); | ||
113 | } | ||
114 | return S_OK; | ||
115 | } | 112 | } |
116 | 113 | ||
117 | void COutArchive::Close() | 114 | void COutArchive::Close() |
@@ -120,17 +117,6 @@ void COutArchive::Close() | |||
120 | Stream.Release(); | 117 | Stream.Release(); |
121 | } | 118 | } |
122 | 119 | ||
123 | HRESULT COutArchive::SkipPrefixArchiveHeader() | ||
124 | { | ||
125 | #ifdef _7Z_VOL | ||
126 | if (_endMarker) | ||
127 | return S_OK; | ||
128 | #endif | ||
129 | Byte buf[24]; | ||
130 | memset(buf, 0, 24); | ||
131 | return WriteDirect(buf, 24); | ||
132 | } | ||
133 | |||
134 | UInt64 COutArchive::GetPos() const | 120 | UInt64 COutArchive::GetPos() const |
135 | { | 121 | { |
136 | if (_countMode) | 122 | if (_countMode) |
@@ -216,7 +202,7 @@ static unsigned GetBigNumberSize(UInt64 value) | |||
216 | return i; | 202 | return i; |
217 | } | 203 | } |
218 | 204 | ||
219 | #ifdef _7Z_VOL | 205 | #ifdef Z7_7Z_VOL |
220 | UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props) | 206 | UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props) |
221 | { | 207 | { |
222 | UInt32 result = GetBigNumberSize(dataSize) * 2 + 41; | 208 | UInt32 result = GetBigNumberSize(dataSize) * 2 + 41; |
@@ -515,14 +501,20 @@ HRESULT COutArchive::EncodeStream( | |||
515 | outFolders.FolderUnpackCRCs.Defs.Add(true); | 501 | outFolders.FolderUnpackCRCs.Defs.Add(true); |
516 | outFolders.FolderUnpackCRCs.Vals.Add(CrcCalc(data, data.Size())); | 502 | outFolders.FolderUnpackCRCs.Vals.Add(CrcCalc(data, data.Size())); |
517 | // outFolders.NumUnpackStreamsVector.Add(1); | 503 | // outFolders.NumUnpackStreamsVector.Add(1); |
518 | UInt64 dataSize64 = data.Size(); | 504 | const UInt64 dataSize64 = data.Size(); |
519 | UInt64 unpackSize = data.Size(); | 505 | const UInt64 expectSize = data.Size(); |
520 | RINOK(encoder.Encode( | 506 | RINOK(encoder.Encode1( |
521 | EXTERNAL_CODECS_LOC_VARS | 507 | EXTERNAL_CODECS_LOC_VARS |
522 | stream, | 508 | stream, |
523 | // NULL, | 509 | // NULL, |
524 | &dataSize64, | 510 | &dataSize64, // inSizeForReduce |
525 | folders.AddNew(), outFolders.CoderUnpackSizes, unpackSize, SeqStream, packSizes, NULL)) | 511 | expectSize, |
512 | folders.AddNew(), | ||
513 | // outFolders.CoderUnpackSizes, unpackSize, | ||
514 | SeqStream, packSizes, NULL)) | ||
515 | if (!streamSpec->WasFinished()) | ||
516 | return E_FAIL; | ||
517 | encoder.Encode_Post(dataSize64, outFolders.CoderUnpackSizes); | ||
526 | return S_OK; | 518 | return S_OK; |
527 | } | 519 | } |
528 | 520 | ||
@@ -833,15 +825,15 @@ HRESULT COutArchive::WriteDatabase( | |||
833 | { | 825 | { |
834 | headerSize = 0; | 826 | headerSize = 0; |
835 | headerOffset = 0; | 827 | headerOffset = 0; |
836 | headerCRC = CrcCalc(0, 0); | 828 | headerCRC = CrcCalc(NULL, 0); |
837 | } | 829 | } |
838 | else | 830 | else |
839 | { | 831 | { |
840 | bool encodeHeaders = false; | 832 | bool encodeHeaders = false; |
841 | if (options != 0) | 833 | if (options) |
842 | if (options->IsEmpty()) | 834 | if (options->IsEmpty()) |
843 | options = 0; | 835 | options = NULL; |
844 | if (options != 0) | 836 | if (options) |
845 | if (options->PasswordIsDefined || headerOptions.CompressMainHeader) | 837 | if (options->PasswordIsDefined || headerOptions.CompressMainHeader) |
846 | encodeHeaders = true; | 838 | encodeHeaders = true; |
847 | 839 | ||
@@ -876,7 +868,7 @@ HRESULT COutArchive::WriteDatabase( | |||
876 | RINOK(EncodeStream( | 868 | RINOK(EncodeStream( |
877 | EXTERNAL_CODECS_LOC_VARS | 869 | EXTERNAL_CODECS_LOC_VARS |
878 | encoder, buf, | 870 | encoder, buf, |
879 | packSizes, folders, outFolders)); | 871 | packSizes, folders, outFolders)) |
880 | 872 | ||
881 | _writeToStream = true; | 873 | _writeToStream = true; |
882 | 874 | ||
@@ -890,11 +882,11 @@ HRESULT COutArchive::WriteDatabase( | |||
890 | FOR_VECTOR (i, packSizes) | 882 | FOR_VECTOR (i, packSizes) |
891 | headerOffset += packSizes[i]; | 883 | headerOffset += packSizes[i]; |
892 | } | 884 | } |
893 | RINOK(_outByte.Flush()); | 885 | RINOK(_outByte.Flush()) |
894 | headerCRC = CRC_GET_DIGEST(_crc); | 886 | headerCRC = CRC_GET_DIGEST(_crc); |
895 | headerSize = _outByte.GetProcessedSize(); | 887 | headerSize = _outByte.GetProcessedSize(); |
896 | } | 888 | } |
897 | #ifdef _7Z_VOL | 889 | #ifdef Z7_7Z_VOL |
898 | if (_endMarker) | 890 | if (_endMarker) |
899 | { | 891 | { |
900 | CFinishHeader h; | 892 | CFinishHeader h; |
@@ -910,14 +902,16 @@ HRESULT COutArchive::WriteDatabase( | |||
910 | } | 902 | } |
911 | else | 903 | else |
912 | #endif | 904 | #endif |
905 | if (Stream) | ||
913 | { | 906 | { |
914 | CStartHeader h; | 907 | CStartHeader h; |
915 | h.NextHeaderSize = headerSize; | 908 | h.NextHeaderSize = headerSize; |
916 | h.NextHeaderCRC = headerCRC; | 909 | h.NextHeaderCRC = headerCRC; |
917 | h.NextHeaderOffset = headerOffset; | 910 | h.NextHeaderOffset = headerOffset; |
918 | RINOK(Stream->Seek((Int64)_prefixHeaderPos, STREAM_SEEK_SET, NULL)); | 911 | RINOK(Stream->Seek((Int64)_signatureHeaderPos, STREAM_SEEK_SET, NULL)) |
919 | return WriteStartHeader(h); | 912 | return WriteStartHeader(h); |
920 | } | 913 | } |
914 | return S_OK; | ||
921 | } | 915 | } |
922 | 916 | ||
923 | void CUInt32DefVector::SetItem(unsigned index, bool defined, UInt32 value) | 917 | void CUInt32DefVector::SetItem(unsigned index, bool defined, UInt32 value) |