[Telepathy-commits] [telepathy-gabble/master] Abstract enhanced capabilities in channel managers
Alban Crequy
alban.crequy at collabora.co.uk
Fri Dec 5 09:42:32 PST 2008
---
src/channel-manager.c | 62 ++++++++++++++++++++++++++
src/channel-manager.h | 30 +++++++++++++
src/connection.c | 8 ++--
src/presence-cache.c | 116 +++++++++++++++++++++++++++++++++++++++++++------
src/presence-cache.h | 6 +++
src/presence.c | 47 ++++++++++++++++++--
src/presence.h | 4 +-
tests/test-presence.c | 4 +-
8 files changed, 251 insertions(+), 26 deletions(-)
diff --git a/src/channel-manager.c b/src/channel-manager.c
index dd94b74..fd6808f 100644
--- a/src/channel-manager.c
+++ b/src/channel-manager.c
@@ -363,6 +363,68 @@ void gabble_channel_manager_get_contact_capabilities (
/* ... else assume there is not caps for this kind of channels */
}
+gpointer gabble_channel_manager_parse_capabilities (
+ GabbleChannelManager *manager,
+ GabbleConnection *conn)
+{
+ GabbleChannelManagerIface *iface = GABBLE_CHANNEL_MANAGER_GET_INTERFACE (
+ manager);
+ GabbleChannelManagerParseCapsFunc method = iface->parse_caps;
+
+ if (method != NULL)
+ {
+ return method (manager, conn);
+ }
+ /* ... else assume there is not caps for this kind of channels */
+ return NULL;
+}
+
+void gabble_channel_manager_free_capabilities (GabbleChannelManager *manager,
+ gpointer *specific_caps)
+{
+ GabbleChannelManagerIface *iface = GABBLE_CHANNEL_MANAGER_GET_INTERFACE (
+ manager);
+ GabbleChannelManagerFreeCapsFunc method = iface->free_caps;
+
+ if (method != NULL)
+ {
+ method (manager, specific_caps);
+ }
+ /* ... else assume there is no need to free */
+}
+
+void gabble_channel_manager_copy_capabilities (GabbleChannelManager *manager,
+ gpointer *specific_caps_out,
+ gpointer specific_caps_in)
+{
+ GabbleChannelManagerIface *iface = GABBLE_CHANNEL_MANAGER_GET_INTERFACE (
+ manager);
+ GabbleChannelManagerCopyCapsFunc method = iface->copy_caps;
+
+ if (method != NULL)
+ {
+ method (manager, specific_caps_out, specific_caps_in);
+ }
+ else
+ *specific_caps_out = NULL;
+}
+
+void gabble_channel_manager_update_capabilities (
+ GabbleChannelManager *manager,
+ gpointer specific_caps_out,
+ gpointer specific_caps_in)
+{
+ GabbleChannelManagerIface *iface = GABBLE_CHANNEL_MANAGER_GET_INTERFACE (
+ manager);
+ GabbleChannelManagerCopyCapsFunc method = iface->update_caps;
+
+ if (method != NULL)
+ {
+ method (manager, specific_caps_out, specific_caps_in);
+ }
+ /* ... else, do what? */
+}
+
void
gabble_channel_manager_foreach_channel (GabbleChannelManager *manager,
GabbleExportableChannelFunc func,
diff --git a/src/channel-manager.h b/src/channel-manager.h
index d0f982d..7fcff10 100644
--- a/src/channel-manager.h
+++ b/src/channel-manager.h
@@ -55,10 +55,36 @@ typedef void (*GabbleChannelManagerGetContactCapsFunc) (
GabbleChannelManager *manager, GabbleConnection *conn, TpHandle handle,
GPtrArray *arr);
+typedef gpointer (*GabbleChannelManagerParseCapsFunc) (
+ GabbleChannelManager *manager, GabbleConnection *conn);
+
+typedef void (*GabbleChannelManagerFreeCapsFunc) (
+ GabbleChannelManager *manager, gpointer *specific_caps);
+
+typedef void (*GabbleChannelManagerCopyCapsFunc) (
+ GabbleChannelManager *manager, gpointer *specific_caps_out,
+ gpointer specific_caps_in);
+
+typedef void (*GabbleChannelManagerUpdateCapsFunc) (
+ GabbleChannelManager *manager, gpointer *specific_caps_out, gpointer specific_caps_in);
+
void gabble_channel_manager_get_contact_capabilities (
GabbleChannelManager *manager, GabbleConnection *conn, TpHandle handle,
GPtrArray *arr);
+gpointer gabble_channel_manager_parse_capabilities (
+ GabbleChannelManager *manager, GabbleConnection *conn);
+
+void gabble_channel_manager_free_capabilities (GabbleChannelManager *manager,
+ gpointer *specific_caps);
+
+void gabble_channel_manager_copy_capabilities (GabbleChannelManager *manager,
+ gpointer *specific_caps_out, gpointer specific_caps_in);
+
+void gabble_channel_manager_update_capabilities (
+ GabbleChannelManager *manager, gpointer specific_caps_out,
+ gpointer specific_caps_in);
+
typedef void (*GabbleChannelManagerForeachChannelFunc) (
GabbleChannelManager *manager, GabbleExportableChannelFunc func,
gpointer user_data);
@@ -98,6 +124,10 @@ struct _GabbleChannelManagerIface {
GTypeInterface parent;
GabbleChannelManagerGetContactCapsFunc get_contact_caps;
+ GabbleChannelManagerParseCapsFunc parse_caps;
+ GabbleChannelManagerFreeCapsFunc free_caps;
+ GabbleChannelManagerCopyCapsFunc copy_caps;
+ GabbleChannelManagerUpdateCapsFunc update_caps;
GabbleChannelManagerForeachChannelFunc foreach_channel;
diff --git a/src/connection.c b/src/connection.c
index 9dab762..9c926c9 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -1927,7 +1927,7 @@ connection_auth_cb (LmConnection *lmconn,
/* set initial capabilities */
gabble_presence_set_capabilities (conn->self_presence, priv->resource,
- capabilities_get_initial_caps (), NULL, NULL, priv->caps_serial++);
+ capabilities_get_initial_caps (), NULL, NULL, NULL, priv->caps_serial++);
if (!gabble_disco_request_with_timeout (conn->disco, GABBLE_DISCO_TYPE_INFO,
priv->stream_server, NULL,
@@ -2214,7 +2214,7 @@ gabble_connection_advertise_capabilities (TpSvcConnectionInterfaceCapabilities *
{
DEBUG ("before != after, changing");
gabble_presence_set_capabilities (pres, priv->resource, caps, NULL,
- NULL, priv->caps_serial++);
+ NULL, NULL, priv->caps_serial++);
DEBUG ("set caps: %x", pres->caps);
}
@@ -2960,8 +2960,8 @@ gabble_connection_ensure_capabilities (GabbleConnection *self,
/* We changed capabilities */
GError *error = NULL;
- gabble_presence_set_capabilities (self->self_presence, priv->resource,
- new_caps, NULL, NULL, priv->caps_serial++);
+ gabble_presence_set_capabilities (self->self_presence,
+ priv->resource, new_caps, NULL, NULL, NULL, priv->caps_serial++);
if (!_gabble_connection_signal_own_presence (self, &error))
DEBUG ("error sending presence: %s", error->message);
diff --git a/src/presence-cache.c b/src/presence-cache.c
index 3172009..4670936 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -38,12 +38,14 @@
#define DEBUG_FLAG GABBLE_DEBUG_PRESENCE
#include "caps-hash.h"
+#include "channel-manager.h"
#include "debug.h"
#include "disco.h"
#include "gabble-signals-marshal.h"
#include "namespaces.h"
#include "util.h"
#include "roster.h"
+#include "types.h"
/* When five DIFFERENT guys report the same caps for a given bundle, it'll
* be enough. But if only ONE guy use the verification string (XEP-0115 v1.5),
@@ -201,6 +203,9 @@ struct _CapabilityInfo
GHashTable *stream_tube_caps;
GHashTable *dbus_tube_caps;
+ /* channel factory -> specific caps */
+ GHashTable *per_channel_factory_caps;
+
TpIntSet *guys;
guint trust;
};
@@ -233,7 +238,7 @@ static guint
capability_info_recvd (GabblePresenceCache *cache, const gchar *node,
TpHandle handle, GabblePresenceCapabilities caps,
GHashTable *stream_tube_caps, GHashTable *dbus_tube_caps,
- guint trust_inc)
+ GHashTable *per_channel_factory_caps, guint trust_inc)
{
CapabilityInfo *info = capability_info_get (cache, node);
@@ -248,6 +253,7 @@ capability_info_recvd (GabblePresenceCache *cache, const gchar *node,
info->caps = caps;
info->stream_tube_caps = stream_tube_caps;
info->dbus_tube_caps = dbus_tube_caps;
+ info->per_channel_factory_caps = per_channel_factory_caps;
info->trust = 0;
info->caps_set = TRUE;
}
@@ -707,6 +713,59 @@ _parse_cap_bundles (
}
static void
+free_specific_caps_helper (gpointer key, gpointer value, gpointer user_data)
+{
+ GabbleChannelManager *manager = GABBLE_CHANNEL_MANAGER (key);
+ gabble_channel_manager_free_capabilities (manager, value);
+}
+
+void
+gabble_presence_cache_free_specific_cache (
+ GHashTable *per_channel_factory_caps)
+{
+ g_hash_table_foreach (per_channel_factory_caps, free_specific_caps_helper,
+ NULL);
+}
+
+static void
+copy_specific_caps_helper (gpointer key, gpointer value, gpointer user_data)
+{
+ GHashTable *table_out = user_data;
+ GabbleChannelManager *manager = GABBLE_CHANNEL_MANAGER (key);
+ gpointer out;
+ gabble_channel_manager_copy_capabilities (manager, &out, value);
+ g_hash_table_insert (table_out, key, out);
+}
+
+void
+gabble_presence_cache_copy_specific_cache (
+ GHashTable **out, GHashTable *in)
+{
+ *out = g_hash_table_new (NULL, NULL);
+ g_hash_table_foreach (in, copy_specific_caps_helper,
+ *out);
+}
+
+static void
+update_specific_caps_helper (gpointer key, gpointer value, gpointer user_data)
+{
+ GHashTable *table_out = user_data;
+ GabbleChannelManager *manager = GABBLE_CHANNEL_MANAGER (key);
+ gpointer out;
+ gabble_channel_manager_copy_capabilities (manager, &out, value);
+ g_hash_table_insert (table_out, key, out);
+}
+
+void
+gabble_presence_cache_update_specific_cache (
+ GHashTable **out, GHashTable *in)
+{
+ *out = g_hash_table_new (NULL, NULL);
+ g_hash_table_foreach (in, update_specific_caps_helper,
+ out);
+}
+
+static void
_caps_disco_cb (GabbleDisco *disco,
GabbleDiscoRequest *request,
const gchar *jid,
@@ -725,9 +784,11 @@ _caps_disco_cb (GabbleDisco *disco,
GabblePresenceCapabilities caps = 0;
GHashTable *stream_tube_caps;
GHashTable *dbus_tube_caps;
+ GHashTable *per_channel_factory_caps;
guint trust, trust_inc;
TpHandle handle = 0;
gboolean bad_hash = FALSE;
+ guint j;
cache = GABBLE_PRESENCE_CACHE (user_data);
priv = GABBLE_PRESENCE_CACHE_PRIV (cache);
@@ -754,10 +815,11 @@ _caps_disco_cb (GabbleDisco *disco,
if (!waiter->disco_requested)
{
- const gchar *j;
+ const gchar *waiter_jid;
- j = tp_handle_inspect (contact_repo, waiter->handle);
- full_jid = g_strdup_printf ("%s/%s", j, waiter->resource);
+ waiter_jid = tp_handle_inspect (contact_repo, waiter->handle);
+ full_jid = g_strdup_printf ("%s/%s", waiter_jid,
+ waiter->resource);
gabble_disco_request (disco, GABBLE_DISCO_TYPE_INFO, full_jid,
node, _caps_disco_cb, cache, G_OBJECT(cache), NULL);
@@ -788,7 +850,22 @@ _caps_disco_cb (GabbleDisco *disco,
NULL);
dbus_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
NULL);
+ per_channel_factory_caps = g_hash_table_new (NULL, NULL);
+
+ /* parsing for Connection.Interface.ContactCapabilities.DRAFT */
+ for (j = 0; j < priv->conn->channel_managers->len; j++)
+ {
+ gpointer *factory_caps;
+ GabbleChannelManager *manager = GABBLE_CHANNEL_MANAGER (
+ g_ptr_array_index (priv->conn->channel_managers, j));
+
+ factory_caps = gabble_channel_manager_parse_capabilities
+ (manager, priv->conn);
+ if (factory_caps != NULL)
+ g_hash_table_insert (per_channel_factory_caps, manager, factory_caps);
+ }
+ /* parsing for Connection.Interface.Capabilities*/
for (child = query_result->children; NULL != child; child = child->next)
{
const gchar *var;
@@ -854,8 +931,10 @@ _caps_disco_cb (GabbleDisco *disco,
DEBUG ("Ignoring presence from invalid JID %s", jid);
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ gabble_presence_cache_free_specific_cache (per_channel_factory_caps);
stream_tube_caps = NULL;
dbus_tube_caps = NULL;
+ per_channel_factory_caps = NULL;
goto OUT;
}
@@ -876,8 +955,10 @@ _caps_disco_cb (GabbleDisco *disco,
DEBUG ("Ignoring non requested disco reply");
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ gabble_presence_cache_free_specific_cache (per_channel_factory_caps);
stream_tube_caps = NULL;
dbus_tube_caps = NULL;
+ per_channel_factory_caps = NULL;
goto OUT;
}
@@ -896,7 +977,8 @@ _caps_disco_cb (GabbleDisco *disco,
if (g_str_equal (waiter_self->ver, computed_hash))
{
trust = capability_info_recvd (cache, node, handle, caps,
- stream_tube_caps, dbus_tube_caps, trust_inc);
+ stream_tube_caps, dbus_tube_caps, per_channel_factory_caps,
+ trust_inc);
}
else
{
@@ -907,23 +989,27 @@ _caps_disco_cb (GabbleDisco *disco,
bad_hash = TRUE;
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ gabble_presence_cache_free_specific_cache (per_channel_factory_caps);
stream_tube_caps = NULL;
dbus_tube_caps = NULL;
+ per_channel_factory_caps = NULL;
}
}
else
{
trust_inc = 1;
trust = capability_info_recvd (cache, node, handle, caps, NULL, NULL,
- trust_inc);
+ NULL, trust_inc);
/* Do not allow tubes caps if the contact does not observe XEP-0115
* version 1.5: we don't need to bother being compatible with both version
* 1.3 and tubes caps */
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ gabble_presence_cache_free_specific_cache (per_channel_factory_caps);
stream_tube_caps = NULL;
dbus_tube_caps = NULL;
+ per_channel_factory_caps = NULL;
}
for (i = waiters; NULL != i;)
@@ -950,9 +1036,9 @@ _caps_disco_cb (GabbleDisco *disco,
DEBUG ("setting caps for %d (thanks to %d %s) to "
"%d (save_caps %d)",
waiter->handle, handle, jid, caps, save_caps);
- gabble_presence_set_capabilities (presence,
- waiter->resource, caps, stream_tube_caps, dbus_tube_caps,
- waiter->serial);
+ gabble_presence_set_capabilities (presence, waiter->resource,
+ caps, stream_tube_caps, dbus_tube_caps,
+ per_channel_factory_caps, waiter->serial);
DEBUG ("caps for %d (thanks to %d %s) now %d", waiter->handle,
handle, jid, presence->caps);
g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0,
@@ -983,10 +1069,11 @@ _caps_disco_cb (GabbleDisco *disco,
if (!waiter->disco_requested)
{
- const gchar *j;
+ const gchar *waiter_jid;
- j = tp_handle_inspect (contact_repo, waiter->handle);
- full_jid = g_strdup_printf ("%s/%s", j, waiter->resource);
+ waiter_jid = tp_handle_inspect (contact_repo, waiter->handle);
+ full_jid = g_strdup_printf ("%s/%s", waiter_jid,
+ waiter->resource);
gabble_disco_request (disco, GABBLE_DISCO_TYPE_INFO, full_jid,
node, _caps_disco_cb, cache, G_OBJECT(cache), NULL);
@@ -1046,8 +1133,9 @@ _process_caps_uri (GabblePresenceCache *cache,
if (presence)
{
- gabble_presence_set_capabilities (presence, resource, info->caps,
- info->stream_tube_caps, info->dbus_tube_caps, serial);
+ gabble_presence_set_capabilities (presence, resource,
+ info->caps, info->stream_tube_caps, info->dbus_tube_caps,
+ info->per_channel_factory_caps, serial);
DEBUG ("caps for %d (%s) now %d", handle, from, presence->caps);
}
else
diff --git a/src/presence-cache.h b/src/presence-cache.h
index fc18d54..82ce987 100644
--- a/src/presence-cache.h
+++ b/src/presence-cache.h
@@ -84,6 +84,12 @@ void gabble_presence_cache_add_bundle_caps (GabblePresenceCache *cache,
const gchar *node, GabblePresenceCapabilities caps);
void gabble_presence_cache_really_remove (GabblePresenceCache *cache,
TpHandle handle);
+void gabble_presence_cache_free_specific_cache (
+ GHashTable *per_channel_factory_caps);
+void gabble_presence_cache_copy_specific_cache (GHashTable **out,
+ GHashTable *in);
+void gabble_presence_cache_update_specific_cache (GHashTable **out,
+ GHashTable *in);
G_END_DECLS
diff --git a/src/presence.c b/src/presence.c
index 2491981..ef6d52c 100644
--- a/src/presence.c
+++ b/src/presence.c
@@ -23,6 +23,7 @@
#include <string.h>
+#include "channel-manager.h"
#include "presence-cache.h"
#include "namespaces.h"
#include "util.h"
@@ -42,6 +43,7 @@ struct _Resource {
GabblePresenceCapabilities caps;
GHashTable *stream_tube_caps;
GHashTable *dbus_tube_caps;
+ GHashTable *per_channel_factory_caps;
guint caps_serial;
GabblePresenceId status;
gchar *status_message;
@@ -57,11 +59,12 @@ struct _GabblePresencePrivate {
static Resource *
_resource_new (gchar *name)
{
- Resource *new = g_slice_new (Resource);
+ Resource *new = g_slice_new0 (Resource);
new->name = name;
new->caps = PRESENCE_CAP_NONE;
new->stream_tube_caps = NULL;
new->dbus_tube_caps = NULL;
+ new->per_channel_factory_caps = NULL;
new->status = GABBLE_PRESENCE_OFFLINE;
new->status_message = NULL;
new->priority = 0;
@@ -197,6 +200,7 @@ gabble_presence_set_capabilities (GabblePresence *presence,
GabblePresenceCapabilities caps,
GHashTable *stream_tube_caps,
GHashTable *dbus_tube_caps,
+ GHashTable *per_channel_factory_caps,
guint serial)
{
GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence);
@@ -204,13 +208,26 @@ gabble_presence_set_capabilities (GabblePresence *presence,
presence->caps = 0;
if (presence->stream_tube_caps != NULL)
- g_hash_table_destroy (presence->stream_tube_caps);
+ {
+ g_hash_table_destroy (presence->stream_tube_caps);
+ presence->per_channel_factory_caps = NULL;
+ }
if (presence->dbus_tube_caps != NULL)
- g_hash_table_destroy (presence->dbus_tube_caps);
+ {
+ g_hash_table_destroy (presence->dbus_tube_caps);
+ presence->per_channel_factory_caps = NULL;
+ }
+ if (presence->per_channel_factory_caps != NULL)
+ {
+ gabble_presence_cache_free_specific_cache
+ (presence->per_channel_factory_caps);
+ presence->per_channel_factory_caps = NULL;
+ }
presence->stream_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
presence->dbus_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
+ presence->per_channel_factory_caps = g_hash_table_new (NULL, NULL);
DEBUG ("about to add caps %u to resource %s with serial %u", caps, resource,
serial);
@@ -238,9 +255,21 @@ gabble_presence_set_capabilities (GabblePresence *presence,
DEBUG ("resource %s caps now %u", resource, tmp->caps);
if (tmp->stream_tube_caps != NULL)
- g_hash_table_destroy (tmp->stream_tube_caps);
+ {
+ g_hash_table_destroy (tmp->stream_tube_caps);
+ tmp->stream_tube_caps = NULL;
+ }
if (tmp->dbus_tube_caps != NULL)
- g_hash_table_destroy (tmp->dbus_tube_caps);
+ {
+ g_hash_table_destroy (tmp->dbus_tube_caps);
+ tmp->dbus_tube_caps = NULL;
+ }
+ if (tmp->per_channel_factory_caps != NULL)
+ {
+ gabble_presence_cache_free_specific_cache
+ (tmp->per_channel_factory_caps);
+ tmp->per_channel_factory_caps = NULL;
+ }
tmp->stream_tube_caps = g_hash_table_new_full (g_str_hash,
g_str_equal, g_free, NULL);
tmp->dbus_tube_caps = g_hash_table_new_full (g_str_hash,
@@ -251,6 +280,9 @@ gabble_presence_set_capabilities (GabblePresence *presence,
if (dbus_tube_caps != NULL)
tp_g_hash_table_update (tmp->dbus_tube_caps,
dbus_tube_caps, g_strdup, NULL);
+ if (per_channel_factory_caps != NULL)
+ gabble_presence_cache_copy_specific_cache
+ (&tmp->per_channel_factory_caps, per_channel_factory_caps);
}
}
@@ -263,6 +295,11 @@ gabble_presence_set_capabilities (GabblePresence *presence,
if (tmp->dbus_tube_caps != NULL)
tp_g_hash_table_update (presence->dbus_tube_caps,
tmp->dbus_tube_caps, g_strdup, NULL);
+
+ if (tmp->per_channel_factory_caps != NULL)
+ gabble_presence_cache_update_specific_cache
+ (presence->per_channel_factory_caps,
+ tmp->per_channel_factory_caps);
}
DEBUG ("total caps now %u", presence->caps);
diff --git a/src/presence.h b/src/presence.h
index 500d9e2..417571e 100644
--- a/src/presence.h
+++ b/src/presence.h
@@ -58,6 +58,7 @@ struct _GabblePresence {
GabblePresenceCapabilities caps;
GHashTable *stream_tube_caps;
GHashTable *dbus_tube_caps;
+ GHashTable *per_channel_factory_caps;
GabblePresenceId status;
gchar *status_message;
gchar *nickname;
@@ -82,7 +83,8 @@ gboolean gabble_presence_update (GabblePresence *presence,
void gabble_presence_set_capabilities (GabblePresence *presence,
const gchar *resource, GabblePresenceCapabilities caps,
- GHashTable *stream_tube_caps, GHashTable *dbus_tube_caps, guint serial);
+ GHashTable *stream_tube_caps, GHashTable *dbus_tube_caps,
+ GHashTable *per_channel_factory_caps, guint serial);
const gchar *gabble_presence_pick_resource_by_caps (GabblePresence *presence,
GabblePresenceCapabilities caps);
diff --git a/tests/test-presence.c b/tests/test-presence.c
index 3e1d2f1..819e900 100644
--- a/tests/test-presence.c
+++ b/tests/test-presence.c
@@ -109,7 +109,7 @@ int main (int argc, char **argv)
g_assert (FALSE == gabble_presence_update (presence, "bar",
GABBLE_PRESENCE_AVAILABLE, "dingoes", -1));
gabble_presence_set_capabilities (presence, "bar",
- PRESENCE_CAP_GOOGLE_VOICE, NULL, NULL, 0);
+ PRESENCE_CAP_GOOGLE_VOICE, NULL, NULL, NULL, 0);
dump = gabble_presence_dump (presence);
g_assert (0 == strcmp (dump,
@@ -138,7 +138,7 @@ int main (int argc, char **argv)
/* give voice cap to first resource */
gabble_presence_set_capabilities (presence, "foo",
- PRESENCE_CAP_GOOGLE_VOICE, NULL, NULL, 0);
+ PRESENCE_CAP_GOOGLE_VOICE, NULL, NULL, NULL, 0);
/* resource has voice cap */
resource = gabble_presence_pick_resource_by_caps (presence,
--
1.5.6.5
More information about the Telepathy-commits
mailing list