[telepathy-idle/master] Add more mandatory properties to MUC channels
Will Thompson
will.thompson at collabora.co.uk
Fri Aug 28 17:01:10 PDT 2009
---
src/idle-muc-channel.c | 120 ++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 106 insertions(+), 14 deletions(-)
diff --git a/src/idle-muc-channel.c b/src/idle-muc-channel.c
index 8396d27..479aebc 100644
--- a/src/idle-muc-channel.c
+++ b/src/idle-muc-channel.c
@@ -66,9 +66,14 @@ enum {
enum {
PROP_CONNECTION = 1,
PROP_OBJECT_PATH,
+ PROP_INTERFACES,
PROP_CHANNEL_TYPE,
PROP_HANDLE_TYPE,
PROP_HANDLE,
+ PROP_TARGET_ID,
+ PROP_REQUESTED,
+ PROP_INITIATOR_HANDLE,
+ PROP_INITIATOR_ID,
PROP_CHANNEL_DESTROYED,
PROP_CHANNEL_PROPERTIES,
LAST_PROPERTY_ENUM
@@ -164,6 +169,12 @@ typedef struct {
guint flags;
} TPProperty;
+static const gchar *muc_channel_interfaces[] = {
+ TP_IFACE_CHANNEL_INTERFACE_PASSWORD,
+ TP_IFACE_CHANNEL_INTERFACE_GROUP,
+ TP_IFACE_PROPERTIES_INTERFACE,
+ NULL
+};
static const TPPropertySignature property_signatures[] = {
{"invite-only", G_TYPE_BOOLEAN},
@@ -222,6 +233,9 @@ struct _IdleMUCChannelPrivate {
TpHandle handle;
const gchar *channel_name;
+ TpHandle initiator;
+ gboolean requested;
+
IdleMUCState state;
IRCChannelModeState mode_state;
@@ -276,6 +290,9 @@ static GObject *idle_muc_channel_constructor(GType type, guint n_props, GObjectC
g_assert(tp_handle_is_valid(room_handles, priv->handle, NULL));
priv->channel_name = tp_handle_inspect(room_handles, priv->handle);
+ if (priv->initiator)
+ tp_handle_ref(room_handles, priv->initiator);
+
bus = tp_get_bus();
dbus_g_connection_register_g_object(bus, priv->object_path, obj);
@@ -310,6 +327,10 @@ static void idle_muc_channel_get_property(GObject *object, guint property_id, GV
g_value_set_string(value, priv->object_path);
break;
+ case PROP_INTERFACES:
+ g_value_set_static_boxed(value, muc_channel_interfaces);
+ break;
+
case PROP_CHANNEL_TYPE:
g_value_set_string(value, TP_IFACE_CHANNEL_TYPE_TEXT);
break;
@@ -322,6 +343,31 @@ static void idle_muc_channel_get_property(GObject *object, guint property_id, GV
g_value_set_uint(value, priv->handle);
break;
+ case PROP_TARGET_ID:
+ g_value_set_string(value, priv->channel_name);
+ break;
+
+ case PROP_REQUESTED:
+ g_value_set_boolean(value, priv->requested);
+ break;
+
+ case PROP_INITIATOR_HANDLE:
+ g_value_set_uint(value, priv->initiator);
+ break;
+
+ case PROP_INITIATOR_ID:
+ if (priv->initiator != 0) {
+ TpHandleRepoIface *handles = tp_base_connection_get_handles(
+ TP_BASE_CONNECTION(priv->connection),
+ TP_HANDLE_TYPE_CONTACT);
+ g_value_set_string(value,
+ tp_handle_inspect(handles, priv->initiator));
+ } else {
+ g_value_set_static_string(value, "");
+ }
+
+ break;
+
case PROP_CHANNEL_DESTROYED:
/* TODO: this should be FALSE if there are still pending messages, so
* the channel manager can respawn the channel.
@@ -330,13 +376,22 @@ static void idle_muc_channel_get_property(GObject *object, guint property_id, GV
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",
- NULL));
+ {
+ GHashTable *props =
+ tp_dbus_properties_mixin_make_properties_hash (
+ object,
+ TP_IFACE_CHANNEL, "Interfaces",
+ TP_IFACE_CHANNEL, "ChannelType",
+ TP_IFACE_CHANNEL, "TargetHandleType",
+ TP_IFACE_CHANNEL, "TargetHandle",
+ TP_IFACE_CHANNEL, "TargetID",
+ TP_IFACE_CHANNEL, "InitiatorHandle",
+ TP_IFACE_CHANNEL, "InitiatorID",
+ TP_IFACE_CHANNEL, "Requested",
+ NULL);
+ g_value_take_boxed (value, props);
break;
+ }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
@@ -370,6 +425,14 @@ static void idle_muc_channel_set_property(GObject *object, guint property_id, co
IDLE_DEBUG("setting handle to %u", priv->handle);
break;
+ case PROP_INITIATOR_HANDLE:
+ priv->initiator = g_value_get_uint(value);
+ break;
+
+ case PROP_REQUESTED:
+ priv->requested = g_value_get_boolean(value);
+ break;
+
case PROP_CHANNEL_TYPE:
case PROP_HANDLE_TYPE:
/* writeable in the interface, but setting them makes
@@ -406,15 +469,47 @@ static void idle_muc_channel_class_init (IdleMUCChannelClass *idle_muc_channel_c
param_spec = g_param_spec_object ("connection", "IdleConnection object", "The IdleConnection object that owns this MUCChannel object.", IDLE_TYPE_CONNECTION, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB);
g_object_class_install_property (object_class, PROP_CONNECTION, param_spec);
+ param_spec = g_param_spec_boxed ("interfaces", "Extra D-Bus interfaces",
+ "Interfaces implemented by this object besides Channel",
+ 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", "Room's identifier",
+ "The name of the IRC channel",
+ 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_boolean ("requested", "Requested?",
+ "True if this channel was requested by the local user",
+ FALSE,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_REQUESTED, 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_CONSTRUCT_ONLY | G_PARAM_READWRITE | 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);
+
signals[JOIN_READY] = g_signal_new("join-ready", G_OBJECT_CLASS_TYPE(idle_muc_channel_class), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
tp_group_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleMUCChannelClass, group_class), add_member, remove_member);
tp_text_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleMUCChannelClass, text_class));
static TpDBusPropertiesMixinPropImpl channel_props[] = {
+ { "Interfaces", "interfaces", NULL },
+ { "ChannelType", "channel-type", NULL },
{ "TargetHandleType", "handle-type", NULL },
{ "TargetHandle", "handle", NULL },
- { "ChannelType", "channel-type", NULL },
+ { "TargetID", "target-id", NULL },
+ { "InitiatorHandle", "initiator-handle", NULL },
+ { "InitiatorID", "initiator-id", NULL },
+ { "Requested", "requested", NULL },
{ NULL }
};
static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
@@ -452,6 +547,9 @@ void idle_muc_channel_finalize (GObject *object) {
TpHandleRepoIface *handles = tp_base_connection_get_handles(TP_BASE_CONNECTION(priv->connection), TP_HANDLE_TYPE_ROOM);
tp_handle_unref(handles, priv->handle);
+ if (priv->initiator)
+ tp_handle_unref(handles, priv->initiator);
+
if (priv->object_path)
g_free(priv->object_path);
@@ -1699,13 +1797,7 @@ static void idle_muc_channel_get_handle (TpSvcChannel *iface, DBusGMethodInvocat
* Returns: TRUE if successful, FALSE if an error was thrown.
*/
static void idle_muc_channel_get_interfaces (TpSvcChannel *obj, DBusGMethodInvocation *context) {
- const gchar *interfaces[] = {
- TP_IFACE_CHANNEL_INTERFACE_PASSWORD,
- TP_IFACE_CHANNEL_INTERFACE_GROUP,
- TP_IFACE_PROPERTIES_INTERFACE,
- NULL};
-
- tp_svc_channel_return_from_get_interfaces(context, interfaces);
+ tp_svc_channel_return_from_get_interfaces(context, muc_channel_interfaces);
}
/**
--
1.5.6.5
More information about the telepathy-commits
mailing list