summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-09-24 10:52:01 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-09-24 10:52:05 +0100
commit816b4e8169dba1d957ea9a882744d3766a44e8bf (patch)
treeb6258bd2bf9ae9ea8cdc438eb3458655b5914909
parent6aae5708e84425b101cf17f43baf9bb500dce943 (diff)
parente18e5bcd4115f50fa0fc2fc88f0e15995db23606 (diff)
downloadtelepathy-salut-816b4e8169dba1d957ea9a882744d3766a44e8bf.tar.gz
Merge branch 'misc'
Reviewed-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
-rw-r--r--configure.ac34
-rw-r--r--lib/gibber/Makefile.am18
-rw-r--r--lib/gibber/examples/Makefile.am9
-rw-r--r--lib/gibber/examples/test-resolv.c130
-rw-r--r--lib/gibber/gibber-resolver-asyncns.c415
-rw-r--r--lib/gibber/gibber-resolver-asyncns.h59
-rw-r--r--lib/gibber/gibber-resolver.c896
-rw-r--r--lib/gibber/gibber-resolver.h175
-rw-r--r--lib/gibber/tests/Makefile.am3
-rw-r--r--lib/gibber/tests/check-gibber-resolver.c91
-rw-r--r--lib/gibber/tests/check-gibber.h1
-rw-r--r--lib/gibber/tests/check-main.c1
-rw-r--r--lib/gibber/tests/test-resolver.c113
-rw-r--r--lib/gibber/tests/test-resolver.h59
-rw-r--r--src/salut-connection-manager.c17
-rw-r--r--src/salut-connection-manager.h3
-rw-r--r--src/salut-connection.c48
-rw-r--r--src/salut-connection.h4
18 files changed, 50 insertions, 2026 deletions
diff --git a/configure.ac b/configure.ac
index dd0d9a3b..525ea268 100644
--- a/configure.ac
+++ b/configure.ac
@@ -218,40 +218,6 @@ AC_SUBST(LIBSSL_CFLAGS)
AC_SUBST(LIBSSL_LIBS)
AM_CONDITIONAL(HAVE_LIBSSL, test "x$HAVE_LIBSSL" = "xyes")
-AC_CHECK_FUNC(res_query, ,
- [AC_CHECK_LIB(resolv, res_query, [ RESOLV_LIBS="-lresolv" ],
- [ save_libs="$LIBS"
- LIBS="-lresolv $LIBS"
- AC_MSG_CHECKING([for res_query in -lresolv (alternate version)])
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM([[#include <resolv.h>]], [[res_query(0,0,0,0,0)]])],
- [ AC_MSG_RESULT(yes)
- LIBS="$save_libs"
- RESOLV_LIBS="-lresolv"
- ],
- [ AC_MSG_RESULT(no)
- LIBS="$save_libs"
- AC_CHECK_LIB(bind, res_query,
- [ RESOLV_LIBS="-lbind" ],
- [ AC_MSG_ERROR(res_query not found) ] ) ] ) ] )
- ]
-)
-
-AC_SUBST(RESOLV_LIBS)
-
-dnl Check for libasyncns
-PKG_CHECK_MODULES(LIBASYNCNS, [libasyncns >= 0.3],
- [ HAVE_LIBASYNCNS="yes"
- AC_DEFINE(HAVE_LIBASYNCNS, 1, [Define if asyncns support is available])
- ],
- [ AC_MSG_NOTICE(libasyncns not found: Resolving will be synchronous!)
- AC_MSG_NOTICE((Salut does not make DNS lookups, so this does not matter.))
- ] )
-
-AC_SUBST(LIBASYNCNS_CFLAGS)
-AC_SUBST(LIBASYNCNS_LIBS)
-AM_CONDITIONAL(HAVE_LIBASYNCNS, test "x$HAVE_LIBASYNCNS" = "xyes")
-
dnl Check for Avahi
PKG_CHECK_MODULES(AVAHI, [avahi-gobject, avahi-client])
AC_SUBST(AVAHI_CFLAGS)
diff --git a/lib/gibber/Makefile.am b/lib/gibber/Makefile.am
index 9480fa93..f5fe5c75 100644
--- a/lib/gibber/Makefile.am
+++ b/lib/gibber/Makefile.am
@@ -34,8 +34,6 @@ HANDWRITTEN_SOURCES = \
gibber-xmpp-stanza.h \
gibber-xmpp-writer.c \
gibber-xmpp-writer.h \
- gibber-resolver.c \
- gibber-resolver.h \
gibber-transport.c \
gibber-transport.h \
gibber-fd-transport.c \
@@ -91,12 +89,6 @@ libgibber_la_SOURCES += \
gibber-ssl-transport.h
endif
-if HAVE_LIBASYNCNS
-libgibber_la_SOURCES += \
- gibber-resolver-asyncns.c \
- gibber-resolver-asyncns.h
-endif
-
# Coding style checks
check_c_sources = \
$(HANDWRITTEN_SOURCES)
@@ -134,20 +126,12 @@ if HAVE_LIBSSL
AM_CFLAGS += @LIBSSL_CFLAGS@
endif
-if HAVE_LIBASYNCNS
- AM_CFLAGS += @LIBASYNCNS_CFLAGS@
-endif
-
-AM_LDFLAGS = $(GCOV_LIBS) @GLIB_LIBS@ @LIBXML2_LIBS@ @RESOLV_LIBS@ @LIBSOUP_LIBS@
+AM_LDFLAGS = $(GCOV_LIBS) @GLIB_LIBS@ @LIBXML2_LIBS@ @LIBSOUP_LIBS@
if HAVE_LIBSSL
AM_LDFLAGS += @LIBSSL_LIBS@
endif
-if HAVE_LIBASYNCNS
- AM_LDFLAGS += @LIBASYNCNS_LIBS@
-endif
-
# rules for making the glib enum objects
%-enumtypes.h: %.h Makefile.in
$(AM_V_GEN)glib-mkenums \
diff --git a/lib/gibber/examples/Makefile.am b/lib/gibber/examples/Makefile.am
index 7e537d75..68255fbb 100644
--- a/lib/gibber/examples/Makefile.am
+++ b/lib/gibber/examples/Makefile.am
@@ -8,7 +8,7 @@ $(top_builddir)/lib/gibber/libgibber.la:
.PHONY: $(top_builddir)/lib/gibber/libgibber.la
noinst_PROGRAMS = \
- test_tcp test_ssl test_resolv
+ test_tcp test_ssl
test_tcp_SOURCES = \
test-tcp.c
@@ -24,13 +24,6 @@ test_ssl_LDADD = \
$(top_builddir)/lib/gibber/libgibber.la \
$(AM_LDFLAGS)
-test_resolv_SOURCES = \
- test-resolv.c
-
-test_resolv_LDADD = \
- $(top_builddir)/lib/gibber/libgibber.la \
- $(AM_LDFLAGS)
-
AM_CFLAGS = $(ERROR_CFLAGS) @GLIB_CFLAGS@ \
-I $(top_srcdir)/lib -I $(top_builddir)/lib \
-I $(top_srcdir)/src -I $(top_builddir)/src
diff --git a/lib/gibber/examples/test-resolv.c b/lib/gibber/examples/test-resolv.c
deleted file mode 100644
index bdaf99e9..00000000
--- a/lib/gibber/examples/test-resolv.c
+++ /dev/null
@@ -1,130 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <string.h>
-
-#include <glib.h>
-
-#include <gibber/gibber-resolver.h>
-
-GMainLoop *mainloop;
-const gchar *hostname;
-const gchar *servicename;
-
-gboolean done = FALSE;
-int to_resolve = 0;
-
-GibberResolver *resolver;
-
-static void
-resolver_addrinfo_cb (GibberResolver *resolver, GList *entries, GError *error,
- gpointer user_data, GObject *weak_object)
-{
- GList *e;
- GibberResolverSrvRecord *r = (GibberResolverSrvRecord *) user_data;
-
- printf ("-- %s %d:\n", r->hostname, r->port);
- if (error != NULL)
- {
- printf ("\tResolving failed: %s\n", error->message);
- goto out;
- }
-
- for (e = entries; e != NULL; e = e->next)
- {
- GibberResolverAddrInfo *addr = (GibberResolverAddrInfo *) e->data;
- gchar *hostname, *portname;
- gboolean ret;
-
- ret = gibber_resolver_sockaddr_to_str (
- (struct sockaddr *) &(addr->sockaddr), addr->sockaddr_len,
- &hostname, &portname, NULL);
-
- g_assert (ret == TRUE);
-
- printf ("\t %s %s\n", hostname, portname);
-
- g_free (hostname);
- g_free (portname);
- }
-
- gibber_resolver_addrinfo_list_free (entries);
-
-out:
- to_resolve--;
- if (to_resolve == 0)
- {
- done = TRUE;
- if (g_main_loop_is_running (mainloop))
- g_main_loop_quit (mainloop);
- }
-}
-
-static void
-resolver_srv_cb (GibberResolver *resolver, GList *srv_list, GError *error,
- gpointer user_data, GObject *weak_object)
-{
- GList *s;
-
- printf ("--Srv returned--\n");
- if (error != NULL)
- {
- printf ("An error occured: %s\n", error->message);
- goto failed;
- }
-
- if (srv_list == NULL)
- {
- printf ("No srv records\n");
- goto failed;
- }
-
- for (s = srv_list ; s != NULL; s = s->next)
- {
- GibberResolverSrvRecord *r = (GibberResolverSrvRecord *) s->data;
- printf ("\t* %s\t%d\tp: %d w: %d\n", r->hostname, r->port,
- r->priority, r->weight);
- }
-
- printf ("Resolving individual records\n");
-
- to_resolve = g_list_length (srv_list);
- for (s = srv_list ; s != NULL; s = g_list_delete_link (s, s))
- {
- GibberResolverSrvRecord *r = (GibberResolverSrvRecord *) s->data;
- gchar *portname = g_strdup_printf("%d", r->port);
-
- gibber_resolver_addrinfo (resolver,
- r->hostname, portname, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0,
- resolver_addrinfo_cb, r, (GDestroyNotify) gibber_resolver_srv_free,
- NULL);
- }
-
- return;
-
-failed:
- done = TRUE;
-}
-
-int
-main(int argc, char **argv) {
- g_type_init();
-
- g_assert (argc > 2);
-
- hostname = argv[1];
- servicename = argv[2];
-
- mainloop = g_main_loop_new(NULL, FALSE);
-
- resolver = gibber_resolver_get_resolver ();
-
- gibber_resolver_srv (resolver, hostname, servicename,
- GIBBER_RESOLVER_SERVICE_TYPE_TCP,
- resolver_srv_cb, NULL, NULL, NULL);
-
- if (!done)
- g_main_loop_run(mainloop);
-
- return 0;
-}
diff --git a/lib/gibber/gibber-resolver-asyncns.c b/lib/gibber/gibber-resolver-asyncns.c
deleted file mode 100644
index 3624d856..00000000
--- a/lib/gibber/gibber-resolver-asyncns.c
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * gibber-resolver-asyncns.c - Source for GibberResolverAsyncns
- * Copyright (C) 2008 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <resolv.h>
-
-#include <asyncns.h>
-
-#include "gibber-resolver-asyncns.h"
-
-G_DEFINE_TYPE(GibberResolverAsyncns, gibber_resolver_asyncns,
- GIBBER_TYPE_RESOLVER)
-
-/* private structure */
-typedef struct _GibberResolverAsyncnsPrivate GibberResolverAsyncnsPrivate;
-
-struct _GibberResolverAsyncnsPrivate
-{
- asyncns_t *asyncns;
- GIOChannel *asyncio;
- int asyncns_fd;
- guint watch_id;
-
- gboolean dispose_has_run;
-};
-
-typedef enum {
- GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_SRV,
- GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_GETADDRINFO,
- GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_GETNAMEINFO,
-} GibberResolverAsyncnsQueryType;
-
-typedef struct {
- GibberResolverAsyncnsQueryType type;
- guint jobid;
- asyncns_query_t *query;
-} GibberResolverAsyncnsQuery;
-
-static gboolean asyncns_resolv_srv (GibberResolver *resolver, guint id,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type);
-
-static gboolean asyncns_resolv_addrinfo (GibberResolver *resolver, guint id,
- const gchar *hostname, const char *port, int address_family, int sock_type,
- int protocol, int flags);
-
-static gboolean asyncns_resolv_nameinfo (GibberResolver *resolver, guint id,
- const struct sockaddr *sa, socklen_t salen, gint flags);
-
-static void asyncns_resolv_cancel (GibberResolver *resolver, guint id);
-
-static gboolean asyncns_io_read_cb (GIOChannel *source,
- GIOCondition condition, gpointer data);
-
-#define GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), GIBBER_TYPE_RESOLVER_ASYNCNS, \
- GibberResolverAsyncnsPrivate))
-
-static void
-gibber_resolver_asyncns_init (GibberResolverAsyncns *obj)
-{
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (obj);
-
- priv->asyncns = asyncns_new (2);
- priv->asyncns_fd = asyncns_fd (priv->asyncns);
- priv->asyncio = g_io_channel_unix_new (priv->asyncns_fd);
- priv->watch_id = g_io_add_watch (priv->asyncio, G_IO_IN, asyncns_io_read_cb,
- obj);
-}
-
-static void gibber_resolver_asyncns_dispose (GObject *object);
-static void gibber_resolver_asyncns_finalize (GObject *object);
-
-static void
-gibber_resolver_asyncns_class_init (
- GibberResolverAsyncnsClass *gibber_resolver_asyncns_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (gibber_resolver_asyncns_class);
- GibberResolverClass *resolver_class = GIBBER_RESOLVER_CLASS
- (gibber_resolver_asyncns_class);
-
- g_type_class_add_private (gibber_resolver_asyncns_class,
- sizeof (GibberResolverAsyncnsPrivate));
-
- object_class->dispose = gibber_resolver_asyncns_dispose;
- object_class->finalize = gibber_resolver_asyncns_finalize;
-
- resolver_class->resolv_srv = asyncns_resolv_srv;
- resolver_class->resolv_addrinfo = asyncns_resolv_addrinfo;
- resolver_class->resolv_nameinfo = asyncns_resolv_nameinfo;
- resolver_class->resolv_cancel = asyncns_resolv_cancel;
-}
-
-void
-gibber_resolver_asyncns_dispose (GObject *object)
-{
- GibberResolverAsyncns *self = GIBBER_RESOLVER_ASYNCNS (object);
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
-
- if (priv->dispose_has_run)
- return;
-
- priv->dispose_has_run = TRUE;
-
- if (priv->watch_id != 0)
- g_source_remove (priv->watch_id);
- priv->watch_id = 0;
-
- if (priv->asyncio != NULL)
- g_io_channel_shutdown (priv->asyncio, FALSE, NULL);
- priv->asyncio = NULL;
-
- if (priv->asyncns != NULL)
- asyncns_free (priv->asyncns);
- priv->asyncns = NULL;
-
- /* release any references held by the object here */
- if (G_OBJECT_CLASS (gibber_resolver_asyncns_parent_class)->dispose)
- G_OBJECT_CLASS (gibber_resolver_asyncns_parent_class)->dispose (object);
-}
-
-void
-gibber_resolver_asyncns_finalize (GObject *object)
-{
- /* free any data held directly by the object here */
- G_OBJECT_CLASS (gibber_resolver_asyncns_parent_class)->finalize (object);
-}
-
-static void
-gibber_resolver_asyncns_query_add (GibberResolverAsyncns *resolver,
- GibberResolverAsyncnsQueryType type, guint jobid, asyncns_query_t *query)
-{
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (resolver);
- GibberResolverAsyncnsQuery *q = g_slice_new (GibberResolverAsyncnsQuery);
-
- q->type = type;
- q->jobid = jobid;
- q->query = query;
-
- asyncns_setuserdata (priv->asyncns, query, q);
- gibber_resolver_set_data (GIBBER_RESOLVER (resolver), jobid, q);
-}
-
-static void
-gibber_resolver_asyncns_query_free (GibberResolverAsyncns *resolver,
- GibberResolverAsyncnsQuery *query)
-{
- g_slice_free (GibberResolverAsyncnsQuery, query);
-}
-
-static void
-gibber_resolver_syncns_srv_done (GibberResolverAsyncns *self,
- asyncns_query_t *query, GibberResolverAsyncnsQuery *asyncquery)
-{
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- int ret;
- unsigned char *answer;
- GList *entries = NULL;
- GError *error = NULL;
-
- ret = asyncns_res_done (priv->asyncns, query, &answer);
-
- if (ret >= 0)
- {
- entries = gibber_resolver_res_query_to_list (answer, ret);
- if (entries == NULL)
- error = g_error_new (GIBBER_RESOLVER_ERROR,
- GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE, "Invalid reply received");
- free (answer);
- }
- else
- {
- /* FIXME libasyncns actually returns -errno, but that's normally
- * unusefull... libasyncns should be fixed here.. */
- error = gibber_resolver_h_error_to_g_error (-ret);
- }
-
- gibber_resolver_srv_result (GIBBER_RESOLVER (self), asyncquery->jobid,
- entries, error);
-
- if (error != NULL)
- g_error_free (error);
-
- gibber_resolver_asyncns_query_free (self, asyncquery);
-}
-
-static void
-gibber_resolver_syncns_addrinfo_done (GibberResolverAsyncns *self,
- asyncns_query_t *query, GibberResolverAsyncnsQuery *asyncquery)
-{
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- int ret;
- struct addrinfo *addrs;
-
- ret = asyncns_getaddrinfo_done (priv->asyncns, query, &addrs);
- if (ret != 0)
- {
- GError *err = gibber_resolver_gai_error_to_g_error (ret);
- gibber_resolver_addrinfo_result (GIBBER_RESOLVER (self),
- asyncquery->jobid, NULL, err);
- g_error_free (err);
- }
- else
- {
- struct addrinfo *a;
- GList *entries = NULL;
-
- for (a = addrs; a != NULL; a = a->ai_next)
- {
- entries = g_list_append (entries,
- gibber_resolver_addrinfo_new (a->ai_family, a->ai_socktype,
- a->ai_protocol, a->ai_addr, a->ai_addrlen));
- }
- gibber_resolver_addrinfo_result (GIBBER_RESOLVER (self),
- asyncquery->jobid, entries, NULL);
- asyncns_freeaddrinfo (addrs);
- }
-
- gibber_resolver_asyncns_query_free (self, asyncquery);
-}
-
-static void
-gibber_resolver_syncns_nameinfo_done (GibberResolverAsyncns *self,
- asyncns_query_t *query, GibberResolverAsyncnsQuery *asyncquery)
-{
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- gchar host[NI_MAXHOST];
- gchar serv[NI_MAXSERV];
- int ret;
-
- ret = asyncns_getnameinfo_done (priv->asyncns, query,
- host, NI_MAXHOST, serv, NI_MAXSERV);
-
- if (ret == 0)
- {
- gibber_resolver_nameinfo_result (GIBBER_RESOLVER (self),
- asyncquery->jobid, g_strdup (host), g_strdup (serv), NULL);
- }
- else
- {
- GError *err = gibber_resolver_gai_error_to_g_error (ret);
- gibber_resolver_nameinfo_result (GIBBER_RESOLVER (self),
- asyncquery->jobid, NULL, NULL, err);
- g_error_free (err);
- }
-
- gibber_resolver_asyncns_query_free (self, asyncquery);
-}
-
-static gboolean
-asyncns_io_read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
-{
- GibberResolverAsyncns *self = GIBBER_RESOLVER_ASYNCNS (data);
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- asyncns_query_t *q;
-
- asyncns_wait (priv->asyncns, 0);
-
- while ((q = asyncns_getnext (priv->asyncns)) != NULL)
- {
- GibberResolverAsyncnsQuery *asyncquery;
-
- asyncquery = (GibberResolverAsyncnsQuery *) asyncns_getuserdata (
- priv->asyncns, q);
-
- switch (asyncquery->type) {
- case GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_SRV:
- gibber_resolver_syncns_srv_done (self, q, asyncquery);
- break;
- case GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_GETADDRINFO:
- gibber_resolver_syncns_addrinfo_done (self, q, asyncquery);
- break;
- case GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_GETNAMEINFO:
- gibber_resolver_syncns_nameinfo_done (self, q, asyncquery);
- break;
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-asyncns_resolv_srv (GibberResolver *resolver, guint id,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type)
-{
- GibberResolverAsyncns *self = GIBBER_RESOLVER_ASYNCNS (resolver);
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- asyncns_query_t *query;
- gchar *srv_str;
-
- srv_str = g_strdup_printf ("_%s._%s.%s", service,
- type == GIBBER_RESOLVER_SERVICE_TYPE_TCP ? "tcp" : "udp", service_name);
-
- query = asyncns_res_query (priv->asyncns, srv_str, C_IN, T_SRV);
-
- if (query == NULL)
- {
- GError e = { GIBBER_RESOLVER_ERROR, GIBBER_RESOLVER_ERROR_MEMORY,
- "Failed to start asyncns query" };
- gibber_resolver_srv_result (resolver, id, NULL, &e);
- }
- else
- {
- gibber_resolver_asyncns_query_add (self,
- GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_SRV, id, query);
- }
-
- g_free (srv_str);
-
- return query != NULL;
-}
-
-static gboolean asyncns_resolv_addrinfo (GibberResolver *resolver, guint id,
- const gchar *hostname, const char *port, int address_family, int sock_type,
- int protocol, int flags)
-{
- GibberResolverAsyncns *self = GIBBER_RESOLVER_ASYNCNS (resolver);
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- asyncns_query_t *query;
- struct addrinfo hints;
-
- memset (&hints, 0, sizeof (hints));
- hints.ai_family = address_family;
- hints.ai_socktype = sock_type;
- hints.ai_protocol = protocol;
- hints.ai_flags = flags;
-
- query = asyncns_getaddrinfo (priv->asyncns, hostname, port, &hints);
-
- if (query == NULL)
- {
- GError e = { GIBBER_RESOLVER_ERROR, GIBBER_RESOLVER_ERROR_MEMORY,
- "Failed to start asyncns query" };
- gibber_resolver_srv_result (resolver, id, NULL, &e);
- }
- else
- {
- gibber_resolver_asyncns_query_add (self,
- GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_GETADDRINFO, id, query);
- }
-
- return query != NULL;
-}
-
-static gboolean
-asyncns_resolv_nameinfo (GibberResolver *resolver, guint id,
- const struct sockaddr *sa, socklen_t salen, gint flags)
-{
- GibberResolverAsyncns *self = GIBBER_RESOLVER_ASYNCNS (resolver);
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
- asyncns_query_t *query;
-
- query = asyncns_getnameinfo (priv->asyncns, sa, salen, flags, TRUE, TRUE);
-
- if (query == NULL)
- {
- GError e = { GIBBER_RESOLVER_ERROR, GIBBER_RESOLVER_ERROR_MEMORY,
- "Failed to start asyncns query" };
- gibber_resolver_srv_result (resolver, id, NULL, &e);
- }
- else
- {
- gibber_resolver_asyncns_query_add (self,
- GIBBER_RESOLVER_ASYNCNS_QUERY_TYPE_GETNAMEINFO, id, query);
- }
-
- return query != NULL;
-}
-
-static void
-asyncns_resolv_cancel (GibberResolver *resolver, guint id)
-{
- GibberResolverAsyncnsQuery *query;
- GibberResolverAsyncns *self = GIBBER_RESOLVER_ASYNCNS (resolver);
- GibberResolverAsyncnsPrivate *priv =
- GIBBER_RESOLVER_ASYNCNS_GET_PRIVATE (self);
-
- query = (GibberResolverAsyncnsQuery *) gibber_resolver_get_data (resolver,
- id);
-
- asyncns_cancel (priv->asyncns, query->query);
-
- gibber_resolver_asyncns_query_free (self, query);
-}
diff --git a/lib/gibber/gibber-resolver-asyncns.h b/lib/gibber/gibber-resolver-asyncns.h
deleted file mode 100644
index 64b775c1..00000000
--- a/lib/gibber/gibber-resolver-asyncns.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * gibber-resolver-asyncns.h - Header for GibberResolverAsyncns
- * Copyright (C) 2008 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __GIBBER_RESOLVER_ASYNCNS_H__
-#define __GIBBER_RESOLVER_ASYNCNS_H__
-
-#include <glib-object.h>
-#include "gibber-resolver.h"
-
-G_BEGIN_DECLS
-
-typedef struct _GibberResolverAsyncns GibberResolverAsyncns;
-typedef struct _GibberResolverAsyncnsClass GibberResolverAsyncnsClass;
-
-struct _GibberResolverAsyncnsClass {
- GibberResolverClass parent_class;
-};
-
-struct _GibberResolverAsyncns {
- GibberResolver parent;
-};
-
-GType gibber_resolver_asyncns_get_type(void);
-
-/* TYPE MACROS */
-#define GIBBER_TYPE_RESOLVER_ASYNCNS \
- (gibber_resolver_asyncns_get_type())
-#define GIBBER_RESOLVER_ASYNCNS(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_RESOLVER_ASYNCNS, GibberResolverAsyncns))
-#define GIBBER_RESOLVER_ASYNCNS_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_RESOLVER_ASYNCNS, GibberResolverAsyncnsClass))
-#define GIBBER_IS_RESOLVER_ASYNCNS(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_RESOLVER_ASYNCNS))
-#define GIBBER_IS_RESOLVER_ASYNCNS_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_RESOLVER_ASYNCNS))
-#define GIBBER_RESOLVER_ASYNCNS_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_RESOLVER_ASYNCNS, GibberResolverAsyncnsClass))
-
-
-G_END_DECLS
-
-#endif /* #ifndef __GIBBER_RESOLVER_ASYNCNS_H__*/
diff --git a/lib/gibber/gibber-resolver.c b/lib/gibber/gibber-resolver.c
deleted file mode 100644
index 712531d0..00000000
--- a/lib/gibber/gibber-resolver.c
+++ /dev/null
@@ -1,896 +0,0 @@
-/*
- * gibber-resolver.c - Source for GibberResolver
- * Copyright (C) 2008 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <string.h>
-
-#include "gibber-sockets.h"
-
-#include <errno.h>
-
-#include "config.h"
-#include "gibber-resolver.h"
-
-#ifdef HAVE_LIBASYNCNS
- #include "gibber-resolver-asyncns.h"
-#endif
-
-static GibberResolver *resolver_singleton = NULL;
-static GType resolver_singleton_type = 0;
-
-GibberResolver *
-gibber_resolver_get_resolver (void)
-{
-
- if (resolver_singleton_type == 0)
-#ifdef HAVE_LIBASYNCNS
- resolver_singleton_type = GIBBER_TYPE_RESOLVER_ASYNCNS;
-#else
- resolver_singleton_type = GIBBER_TYPE_RESOLVER;
-#endif
-
- if (resolver_singleton == NULL)
- resolver_singleton = g_object_new (resolver_singleton_type, NULL);
-
- return resolver_singleton;
-}
-
-void
-gibber_resolver_set_resolver (GType object_type)
-{
- if (resolver_singleton_type != object_type && resolver_singleton != NULL)
- {
- g_object_unref (resolver_singleton);
- resolver_singleton = NULL;
- }
-
- resolver_singleton_type = object_type;
-}
-
-
-
-G_DEFINE_TYPE(GibberResolver, gibber_resolver, G_TYPE_OBJECT)
-
-typedef struct {
- guint jobid;
- GibberResolver *resolver;
-
- /* Data the user would like us to remember */
- GCallback callback;
- GDestroyNotify destroy;
- gpointer user_data;
- GObject *weak_object;
-
- /* Field settable by implementations of GibberResolver */
- gpointer data;
-} GibberResolverJob;
-
-/* private structure */
-typedef struct _GibberResolverPrivate GibberResolverPrivate;
-
-struct _GibberResolverPrivate
-{
- gboolean dispose_has_run;
- /* guint * -> GibberResolverJob struct */
- GHashTable *jobs;
-};
-
-static gboolean resolver_resolv_srv (GibberResolver *resolver, guint id,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type);
-
-static gboolean resolver_resolv_addrinfo (GibberResolver *resolver, guint id,
- const gchar *hostname, const char *port, int address_family, int sock_type,
- int protocol, int flags);
-
-static gboolean resolver_resolv_nameinfo (GibberResolver *resolver, guint id,
- const struct sockaddr *sa, socklen_t salen, gint flags);
-
-static void resolver_resolv_cancel (GibberResolver *resolver, guint id);
-
-static void free_job (gpointer data);
-
-#define GIBBER_RESOLVER_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), GIBBER_TYPE_RESOLVER, \
- GibberResolverPrivate))
-
-GQuark
-gibber_resolver_error_quark (void)
-{
- static GQuark quark = 0;
-
- if (!quark)
- quark = g_quark_from_static_string ("gibber_resolver_error");
-
- return quark;
-}
-
-static void
-gibber_resolver_init (GibberResolver *obj)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (obj);
-
- /* allocate any data required by the object here */
- priv->jobs = g_hash_table_new_full (g_int_hash, g_int_equal,
- NULL, free_job);
-}
-
-static void gibber_resolver_dispose (GObject *object);
-static void gibber_resolver_finalize (GObject *object);
-
-static void
-gibber_resolver_class_init (GibberResolverClass *gibber_resolver_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (gibber_resolver_class);
-
- g_type_class_add_private (gibber_resolver_class,
- sizeof (GibberResolverPrivate));
-
- object_class->dispose = gibber_resolver_dispose;
- object_class->finalize = gibber_resolver_finalize;
-
- gibber_resolver_class->resolv_srv = resolver_resolv_srv;
- gibber_resolver_class->resolv_addrinfo = resolver_resolv_addrinfo;
- gibber_resolver_class->resolv_nameinfo = resolver_resolv_nameinfo;
- gibber_resolver_class->resolv_cancel = resolver_resolv_cancel;
-}
-
-void
-gibber_resolver_dispose (GObject *object)
-{
- GibberResolver *self = GIBBER_RESOLVER (object);
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (self);
-
- if (priv->dispose_has_run)
- return;
-
- priv->dispose_has_run = TRUE;
-
- if (priv->jobs != NULL)
- g_hash_table_destroy (priv->jobs);
- priv->jobs = NULL;
-
- /* release any references held by the object here */
- if (G_OBJECT_CLASS (gibber_resolver_parent_class)->dispose)
- G_OBJECT_CLASS (gibber_resolver_parent_class)->dispose (object);
-}
-
-void
-gibber_resolver_finalize (GObject *object)
-{
-
- /* free any data held directly by the object here */
-
- G_OBJECT_CLASS (gibber_resolver_parent_class)->finalize (object);
-}
-
-static void
-weak_object_destroyed (gpointer data, GObject *old_object)
-{
- GibberResolverJob *job = (GibberResolverJob *) data;
-
- g_assert (job->weak_object == old_object);
-
- job->weak_object = NULL;
-
- gibber_resolver_cancel (job->resolver, job->jobid);
-}
-
-static guint
-gibber_resolver_job_add (GibberResolver *resolver,
- GCallback callback,
- gpointer user_data,
- GDestroyNotify destroy,
- GObject *weak_object)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
- GibberResolverJob *job;
-
- job = g_slice_new0 (GibberResolverJob);
- job->resolver = g_object_ref (resolver);
-
- job->callback = callback;
- job->destroy = destroy;
- job->user_data = user_data;
- job->weak_object = weak_object;
-
- /* Now decide on a decent job id.. The pointer is a pretty good initial
- * guess. A nicer solution would be to use an intset */
- job->jobid = GPOINTER_TO_UINT (job);
-
- /* Be carefull to skip 0 */
- while (job->jobid == 0 ||
- g_hash_table_lookup (priv->jobs, &(job->jobid)) != NULL)
- job->jobid++;
-
- g_hash_table_insert (priv->jobs, &(job->jobid), job);
-
- if (weak_object != NULL)
- {
- g_object_weak_ref (weak_object, weak_object_destroyed, job);
- }
-
- return job->jobid;
-}
-
-static void free_job (gpointer data)
-{
- GibberResolverJob *job = (GibberResolverJob *) data;
-
- if (job->destroy)
- job->destroy (job->user_data);
-
- if (job->weak_object)
- g_object_weak_unref (job->weak_object, weak_object_destroyed, job);
-
- g_object_unref (job->resolver);
- g_slice_free (GibberResolverJob, job);
-}
-
-GibberResolverAddrInfo *
-gibber_resolver_addrinfo_new (gint address_family,
- gint socket_type,
- gint protocol,
- struct sockaddr *addr,
- gsize sockaddr_len)
-{
- GibberResolverAddrInfo *result;
-
- result = g_slice_new (GibberResolverAddrInfo);
-
- result->address_family = address_family;
- result->socket_type = socket_type;
- result->protocol = protocol;
- memcpy (&(result->sockaddr), addr, sockaddr_len);
- result->sockaddr_len = sockaddr_len;
-
- return result;
-}
-
-void
-gibber_resolver_addrinfo_free (GibberResolverAddrInfo *addrinfo)
-{
- g_slice_free (GibberResolverAddrInfo, addrinfo);
-}
-
-void
-gibber_resolver_addrinfo_list_free (GList *addrinfo_list)
-{
- GList *t;
- GibberResolverAddrInfo *a;
-
- for (t = addrinfo_list ; t != NULL; t = g_list_delete_link (t, t))
- {
- a = (GibberResolverAddrInfo *) t->data;
- gibber_resolver_addrinfo_free (a);
- }
-}
-
-GibberResolverSrvRecord *
-gibber_resolver_srv_record_new (gchar *hostname,
- guint16 port,
- guint16 priority,
- guint16 weight)
-{
- GibberResolverSrvRecord *result;
-
- result = g_slice_new (GibberResolverSrvRecord);
- result->hostname = g_strdup (hostname);
- result->port = port;
- result->priority = priority;
- result->weight = weight;
-
- return result;
-}
-
-void
-gibber_resolver_srv_free (GibberResolverSrvRecord *srvrecord)
-{
- g_free (srvrecord->hostname);
- g_slice_free (GibberResolverSrvRecord, srvrecord);
-}
-
-void
-gibber_resolver_srv_list_free (GList *srv_list)
-{
- GList *t;
- GibberResolverSrvRecord *s;
-
- for (t = srv_list ; t != NULL; t = g_list_delete_link (t, t))
- {
- s = (GibberResolverSrvRecord *) t->data;
- gibber_resolver_srv_free (s);
- }
-}
-
-
-guint
-gibber_resolver_srv (GibberResolver *resolver,
- const gchar *service_name,
- const char *service,
- GibberResolverServiceType type,
- gibber_resolver_srv_cb callback,
- gpointer user_data,
- GDestroyNotify destroy,
- GObject *weak_object)
-{
- GibberResolverClass *cls = GIBBER_RESOLVER_GET_CLASS (resolver);
- gboolean ret;
- guint jobid;
-
- jobid = gibber_resolver_job_add (resolver, G_CALLBACK (callback), user_data,
- destroy, weak_object);
-
- ret = cls->resolv_srv (resolver, jobid, service_name, service, type);
-
- return ret ? jobid : 0;
-}
-
-guint
-gibber_resolver_addrinfo (GibberResolver *resolver,
- const gchar *hostname,
- const char *port,
- int address_family,
- int sock_type,
- int protocol,
- int flags,
- gibber_resolver_addrinfo_cb callback,
- gpointer user_data,
- GDestroyNotify destroy,
- GObject *weak_object)
-{
- GibberResolverClass *cls = GIBBER_RESOLVER_GET_CLASS (resolver);
- gboolean ret;
- guint jobid;
-
- jobid = gibber_resolver_job_add (resolver, G_CALLBACK (callback),
- user_data, destroy, weak_object);
-
- ret = cls->resolv_addrinfo (resolver, jobid, hostname, port, address_family,
- sock_type, protocol, flags);
-
- return ret ? jobid : 0;
-}
-
-guint
-gibber_resolver_nameinfo (GibberResolver *resolver,
- const struct sockaddr *sa,
- socklen_t salen,
- gint flags,
- gibber_resolver_nameinfo_cb callback,
- gpointer user_data,
- GDestroyNotify destroy,
- GObject *weak_object)
-{
- GibberResolverClass *cls = GIBBER_RESOLVER_GET_CLASS (resolver);
- gboolean ret;
- guint jobid;
-
- jobid = gibber_resolver_job_add (resolver, G_CALLBACK (callback), user_data,
- destroy, weak_object);
-
- ret = cls->resolv_nameinfo (resolver, jobid, sa, salen, flags);
-
- return ret ? jobid : 0;
-}
-
-void
-gibber_resolver_cancel (GibberResolver *resolver, guint id)
-{
- GibberResolverClass *cls = GIBBER_RESOLVER_GET_CLASS (resolver);
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
-
- if (g_hash_table_lookup (priv->jobs, &id) == NULL)
- {
- g_warning ("Trying to cancel a non-existing resolver jobs");
- return;
- }
-
- cls->resolv_cancel (resolver, id);
- g_hash_table_remove (priv->jobs, &id);
-}
-
-gboolean
-gibber_resolver_sockaddr_to_str (const struct sockaddr *sa,
- gsize salen,
- gchar **address,
- gchar **service,
- GError **error)
-{
- int ret;
- gchar name[NI_MAXHOST], servicename[NI_MAXSERV];
-
- ret = getnameinfo (sa, salen, name, NI_MAXHOST, servicename, NI_MAXSERV,
- NI_NUMERICHOST | NI_NUMERICSERV);
-
- if (ret != 0)
- {
- g_set_error (error, GIBBER_RESOLVER_ERROR, ret,
- "getnameinfo failed: %s", gai_strerror (ret));
- return FALSE;
- }
-
- if (address != NULL)
- *address = g_strdup (name);
-
- if (service != NULL)
- *service = g_strdup (servicename);
-
- return TRUE;
-}
-
-/* Utility function for classed implementing GibberResolver */
-void
-gibber_resolver_set_data (GibberResolver *resolver, guint id, gpointer data)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
- GibberResolverJob *job;
-
- job = g_hash_table_lookup (priv->jobs, &id);
-
- g_assert (job != NULL);
-
- job->data = data;
-}
-
-gpointer
-gibber_resolver_get_data (GibberResolver *resolver, guint id)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
- GibberResolverJob *job;
-
- job = g_hash_table_lookup (priv->jobs, &id);
-
- g_assert (job != NULL);
-
- return job->data;
-}
-
-static gint
-compare_srv_record (gconstpointer a, gconstpointer b)
-{
- GibberResolverSrvRecord *asrv = (GibberResolverSrvRecord *) a;
- GibberResolverSrvRecord *bsrv = (GibberResolverSrvRecord *) b;
-
- if (asrv->priority != bsrv->priority)
- return asrv->priority < bsrv->priority ? -1 : 1;
-
- if (asrv->weight != 0 || bsrv->weight != 0)
- return asrv->weight == 0 ? -1 : 1;
-
- return 0;
-}
-
-
-static GList *
-weight_sort_srv_list_total (GList *srv_list, gint total)
-{
- GList *l, *s;
- gint num;
- GibberResolverSrvRecord *srv;
-
- if (srv_list == NULL)
- return NULL;
-
- num = g_random_int_range (0, total + 1);
-
- for (l = srv_list ; l != NULL; l = g_list_next (l))
- {
- srv = (GibberResolverSrvRecord *) l->data;
- num -= srv->weight;
- if (num <= 0)
- break;
- }
-
- g_assert (l != NULL);
-
- s = g_list_remove_link (srv_list, l);
-
- return g_list_concat (l,
- weight_sort_srv_list_total (s, total - srv->weight));
-}
-
-static GList *
-weight_sort_srv_list (GList *srv_list)
-{
- GList *l;
- gint total = 0;
- GibberResolverSrvRecord *srv;
-
- /* Sort srv list of equal priority but with weight as specified in RFC2782 */
- srv = (GibberResolverSrvRecord *) srv_list->data;
-
- g_assert (srv_list != NULL);
-
- for (l = srv_list; l != NULL; l = g_list_next (l))
- {
- srv = (GibberResolverSrvRecord *) l->data;
- total += srv->weight;
- }
-
- return weight_sort_srv_list_total (srv_list, total);
-}
-
-static void
-cut_list (GList *link)
-{
- if (link->prev != NULL)
- link->prev->next = NULL;
- link->prev = NULL;
-}
-
-static GList *
-sort_srv_list (GList *srv_list)
-{
- GList *result = NULL;
- GList *start, *end;
- GList *sorted;
- guint16 priority = 0;
-
- sorted = g_list_sort (srv_list, compare_srv_record);
-
- while (sorted != NULL)
- {
- end = NULL;
-
- /* Find the start entry with a non-zero weight */
- for (start = sorted ; start != NULL &&
- ((GibberResolverSrvRecord *) start->data)->weight == 0;
- start = start->next)
- /* nothing */;
-
- if (start != sorted)
- result = g_list_concat (result, sorted);
-
- if (start != NULL)
- {
- cut_list (start);
- priority = ((GibberResolverSrvRecord *) start->data)->priority;
- }
-
- for (end = start ; end != NULL &&
- ((GibberResolverSrvRecord *) end->data)->priority == priority;
- end = end->next)
- /* nothing */;
-
- if (end != NULL)
- cut_list (end);
-
- sorted = end;
-
- if (start != NULL)
- {
- /* We know have a sublist of entries with the same priority but
- * different weights */
- start = weight_sort_srv_list (start);
- result = g_list_concat (result, start);
- }
- }
-
- return result;
-}
-
-void
-gibber_resolver_srv_result (GibberResolver *resolver,
- guint jobid,
- GList *srv_list, GError *error)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
- GibberResolverJob *job;
- gibber_resolver_srv_cb callback;
-
- job = g_hash_table_lookup (priv->jobs, &jobid);
-
- g_assert (job != NULL);
-
- srv_list = sort_srv_list (srv_list);
-
- callback = (gibber_resolver_srv_cb) job->callback;
- callback (resolver, srv_list, error, job->user_data, job->weak_object);
-
- g_hash_table_remove (priv->jobs, &jobid);
-}
-
-void
-gibber_resolver_addrinfo_result (GibberResolver *resolver,
- guint jobid,
- GList *entries,
- GError *error)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
- GibberResolverJob *job;
- gibber_resolver_addrinfo_cb callback;
-
- job = g_hash_table_lookup (priv->jobs, &jobid);
-
- g_assert (job != NULL);
-
- callback = (gibber_resolver_addrinfo_cb)job->callback;
- callback (resolver, entries, error, job->user_data, job->weak_object);
-
- g_hash_table_remove (priv->jobs, &jobid);
-}
-
-void
-gibber_resolver_nameinfo_result (GibberResolver *resolver,
- guint jobid,
- const gchar *hostname,
- const gchar *port,
- GError *error)
-{
- GibberResolverPrivate *priv = GIBBER_RESOLVER_GET_PRIVATE (resolver);
- GibberResolverJob *job;
- gibber_resolver_nameinfo_cb callback;
-
- job = g_hash_table_lookup (priv->jobs, &jobid);
-
- g_assert (job != NULL);
-
- callback = (gibber_resolver_nameinfo_cb) job->callback;
- callback (resolver, hostname, port, error,
- job->user_data, job->weak_object);
-
- g_hash_table_remove (priv->jobs, &jobid);
-}
-
-
-#define ANSWER_BUFSIZE 10240
-GList *
-gibber_resolver_res_query_to_list (guchar *answer, int length)
-{
- GList *list = NULL;
- int qdcount;
- int ancount;
- int len;
- const unsigned char *pos = answer + sizeof (HEADER);
- unsigned char *end = answer + length;
- HEADER *head = (HEADER *) answer;
- char name[256];
-
- qdcount = ntohs (head->qdcount);
- ancount = ntohs (head->ancount);
-
- /* Ignore the questions */
- while (qdcount-- > 0 && (len = dn_expand (answer, end, pos, name, 255)) >= 0)
- {
- pos += len + QFIXEDSZ;
- }
-
- /* Parse the answers */
- while (ancount-- > 0
- && (len = dn_expand (answer, end, pos, name, 255)) >= 0)
- {
- uint16_t pref, weight, port, class, type;
-
- /* Ignore the initial string, which has the query in it */
- pos += len;
- NS_GET16 (type, pos);
- NS_GET16 (class, pos);
-
- if (type != T_SRV || class != C_IN)
- goto failed;
-
- /* skip ttl and dlen */
- pos += 6;
-
- NS_GET16 (pref, pos);
- NS_GET16 (weight, pos);
- NS_GET16 (port, pos);
- len = dn_expand (answer, end, pos, name, 255);
-
- list = g_list_prepend (list,
- gibber_resolver_srv_record_new (name, port, pref, weight));
-
- pos += len;
- }
-
- return list;
-
-failed:
- gibber_resolver_srv_list_free (list);
- return NULL;
-}
-
-GError *
-gibber_resolver_gai_error_to_g_error (int error)
-{
- gint code;
-
- switch (error) {
- case EAI_BADFLAGS:
- case EAI_SOCKTYPE:
- case EAI_FAMILY:
- case EAI_SERVICE:
- code = GIBBER_RESOLVER_ERROR_INVALID_ARGUMENT;
- break;
-
- case EAI_AGAIN:
- code = GIBBER_RESOLVER_ERROR_RESOLVE_TEMPORARY_FAILURE;
- break;
- case EAI_FAIL:
- case EAI_NONAME:
- code = GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE;
- break;
-
- case EAI_MEMORY:
- case EAI_OVERFLOW:
- code = GIBBER_RESOLVER_ERROR_MEMORY;
- break;
-
- case EAI_SYSTEM:
- default:
- code = GIBBER_RESOLVER_ERROR_UNKNOWN;
- }
-
- return g_error_new_literal (GIBBER_RESOLVER_ERROR, code,
- gai_strerror (error));
-}
-
-GError *
-gibber_resolver_h_error_to_g_error (int error)
-{
- gint code;
- gchar *message;
-
- switch (error) {
- case NO_RECOVERY:
- code = GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE,
- message = "Non-recoverable error";
- break;
- case HOST_NOT_FOUND:
- code = GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE,
- message = "Authoritative Answer Host not found";
- break;
- case NO_DATA:
- code = GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE;
- message = "Valid name, no data record of requested type.";
- break;
- case TRY_AGAIN:
- code = GIBBER_RESOLVER_ERROR_RESOLVE_TEMPORARY_FAILURE,
- message = "Temporary resolver failure";
- break;
- default:
- code = GIBBER_RESOLVER_ERROR_UNKNOWN;
- message = "Unknown error";
- }
-
- return g_error_new_literal (GIBBER_RESOLVER_ERROR, code, message);
-}
-
-
-/* Default GibberResolver implementation (blocking) */
-static gboolean
-resolver_resolv_srv (GibberResolver *resolver,
- guint id,
- const gchar *service_name,
- const char *service,
- GibberResolverServiceType type)
-{
- gchar *srv_str;
- int ret;
- GList *entries = NULL;
- GError *error = NULL;
- guchar answer[ANSWER_BUFSIZE];
-
- srv_str = g_strdup_printf ("_%s._%s.%s", service,
- type == GIBBER_RESOLVER_SERVICE_TYPE_TCP ? "tcp" : "udp", service_name);
-
- ret = res_query (srv_str, C_IN, T_SRV, answer, ANSWER_BUFSIZE);
-
- if (ret < 0)
- error = gibber_resolver_h_error_to_g_error (h_errno);
- else
- {
- entries = gibber_resolver_res_query_to_list (answer, ret);
- if (entries == NULL)
- error = g_error_new (GIBBER_RESOLVER_ERROR,
- GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE, "Invalid reply received");
- }
-
- gibber_resolver_srv_result (resolver, id, entries, error);
-
- if (error != NULL)
- g_error_free (error);
-
- g_free (srv_str);
-
- return FALSE;
-}
-
-static gboolean
-resolver_resolv_addrinfo (GibberResolver *resolver,
- guint id,
- const gchar *hostname,
- const char *port,
- int address_family,
- int sock_type,
- int protocol,
- int flags)
-{
- struct addrinfo req, *ans = NULL, *tmpaddr;
- int ret;
- GList *entries = NULL;
-
- memset (&req, 0, sizeof (req));
- req.ai_family = address_family;
- req.ai_socktype = sock_type;
- req.ai_protocol = protocol;
- req.ai_flags = flags;
-
- ret = getaddrinfo (hostname, port, &req, &ans);
-
- if (ret != 0)
- {
- GError *e = gibber_resolver_gai_error_to_g_error (ret);
- gibber_resolver_addrinfo_result (resolver, id, NULL, e);
- g_error_free (e);
- return FALSE;
- }
-
- for (tmpaddr = ans; tmpaddr != NULL; tmpaddr = tmpaddr->ai_next)
- {
- entries = g_list_append (entries,
- gibber_resolver_addrinfo_new (tmpaddr->ai_family,
- tmpaddr->ai_socktype, tmpaddr->ai_protocol,
- tmpaddr->ai_addr, tmpaddr->ai_addrlen));
- }
-
- freeaddrinfo (ans);
-
- gibber_resolver_addrinfo_result (resolver, id, entries, NULL);
-
- return FALSE;
-}
-
-static gboolean
-resolver_resolv_nameinfo (GibberResolver *resolver,
- guint id,
- const struct sockaddr *sa,
- socklen_t salen,
- gint flags)
-{
- int ret;
- gchar name[NI_MAXHOST], servicename[NI_MAXSERV];
-
- ret = getnameinfo (sa, salen, name, NI_MAXHOST, servicename, NI_MAXSERV,
- flags);
-
- if (ret != 0)
- {
- GError *e = gibber_resolver_gai_error_to_g_error (ret);
-
- gibber_resolver_nameinfo_result (resolver, id, NULL, NULL, e);
- g_error_free (e);
- return FALSE;
- }
-
- gibber_resolver_nameinfo_result (resolver, id, g_strdup (name),
- g_strdup (servicename), NULL);
-
- return FALSE;
-}
-
-static void
-resolver_resolv_cancel (GibberResolver *resolver, guint id)
-{
- return;
-}
diff --git a/lib/gibber/gibber-resolver.h b/lib/gibber/gibber-resolver.h
deleted file mode 100644
index 94445d40..00000000
--- a/lib/gibber/gibber-resolver.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * gibber-resolver.h - Header for GibberResolver
- * Copyright (C) 2006 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd@luon.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __GIBBER_RESOLVER_H__
-#define __GIBBER_RESOLVER_H__
-
-#include <glib-object.h>
-
-#include "gibber-sockets.h"
-
-G_BEGIN_DECLS
-
-GQuark gibber_resolver_error_quark (void);
-#define GIBBER_RESOLVER_ERROR \
- gibber_resolver_error_quark ()
-
-typedef enum {
- /* Invalid or unsupported arguments */
- GIBBER_RESOLVER_ERROR_INVALID_ARGUMENT,
- /* Temperary failure in name resolving */
- GIBBER_RESOLVER_ERROR_RESOLVE_TEMPORARY_FAILURE,
- /* Failed to resolve */
- GIBBER_RESOLVER_ERROR_RESOLVE_FAILURE,
- /* Failed to allocate memory or overflow */
- GIBBER_RESOLVER_ERROR_MEMORY,
- /* Unknown error */
- GIBBER_RESOLVER_ERROR_UNKNOWN,
-} GibberResolverError;
-
-typedef enum {
- GIBBER_RESOLVER_SERVICE_TYPE_UDP,
- GIBBER_RESOLVER_SERVICE_TYPE_TCP
-} GibberResolverServiceType;
-
-typedef struct _GibberResolver GibberResolver;
-typedef struct _GibberResolverClass GibberResolverClass;
-
-struct _GibberResolverClass {
- GObjectClass parent_class;
-
- gboolean (*resolv_srv) (GibberResolver *resolver, guint id,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type);
- gboolean (*resolv_addrinfo) (GibberResolver *resolver, guint id,
- const gchar *hostname, const char *port, int address_family, int sock_type,
- int protocol, int flags);
- gboolean (*resolv_nameinfo) (GibberResolver *resolver, guint id,
- const struct sockaddr *sa, socklen_t salen, gint flags);
- void (*resolv_cancel) (GibberResolver *resolver, guint id);
-};
-
-struct _GibberResolver {
- GObject parent;
-};
-
-GType gibber_resolver_get_type (void);
-
-/* TYPE MACROS */
-#define GIBBER_TYPE_RESOLVER \
- (gibber_resolver_get_type ())
-#define GIBBER_RESOLVER(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_RESOLVER, GibberResolver))
-#define GIBBER_RESOLVER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_RESOLVER, GibberResolverClass))
-#define GIBBER_IS_RESOLVER(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_RESOLVER))
-#define GIBBER_IS_RESOLVER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_RESOLVER))
-#define GIBBER_RESOLVER_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_RESOLVER, GibberResolverClass))
-
-GibberResolver * gibber_resolver_get_resolver (void);
-void gibber_resolver_set_resolver (GType object_type);
-
-typedef struct {
- gint address_family;
- gint socket_type;
- gint protocol;
- struct sockaddr_storage sockaddr;
- gsize sockaddr_len;
-} GibberResolverAddrInfo;
-
-typedef struct {
- gchar *hostname;
- guint16 port;
- guint16 priority;
- guint16 weight;
-} GibberResolverSrvRecord;
-
-GibberResolverAddrInfo * gibber_resolver_addrinfo_new (gint address_family,
- gint socket_type, gint protocol, struct sockaddr *addr,
- gsize sockaddr_len);
-
-void gibber_resolver_addrinfo_free (GibberResolverAddrInfo *addrinfo);
-
-void gibber_resolver_addrinfo_list_free (GList *addrinfo_list);
-
-GibberResolverSrvRecord * gibber_resolver_srv_record_new (gchar *hostname,
- guint16 port, guint16 priority, guint16 weight);
-
-void gibber_resolver_srv_free (GibberResolverSrvRecord *srvrecord);
-
-void gibber_resolver_srv_list_free (GList *srv_list);
-
-typedef void (* gibber_resolver_srv_cb) (GibberResolver *resolver,
- GList *srv_list, GError *error, gpointer user_data, GObject *weak_object);
-
-guint gibber_resolver_srv (GibberResolver *resolver,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type,
- gibber_resolver_srv_cb callback,
- gpointer user_data, GDestroyNotify destroy, GObject *weak_object);
-
-/* entries is a GList of GibberResolverAddrInfo */
-typedef void (* gibber_resolver_addrinfo_cb) (GibberResolver *resolver,
- GList *entries, GError *error, gpointer user_data, GObject *weak_object);
-
-guint gibber_resolver_addrinfo (GibberResolver *resolver,
- const gchar *hostname, const char *port,
- int address_family, int sock_type, int protocol, int flags,
- gibber_resolver_addrinfo_cb callback,
- gpointer user_data, GDestroyNotify destroy, GObject *weak_object);
-
-typedef void (* gibber_resolver_nameinfo_cb) (GibberResolver *resolver,
- const gchar *host, const gchar *port, GError *error,
- gpointer user_data, GObject *weak_object);
-
-guint gibber_resolver_nameinfo (GibberResolver *resolver,
- const struct sockaddr *sa, socklen_t salen, gint flags,
- gibber_resolver_nameinfo_cb callback,
- gpointer user_data, GDestroyNotify destroy, GObject *weak_object);
-
-void gibber_resolver_cancel (GibberResolver *resolver, guint id);
-
-gboolean gibber_resolver_sockaddr_to_str (const struct sockaddr *sa,
- gsize salen, gchar **address, gchar **port, GError **error);
-
-/* Utility function for classed implementing GibberResolver */
-void gibber_resolver_set_data (GibberResolver *resolver, guint id,
- gpointer data);
-gpointer gibber_resolver_get_data (GibberResolver *resolver, guint id);
-
-void gibber_resolver_srv_result (GibberResolver *resolver, guint jobid,
- GList *srv_list, GError *error);
-
-void gibber_resolver_addrinfo_result (GibberResolver *resolver, guint jobid,
- GList *entries, GError *error);
-
-void gibber_resolver_nameinfo_result (GibberResolver *resolver, guint jobid,
- const gchar *hostname, const gchar *port, GError *error);
-
-GList *gibber_resolver_res_query_to_list (guchar *answer, int length);
-GError *gibber_resolver_gai_error_to_g_error (int error);
-GError *gibber_resolver_h_error_to_g_error (int error);
-
-G_END_DECLS
-
-#endif /* #ifndef __GIBBER_RESOLVER_H__*/
diff --git a/lib/gibber/tests/Makefile.am b/lib/gibber/tests/Makefile.am
index be18ad97..0bbf78c1 100644
--- a/lib/gibber/tests/Makefile.am
+++ b/lib/gibber/tests/Makefile.am
@@ -57,9 +57,6 @@ check_main_SOURCES = \
check-gibber-xmpp-node.c \
check-gibber-xmpp-reader.c \
check-gibber-r-multicast-causal-transport.c \
- check-gibber-resolver.c \
- test-resolver.c \
- test-resolver.h \
test-transport.c \
test-transport.h \
check-gibber-xmpp-connection.c \
diff --git a/lib/gibber/tests/check-gibber-resolver.c b/lib/gibber/tests/check-gibber-resolver.c
deleted file mode 100644
index ba6effa0..00000000
--- a/lib/gibber/tests/check-gibber-resolver.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * check-gibber-resolver.c - Test for gibber-resolver functions
- * Copyright (C) 2008 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "test-resolver.h"
-#include "check-gibber.h"
-
-#include <check.h>
-
-GMainLoop *mainloop = NULL;
-gboolean done = FALSE;
-
-static void
-resolver_srv_cb (GibberResolver *resolver, GList *srv_list, GError *error,
- gpointer user_data, GObject *weak_object)
-{
- GList *s;
- int last_prio = 0;
- int last_weight = 0;
-
- for (s = srv_list ; s != NULL; s = g_list_next (s))
- {
- GibberResolverSrvRecord *r = (GibberResolverSrvRecord *) s->data;
-
- fail_unless (last_prio <= r->priority);
-
- if (last_prio != r->priority)
- last_weight = 0;
-
- /* If our previous weight was non-zero, then this one has to be non-zero
- * too. The SRV RFC requires all entries with zero weight to be sorted
- * before all other entries with the same priority */
- fail_unless (last_weight == 0 || r->weight != 0);
-
- last_prio = r->priority;
- last_weight = r->weight;
- }
-
- done = TRUE;
-
- if (g_main_loop_is_running (mainloop))
- g_main_loop_quit (mainloop);
-}
-
-START_TEST (test_srv_resolving)
-{
- GibberResolver *resolver;
-
- done = FALSE;
- mainloop = g_main_loop_new (NULL, FALSE);
-
- resolver = g_object_new (TEST_TYPE_RESOLVER, NULL);
-
- gibber_resolver_srv (resolver, "test", "test",
- GIBBER_RESOLVER_SERVICE_TYPE_TCP,
- resolver_srv_cb, NULL, NULL, NULL);
-
- if (!done)
- g_main_loop_run (mainloop);
-
- g_main_loop_unref (mainloop);
-} END_TEST
-
-TCase *
-make_gibber_resolver_tcase (void)
-{
- TCase *tc = tcase_create ("Resolve");
- tcase_add_test (tc, test_srv_resolving);
- return tc;
-}
diff --git a/lib/gibber/tests/check-gibber.h b/lib/gibber/tests/check-gibber.h
index 95bc208a..ba785c5d 100644
--- a/lib/gibber/tests/check-gibber.h
+++ b/lib/gibber/tests/check-gibber.h
@@ -7,7 +7,6 @@ TCase *make_gibber_xmpp_node_tcase (void);
TCase *make_gibber_xmpp_reader_tcase (void);
TCase *make_gibber_xmpp_connection_tcase (void);
TCase *make_gibber_sasl_auth_tcase (void);
-TCase *make_gibber_resolver_tcase (void);
TCase *make_gibber_r_multicast_packet_tcase (void);
TCase *make_gibber_r_multicast_causal_transport_tcase (void);
TCase *make_gibber_r_multicast_sender_tcase (void);
diff --git a/lib/gibber/tests/check-main.c b/lib/gibber/tests/check-main.c
index 685d22f5..ea7f7bb2 100644
--- a/lib/gibber/tests/check-main.c
+++ b/lib/gibber/tests/check-main.c
@@ -21,7 +21,6 @@ make_gibber_suite (void)
#ifdef HAVE_LIBSASL2
suite_add_tcase (s, make_gibber_sasl_auth_tcase ());
#endif
- suite_add_tcase (s, make_gibber_resolver_tcase ());
suite_add_tcase (s, make_gibber_r_multicast_packet_tcase ());
suite_add_tcase (s, make_gibber_r_multicast_sender_tcase ());
suite_add_tcase (s, make_gibber_r_multicast_causal_transport_tcase ());
diff --git a/lib/gibber/tests/test-resolver.c b/lib/gibber/tests/test-resolver.c
deleted file mode 100644
index bb6ab8d7..00000000
--- a/lib/gibber/tests/test-resolver.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * test-resolver.c - Source for TestResolver
- * Copyright (C) 2008 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "test-resolver.h"
-
-G_DEFINE_TYPE(TestResolver, test_resolver, GIBBER_TYPE_RESOLVER)
-
-/* private structure */
-typedef struct _TestResolverPrivate TestResolverPrivate;
-
-struct _TestResolverPrivate
-{
- gboolean dispose_has_run;
-};
-
-#define TEST_RESOLVER_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), TEST_TYPE_RESOLVER, TestResolverPrivate))
-
-static void
-test_resolver_init (TestResolver *obj)
-{
-}
-
-static void test_resolver_dispose (GObject *object);
-static void test_resolver_finalize (GObject *object);
-
-static gboolean test_resolv_srv (GibberResolver *resolver, guint id,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type);
-
-static void
-test_resolver_class_init (TestResolverClass *test_resolver_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (test_resolver_class);
- GibberResolverClass *resolver_class = GIBBER_RESOLVER_CLASS
- (test_resolver_class);
-
- g_type_class_add_private (test_resolver_class, sizeof (TestResolverPrivate));
-
- object_class->dispose = test_resolver_dispose;
- object_class->finalize = test_resolver_finalize;
-
- resolver_class->resolv_srv = test_resolv_srv;
-}
-
-void
-test_resolver_dispose (GObject *object)
-{
- TestResolver *self = TEST_RESOLVER (object);
- TestResolverPrivate *priv = TEST_RESOLVER_GET_PRIVATE (self);
-
- if (priv->dispose_has_run)
- return;
-
- priv->dispose_has_run = TRUE;
-
- /* release any references held by the object here */
-
- if (G_OBJECT_CLASS (test_resolver_parent_class)->dispose)
- G_OBJECT_CLASS (test_resolver_parent_class)->dispose (object);
-}
-
-void
-test_resolver_finalize (GObject *object)
-{
- G_OBJECT_CLASS (test_resolver_parent_class)->finalize (object);
-}
-
-
-static gboolean test_resolv_srv (GibberResolver *resolver, guint id,
- const gchar *service_name, const char *service,
- GibberResolverServiceType type)
-{
- GList *entries = NULL;
- int i;
-
- for (i = 0 ; i < 20 ; i++)
- {
- gchar *str;
-
- str = g_strdup_printf ("test%2d.example.com", i);
-
- entries = g_list_prepend (entries,
- gibber_resolver_srv_record_new (str, 1234,
- 10 - (i / 5) , 4 - i % 5));
-
- g_free (str);
- }
-
- gibber_resolver_srv_result (resolver, id, entries, NULL);
- return FALSE;
-}
diff --git a/lib/gibber/tests/test-resolver.h b/lib/gibber/tests/test-resolver.h
deleted file mode 100644
index 1d39e4e6..00000000
--- a/lib/gibber/tests/test-resolver.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * test-resolver.h - Header for TestResolver
- * Copyright (C) 2008 Collabora Ltd.
- * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __TEST_RESOLVER_H__
-#define __TEST_RESOLVER_H__
-
-#include <glib-object.h>
-#include <gibber/gibber-resolver.h>
-
-G_BEGIN_DECLS
-
-typedef struct _TestResolver TestResolver;
-typedef struct _TestResolverClass TestResolverClass;
-
-struct _TestResolverClass {
- GibberResolverClass parent_class;
-};
-
-struct _TestResolver {
- GibberResolver parent;
-};
-
-GType test_resolver_get_type (void);
-
-/* TYPE MACROS */
-#define TEST_TYPE_RESOLVER \
- (test_resolver_get_type ())
-#define TEST_RESOLVER(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), TEST_TYPE_RESOLVER, TestResolver))
-#define TEST_RESOLVER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_RESOLVER, TestResolverClass))
-#define TEST_IS_RESOLVER(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj), TEST_TYPE_RESOLVER))
-#define TEST_IS_RESOLVER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_RESOLVER))
-#define TEST_RESOLVER_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_RESOLVER, TestResolverClass))
-
-
-G_END_DECLS
-
-#endif /* #ifndef __TEST_RESOLVER_H__*/
diff --git a/src/salut-connection-manager.c b/src/salut-connection-manager.c
index 666ffed1..78c4fae4 100644
--- a/src/salut-connection-manager.c
+++ b/src/salut-connection-manager.c
@@ -19,6 +19,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "config.h"
+#include "salut-connection-manager.h"
+
#include <stdio.h>
#include <stdlib.h>
@@ -26,7 +29,6 @@
#include <telepathy-glib/util.h>
#include <telepathy-glib/debug-sender.h>
-#include "salut-connection-manager.h"
#include "salut-connection.h"
#include "debug.h"
@@ -37,15 +39,13 @@ enum
LAST_PROPERTY
};
-typedef struct _SalutConnectionManagerPrivate SalutConnectionManagerPrivate;
struct _SalutConnectionManagerPrivate
{
GType backend_type;
TpDebugSender *debug_sender;
};
-#define SALUT_CONNECTION_MANAGER_GET_PRIVATE(obj) \
- ((SalutConnectionManagerPrivate *) ((SalutConnectionManager *) obj)->priv)
+#define SALUT_CONNECTION_MANAGER_GET_PRIVATE(obj) ((obj)->priv)
typedef struct {
@@ -166,8 +166,10 @@ salut_connection_manager_set_property (GObject *object,
static void
salut_connection_manager_finalize (GObject *object)
{
- SalutConnectionManagerPrivate *priv = SALUT_CONNECTION_MANAGER_GET_PRIVATE (
- object);
+ SalutConnectionManager *self = SALUT_CONNECTION_MANAGER (object);
+ SalutConnectionManagerPrivate *priv = self->priv;
+ void (*finalize) (GObject *) =
+ ((GObjectClass *) salut_connection_manager_parent_class)->finalize;
if (priv->debug_sender != NULL)
{
@@ -176,6 +178,9 @@ salut_connection_manager_finalize (GObject *object)
}
debug_free ();
+
+ if (finalize != NULL)
+ finalize (object);
}
static void
diff --git a/src/salut-connection-manager.h b/src/salut-connection-manager.h
index d52217ee..21e616cd 100644
--- a/src/salut-connection-manager.h
+++ b/src/salut-connection-manager.h
@@ -28,6 +28,7 @@ G_BEGIN_DECLS
typedef struct _SalutConnectionManager SalutConnectionManager;
typedef struct _SalutConnectionManagerClass SalutConnectionManagerClass;
+typedef struct _SalutConnectionManagerPrivate SalutConnectionManagerPrivate;
struct _SalutConnectionManagerClass {
TpBaseConnectionManagerClass parent_class;
@@ -36,7 +37,7 @@ struct _SalutConnectionManagerClass {
struct _SalutConnectionManager {
TpBaseConnectionManager parent;
- gpointer priv;
+ SalutConnectionManagerPrivate *priv;
};
extern const TpCMProtocolSpec salut_protocols[];
diff --git a/src/salut-connection.c b/src/salut-connection.c
index 2fc1b11c..42194b47 100644
--- a/src/salut-connection.c
+++ b/src/salut-connection.c
@@ -673,6 +673,25 @@ set_own_status (GObject *obj,
return TRUE;
}
+static const gchar *interfaces [] = {
+ TP_IFACE_CONNECTION_INTERFACE_ALIASING,
+ TP_IFACE_CONNECTION_INTERFACE_AVATARS,
+ TP_IFACE_CONNECTION_INTERFACE_CONTACTS,
+ TP_IFACE_CONNECTION_INTERFACE_PRESENCE,
+ TP_IFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE,
+ TP_IFACE_CONNECTION_INTERFACE_REQUESTS,
+#ifdef ENABLE_OLPC
+ SALUT_IFACE_OLPC_BUDDY_INFO,
+ SALUT_IFACE_OLPC_ACTIVITY_PROPERTIES,
+#endif
+ NULL };
+
+const gchar * const *
+salut_connection_get_implemented_interfaces (void)
+{
+ return interfaces;
+}
+
static void
salut_connection_class_init (SalutConnectionClass *salut_connection_class)
{
@@ -680,18 +699,6 @@ salut_connection_class_init (SalutConnectionClass *salut_connection_class)
TpBaseConnectionClass *tp_connection_class =
TP_BASE_CONNECTION_CLASS(salut_connection_class);
GParamSpec *param_spec;
- static const gchar *interfaces [] = {
- TP_IFACE_CONNECTION_INTERFACE_ALIASING,
- TP_IFACE_CONNECTION_INTERFACE_AVATARS,
- TP_IFACE_CONNECTION_INTERFACE_CONTACTS,
- TP_IFACE_CONNECTION_INTERFACE_PRESENCE,
- TP_IFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE,
- TP_IFACE_CONNECTION_INTERFACE_REQUESTS,
-#ifdef ENABLE_OLPC
- SALUT_IFACE_OLPC_BUDDY_INFO,
- SALUT_IFACE_OLPC_ACTIVITY_PROPERTIES,
-#endif
- NULL };
static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
{ TP_IFACE_CONNECTION_INTERFACE_AVATARS,
conn_avatars_properties_getter,
@@ -3109,11 +3116,9 @@ salut_connection_olpc_activity_properties_iface_init (gpointer g_iface,
}
#endif
-static gchar *
-handle_normalize_require_nonempty (TpHandleRepoIface *repo,
- const gchar *id,
- gpointer context,
- GError **error)
+gchar *
+salut_normalize_non_empty (const gchar *id,
+ GError **error)
{
g_return_val_if_fail (id != NULL, NULL);
@@ -3127,6 +3132,15 @@ handle_normalize_require_nonempty (TpHandleRepoIface *repo,
return g_strdup (id);
}
+static gchar *
+handle_normalize_require_nonempty (TpHandleRepoIface *repo G_GNUC_UNUSED,
+ const gchar *id,
+ gpointer context G_GNUC_UNUSED,
+ GError **error)
+{
+ return salut_normalize_non_empty (id, error);
+}
+
/* Connection baseclass function implementations */
static void
salut_connection_create_handle_repos (TpBaseConnection *self,
diff --git a/src/salut-connection.h b/src/salut-connection.h
index e088e755..1575882d 100644
--- a/src/salut-connection.h
+++ b/src/salut-connection.h
@@ -100,6 +100,10 @@ salut_connection_olpc_observe_muc_stanza (SalutConnection *self, TpHandle room,
TpHandle sender, GibberXmppStanza *stanza);
#endif
+const gchar * const *salut_connection_get_implemented_interfaces (void);
+
+gchar *salut_normalize_non_empty (const gchar *id, GError **error);
+
G_END_DECLS
#endif /* #ifndef __SALUT_CONNECTION_H__*/