#pragma once #include #include #include #include #include namespace IdeviceFFI { using HeartbeatPtr = std::unique_ptr>; class Heartbeat { public: // Factory: connect via Provider static Result connect(Provider& provider); // Factory: wrap an existing Idevice socket (consumes it on success) static Result from_socket(Idevice&& socket); // Ops Result send_polo(); Result get_marco(u_int64_t interval); // RAII / moves ~Heartbeat() noexcept = default; Heartbeat(Heartbeat&&) noexcept = default; Heartbeat& operator=(Heartbeat&&) noexcept = default; Heartbeat(const Heartbeat&) = delete; Heartbeat& operator=(const Heartbeat&) = delete; HeartbeatClientHandle* raw() const noexcept { return handle_.get(); } static Heartbeat adopt(HeartbeatClientHandle* h) noexcept { return Heartbeat(h); } private: explicit Heartbeat(HeartbeatClientHandle* h) noexcept : handle_(h) {} HeartbeatPtr handle_{}; }; } // namespace IdeviceFFI