#ifndef LLARP_HPP #define LLARP_HPP #include #include #include #include #include #include #include #include #include struct llarp_ev_loop; struct llarp_nodedb; struct llarp_nodedb_iter; struct llarp_main; #ifdef LOKINET_HIVE namespace tooling { struct RouterHive; } // namespace tooling #endif namespace llarp { class Logic; struct AbstractRouter; struct Config; struct Crypto; struct CryptoManager; struct RouterContact; namespace thread { class ThreadPool; } struct Context { /// get context from main pointer static std::shared_ptr Get(llarp_main*); Context() = default; std::unique_ptr crypto; std::unique_ptr cryptoManager; std::unique_ptr router; std::shared_ptr worker; std::shared_ptr logic; std::unique_ptr config; std::unique_ptr nodedb; llarp_ev_loop_ptr mainloop; std::string nodedb_dir; bool LoadConfig(const std::string& fname, bool isRelay); void Close(); int LoadDatabase(); int Setup(); int Run(llarp_main_runtime_opts opts); void HandleSignal(int sig); bool Configure(bool isRelay, std::optional dataDir); 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); #ifdef LOKINET_HIVE void InjectHive(tooling::RouterHive* hive); #endif private: void SigINT(); std::string configfile; std::unique_ptr> closeWaiter; }; } // namespace llarp #endif