Files
libcapsclient/libs/gempa/caps/metapacket.h
2026-03-18 15:18:05 +01:00

146 lines
3.7 KiB
C++

/***************************************************************************
* Copyright (C) 2009 by gempa GmbH *
* *
* All Rights Reserved. *
* *
* NOTICE: All information contained herein is, and remains *
* the property of gempa GmbH and its suppliers, if any. The intellectual *
* and technical concepts contained herein are proprietary to gempa GmbH *
* and its suppliers. *
* Dissemination of this information or reproduction of this material *
* is strictly forbidden unless prior written permission is obtained *
* from gempa GmbH. *
***************************************************************************/
#ifndef GEMPA_CAPS_METAPACKET_H
#define GEMPA_CAPS_METAPACKET_H
#include <gempa/caps/api.h>
#include <gempa/caps/packet.h>
#include <cstdint>
namespace Gempa {
namespace CAPS {
struct SC_GEMPA_CAPS_API MetaResponseHeader {
struct Time {
int64_t seconds;
int32_t microSeconds;
};
Time startTime;
Time endTime;
bool get(std::streambuf &buf) {
Endianess::Reader get(buf);
get(startTime.seconds);
get(startTime.microSeconds);
get(endTime.seconds);
get(endTime.microSeconds);
return get.good;
}
int dataSize() const {
return sizeof(startTime.seconds) + sizeof(startTime.microSeconds) +
sizeof(endTime.seconds) + sizeof(endTime.microSeconds);
}
};
class MetaDataRecord : public DataRecord {
public:
struct MetaHeader {
Header dataHeader;
TimeStamp endTime;
bool get(std::streambuf &buf) {
Endianess::Reader get(buf);
get(endTime.year);
get(endTime.yday);
get(endTime.hour);
get(endTime.minute);
get(endTime.second);
get(endTime.usec);
return get.good;
}
bool put(std::streambuf &buf) const;
int dataSize() const {
return dataHeader.dataSize() +
sizeof(endTime.year) +
sizeof(endTime.yday) +
sizeof(endTime.hour) +
sizeof(endTime.minute) +
sizeof(endTime.second) +
sizeof(endTime.usec);
}
void setEndTime(const Time &timestamp);
};
public:
MetaDataRecord();
//! Returns the data vector to be filled by the caller
Buffer *data();
DataRecord *clone() const override;
const char *formatName() const override;
bool readMetaData(std::streambuf &buf, int size,
Header &header,
Time &startTime, Time &endTime) override {
return false;
}
const Header *header() const override;
//! Sets a custom header and updates all internal structures
//! based on the current data. If the data has changed, make
//! sure to call this method again. If the flag skip reading
//! is set get will not read the header information from stream
void setHeader(const MetaHeader &header);
Time startTime() const override;
Time endTime() const override;
bool canTrim() const override { return false; }
bool canMerge() const override { return false; }
bool trim(const Time &start, const Time &end) const override { return false; }
size_t dataSize(bool withHeader) const override;
ReadStatus get(std::streambuf &buf, int size,
const Time &start, const Time &end,
int maxBytes) override;
bool put(std::streambuf &buf, bool withHeader) const override { return false; }
PacketType packetType() const override { return MetaDataPacket; }
private:
MetaHeader _header;
mutable Time _startTime;
mutable Time _endTime;
};
}
}
#endif