diff options
Diffstat (limited to 'src/roomlist-channel.c')
-rw-r--r-- | src/roomlist-channel.c | 402 |
1 files changed, 44 insertions, 358 deletions
diff --git a/src/roomlist-channel.c b/src/roomlist-channel.c index 66ca70d9..566db977 100644 --- a/src/roomlist-channel.c +++ b/src/roomlist-channel.c @@ -29,25 +29,17 @@ #include <telepathy-glib/enums.h> #include <telepathy-glib/gtypes.h> #include <telepathy-glib/interfaces.h> -#include <telepathy-glib/channel-iface.h> #include <telepathy-glib/svc-channel.h> -#include <telepathy-glib/svc-generic.h> #define DEBUG_FLAG DEBUG_ROOMLIST #include "debug.h" -static void channel_iface_init (gpointer, gpointer); static void roomlist_iface_init (gpointer, gpointer); G_DEFINE_TYPE_WITH_CODE (SalutRoomlistChannel, salut_roomlist_channel, - G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES, - tp_dbus_properties_mixin_iface_init); - G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL, channel_iface_init); + TP_TYPE_BASE_CHANNEL, G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_TYPE_ROOM_LIST, roomlist_iface_init); - G_IMPLEMENT_INTERFACE (TP_TYPE_EXPORTABLE_CHANNEL, NULL); - G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL) ); static const char *salut_roomlist_channel_interfaces[] = { NULL }; @@ -55,69 +47,25 @@ static const char *salut_roomlist_channel_interfaces[] = { NULL }; /* properties */ enum { - PROP_OBJECT_PATH = 1, - PROP_CHANNEL_TYPE, - PROP_HANDLE_TYPE, - PROP_HANDLE, - PROP_CONNECTION, - PROP_INTERFACES, - PROP_CONFERENCE_SERVER, - PROP_TARGET_ID, - PROP_INITIATOR_HANDLE, - PROP_INITIATOR_ID, - PROP_REQUESTED, - PROP_CHANNEL_DESTROYED, - PROP_CHANNEL_PROPERTIES, + PROP_CONFERENCE_SERVER = 1, LAST_PROPERTY }; /* private structure */ -typedef struct _SalutRoomlistChannelPrivate SalutRoomlistChannelPrivate; - struct _SalutRoomlistChannelPrivate { - SalutConnection *connection; - gchar *object_path; - GPtrArray *rooms; - gboolean closed; gboolean dispose_has_run; }; -#define SALUT_ROOMLIST_CHANNEL_GET_PRIVATE(obj) \ - ((SalutRoomlistChannelPrivate *) ((SalutRoomlistChannel *) obj)->priv) - static void salut_roomlist_channel_init (SalutRoomlistChannel *self) { - SalutRoomlistChannelPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SALUT_TYPE_ROOMLIST_CHANNEL, SalutRoomlistChannelPrivate); - self->priv = priv; - - priv->rooms = g_ptr_array_new (); -} - -static GObject * -salut_roomlist_channel_constructor (GType type, - guint n_props, - GObjectConstructParam *props) -{ - GObject *obj; - SalutRoomlistChannelPrivate *priv; - TpDBusDaemon *bus; - TpBaseConnection *base_conn; - - obj = G_OBJECT_CLASS (salut_roomlist_channel_parent_class)->constructor ( - type, n_props, props); - priv = SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (SALUT_ROOMLIST_CHANNEL (obj)); - - base_conn = TP_BASE_CONNECTION (priv->connection); - bus = tp_base_connection_get_dbus_daemon (base_conn); - tp_dbus_daemon_register_object (bus, priv->object_path, obj); - - return obj; + self->priv->rooms = g_ptr_array_new (); } static void @@ -126,151 +74,47 @@ salut_roomlist_channel_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - SalutRoomlistChannel *chan = SALUT_ROOMLIST_CHANNEL (object); - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (chan); - TpBaseConnection *conn = (TpBaseConnection *) priv->connection; - switch (property_id) { - case PROP_OBJECT_PATH: - g_value_set_string (value, priv->object_path); - break; - case PROP_CHANNEL_TYPE: - g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_ROOM_LIST); - break; - case PROP_HANDLE_TYPE: - g_value_set_uint (value, TP_HANDLE_TYPE_NONE); - break; - case PROP_HANDLE: - g_value_set_uint (value, 0); - break; - case PROP_CONNECTION: - g_value_set_object (value, priv->connection); - break; - case PROP_INTERFACES: - g_value_set_static_boxed (value, salut_roomlist_channel_interfaces); - break; case PROP_CONFERENCE_SERVER: /* Salut does not use a server, so this string is always empty */ g_value_set_string (value, ""); break; - case PROP_TARGET_ID: - g_value_set_static_string (value, ""); - break; - case PROP_INITIATOR_HANDLE: - /* Room listing is always initiated by the local user */ - g_value_set_uint (value, conn->self_handle); - break; - case PROP_INITIATOR_ID: - { - TpHandleRepoIface *repo = tp_base_connection_get_handles (conn, - TP_HANDLE_TYPE_CONTACT); - - g_value_set_string (value, - tp_handle_inspect (repo, conn->self_handle)); - } - break; - case PROP_REQUESTED: - g_value_set_boolean (value, TRUE); - break; - case PROP_CHANNEL_DESTROYED: - g_value_set_boolean (value, priv->closed); - break; - case PROP_CHANNEL_PROPERTIES: - g_value_take_boxed (value, - tp_dbus_properties_mixin_make_properties_hash (object, - TP_IFACE_CHANNEL, "TargetHandle", - TP_IFACE_CHANNEL, "TargetHandleType", - TP_IFACE_CHANNEL, "ChannelType", - TP_IFACE_CHANNEL, "TargetID", - TP_IFACE_CHANNEL, "InitiatorHandle", - TP_IFACE_CHANNEL, "InitiatorID", - TP_IFACE_CHANNEL, "Requested", - TP_IFACE_CHANNEL, "Interfaces", - TP_IFACE_CHANNEL_TYPE_ROOM_LIST, "Server", - NULL)); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } +static void salut_roomlist_channel_dispose (GObject *object); +static void salut_roomlist_channel_finalize (GObject *object); + static void -salut_roomlist_channel_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) +salut_roomlist_channel_fill_immutable_properties (TpBaseChannel *chan, + GHashTable *properties) { - SalutRoomlistChannel *chan = SALUT_ROOMLIST_CHANNEL (object); - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (chan); - const gchar *value_str; + TpBaseChannelClass *cls = TP_BASE_CHANNEL_CLASS ( + salut_roomlist_channel_parent_class); - switch (property_id) { - case PROP_OBJECT_PATH: - g_free (priv->object_path); - priv->object_path = g_value_dup_string (value); - break; - case PROP_CHANNEL_TYPE: - /* this property is writable in the interface (in - * telepathy-glib > 0.7.0), but not actually - * meaningfully changeable on this channel, so we do nothing */ - value_str = g_value_get_string (value); - g_assert (value_str == NULL || !tp_strdiff (value_str, - TP_IFACE_CHANNEL_TYPE_ROOM_LIST)); - break; - case PROP_HANDLE: - /* this property is writable in the interface, but not actually - * meaningfully changable on this channel, so we do nothing */ - g_assert (g_value_get_uint (value) == 0); - break; - case PROP_HANDLE_TYPE: - /* this property is writable in the interface, but not actually - * meaningfully changable on this channel, so we do nothing. - * */ - g_assert (g_value_get_uint (value) == TP_HANDLE_TYPE_NONE - || g_value_get_uint (value) == TP_UNKNOWN_HANDLE_TYPE); - break; - case PROP_CONNECTION: - priv->connection = g_value_get_object (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} + cls->fill_immutable_properties (chan, properties); -static void salut_roomlist_channel_dispose (GObject *object); -static void salut_roomlist_channel_finalize (GObject *object); + tp_dbus_properties_mixin_fill_properties_hash ( + G_OBJECT (chan), properties, + TP_IFACE_CHANNEL_TYPE_ROOM_LIST, "Server", + NULL); +} static void salut_roomlist_channel_class_init ( SalutRoomlistChannelClass *salut_roomlist_channel_class) { GObjectClass *object_class = G_OBJECT_CLASS (salut_roomlist_channel_class); + TpBaseChannelClass *base_class = TP_BASE_CHANNEL_CLASS (salut_roomlist_channel_class); GParamSpec *param_spec; - static TpDBusPropertiesMixinPropImpl channel_props[] = { - { "TargetHandleType", "handle-type", NULL }, - { "TargetHandle", "handle", NULL }, - { "TargetID", "target-id", NULL }, - { "InitiatorHandle", "initiator-handle", NULL }, - { "InitiatorID", "initiator-id", NULL }, - { "Requested", "requested", NULL }, - { "ChannelType", "channel-type", NULL }, - { "Interfaces", "interfaces", NULL }, - { NULL } - }; static TpDBusPropertiesMixinPropImpl roomlist_props[] = { { "Server", "conference-server", NULL }, { NULL } }; static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = { - { TP_IFACE_CHANNEL, - tp_dbus_properties_mixin_getter_gobject_properties, - NULL, - channel_props, - }, { TP_IFACE_CHANNEL_TYPE_ROOM_LIST, tp_dbus_properties_mixin_getter_gobject_properties, NULL, @@ -282,67 +126,15 @@ salut_roomlist_channel_class_init ( g_type_class_add_private (salut_roomlist_channel_class, sizeof (SalutRoomlistChannelPrivate)); - object_class->constructor = salut_roomlist_channel_constructor; - object_class->get_property = salut_roomlist_channel_get_property; - object_class->set_property = salut_roomlist_channel_set_property; - object_class->dispose = salut_roomlist_channel_dispose; object_class->finalize = salut_roomlist_channel_finalize; - g_object_class_override_property (object_class, PROP_OBJECT_PATH, - "object-path"); - g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, - "channel-type"); - g_object_class_override_property (object_class, PROP_HANDLE_TYPE, - "handle-type"); - g_object_class_override_property (object_class, PROP_HANDLE, - "handle"); - g_object_class_override_property (object_class, PROP_CHANNEL_DESTROYED, - "channel-destroyed"); - g_object_class_override_property (object_class, PROP_CHANNEL_PROPERTIES, - "channel-properties"); - - param_spec = g_param_spec_boxed ("interfaces", "Extra D-Bus interfaces", - "Additional Channel.Interface.* interfaces", - G_TYPE_STRV, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_INTERFACES, param_spec); - - param_spec = g_param_spec_string ("target-id", "Target JID", - "The string obtained by inspecting this channel's handle", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_TARGET_ID, param_spec); - - param_spec = g_param_spec_uint ("initiator-handle", "Initiator's handle", - "The contact who initiated the channel", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_INITIATOR_HANDLE, - param_spec); - - param_spec = g_param_spec_string ("initiator-id", "Initiator's bare JID", - "The string obtained by inspecting the initiator-handle", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_INITIATOR_ID, - param_spec); - - param_spec = g_param_spec_boolean ("requested", "Requested?", - "True if this channel was requested by the local user", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_REQUESTED, param_spec); - - param_spec = g_param_spec_object ("connection", "SalutConnection object", - "Salut connection object that owns this " - "room list channel object.", - SALUT_TYPE_CONNECTION, - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + base_class->channel_type = TP_IFACE_CHANNEL_TYPE_ROOM_LIST; + base_class->interfaces = salut_roomlist_channel_interfaces; + base_class->target_handle_type = TP_HANDLE_TYPE_NONE; + base_class->fill_immutable_properties = + salut_roomlist_channel_fill_immutable_properties; param_spec = g_param_spec_string ("conference-server", "Name of conference server to use", @@ -361,30 +153,17 @@ salut_roomlist_channel_class_init ( static void rooms_free (SalutRoomlistChannel *self) { - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); - TpBaseConnection *base_connection = (TpBaseConnection *) (priv->connection); - TpHandleRepoIface *room_repo = - tp_base_connection_get_handles (base_connection, TP_HANDLE_TYPE_ROOM); + SalutRoomlistChannelPrivate *priv = self->priv; guint i; g_assert (priv->rooms != NULL); for (i = 0; i < priv->rooms->len; i++) { - GValue room = {0,}; gpointer boxed; - TpHandle handle; boxed = g_ptr_array_index (priv->rooms, i); - g_value_init (&room, TP_STRUCT_TYPE_ROOM_INFO); - g_value_set_static_boxed (&room, boxed); - dbus_g_type_struct_get (&room, - 0, &handle, - G_MAXUINT); - g_boxed_free (TP_STRUCT_TYPE_ROOM_INFO, boxed); - tp_handle_unref (room_repo, handle); } g_ptr_array_unref (priv->rooms); @@ -395,20 +174,13 @@ static void salut_roomlist_channel_dispose (GObject *object) { SalutRoomlistChannel *self = SALUT_ROOMLIST_CHANNEL (object); - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); + SalutRoomlistChannelPrivate *priv = self->priv; if (priv->dispose_has_run) return; priv->dispose_has_run = TRUE; - if (!priv->closed) - { - priv->closed = TRUE; - tp_svc_channel_emit_closed ((TpSvcChannel *) object); - } - if (G_OBJECT_CLASS (salut_roomlist_channel_parent_class)->dispose) G_OBJECT_CLASS (salut_roomlist_channel_parent_class)->dispose (object); } @@ -417,40 +189,44 @@ static void salut_roomlist_channel_finalize (GObject *object) { SalutRoomlistChannel *self = SALUT_ROOMLIST_CHANNEL (object); - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); + SalutRoomlistChannelPrivate *priv = self->priv; /* free any data held directly by the object here */ - g_free (priv->object_path); - if (priv->rooms != NULL) rooms_free (self); - G_OBJECT_CLASS (salut_roomlist_channel_parent_class)->finalize (object); + if (G_OBJECT_CLASS (salut_roomlist_channel_parent_class)->finalize) + G_OBJECT_CLASS (salut_roomlist_channel_parent_class)->finalize (object); } SalutRoomlistChannel * salut_roomlist_channel_new (SalutConnection *conn, const gchar *object_path) { + TpHandle initiator; + g_return_val_if_fail (SALUT_IS_CONNECTION (conn), NULL); g_return_val_if_fail (object_path != NULL, NULL); + initiator = tp_base_connection_get_self_handle ((TpBaseConnection *) conn); + return SALUT_ROOMLIST_CHANNEL ( g_object_new (SALUT_TYPE_ROOMLIST_CHANNEL, - "connection", conn, - "object-path", object_path, - NULL)); + "connection", conn, + "object-path", object_path, + "initiator-handle", initiator, + "requested", TRUE, + NULL)); } void salut_roomlist_channel_add_room (SalutRoomlistChannel *self, const gchar *room_name) { - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); - TpBaseConnection *base_connection = (TpBaseConnection *) (priv->connection); + SalutRoomlistChannelPrivate *priv = self->priv; + TpBaseConnection *base_connection = tp_base_channel_get_connection ( + TP_BASE_CHANNEL (self)); TpHandleRepoIface *room_repo = tp_base_connection_get_handles (base_connection, TP_HANDLE_TYPE_ROOM); GValue room = {0,}; @@ -487,9 +263,9 @@ void salut_roomlist_channel_remove_room (SalutRoomlistChannel *self, const gchar *room_name) { - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); - TpBaseConnection *base_connection = (TpBaseConnection *) (priv->connection); + SalutRoomlistChannelPrivate *priv = self->priv; + TpBaseConnection *base_connection = tp_base_channel_get_connection ( + TP_BASE_CHANNEL (self)); TpHandleRepoIface *room_repo = tp_base_connection_get_handles (base_connection, TP_HANDLE_TYPE_ROOM); TpHandle handle; @@ -516,83 +292,12 @@ salut_roomlist_channel_remove_room (SalutRoomlistChannel *self, { g_boxed_free (TP_STRUCT_TYPE_ROOM_INFO, boxed); g_ptr_array_remove_index_fast (priv->rooms, i); - tp_handle_unref (room_repo, handle); DEBUG ("remove %s", room_name); break; } } } -/************************* D-Bus Method definitions **************************/ - -/** - * salut_roomlist_channel_close - * - * Implements D-Bus method Close - * on interface org.freedesktop.Telepathy.Channel - */ -static void -salut_roomlist_channel_close (TpSvcChannel *iface, - DBusGMethodInvocation *context) -{ - SalutRoomlistChannel *self = SALUT_ROOMLIST_CHANNEL (iface); - SalutRoomlistChannelPrivate *priv = - SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); - g_assert (SALUT_IS_ROOMLIST_CHANNEL (self)); - - DEBUG ("called on %p", self); - - tp_svc_channel_emit_closed (iface); - priv->closed = TRUE; - - tp_svc_channel_return_from_close (context); -} - - -/** - * salut_roomlist_channel_get_channel_type - * - * Implements D-Bus method GetChannelType - * on interface org.freedesktop.Telepathy.Channel - */ -static void -salut_roomlist_channel_get_channel_type (TpSvcChannel *iface, - DBusGMethodInvocation *context) -{ - tp_svc_channel_return_from_get_channel_type (context, - TP_IFACE_CHANNEL_TYPE_ROOM_LIST); -} - - -/** - * salut_roomlist_channel_get_handle - * - * Implements D-Bus method GetHandle - * on interface org.freedesktop.Telepathy.Channel - */ -static void -salut_roomlist_channel_get_handle (TpSvcChannel *self, - DBusGMethodInvocation *context) -{ - tp_svc_channel_return_from_get_handle (context, 0, 0); -} - - -/** - * salut_roomlist_channel_get_interfaces - * - * Implements D-Bus method GetInterfaces - * on interface org.freedesktop.Telepathy.Channel - */ -static void -salut_roomlist_channel_get_interfaces (TpSvcChannel *iface, - DBusGMethodInvocation *context) -{ - tp_svc_channel_return_from_get_interfaces (context, - salut_roomlist_channel_interfaces); -} - - /** * salut_roomlist_channel_get_listing_rooms * @@ -635,11 +340,7 @@ salut_roomlist_channel_list_rooms (TpSvcChannelTypeRoomList *iface, DBusGMethodInvocation *context) { SalutRoomlistChannel *self = SALUT_ROOMLIST_CHANNEL (iface); - SalutRoomlistChannelPrivate *priv; - - g_assert (SALUT_IS_ROOMLIST_CHANNEL (self)); - - priv = SALUT_ROOMLIST_CHANNEL_GET_PRIVATE (self); + SalutRoomlistChannelPrivate *priv = self->priv; tp_svc_channel_type_room_list_emit_listing_rooms (iface, TRUE); tp_svc_channel_type_room_list_emit_got_rooms (iface, priv->rooms); @@ -662,21 +363,6 @@ salut_roomlist_channel_stop_listing (TpSvcChannelTypeRoomList *iface, } static void -channel_iface_init (gpointer g_iface, - gpointer iface_data) -{ - TpSvcChannelClass *klass = (TpSvcChannelClass *) g_iface; - -#define IMPLEMENT(x) tp_svc_channel_implement_##x (\ - klass, salut_roomlist_channel_##x) - IMPLEMENT(close); - IMPLEMENT(get_channel_type); - IMPLEMENT(get_handle); - IMPLEMENT(get_interfaces); -#undef IMPLEMENT -} - -static void roomlist_iface_init (gpointer g_iface, gpointer iface_data) { |