Exemple #1
0
/* convert record_header2 -> record_header and fetch external body */
void export_record(const record_header2 &hd2, render_buf &output, input_file &input)
{
    record_header hd;
    memcpy(hd.key, hd2.key, sizeof(record_header::key));
    hd.flags = hd2.flags;
    hd.crc = hd2.crc;
    hd.body_size = hd2.body_size;
    output.put(hd);

    if (!hd2.is_body_present) {
        input.set_file_pos(hd2.body_pos);
        file_size_t sz = hd2.body_size;
        while (sz != 0) {
            mem_chunk buf = output.get_free_mem().sub_chunk(0, std::min<file_size_t>(sz, SIZE_MAX));
            if (!input.read(buf)) {
                throw std::runtime_error(
                    format_message(
                        "Data corrupt %s (+%"PRId64")",
                        input.get_file_path().c_str(),
                        input.get_file_pos()));
            }
            output.write(buf);
            sz -= buf.size();
        }
    }
}