#ifndef LLARP_HPP #define LLARP_HPP #include #include #include #include #include #include namespace llarp { namespace vpn { class Platform; } class EventLoop; struct Config; struct RouterContact; struct Config; struct Crypto; struct CryptoManager; struct AbstractRouter; class NodeDB; namespace thread { class ThreadPool; } struct RuntimeOptions { bool showBanner = true; bool debug = false; bool isSNode = false; }; struct Context { std::shared_ptr crypto = nullptr; std::shared_ptr cryptoManager = nullptr; std::shared_ptr router = nullptr; std::shared_ptr loop = nullptr; std::shared_ptr nodedb = nullptr; Context(); virtual ~Context() = default; void Setup(const RuntimeOptions& opts); int Run(const RuntimeOptions& opts); void HandleSignal(int sig); /// Configure given the specified config. void Configure(std::shared_ptr conf); /// handle SIGHUP void Reload(); bool IsUp() const; bool LooksAlive() const; bool IsStopping() 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::shared_ptr makeRouter(const std::shared_ptr& loop); /// create the nodedb given our current configs virtual std::shared_ptr makeNodeDB(); /// create the vpn platform for use in creating network interfaces virtual std::shared_ptr makeVPNPlatform(); int androidFD = -1; protected: std::shared_ptr config = nullptr; private: void SigINT(); void Close(); std::unique_ptr> closeWaiter; }; } // namespace llarp #endif