xrpld
Loading...
Searching...
No Matches
WorkFile.h
1#pragma once
2
3#include <xrpld/app/misc/detail/Work.h>
4
5#include <xrpl/basics/ByteUtilities.h>
6#include <xrpl/basics/FileUtilities.h>
7#include <xrpl/beast/utility/instrumentation.h>
8
9#include <boost/asio/bind_executor.hpp>
10#include <boost/asio/io_context.hpp>
11#include <boost/asio/strand.hpp>
12
13#include <functional>
14#include <memory>
15#include <string>
16#include <utility>
17
18namespace xrpl::detail {
19
20// Work with files
21class WorkFile : public Work, public std::enable_shared_from_this<WorkFile>
22{
23protected:
24 using error_code = boost::system::error_code;
25 // Override the definition in Work.h
27
28public:
29 using callback_type = std::function<void(error_code const&, response_type const&)>;
30
31public:
32 WorkFile(std::string path, boost::asio::io_context& ios, callback_type cb);
33 ~WorkFile() override;
34
35 void
36 run() override;
37
38 void
39 cancel() override;
40
41private:
44 boost::asio::io_context& ios_;
45 boost::asio::strand<boost::asio::io_context::executor_type> strand_;
46};
47
48//------------------------------------------------------------------------------
49
50inline WorkFile::WorkFile(std::string path, boost::asio::io_context& ios, callback_type cb)
51 : path_(std::move(path)), cb_(std::move(cb)), ios_(ios), strand_(boost::asio::make_strand(ios))
52{
53}
54
56{
57 if (cb_)
58 cb_(make_error_code(boost::system::errc::interrupted), {});
59}
60
61inline void
63{
64 if (!strand_.running_in_this_thread())
65 {
66 boost::asio::post(ios_, boost::asio::bind_executor(strand_, [self = shared_from_this()] {
67 self->run();
68 }));
69 return;
70 }
71
72 error_code ec;
73 auto const fileContents = getFileContents(ec, path_, megabytes(1));
74
75 XRPL_ASSERT(cb_, "xrpl::detail::WorkFile::run : callback is set");
76 cb_(ec, fileContents);
77 cb_ = nullptr;
78}
79
80inline void
82{
83 // Nothing to do. Either it finished in run, or it didn't start.
84}
85
86} // namespace xrpl::detail
void cancel() override
Definition WorkFile.h:81
std::string path_
Definition WorkFile.h:42
boost::asio::strand< boost::asio::io_context::executor_type > strand_
Definition WorkFile.h:45
std::string response_type
Definition WorkFile.h:26
boost::system::error_code error_code
Definition WorkFile.h:24
std::function< void(error_code const &, response_type const &)> callback_type
Definition WorkFile.h:29
~WorkFile() override
Definition WorkFile.h:55
callback_type cb_
Definition WorkFile.h:43
WorkFile(std::string path, boost::asio::io_context &ios, callback_type cb)
Definition WorkFile.h:50
boost::asio::io_context & ios_
Definition WorkFile.h:44
void run() override
Definition WorkFile.h:62
STL namespace.
std::error_code make_error_code(xrpl::TokenCodecErrc e)
constexpr auto megabytes(T value) noexcept
std::string getFileContents(std::error_code &ec, std::filesystem::path const &sourcePath, std::optional< std::size_t > maxSize=std::nullopt)