// Jackson Coxson #pragma once #include #include #include #include #include #include namespace IdeviceFFI { using CompanionProxyPtr = std::unique_ptr>; class CompanionProxy { 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, FfiError> get_device_registry(); Result start_forwarding_service_port(uint16_t port); Result stop_forwarding_service_port(uint16_t port); // RAII / moves ~CompanionProxy() noexcept = default; CompanionProxy(CompanionProxy&&) noexcept = default; CompanionProxy& operator=(CompanionProxy&&) noexcept = default; CompanionProxy(const CompanionProxy&) = delete; CompanionProxy& operator=(const CompanionProxy&) = delete; CompanionProxyClientHandle* raw() const noexcept { return handle_.get(); } static CompanionProxy adopt(CompanionProxyClientHandle* h) noexcept { return CompanionProxy(h); } private: explicit CompanionProxy(CompanionProxyClientHandle* h) noexcept : handle_(h) {} CompanionProxyPtr handle_{}; }; } // namespace IdeviceFFI