ROSE 2.1.0
Loading...
Searching...
No Matches
SerialFrame.h
1#ifndef ROSE_BinaryAnalysis_Serialization_SerialFrame_H
2#define ROSE_BinaryAnalysis_Serialization_SerialFrame_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_BINARY_ANALYSIS
5
6#include <Rose/BinaryAnalysis/BasicTypes.h>
7
8#include <boost/archive/binary_iarchive.hpp>
9#include <boost/archive/binary_oarchive.hpp>
10#include <boost/filesystem.hpp>
11#include <boost/iostreams/device/file_descriptor.hpp>
12#include <boost/iostreams/stream.hpp>
13
14#include <cstdint>
15#include <string>
16#include <vector>
17
18namespace Rose {
19namespace BinaryAnalysis {
20namespace Serialization {
21
23 Serialization::Savable objectType = Serialization::NO_OBJECT;
24 Serialization::Format format = Serialization::BINARY;
25 std::string roseVersion;
26 std::uint64_t payloadSize = 0;
27
28 template <class Archive> void serialize(Archive& ar, const unsigned /*version*/) {
29 ar & objectType;
30 ar & format;
31 ar & roseVersion;
32 ar & payloadSize;
33 }
34};
35
36struct FileHeader {
37 std::uint32_t magic = 0;
38 std::uint32_t version = 0;
39
40 template <class Archive> void serialize(Archive& ar, const unsigned /*version*/) {
41 ar & magic;
42 ar & version;
43 }
44};
45
46struct Record {
47 RecordHeader header;
48 std::vector<char> payload;
49};
50
58 public:
61 objectType_(Serialization::NO_OBJECT), format_(Serialization::BINARY), roseVersion_(ROSE_PACKAGE_VERSION) {}
62
64 FrameRecord(Serialization::Savable objectType, Serialization::Format format) :
65 objectType_(objectType), format_(format), roseVersion_(ROSE_PACKAGE_VERSION) {}
66
68 explicit FrameRecord(const Record& record) :
69 objectType_(record.header.objectType), format_(record.header.format), roseVersion_(record.header.roseVersion),
70 payload_(record.payload) {}
71
73 Record toRecord() const {
74 Record record;
75 record.header.objectType = objectType_;
76 record.header.format = format_;
77 record.header.roseVersion = roseVersion_;
78 record.header.payloadSize = payload_.size();
79 record.payload = payload_;
80 return record;
81 }
82
84 const std::vector<char>& payload() const { return payload_; }
85 void payload(const std::vector<char>& payload) { payload_ = payload; }
86
87 Serialization::Savable objectType() const { return objectType_; }
88 void objectType(Serialization::Savable type) { objectType_ = type; }
89
90 Serialization::Format format() const { return format_; }
91 void format(Serialization::Format fmt) { format_ = fmt; }
92
93 std::string roseVersion() const { return roseVersion_; }
94 void roseVersion(const std::string& ver) { roseVersion_ = ver; }
95
97 std::uint64_t payloadSize() const { return payload_.size(); }
98
100 template <typename T> void serializeObject(const T& object) {
101 std::ostringstream oss;
102 boost::archive::binary_oarchive oa(oss);
103 oa << object;
104 std::string serialized = oss.str();
105
106 // Copy serialized data to payload
107 payload_.resize(serialized.size());
108 std::memcpy(payload_.data(), serialized.data(), serialized.size());
109 }
110
112 template <typename T> void deserializeObject(T& object) const {
113 std::string serialized(reinterpret_cast<const char*>(payload_.data()), payload_.size());
114 std::istringstream iss(serialized);
115 boost::archive::binary_iarchive ia(iss);
116 ia >> object;
117 }
118
120 template <class Archive> void serialize(Archive& ar, const unsigned /*version*/) {
121 ar & objectType_;
122 ar & format_;
123 ar & roseVersion_;
124 ar & payload_;
125 }
126
127 private:
128 Serialization::Savable objectType_; // Type of object stored in the payload
129 Serialization::Format format_; // Format used for the payload
130 std::string roseVersion_; // ROSE version used to create the record
131 std::vector<char> payload_; // Raw payload data
132};
133
141 public:
142 SerialFrame();
143 ~SerialFrame();
144
145 // Open/close for writing or reading.
146 void openForWrite(const boost::filesystem::path& fileName, ProgressCallback saveCB);
147 void openForRead(const boost::filesystem::path& fileName, ProgressCallback loadCB);
148
149 // Close boost streams and fd, adjust fd and mode if necessary
150 void close();
151
152 private:
153 // Open boost streams depending on mode_ and fd_. This function assumes that mode_ and fd_
154 // are properly set (by way of openForWrite() or openForRead()).
155 void open(const boost::filesystem::path& fileName);
156
157 public:
158 // Container-level header.
159 void writeFileHeader();
160 void readAndVerifyFileHeader();
161
162 // Record I/O.
163 void writeRecord(const RecordHeader& header, const std::vector<char>& payload);
164 Record readRecord();
165
166 // FrameRecord convenience methods
167 void writeFrameRecord(const FrameRecord& frameRecord);
168 FrameRecord readFrameRecord();
169
170 private:
171 enum class Mode { Closed, Reading, Writing };
172
173 Mode mode_;
174 int fd_;
175
176 // Input I/O layer
177 boost::iostreams::file_descriptor_source inDevice_;
178 boost::iostreams::stream<boost::iostreams::file_descriptor_source> inStream_;
179 std::unique_ptr<boost::archive::binary_iarchive> inArchive_;
180
181 // Output I/O layer
182 boost::iostreams::file_descriptor_sink outDevice_;
183 boost::iostreams::stream<boost::iostreams::file_descriptor_sink> outStream_;
184 std::unique_ptr<boost::archive::binary_oarchive> outArchive_;
185
186 // Progress reporting
187 ProgressCallback progress_;
188
189 void closeInput();
190 void closeOutput();
191 void ensureWriting() const;
192 void ensureReading() const;
193
194 // Helpers to write/read a size-prefixed blob.
195 void writeBlob(const std::vector<char>& data);
196 std::vector<char> readBlob();
197
198 static void startWriteWorker(SerialFrame* saver, const std::vector<char>& data);
199 void writeWorker(const std::vector<char>& data);
200};
201
202} // namespace Serialization
203} // namespace BinaryAnalysis
204} // namespace Rose
205
206#endif
207#endif
Helper class for metadata and payload handling.
Definition SerialFrame.h:57
void serializeObject(const T &object)
Template method to serialize an object directly to this record's payload.
const std::vector< char > & payload() const
Field getter and setters.
Definition SerialFrame.h:84
void deserializeObject(T &object) const
Template method to deserialize an object from this record's payload.
FrameRecord()
Default constructor creates an empty record.
Definition SerialFrame.h:60
FrameRecord(Serialization::Savable objectType, Serialization::Format format)
Construct with specific objectType and format.
Definition SerialFrame.h:64
std::uint64_t payloadSize() const
Get the payload size.
Definition SerialFrame.h:97
FrameRecord(const Record &record)
Construct from a Record struct.
Definition SerialFrame.h:68
void serialize(Archive &ar, const unsigned)
Boost serialization support.
Record toRecord() const
Convert to a Record struct.
Definition SerialFrame.h:73
Framed container for SerialIo records.
The ROSE library.