#pragma once #include #include #include #include #include #include namespace IdeviceFFI { using LockdownPtr = std::unique_ptr>; class Lockdown { 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 start_session(const PairingFile& pf); Result, FfiError> start_service(const std::string& identifier); Result get_value(const char* key, const char* domain); // RAII / moves ~Lockdown() noexcept = default; Lockdown(Lockdown&&) noexcept = default; Lockdown& operator=(Lockdown&&) noexcept = default; Lockdown(const Lockdown&) = delete; Lockdown& operator=(const Lockdown&) = delete; LockdowndClientHandle* raw() const noexcept { return handle_.get(); } static Lockdown adopt(LockdowndClientHandle* h) noexcept { return Lockdown(h); } private: explicit Lockdown(LockdowndClientHandle* h) noexcept : handle_(h) {} LockdownPtr handle_{}; }; } // namespace IdeviceFFI