aboutsummaryrefslogtreecommitdiff
path: root/CPP/7zip/Archive/7z/7zOut.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Archive/7z/7zOut.cpp')
-rw-r--r--CPP/7zip/Archive/7z/7zOut.cpp90
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 @@
14namespace NArchive { 14namespace NArchive {
15namespace N7z { 15namespace N7z {
16 16
17HRESULT COutArchive::WriteSignature() 17static 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
27HRESULT COutArchive::WriteFinishSignature() 25HRESULT 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
50HRESULT COutArchive::WriteStartHeader(const CStartHeader &h) 48HRESULT 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
61HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h) 60HRESULT 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
78HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) 77HRESULT 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
117void COutArchive::Close() 114void COutArchive::Close()
@@ -120,17 +117,6 @@ void COutArchive::Close()
120 Stream.Release(); 117 Stream.Release();
121} 118}
122 119
123HRESULT 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
134UInt64 COutArchive::GetPos() const 120UInt64 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
220UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props) 206UInt32 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
923void CUInt32DefVector::SetItem(unsigned index, bool defined, UInt32 value) 917void CUInt32DefVector::SetItem(unsigned index, bool defined, UInt32 value)