diff options
Diffstat (limited to 'src/mpris2-watcher.c')
-rw-r--r-- | src/mpris2-watcher.c | 838 |
1 files changed, 838 insertions, 0 deletions
diff --git a/src/mpris2-watcher.c b/src/mpris2-watcher.c new file mode 100644 index 0000000..9742166 --- /dev/null +++ b/src/mpris2-watcher.c @@ -0,0 +1,838 @@ +/* mpris2-watcher.c generated by valac 0.14.0, the Vala compiler + * generated from mpris2-watcher.vala, do not modify */ + +/* +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran <conor.curran@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <glib.h> +#include <glib-object.h> +#include <gio/gio.h> +#include <stdlib.h> +#include <string.h> +#include <libxml/parser.h> +#include <libxml/tree.h> + + +#define TYPE_MPRIS2_WATCHER (mpris2_watcher_get_type ()) +#define MPRIS2_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MPRIS2_WATCHER, Mpris2Watcher)) +#define MPRIS2_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MPRIS2_WATCHER, Mpris2WatcherClass)) +#define IS_MPRIS2_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MPRIS2_WATCHER)) +#define IS_MPRIS2_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MPRIS2_WATCHER)) +#define MPRIS2_WATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MPRIS2_WATCHER, Mpris2WatcherClass)) + +typedef struct _Mpris2Watcher Mpris2Watcher; +typedef struct _Mpris2WatcherClass Mpris2WatcherClass; +typedef struct _Mpris2WatcherPrivate Mpris2WatcherPrivate; + +#define TYPE_FREE_DESKTOP_OBJECT (free_desktop_object_get_type ()) +#define FREE_DESKTOP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FREE_DESKTOP_OBJECT, FreeDesktopObject)) +#define IS_FREE_DESKTOP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_FREE_DESKTOP_OBJECT)) +#define FREE_DESKTOP_OBJECT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_FREE_DESKTOP_OBJECT, FreeDesktopObjectIface)) + +typedef struct _FreeDesktopObject FreeDesktopObject; +typedef struct _FreeDesktopObjectIface FreeDesktopObjectIface; + +#define TYPE_FREE_DESKTOP_OBJECT_PROXY (free_desktop_object_proxy_get_type ()) +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) + +#define TYPE_MPRIS_ROOT (mpris_root_get_type ()) +#define MPRIS_ROOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MPRIS_ROOT, MprisRoot)) +#define IS_MPRIS_ROOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MPRIS_ROOT)) +#define MPRIS_ROOT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_MPRIS_ROOT, MprisRootIface)) + +typedef struct _MprisRoot MprisRoot; +typedef struct _MprisRootIface MprisRootIface; + +#define TYPE_MPRIS_ROOT_PROXY (mpris_root_proxy_get_type ()) +#define _g_free0(var) (var = (g_free (var), NULL)) +typedef struct _Mpris2WatcherCheckForActiveClientsData Mpris2WatcherCheckForActiveClientsData; + +#define TYPE_FREE_DESKTOP_INTROSPECTABLE (free_desktop_introspectable_get_type ()) +#define FREE_DESKTOP_INTROSPECTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FREE_DESKTOP_INTROSPECTABLE, FreeDesktopIntrospectable)) +#define IS_FREE_DESKTOP_INTROSPECTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_FREE_DESKTOP_INTROSPECTABLE)) +#define FREE_DESKTOP_INTROSPECTABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_FREE_DESKTOP_INTROSPECTABLE, FreeDesktopIntrospectableIface)) + +typedef struct _FreeDesktopIntrospectable FreeDesktopIntrospectable; +typedef struct _FreeDesktopIntrospectableIface FreeDesktopIntrospectableIface; + +#define TYPE_FREE_DESKTOP_INTROSPECTABLE_PROXY (free_desktop_introspectable_proxy_get_type ()) + +struct _Mpris2Watcher { + GObject parent_instance; + Mpris2WatcherPrivate * priv; +}; + +struct _Mpris2WatcherClass { + GObjectClass parent_class; +}; + +struct _FreeDesktopObjectIface { + GTypeInterface parent_iface; + void (*list_names) (FreeDesktopObject* self, GAsyncReadyCallback _callback_, gpointer _user_data_); + gchar** (*list_names_finish) (FreeDesktopObject* self, GAsyncResult* _res_, int* result_length1, GError** error); +}; + +struct _Mpris2WatcherPrivate { + FreeDesktopObject* fdesktop_obj; +}; + +struct _MprisRootIface { + GTypeInterface parent_iface; + void (*Quit) (MprisRoot* self, GAsyncReadyCallback _callback_, gpointer _user_data_); + void (*Quit_finish) (MprisRoot* self, GAsyncResult* _res_, GError** error); + void (*Raise) (MprisRoot* self, GAsyncReadyCallback _callback_, gpointer _user_data_); + void (*Raise_finish) (MprisRoot* self, GAsyncResult* _res_, GError** error); + gboolean (*get_HasTracklist) (MprisRoot* self); + void (*set_HasTracklist) (MprisRoot* self, gboolean value); + gboolean (*get_CanQuit) (MprisRoot* self); + void (*set_CanQuit) (MprisRoot* self, gboolean value); + gboolean (*get_CanRaise) (MprisRoot* self); + void (*set_CanRaise) (MprisRoot* self, gboolean value); + gchar* (*get_Identity) (MprisRoot* self); + void (*set_Identity) (MprisRoot* self, const gchar* value); + gchar* (*get_DesktopEntry) (MprisRoot* self); + void (*set_DesktopEntry) (MprisRoot* self, const gchar* value); +}; + +struct _Mpris2WatcherCheckForActiveClientsData { + int _state_; + GObject* _source_object_; + GAsyncResult* _res_; + GSimpleAsyncResult* _async_result; + Mpris2Watcher* self; + gchar** interfaces; + gint interfaces_length1; + gint _interfaces_size_; + FreeDesktopObject* _tmp0_; + gint _tmp1_; + gchar** _tmp2_; + gchar** _tmp3_; + gint _tmp3__length1; + gint __tmp3__size_; + GError* e; + GError* _tmp4_; + const gchar* _tmp5_; + gchar** _tmp6_; + gint _tmp6__length1; + gchar** address_collection; + gint address_collection_length1; + gint _address_collection_size_; + gint address_it; + gchar* _tmp7_; + gchar* address; + const gchar* _tmp8_; + gboolean _tmp9_; + const gchar* _tmp10_; + MprisRoot* _tmp11_; + MprisRoot* mpris2_root; + MprisRoot* _tmp12_; + const gchar* _tmp13_; + gboolean _tmp14_; + gboolean use_playlists; + MprisRoot* _tmp15_; + gchar* _tmp16_; + gchar* _tmp17_; + gchar* _tmp18_; + const gchar* _tmp19_; + gboolean _tmp20_; + GError * _inner_error_; +}; + +struct _FreeDesktopIntrospectableIface { + GTypeInterface parent_iface; + gchar* (*Introspect) (FreeDesktopIntrospectable* self, GError** error); +}; + + +static gpointer mpris2_watcher_parent_class = NULL; + +GType mpris2_watcher_get_type (void) G_GNUC_CONST; +GType free_desktop_object_proxy_get_type (void) G_GNUC_CONST; +guint free_desktop_object_register_object (void* object, GDBusConnection* connection, const gchar* path, GError** error); +GType free_desktop_object_get_type (void) G_GNUC_CONST; +#define MPRIS2_WATCHER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_MPRIS2_WATCHER, Mpris2WatcherPrivate)) +enum { + MPRIS2_WATCHER_DUMMY_PROPERTY +}; +Mpris2Watcher* mpris2_watcher_new (void); +Mpris2Watcher* mpris2_watcher_construct (GType object_type); +static void mpris2_watcher_check_for_active_clients_data_free (gpointer _data); +void mpris2_watcher_check_for_active_clients (Mpris2Watcher* self, GAsyncReadyCallback _callback_, gpointer _user_data_); +void mpris2_watcher_check_for_active_clients_finish (Mpris2Watcher* self, GAsyncResult* _res_); +static gboolean mpris2_watcher_check_for_active_clients_co (Mpris2WatcherCheckForActiveClientsData* _data_); +void free_desktop_object_list_names (FreeDesktopObject* self, GAsyncReadyCallback _callback_, gpointer _user_data_); +gchar** free_desktop_object_list_names_finish (FreeDesktopObject* self, GAsyncResult* _res_, int* result_length1, GError** error); +static void mpris2_watcher_check_for_active_clients_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_); +#define MPRIS_PREFIX "org.mpris.MediaPlayer2." +GType mpris_root_proxy_get_type (void) G_GNUC_CONST; +guint mpris_root_register_object (void* object, GDBusConnection* connection, const gchar* path, GError** error); +GType mpris_root_get_type (void) G_GNUC_CONST; +static MprisRoot* mpris2_watcher_create_mpris_root (Mpris2Watcher* self, const gchar* name); +static gboolean mpris2_watcher_supports_playlists (Mpris2Watcher* self, const gchar* name); +gchar* mpris_root_get_DesktopEntry (MprisRoot* self); +static void mpris2_watcher_name_changes_detected (Mpris2Watcher* self, FreeDesktopObject* dbus_obj, const gchar* name, const gchar* previous_owner, const gchar* current_owner); +#define MPRIS_MEDIA_PLAYER_PATH "/org/mpris/MediaPlayer2" +GType free_desktop_introspectable_proxy_get_type (void) G_GNUC_CONST; +guint free_desktop_introspectable_register_object (void* object, GDBusConnection* connection, const gchar* path, GError** error); +GType free_desktop_introspectable_get_type (void) G_GNUC_CONST; +gchar* free_desktop_introspectable_Introspect (FreeDesktopIntrospectable* self, GError** error); +static gboolean mpris2_watcher_parse_interfaces (Mpris2Watcher* self, const gchar* interface_info); +static void g_cclosure_user_marshal_VOID__STRING_STRING_BOOLEAN (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data); +static GObject * mpris2_watcher_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties); +#define FREEDESKTOP_SERVICE "org.freedesktop.DBus" +#define FREEDESKTOP_OBJECT "/org/freedesktop/DBus" +static void _mpris2_watcher_name_changes_detected_free_desktop_object_name_owner_changed (FreeDesktopObject* _sender, const gchar* name, const gchar* old_owner, const gchar* new_owner, gpointer self); +static void mpris2_watcher_finalize (GObject* obj); +static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func); +static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func); + + +Mpris2Watcher* mpris2_watcher_construct (GType object_type) { + Mpris2Watcher * self = NULL; + self = (Mpris2Watcher*) g_object_new (object_type, NULL); + return self; +} + + +Mpris2Watcher* mpris2_watcher_new (void) { + return mpris2_watcher_construct (TYPE_MPRIS2_WATCHER); +} + + +static void mpris2_watcher_check_for_active_clients_data_free (gpointer _data) { + Mpris2WatcherCheckForActiveClientsData* _data_; + _data_ = _data; + _g_object_unref0 (_data_->self); + g_slice_free (Mpris2WatcherCheckForActiveClientsData, _data_); +} + + +static gpointer _g_object_ref0 (gpointer self) { + return self ? g_object_ref (self) : NULL; +} + + +void mpris2_watcher_check_for_active_clients (Mpris2Watcher* self, GAsyncReadyCallback _callback_, gpointer _user_data_) { + Mpris2WatcherCheckForActiveClientsData* _data_; + Mpris2Watcher* _tmp0_; + _data_ = g_slice_new0 (Mpris2WatcherCheckForActiveClientsData); + _data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, mpris2_watcher_check_for_active_clients); + g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, mpris2_watcher_check_for_active_clients_data_free); + _tmp0_ = _g_object_ref0 (self); + _data_->self = _tmp0_; + mpris2_watcher_check_for_active_clients_co (_data_); +} + + +void mpris2_watcher_check_for_active_clients_finish (Mpris2Watcher* self, GAsyncResult* _res_) { + Mpris2WatcherCheckForActiveClientsData* _data_; + _data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_)); +} + + +static void mpris2_watcher_check_for_active_clients_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) { + Mpris2WatcherCheckForActiveClientsData* _data_; + _data_ = _user_data_; + _data_->_source_object_ = source_object; + _data_->_res_ = _res_; + mpris2_watcher_check_for_active_clients_co (_data_); +} + + +static gboolean mpris2_watcher_check_for_active_clients_co (Mpris2WatcherCheckForActiveClientsData* _data_) { + switch (_data_->_state_) { + case 0: + goto _state_0; + case 1: + goto _state_1; + default: + g_assert_not_reached (); + } + _state_0: + _data_->interfaces_length1 = 0; + _data_->_interfaces_size_ = 0; + { + _data_->_tmp0_ = _data_->self->priv->fdesktop_obj; + _data_->_tmp1_ = 0; + _data_->_state_ = 1; + free_desktop_object_list_names (_data_->_tmp0_, mpris2_watcher_check_for_active_clients_ready, _data_); + return FALSE; + _state_1: + _data_->_tmp2_ = NULL; + _data_->_tmp2_ = free_desktop_object_list_names_finish (_data_->_tmp0_, _data_->_res_, &_data_->_tmp1_, &_data_->_inner_error_); + _data_->_tmp3_ = _data_->_tmp2_; + _data_->_tmp3__length1 = _data_->_tmp1_; + _data_->__tmp3__size_ = _data_->_tmp3__length1; + if (_data_->_inner_error_ != NULL) { + if (_data_->_inner_error_->domain == G_IO_ERROR) { + goto __catch7_g_io_error; + } + _data_->interfaces = (_vala_array_free (_data_->interfaces, _data_->interfaces_length1, (GDestroyNotify) g_free), NULL); + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code); + g_clear_error (&_data_->_inner_error_); + return FALSE; + } + _data_->interfaces = (_vala_array_free (_data_->interfaces, _data_->interfaces_length1, (GDestroyNotify) g_free), NULL); + _data_->interfaces = _data_->_tmp3_; + _data_->interfaces_length1 = _data_->_tmp3__length1; + _data_->_interfaces_size_ = _data_->interfaces_length1; + } + goto __finally7; + __catch7_g_io_error: + { + _data_->e = _data_->_inner_error_; + _data_->_inner_error_ = NULL; + _data_->_tmp4_ = _data_->e; + _data_->_tmp5_ = _data_->_tmp4_->message; + g_warning ("mpris2-watcher.vala:60: Mpris2watcher could fetch active interfaces at" \ +" startup: %s", _data_->_tmp5_); + _g_error_free0 (_data_->e); + _data_->interfaces = (_vala_array_free (_data_->interfaces, _data_->interfaces_length1, (GDestroyNotify) g_free), NULL); + if (_data_->_state_ == 0) { + g_simple_async_result_complete_in_idle (_data_->_async_result); + } else { + g_simple_async_result_complete (_data_->_async_result); + } + g_object_unref (_data_->_async_result); + return FALSE; + } + __finally7: + if (_data_->_inner_error_ != NULL) { + _data_->interfaces = (_vala_array_free (_data_->interfaces, _data_->interfaces_length1, (GDestroyNotify) g_free), NULL); + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code); + g_clear_error (&_data_->_inner_error_); + return FALSE; + } + _data_->_tmp6_ = _data_->interfaces; + _data_->_tmp6__length1 = _data_->interfaces_length1; + { + _data_->address_collection_length1 = 0; + _data_->_address_collection_size_ = 0; + _data_->address_collection = _data_->_tmp6_; + _data_->address_collection_length1 = _data_->_tmp6__length1; + _data_->address_it = 0; + for (_data_->address_it = 0; _data_->address_it < _data_->_tmp6__length1; _data_->address_it = _data_->address_it + 1) { + _data_->_tmp7_ = g_strdup (_data_->address_collection[_data_->address_it]); + _data_->address = _data_->_tmp7_; + { + _data_->_tmp8_ = _data_->address; + _data_->_tmp9_ = FALSE; + _data_->_tmp9_ = g_str_has_prefix (_data_->_tmp8_, MPRIS_PREFIX); + if (_data_->_tmp9_) { + _data_->_tmp10_ = _data_->address; + _data_->_tmp11_ = NULL; + _data_->_tmp11_ = mpris2_watcher_create_mpris_root (_data_->self, _data_->_tmp10_); + _data_->mpris2_root = _data_->_tmp11_; + _data_->_tmp12_ = _data_->mpris2_root; + if (_data_->_tmp12_ == NULL) { + _g_object_unref0 (_data_->mpris2_root); + _g_free0 (_data_->address); + _data_->interfaces = (_vala_array_free (_data_->interfaces, _data_->interfaces_length1, (GDestroyNotify) g_free), NULL); + if (_data_->_state_ == 0) { + g_simple_async_result_complete_in_idle (_data_->_async_result); + } else { + g_simple_async_result_complete (_data_->_async_result); + } + g_object_unref (_data_->_async_result); + return FALSE; + } + _data_->_tmp13_ = _data_->address; + _data_->_tmp14_ = FALSE; + _data_->_tmp14_ = mpris2_watcher_supports_playlists (_data_->self, _data_->_tmp13_); + _data_->use_playlists = _data_->_tmp14_; + _data_->_tmp15_ = _data_->mpris2_root; + _data_->_tmp16_ = mpris_root_get_DesktopEntry (_data_->_tmp15_); + _data_->_tmp17_ = _data_->_tmp16_; + _data_->_tmp18_ = _data_->_tmp17_; + _data_->_tmp19_ = _data_->address; + _data_->_tmp20_ = _data_->use_playlists; + g_signal_emit_by_name (_data_->self, "client-appeared", _data_->_tmp18_, _data_->_tmp19_, _data_->_tmp20_); + _g_free0 (_data_->_tmp18_); + _g_object_unref0 (_data_->mpris2_root); + } + _g_free0 (_data_->address); + } + } + } + _data_->interfaces = (_vala_array_free (_data_->interfaces, _data_->interfaces_length1, (GDestroyNotify) g_free), NULL); + if (_data_->_state_ == 0) { + g_simple_async_result_complete_in_idle (_data_->_async_result); + } else { + g_simple_async_result_complete (_data_->_async_result); + } + g_object_unref (_data_->_async_result); + return FALSE; +} + + +static void mpris2_watcher_name_changes_detected (Mpris2Watcher* self, FreeDesktopObject* dbus_obj, const gchar* name, const gchar* previous_owner, const gchar* current_owner) { + const gchar* _tmp0_; + MprisRoot* _tmp1_ = NULL; + MprisRoot* mpris2_root; + MprisRoot* _tmp2_; + gboolean _tmp3_ = FALSE; + const gchar* _tmp4_; + gboolean _tmp6_; + g_return_if_fail (self != NULL); + g_return_if_fail (dbus_obj != NULL); + g_return_if_fail (name != NULL); + g_return_if_fail (previous_owner != NULL); + g_return_if_fail (current_owner != NULL); + _tmp0_ = name; + _tmp1_ = mpris2_watcher_create_mpris_root (self, _tmp0_); + mpris2_root = _tmp1_; + _tmp2_ = mpris2_root; + if (_tmp2_ == NULL) { + _g_object_unref0 (mpris2_root); + return; + } + _tmp4_ = previous_owner; + if (g_strcmp0 (_tmp4_, "") != 0) { + const gchar* _tmp5_; + _tmp5_ = current_owner; + _tmp3_ = g_strcmp0 (_tmp5_, "") == 0; + } else { + _tmp3_ = FALSE; + } + _tmp6_ = _tmp3_; + if (_tmp6_) { + const gchar* _tmp7_; + const gchar* _tmp8_; + _tmp7_ = name; + g_debug ("mpris2-watcher.vala:84: Client '%s' gone down", _tmp7_); + _tmp8_ = name; + g_signal_emit_by_name (self, "client-disappeared", _tmp8_); + } else { + gboolean _tmp9_ = FALSE; + const gchar* _tmp10_; + gboolean _tmp12_; + _tmp10_ = previous_owner; + if (g_strcmp0 (_tmp10_, "") == 0) { + const gchar* _tmp11_; + _tmp11_ = current_owner; + _tmp9_ = g_strcmp0 (_tmp11_, "") != 0; + } else { + _tmp9_ = FALSE; + } + _tmp12_ = _tmp9_; + if (_tmp12_) { + const gchar* _tmp13_; + const gchar* _tmp14_; + gboolean _tmp15_ = FALSE; + gboolean use_playlists; + MprisRoot* _tmp16_; + gchar* _tmp17_; + gchar* _tmp18_; + gchar* _tmp19_; + const gchar* _tmp20_; + gboolean _tmp21_; + _tmp13_ = name; + g_debug ("mpris2-watcher.vala:88: Client '%s' has appeared", _tmp13_); + _tmp14_ = name; + _tmp15_ = mpris2_watcher_supports_playlists (self, _tmp14_); + use_playlists = _tmp15_; + _tmp16_ = mpris2_root; + _tmp17_ = mpris_root_get_DesktopEntry (_tmp16_); + _tmp18_ = _tmp17_; + _tmp19_ = _tmp18_; + _tmp20_ = name; + _tmp21_ = use_playlists; + g_signal_emit_by_name (self, "client-appeared", _tmp19_, _tmp20_, _tmp21_); + _g_free0 (_tmp19_); + } + } + _g_object_unref0 (mpris2_root); +} + + +static MprisRoot* mpris2_watcher_create_mpris_root (Mpris2Watcher* self, const gchar* name) { + MprisRoot* result = NULL; + MprisRoot* mpris2_root; + const gchar* _tmp0_; + gboolean _tmp1_ = FALSE; + GError * _inner_error_ = NULL; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + mpris2_root = NULL; + _tmp0_ = name; + _tmp1_ = g_str_has_prefix (_tmp0_, MPRIS_PREFIX); + if (_tmp1_) { + { + const gchar* _tmp2_; + MprisRoot* _tmp3_ = NULL; + MprisRoot* _tmp4_; + _tmp2_ = name; + _tmp3_ = g_initable_new (TYPE_MPRIS_ROOT_PROXY, NULL, &_inner_error_, "g-flags", 0, "g-name", _tmp2_, "g-bus-type", G_BUS_TYPE_SESSION, "g-object-path", MPRIS_MEDIA_PLAYER_PATH, "g-interface-name", "org.mpris.MediaPlayer2", NULL); + _tmp4_ = (MprisRoot*) _tmp3_; + if (_inner_error_ != NULL) { + if (_inner_error_->domain == G_IO_ERROR) { + goto __catch8_g_io_error; + } + _g_object_unref0 (mpris2_root); + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return NULL; + } + _g_object_unref0 (mpris2_root); + mpris2_root = _tmp4_; + } + goto __finally8; + __catch8_g_io_error: + { + GError* e = NULL; + GError* _tmp5_; + const gchar* _tmp6_; + e = _inner_error_; + _inner_error_ = NULL; + _tmp5_ = e; + _tmp6_ = _tmp5_->message; + g_warning ("mpris2-watcher.vala:103: Mpris2watcher could not create a root interfa" \ +"ce: %s", _tmp6_); + _g_error_free0 (e); + } + __finally8: + if (_inner_error_ != NULL) { + _g_object_unref0 (mpris2_root); + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return NULL; + } + } + result = mpris2_root; + return result; +} + + +static gboolean mpris2_watcher_supports_playlists (Mpris2Watcher* self, const gchar* name) { + gboolean result = FALSE; + FreeDesktopIntrospectable* introspectable = NULL; + GError * _inner_error_ = NULL; + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + { + const gchar* _tmp0_; + FreeDesktopIntrospectable* _tmp1_ = NULL; + FreeDesktopIntrospectable* _tmp2_; + FreeDesktopIntrospectable* _tmp3_; + gchar* _tmp4_ = NULL; + gchar* results; + const gchar* _tmp5_; + gboolean _tmp6_ = FALSE; + _tmp0_ = name; + _tmp1_ = g_initable_new (TYPE_FREE_DESKTOP_INTROSPECTABLE_PROXY, NULL, &_inner_error_, "g-flags", G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, "g-name", _tmp0_, "g-bus-type", G_BUS_TYPE_SESSION, "g-object-path", MPRIS_MEDIA_PLAYER_PATH, "g-interface-name", "org.freedesktop.DBus.Introspectable", NULL); + _tmp2_ = (FreeDesktopIntrospectable*) _tmp1_; + if (_inner_error_ != NULL) { + if (_inner_error_->domain == G_IO_ERROR) { + goto __catch9_g_io_error; + } + _g_object_unref0 (introspectable); + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return FALSE; + } + _g_object_unref0 (introspectable); + introspectable = _tmp2_; + _tmp3_ = introspectable; + _tmp4_ = free_desktop_introspectable_Introspect (_tmp3_, &_inner_error_); + results = _tmp4_; + if (_inner_error_ != NULL) { + if (_inner_error_->domain == G_IO_ERROR) { + goto __catch9_g_io_error; + } + _g_object_unref0 (introspectable); + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return FALSE; + } + _tmp5_ = results; + _tmp6_ = mpris2_watcher_parse_interfaces (self, _tmp5_); + result = _tmp6_; + _g_free0 (results); + _g_object_unref0 (introspectable); + return result; + } + goto __finally9; + __catch9_g_io_error: + { + GError* e = NULL; + GError* _tmp7_; + const gchar* _tmp8_; + e = _inner_error_; + _inner_error_ = NULL; + _tmp7_ = e; + _tmp8_ = _tmp7_->message; + g_warning ("mpris2-watcher.vala:131: Could not create an introspectable object: %s", _tmp8_); + _g_error_free0 (e); + } + __finally9: + if (_inner_error_ != NULL) { + _g_object_unref0 (introspectable); + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return FALSE; + } + result = FALSE; + _g_object_unref0 (introspectable); + return result; +} + + +static gboolean mpris2_watcher_parse_interfaces (Mpris2Watcher* self, const gchar* interface_info) { + gboolean result = FALSE; + gboolean _result_; + const gchar* _tmp0_; + xmlDoc* _tmp1_ = NULL; + xmlDoc* xml_doc; + xmlDoc* _tmp2_; + xmlDoc* _tmp3_; + xmlNode* _tmp4_ = NULL; + xmlNode* root_node; + xmlNode* _tmp5_; + xmlDoc* _tmp27_; + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (interface_info != NULL, FALSE); + _result_ = FALSE; + _tmp0_ = interface_info; + _tmp1_ = xmlParseDoc (_tmp0_); + xml_doc = _tmp1_; + _tmp2_ = xml_doc; + if (_tmp2_ == NULL) { + g_warning ("mpris2-watcher.vala:143: Mpris2Watcher - parse-interfaces - failed to " \ +"instantiate xml doc"); + result = FALSE; + return result; + } + _tmp3_ = xml_doc; + _tmp4_ = xmlDocGetRootElement (_tmp3_); + root_node = _tmp4_; + _tmp5_ = root_node; + if (_tmp5_ == NULL) { + xmlDoc* _tmp6_; + _tmp6_ = xml_doc; + xmlFreeDoc (_tmp6_); + g_warning ("mpris2-watcher.vala:151: Mpris2Watcher - the interface info xml is emp" \ +"ty"); + result = FALSE; + return result; + } + { + xmlNode* _tmp7_; + xmlNode* _tmp8_; + xmlNode* iter; + _tmp7_ = root_node; + _tmp8_ = _tmp7_->children; + iter = _tmp8_; + { + gboolean _tmp9_; + _tmp9_ = TRUE; + while (TRUE) { + gboolean _tmp10_; + xmlNode* _tmp13_; + xmlNode* _tmp14_; + xmlElementType _tmp15_; + xmlNode* _tmp16_; + xmlAttr* _tmp17_; + xmlAttr* attributes; + xmlAttr* _tmp18_; + xmlNode* _tmp19_; + const gchar* _tmp20_; + gchar* _tmp21_; + gchar* interface_name; + const gchar* _tmp22_; + const gchar* _tmp23_; + gchar* _tmp24_ = NULL; + gchar* _tmp25_; + gboolean _tmp26_; + _tmp10_ = _tmp9_; + if (!_tmp10_) { + xmlNode* _tmp11_; + xmlNode* _tmp12_; + _tmp11_ = iter; + _tmp12_ = _tmp11_->next; + iter = _tmp12_; + } + _tmp9_ = FALSE; + _tmp13_ = iter; + if (!(_tmp13_ != NULL)) { + break; + } + _tmp14_ = iter; + _tmp15_ = _tmp14_->type; + if (_tmp15_ != XML_ELEMENT_NODE) { + continue; + } + _tmp16_ = iter; + _tmp17_ = _tmp16_->properties; + attributes = _tmp17_; + _tmp18_ = attributes; + _tmp19_ = _tmp18_->children; + _tmp20_ = _tmp19_->content; + _tmp21_ = g_strdup (_tmp20_); + interface_name = _tmp21_; + _tmp22_ = interface_name; + g_debug ("mpris2-watcher.vala:163: this dbus object has interface %s ", _tmp22_); + _tmp23_ = interface_name; + _tmp24_ = g_strconcat (MPRIS_PREFIX, "Playlists", NULL); + _tmp25_ = _tmp24_; + _tmp26_ = g_strcmp0 (_tmp23_, _tmp25_) == 0; + _g_free0 (_tmp25_); + if (_tmp26_) { + _result_ = TRUE; + } + _g_free0 (interface_name); + } + } + } + _tmp27_ = xml_doc; + xmlFreeDoc (_tmp27_); + result = _result_; + return result; +} + + +static void g_cclosure_user_marshal_VOID__STRING_STRING_BOOLEAN (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) { + typedef void (*GMarshalFunc_VOID__STRING_STRING_BOOLEAN) (gpointer data1, const char* arg_1, const char* arg_2, gboolean arg_3, gpointer data2); + register GMarshalFunc_VOID__STRING_STRING_BOOLEAN callback; + register GCClosure * cc; + register gpointer data1; + register gpointer data2; + cc = (GCClosure *) closure; + g_return_if_fail (n_param_values == 4); + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = param_values->data[0].v_pointer; + } else { + data1 = param_values->data[0].v_pointer; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_STRING_BOOLEAN) (marshal_data ? marshal_data : cc->callback); + callback (data1, g_value_get_string (param_values + 1), g_value_get_string (param_values + 2), g_value_get_boolean (param_values + 3), data2); +} + + +static void _mpris2_watcher_name_changes_detected_free_desktop_object_name_owner_changed (FreeDesktopObject* _sender, const gchar* name, const gchar* old_owner, const gchar* new_owner, gpointer self) { + mpris2_watcher_name_changes_detected (self, _sender, name, old_owner, new_owner); +} + + +static GObject * mpris2_watcher_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { + GObject * obj; + GObjectClass * parent_class; + Mpris2Watcher * self; + GError * _inner_error_ = NULL; + parent_class = G_OBJECT_CLASS (mpris2_watcher_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = MPRIS2_WATCHER (obj); + { + FreeDesktopObject* _tmp0_ = NULL; + FreeDesktopObject* _tmp1_; + FreeDesktopObject* _tmp2_; + _tmp0_ = g_initable_new (TYPE_FREE_DESKTOP_OBJECT_PROXY, NULL, &_inner_error_, "g-flags", G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, "g-name", FREEDESKTOP_SERVICE, "g-bus-type", G_BUS_TYPE_SESSION, "g-object-path", FREEDESKTOP_OBJECT, "g-interface-name", "org.freedesktop.DBus", NULL); + _tmp1_ = (FreeDesktopObject*) _tmp0_; + if (_inner_error_ != NULL) { + if (_inner_error_->domain == G_IO_ERROR) { + goto __catch10_g_io_error; + } + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + } + _g_object_unref0 (self->priv->fdesktop_obj); + self->priv->fdesktop_obj = _tmp1_; + _tmp2_ = self->priv->fdesktop_obj; + g_signal_connect_object (_tmp2_, "name-owner-changed", (GCallback) _mpris2_watcher_name_changes_detected_free_desktop_object_name_owner_changed, self, 0); + mpris2_watcher_check_for_active_clients (self, NULL, NULL); + } + goto __finally10; + __catch10_g_io_error: + { + GError* e = NULL; + GError* _tmp3_; + const gchar* _tmp4_; + e = _inner_error_; + _inner_error_ = NULL; + _tmp3_ = e; + _tmp4_ = _tmp3_->message; + g_warning ("mpris2-watcher.vala:46: Mpris2watcher could not set up a watch for mpr" \ +"is clients appearing on the bus: %s", _tmp4_); + _g_error_free0 (e); + } + __finally10: + if (_inner_error_ != NULL) { + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + } + return obj; +} + + +static void mpris2_watcher_class_init (Mpris2WatcherClass * klass) { + mpris2_watcher_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (Mpris2WatcherPrivate)); + G_OBJECT_CLASS (klass)->constructor = mpris2_watcher_constructor; + G_OBJECT_CLASS (klass)->finalize = mpris2_watcher_finalize; + g_signal_new ("client_appeared", TYPE_MPRIS2_WATCHER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__STRING_STRING_BOOLEAN, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN); + g_signal_new ("client_disappeared", TYPE_MPRIS2_WATCHER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); +} + + +static void mpris2_watcher_instance_init (Mpris2Watcher * self) { + self->priv = MPRIS2_WATCHER_GET_PRIVATE (self); +} + + +static void mpris2_watcher_finalize (GObject* obj) { + Mpris2Watcher * self; + self = MPRIS2_WATCHER (obj); + _g_object_unref0 (self->priv->fdesktop_obj); + G_OBJECT_CLASS (mpris2_watcher_parent_class)->finalize (obj); +} + + +GType mpris2_watcher_get_type (void) { + static volatile gsize mpris2_watcher_type_id__volatile = 0; + if (g_once_init_enter (&mpris2_watcher_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (Mpris2WatcherClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) mpris2_watcher_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Mpris2Watcher), 0, (GInstanceInitFunc) mpris2_watcher_instance_init, NULL }; + GType mpris2_watcher_type_id; + mpris2_watcher_type_id = g_type_register_static (G_TYPE_OBJECT, "Mpris2Watcher", &g_define_type_info, 0); + g_once_init_leave (&mpris2_watcher_type_id__volatile, mpris2_watcher_type_id); + } + return mpris2_watcher_type_id__volatile; +} + + +static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) { + if ((array != NULL) && (destroy_func != NULL)) { + int i; + for (i = 0; i < array_length; i = i + 1) { + if (((gpointer*) array)[i] != NULL) { + destroy_func (((gpointer*) array)[i]); + } + } + } +} + + +static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) { + _vala_array_destroy (array, array_length, destroy_func); + g_free (array); +} + + + |