X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffile_group.cc;h=71faacc4c0fa6bd27667c761c873ddce42d4ec88;hb=182b9d2e2feb6545592868606aaf0f0146095481;hp=aaf94acf4b17a2eaf25595ba61fe9c4d5d964ed4;hpb=cf26869c2789b7ecf91e486fc3c7bf271276a592;p=dcpomatic.git diff --git a/src/lib/file_group.cc b/src/lib/file_group.cc index aaf94acf4..71faacc4c 100644 --- a/src/lib/file_group.cc +++ b/src/lib/file_group.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2020 Carl Hetherington + Copyright (C) 2013-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,58 +18,48 @@ */ + /** @file src/lib/file_group.cc * @brief FileGroup class. */ -#include "file_group.h" -#include "exceptions.h" -#include "cross.h" + #include "compose.hpp" +#include "cross.h" #include "dcpomatic_assert.h" +#include "exceptions.h" +#include "file_group.h" #include #include + using std::vector; + /** Construct a FileGroup with no files */ FileGroup::FileGroup () - : _current_path (0) - , _current_file (0) - , _current_size (0) - , _position (0) { } + /** Construct a FileGroup with a single file */ FileGroup::FileGroup (boost::filesystem::path p) - : _current_path (0) - , _current_file (0) - , _current_size (0) { _paths.push_back (p); ensure_open_path (0); seek (0, SEEK_SET); } + /** Construct a FileGroup with multiple files */ FileGroup::FileGroup (vector const & p) : _paths (p) - , _current_path (0) - , _current_file (0) { ensure_open_path (0); seek (0, SEEK_SET); } -/** Destroy a FileGroup, closing any open file */ -FileGroup::~FileGroup () -{ - if (_current_file) { - fclose (_current_file); - } -} void FileGroup::set_paths (vector const & p) @@ -79,6 +69,7 @@ FileGroup::set_paths (vector const & p) seek (0, SEEK_SET); } + /** Ensure that the given path index in the content is the _current_file */ void FileGroup::ensure_open_path (size_t p) const @@ -89,17 +80,18 @@ FileGroup::ensure_open_path (size_t p) const } if (_current_file) { - fclose (_current_file); + _current_file->close(); } _current_path = p; - _current_file = fopen_boost (_paths[_current_path], "rb"); - if (_current_file == 0) { + _current_file = dcp::File(_paths[_current_path], "rb"); + if (!_current_file) { throw OpenFileError (_paths[_current_path], errno, OpenFileError::READ); } _current_size = boost::filesystem::file_size (_paths[_current_path]); } + int64_t FileGroup::seek (int64_t pos, int whence) const { @@ -129,15 +121,16 @@ FileGroup::seek (int64_t pos, int whence) const if (i < _paths.size()) { ensure_open_path (i); - dcpomatic_fseek (_current_file, sub_pos, SEEK_SET); + _current_file->seek(sub_pos, SEEK_SET); } else { ensure_open_path (_paths.size() - 1); - dcpomatic_fseek (_current_file, _current_size, SEEK_SET); + _current_file->seek(_current_size, SEEK_SET); } return _position; } + /** Try to read some data from the current position into a buffer. * @param buffer Buffer to write data into. * @param amount Number of bytes to read. @@ -146,6 +139,8 @@ FileGroup::seek (int64_t pos, int whence) const int FileGroup::read (uint8_t* buffer, int amount) const { + DCPOMATIC_ASSERT (_current_file); + int read = 0; while (true) { @@ -154,8 +149,7 @@ FileGroup::read (uint8_t* buffer, int amount) const DCPOMATIC_ASSERT (_current_file); -#ifdef DCPOMATIC_WINDOWS - int64_t const current_position = _ftelli64 (_current_file); + auto const current_position = _current_file->tell(); if (current_position == -1) { to_read = 0; eof = true; @@ -163,15 +157,8 @@ FileGroup::read (uint8_t* buffer, int amount) const to_read = _current_size - current_position; eof = true; } -#else - long const current_position = ftell(_current_file); - if ((current_position + to_read) > _current_size) { - to_read = _current_size - current_position; - eof = true; - } -#endif - int const this_time = fread (buffer + read, 1, to_read, _current_file); + int const this_time = _current_file->read(buffer + read, 1, to_read); read += this_time; _position += this_time; if (read == amount) { @@ -179,7 +166,7 @@ FileGroup::read (uint8_t* buffer, int amount) const break; } - if (ferror(_current_file)) { + if (_current_file->error()) { throw FileError (String::compose("fread error %1", errno), _paths[_current_path]); } @@ -195,6 +182,7 @@ FileGroup::read (uint8_t* buffer, int amount) const return read; } + /** @return Combined length of all the files */ int64_t FileGroup::length () const