MADARA  3.2.3
FileHeader.cpp
Go to the documentation of this file.
1 #include <algorithm>
2 #include <sstream>
3 #include <time.h>
4 
6 #include "FileHeader.h"
8 
10 : size (encoded_size ()),
11  states (0), initial_timestamp (utility::get_time ()),
12  last_timestamp (utility::get_time ()),
13  karl_version (madara::utility::get_uint_version ())
14 {
15  memcpy (file_type, "KaRL", 4);
16  file_type[4] = 0;
17  file_type[5] = 0;
18  file_type[6] = 0;
19  file_type[7] = 0;
20 
21  originator[0] = 0;
22 
24 }
25 
26 
28 {
29 }
30 
31 uint32_t
33 {
34  return sizeof (uint64_t) * 4
35  + sizeof (char) * (64 + 8)
36  + sizeof (uint32_t);
37 }
38 
39 const char *
41  int64_t & buffer_remaining)
42 {
43  // Remove size field from the buffer and update accordingly
44  if ((size_t)buffer_remaining >= sizeof (size))
45  {
46  size = madara::utility::endian_swap (*(uint64_t *)buffer);
47  buffer += sizeof (size);
48  }
49  else
50  {
51  std::stringstream buffer;
52  buffer << "FileHeader::read: ";
53  buffer << sizeof (size) << " byte size encoding cannot";
54  buffer << " fit in ";
55  buffer << buffer_remaining << " byte buffer\n";
56 
57  throw exceptions::MemoryException (buffer.str ());
58  }
59  buffer_remaining -= sizeof (size);
60 
61  // Remove states field from the buffer and update accordingly
62  if ((size_t)buffer_remaining >= sizeof (states))
63  {
64  states = madara::utility::endian_swap (*(uint64_t *)buffer);
65  buffer += sizeof (states);
66  }
67  else
68  {
69  std::stringstream buffer;
70  buffer << "FileHeader::read: ";
71  buffer << sizeof (states) << " byte states encoding cannot";
72  buffer << " fit in ";
73  buffer << buffer_remaining << " byte buffer\n";
74 
75  throw exceptions::MemoryException (buffer.str ());
76  }
77  buffer_remaining -= sizeof (states);
78 
79  // Remove initial_timestamp field from the buffer and update accordingly
80  if ((size_t)buffer_remaining >= sizeof (initial_timestamp))
81  {
82  initial_timestamp = madara::utility::endian_swap (*(uint64_t *)buffer);
83  buffer += sizeof (initial_timestamp);
84  }
85  else
86  {
87  std::stringstream buffer;
88  buffer << "FileHeader::read: ";
89  buffer << sizeof (initial_timestamp) <<
90  " byte initial_timestamp encoding cannot";
91  buffer << " fit in ";
92  buffer << buffer_remaining << " byte buffer\n";
93 
94  throw exceptions::MemoryException (buffer.str ());
95  }
96  buffer_remaining -= sizeof (initial_timestamp);
97 
98  // Remove initial_timestamp field from the buffer and update accordingly
99  if ((size_t)buffer_remaining >= sizeof (last_timestamp))
100  {
101  last_timestamp = madara::utility::endian_swap (*(uint64_t *)buffer);
102  buffer += sizeof (last_timestamp);
103  }
104  else
105  {
106  std::stringstream buffer;
107  buffer << "FileHeader::read: ";
108  buffer << sizeof (last_timestamp) <<
109  " byte last_timestamp encoding cannot";
110  buffer << " fit in ";
111  buffer << buffer_remaining << " byte buffer\n";
112 
113  throw exceptions::MemoryException (buffer.str ());
114  }
115  buffer_remaining -= sizeof (last_timestamp);
116 
117  // Remove file_type from the buffer and update accordingly
118  if ((size_t)buffer_remaining >= sizeof (char) * 8)
119  {
120  strncpy (file_type, buffer, 8);
121  buffer += sizeof (char) * 8;
122  }
123  else
124  {
125  std::stringstream buffer;
126  buffer << "FileHeader::read: ";
127  buffer << 8 <<
128  " byte file_type encoding cannot";
129  buffer << " fit in ";
130  buffer << buffer_remaining << " byte buffer\n";
131 
132  throw exceptions::MemoryException (buffer.str ());
133  }
134  buffer_remaining -= sizeof (char) * 8;
135 
136  // Remove karl_version field from the buffer and update accordingly
137  if ((size_t)buffer_remaining >= sizeof (karl_version))
138  {
139  karl_version = madara::utility::endian_swap (*(uint32_t *)buffer);
140  buffer += sizeof (karl_version);
141  }
142  else
143  {
144  std::stringstream buffer;
145  buffer << "FileHeader::read: ";
146  buffer << sizeof (karl_version) <<
147  " byte version encoding cannot";
148  buffer << " fit in ";
149  buffer << buffer_remaining << " byte buffer\n";
150 
151  throw exceptions::MemoryException (buffer.str ());
152  }
153  buffer_remaining -= sizeof (karl_version);
154 
155  // Remove originator from the buffer and update accordingly
156  if ((size_t)buffer_remaining >= sizeof (char) * 64)
157  {
158  strncpy (originator, buffer, 64);
159  buffer += sizeof (char) * 64;
160  }
161  else
162  {
163  std::stringstream buffer;
164  buffer << "FileHeader::read: ";
165  buffer << sizeof (originator) <<
166  " byte originator encoding cannot";
167  buffer << " fit in ";
168  buffer << buffer_remaining << " byte buffer\n";
169 
170  throw exceptions::MemoryException (buffer.str ());
171  }
172  buffer_remaining -= sizeof (char) * 64;
173 
174  return buffer;
175 }
176 
177 char *
179  int64_t & buffer_remaining)
180 {
181  // Write size field to the buffer and update accordingly
182  if ((size_t)buffer_remaining >= sizeof (size))
183  {
184  *(uint64_t *) buffer = madara::utility::endian_swap (size);
185  buffer += sizeof (size);
186  }
187  else
188  {
189  std::stringstream buffer;
190  buffer << "FileHeader::read: ";
191  buffer << sizeof (size) <<
192  " byte size encoding cannot";
193  buffer << " fit in ";
194  buffer << buffer_remaining << " byte buffer\n";
195 
196  throw exceptions::MemoryException (buffer.str ());
197  }
198  buffer_remaining -= sizeof (size);
199 
200  // Write states field to the buffer and update accordingly
201  if ((size_t)buffer_remaining >= sizeof (states))
202  {
203  *(uint64_t *) buffer = madara::utility::endian_swap (states);
204  buffer += sizeof (states);
205  }
206  else
207  {
208  std::stringstream buffer;
209  buffer << "FileHeader::read: ";
210  buffer << sizeof (states) <<
211  " byte states encoding cannot";
212  buffer << " fit in ";
213  buffer << buffer_remaining << " byte buffer\n";
214 
215  throw exceptions::MemoryException (buffer.str ());
216  }
217  buffer_remaining -= sizeof (states);
218 
219  // Write initial_timestamp field to the buffer and update accordingly
220  if ((size_t)buffer_remaining >= sizeof (initial_timestamp))
221  {
222  *(uint64_t *) buffer = madara::utility::endian_swap (initial_timestamp);
223  buffer += sizeof (initial_timestamp);
224  }
225  else
226  {
227  std::stringstream buffer;
228  buffer << "FileHeader::read: ";
229  buffer << sizeof (initial_timestamp) <<
230  " byte initial_timestamp encoding cannot";
231  buffer << " fit in ";
232  buffer << buffer_remaining << " byte buffer\n";
233 
234  throw exceptions::MemoryException (buffer.str ());
235  }
236  buffer_remaining -= sizeof (initial_timestamp);
237 
238  // Write last_timestamp field to the buffer and update accordingly
239  if ((size_t)buffer_remaining >= sizeof (last_timestamp))
240  {
241  *(uint64_t *) buffer = madara::utility::endian_swap (last_timestamp);
242  buffer += sizeof (last_timestamp);
243  }
244  else
245  {
246  std::stringstream buffer;
247  buffer << "FileHeader::read: ";
248  buffer << sizeof (last_timestamp) <<
249  " byte last_timestamp encoding cannot";
250  buffer << " fit in ";
251  buffer << buffer_remaining << " byte buffer\n";
252 
253  throw exceptions::MemoryException (buffer.str ());
254  }
255  buffer_remaining -= sizeof (last_timestamp);
256 
257  // Write file_type field from the buffer and update accordingly
258  if ((size_t)buffer_remaining >= sizeof (char) * 8)
259  {
260  strncpy (buffer, file_type, 8);
261  buffer += sizeof (char) * 8;
262  }
263  else
264  {
265  std::stringstream buffer;
266  buffer << "FileHeader::read: ";
267  buffer << 8 <<
268  " byte last_timestamp encoding cannot";
269  buffer << " fit in ";
270  buffer << buffer_remaining << " byte buffer\n";
271 
272  throw exceptions::MemoryException (buffer.str ());
273  }
274  buffer_remaining -= sizeof (char) * 8;
275 
276  // Write karl_version field to the buffer and update accordingly
277  if ((size_t)buffer_remaining >= sizeof (karl_version))
278  {
279  *(uint32_t *) buffer = madara::utility::endian_swap (karl_version);
280  buffer += sizeof (karl_version);
281  }
282  else
283  {
284  std::stringstream buffer;
285  buffer << "FileHeader::read: ";
286  buffer << sizeof (karl_version) <<
287  " byte version encoding cannot";
288  buffer << " fit in ";
289  buffer << buffer_remaining << " byte buffer\n";
290 
291  throw exceptions::MemoryException (buffer.str ());
292  }
293  buffer_remaining -= sizeof (karl_version);
294 
295 
296  // Write originator field from the buffer and update accordingly
297  if ((size_t)buffer_remaining >= sizeof (char) * 64)
298  {
299  strncpy (buffer, originator, 64);
300  buffer += sizeof (char) * 64;
301  }
302  else
303  {
304  std::stringstream buffer;
305  buffer << "FileHeader::read: ";
306  buffer << sizeof (originator) <<
307  " byte originator encoding cannot";
308  buffer << " fit in ";
309  buffer << buffer_remaining << " byte buffer\n";
310 
311  throw exceptions::MemoryException (buffer.str ());
312  }
313  buffer_remaining -= sizeof (char) * 64;
314 
315  return buffer;
316 }
317 
318 bool
320 {
321  return size == other.size &&
322  states == other.states &&
324  last_timestamp == other.last_timestamp &&
325  karl_version == other.karl_version &&
326  strncmp (file_type, other.file_type, 4) == 0 &&
327  strncmp (originator, other.originator, 64) == 0;
328 }
virtual const char * read(const char *buffer, int64_t &buffer_remaining)
Reads a FileHeader instance from a buffer and updates the amount of buffer room remaining.
Definition: FileHeader.cpp:40
Defines a file header which is the default for KaRL checkpointing.
Definition: FileHeader.h:36
char file_type[8]
file type identifier ("KaRL")
Definition: FileHeader.h:119
char originator[64]
the originator of the message (host:port)
Definition: FileHeader.h:129
int64_t get_time(void)
Returns a time of day in nanoseconds If simtime feature is enabled, this may be simulation time inste...
Definition: Utility.inl:253
uint64_t initial_timestamp
the timestamp for the initial checkpointing
Definition: FileHeader.h:109
uint64_t last_timestamp
the timestamp for the last checkpoint
Definition: FileHeader.h:114
uint64_t size
the size of this header plus the updates
Definition: FileHeader.h:99
uint32_t karl_version
Version of KaRL installed when file was created.
Definition: FileHeader.h:124
static uint32_t encoded_size(void)
Returns the size of the encoded FileHeader class, which may be different from sizeof (FileHeader) bec...
Definition: FileHeader.cpp:32
virtual char * write(char *buffer, int64_t &buffer_remaining)
Writes a FileHeader instance to a buffer and updates the amount of buffer room remaining.
Definition: FileHeader.cpp:178
uint64_t endian_swap(uint64_t value)
Converts a host format uint64_t into big endian.
Definition: Utility.inl:115
virtual bool equals(const FileHeader &other)
Compares the fields of this instance to another instance.
Definition: FileHeader.cpp:319
uint64_t states
the number of states checkpointed in the file stream
Definition: FileHeader.h:104
uint32_t get_uint_version(void)
Gets the MADARA version number.
Definition: Utility.cpp:32
An exception for general memory errors like out-of-memory.
Provides utility functions and classes for common tasks and needs.
Definition: IteratorImpl.h:14
virtual ~FileHeader()
Destructor.
Definition: FileHeader.cpp:27
Copyright (c) 2015 Carnegie Mellon University.