X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdevices%2Finputfile.cpp;h=58c60d700bbd25375222b20f09c7f35a41097e3a;hp=3ddc8ae00db06042b97f5e10f599560b3d69b22b;hb=6f925ba9d6faf1077b73c5a5808259576081716a;hpb=2ad82c2e40b6865481733913a2c32735602f63c4 diff --git a/pv/devices/inputfile.cpp b/pv/devices/inputfile.cpp index 3ddc8ae0..58c60d70 100644 --- a/pv/devices/inputfile.cpp +++ b/pv/devices/inputfile.cpp @@ -14,8 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ #include @@ -25,30 +24,61 @@ #include "inputfile.hpp" +using std::map; +using std::shared_ptr; +using std::streamsize; +using std::string; +using std::ifstream; +using std::ios; + namespace pv { namespace devices { -const std::streamsize InputFile::BufferSize = 16384; +const streamsize InputFile::BufferSize = 16384; -InputFile::InputFile(const std::shared_ptr &context, - const std::string &file_name, - std::shared_ptr format, - const std::map &options) : +InputFile::InputFile(const shared_ptr &context, + const string &file_name, + shared_ptr format, + const map &options) : File(file_name), context_(context), - input_(format->create_input(options)), + format_(format), + options_(options), interrupt_(false) { - if (!input_) - throw QString("Failed to create input"); } void InputFile::open() { if (session_) close(); + else + session_ = context_->create_session(); - 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 ifstream(file_name_, ios::binary); + + char buffer[BufferSize]; + f->read(buffer, BufferSize); + const 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::close() @@ -64,37 +94,30 @@ void InputFile::start() 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 ifstream(file_name_, 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 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()