// Jackson Coxson #pragma once #include #include #include #include #include namespace IdeviceFFI { using PreboardServicePtr = std::unique_ptr>; class PreboardService { public: // Factory: connect via Provider static Result connect(Provider& provider); // Factory: connect via RSD tunnel static Result connect_rsd(AdapterHandle* adapter, RsdHandshakeHandle* handshake); // Factory: wrap an existing Idevice socket (consumes it on success) static Result from_socket(Idevice&& socket); // Ops Result create_stashbag(const std::vector& manifest); Result commit_stashbag(const std::vector& manifest); // RAII / moves ~PreboardService() noexcept = default; PreboardService(PreboardService&&) noexcept = default; PreboardService& operator=(PreboardService&&) noexcept = default; PreboardService(const PreboardService&) = delete; PreboardService& operator=(const PreboardService&) = delete; PreboardServiceClientHandle* raw() const noexcept { return handle_.get(); } static PreboardService adopt(PreboardServiceClientHandle* h) noexcept { return PreboardService(h); } private: explicit PreboardService(PreboardServiceClientHandle* h) noexcept : handle_(h) {} PreboardServicePtr handle_{}; }; } // namespace IdeviceFFI