#pragma once #include #include #include #include #include namespace IdeviceFFI { using InstallationProxyPtr = std::unique_ptr>; class InstallationProxy { 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, FfiError> get_apps(Option application_type, Option> bundle_identifiers); Result install(std::string package_path, Option options); Result install_with_callback(std::string package_path, Option options, std::function& lambda); Result upgrade(std::string package_path, Option options); Result upgrade_with_callback(std::string package_path, Option options, std::function& lambda); Result uninstall(std::string package_path, Option options); Result uninstall_with_callback(std::string package_path, Option options, std::function& lambda); Result check_capabilities_match(std::vector capabilities, Option options); Result, FfiError> browse(Option options); // RAII / moves ~InstallationProxy() noexcept = default; InstallationProxy(InstallationProxy&&) noexcept = default; InstallationProxy& operator=(InstallationProxy&&) noexcept = default; InstallationProxy(const InstallationProxy&) = delete; InstallationProxy& operator=(const InstallationProxy&) = delete; InstallationProxyClientHandle* raw() const noexcept { return handle_.get(); } static InstallationProxy adopt(InstallationProxyClientHandle* h) noexcept { return InstallationProxy(h); } private: explicit InstallationProxy(InstallationProxyClientHandle* h) noexcept : handle_(h) {} InstallationProxyPtr handle_{}; }; } // namespace IdeviceFFI