X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffile_group.cc;h=5cfe021192ec9d3adf86150280fd849dab4fa98d;hb=276a8f49c94cc80a7b29d5ecd8c7584e7ddcd87c;hp=5f9531f4cceef1c3503f8ac7851e155acf6c611d;hpb=5a999debb53087de8188603ea9b9d928b2293978;p=dcpomatic.git diff --git a/src/lib/file_group.cc b/src/lib/file_group.cc index 5f9531f4c..5cfe02119 100644 --- a/src/lib/file_group.cc +++ b/src/lib/file_group.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2014 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,25 +17,39 @@ */ +/** @file src/lib/file_group.cc + * @brief FileGroup class. + */ + #include -extern "C" { -#include -} #include #include "file_group.h" #include "exceptions.h" +#include "cross.h" +#include using std::vector; using std::cout; +/** Construct a FileGroup with no files */ +FileGroup::FileGroup () + : _current_path (0) + , _current_file (0) +{ + +} + +/** Construct a FileGroup with a single file */ FileGroup::FileGroup (boost::filesystem::path p) : _current_path (0) , _current_file (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) @@ -45,6 +59,7 @@ FileGroup::FileGroup (vector const & p) seek (0, SEEK_SET); } +/** Destroy a FileGroup, closing any open file */ FileGroup::~FileGroup () { if (_current_file) { @@ -52,6 +67,13 @@ FileGroup::~FileGroup () } } +void +FileGroup::set_paths (vector const & p) +{ + _paths = p; + ensure_open_path (0); + seek (0, SEEK_SET); +} /** Ensure that the given path index in the content is the _current_file */ void @@ -61,13 +83,13 @@ FileGroup::ensure_open_path (size_t p) const /* Already open */ return; } - + if (_current_file) { fclose (_current_file); } _current_path = p; - _current_file = fopen (_paths[_current_path].string().c_str(), "rb"); + _current_file = fopen_boost (_paths[_current_path], "rb"); if (_current_file == 0) { throw OpenFileError (_paths[_current_path]); } @@ -76,8 +98,6 @@ FileGroup::ensure_open_path (size_t p) const int64_t FileGroup::seek (int64_t pos, int whence) const { - int64_t const len = length (); - /* Convert pos to `full_pos', which is an offset from the start of all the files. */ @@ -90,14 +110,16 @@ FileGroup::seek (int64_t pos, int whence) const for (size_t i = 0; i < _current_path; ++i) { full_pos += boost::filesystem::file_size (_paths[i]); } +#ifdef DCPOMATIC_WINDOWS + full_pos += _ftelli64 (_current_file); +#else full_pos += ftell (_current_file); +#endif full_pos += pos; break; case SEEK_END: - full_pos = len - pos; + full_pos = length() - pos; break; - case AVSEEK_SIZE: - return len; } /* Seek to full_pos */ @@ -117,7 +139,7 @@ FileGroup::seek (int64_t pos, int whence) const } ensure_open_path (i); - fseek (_current_file, sub_pos, SEEK_SET); + dcpomatic_fseek (_current_file, sub_pos, SEEK_SET); return full_pos; } @@ -130,7 +152,7 @@ int FileGroup::read (uint8_t* buffer, int amount) const { int read = 0; - while (1) { + while (true) { int const this_time = fread (buffer + read, 1, amount - read, _current_file); read += this_time; if (read == amount) { @@ -148,6 +170,7 @@ FileGroup::read (uint8_t* buffer, int amount) const return read; } +/** @return Combined length of all the files */ int64_t FileGroup::length () const {