From 237c3e226b7c2ac391b0e8d354e5fc6f587a41ba Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sun, 2 Jan 2011 22:17:26 +0100 Subject: Use a filtering_istream with custom filters to chain file -> decoder -> encoder. --- transcode.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'transcode.cpp') diff --git a/transcode.cpp b/transcode.cpp index 249ffb3..5244627 100644 --- a/transcode.cpp +++ b/transcode.cpp @@ -1,20 +1,25 @@ #include "transcode.h" -Transcoder::Transcoder(std::istream& i, HTTPResponse& r, DecoderBase& d, EncoderBase& e) : is(i), res(r), decoder(d), encoder(e) { +#include +#include + +Transcoder::Transcoder(std::string p, HTTPResponse& r, DecoderBase& d, EncoderBase& e) : path(p), res(r), decoder(d), encoder(e) { } void Transcoder::run() { + const std::streamsize buffer_size = 0x1000; + boost::iostreams::file_source is(path, std::ios::in | std::ios::binary); + boost::iostreams::filtering_istream s; + s.push(EncoderFilter(encoder), buffer_size); + s.push(DecoderFilter(decoder), buffer_size); + s.push(is, buffer_size); + char data[0x1000]; - bool encoding_fone = false; - while(!encoding_fone) { - size_t decoded_size = 0; - char decoded_data[0x1000]; - if(is.good()) { - is.read(data, 0x1000); - decoded_size = decoder.decode((uint8_t*)data, is.gcount(), (uint8_t*)decoded_data, 0x1000); - } - char encoded_data[0x1000]; - size_t encoded_size = encoder.encode((uint8_t*)decoded_data, decoded_size, (uint8_t*)encoded_data, 0x1000); - res.write(encoded_data, encoded_size); + std::streamsize size = 1; + while(size) { + s.read(data, 0x1000); + size = s.gcount(); + if(size > 0) + res.write(data, size); } } -- cgit v1.2.3