// Jackson Coxson #pragma once #include #include #include #include #include #include namespace IdeviceFFI { using DiagnosticsRelayPtr = std::unique_ptr>; class DiagnosticsRelay { 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); // API Methods - queries returning optional plist Result, FfiError> ioregistry(Option current_plane, Option entry_name, Option entry_class) const; Result, FfiError> mobilegestalt(Option> keys) const; Result, FfiError> gasguage() const; Result, FfiError> nand() const; Result, FfiError> all() const; Result, FfiError> wifi() const; // API Methods - actions Result restart(); Result shutdown(); Result sleep(); Result goodbye(); // RAII / moves ~DiagnosticsRelay() noexcept = default; DiagnosticsRelay(DiagnosticsRelay&&) noexcept = default; DiagnosticsRelay& operator=(DiagnosticsRelay&&) noexcept = default; DiagnosticsRelay(const DiagnosticsRelay&) = delete; DiagnosticsRelay& operator=(const DiagnosticsRelay&) = delete; DiagnosticsRelayClientHandle* raw() const noexcept { return handle_.get(); } static DiagnosticsRelay adopt(DiagnosticsRelayClientHandle* h) noexcept { return DiagnosticsRelay(h); } private: explicit DiagnosticsRelay(DiagnosticsRelayClientHandle* h) noexcept : handle_(h) {} DiagnosticsRelayPtr handle_{}; }; } // namespace IdeviceFFI