[Telepathy-commits] [telepathy-salut/master] SalutMucChannel: implement Channel.FUTURE and ExportableChannel
Will Thompson
will.thompson at collabora.co.uk
Thu Oct 23 07:30:41 PDT 2008
---
src/salut-avahi-muc-channel.c | 2 +
src/salut-avahi-muc-channel.h | 2 +-
src/salut-avahi-muc-manager.c | 5 ++-
src/salut-muc-channel.c | 70 ++++++++++++++++++++++++++++++++++++++--
src/salut-muc-manager.c | 13 ++++---
src/salut-muc-manager.h | 3 +-
6 files changed, 81 insertions(+), 14 deletions(-)
diff --git a/src/salut-avahi-muc-channel.c b/src/salut-avahi-muc-channel.c
index c231941..26d868a 100644
--- a/src/salut-avahi-muc-channel.c
+++ b/src/salut-avahi-muc-channel.c
@@ -346,6 +346,7 @@ salut_avahi_muc_channel_new (SalutConnection *connection,
TpHandle handle,
const gchar *name,
SalutAvahiDiscoveryClient *discovery_client,
+ TpHandle initiator,
gboolean creator,
SalutXmppConnectionManager *xcm)
{
@@ -356,6 +357,7 @@ salut_avahi_muc_channel_new (SalutConnection *connection,
"handle", handle,
"name", name,
"discovery-client", discovery_client,
+ "initiator-handle", initiator,
"creator", creator,
"xmpp-connection-manager", xcm,
NULL);
diff --git a/src/salut-avahi-muc-channel.h b/src/salut-avahi-muc-channel.h
index 8daaab8..4af06fb 100644
--- a/src/salut-avahi-muc-channel.h
+++ b/src/salut-avahi-muc-channel.h
@@ -65,7 +65,7 @@ GType salut_avahi_muc_channel_get_type (void);
SalutAvahiMucChannel * salut_avahi_muc_channel_new (SalutConnection *connection,
const gchar *path, GibberMucConnection *muc_connection, TpHandle handle,
const gchar *name, SalutAvahiDiscoveryClient *discovery_client,
- gboolean creator, SalutXmppConnectionManager *xcm);
+ TpHandle initiator, gboolean creator, SalutXmppConnectionManager *xcm);
G_END_DECLS
diff --git a/src/salut-avahi-muc-manager.c b/src/salut-avahi-muc-manager.c
index fa8f3a4..3a1a9a4 100644
--- a/src/salut-avahi-muc-manager.c
+++ b/src/salut-avahi-muc-manager.c
@@ -356,6 +356,7 @@ salut_avahi_muc_manager_create_muc_channel (
GibberMucConnection *muc_connection,
TpHandle handle,
const gchar *name,
+ TpHandle initiator,
gboolean creator,
SalutXmppConnectionManager *xcm)
{
@@ -363,8 +364,8 @@ salut_avahi_muc_manager_create_muc_channel (
SalutAvahiMucManagerPrivate *priv = SALUT_AVAHI_MUC_MANAGER_GET_PRIVATE (self);
return SALUT_MUC_CHANNEL (salut_avahi_muc_channel_new (connection,
- path, muc_connection, handle, name, priv->discovery_client, creator,
- xcm));
+ path, muc_connection, handle, name, priv->discovery_client, initiator,
+ creator, xcm));
}
static void
diff --git a/src/salut-muc-channel.c b/src/salut-muc-channel.c
index 4f3e148..4117fd4 100644
--- a/src/salut-muc-channel.c
+++ b/src/salut-muc-channel.c
@@ -44,6 +44,8 @@
#include <gibber/gibber-muc-connection.h>
+#include "extensions/extensions.h"
+
#include "salut-connection.h"
#include "salut-self.h"
#include "salut-xmpp-connection-manager.h"
@@ -58,6 +60,8 @@ G_DEFINE_TYPE_WITH_CODE(SalutMucChannel, salut_muc_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);
+ G_IMPLEMENT_INTERFACE (SALUT_TYPE_SVC_CHANNEL_FUTURE, NULL);
+ G_IMPLEMENT_INTERFACE (TP_TYPE_EXPORTABLE_CHANNEL, NULL);
G_IMPLEMENT_INTERFACE(TP_TYPE_CHANNEL_IFACE, NULL);
G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_INTERFACE_GROUP,
tp_group_mixin_iface_init);
@@ -93,6 +97,9 @@ enum
PROP_XMPP_CONNECTION_MANAGER,
PROP_INTERFACES,
PROP_TARGET_ID,
+ PROP_REQUESTED,
+ PROP_INITIATOR_HANDLE,
+ PROP_INITIATOR_ID,
LAST_PROPERTY
};
@@ -114,6 +121,7 @@ struct _SalutMucChannelPrivate
/* (gchar *) -> (SalutContact *) */
GHashTable *senders;
SalutMucManager *muc_manager;
+ TpHandle initiator;
};
#define SALUT_MUC_CHANNEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SALUT_TYPE_MUC_CHANNEL, SalutMucChannelPrivate))
@@ -141,6 +149,7 @@ salut_muc_channel_get_property (GObject *object,
{
SalutMucChannel *chan = SALUT_MUC_CHANNEL (object);
SalutMucChannelPrivate *priv = SALUT_MUC_CHANNEL_GET_PRIVATE (chan);
+ TpBaseConnection *base_conn = (TpBaseConnection *) chan->connection;
switch (property_id) {
case PROP_OBJECT_PATH:
@@ -175,12 +184,27 @@ salut_muc_channel_get_property (GObject *object,
break;
case PROP_TARGET_ID:
{
- TpHandleRepoIface *repo = tp_base_connection_get_handles (
- (TpBaseConnection *) chan->connection, TP_HANDLE_TYPE_ROOM);
+ TpHandleRepoIface *repo = tp_base_connection_get_handles (base_conn,
+ TP_HANDLE_TYPE_ROOM);
- g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
+ g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
}
break;
+ case PROP_INITIATOR_HANDLE:
+ g_value_set_uint (value, priv->initiator);
+ break;
+ case PROP_INITIATOR_ID:
+ {
+ TpHandleRepoIface *repo = tp_base_connection_get_handles (base_conn,
+ TP_HANDLE_TYPE_CONTACT);
+
+ g_value_set_string (value, tp_handle_inspect (repo, priv->initiator));
+ }
+ break;
+ case PROP_REQUESTED:
+ g_value_set_boolean (value,
+ (priv->initiator == tp_base_connection_get_self_handle (base_conn)));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -228,7 +252,10 @@ salut_muc_channel_set_property (GObject *object,
case PROP_CREATOR:
priv->creator = g_value_get_boolean (value);
break;
- case PROP_XMPP_CONNECTION_MANAGER:
+ case PROP_INITIATOR_HANDLE:
+ priv->initiator = g_value_get_uint (value);
+ break;
+ case PROP_XMPP_CONNECTION_MANAGER:
priv->xmpp_connection_manager = g_value_get_object (value);
break;
default:
@@ -691,12 +718,23 @@ salut_muc_channel_class_init (SalutMucChannelClass *salut_muc_channel_class) {
{ "Interfaces", "interfaces", NULL },
{ NULL }
};
+ static TpDBusPropertiesMixinPropImpl future_props[] = {
+ { "Requested", "requested", NULL },
+ { "InitiatorHandle", "initiator-handle", NULL },
+ { "InitiatorID", "initiator-id", NULL },
+ { NULL }
+ };
static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
{ TP_IFACE_CHANNEL,
tp_dbus_properties_mixin_getter_gobject_properties,
NULL,
channel_props,
},
+ { SALUT_IFACE_CHANNEL_FUTURE,
+ tp_dbus_properties_mixin_getter_gobject_properties,
+ NULL,
+ future_props,
+ },
{ NULL }
};
@@ -725,6 +763,30 @@ salut_muc_channel_class_init (SalutMucChannelClass *salut_muc_channel_class) {
G_PARAM_STATIC_BLURB);
g_object_class_install_property (object_class, PROP_TARGET_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_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_REQUESTED, param_spec);
+
+ param_spec = g_param_spec_uint ("initiator-handle", "Initiator's handle",
+ "The contact which invited us to the MUC, or ourselves if we joined of "
+ "our own accord",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
+ G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_INITIATOR_HANDLE,
+ param_spec);
+
+ param_spec = g_param_spec_string ("initiator-id", "Initiator JID",
+ "The string obtained by inspecting this channel's initiator-handle",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_INITIATOR_ID,
+ param_spec);
+
param_spec = g_param_spec_string ("name",
"Name of the muc group",
"The name of the muc group",
diff --git a/src/salut-muc-manager.c b/src/salut-muc-manager.c
index eb7ef70..f94e2ab 100644
--- a/src/salut-muc-manager.c
+++ b/src/salut-muc-manager.c
@@ -441,6 +441,7 @@ static SalutMucChannel *
salut_muc_manager_new_muc_channel (SalutMucManager *mgr,
TpHandle handle,
GibberMucConnection *connection,
+ TpHandle initiator,
gboolean new_connection)
{
SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE(mgr);
@@ -462,8 +463,8 @@ salut_muc_manager_new_muc_channel (SalutMucManager *mgr,
handle);
chan = SALUT_MUC_MANAGER_GET_CLASS (mgr)->create_muc_channel (mgr,
- priv->connection, path, connection, handle, name, new_connection,
- priv->xmpp_connection_manager);
+ priv->connection, path, connection, handle, name, initiator,
+ new_connection, priv->xmpp_connection_manager);
g_free (path);
g_signal_connect (chan, "closed", G_CALLBACK (muc_channel_closed_cb), mgr);
@@ -585,7 +586,7 @@ salut_muc_manager_request_new_muc_channel (SalutMucManager *mgr,
DEBUG ("Connect succeeded");
text_chan = salut_muc_manager_new_muc_channel (mgr, handle,
- connection, params == NULL);
+ connection, base_connection->self_handle, params == NULL);
r = salut_muc_channel_invited (text_chan,
base_connection->self_handle, NULL, NULL);
/* Inviting ourselves to a connected channel should always
@@ -878,6 +879,8 @@ invite_stanza_callback (SalutXmppConnectionManager *mgr,
chan = g_hash_table_lookup (priv->text_channels,
GINT_TO_POINTER (room_handle));
+ inviter_handle = tp_handle_ensure (contact_repo, contact->name, NULL, NULL);
+
if (chan == NULL)
{
connection = _get_connection (self, GIBBER_TELEPATHY_NS_CLIQUE,
@@ -896,14 +899,12 @@ invite_stanza_callback (SalutXmppConnectionManager *mgr,
}
/* Need to create a new one */
chan = salut_muc_manager_new_muc_channel (self, room_handle,
- connection, FALSE);
+ connection, inviter_handle, FALSE);
}
/* FIXME handle properly */
g_assert (chan != NULL);
- inviter_handle = tp_handle_ensure (contact_repo, contact->name, NULL, NULL);
-
#ifdef ENABLE_OLPC
salut_connection_olpc_observe_invitation (priv->connection, room_handle,
inviter_handle, invite);
diff --git a/src/salut-muc-manager.h b/src/salut-muc-manager.h
index b953b11..e0cf962 100644
--- a/src/salut-muc-manager.h
+++ b/src/salut-muc-manager.h
@@ -50,7 +50,8 @@ struct _SalutMucManagerClass {
SalutMucChannel * (*create_muc_channel) (SalutMucManager *self,
SalutConnection *connection, const gchar *path,
GibberMucConnection *muc_connection, TpHandle handle,
- const gchar *name, gboolean creator, SalutXmppConnectionManager *xcm);
+ const gchar *name, TpHandle initiator, gboolean creator,
+ SalutXmppConnectionManager *xcm);
};
struct _SalutMucManager {
--
1.5.6.5
More information about the Telepathy-commits
mailing list