Implement input validation

This commit is contained in:
2018-11-20 14:28:47 +01:00
parent 554734659a
commit f78c7a2a21
2 changed files with 52 additions and 16 deletions
+47 -10
View File
@@ -1,3 +1,7 @@
#include <iostream>
#include <stdexcept>
#include "date.h"
#include "MetadataBuffer.hpp"
using namespace std;
@@ -7,25 +11,47 @@ MetadataBuffer::MetadataBuffer(uint64_t n_images, shared_ptr<unordered_map<strin
{
if (header_values_type) {
for (const auto& header_type : *header_values_type) {
auto& name = header_type.first;
auto& header_data_type = header_type.second;
auto& name = header_type.first;
auto& header_data_type = header_type.second;
size_t bytes_size_per_frame = header_data_type.value_shape * header_data_type.value_bytes_size;
size_t buffer_size_bytes = n_images * bytes_size_per_frame;
size_t bytes_size_per_frame = header_data_type.value_shape * header_data_type.value_bytes_size;
size_t buffer_size_bytes = n_images * bytes_size_per_frame;
shared_ptr<char> buffer(new char[buffer_size_bytes], std::default_delete<char[]>());
metadata_buffer.insert({name, buffer});
metadata_length_bytes.insert({name, bytes_size_per_frame});
}
shared_ptr<char> buffer(new char[buffer_size_bytes], std::default_delete<char[]>());
metadata_buffer.insert({name, buffer});
metadata_length_bytes.insert({name, bytes_size_per_frame});
}
}
}
void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, const char* data)
{
if (frame_index >= n_images) {
stringstream error_message;
using namespace date;
error_message << "[" << std::chrono::system_clock::now() << "] ";
error_message << "Requested frame_index " << frame_index << " ";
error_message << "for metadata " << name << " in metadata buffer is out of range. ";
error_message << "Number of available slots: " << n_images << endl;
throw runtime_error(error_message.str());
}
auto metadata = metadata_buffer.find(name);
if (metadata == metadata_buffer.end()) {
stringstream error_message;
using namespace date;
error_message << "[" << std::chrono::system_clock::now() << "] ";
error_message << "Cannot add data to metadata buffer because '" << name << "' is not declared."<< endl;
throw runtime_error(error_message.str());
}
size_t bytes_size_per_frame = metadata_length_bytes.at(name);
size_t buffer_offset = frame_index * bytes_size_per_frame;
char* buffer = (metadata_buffer.at(name)).get();
char* buffer = metadata->second.get();
buffer += buffer_offset;
memcpy(buffer, data, bytes_size_per_frame);
@@ -33,5 +59,16 @@ void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, c
shared_ptr<char> MetadataBuffer::get_metadata_values(string name)
{
return metadata_buffer.at(name);
auto metadata = metadata_buffer.find(name);
if (metadata == metadata_buffer.end()) {
stringstream error_message;
using namespace date;
error_message << "[" << std::chrono::system_clock::now() << "] ";
error_message << "Cannot get data from metadata buffer because '" << name << "' is not declared."<< endl;
throw runtime_error(error_message.str());
}
return metadata->second;
}
+5 -6
View File
@@ -6,20 +6,19 @@
#include "ZmqReceiver.hpp"
class MetadataBuffer
{
const uint64_t n_images;
const std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> header_values_type;
protected:
std::unordered_map<std::string, std::shared_ptr<char>> metadata_buffer;
std::unordered_map<std::string, size_t> metadata_length_bytes;
std::unordered_map<std::string, std::shared_ptr<char>> metadata_buffer;
std::unordered_map<std::string, size_t> metadata_length_bytes;
public:
MetadataBuffer(uint64_t n_images, std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> header_values_type);
void add_metadata_to_buffer(std::string name, uint64_t frame_index, const char* data);
std::shared_ptr<char> get_metadata_values(std::string name);
MetadataBuffer(uint64_t n_images, std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> header_values_type);
void add_metadata_to_buffer(std::string name, uint64_t frame_index, const char* data);
std::shared_ptr<char> get_metadata_values(std::string name);
};
#endif