#pragma once #include #include #include #include #include #include namespace IdeviceFFI { using NotificationProxyPtr = std::unique_ptr>; class NotificationProxy { 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 post_notification(const std::string& name); Result observe_notification(const std::string& name); Result observe_notifications(const std::vector& names); Result receive_notification(); Result receive_notification_with_timeout(u_int64_t interval); // RAII / moves ~NotificationProxy() noexcept = default; NotificationProxy(NotificationProxy&&) noexcept = default; NotificationProxy& operator=(NotificationProxy&&) noexcept = default; NotificationProxy(const NotificationProxy&) = delete; NotificationProxy& operator=(const NotificationProxy&) = delete; NotificationProxyClientHandle* raw() const noexcept { return handle_.get(); } static NotificationProxy adopt(NotificationProxyClientHandle* h) noexcept { return NotificationProxy(h); } private: explicit NotificationProxy(NotificationProxyClientHandle* h) noexcept : handle_(h) {} NotificationProxyPtr handle_{}; }; } // namespace IdeviceFFI