// Jackson Coxson #pragma once #include #include #include #include #include #include #include namespace IdeviceFFI { using RestoreServicePtr = std::unique_ptr>; class RestoreService { public: // Factory: connect via RSD tunnel static Result connect_rsd(AdapterHandle* adapter, RsdHandshakeHandle* handshake); // Factory: from ReadWrite stream (RSD-only, consumes the pointer) static Result from_readwrite_ptr(ReadWriteOpaque* consumed); // Ergonomic overload: consume a C++ ReadWrite static Result from_readwrite(ReadWrite&& rw); // Ops Result enter_recovery(); Result reboot(); Result get_preflightinfo(); Result get_nonces(); Result get_app_parameters(); Result restore_lang(const std::string& language); // RAII / moves ~RestoreService() noexcept = default; RestoreService(RestoreService&&) noexcept = default; RestoreService& operator=(RestoreService&&) noexcept = default; RestoreService(const RestoreService&) = delete; RestoreService& operator=(const RestoreService&) = delete; RestoreServiceClientHandle* raw() const noexcept { return handle_.get(); } static RestoreService adopt(RestoreServiceClientHandle* h) noexcept { return RestoreService(h); } private: explicit RestoreService(RestoreServiceClientHandle* h) noexcept : handle_(h) {} RestoreServicePtr handle_{}; }; } // namespace IdeviceFFI