BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
Loading...
Searching...
No Matches
BmnFileReaderZLibNG.cxx
Go to the documentation of this file.
1
// headers from this target
2
#include "BmnFileReaderZLibNG.h"
3
4
#include "BmnDefinitions.h"
5
// std:: headers
6
#include <cassert>
7
#include <filesystem>
8
// the main ZLib header
9
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
10
#include <zlib-ng.h>
11
#else
12
// If we build without the library, it would be find to use #pragma on the entire object, without push
13
// and pop, but it's nothing too important for us here - just for simplicity I'm going with this def
14
DISABLE_UNUSED_PARAM_WARNING
15
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
16
17
// o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
18
// ================== BmnFileReaderZLibNG public methods ==================
19
// o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
20
21
// ========== BmnIFileReaderInterface ==========
22
23
BmnFileReaderZLibNG::BmnFileReaderZLibNG
(
const
std::string& fileName)
24
:
BmnIFileReader
(
BmnFileType
::
ZLib_ng
, fileName)
25
,
fZlibNgStream
(nullptr)
26
,
fArchiveReadManager
(*this)
27
,
fNumberOfReadBytes
(0ull)
28
,
fLastReturnStatus
(0)
29
{}
30
31
BmnFileReaderZLibNG::BmnFileReaderZLibNG
(std::string&& fileName)
32
:
BmnIFileReader
(
BmnFileType
::
ZLib_ng
,
std
::move(fileName))
33
,
fZlibNgStream
(nullptr)
34
,
fArchiveReadManager
(*this)
35
,
fNumberOfReadBytes
(0ull)
36
,
fLastReturnStatus
(0)
37
{}
38
39
BmnFileReaderZLibNG::BmnFileReaderZLibNG
(
const
std::filesystem::path& filePath)
40
:
BmnIFileReader
(
BmnFileType
::
ZLib_ng
, filePath)
41
,
fZlibNgStream
(nullptr)
42
,
fArchiveReadManager
(*this)
43
,
fNumberOfReadBytes
(0ull)
44
,
fLastReturnStatus
(0)
45
{}
46
47
BmnFileReaderZLibNG::BmnFileReaderZLibNG
(std::filesystem::path&& filePath)
48
:
BmnIFileReader
(
BmnFileType
::
ZLib_ng
,
std
::move(filePath))
49
,
fZlibNgStream
(nullptr)
50
,
fArchiveReadManager
(*this)
51
,
fNumberOfReadBytes
(0ull)
52
,
fLastReturnStatus
(0)
53
{}
54
55
BmnFileReaderZLibNG::~BmnFileReaderZLibNG
()
56
{
57
BmnFileReaderZLibNG::Close
();
58
// another delete here as Close might go bad and still not break the code (in Release builds)
59
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
60
delete
fZlibNgStream
;
61
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
62
}
63
64
void
BmnFileReaderZLibNG::Open
(
const
BmnBinaryFileProcessingOptions
processingFlags)
65
{
66
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
67
/*
68
While we actually don't need so many comments and checks here, we are still performing them just to ensure
69
one doesn't make an accidental mistake - it might be easier to catch it
70
*/
71
if
(
fZlibNgStream
) {
72
LOG(error) <<
"ZLib-ng stream is already valid!"
;
73
return
;
74
}
75
if
(!
PerformStandardChecksBeforeOpening
(processingFlags))
76
return
;
77
fArchiveReadManager
.Open(
fFilePath
, std::ios::in | std::ios::binary);
78
fZlibNgStream
=
79
new
zng_stream_s{
nullptr
, 0u, 0u,
nullptr
, 0u, 0u,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
nullptr
, 0, 0u, 0u};
80
// according to documentation, adding +32 enables auto-detection of headers, i.e., the stream will decide whether to
81
// use gzip or zlib formats
82
if
(zng_inflateInit2(
fZlibNgStream
, 15 + 32) != Z_OK) {
83
LOG(error) <<
"Failed to initialize ZLib-ng stream! Reason: "
<<
fZlibNgStream
->msg <<
'\n'
;
84
zng_inflateEnd(
fZlibNgStream
);
85
delete
fZlibNgStream
;
86
fZlibNgStream
=
nullptr
;
87
fArchiveReadManager
.Close();
88
}
89
90
#else
91
throw
std::runtime_error{
"Trying to use ZLIB-NG while BMN is not compiled with it!"
};
92
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
93
}
94
95
void
BmnFileReaderZLibNG::Close
() noexcept
96
{
97
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
98
if
(!
fZlibNgStream
)
99
return
;
100
if
(zng_inflateEnd(
fZlibNgStream
) != Z_OK) {
101
LOG(fatal) <<
"Failed to free ZLib-ng stream - possible huge memory leak! Failure reason: "
102
<<
fZlibNgStream
->msg <<
'\n'
;
103
std::terminate();
104
}
105
delete
fZlibNgStream
;
106
fZlibNgStream
=
nullptr
;
107
fArchiveReadManager
.Close();
108
fNumberOfReadBytes
= 0ull;
109
fLastReturnStatus
= 0;
110
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
111
}
112
113
int64_t
BmnFileReaderZLibNG::Read
(
void
* dataToFill,
const
int64_t sizeToFill)
114
{
115
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
116
if
(!
IsStreamInGoodState
())
117
return
0ll;
118
return
fArchiveReadManager
.Read(dataToFill, sizeToFill);
119
#else
120
throw
std::runtime_error{
"Trying to use ZLIB-NG while BMN is not compiled with it!"
};
121
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
122
}
123
124
int64_t
BmnFileReaderZLibNG::Tell
() const noexcept
125
{
126
return
fNumberOfReadBytes
+
fArchiveReadManager
.GetCurrentOutputBufferPosition()
127
-
fArchiveReadManager
.GetTotalOutputBufferFilledSize();
128
}
129
130
void
BmnFileReaderZLibNG::Seek
(int64_t value)
131
{
132
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
133
if
(value < 0ll || (
size_t
)value ==
fNumberOfReadBytes
)
134
return
;
135
if
(!
IsStreamInGoodState
()) {
136
LOG(error) <<
"Before calling `BmnFileReaderZLibNG::Seek` ensure to clear bad flags!\n"
;
137
return
;
138
}
139
if
(!
fZlibNgStream
) {
140
LOG(error) <<
"Before calling `BmnFileReaderZLibNG::Seek` ensure to open the stream!\n"
;
141
return
;
142
}
143
if
(!
fArchiveReadManager
.IsOpen()) {
144
LOG(error) <<
"Reading file missing while calling `BmnFileReaderZLibNG::Seek`\n"
;
145
return
;
146
}
147
if
((
size_t
)value < (
fNumberOfReadBytes
-
fArchiveReadManager
.GetTotalOutputBufferFilledSize())) {
148
Close
();
149
Open
(
BmnBinaryFileProcessingOptions::ReadBinary
);
150
}
151
// in theory I could check IsOpen again for unexpected errors, but....
152
fArchiveReadManager
.MoveToDecompressingLocation(value);
153
#else
154
throw
std::runtime_error{
"Trying to use ZLIB-NG while BMN is not compiled with it!"
};
155
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
156
}
157
158
bool
BmnFileReaderZLibNG::IsGood
() const noexcept
159
{
160
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
161
return
fZlibNgStream
&&
IsStreamInGoodState
() &&
fArchiveReadManager
.IsGood();
162
#else
163
return
false
;
164
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
165
}
166
167
bool
BmnFileReaderZLibNG::IsEOF
() const noexcept
168
{
169
return
fArchiveReadManager
.IsEOF();
170
}
171
172
void
BmnFileReaderZLibNG::ClearStateFlags
()
173
{
174
// I don't like this method much
175
fLastReturnStatus
= 0;
176
fArchiveReadManager
.Clear();
177
}
178
179
bool
BmnFileReaderZLibNG::IsOpen
() const noexcept
180
{
181
return
fArchiveReadManager
.IsOpen() &&
fZlibNgStream
;
182
}
183
184
// ========== BmnIArchiveLib Interface ==========
185
186
BmnFileStreamResults
BmnFileReaderZLibNG::Uncompress
(
const
void
* source,
187
const
size_t
sourceTotalSize,
188
size_t
& numberOfReadBytes,
189
void
* output,
190
const
size_t
outputTotalSize,
191
size_t
& numberOfSetOutputBytes)
192
{
193
if
(!
fZlibNgStream
)
194
return
BmnFileStreamResults::FileNotOpen
;
195
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
196
if
(!
IsStreamInGoodState
())
197
return
BmnFileStreamResults::TryingToReadBadStream
;
198
fZlibNgStream
->next_out = (Bytef*)output;
199
fZlibNgStream
->avail_out = (uInt)outputTotalSize;
200
fZlibNgStream
->total_out = 0u;
201
fZlibNgStream
->next_in = (Bytef*)source;
202
fZlibNgStream
->avail_in = (uInt)sourceTotalSize;
203
fZlibNgStream
->total_in = 0u;
204
fLastReturnStatus
= zng_inflate(
fZlibNgStream
, Z_NO_FLUSH);
205
if
(!
IsStreamInGoodState
())
206
return
BmnFileStreamResults::UnexpectedFail
;
207
numberOfReadBytes = (size_t)
fZlibNgStream
->total_in;
208
numberOfSetOutputBytes = (size_t)
fZlibNgStream
->total_out;
209
fNumberOfReadBytes
+= numberOfSetOutputBytes;
210
if
(
fLastReturnStatus
== Z_STREAM_END)
211
return
BmnFileStreamResults::ReachedEOF
;
212
return
BmnFileStreamResults::Success
;
213
#else
214
throw
std::runtime_error{
"Trying to use ZLIB-NG while BMN is not compiled with it!"
};
215
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
216
}
217
218
std::string
BmnFileReaderZLibNG::GetLastUncompressErrorDescription
() const noexcept
219
{
220
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
221
std::string strToReturn{};
222
if
(
fZlibNgStream
&&
fZlibNgStream
->msg)
223
strToReturn = std::string{
fZlibNgStream
->msg};
224
return
strToReturn;
225
#else
226
return
std::string{
"BMN NOT BUILT WITH ZLIB"
};
227
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
228
}
229
230
bool
BmnFileReaderZLibNG::JumpsAllowed
() const noexcept
231
{
232
return
false
;
233
}
234
235
void
BmnFileReaderZLibNG::JumpTo
(
size_t
)
236
{
237
/*
238
In general with ZLib we could allow jumping while carefully building ZLib blocks. Still,
239
that would be allowed only in files written by our own encoder, while GZip would not produce
240
the same results. Thus, we don't allow jumps no matter what and if jumps are needed, we can
241
think about it and adapt later
242
*/
243
LOG(warning) <<
"Calling `BmnFileReaderZLibNG::JumpTo` while the type doesn't allow jumping!\n"
;
244
}
245
246
size_t
BmnFileReaderZLibNG::GetNumberOfDecompressedBytes
() const noexcept
247
{
248
return
fNumberOfReadBytes
;
249
}
250
251
bool
BmnFileReaderZLibNG::HasReachedTheEndOfStream
() const noexcept
252
{
253
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
254
if
(!
IsStreamInGoodState
())
255
return
true
;
256
return
fLastReturnStatus
== Z_STREAM_END;
257
#else
258
return
true
;
259
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
260
}
261
262
bool
BmnFileReaderZLibNG::IsStreamInGoodState
() const noexcept
263
{
264
#ifdef BMNCOMPRESSION_WITH_ZLIB_NG
265
return
fLastReturnStatus
>= 0;
266
#else
267
return
false
;
268
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
269
}
270
271
#ifndef BMNCOMPRESSION_WITH_ZLIB_NG
272
RESTORE_UNUSED_PARAM_WARNING
273
#endif
// BMNCOMPRESSION_WITH_ZLIB_NG
RESTORE_UNUSED_PARAM_WARNING
#define RESTORE_UNUSED_PARAM_WARNING
Definition
BmnDefinitions.h:23
DISABLE_UNUSED_PARAM_WARNING
#define DISABLE_UNUSED_PARAM_WARNING
Definition
BmnDefinitions.h:22
BmnFileReaderZLibNG::Read
virtual int64_t Read(void *dataToFill, const int64_t sizeToFill) override
Definition
BmnFileReaderZLibNG.cxx:113
BmnFileReaderZLibNG::IsStreamInGoodState
virtual bool IsStreamInGoodState() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:262
BmnFileReaderZLibNG::GetLastUncompressErrorDescription
virtual std::string GetLastUncompressErrorDescription() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:218
BmnFileReaderZLibNG::Close
virtual void Close() noexcept override
Definition
BmnFileReaderZLibNG.cxx:95
BmnFileReaderZLibNG::JumpTo
virtual void JumpTo(size_t) override
Definition
BmnFileReaderZLibNG.cxx:235
BmnFileReaderZLibNG::Open
virtual void Open(const BmnBinaryFileProcessingOptions processingFlags=BmnBinaryFileProcessingOptions::ReadBinary) override
Definition
BmnFileReaderZLibNG.cxx:64
BmnFileReaderZLibNG::fLastReturnStatus
int32_t fLastReturnStatus
Definition
BmnFileReaderZLibNG.h:208
BmnFileReaderZLibNG::IsGood
virtual bool IsGood() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:158
BmnFileReaderZLibNG::Tell
virtual int64_t Tell() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:124
BmnFileReaderZLibNG::HasReachedTheEndOfStream
virtual bool HasReachedTheEndOfStream() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:251
BmnFileReaderZLibNG::Uncompress
virtual BmnFileStreamResults Uncompress(const void *source, const size_t sourceTotalSize, size_t &numberOfReadBytes, void *output, const size_t outputTotalSize, size_t &numberOfSetOutputBytes) override
Definition
BmnFileReaderZLibNG.cxx:186
BmnFileReaderZLibNG::fZlibNgStream
zng_stream_s * fZlibNgStream
Definition
BmnFileReaderZLibNG.h:205
BmnFileReaderZLibNG::ClearStateFlags
virtual void ClearStateFlags() override
Definition
BmnFileReaderZLibNG.cxx:172
BmnFileReaderZLibNG::~BmnFileReaderZLibNG
virtual ~BmnFileReaderZLibNG() override
Definition
BmnFileReaderZLibNG.cxx:55
BmnFileReaderZLibNG::IsOpen
virtual bool IsOpen() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:179
BmnFileReaderZLibNG::fArchiveReadManager
BmnReaderCacheManager< 32ull *1024ull, 64ull *1024ull > fArchiveReadManager
Definition
BmnFileReaderZLibNG.h:206
BmnFileReaderZLibNG::BmnFileReaderZLibNG
BmnFileReaderZLibNG(const std::string &fileName="")
Definition
BmnFileReaderZLibNG.cxx:23
BmnFileReaderZLibNG::GetNumberOfDecompressedBytes
virtual size_t GetNumberOfDecompressedBytes() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:246
BmnFileReaderZLibNG::JumpsAllowed
virtual bool JumpsAllowed() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:230
BmnFileReaderZLibNG::fNumberOfReadBytes
size_t fNumberOfReadBytes
Definition
BmnFileReaderZLibNG.h:207
BmnFileReaderZLibNG::IsEOF
virtual bool IsEOF() const noexcept override
Definition
BmnFileReaderZLibNG.cxx:167
BmnFileReaderZLibNG::Seek
virtual void Seek(int64_t value) override
Definition
BmnFileReaderZLibNG.cxx:130
BmnIFileReader::BmnIFileReader
BmnIFileReader(const BmnFileType fileType, const std::string &fileName="")
Definition
BmnIFileReader.cxx:8
BmnIFileReader::fFilePath
std::filesystem::path fFilePath
Definition
BmnIFileReader.h:199
BmnIFileReader::PerformStandardChecksBeforeOpening
bool PerformStandardChecksBeforeOpening(const BmnBinaryFileProcessingOptions processingFlags)
Definition
BmnIFileReader.cxx:72
BmnFileStreamResults
BmnFileStreamResults
Definition
BmnFileProcessingFlags.h:70
BmnFileStreamResults::Success
@ Success
Definition
BmnFileProcessingFlags.h:72
BmnFileStreamResults::ReachedEOF
@ ReachedEOF
Definition
BmnFileProcessingFlags.h:74
BmnFileStreamResults::FileNotOpen
@ FileNotOpen
Definition
BmnFileProcessingFlags.h:80
BmnFileStreamResults::UnexpectedFail
@ UnexpectedFail
Definition
BmnFileProcessingFlags.h:82
BmnFileStreamResults::TryingToReadBadStream
@ TryingToReadBadStream
Definition
BmnFileProcessingFlags.h:78
BmnFileType
BmnFileType
Definition
BmnFileProcessingFlags.h:16
BmnFileType::ZLib_ng
@ ZLib_ng
Definition
BmnFileProcessingFlags.h:21
BmnBinaryFileProcessingOptions
BmnBinaryFileProcessingOptions
Definition
BmnFileProcessingFlags.h:95
BmnBinaryFileProcessingOptions::ReadBinary
@ ReadBinary
Definition
BmnFileProcessingFlags.h:103
std
Definition
json.hpp:4446
compression
sources
BmnFileReaderZLibNG.cxx
Generated on
for BmnRoot by
1.17.0