#ifndef LLARP_HPP #define LLARP_HPP #include #include #include #include #include #include #include #include #include #include #include #include struct llarp_ev_loop; namespace llarp { class Logic; struct Config; struct RouterContact; namespace thread { class ThreadPool; } struct RuntimeOptions { bool background = false; bool debug = false; bool isRouter = false; }; struct Context { std::unique_ptr crypto = nullptr; std::unique_ptr cryptoManager = nullptr; std::unique_ptr router = nullptr; std::shared_ptr logic = nullptr; std::unique_ptr nodedb = nullptr; llarp_ev_loop_ptr mainloop; std::string nodedb_dir; void Close(); int LoadDatabase(); void Setup(const RuntimeOptions& opts); int Run(const RuntimeOptions& opts); void HandleSignal(int sig); /// Configure given the specified config. /// /// note: consider using std::move() when passing conf in. void Configure(Config conf); bool IsUp() const; bool LooksAlive() const; /// close async void CloseAsync(); /// wait until closed and done void Wait(); /// call a function in logic thread /// return true if queued for calling /// return false if not queued for calling bool CallSafe(std::function f); /// Creates a router. Can be overridden to allow a different class of router /// to be created instead. Defaults to llarp::Router. virtual std::unique_ptr makeRouter( llarp_ev_loop_ptr __netloop, std::shared_ptr logic); protected: std::unique_ptr config = nullptr; private: void SigINT(); std::unique_ptr> closeWaiter; }; } // namespace llarp #endif