From 63c1b83f18028d59feabbddbd315d8875924dd78 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Mon, 23 Dec 2024 10:04:30 -0600 Subject: [PATCH] Complete ring buffer and direct download support #26 --- .../src/file_manager/direct_open_file.cpp | 15 +++++++++++---- .../src/file_manager/ring_buffer_open_file.cpp | 12 ++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/repertory/librepertory/src/file_manager/direct_open_file.cpp b/repertory/librepertory/src/file_manager/direct_open_file.cpp index 58690ed0..4515b1e9 100644 --- a/repertory/librepertory/src/file_manager/direct_open_file.cpp +++ b/repertory/librepertory/src/file_manager/direct_open_file.cpp @@ -35,14 +35,21 @@ direct_open_file::direct_open_file(std::uint64_t chunk_size, filesystem_item fsi, i_provider &provider) : open_file_base(chunk_size, chunk_timeout, fsi, provider, true), total_chunks_(static_cast( - utils::divide_with_ceiling(fsi.size, chunk_size))) {} + utils::divide_with_ceiling(fsi.size, chunk_size))) { + event_system::instance().raise(fsi_.api_path, "", + api_error::download_stopped); +} direct_open_file::~direct_open_file() { close(); } auto direct_open_file::close() -> bool { stop_requested_ = true; last_progress_ = 0U; - return open_file_base::close(); + auto ret = open_file_base::close(); + + event_system::instance().raise(fsi_.api_path, "", + api_error::download_stopped); + return ret; } auto direct_open_file::read(std::size_t read_size, std::uint64_t read_offset, @@ -71,8 +78,8 @@ auto direct_open_file::read(std::size_t read_size, std::uint64_t read_offset, auto progress = (static_cast(read_offset + read_size) / static_cast(fsi_.size)) * 100.0; - event_system::instance().raise( - fsi_.api_path, fsi_.source_path, progress); + event_system::instance().raise(fsi_.api_path, "", + progress); } return res; 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 bede1aed..b6556609 100644 --- a/repertory/librepertory/src/file_manager/ring_buffer_open_file.cpp +++ b/repertory/librepertory/src/file_manager/ring_buffer_open_file.cpp @@ -83,6 +83,7 @@ ring_buffer_open_file::ring_buffer_open_file(std::string buffer_directory, reader_thread_ = std::make_unique([this]() { background_reader_thread(); }); + event_system::instance().raise(fsi_.api_path, source_path_); } ring_buffer_open_file::~ring_buffer_open_file() { @@ -140,6 +141,9 @@ void ring_buffer_open_file::background_reader_thread() { chunk_lock.lock(); check_and_wait(); } + + event_system::instance().raise(fsi_.api_path, source_path_, + api_error::download_stopped); } auto ring_buffer_open_file::can_handle_file(std::uint64_t file_size, @@ -202,6 +206,10 @@ auto ring_buffer_open_file::download_chunk(std::size_t chunk, bool skip_active) chunk == (total_chunks_ - 1U) ? last_chunk_size_ : chunk_size_, }; + event_system::instance().raise( + fsi_.api_path, source_path_, chunk, get_read_state().size(), + get_read_state().count()); + auto res{ provider_.read_file_bytes(fsi_.api_path, data_size, data_offset, buffer, stop_requested_), @@ -228,6 +236,10 @@ auto ring_buffer_open_file::download_chunk(std::size_t chunk, bool skip_active) : api_error::invalid_ring_buffer_position; } + event_system::instance().raise( + fsi_.api_path, source_path_, chunk, get_read_state().size(), + get_read_state().count(), res); + active_downloads_.erase(chunk); unlock_and_notify();