Skip to content

Commit

Permalink
Merge pull request #11 from prusa3d/et_dev
Browse files Browse the repository at this point in the history
Et dev
  • Loading branch information
enricoturri1966 authored Aug 8, 2023
2 parents 54fa0f6 + c1401d6 commit b0b4d8b
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 90 deletions.
55 changes: 26 additions & 29 deletions src/binarize/binarize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ static bool write_to_file(FILE& file, const void* data, size_t data_size)

static bool read_from_file(FILE& file, void* data, size_t data_size)
{
fread(data, 1, data_size, &file);
return !ferror(&file);
const size_t rsize = fread(data, 1, data_size, &file);
return !ferror(&file) && rsize == data_size;
}

static std::vector<uint8_t> encode(const void* data, size_t data_size)
Expand Down Expand Up @@ -378,7 +378,7 @@ EResult BaseMetadataBlock::write(FILE& file, EBlockType block_type, ECompression
if (encoding_type > metadata_encoding_types_count())
return EResult::InvalidMetadataEncodingType;

BlockHeader block_header = { (uint16_t)block_type, (uint16_t)compression_type, (uint32_t)0 };
BlockHeader block_header((uint16_t)block_type, (uint16_t)compression_type, (uint32_t)0);
std::vector<uint8_t> out_data;
if (!raw_data.empty()) {
// process payload encoding
Expand Down Expand Up @@ -561,31 +561,30 @@ EResult PrinterMetadataBlock::read_data(FILE& file, const FileHeader& file_heade
return EResult::Success;
}

EResult ThumbnailBlock::write(FILE& file, EChecksumType checksum_type) const
EResult ThumbnailBlock::write(FILE& file, EChecksumType checksum_type)
{
if (format >= thumbnail_formats_count())
if (params.format >= thumbnail_formats_count())
return EResult::InvalidThumbnailFormat;
if (width == 0)
if (params.width == 0)
return EResult::InvalidThumbnailWidth;
if (height == 0)
if (params.height == 0)
return EResult::InvalidThumbnailHeight;
if (data.size() == 0)
return EResult::InvalidThumbnailDataSize;

// write block header
const BlockHeader block_header = { (uint16_t)EBlockType::Thumbnail, (uint16_t)ECompressionType::None, (uint32_t)data.size() };
const BlockHeader block_header((uint16_t)EBlockType::Thumbnail, (uint16_t)ECompressionType::None, (uint32_t)data.size());
EResult res = block_header.write(file);
if (res != EResult::Success)
// propagate error
return res;

// write block payload
if (!write_to_file(file, (const void*)&format, sizeof(format)))
return EResult::WriteError;
if (!write_to_file(file, (const void*)&width, sizeof(width)))
return EResult::WriteError;
if (!write_to_file(file, (const void*)&height, sizeof(height)))
return EResult::WriteError;
res = params.write(file);
if (res != EResult::Success){
// propagate error
return res;
}

if (!write_to_file(file, (const void*)data.data(), data.size()))
return EResult::WriteError;

Expand All @@ -607,17 +606,15 @@ EResult ThumbnailBlock::write(FILE& file, EChecksumType checksum_type) const
EResult ThumbnailBlock::read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header)
{
// read block payload
if (!read_from_file(file, (void*)&format, sizeof(format)))
return EResult::ReadError;
if (format >= thumbnail_formats_count())
EResult res = params.read(file);
if (res != EResult::Success)
// propagate error
return res;
if (params.format >= thumbnail_formats_count())
return EResult::InvalidThumbnailFormat;
if (!read_from_file(file, (void*)&width, sizeof(width)))
return EResult::ReadError;
if (width == 0)
if (params.width == 0)
return EResult::InvalidThumbnailWidth;
if (!read_from_file(file, (void*)&height, sizeof(height)))
return EResult::ReadError;
if (height == 0)
if (params.height == 0)
return EResult::InvalidThumbnailHeight;
if (block_header.uncompressed_size == 0)
return EResult::InvalidThumbnailDataSize;
Expand All @@ -640,9 +637,9 @@ EResult ThumbnailBlock::read_data(FILE& file, const FileHeader& file_header, con

void ThumbnailBlock::update_checksum(Checksum& checksum) const
{
checksum.append(encode((const void*)&format, sizeof(format)));
checksum.append(encode((const void*)&width, sizeof(width)));
checksum.append(encode((const void*)&height, sizeof(height)));
checksum.append(encode((const void*)&params.format, sizeof(params.format)));
checksum.append(encode((const void*)&params.width, sizeof(params.width)));
checksum.append(encode((const void*)&params.height, sizeof(params.height)));
checksum.append(data);
}

Expand All @@ -651,7 +648,7 @@ EResult GCodeBlock::write(FILE& file, ECompressionType compression_type, EChecks
if (encoding_type > gcode_encoding_types_count())
return EResult::InvalidGCodeEncodingType;

BlockHeader block_header = { (uint16_t)EBlockType::GCode, (uint16_t)compression_type, (uint32_t)0 };
BlockHeader block_header((uint16_t)EBlockType::GCode, (uint16_t)compression_type, (uint32_t)0);
std::vector<uint8_t> out_data;
if (!raw_data.empty()) {
// process payload encoding
Expand Down Expand Up @@ -813,7 +810,7 @@ EResult Binarizer::initialize(FILE& file, const BinarizerConfig& config)
return res;

// save thumbnail blocks
for (const ThumbnailBlock& block : m_binary_data.thumbnails) {
for (ThumbnailBlock& block : m_binary_data.thumbnails) {
res = block.write(*m_file, m_config.checksum);
if (res != EResult::Success)
// propagate error
Expand Down
6 changes: 2 additions & 4 deletions src/binarize/binarize.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,11 @@ struct PrinterMetadataBlock : public BaseMetadataBlock

struct ThumbnailBlock
{
uint16_t format{ 0 };
uint16_t width{ 0 };
uint16_t height{ 0 };
core::ThumbnailParams params;
std::vector<uint8_t> data;

// write block header and data
core::EResult write(FILE& file, core::EChecksumType checksum_type) const;
core::EResult write(FILE& file, core::EChecksumType checksum_type);
// read block data
core::EResult read_data(FILE& file, const core::FileHeader& file_header, const core::BlockHeader& block_header);

Expand Down
14 changes: 7 additions & 7 deletions src/convert/convert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <functional>
#include <charconv>

namespace bgcode {
namespace bgcode {
using namespace core;
using namespace binarize;
namespace convert {
Expand Down Expand Up @@ -361,7 +361,7 @@ BGCODE_CONVERT_EXPORT EResult from_ascii_to_binary(FILE& src_file, FILE& dst_fil
}
if (reading_thumbnail.has_value()) {
ThumbnailBlock& thumbnail = binary_data.thumbnails.emplace_back(ThumbnailBlock());
thumbnail.format = (uint16_t)*reading_thumbnail;
thumbnail.params.format = (uint16_t)*reading_thumbnail;
pos = sv_thumbnail_str.find(" ");
if (pos == std::string_view::npos) {
parse_res = EResult::InvalidAsciiGCodeFile;
Expand All @@ -373,8 +373,8 @@ BGCODE_CONVERT_EXPORT EResult from_ascii_to_binary(FILE& src_file, FILE& dst_fil
parse_res = EResult::InvalidAsciiGCodeFile;
return;
}
thumbnail.width = rect.first;
thumbnail.height = rect.second;
thumbnail.params.width = rect.first;
thumbnail.params.height = rect.second;
const std::string_view sv_data_size_str = trim(sv_thumbnail_str.substr(pos + 1));
size_t data_size;
to_int(sv_data_size_str, data_size);
Expand Down Expand Up @@ -606,14 +606,14 @@ BGCODE_CONVERT_EXPORT EResult from_binary_to_ascii(FILE& src_file, FILE& dst_fil
encoded.resize(boost::beast::detail::base64::encoded_size(thumbnail_block.data.size()));
encoded.resize(boost::beast::detail::base64::encode((void*)encoded.data(), (const void*)thumbnail_block.data.data(), thumbnail_block.data.size()));
std::string format;
switch ((EThumbnailFormat)thumbnail_block.format)
switch ((EThumbnailFormat)thumbnail_block.params.format)
{
default:
case EThumbnailFormat::PNG: { format = "thumbnail"; break; }
case EThumbnailFormat::JPG: { format = "thumbnail_JPG"; break; }
case EThumbnailFormat::QOI: { format = "thumbnail_QOI"; break; }
}
if (!write_line("\n;\n; " + format + " begin " + std::to_string(thumbnail_block.width) + "x" + std::to_string(thumbnail_block.height) +
if (!write_line("\n;\n; " + format + " begin " + std::to_string(thumbnail_block.params.width) + "x" + std::to_string(thumbnail_block.params.height) +
" " + std::to_string(encoded.length()) + "\n"))
return EResult::WriteError;
while (encoded.size() > max_row_length) {
Expand Down Expand Up @@ -661,7 +661,7 @@ BGCODE_CONVERT_EXPORT EResult from_binary_to_ascii(FILE& src_file, FILE& dst_fil

if (!write_line("\n"))
return EResult::WriteError;
res = skip_block_content(src_file, file_header, block_header);
res = skip_block(src_file, file_header, block_header);
if (res != EResult::Success)
// propagate error
return res;
Expand Down
68 changes: 53 additions & 15 deletions src/core/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ static bool write_to_file(FILE& file, const void* data, size_t data_size)

static bool read_from_file(FILE& file, void* data, size_t data_size)
{
fread(data, 1, data_size, &file);
return !ferror(&file);
const size_t rsize = fread(data, 1, data_size, &file);
return !ferror(&file) && rsize == data_size;
}

static uint32_t crc32_sw(const uint8_t* buffer, uint32_t length, uint32_t crc)
Expand Down Expand Up @@ -67,7 +67,7 @@ static EResult checksums_match(FILE& file, const FileHeader& file_header, const
// propagate error
return res;

// Verify checksum
// Verify checksum
if (!curr_cs.matches(read_cs))
return EResult::InvalidChecksum;

Expand Down Expand Up @@ -192,6 +192,13 @@ EResult FileHeader::read(FILE& file, const uint32_t* const max_version)
return EResult::Success;
}

BlockHeader::BlockHeader(uint16_t type, uint16_t compression, uint32_t uncompressed_size, uint32_t compressed_size)
: type(type)
, compression(compression)
, uncompressed_size(uncompressed_size)
, compressed_size(compressed_size)
{}

void BlockHeader::update_checksum(Checksum& checksum) const
{
checksum.append(encode((const void*)&type, sizeof(type)));
Expand All @@ -201,8 +208,14 @@ void BlockHeader::update_checksum(Checksum& checksum) const
checksum.append(encode((const void*)&compressed_size, sizeof(compressed_size)));
}

long BlockHeader::get_position() const
{
return m_position;
}

EResult BlockHeader::write(FILE& file) const
{
m_position = ftell(&file);
if (!write_to_file(file, (const void*)&type, sizeof(type)))
return EResult::WriteError;
if (!write_to_file(file, (const void*)&compression, sizeof(compression)))
Expand All @@ -218,6 +231,7 @@ EResult BlockHeader::write(FILE& file) const

EResult BlockHeader::read(FILE& file)
{
m_position = ftell(&file);
if (!read_from_file(file, (void*)&type, sizeof(type)))
return EResult::ReadError;
if (type >= block_types_count())
Expand All @@ -238,6 +252,30 @@ EResult BlockHeader::read(FILE& file)
return EResult::Success;
}

size_t BlockHeader::get_size() const {
return sizeof(type) + sizeof(compression) + sizeof(uncompressed_size) + ((compression == (uint16_t)ECompressionType::None)? 0 : sizeof(compressed_size));
}

EResult ThumbnailParams::write(FILE& file) const {
if (!write_to_file(file, (const void*)&format, sizeof(format)))
return EResult::WriteError;
if (!write_to_file(file, (const void*)&width, sizeof(width)))
return EResult::WriteError;
if (!write_to_file(file, (const void*)&height, sizeof(height)))
return EResult::WriteError;
return EResult::Success;
}

EResult ThumbnailParams::read(FILE& file){
if (!read_from_file(file, (void*)&format, sizeof(format)))
return EResult::ReadError;
if (!read_from_file(file, (void*)&width, sizeof(width)))
return EResult::ReadError;
if (!read_from_file(file, (void*)&height, sizeof(height)))
return EResult::ReadError;
return EResult::Success;
}

BGCODE_CORE_EXPORT size_t get_checksum_max_cache_size() { return g_checksum_max_cache_size; }
BGCODE_CORE_EXPORT void set_checksum_max_cache_size(size_t size) { g_checksum_max_cache_size = size; }

Expand Down Expand Up @@ -284,8 +322,8 @@ BGCODE_CORE_EXPORT EResult is_valid_binary_gcode(FILE& file, bool check_contents

// check magic number
std::array<uint8_t, 4> magic;
fread((void*)magic.data(), 1, magic.size(), &file);
if (ferror(&file))
const size_t rsize = fread((void*)magic.data(), 1, magic.size(), &file);
if (ferror(&file) && rsize != magic.size())
return EResult::ReadError;
else if (magic != MAGIC) {
// restore file position
Expand Down Expand Up @@ -324,7 +362,7 @@ BGCODE_CORE_EXPORT EResult is_valid_binary_gcode(FILE& file, bool check_contents
}

// read printer metadata block header
res = skip_block_content(file, file_header, block_header);
res = skip_block(file, file_header, block_header);
if (res != EResult::Success) {
// restore file position
fseek(&file, curr_pos, SEEK_SET);
Expand All @@ -345,7 +383,7 @@ BGCODE_CORE_EXPORT EResult is_valid_binary_gcode(FILE& file, bool check_contents
}

// read thumbnails block headers, if present
res = skip_block_content(file, file_header, block_header);
res = skip_block(file, file_header, block_header);
if (res != EResult::Success) {
// restore file position
fseek(&file, curr_pos, SEEK_SET);
Expand All @@ -360,7 +398,7 @@ BGCODE_CORE_EXPORT EResult is_valid_binary_gcode(FILE& file, bool check_contents
return res;
}
while ((EBlockType)block_header.type == EBlockType::Thumbnail) {
res = skip_block_content(file, file_header, block_header);
res = skip_block(file, file_header, block_header);
if (res != EResult::Success) {
// restore file position
fseek(&file, curr_pos, SEEK_SET);
Expand All @@ -384,7 +422,7 @@ BGCODE_CORE_EXPORT EResult is_valid_binary_gcode(FILE& file, bool check_contents
}

// read slicer metadata block header
res = skip_block_content(file, file_header, block_header);
res = skip_block(file, file_header, block_header);
if (res != EResult::Success) {
// restore file position
fseek(&file, curr_pos, SEEK_SET);
Expand All @@ -406,7 +444,7 @@ BGCODE_CORE_EXPORT EResult is_valid_binary_gcode(FILE& file, bool check_contents

// read gcode block headers
do {
res = skip_block_content(file, file_header, block_header);
res = skip_block(file, file_header, block_header);
if (res != EResult::Success) {
// restore file position
fseek(&file, curr_pos, SEEK_SET);
Expand Down Expand Up @@ -484,7 +522,7 @@ BGCODE_CORE_EXPORT EResult read_next_block_header(FILE& file, const FileHeader&
}

if (!feof(&file)) {
res = skip_block_content(file, file_header, block_header);
res = skip_block(file, file_header, block_header);
if (res != EResult::Success)
// propagate error
return res;
Expand All @@ -508,15 +546,15 @@ BGCODE_CORE_EXPORT size_t block_parameters_size(EBlockType type)
return 0;
}

BGCODE_CORE_EXPORT EResult skip_block_payload(FILE& file, const BlockHeader& block_header)
BGCODE_CORE_EXPORT EResult skip_block_content(FILE& file, const FileHeader& file_header, const BlockHeader& block_header)
{
fseek(&file, (long)block_payload_size(block_header), SEEK_CUR);
fseek(&file, (long)block_content_size(file_header, block_header), SEEK_CUR);
return ferror(&file) ? EResult::ReadError : EResult::Success;
}

BGCODE_CORE_EXPORT EResult skip_block_content(FILE& file, const FileHeader& file_header, const BlockHeader& block_header)
BGCODE_CORE_EXPORT EResult skip_block(FILE& file, const FileHeader& file_header, const BlockHeader& block_header)
{
fseek(&file, (long)block_content_size(file_header, block_header), SEEK_CUR);
fseek(&file, block_header.get_position() + (long)block_header.get_size() + (long)block_content_size(file_header, block_header), SEEK_SET);
return ferror(&file) ? EResult::ReadError : EResult::Success;
}

Expand Down
Loading

0 comments on commit b0b4d8b

Please sign in to comment.