4 #include "KVProtobufDataReader.h"
6 #include <google/protobuf/io/coded_stream.h>
10 #define KV_PROTOBUF_MSG_SIZE 4
40 if (fReachedEndOfFile) {
42 if (!read_buffer())
return false;
46 if (get_remaining_readable_buffer() < KV_PROTOBUF_MSG_SIZE) fNeedToReadBuffer =
true;
48 if (fNeedToReadBuffer)
49 if (!read_buffer())
return false;
55 google::protobuf::io::CodedInputStream codedIStream((
const uint8_t*)(fBuffer + fEvOffset), KV_PROTOBUF_MSG_SIZE);
56 codedIStream.ReadLittleEndian32(&fEvSize);
64 fEvOffset += KV_PROTOBUF_MSG_SIZE;
66 if (get_remaining_readable_buffer() < fEvSize) {
67 fNeedToReadBuffer =
true;
68 if (!read_buffer())
return false;
71 if (!parse_event_from_message()) {
87 bool KVProtobufDataReader::read_buffer()
91 if (fReachedEndOfFile) {
95 ptrdiff_t fFillOffset = 0;
98 if (fEvOffset > 0 && get_remaining_readable_buffer()) {
100 memcpy(fBuffer, (fBuffer + fEvOffset), get_remaining_readable_buffer());
101 fFillOffset = get_remaining_readable_buffer();
103 Int_t bytes_to_read = fBufSize - fFillOffset;
104 if (bytes_to_read > fFileSize) bytes_to_read = fFileSize;
106 Long64_t old_bytes = fFile->GetBytesRead();
107 fFile->ReadBuffer((
char*)(fBuffer + fFillOffset), bytes_to_read);
108 Long64_t bytes_read = fFile->GetBytesRead() - old_bytes;
110 fFileSize -= bytes_read;
111 if (bytes_read == 0 || fFileSize == 0 || bytes_read < (
Int_t)(fBufSize - fFillOffset)) fReachedEndOfFile =
true;
112 fNeedToReadBuffer =
false;
114 return (bytes_read > 0);
121 void KVProtobufDataReader::open_file(
const Char_t* filepath)
124 fp.Append(
"?filetype=raw");
125 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,0,0)
131 fFileSize = fFile->GetSize();
132 Info(
"open_file",
"%s : size of file = %lld bytes", filepath, fFileSize);
134 fNeedToReadBuffer =
true;
135 fReachedEndOfFile =
false;
148 fBufSize(bufSiz),
fBuffer(new char[bufSiz]), fFile(nullptr), fEvSize(0), fEvOffset(0), fNeedToReadBuffer(true),
149 fReachedEndOfFile(false)
166 fBufSize(bufSiz),
fBuffer(new char[bufSiz]), fFile(nullptr), fFileSize(0), fEvSize(0), fEvOffset(0), fNeedToReadBuffer(true),
167 fReachedEndOfFile(false)
181 #if ROOT_VERSION_CODE < ROOT_VERSION(6,0,0)
Read Google Protobuf DAQ files.
Bool_t GetNextEvent() override
Int_t GetRunNumberReadFromFile() const override
KVProtobufDataReader(Int_t bufSiz=16 *1024 *1024)
Create file reader of given buffer size, do not open any files yet.
virtual ~KVProtobufDataReader()
Destructor.
Abstract base class for reading raw (DAQ) data.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
virtual void Info(const char *method, const char *msgfmt,...) const
void Error(UserClass p, const char *location, const char *va_(fmt),...)