From 0f85e9ae246b1e7a9b7872bca14dbb92fe0d1910 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 23 Sep 2010 16:27:28 +0100 Subject: Remove the GibberResolver and all its infrastructure Salut never used it, and Gabble no longer uses it either, so let's bin it. Please use GResolver in new code. --- configure.ac | 34 -- lib/gibber/Makefile.am | 18 +- lib/gibber/examples/Makefile.am | 9 +- lib/gibber/examples/test-resolv.c | 130 ----- lib/gibber/gibber-resolver-asyncns.c | 415 -------------- lib/gibber/gibber-resolver-asyncns.h | 59 -- lib/gibber/gibber-resolver.c | 896 ------------------------------- lib/gibber/gibber-resolver.h | 175 ------ lib/gibber/tests/Makefile.am | 3 - lib/gibber/tests/check-gibber-resolver.c | 91 ---- lib/gibber/tests/check-gibber.h | 1 - lib/gibber/tests/check-main.c | 1 - lib/gibber/tests/test-resolver.c | 113 ---- lib/gibber/tests/test-resolver.h | 59 -- 14 files changed, 2 insertions(+), 2002 deletions(-) delete mode 100644 lib/gibber/examples/test-resolv.c delete mode 100644 lib/gibber/gibber-resolver-asyncns.c delete mode 100644 lib/gibber/gibber-resolver-asyncns.h delete mode 100644 lib/gibber/gibber-resolver.c delete mode 100644 lib/gibber/gibber-resolver.h delete mode 100644 lib/gibber/tests/check-gibber-resolver.c delete mode 100644 lib/gibber/tests/test-resolver.c delete mode 100644 lib/gibber/tests/test-resolver.h 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 ]], [[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 -#include - -#include - -#include - -#include - -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 - * - * 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 -#include -#include -#include - -#include - -#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 - * - * 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 -#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 - * - * 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 -#include - -#include - -#include "gibber-sockets.h" - -#include - -#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 - * - * 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 - -#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 - * - * 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 -#include -#include - -#include "test-resolver.h" -#include "check-gibber.h" - -#include - -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 - * - * 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 -#include - -#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 - * - * 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 -#include - -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__*/ -- cgit v1.2.1 From cbde852e371dfdaadda1d62453ff6b815b7c25ae Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 23 Sep 2010 16:28:46 +0100 Subject: SalutConnectionManager: include headers in the recommended order --- src/salut-connection-manager.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/salut-connection-manager.c b/src/salut-connection-manager.c index 666ffed1..b91b4461 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 #include @@ -26,7 +29,6 @@ #include #include -#include "salut-connection-manager.h" #include "salut-connection.h" #include "debug.h" -- cgit v1.2.1 From a3edc3da9df00ae0cc787f34481a01b63a9f3453 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 23 Sep 2010 16:32:49 +0100 Subject: SalutConnectionManager: use the normal telepathy-glib priv idioms This way is less verbose and more type-safe that what's there at the moment. --- src/salut-connection-manager.c | 15 ++++++--------- src/salut-connection-manager.h | 3 ++- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/salut-connection-manager.c b/src/salut-connection-manager.c index b91b4461..166ce3cf 100644 --- a/src/salut-connection-manager.c +++ b/src/salut-connection-manager.c @@ -39,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 { @@ -168,8 +166,8 @@ 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; if (priv->debug_sender != NULL) { @@ -236,14 +234,13 @@ static void salut_params_free (void *params) } static TpBaseConnection * -salut_connection_manager_new_connection (TpBaseConnectionManager *self, +salut_connection_manager_new_connection (TpBaseConnectionManager *base, const gchar *proto, TpIntSet *params_present, void *parsed_params, GError **error) { - SalutConnectionManagerPrivate *priv = SALUT_CONNECTION_MANAGER_GET_PRIVATE - (self); + SalutConnectionManager *self = SALUT_CONNECTION_MANAGER (base); SalutConnection *conn; SalutParams *params = (SalutParams *) parsed_params; @@ -251,7 +248,7 @@ salut_connection_manager_new_connection (TpBaseConnectionManager *self, conn = g_object_new (SALUT_TYPE_CONNECTION, "protocol", proto, - "backend-type", priv->backend_type, + "backend-type", self->priv->backend_type, NULL); SET_PROPERTY_IF_PARAM_SET ("nickname", SALUT_PARAM_NICKNAME, 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[]; -- cgit v1.2.1 From 636c5237465f5d8f15638e8a38f28f0744737e25 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 23 Sep 2010 16:34:00 +0100 Subject: salut_connection_manager_finalize: chain up to superclass correctly --- src/salut-connection-manager.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/salut-connection-manager.c b/src/salut-connection-manager.c index 166ce3cf..78c4fae4 100644 --- a/src/salut-connection-manager.c +++ b/src/salut-connection-manager.c @@ -168,6 +168,8 @@ salut_connection_manager_finalize (GObject *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 @@ -234,13 +239,14 @@ static void salut_params_free (void *params) } static TpBaseConnection * -salut_connection_manager_new_connection (TpBaseConnectionManager *base, +salut_connection_manager_new_connection (TpBaseConnectionManager *self, const gchar *proto, TpIntSet *params_present, void *parsed_params, GError **error) { - SalutConnectionManager *self = SALUT_CONNECTION_MANAGER (base); + SalutConnectionManagerPrivate *priv = SALUT_CONNECTION_MANAGER_GET_PRIVATE + (self); SalutConnection *conn; SalutParams *params = (SalutParams *) parsed_params; @@ -248,7 +254,7 @@ salut_connection_manager_new_connection (TpBaseConnectionManager *base, conn = g_object_new (SALUT_TYPE_CONNECTION, "protocol", proto, - "backend-type", self->priv->backend_type, + "backend-type", priv->backend_type, NULL); SET_PROPERTY_IF_PARAM_SET ("nickname", SALUT_PARAM_NICKNAME, -- cgit v1.2.1 From 286f1ba0d330dfc0513e1d45cf58884408f2e8c6 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 23 Sep 2010 16:34:38 +0100 Subject: salut_connection_get_implemented_interfaces: add We'll need this for Protocol objects. --- src/salut-connection.c | 31 +++++++++++++++++++------------ src/salut-connection.h | 2 ++ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/salut-connection.c b/src/salut-connection.c index 2fc1b11c..eefba0ab 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, diff --git a/src/salut-connection.h b/src/salut-connection.h index e088e755..a6855286 100644 --- a/src/salut-connection.h +++ b/src/salut-connection.h @@ -100,6 +100,8 @@ salut_connection_olpc_observe_muc_stanza (SalutConnection *self, TpHandle room, TpHandle sender, GibberXmppStanza *stanza); #endif +const gchar * const *salut_connection_get_implemented_interfaces (void); + G_END_DECLS #endif /* #ifndef __SALUT_CONNECTION_H__*/ -- cgit v1.2.1 From e18e5bcd4115f50fa0fc2fc88f0e15995db23606 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 23 Sep 2010 16:36:37 +0100 Subject: salut_normalize_non_empty: factor out connection-independent normalization We'll need this for the Protocol. --- src/salut-connection.c | 17 ++++++++++++----- src/salut-connection.h | 2 ++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/salut-connection.c b/src/salut-connection.c index eefba0ab..42194b47 100644 --- a/src/salut-connection.c +++ b/src/salut-connection.c @@ -3116,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); @@ -3134,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 a6855286..1575882d 100644 --- a/src/salut-connection.h +++ b/src/salut-connection.h @@ -102,6 +102,8 @@ salut_connection_olpc_observe_muc_stanza (SalutConnection *self, TpHandle room, 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__*/ -- cgit v1.2.1