X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdevices%2Finputfile.cpp;h=c30bcd33db570d1b56ff219b94928b322dc57924;hp=e92bf208bf17989039bed7b4dbbbbe277f49093f;hb=cda515676ce6c2fa81e1cecacba3ea26ec2ee50e;hpb=dd3fd4df34d129c83f7f5d80ff1e8b998beca63d diff --git a/pv/devices/inputfile.cpp b/pv/devices/inputfile.cpp index e92bf208..c30bcd33 100644 --- a/pv/devices/inputfile.cpp +++ b/pv/devices/inputfile.cpp @@ -36,55 +36,86 @@ InputFile::InputFile(const std::shared_ptr &context, const std::map &options) : File(file_name), context_(context), - input_(format->create_input(options)), - interrupt_(false) { + format_(format), + options_(options), + interrupt_(false) +{ +} + +void InputFile::open() +{ + if (session_) + close(); + else + session_ = context_->create_session(); + + input_ = format_->create_input(options_); + if (!input_) throw QString("Failed to create input"); + + // open() should add the input device to the session but + // we can't open the device without sending some data first + f = new std::ifstream(file_name_, std::ios::binary); + + char buffer[BufferSize]; + f->read(buffer, BufferSize); + const std::streamsize size = f->gcount(); + if (size == 0) + return; + + input_->send(buffer, size); + + try { + device_ = input_->device(); + } catch (sigrok::Error) { + return; + } + + session_->add_device(device_); } -void InputFile::create() { - session_ = context_->create_session(); +void InputFile::close() +{ + if (session_) + session_->remove_devices(); } -void InputFile::start() { +void InputFile::start() +{ } -void InputFile::run() { +void InputFile::run() +{ char buffer[BufferSize]; - bool need_device = true; - assert(session_); - assert(input_); + if (!f) { + // Previous call to run() processed the entire file already + f = new std::ifstream(file_name_, std::ios::binary); + input_->reset(); + } interrupt_ = false; - std::ifstream f(file_name_); - while (!interrupt_ && f) { - f.read(buffer, BufferSize); - const std::streamsize size = f.gcount(); + while (!interrupt_ && !f->eof()) { + f->read(buffer, BufferSize); + const std::streamsize size = f->gcount(); if (size == 0) break; input_->send(buffer, size); - if (need_device) { - try { - device_ = input_->device(); - } catch (sigrok::Error) { - break; - } - - session_->add_device(device_); - need_device = false; - } - if (size != BufferSize) break; } input_->end(); + + delete f; + f = nullptr; } -void InputFile::stop() { +void InputFile::stop() +{ interrupt_ = true; }