diff options
author | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2012-09-04 15:51:15 +0200 |
---|---|---|
committer | Sjoerd Simons <sjoerd@luon.net> | 2012-09-04 15:51:15 +0200 |
commit | 22aa4b33d975e3c487445813f186fbc0fd2a24cf (patch) | |
tree | 629c7bdc7b56ac44bd462e0dc51dc42ad5a2e12f | |
parent | 5401c83973d059e5ea223eecc3f455e0c1d829ab (diff) |
Add a small dbus interface with the current status of calls
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/echo-call-info-dbus.c | 1884 | ||||
-rw-r--r-- | src/echo-call-info-dbus.h | 297 | ||||
-rw-r--r-- | src/echo-call-info.xml | 7 | ||||
-rw-r--r-- | src/echo-call.c | 64 |
6 files changed, 2257 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac index b2d7352..30e805a 100644 --- a/configure.ac +++ b/configure.ac @@ -35,8 +35,9 @@ AS_COMPILER_FLAG(-Wno-unused-parameter, wno_unused_parameter=yes, wno_unused_parameter=no) -dnl Check for Glib -PKG_CHECK_MODULES(GLIB, gobject-2.0 >= 2.30 glib-2.0 >= 2.30 gio-2.0) +dnl Check for Glib and friends +PKG_CHECK_MODULES(GLIB, gobject-2.0 >= 2.30 glib-2.0 >= 2.30 + gio-2.0 gio-unix-2.0) AC_DEFINE(GLIB_VERSION_MIN_REQUIRED, GLIB_VERSION_2_30, [Ignore post 2.30 deprecations]) AC_DEFINE(GLIB_VERSION_MAX_ALLOWED, GLIB_VERSION_2_30, [Prevent post 2.30 APIs]) diff --git a/src/Makefile.am b/src/Makefile.am index 5ca11d6..ec54e30 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,8 @@ EXTRA_DIST = \ approver.py \ echo-text.py \ phoenix.py \ - util.py + util.py \ + echo-call-info.xml libexec_PROGRAMS = phoenix-authenticator phoenix-echo-call @@ -10,7 +11,8 @@ phoenix_authenticator_SOURCES = authenticator.c phoenix_authenticator_CFLAGS = @GLIB_CFLAGS@ @TP_GLIB_CFLAGS@ phoenix_authenticator_LDFLAGS = @GLIB_LIBS@ @TP_GLIB_LIBS@ -phoenix_echo_call_SOURCES = echo-call.c +phoenix_echo_call_SOURCES = echo-call.c \ + echo-call-info-dbus.c echo-call-info-dbus.h phoenix_echo_call_CFLAGS = @GLIB_CFLAGS@ @TP_GLIB_CFLAGS@ \ @TP_FARSTREAM_CFLAGS@ phoenix_echo_call_LDFLAGS = @GLIB_LIBS@ @TP_GLIB_LIBS@ \ diff --git a/src/echo-call-info-dbus.c b/src/echo-call-info-dbus.c new file mode 100644 index 0000000..38789f5 --- /dev/null +++ b/src/echo-call-info-dbus.c @@ -0,0 +1,1884 @@ +/* + * Generated by gdbus-codegen 2.33.8. DO NOT EDIT. + * + * The license of this code is the same as for the source it was derived from. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "echo-call-info-dbus.h" + +#include <string.h> +#ifdef G_OS_UNIX +# include <gio/gunixfdlist.h> +#endif + +typedef struct +{ + GDBusArgInfo parent_struct; + gboolean use_gvariant; +} _ExtendedGDBusArgInfo; + +typedef struct +{ + GDBusMethodInfo parent_struct; + const gchar *signal_name; + gboolean pass_fdlist; +} _ExtendedGDBusMethodInfo; + +typedef struct +{ + GDBusSignalInfo parent_struct; + const gchar *signal_name; +} _ExtendedGDBusSignalInfo; + +typedef struct +{ + GDBusPropertyInfo parent_struct; + const gchar *hyphen_name; + gboolean use_gvariant; +} _ExtendedGDBusPropertyInfo; + +typedef struct +{ + GDBusInterfaceInfo parent_struct; + const gchar *hyphen_name; +} _ExtendedGDBusInterfaceInfo; + +typedef struct +{ + const _ExtendedGDBusPropertyInfo *info; + guint prop_id; + GValue orig_value; /* the value before the change */ +} ChangedProperty; + +static void +_changed_property_free (ChangedProperty *data) +{ + g_value_unset (&data->orig_value); + g_free (data); +} + +static gboolean +_g_strv_equal0 (gchar **a, gchar **b) +{ + gboolean ret = FALSE; + guint n; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + if (g_strv_length (a) != g_strv_length (b)) + goto out; + for (n = 0; a[n] != NULL; n++) + if (g_strcmp0 (a[n], b[n]) != 0) + goto out; + ret = TRUE; +out: + return ret; +} + +static gboolean +_g_variant_equal0 (GVariant *a, GVariant *b) +{ + gboolean ret = FALSE; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + ret = g_variant_equal (a, b); +out: + return ret; +} + +G_GNUC_UNUSED static gboolean +_g_value_equal (const GValue *a, const GValue *b) +{ + gboolean ret = FALSE; + g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); + switch (G_VALUE_TYPE (a)) + { + case G_TYPE_BOOLEAN: + ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); + break; + case G_TYPE_UCHAR: + ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); + break; + case G_TYPE_INT: + ret = (g_value_get_int (a) == g_value_get_int (b)); + break; + case G_TYPE_UINT: + ret = (g_value_get_uint (a) == g_value_get_uint (b)); + break; + case G_TYPE_INT64: + ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); + break; + case G_TYPE_UINT64: + ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); + break; + case G_TYPE_DOUBLE: + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } + break; + case G_TYPE_STRING: + ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); + break; + case G_TYPE_VARIANT: + ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); + break; + default: + if (G_VALUE_TYPE (a) == G_TYPE_STRV) + ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); + else + g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a))); + break; + } + return ret; +} + +/* ------------------------------------------------------------------------ + * Code for interface org.freedesktop.Telepathy.Phoenix.CallInfo + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:EciCallInfo + * @title: EciCallInfo + * @short_description: Generated C code for the org.freedesktop.Telepathy.Phoenix.CallInfo D-Bus interface + * + * This section contains code for working with the <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link> D-Bus interface in C. + */ + +/* ---- Introspection data for org.freedesktop.Telepathy.Phoenix.CallInfo ---- */ + +static const _ExtendedGDBusPropertyInfo _eci_call_info_property_info_channel = +{ + { + -1, + (gchar *) "Channel", + (gchar *) "o", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL + }, + "channel", + FALSE +}; + +static const _ExtendedGDBusPropertyInfo _eci_call_info_property_info_receiving_video = +{ + { + -1, + (gchar *) "ReceivingVideo", + (gchar *) "b", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL + }, + "receiving-video", + FALSE +}; + +static const _ExtendedGDBusPropertyInfo _eci_call_info_property_info_receiving_audio = +{ + { + -1, + (gchar *) "ReceivingAudio", + (gchar *) "b", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL + }, + "receiving-audio", + FALSE +}; + +static const _ExtendedGDBusPropertyInfo * const _eci_call_info_property_info_pointers[] = +{ + &_eci_call_info_property_info_channel, + &_eci_call_info_property_info_receiving_video, + &_eci_call_info_property_info_receiving_audio, + NULL +}; + +static const _ExtendedGDBusInterfaceInfo _eci_call_info_interface_info = +{ + { + -1, + (gchar *) "org.freedesktop.Telepathy.Phoenix.CallInfo", + NULL, + NULL, + (GDBusPropertyInfo **) &_eci_call_info_property_info_pointers, + NULL + }, + "call-info", +}; + + +/** + * eci_call_info_interface_info: + * + * Gets a machine-readable description of the <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link> D-Bus interface. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + */ +GDBusInterfaceInfo * +eci_call_info_interface_info (void) +{ + return (GDBusInterfaceInfo *) &_eci_call_info_interface_info.parent_struct; +} + +/** + * eci_call_info_override_properties: + * @klass: The class structure for a #GObject<!-- -->-derived class. + * @property_id_begin: The property id to assign to the first overridden property. + * + * Overrides all #GObject properties in the #EciCallInfo interface for a concrete class. + * The properties are overridden in the order they are defined. + * + * Returns: The last property id. + */ +guint +eci_call_info_override_properties (GObjectClass *klass, guint property_id_begin) +{ + g_object_class_override_property (klass, property_id_begin++, "channel"); + g_object_class_override_property (klass, property_id_begin++, "receiving-video"); + g_object_class_override_property (klass, property_id_begin++, "receiving-audio"); + return property_id_begin - 1; +} + + + +/** + * EciCallInfo: + * + * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link>. + */ + +/** + * EciCallInfoIface: + * @parent_iface: The parent interface. + * @get_channel: Getter for the #EciCallInfo:channel property. + * @get_receiving_audio: Getter for the #EciCallInfo:receiving-audio property. + * @get_receiving_video: Getter for the #EciCallInfo:receiving-video property. + * + * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link>. + */ + +static void +eci_call_info_default_init (EciCallInfoIface *iface) +{ + /* GObject properties for D-Bus properties: */ + /** + * EciCallInfo:channel: + * + * Represents the D-Bus property <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.Channel">"Channel"</link>. + * + * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("channel", "Channel", "Channel", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * EciCallInfo:receiving-video: + * + * Represents the D-Bus property <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.ReceivingVideo">"ReceivingVideo"</link>. + * + * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. + */ + g_object_interface_install_property (iface, + g_param_spec_boolean ("receiving-video", "ReceivingVideo", "ReceivingVideo", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * EciCallInfo:receiving-audio: + * + * Represents the D-Bus property <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.ReceivingAudio">"ReceivingAudio"</link>. + * + * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side. + */ + g_object_interface_install_property (iface, + g_param_spec_boolean ("receiving-audio", "ReceivingAudio", "ReceivingAudio", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +typedef EciCallInfoIface EciCallInfoInterface; +G_DEFINE_INTERFACE (EciCallInfo, eci_call_info, G_TYPE_OBJECT); + +/** + * eci_call_info_get_channel: (skip) + * @object: A #EciCallInfo. + * + * Gets the value of the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.Channel">"Channel"</link> D-Bus property. + * + * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. + * + * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use eci_call_info_dup_channel() if on another thread.</warning> + * + * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object. + */ +const gchar * +eci_call_info_get_channel (EciCallInfo *object) +{ + return ECI_CALL_INFO_GET_IFACE (object)->get_channel (object); +} + +/** + * eci_call_info_dup_channel: (skip) + * @object: A #EciCallInfo. + * + * Gets a copy of the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.Channel">"Channel"</link> D-Bus property. + * + * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. + * + * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free(). + */ +gchar * +eci_call_info_dup_channel (EciCallInfo *object) +{ + gchar *value; + g_object_get (G_OBJECT (object), "channel", &value, NULL); + return value; +} + +/** + * eci_call_info_set_channel: (skip) + * @object: A #EciCallInfo. + * @value: The value to set. + * + * Sets the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.Channel">"Channel"</link> D-Bus property to @value. + * + * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. + */ +void +eci_call_info_set_channel (EciCallInfo *object, const gchar *value) +{ + g_object_set (G_OBJECT (object), "channel", value, NULL); +} + +/** + * eci_call_info_get_receiving_video: (skip) + * @object: A #EciCallInfo. + * + * Gets the value of the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.ReceivingVideo">"ReceivingVideo"</link> D-Bus property. + * + * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. + * + * Returns: The property value. + */ +gboolean +eci_call_info_get_receiving_video (EciCallInfo *object) +{ + return ECI_CALL_INFO_GET_IFACE (object)->get_receiving_video (object); +} + +/** + * eci_call_info_set_receiving_video: (skip) + * @object: A #EciCallInfo. + * @value: The value to set. + * + * Sets the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.ReceivingVideo">"ReceivingVideo"</link> D-Bus property to @value. + * + * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. + */ +void +eci_call_info_set_receiving_video (EciCallInfo *object, gboolean value) +{ + g_object_set (G_OBJECT (object), "receiving-video", value, NULL); +} + +/** + * eci_call_info_get_receiving_audio: (skip) + * @object: A #EciCallInfo. + * + * Gets the value of the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.ReceivingAudio">"ReceivingAudio"</link> D-Bus property. + * + * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side. + * + * Returns: The property value. + */ +gboolean +eci_call_info_get_receiving_audio (EciCallInfo *object) +{ + return ECI_CALL_INFO_GET_IFACE (object)->get_receiving_audio (object); +} + +/** + * eci_call_info_set_receiving_audio: (skip) + * @object: A #EciCallInfo. + * @value: The value to set. + * + * Sets the <link linkend="gdbus-property-org-freedesktop-Telepathy-Phoenix-CallInfo.ReceivingAudio">"ReceivingAudio"</link> D-Bus property to @value. + * + * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side. + */ +void +eci_call_info_set_receiving_audio (EciCallInfo *object, gboolean value) +{ + g_object_set (G_OBJECT (object), "receiving-audio", value, NULL); +} + +/* ------------------------------------------------------------------------ */ + +/** + * EciCallInfoProxy: + * + * The #EciCallInfoProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * EciCallInfoProxyClass: + * @parent_class: The parent class. + * + * Class structure for #EciCallInfoProxy. + */ + +struct _EciCallInfoProxyPrivate +{ + GData *qdata; +}; + +static void eci_call_info_proxy_iface_init (EciCallInfoIface *iface); + +G_DEFINE_TYPE_WITH_CODE (EciCallInfoProxy, eci_call_info_proxy, G_TYPE_DBUS_PROXY, + G_IMPLEMENT_INTERFACE (ECI_TYPE_CALL_INFO, eci_call_info_proxy_iface_init)); + +static void +eci_call_info_proxy_finalize (GObject *object) +{ + EciCallInfoProxy *proxy = ECI_CALL_INFO_PROXY (object); + g_datalist_clear (&proxy->priv->qdata); + G_OBJECT_CLASS (eci_call_info_proxy_parent_class)->finalize (object); +} + +static void +eci_call_info_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + const _ExtendedGDBusPropertyInfo *info; + GVariant *variant; + g_assert (prop_id != 0 && prop_id - 1 < 3); + info = _eci_call_info_property_info_pointers[prop_id - 1]; + variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name); + if (info->use_gvariant) + { + g_value_set_variant (value, variant); + } + else + { + if (variant != NULL) + g_dbus_gvariant_to_gvalue (variant, value); + } + if (variant != NULL) + g_variant_unref (variant); +} + +static void +eci_call_info_proxy_set_property_cb (GDBusProxy *proxy, + GAsyncResult *res, + gpointer user_data) +{ + const _ExtendedGDBusPropertyInfo *info = user_data; + GError *error; + error = NULL; + if (!g_dbus_proxy_call_finish (proxy, res, &error)) + { + g_warning ("Error setting property `%s' on interface org.freedesktop.Telepathy.Phoenix.CallInfo: %s (%s, %d)", + info->parent_struct.name, + error->message, g_quark_to_string (error->domain), error->code); + g_error_free (error); + } +} + +static void +eci_call_info_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + const _ExtendedGDBusPropertyInfo *info; + GVariant *variant; + g_assert (prop_id != 0 && prop_id - 1 < 3); + info = _eci_call_info_property_info_pointers[prop_id - 1]; + variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_dbus_proxy_call (G_DBUS_PROXY (object), + "org.freedesktop.DBus.Properties.Set", + g_variant_new ("(ssv)", "org.freedesktop.Telepathy.Phoenix.CallInfo", info->parent_struct.name, variant), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, (GAsyncReadyCallback) eci_call_info_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct); + g_variant_unref (variant); +} + +static void +eci_call_info_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters) +{ + _ExtendedGDBusSignalInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint n; + guint signal_id; + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_eci_call_info_interface_info.parent_struct, signal_name); + if (info == NULL) + return; + num_params = g_variant_n_children (parameters); + paramv = g_new0 (GValue, num_params + 1); + g_value_init (¶mv[0], ECI_TYPE_CALL_INFO); + g_value_set_object (¶mv[0], proxy); + g_variant_iter_init (&iter, parameters); + n = 1; + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, ECI_TYPE_CALL_INFO); + g_signal_emitv (paramv, signal_id, 0, NULL); + for (n = 0; n < num_params + 1; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static void +eci_call_info_proxy_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties) +{ + EciCallInfoProxy *proxy = ECI_CALL_INFO_PROXY (_proxy); + guint n; + const gchar *key; + GVariantIter *iter; + _ExtendedGDBusPropertyInfo *info; + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_eci_call_info_interface_info.parent_struct, key); + g_datalist_remove_data (&proxy->priv->qdata, key); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } + g_variant_iter_free (iter); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_eci_call_info_interface_info.parent_struct, invalidated_properties[n]); + g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } +} + +static const gchar * +eci_call_info_proxy_get_channel (EciCallInfo *object) +{ + EciCallInfoProxy *proxy = ECI_CALL_INFO_PROXY (object); + GVariant *variant; + const gchar *value = NULL; + variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Channel"); + if (variant != NULL) + { + value = g_variant_get_string (variant, NULL); + g_variant_unref (variant); + } + return value; +} + +static gboolean +eci_call_info_proxy_get_receiving_video (EciCallInfo *object) +{ + EciCallInfoProxy *proxy = ECI_CALL_INFO_PROXY (object); + GVariant *variant; + gboolean value = 0; + variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "ReceivingVideo"); + if (variant != NULL) + { + value = g_variant_get_boolean (variant); + g_variant_unref (variant); + } + return value; +} + +static gboolean +eci_call_info_proxy_get_receiving_audio (EciCallInfo *object) +{ + EciCallInfoProxy *proxy = ECI_CALL_INFO_PROXY (object); + GVariant *variant; + gboolean value = 0; + variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "ReceivingAudio"); + if (variant != NULL) + { + value = g_variant_get_boolean (variant); + g_variant_unref (variant); + } + return value; +} + +static void +eci_call_info_proxy_init (EciCallInfoProxy *proxy) +{ + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, ECI_TYPE_CALL_INFO_PROXY, EciCallInfoProxyPrivate); + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), eci_call_info_interface_info ()); +} + +static void +eci_call_info_proxy_class_init (EciCallInfoProxyClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + g_type_class_add_private (klass, sizeof (EciCallInfoProxyPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = eci_call_info_proxy_finalize; + gobject_class->get_property = eci_call_info_proxy_get_property; + gobject_class->set_property = eci_call_info_proxy_set_property; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = eci_call_info_proxy_g_signal; + proxy_class->g_properties_changed = eci_call_info_proxy_g_properties_changed; + + + eci_call_info_override_properties (gobject_class, 1); +} + +static void +eci_call_info_proxy_iface_init (EciCallInfoIface *iface) +{ + iface->get_channel = eci_call_info_proxy_get_channel; + iface->get_receiving_video = eci_call_info_proxy_get_receiving_video; + iface->get_receiving_audio = eci_call_info_proxy_get_receiving_audio; +} + +/** + * eci_call_info_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link>. See g_dbus_proxy_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call eci_call_info_proxy_new_finish() to get the result of the operation. + * + * See eci_call_info_proxy_new_sync() for the synchronous, blocking version of this constructor. + */ +void +eci_call_info_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (ECI_TYPE_CALL_INFO_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Telepathy.Phoenix.CallInfo", NULL); +} + +/** + * eci_call_info_proxy_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to eci_call_info_proxy_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with eci_call_info_proxy_new(). + * + * Returns: (transfer full) (type EciCallInfoProxy): The constructed proxy object or %NULL if @error is set. + */ +EciCallInfo * +eci_call_info_proxy_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return ECI_CALL_INFO (ret); + else + return NULL; +} + +/** + * eci_call_info_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link>. See g_dbus_proxy_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See eci_call_info_proxy_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type EciCallInfoProxy): The constructed proxy object or %NULL if @error is set. + */ +EciCallInfo * +eci_call_info_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (ECI_TYPE_CALL_INFO_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Telepathy.Phoenix.CallInfo", NULL); + if (ret != NULL) + return ECI_CALL_INFO (ret); + else + return NULL; +} + + +/** + * eci_call_info_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like eci_call_info_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call eci_call_info_proxy_new_for_bus_finish() to get the result of the operation. + * + * See eci_call_info_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +eci_call_info_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (ECI_TYPE_CALL_INFO_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Telepathy.Phoenix.CallInfo", NULL); +} + +/** + * eci_call_info_proxy_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to eci_call_info_proxy_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with eci_call_info_proxy_new_for_bus(). + * + * Returns: (transfer full) (type EciCallInfoProxy): The constructed proxy object or %NULL if @error is set. + */ +EciCallInfo * +eci_call_info_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return ECI_CALL_INFO (ret); + else + return NULL; +} + +/** + * eci_call_info_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like eci_call_info_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See eci_call_info_proxy_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type EciCallInfoProxy): The constructed proxy object or %NULL if @error is set. + */ +EciCallInfo * +eci_call_info_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (ECI_TYPE_CALL_INFO_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.Telepathy.Phoenix.CallInfo", NULL); + if (ret != NULL) + return ECI_CALL_INFO (ret); + else + return NULL; +} + + +/* ------------------------------------------------------------------------ */ + +/** + * EciCallInfoSkeleton: + * + * The #EciCallInfoSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * EciCallInfoSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #EciCallInfoSkeleton. + */ + +struct _EciCallInfoSkeletonPrivate +{ + GValue *properties; + GList *changed_properties; + GSource *changed_properties_idle_source; + GMainContext *context; + GMutex lock; +}; + +static void +_eci_call_info_skeleton_handle_method_call ( + GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (user_data); + _ExtendedGDBusMethodInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint num_extra; + guint n; + guint signal_id; + GValue return_value = G_VALUE_INIT; + info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); + g_assert (info != NULL); + num_params = g_variant_n_children (parameters); + num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); + n = 0; + g_value_init (¶mv[n], ECI_TYPE_CALL_INFO); + g_value_set_object (¶mv[n++], skeleton); + g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); + g_value_set_object (¶mv[n++], invocation); + if (info->pass_fdlist) + { +#ifdef G_OS_UNIX + g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); + g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); +#else + g_assert_not_reached (); +#endif + } + g_variant_iter_init (&iter, parameters); + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, ECI_TYPE_CALL_INFO); + g_value_init (&return_value, G_TYPE_BOOLEAN); + g_signal_emitv (paramv, signal_id, 0, &return_value); + if (!g_value_get_boolean (&return_value)) + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); + g_value_unset (&return_value); + for (n = 0; n < num_params + num_extra; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static GVariant * +_eci_call_info_skeleton_handle_get_property ( + GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + GVariant *ret; + ret = NULL; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_eci_call_info_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); + ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_value_unset (&value); + } + return ret; +} + +static gboolean +_eci_call_info_skeleton_handle_set_property ( + GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *variant, + GError **error, + gpointer user_data) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + gboolean ret; + ret = FALSE; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_eci_call_info_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + if (info->use_gvariant) + g_value_set_variant (&value, variant); + else + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); + g_value_unset (&value); + ret = TRUE; + } + return ret; +} + +static const GDBusInterfaceVTable _eci_call_info_skeleton_vtable = +{ + _eci_call_info_skeleton_handle_method_call, + _eci_call_info_skeleton_handle_get_property, + _eci_call_info_skeleton_handle_set_property +}; + +static GDBusInterfaceInfo * +eci_call_info_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton) +{ + return eci_call_info_interface_info (); +} + +static GDBusInterfaceVTable * +eci_call_info_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton) +{ + return (GDBusInterfaceVTable *) &_eci_call_info_skeleton_vtable; +} + +static GVariant * +eci_call_info_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (_skeleton); + + GVariantBuilder builder; + guint n; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (_eci_call_info_interface_info.parent_struct.properties == NULL) + goto out; + for (n = 0; _eci_call_info_interface_info.parent_struct.properties[n] != NULL; n++) + { + GDBusPropertyInfo *info = _eci_call_info_interface_info.parent_struct.properties[n]; + if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + value = _eci_call_info_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.Telepathy.Phoenix.CallInfo", info->name, NULL, skeleton); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->name, value); + g_variant_unref (value); + } + } + } +out: + return g_variant_builder_end (&builder); +} + +static gboolean _eci_call_info_emit_changed (gpointer user_data); + +static void +eci_call_info_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (_skeleton); + gboolean emit_changed = FALSE; + + g_mutex_lock (&skeleton->priv->lock); + if (skeleton->priv->changed_properties_idle_source != NULL) + { + g_source_destroy (skeleton->priv->changed_properties_idle_source); + skeleton->priv->changed_properties_idle_source = NULL; + emit_changed = TRUE; + } + g_mutex_unlock (&skeleton->priv->lock); + + if (emit_changed) + _eci_call_info_emit_changed (skeleton); +} + +static void eci_call_info_skeleton_iface_init (EciCallInfoIface *iface); +G_DEFINE_TYPE_WITH_CODE (EciCallInfoSkeleton, eci_call_info_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_IMPLEMENT_INTERFACE (ECI_TYPE_CALL_INFO, eci_call_info_skeleton_iface_init)); + +static void +eci_call_info_skeleton_finalize (GObject *object) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + guint n; + for (n = 0; n < 3; n++) + g_value_unset (&skeleton->priv->properties[n]); + g_free (skeleton->priv->properties); + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + if (skeleton->priv->changed_properties_idle_source != NULL) + g_source_destroy (skeleton->priv->changed_properties_idle_source); + g_main_context_unref (skeleton->priv->context); + g_mutex_clear (&skeleton->priv->lock); + G_OBJECT_CLASS (eci_call_info_skeleton_parent_class)->finalize (object); +} + +static void +eci_call_info_skeleton_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + g_assert (prop_id != 0 && prop_id - 1 < 3); + g_mutex_lock (&skeleton->priv->lock); + g_value_copy (&skeleton->priv->properties[prop_id - 1], value); + g_mutex_unlock (&skeleton->priv->lock); +} + +static gboolean +_eci_call_info_emit_changed (gpointer user_data) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (user_data); + GList *l; + GVariantBuilder builder; + GVariantBuilder invalidated_builder; + guint num_changes; + + g_mutex_lock (&skeleton->priv->lock); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as")); + for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next) + { + ChangedProperty *cp = l->data; + GVariant *variant; + const GValue *cur_value; + + cur_value = &skeleton->priv->properties[cp->prop_id - 1]; + if (!_g_value_equal (cur_value, &cp->orig_value)) + { + variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature)); + g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant); + g_variant_unref (variant); + num_changes++; + } + } + if (num_changes > 0) + { + GList *connections, *ll; + GVariant *signal_variant; + signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.freedesktop.Telepathy.Phoenix.CallInfo", + &builder, &invalidated_builder)); + connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); + for (ll = connections; ll != NULL; ll = ll->next) + { + GDBusConnection *connection = ll->data; + + g_dbus_connection_emit_signal (connection, + NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + signal_variant, + NULL); + } + g_variant_unref (signal_variant); + g_list_free_full (connections, g_object_unref); + } + else + { + g_variant_builder_clear (&builder); + g_variant_builder_clear (&invalidated_builder); + } + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + skeleton->priv->changed_properties = NULL; + skeleton->priv->changed_properties_idle_source = NULL; + g_mutex_unlock (&skeleton->priv->lock); + return FALSE; +} + +static void +_eci_call_info_schedule_emit_changed (EciCallInfoSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value) +{ + ChangedProperty *cp; + GList *l; + cp = NULL; + for (l = skeleton->priv->changed_properties; l != NULL; l = l->next) + { + ChangedProperty *i_cp = l->data; + if (i_cp->info == info) + { + cp = i_cp; + break; + } + } + if (cp == NULL) + { + cp = g_new0 (ChangedProperty, 1); + cp->prop_id = prop_id; + cp->info = info; + skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp); + g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value)); + g_value_copy (orig_value, &cp->orig_value); + } +} + +static void +eci_call_info_skeleton_notify (GObject *object, + GParamSpec *pspec) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + g_mutex_lock (&skeleton->priv->lock); + if (skeleton->priv->changed_properties != NULL && + skeleton->priv->changed_properties_idle_source == NULL) + { + skeleton->priv->changed_properties_idle_source = g_idle_source_new (); + g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (skeleton->priv->changed_properties_idle_source, _eci_call_info_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref); + g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context); + g_source_unref (skeleton->priv->changed_properties_idle_source); + } + g_mutex_unlock (&skeleton->priv->lock); +} + +static void +eci_call_info_skeleton_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + g_assert (prop_id != 0 && prop_id - 1 < 3); + g_mutex_lock (&skeleton->priv->lock); + g_object_freeze_notify (object); + if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1])) + { + if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL) + _eci_call_info_schedule_emit_changed (skeleton, _eci_call_info_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]); + g_value_copy (value, &skeleton->priv->properties[prop_id - 1]); + g_object_notify_by_pspec (object, pspec); + } + g_mutex_unlock (&skeleton->priv->lock); + g_object_thaw_notify (object); +} + +static void +eci_call_info_skeleton_init (EciCallInfoSkeleton *skeleton) +{ + skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, ECI_TYPE_CALL_INFO_SKELETON, EciCallInfoSkeletonPrivate); + g_mutex_init (&skeleton->priv->lock); + skeleton->priv->context = g_main_context_ref_thread_default (); + skeleton->priv->properties = g_new0 (GValue, 3); + g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING); + g_value_init (&skeleton->priv->properties[1], G_TYPE_BOOLEAN); + g_value_init (&skeleton->priv->properties[2], G_TYPE_BOOLEAN); +} + +static const gchar * +eci_call_info_skeleton_get_channel (EciCallInfo *object) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + const gchar *value; + g_mutex_lock (&skeleton->priv->lock); + value = g_value_get_string (&(skeleton->priv->properties[0])); + g_mutex_unlock (&skeleton->priv->lock); + return value; +} + +static gboolean +eci_call_info_skeleton_get_receiving_video (EciCallInfo *object) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + gboolean value; + g_mutex_lock (&skeleton->priv->lock); + value = g_value_get_boolean (&(skeleton->priv->properties[1])); + g_mutex_unlock (&skeleton->priv->lock); + return value; +} + +static gboolean +eci_call_info_skeleton_get_receiving_audio (EciCallInfo *object) +{ + EciCallInfoSkeleton *skeleton = ECI_CALL_INFO_SKELETON (object); + gboolean value; + g_mutex_lock (&skeleton->priv->lock); + value = g_value_get_boolean (&(skeleton->priv->properties[2])); + g_mutex_unlock (&skeleton->priv->lock); + return value; +} + +static void +eci_call_info_skeleton_class_init (EciCallInfoSkeletonClass *klass) +{ + GObjectClass *gobject_class; + GDBusInterfaceSkeletonClass *skeleton_class; + + g_type_class_add_private (klass, sizeof (EciCallInfoSkeletonPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = eci_call_info_skeleton_finalize; + gobject_class->get_property = eci_call_info_skeleton_get_property; + gobject_class->set_property = eci_call_info_skeleton_set_property; + gobject_class->notify = eci_call_info_skeleton_notify; + + + eci_call_info_override_properties (gobject_class, 1); + + skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = eci_call_info_skeleton_dbus_interface_get_info; + skeleton_class->get_properties = eci_call_info_skeleton_dbus_interface_get_properties; + skeleton_class->flush = eci_call_info_skeleton_dbus_interface_flush; + skeleton_class->get_vtable = eci_call_info_skeleton_dbus_interface_get_vtable; +} + +static void +eci_call_info_skeleton_iface_init (EciCallInfoIface *iface) +{ + iface->get_channel = eci_call_info_skeleton_get_channel; + iface->get_receiving_video = eci_call_info_skeleton_get_receiving_video; + iface->get_receiving_audio = eci_call_info_skeleton_get_receiving_audio; +} + +/** + * eci_call_info_skeleton_new: + * + * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link>. + * + * Returns: (transfer full) (type EciCallInfoSkeleton): The skeleton object. + */ +EciCallInfo * +eci_call_info_skeleton_new (void) +{ + return ECI_CALL_INFO (g_object_new (ECI_TYPE_CALL_INFO_SKELETON, NULL)); +} + +/* ------------------------------------------------------------------------ + * Code for Object, ObjectProxy and ObjectSkeleton + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:EciObject + * @title: EciObject + * @short_description: Specialized GDBusObject types + * + * This section contains the #EciObject, #EciObjectProxy, and #EciObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces. + */ + +/** + * EciObject: + * + * The #EciObject type is a specialized container of interfaces. + */ + +/** + * EciObjectIface: + * @parent_iface: The parent interface. + * + * Virtual table for the #EciObject interface. + */ + +static void +eci_object_default_init (EciObjectIface *iface) +{ + /** + * EciObject:call-info: + * + * The #EciCallInfo instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link>, if any. + * + * Connect to the #GObject::notify signal to get informed of property changes. + */ + g_object_interface_install_property (iface, g_param_spec_object ("call-info", "call-info", "call-info", ECI_TYPE_CALL_INFO, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); + +} + +typedef EciObjectIface EciObjectInterface; +G_DEFINE_INTERFACE_WITH_CODE (EciObject, eci_object, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT)); + +/** + * eci_object_get_call_info: + * @object: A #EciObject. + * + * Gets the #EciCallInfo instance for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link> on @object, if any. + * + * Returns: (transfer full): A #EciCallInfo that must be freed with g_object_unref() or %NULL if @object does not implement the interface. + */ +EciCallInfo *eci_object_get_call_info (EciObject *object) +{ + GDBusInterface *ret; + ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.Telepathy.Phoenix.CallInfo"); + if (ret == NULL) + return NULL; + return ECI_CALL_INFO (ret); +} + + +/** + * eci_object_peek_call_info: (skip) + * @object: A #EciObject. + * + * Like eci_object_get_call_info() but doesn't increase the reference count on the returned object. + * + * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning> + * + * Returns: (transfer none): A #EciCallInfo or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object. + */ +EciCallInfo *eci_object_peek_call_info (EciObject *object) +{ + GDBusInterface *ret; + ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.Telepathy.Phoenix.CallInfo"); + if (ret == NULL) + return NULL; + g_object_unref (ret); + return ECI_CALL_INFO (ret); +} + + +static void +eci_object_notify (GDBusObject *object, GDBusInterface *interface) +{ + g_object_notify (G_OBJECT (object), ((_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface))->hyphen_name); +} + +/** + * EciObjectProxy: + * + * The #EciObjectProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * EciObjectProxyClass: + * @parent_class: The parent class. + * + * Class structure for #EciObjectProxy. + */ + +static void +eci_object_proxy__eci_object_iface_init (EciObjectIface *iface) +{ +} + +static void +eci_object_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface) +{ + iface->interface_added = eci_object_notify; + iface->interface_removed = eci_object_notify; +} + + +G_DEFINE_TYPE_WITH_CODE (EciObjectProxy, eci_object_proxy, G_TYPE_DBUS_OBJECT_PROXY, + G_IMPLEMENT_INTERFACE (ECI_TYPE_OBJECT, eci_object_proxy__eci_object_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, eci_object_proxy__g_dbus_object_iface_init)); + +static void +eci_object_proxy_init (EciObjectProxy *object) +{ +} + +static void +eci_object_proxy_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); +} + +static void +eci_object_proxy_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EciObjectProxy *object = ECI_OBJECT_PROXY (gobject); + GDBusInterface *interface; + + switch (prop_id) + { + case 1: + interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.Telepathy.Phoenix.CallInfo"); + g_value_take_object (value, interface); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +eci_object_proxy_class_init (EciObjectProxyClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = eci_object_proxy_set_property; + gobject_class->get_property = eci_object_proxy_get_property; + + g_object_class_override_property (gobject_class, 1, "call-info"); +} + +/** + * eci_object_proxy_new: + * @connection: A #GDBusConnection. + * @object_path: An object path. + * + * Creates a new proxy object. + * + * Returns: (transfer full): The proxy object. + */ +EciObjectProxy * +eci_object_proxy_new (GDBusConnection *connection, + const gchar *object_path) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + return ECI_OBJECT_PROXY (g_object_new (ECI_TYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL)); +} + +/** + * EciObjectSkeleton: + * + * The #EciObjectSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * EciObjectSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #EciObjectSkeleton. + */ + +static void +eci_object_skeleton__eci_object_iface_init (EciObjectIface *iface) +{ +} + + +static void +eci_object_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface) +{ + iface->interface_added = eci_object_notify; + iface->interface_removed = eci_object_notify; +} + +G_DEFINE_TYPE_WITH_CODE (EciObjectSkeleton, eci_object_skeleton, G_TYPE_DBUS_OBJECT_SKELETON, + G_IMPLEMENT_INTERFACE (ECI_TYPE_OBJECT, eci_object_skeleton__eci_object_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, eci_object_skeleton__g_dbus_object_iface_init)); + +static void +eci_object_skeleton_init (EciObjectSkeleton *object) +{ +} + +static void +eci_object_skeleton_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EciObjectSkeleton *object = ECI_OBJECT_SKELETON (gobject); + GDBusInterfaceSkeleton *interface; + + switch (prop_id) + { + case 1: + interface = g_value_get_object (value); + if (interface != NULL) + { + g_warn_if_fail (ECI_IS_CALL_INFO (interface)); + g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface); + } + else + { + g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.freedesktop.Telepathy.Phoenix.CallInfo"); + } + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +eci_object_skeleton_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EciObjectSkeleton *object = ECI_OBJECT_SKELETON (gobject); + GDBusInterface *interface; + + switch (prop_id) + { + case 1: + interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.Telepathy.Phoenix.CallInfo"); + g_value_take_object (value, interface); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +eci_object_skeleton_class_init (EciObjectSkeletonClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = eci_object_skeleton_set_property; + gobject_class->get_property = eci_object_skeleton_get_property; + + g_object_class_override_property (gobject_class, 1, "call-info"); +} + +/** + * eci_object_skeleton_new: + * @object_path: An object path. + * + * Creates a new skeleton object. + * + * Returns: (transfer full): The skeleton object. + */ +EciObjectSkeleton * +eci_object_skeleton_new (const gchar *object_path) +{ + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + return ECI_OBJECT_SKELETON (g_object_new (ECI_TYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL)); +} + +/** + * eci_object_skeleton_set_call_info: + * @object: A #EciObjectSkeleton. + * @interface_: (allow-none): A #EciCallInfo or %NULL to clear the interface. + * + * Sets the #EciCallInfo instance for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-Telepathy-Phoenix-CallInfo.top_of_page">org.freedesktop.Telepathy.Phoenix.CallInfo</link> on @object. + */ +void eci_object_skeleton_set_call_info (EciObjectSkeleton *object, EciCallInfo *interface_) +{ + g_object_set (G_OBJECT (object), "call-info", interface_, NULL); +} + + +/* ------------------------------------------------------------------------ + * Code for ObjectManager client + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:EciObjectManagerClient + * @title: EciObjectManagerClient + * @short_description: Generated GDBusObjectManagerClient type + * + * This section contains a #GDBusObjectManagerClient that uses eci_object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. + */ + +/** + * EciObjectManagerClient: + * + * The #EciObjectManagerClient structure contains only private data and should only be accessed using the provided API. + */ + +/** + * EciObjectManagerClientClass: + * @parent_class: The parent class. + * + * Class structure for #EciObjectManagerClient. + */ + +G_DEFINE_TYPE (EciObjectManagerClient, eci_object_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT); + +static void +eci_object_manager_client_init (EciObjectManagerClient *manager) +{ +} + +static void +eci_object_manager_client_class_init (EciObjectManagerClientClass *klass) +{ +} + +/** + * eci_object_manager_client_get_proxy_type: + * @manager: A #GDBusObjectManagerClient. + * @object_path: The object path of the remote object (unused). + * @interface_name: (allow-none): Interface name of the remote object or %NULL to get the object proxy #GType. + * @user_data: User data (unused). + * + * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy<!-- -->- and #GDBusProxy<!-- -->-derived types. + * + * Returns: A #GDBusProxy<!-- -->-derived #GType if @interface_name is not %NULL, otherwise the #GType for #EciObjectProxy. + */ +GType +eci_object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data) +{ + static gsize once_init_value = 0; + static GHashTable *lookup_hash; + GType ret; + + if (interface_name == NULL) + return ECI_TYPE_OBJECT_PROXY; + if (g_once_init_enter (&once_init_value)) + { + lookup_hash = g_hash_table_new (g_str_hash, g_str_equal); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.Telepathy.Phoenix.CallInfo", GSIZE_TO_POINTER (ECI_TYPE_CALL_INFO_PROXY)); + g_once_init_leave (&once_init_value, 1); + } + ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name)); + if (ret == (GType) 0) + ret = G_TYPE_DBUS_PROXY; + return ret; +} + +/** + * eci_object_manager_client_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates #GDBusObjectManagerClient using eci_object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call eci_object_manager_client_new_finish() to get the result of the operation. + * + * See eci_object_manager_client_new_sync() for the synchronous, blocking version of this constructor. + */ +void +eci_object_manager_client_new ( + GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (ECI_TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", eci_object_manager_client_get_proxy_type, NULL); +} + +/** + * eci_object_manager_client_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to eci_object_manager_client_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with eci_object_manager_client_new(). + * + * Returns: (transfer full) (type EciObjectManagerClient): The constructed object manager client or %NULL if @error is set. + */ +GDBusObjectManager * +eci_object_manager_client_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return G_DBUS_OBJECT_MANAGER (ret); + else + return NULL; +} + +/** + * eci_object_manager_client_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates #GDBusObjectManagerClient using eci_object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See eci_object_manager_client_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type EciObjectManagerClient): The constructed object manager client or %NULL if @error is set. + */ +GDBusObjectManager * +eci_object_manager_client_new_sync ( + GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (ECI_TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", eci_object_manager_client_get_proxy_type, NULL); + if (ret != NULL) + return G_DBUS_OBJECT_MANAGER (ret); + else + return NULL; +} + + +/** + * eci_object_manager_client_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like eci_object_manager_client_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call eci_object_manager_client_new_for_bus_finish() to get the result of the operation. + * + * See eci_object_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +eci_object_manager_client_new_for_bus ( + GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (ECI_TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", eci_object_manager_client_get_proxy_type, NULL); +} + +/** + * eci_object_manager_client_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to eci_object_manager_client_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with eci_object_manager_client_new_for_bus(). + * + * Returns: (transfer full) (type EciObjectManagerClient): The constructed object manager client or %NULL if @error is set. + */ +GDBusObjectManager * +eci_object_manager_client_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return G_DBUS_OBJECT_MANAGER (ret); + else + return NULL; +} + +/** + * eci_object_manager_client_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like eci_object_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See eci_object_manager_client_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type EciObjectManagerClient): The constructed object manager client or %NULL if @error is set. + */ +GDBusObjectManager * +eci_object_manager_client_new_for_bus_sync ( + GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (ECI_TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", eci_object_manager_client_get_proxy_type, NULL); + if (ret != NULL) + return G_DBUS_OBJECT_MANAGER (ret); + else + return NULL; +} + + diff --git a/src/echo-call-info-dbus.h b/src/echo-call-info-dbus.h new file mode 100644 index 0000000..5954baa --- /dev/null +++ b/src/echo-call-info-dbus.h @@ -0,0 +1,297 @@ +/* + * Generated by gdbus-codegen 2.33.8. DO NOT EDIT. + * + * The license of this code is the same as for the source it was derived from. + */ + +#ifndef __ECHO_CALL_INFO_DBUS_H__ +#define __ECHO_CALL_INFO_DBUS_H__ + +#include <gio/gio.h> + +G_BEGIN_DECLS + + +/* ------------------------------------------------------------------------ */ +/* Declarations for org.freedesktop.Telepathy.Phoenix.CallInfo */ + +#define ECI_TYPE_CALL_INFO (eci_call_info_get_type ()) +#define ECI_CALL_INFO(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_CALL_INFO, EciCallInfo)) +#define ECI_IS_CALL_INFO(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_CALL_INFO)) +#define ECI_CALL_INFO_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), ECI_TYPE_CALL_INFO, EciCallInfoIface)) + +struct _EciCallInfo; +typedef struct _EciCallInfo EciCallInfo; +typedef struct _EciCallInfoIface EciCallInfoIface; + +struct _EciCallInfoIface +{ + GTypeInterface parent_iface; + + const gchar * (*get_channel) (EciCallInfo *object); + + gboolean (*get_receiving_audio) (EciCallInfo *object); + + gboolean (*get_receiving_video) (EciCallInfo *object); + +}; + +GType eci_call_info_get_type (void) G_GNUC_CONST; + +GDBusInterfaceInfo *eci_call_info_interface_info (void); +guint eci_call_info_override_properties (GObjectClass *klass, guint property_id_begin); + + +/* D-Bus property accessors: */ +const gchar *eci_call_info_get_channel (EciCallInfo *object); +gchar *eci_call_info_dup_channel (EciCallInfo *object); +void eci_call_info_set_channel (EciCallInfo *object, const gchar *value); + +gboolean eci_call_info_get_receiving_video (EciCallInfo *object); +void eci_call_info_set_receiving_video (EciCallInfo *object, gboolean value); + +gboolean eci_call_info_get_receiving_audio (EciCallInfo *object); +void eci_call_info_set_receiving_audio (EciCallInfo *object, gboolean value); + + +/* ---- */ + +#define ECI_TYPE_CALL_INFO_PROXY (eci_call_info_proxy_get_type ()) +#define ECI_CALL_INFO_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_CALL_INFO_PROXY, EciCallInfoProxy)) +#define ECI_CALL_INFO_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), ECI_TYPE_CALL_INFO_PROXY, EciCallInfoProxyClass)) +#define ECI_CALL_INFO_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ECI_TYPE_CALL_INFO_PROXY, EciCallInfoProxyClass)) +#define ECI_IS_CALL_INFO_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_CALL_INFO_PROXY)) +#define ECI_IS_CALL_INFO_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ECI_TYPE_CALL_INFO_PROXY)) + +typedef struct _EciCallInfoProxy EciCallInfoProxy; +typedef struct _EciCallInfoProxyClass EciCallInfoProxyClass; +typedef struct _EciCallInfoProxyPrivate EciCallInfoProxyPrivate; + +struct _EciCallInfoProxy +{ + /*< private >*/ + GDBusProxy parent_instance; + EciCallInfoProxyPrivate *priv; +}; + +struct _EciCallInfoProxyClass +{ + GDBusProxyClass parent_class; +}; + +GType eci_call_info_proxy_get_type (void) G_GNUC_CONST; + +void eci_call_info_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +EciCallInfo *eci_call_info_proxy_new_finish ( + GAsyncResult *res, + GError **error); +EciCallInfo *eci_call_info_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error); + +void eci_call_info_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +EciCallInfo *eci_call_info_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error); +EciCallInfo *eci_call_info_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error); + + +/* ---- */ + +#define ECI_TYPE_CALL_INFO_SKELETON (eci_call_info_skeleton_get_type ()) +#define ECI_CALL_INFO_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_CALL_INFO_SKELETON, EciCallInfoSkeleton)) +#define ECI_CALL_INFO_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), ECI_TYPE_CALL_INFO_SKELETON, EciCallInfoSkeletonClass)) +#define ECI_CALL_INFO_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ECI_TYPE_CALL_INFO_SKELETON, EciCallInfoSkeletonClass)) +#define ECI_IS_CALL_INFO_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_CALL_INFO_SKELETON)) +#define ECI_IS_CALL_INFO_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ECI_TYPE_CALL_INFO_SKELETON)) + +typedef struct _EciCallInfoSkeleton EciCallInfoSkeleton; +typedef struct _EciCallInfoSkeletonClass EciCallInfoSkeletonClass; +typedef struct _EciCallInfoSkeletonPrivate EciCallInfoSkeletonPrivate; + +struct _EciCallInfoSkeleton +{ + /*< private >*/ + GDBusInterfaceSkeleton parent_instance; + EciCallInfoSkeletonPrivate *priv; +}; + +struct _EciCallInfoSkeletonClass +{ + GDBusInterfaceSkeletonClass parent_class; +}; + +GType eci_call_info_skeleton_get_type (void) G_GNUC_CONST; + +EciCallInfo *eci_call_info_skeleton_new (void); + + +/* ---- */ + +#define ECI_TYPE_OBJECT (eci_object_get_type ()) +#define ECI_OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_OBJECT, EciObject)) +#define ECI_IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_OBJECT)) +#define ECI_OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), ECI_TYPE_OBJECT, EciObject)) + +struct _EciObject; +typedef struct _EciObject EciObject; +typedef struct _EciObjectIface EciObjectIface; + +struct _EciObjectIface +{ + GTypeInterface parent_iface; +}; + +GType eci_object_get_type (void) G_GNUC_CONST; + +EciCallInfo *eci_object_get_call_info (EciObject *object); +EciCallInfo *eci_object_peek_call_info (EciObject *object); + +#define ECI_TYPE_OBJECT_PROXY (eci_object_proxy_get_type ()) +#define ECI_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_OBJECT_PROXY, EciObjectProxy)) +#define ECI_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), ECI_TYPE_OBJECT_PROXY, EciObjectProxyClass)) +#define ECI_OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ECI_TYPE_OBJECT_PROXY, EciObjectProxyClass)) +#define ECI_IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_OBJECT_PROXY)) +#define ECI_IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ECI_TYPE_OBJECT_PROXY)) + +typedef struct _EciObjectProxy EciObjectProxy; +typedef struct _EciObjectProxyClass EciObjectProxyClass; +typedef struct _EciObjectProxyPrivate EciObjectProxyPrivate; + +struct _EciObjectProxy +{ + /*< private >*/ + GDBusObjectProxy parent_instance; + EciObjectProxyPrivate *priv; +}; + +struct _EciObjectProxyClass +{ + GDBusObjectProxyClass parent_class; +}; + +GType eci_object_proxy_get_type (void) G_GNUC_CONST; +EciObjectProxy *eci_object_proxy_new (GDBusConnection *connection, const gchar *object_path); + +#define ECI_TYPE_OBJECT_SKELETON (eci_object_skeleton_get_type ()) +#define ECI_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_OBJECT_SKELETON, EciObjectSkeleton)) +#define ECI_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), ECI_TYPE_OBJECT_SKELETON, EciObjectSkeletonClass)) +#define ECI_OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ECI_TYPE_OBJECT_SKELETON, EciObjectSkeletonClass)) +#define ECI_IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_OBJECT_SKELETON)) +#define ECI_IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ECI_TYPE_OBJECT_SKELETON)) + +typedef struct _EciObjectSkeleton EciObjectSkeleton; +typedef struct _EciObjectSkeletonClass EciObjectSkeletonClass; +typedef struct _EciObjectSkeletonPrivate EciObjectSkeletonPrivate; + +struct _EciObjectSkeleton +{ + /*< private >*/ + GDBusObjectSkeleton parent_instance; + EciObjectSkeletonPrivate *priv; +}; + +struct _EciObjectSkeletonClass +{ + GDBusObjectSkeletonClass parent_class; +}; + +GType eci_object_skeleton_get_type (void) G_GNUC_CONST; +EciObjectSkeleton *eci_object_skeleton_new (const gchar *object_path); +void eci_object_skeleton_set_call_info (EciObjectSkeleton *object, EciCallInfo *interface_); + +/* ---- */ + +#define ECI_TYPE_OBJECT_MANAGER_CLIENT (eci_object_manager_client_get_type ()) +#define ECI_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ECI_TYPE_OBJECT_MANAGER_CLIENT, EciObjectManagerClient)) +#define ECI_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), ECI_TYPE_OBJECT_MANAGER_CLIENT, EciObjectManagerClientClass)) +#define ECI_OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ECI_TYPE_OBJECT_MANAGER_CLIENT, EciObjectManagerClientClass)) +#define ECI_IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ECI_TYPE_OBJECT_MANAGER_CLIENT)) +#define ECI_IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ECI_TYPE_OBJECT_MANAGER_CLIENT)) + +typedef struct _EciObjectManagerClient EciObjectManagerClient; +typedef struct _EciObjectManagerClientClass EciObjectManagerClientClass; +typedef struct _EciObjectManagerClientPrivate EciObjectManagerClientPrivate; + +struct _EciObjectManagerClient +{ + /*< private >*/ + GDBusObjectManagerClient parent_instance; + EciObjectManagerClientPrivate *priv; +}; + +struct _EciObjectManagerClientClass +{ + GDBusObjectManagerClientClass parent_class; +}; + +GType eci_object_manager_client_get_type (void) G_GNUC_CONST; + +GType eci_object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data); + +void eci_object_manager_client_new ( + GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GDBusObjectManager *eci_object_manager_client_new_finish ( + GAsyncResult *res, + GError **error); +GDBusObjectManager *eci_object_manager_client_new_sync ( + GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error); + +void eci_object_manager_client_new_for_bus ( + GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GDBusObjectManager *eci_object_manager_client_new_for_bus_finish ( + GAsyncResult *res, + GError **error); +GDBusObjectManager *eci_object_manager_client_new_for_bus_sync ( + GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error); + + +G_END_DECLS + +#endif /* __ECHO_CALL_INFO_DBUS_H__ */ diff --git a/src/echo-call-info.xml b/src/echo-call-info.xml new file mode 100644 index 0000000..1e443dd --- /dev/null +++ b/src/echo-call-info.xml @@ -0,0 +1,7 @@ +<node> + <interface name="org.freedesktop.Telepathy.Phoenix.CallInfo"> + <property name="Channel" type="o" access="read"/> + <property name="ReceivingVideo" type="b" access="read"/> + <property name="ReceivingAudio" type="b" access="read"/> + </interface> +</node> diff --git a/src/echo-call.c b/src/echo-call.c index e6bb157..043df3d 100644 --- a/src/echo-call.c +++ b/src/echo-call.c @@ -23,6 +23,11 @@ #include <farstream/fs-utils.h> #include <telepathy-farstream/telepathy-farstream.h> +#include "echo-call-info-dbus.h" + +#define CALLS_OBJECT_PATH "/org/freedesktop/Telepathy/Phoenix/Calls" +#define CALLS_NAME "org.freedesktop.Telepathy.Phoenix.Calls" + typedef enum { CALL_MODE_ECHO = 0, CALL_MODE_TEST_INPUTS @@ -37,9 +42,12 @@ typedef struct { CallMode mode; GstElement *audio_src; GstElement *video_src; + EciObjectSkeleton *call_object; + EciCallInfo *call_info; } ChannelContext; GMainLoop *loop; +GDBusObjectManagerServer *object_manager; static gboolean bus_watch_cb (GstBus *bus, @@ -192,9 +200,23 @@ src_pad_added_cb (TfContent *content, { ChannelContext *context = user_data; gchar *cstr = fs_codec_to_string (codec); + FsMediaType mtype; + g_debug ("New src pad: %s", cstr); g_free (cstr); + g_object_get (content, "media-type", &mtype, NULL); + + switch (mtype) + { + case FS_MEDIA_TYPE_AUDIO: + eci_call_info_set_receiving_audio (context->call_info, TRUE); + break; + case FS_MEDIA_TYPE_VIDEO: + eci_call_info_set_receiving_video (context->call_info, TRUE); + break; + } + switch (context->mode) { case CALL_MODE_ECHO: @@ -392,6 +414,12 @@ proxy_invalidated_cb (TpProxy *proxy, g_object_unref (context->proxy); + g_dbus_object_manager_server_unexport (object_manager, + g_dbus_object_get_object_path (G_DBUS_OBJECT (context->call_object))); + + g_object_unref (context->call_info); + g_object_unref (context->call_object); + g_slice_free (ChannelContext, context); } @@ -431,6 +459,7 @@ new_call_channel_cb (TpSimpleHandler *handler, GstElement *pipeline; GstStateChangeReturn ret; GList *rl; + gchar *path; g_debug ("New channel"); @@ -450,6 +479,25 @@ new_call_channel_cb (TpSimpleHandler *handler, context = g_slice_new0 (ChannelContext); context->pipeline = pipeline; + context->call_info = eci_call_info_skeleton_new (); + + g_object_set (context->call_info, + "receiving-audio", FALSE, + "receiving-video", FALSE, + "channel", tp_proxy_get_object_path (call), + NULL); + + path = g_strdup_printf ("%s%s", + CALLS_OBJECT_PATH, + tp_proxy_get_object_path (call)); + context->call_object = eci_object_skeleton_new (path); + g_free(path); + + eci_object_skeleton_set_call_info (context->call_object, + context->call_info); + + g_dbus_object_manager_server_export (object_manager, + G_DBUS_OBJECT_SKELETON (context->call_object)); for (rl = requests_satisfied; rl != NULL; rl = g_list_next (rl)) { @@ -462,8 +510,6 @@ new_call_channel_cb (TpSimpleHandler *handler, context->mode = CALL_MODE_TEST_INPUTS; else if (!tp_strdiff (mode, "echo")) context->mode = CALL_MODE_ECHO; - - } bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); @@ -500,6 +546,7 @@ main (int argc, char **argv) { TpBaseClient *client; TpAccountManager *am; + GDBusConnection *connection; g_type_init (); gst_init (&argc, &argv); @@ -546,6 +593,19 @@ main (int argc, char **argv) tp_base_client_register (client, NULL); + connection = g_bus_get_sync (G_BUS_TYPE_STARTER, + NULL, NULL); + g_assert (connection != NULL); + object_manager = g_dbus_object_manager_server_new ( + CALLS_OBJECT_PATH); + g_dbus_object_manager_server_set_connection (object_manager, + connection); + + g_bus_own_name_on_connection (connection, + CALLS_NAME, + G_BUS_NAME_OWNER_FLAGS_REPLACE, + NULL, NULL, NULL, NULL); + g_main_loop_run (loop); g_object_unref (am); |