Complete ring buffer and direct download support #26
This commit is contained in:
parent
a8f16ab89d
commit
63c1b83f18
@ -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<std::size_t>(
|
||||
utils::divide_with_ceiling(fsi.size, chunk_size))) {}
|
||||
utils::divide_with_ceiling(fsi.size, chunk_size))) {
|
||||
event_system::instance().raise<download_begin>(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<download_end>(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<double>(read_offset + read_size) /
|
||||
static_cast<double>(fsi_.size)) *
|
||||
100.0;
|
||||
event_system::instance().raise<download_progress>(
|
||||
fsi_.api_path, fsi_.source_path, progress);
|
||||
event_system::instance().raise<download_progress>(fsi_.api_path, "",
|
||||
progress);
|
||||
}
|
||||
|
||||
return res;
|
||||
|
@ -83,6 +83,7 @@ ring_buffer_open_file::ring_buffer_open_file(std::string buffer_directory,
|
||||
|
||||
reader_thread_ =
|
||||
std::make_unique<std::thread>([this]() { background_reader_thread(); });
|
||||
event_system::instance().raise<download_begin>(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<download_end>(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<download_chunk_begin>(
|
||||
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<download_chunk_end>(
|
||||
fsi_.api_path, source_path_, chunk, get_read_state().size(),
|
||||
get_read_state().count(), res);
|
||||
|
||||
active_downloads_.erase(chunk);
|
||||
unlock_and_notify();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user