1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2008 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
22 #include "gsocketconnectable.h"
28 * SECTION:gsocketconnectable
29 * @short_description: Interface for potential socket endpoints
31 * Objects that describe one or more potential socket endpoints
32 * implement #GSocketConnectable. Callers can then use
33 * g_socket_connectable_enumerate() to get a #GSocketAddressEnumerator
34 * to try out each socket address in turn until one succeeds, as shown
35 * in the sample code below.
39 * connect_to_host (const char *hostname,
41 * GCancellable *cancellable,
44 * MyConnection *conn = NULL;
45 * GSocketConnectable *addr;
46 * GSocketAddressEnumerator *enumerator;
47 * GSocketAddress *sockaddr;
48 * GError *conn_error = NULL;
50 * addr = g_network_address_new ("www.gnome.org", 80);
51 * enumerator = g_socket_connectable_enumerate (addr);
52 * g_object_unref (addr);
54 * /<!-- -->* Try each sockaddr until we succeed. Record the first
55 * * connection error, but not any further ones (since they'll probably
56 * * be basically the same as the first).
58 * while (!conn && (sockaddr = g_socket_address_enumerator_next (enumerator, cancellable, error))
60 * conn = connect_to_sockaddr (sockaddr, conn_error ? NULL : &conn_error);
61 * g_object_unref (sockaddr);
63 * g_object_unref (enumerator);
69 * /<!-- -->* We couldn't connect to the first address, but we succeeded
70 * * in connecting to a later address.
72 * g_error_free (conn_error);
78 * /<!-- -->* Either the initial lookup failed, or else the caller
82 * g_error_free (conn_error);
87 * g_error_propagate (error, conn_error);
95 g_socket_connectable_get_type (void)
97 static volatile gsize g_define_type_id__volatile
= 0;
99 if (g_once_init_enter (&g_define_type_id__volatile
))
101 const GTypeInfo connectable_info
=
103 sizeof (GSocketConnectableIface
), /* class_size */
104 NULL
, /* base_init */
105 NULL
, /* base_finalize */
107 NULL
, /* class_finalize */
108 NULL
, /* class_data */
113 GType g_define_type_id
=
114 g_type_register_static (G_TYPE_INTERFACE
, I_("GSocketConnectable"),
115 &connectable_info
, 0);
117 g_type_interface_add_prerequisite (g_define_type_id
, G_TYPE_OBJECT
);
119 g_once_init_leave (&g_define_type_id__volatile
, g_define_type_id
);
122 return g_define_type_id__volatile
;
126 * g_socket_connectable_enumerate:
127 * @connectable: a #GSocketConnectable
129 * Creates a #GSocketAddressEnumerator for @connectable.
131 * Return value: a new #GSocketAddressEnumerator.
135 GSocketAddressEnumerator
*
136 g_socket_connectable_enumerate (GSocketConnectable
*connectable
)
138 GSocketConnectableIface
*iface
;
140 g_return_val_if_fail (G_IS_SOCKET_CONNECTABLE (connectable
), NULL
);
142 iface
= G_SOCKET_CONNECTABLE_GET_IFACE (connectable
);
144 return (* iface
->enumerate
) (connectable
);
147 #define __G_SOCKET_CONNECTABLE_C__
148 #include "gioaliasdef.c"