MADARA  3.4.1
BufferFilterHeader.inl
Go to the documentation of this file.
1 #ifndef _MADARA_FILTERS_BUFFERFILTERHEADER_INL_
2 #define _MADARA_FILTERS_BUFFERFILTERHEADER_INL_
3 
12 #include <string.h>
13 #include <sstream>
14 
15 #include "madara/utility/StdInt.h"
16 #include "BufferFilterHeader.h"
18 
19 namespace madara
20 {
21 namespace filters
22 {
24 {
25  if (filter != 0)
26  {
28  "CheckpointSettings::check_filter: header: "
29  " %s:%s, filter: %s:%s\n",
31  filter->get_id().c_str(),
32  utility::to_string_version(filter->get_version()).c_str());
33 
34  return filter->get_id() == id && version >= filter->get_version();
35  }
36  else
37  return false;
38 }
39 
41 {
42  if (filter != 0)
43  {
44  // the only thing not filled in is size, which comes from encode/decode
45  version = filter->get_version();
46  std::string temp = filter->get_id();
47  memcpy(id, temp.c_str(), std::min(temp.size() + 1, (size_t)8));
48  }
49  else
50  {
51  std::stringstream buffer;
52  buffer << "BufferFilterHeader::read: ";
53  buffer << " filter was null\n";
54 
55  throw exceptions::MemoryException(buffer.str());
56  }
57 }
58 
59 inline const char* BufferFilterHeader::read(
60  const char* buffer, int64_t& buffer_remaining)
61 {
62  if (buffer_remaining >= 20)
63  {
64  memcpy(&size, buffer, 8);
65  utility::strncpy_safe(id, buffer + 8, 8);
66  memcpy(&version, buffer + 16, 4);
67 
70 
71  buffer_remaining -= 20;
72  buffer += 20;
73  }
74  else
75  {
76  std::stringstream local_buffer;
77  local_buffer << "BufferFilterHeader::read: ";
78  local_buffer << " 20 byte size encoding cannot fit in ";
79  local_buffer << buffer_remaining << " byte buffer\n";
80 
81  throw exceptions::MemoryException(local_buffer.str());
82  }
83 
84  return buffer;
85 }
86 
87 inline char* BufferFilterHeader::write(char* buffer, int64_t& buffer_remaining)
88 {
89  if (buffer_remaining >= 20)
90  {
91  uint64_t new_size = utility::endian_swap(size);
92  uint32_t new_version = utility::endian_swap(version);
93 
94  memcpy(buffer, &new_size, 8);
95  memcpy(buffer + 8, id, 8);
96  memcpy(buffer + 16, &new_version, 4);
97 
98  buffer_remaining -= 20;
99  buffer += 20;
100  }
101  else
102  {
103  std::stringstream local_buffer;
104  local_buffer << "BufferFilterHeader::write: ";
105  local_buffer << " 20 byte size encoding cannot fit in ";
106  local_buffer << buffer_remaining << " byte buffer\n";
107 
108  throw exceptions::MemoryException(local_buffer.str());
109  }
110 
111  return buffer;
112 }
113 
114 } // end filters namespace
115 } // end madara namespace
116 
117 #endif // _MADARA_FILTERS_BUFFERFILTERHEADER_INL_
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
Definition: Logger.h:41
An exception for general memory errors like out-of-memory.
uint64_t size
the size of this header plus the updates
char * write(char *buffer, int64_t &buffer_remaining)
Writes a BufferFilterHeader instance to a buffer and updates the amount of buffer room remaining.
void read(filters::BufferFilter *filter)
Reads relevant fields from a filter.
bool check_filter(filters::BufferFilter *filter)
Checks compatability between the header and the filter.
Abstract base class for implementing buffer filters via a functor interface.
Definition: BufferFilter.h:27
virtual uint32_t get_version(void)=0
Gets the version of the filter.
virtual std::string get_id(void)=0
Gets the id of the filter.
constexpr string_t string
T get(const KnowledgeRecord &kr)
Get the value of a KnowlegeRecord.
Definition: GetRecord.h:121
MADARA_EXPORT utility::Refcounter< logger::Logger > global_logger
uint64_t endian_swap(uint64_t value)
Converts a host format uint64_t into big endian.
Definition: Utility.inl:134
std::string to_string_version(uint32_t version)
Converts a MADARA uint32_t version number to human-readable.
Definition: Utility.cpp:64
MADARA_EXPORT void strncpy_safe(char *dst, const char *src, size_t dst_size)
Performs a strncpy in a way that will compile without warnings.
Definition: Utility.cpp:376
Copyright(c) 2020 Galois.