diff --git a/repertory/librepertory/include/file_manager/direct_open_file.hpp b/repertory/librepertory/include/file_manager/direct_open_file.hpp new file mode 100644 index 00000000..85137acb --- /dev/null +++ b/repertory/librepertory/include/file_manager/direct_open_file.hpp @@ -0,0 +1,97 @@ +/* + Copyright <2018-2024> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef REPERTORY_INCLUDE_FILE_MANAGER_DIRECT_OPEN_FILE_HPP_ +#define REPERTORY_INCLUDE_FILE_MANAGER_DIRECT_OPEN_FILE_HPP_ + +#include "file_manager/open_file_base.hpp" + +#include "types/repertory.hpp" + +namespace repertory { +class i_provider; +class i_upload_manager; + +class direct_open_file final : public open_file_base { +public: + direct_open_file(std::uint64_t chunk_size, std::uint8_t chunk_timeout, + filesystem_item fsi, i_provider &provider); + + ~direct_open_file() override = default; + +public: + direct_open_file() = delete; + direct_open_file(const direct_open_file &) noexcept = delete; + direct_open_file(direct_open_file &&) noexcept = delete; + auto operator=(direct_open_file &&) noexcept -> direct_open_file & = delete; + auto + operator=(const direct_open_file &) noexcept -> direct_open_file & = delete; + +protected: + [[nodiscard]] auto is_download_complete() const -> bool override { + return false; + } + +public: + [[nodiscard]] auto is_complete() const -> bool override { return true; } + + [[nodiscard]] auto is_write_supported() const -> bool override { + return false; + } + + [[nodiscard]] auto + get_read_state() const -> boost::dynamic_bitset<> override { + return {}; + } + + [[nodiscard]] auto + get_read_state(std::size_t /* chunk */) const -> bool override { + return false; + } + + [[nodiscard]] auto native_operation(native_operation_callback /* callback */) + -> api_error override { + return api_error::not_supported; + } + + [[nodiscard]] auto native_operation(std::uint64_t /* new_file_size */, + native_operation_callback /*callback*/) + -> api_error override { + return api_error::not_supported; + } + + [[nodiscard]] auto read(std::size_t read_size, std::uint64_t read_offset, + data_buffer &data) -> api_error override; + + [[nodiscard]] auto resize(std::uint64_t /*size*/) -> api_error override { + return api_error::not_supported; + } + + void set_api_path(const std::string &api_path) override; + + [[nodiscard]] auto write(std::uint64_t, const data_buffer &, + std::size_t &) -> api_error override { + return api_error::not_supported; + } +}; +} // namespace repertory + +#endif // REPERTORY_INCLUDE_FILE_MANAGER_DIRECT_OPEN_FILE_HPP_ diff --git a/repertory/librepertory/include/file_manager/open_file.hpp b/repertory/librepertory/include/file_manager/open_file.hpp index 9ab94d42..d181b96c 100644 --- a/repertory/librepertory/include/file_manager/open_file.hpp +++ b/repertory/librepertory/include/file_manager/open_file.hpp @@ -98,7 +98,7 @@ public: [[nodiscard]] auto is_complete() const -> bool override; - auto is_write_supported() const -> bool override { return true; } + [[nodiscard]] auto is_write_supported() const -> bool override { return true; } [[nodiscard]] auto native_operation(native_operation_callback callback) -> api_error override; diff --git a/repertory/librepertory/include/file_manager/open_file_base.hpp b/repertory/librepertory/include/file_manager/open_file_base.hpp index 65549fca..2ba05ebb 100644 --- a/repertory/librepertory/include/file_manager/open_file_base.hpp +++ b/repertory/librepertory/include/file_manager/open_file_base.hpp @@ -130,7 +130,7 @@ private: protected: [[nodiscard]] auto do_io(std::function action) -> api_error; - virtual auto is_download_complete() const -> bool = 0; + [[nodiscard]] virtual auto is_download_complete() const -> bool = 0; void reset_timeout(); @@ -157,17 +157,17 @@ public: [[nodiscard]] auto get_handles() const -> std::vector override; - [[nodiscard]] auto get_open_data() - -> std::map & override; + [[nodiscard]] auto + get_open_data() -> std::map & override; [[nodiscard]] auto get_open_data() const -> const std::map & override; - [[nodiscard]] auto get_open_data(std::uint64_t handle) - -> open_file_data & override; + [[nodiscard]] auto + get_open_data(std::uint64_t handle) -> open_file_data & override; - [[nodiscard]] auto get_open_data(std::uint64_t handle) const - -> const open_file_data & override; + [[nodiscard]] auto + get_open_data(std::uint64_t handle) const -> const open_file_data & override; [[nodiscard]] auto get_open_file_count() const -> std::size_t override; diff --git a/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp b/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp index 5c5a35f1..ac1e0055 100644 --- a/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp +++ b/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp @@ -46,8 +46,8 @@ public: ring_buffer_open_file() = delete; ring_buffer_open_file(const ring_buffer_open_file &) noexcept = delete; ring_buffer_open_file(ring_buffer_open_file &&) noexcept = delete; - auto operator=(ring_buffer_open_file &&) noexcept - -> ring_buffer_open_file & = delete; + auto operator=(ring_buffer_open_file &&) noexcept -> ring_buffer_open_file & = + delete; auto operator=(const ring_buffer_open_file &) noexcept -> ring_buffer_open_file & = delete; @@ -72,7 +72,9 @@ private: void reverse_reader_thread(std::size_t count); protected: - auto is_download_complete() const -> bool override; + [[nodiscard]] auto is_download_complete() const -> bool override { + return false; + } public: void forward(std::size_t count); @@ -99,10 +101,12 @@ public: [[nodiscard]] auto is_complete() const -> bool override { return true; } - auto is_write_supported() const -> bool override { return false; } + [[nodiscard]] auto is_write_supported() const -> bool override { + return false; + } - [[nodiscard]] auto native_operation(native_operation_callback callback) - -> api_error override; + [[nodiscard]] auto + native_operation(native_operation_callback callback) -> api_error override; [[nodiscard]] auto native_operation(std::uint64_t, native_operation_callback) -> api_error override { @@ -122,8 +126,8 @@ public: void set_api_path(const std::string &api_path) override; - [[nodiscard]] auto write(std::uint64_t, const data_buffer &, std::size_t &) - -> api_error override { + [[nodiscard]] auto write(std::uint64_t, const data_buffer &, + std::size_t &) -> api_error override { return api_error::not_supported; } }; diff --git a/repertory/librepertory/src/file_manager/direct_open_file.cpp b/repertory/librepertory/src/file_manager/direct_open_file.cpp new file mode 100644 index 00000000..867856b7 --- /dev/null +++ b/repertory/librepertory/src/file_manager/direct_open_file.cpp @@ -0,0 +1,60 @@ +/* + Copyright <2018-2024> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#include "file_manager/direct_open_file.hpp" + +#include "app_config.hpp" +#include "file_manager/open_file_base.hpp" +#include "providers/i_provider.hpp" +#include "types/repertory.hpp" +#include "utils/common.hpp" + +namespace repertory { +direct_open_file::direct_open_file(std::uint64_t chunk_size, + std::uint8_t chunk_timeout, + filesystem_item fsi, i_provider &provider) + : open_file_base(chunk_size, chunk_timeout, fsi, provider) {} + +auto direct_open_file::read(std::size_t read_size, std::uint64_t read_offset, + data_buffer &data) -> api_error { + if (fsi_.directory) { + return api_error::invalid_operation; + } + + reset_timeout(); + + read_size = utils::calculate_read_size(fsi_.size, read_size, read_offset); + if (read_size == 0U) { + return api_error::success; + } + + stop_type stop_requested{false}; + auto res = provider_.read_file_bytes(fsi_.api_path, read_size, read_offset, + data, stop_requested); + reset_timeout(); + + return res; +} + +void direct_open_file::set_api_path(const std::string &api_path) { + open_file_base::set_api_path(api_path); +} +} // namespace repertory diff --git a/repertory/librepertory/src/file_manager/file_manager.cpp b/repertory/librepertory/src/file_manager/file_manager.cpp index 0dbfe659..f0cfdb09 100644 --- a/repertory/librepertory/src/file_manager/file_manager.cpp +++ b/repertory/librepertory/src/file_manager/file_manager.cpp @@ -403,12 +403,25 @@ auto file_manager::open( } if (not closeable_file) { - closeable_file = std::make_shared( - utils::encryption::encrypting_reader::get_data_chunk_size(), - config_.get_enable_download_timeout() - ? config_.get_download_timeout_secs() - : 0U, - fsi, provider_, *this); + auto type = config_.get_preferred_download_type(); + auto chunk_timeout = config_.get_enable_download_timeout() + ? config_.get_download_timeout_secs() + : 0U; + switch (type) { + // case repertory::download_type::direct: + case repertory::download_type::ring_buffer: { + closeable_file = std::make_shared( + utils::path::combine(config_.get_data_directory(), {"buffer"}), + utils::encryption::encrypting_reader::get_data_chunk_size(), + chunk_timeout, fsi, provider_); + } break; + + default: { + closeable_file = std::make_shared( + utils::encryption::encrypting_reader::get_data_chunk_size(), + chunk_timeout, fsi, provider_, *this); + } break; + } } open_file_lookup_[api_path] = closeable_file; create_and_add_handle(closeable_file); diff --git a/repertory/librepertory/src/file_manager/ring_buffer_open_file.cpp b/repertory/librepertory/src/file_manager/ring_buffer_open_file.cpp index 5ab23358..8cea1495 100644 --- a/repertory/librepertory/src/file_manager/ring_buffer_open_file.cpp +++ b/repertory/librepertory/src/file_manager/ring_buffer_open_file.cpp @@ -194,10 +194,6 @@ auto ring_buffer_open_file::get_read_state(std::size_t chunk) const -> bool { return not ring_state_[chunk % ring_state_.size()]; } -auto ring_buffer_open_file::is_download_complete() const -> bool { - return false; -} - auto ring_buffer_open_file::native_operation( i_open_file::native_operation_callback callback) -> api_error { return do_io([&]() -> api_error { return callback(nf_->get_handle()); });