#ifndef DEVICEREATTACHER_H #define DEVICEREATTACHER_H #include #include #include #include #include #include #include #include #include #include namespace smo { namespace device { class DeviceManager; class DeviceReattacher { public: DeviceReattacher( DeviceManager& parent, std::shared_ptr ioThread); ~DeviceReattacher() = default; DeviceReattacher(const DeviceReattacher&) = delete; DeviceReattacher& operator=(const DeviceReattacher&) = delete; // Control methods void start(); void stop(); private: void scheduleNextTimeout(); void onTimeout(const boost::system::error_code& error); void holdReattachCReq(); mrntt::MrnttNonViralPostingInvoker reattachKnownListCReq( std::exception_ptr &exceptionPtr, std::function callback); DeviceManager &parent; std::shared_ptr ioThread; sscl::SyncCancelerForAsyncWork deviceReattacherCanceler; boost::asio::deadline_timer timer; std::exception_ptr reattachLifetimeExceptionPtr; std::optional reattachCReqInvoker; bool reattachOpInFlight = false; std::chrono::steady_clock::time_point lastReattachReqTimestamp{}; }; } // namespace device } // namespace smo #endif // DEVICEREATTACHER_H