Represents a file being transmitted or received.
More...
#include <File.h>
Represents a file being transmitted or received.
Definition at line 30 of file File.h.
◆ File() [1/3]
Create a file from an FDT entry (used for reception)
- Parameters
-
Definition at line 36 of file File.cpp.
37 : _meta( std::move(entry) )
38 , _received_at( time(
nullptr) )
41 spdlog::debug(
"Creating File from FileEntry");
43 spdlog::debug(
"Allocating buffer");
45 if (_buffer ==
nullptr)
47 throw "Failed to allocate file buffer";
51 this->calculate_partitioning();
52 this->create_blocks();
◆ File() [2/3]
Create a file from a Transmitter::FileDescription (used for transmission)
- Parameters
-
Definition at line 55 of file File.cpp.
57 , _file_description(file_description)
59 spdlog::debug(
"Creating File from FileDescription");
61 auto length = _file_description->data_length();
62 _buffer = (
char*)malloc(
length);
63 if (_buffer ==
nullptr)
65 throw "No data allocated";
68 memcpy(_buffer, _file_description->data(),
length);
69 _meta = _file_description->file_entry();
75 throw "Unsupported FEC scheme";
80 calculate_partitioning();
size_t length() const
Get the data buffer length.
void encode()
Encode the buffer using the Content-Encoding.
◆ File() [3/3]
| LibFlute::File::File |
( |
uint32_t |
toi, |
|
|
FecOti |
fec_oti, |
|
|
std::string |
content_location, |
|
|
std::string |
content_type, |
|
|
uint64_t |
expires, |
|
|
char * |
data, |
|
|
size_t |
length, |
|
|
bool |
copy_data = false |
|
) |
| |
Create a file from the given parameters (used for transmission)
- Parameters
-
| toi | TOI of the file |
| content_location | Content location URI to use |
| content_type | MIME type |
| expires | Expiry value (in seconds since the NTP epoch) |
| data | Pointer to the data buffer |
| length | Length of the buffer |
| copy_data | Copy the buffer. If false (the default), the caller must ensure the buffer remains valid while the file is being transmitted. |
Definition at line 84 of file File.cpp.
96 spdlog::debug(
"Creating File from data");
98 spdlog::debug(
"Allocating buffer");
99 _buffer = (
char*)malloc(
length);
100 if (_buffer ==
nullptr)
102 throw "Failed to allocate file buffer";
104 memcpy(_buffer, data,
length);
110 unsigned char md5[MD5_DIGEST_LENGTH];
111 MD5((
const unsigned char*)data,
length, md5);
117 _meta.
content_md5 = base64_encode(md5, MD5_DIGEST_LENGTH);
125 throw "Unsupported FEC scheme";
128 this->calculate_partitioning();
129 this->create_blocks();
const FecOti & fec_oti() const
Get the FEC OTI values.
std::string content_location
◆ ~File()
| LibFlute::File::~File |
( |
| ) |
|
|
virtual |
Default destructor.
Definition at line 132 of file File.cpp.
134 spdlog::debug(
"Destroying File");
135 if (_own_buffer && _buffer !=
nullptr)
137 spdlog::debug(
"Freeing buffer");
◆ access_count()
| unsigned LibFlute::File::access_count |
( |
| ) |
const |
|
inline |
Get the access counter value.
Definition at line 132 of file File.h.
132 {
return _access_count; };
◆ buffer()
| char* LibFlute::File::buffer |
( |
| ) |
const |
|
inline |
Get the data buffer.
Definition at line 85 of file File.h.
◆ complete()
| bool LibFlute::File::complete |
( |
| ) |
const |
|
inline |
Check if the file is complete.
Definition at line 80 of file File.h.
80 {
return _complete; };
◆ decode()
| auto LibFlute::File::decode |
( |
| ) |
|
Decode the buffer using the Content-Encoding.
Will check the MD5 sum after decoding, if present.
Definition at line 329 of file File.cpp.
333 auto comp_buffer = _buffer;
334 bool own_comp = _own_buffer;
335 std::shared_ptr<unsigned char> decomp_buffer(
new unsigned char[16384]);
337 .next_in =
reinterpret_cast<unsigned char*
>(comp_buffer),
339 .next_out = decomp_buffer.get(),
346 auto zstate = inflate(&zs, Z_FINISH);
348 while (zstate == Z_OK) {
349 spdlog::debug(
"Part decompressed: {} bytes", 16384-zs.avail_out);
350 _buffer =
reinterpret_cast<char*
>(realloc(_buffer, zs.total_out));
351 memcpy(_buffer+last_out, decomp_buffer.get(), 16384-zs.avail_out);
352 last_out = zs.total_out;
354 zs.avail_out = 16384;
355 zs.next_out = decomp_buffer.get();
356 zstate = inflate(&zs, Z_FINISH);
358 if (zstate==Z_STREAM_END) {
359 if (last_out != zs.total_out) {
360 spdlog::debug(
"Finish decompress, last block is {} bytes. Total {} bytes", 16384-zs.avail_out, zs.total_out);
361 _buffer =
reinterpret_cast<char*
>(realloc(_buffer, zs.total_out));
362 memcpy(_buffer+last_out, decomp_buffer.get(), 16384-zs.avail_out);
368 spdlog::error(
"Decompressed length does not match expected Content-Length ({} != {})", _meta.
content_length, zs.total_out);
371 spdlog::error(
"Error decompressing file {}: {}", _meta.
toi, zs.msg);
375 if (own_comp) free(comp_buffer);
378 throw "Content-Encoding not known";
381 _been_decoded =
true;
382 _been_encoded =
false;
386 unsigned char md5[MD5_DIGEST_LENGTH];
389 auto content_md5 = base64_decode(_meta.
content_md5);
390 if (memcmp(md5, content_md5.c_str(), MD5_DIGEST_LENGTH) != 0) {
391 spdlog::debug(
"MD5 mismatch for TOI {}, discarding", _meta.
toi);
394 for (
auto& block : _source_blocks) {
395 for (
auto& symbol : block.second.symbols) {
396 symbol.second.complete =
false;
398 block.second.complete =
false;
char * buffer() const
Get the data buffer.
std::string content_encoding
◆ encode()
| auto LibFlute::File::encode |
( |
| ) |
|
Encode the buffer using the Content-Encoding.
Definition at line 274 of file File.cpp.
278 auto decomp_buffer = _buffer;
279 bool own_decomp = _own_buffer;
280 std::shared_ptr<unsigned char> comp_buffer(
new unsigned char[16384]);
282 .next_in =
reinterpret_cast<unsigned char*
>(decomp_buffer),
284 .next_out = comp_buffer.get(),
289 if (deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY) == Z_OK) {
291 auto zstate = deflate(&zs, Z_FINISH);
293 while (zstate == Z_OK) {
294 spdlog::debug(
"Part compressed: {} bytes", 16384-zs.avail_out);
295 _buffer =
reinterpret_cast<char*
>(realloc(_buffer, zs.total_out));
296 memcpy(_buffer+last_out, comp_buffer.get(), 16384-zs.avail_out);
297 last_out = zs.total_out;
299 zs.avail_out = 16384;
300 zs.next_out = comp_buffer.get();
301 zstate = inflate(&zs, Z_FINISH);
303 if (zstate==Z_STREAM_END) {
304 if (last_out != zs.total_out) {
305 spdlog::debug(
"Finish compress, last block is {} bytes. Total {} bytes", 16384-zs.avail_out, zs.total_out);
306 _buffer =
reinterpret_cast<char*
>(realloc(_buffer, zs.total_out));
307 memcpy(_buffer+last_out, comp_buffer.get(), 16384-zs.avail_out);
312 spdlog::error(
"Error compressing file {}: {}", _meta.
toi, zs.msg);
317 if (own_decomp) free(decomp_buffer);
321 throw "Content-Encoding not known";
324 _been_encoded =
true;
325 _been_decoded =
false;
◆ fdt_instance_id()
| uint16_t LibFlute::File::fdt_instance_id |
( |
| ) |
|
|
inline |
Get the FDT instance ID.
Definition at line 152 of file File.h.
152 {
return _fdt_instance_id; };
◆ fec_oti()
| const FecOti& LibFlute::File::fec_oti |
( |
| ) |
const |
|
inline |
Get the FEC OTI values.
Definition at line 112 of file File.h.
◆ get_next_symbols()
| auto LibFlute::File::get_next_symbols |
( |
size_t |
max_size | ) |
|
Get the next encoding symbols that fit in max_size bytes.
Definition at line 233 of file File.cpp.
237 std::vector<EncodingSymbol> symbols;
239 for (
auto& block : _source_blocks) {
240 if (cnt >= nof_symbols)
break;
242 if (!block.second.complete) {
243 for (
auto& symbol : block.second.symbols) {
244 if (cnt >= nof_symbols)
break;
246 if (!symbol.second.complete && !symbol.second.queued) {
247 symbols.emplace_back(symbol.first, block.first, symbol.second.data, symbol.second.length, _meta.
fec_oti.
encoding_id);
248 symbol.second.queued =
true;
uint32_t encoding_symbol_length
◆ is_encoded()
| bool LibFlute::File::is_encoded |
( |
| ) |
const |
|
inline |
Check if the buffer is content encoded.
Definition at line 107 of file File.h.
107 {
return _been_encoded || !_been_decoded; };
◆ length()
| size_t LibFlute::File::length |
( |
| ) |
const |
|
inline |
Get the data buffer length.
Definition at line 90 of file File.h.
◆ log_access()
| void LibFlute::File::log_access |
( |
| ) |
|
|
inline |
Log access to the file by incrementing a counter.
Definition at line 127 of file File.h.
127 { _access_count++; };
◆ mark_completed()
| auto LibFlute::File::mark_completed |
( |
const std::vector< EncodingSymbol > & |
symbols, |
|
|
bool |
success |
|
) |
| |
Mark encoding symbols as completed.
Definition at line 258 of file File.cpp.
260 for (
auto& symbol : symbols) {
261 auto block = _source_blocks.find(symbol.source_block_number());
262 if (block != _source_blocks.end()) {
263 auto sym = block->second.symbols.find(symbol.id());
264 if (sym != block->second.symbols.end()) {
265 sym->second.queued =
false;
266 sym->second.complete = success;
268 check_source_block_completion(block->second);
269 check_file_completion();
◆ meta()
Get the file metadata from its FDT entry.
Definition at line 117 of file File.h.
◆ put_symbol()
Write the data from an encoding symbol into the appropriate place in the buffer.
Definition at line 142 of file File.cpp.
144 if (symbol.source_block_number() > _source_blocks.size()) {
145 throw "Source Block number too high";
148 SourceBlock& source_block = _source_blocks[ symbol.source_block_number() ];
150 if (symbol.id() > source_block.symbols.size()) {
151 throw "Encoding Symbol ID too high";
154 SourceBlock::Symbol& target_symbol = source_block.symbols[symbol.id()];
156 if (!target_symbol.complete) {
157 symbol.decode_to(target_symbol.data, target_symbol.length);
158 target_symbol.complete =
true;
160 check_source_block_completion(source_block);
161 check_file_completion();
◆ received_at()
| unsigned long LibFlute::File::received_at |
( |
| ) |
const |
|
inline |
Timestamp of file reception.
Definition at line 122 of file File.h.
122 {
return _received_at; };
◆ set_fdt_instance_id()
| void LibFlute::File::set_fdt_instance_id |
( |
uint16_t |
id | ) |
|
|
inline |
Set the FDT instance ID.
Definition at line 147 of file File.h.
147 { _fdt_instance_id = id; };
The documentation for this class was generated from the following files: