#ifndef __GSK_PERSISTENT_CONNECTION_H_
#define __GSK_PERSISTENT_CONNECTION_H_
#include "gskstream.h"
#include "gskmainloop.h"
#include "gsksocketaddress.h"
G_BEGIN_DECLS
/* --- typedefs --- */
typedef struct _GskPersistentConnection GskPersistentConnection;
typedef struct _GskPersistentConnectionClass GskPersistentConnectionClass;
/* --- type macros --- */
GType gsk_persistent_connection_get_type(void) G_GNUC_CONST;
#define GSK_TYPE_PERSISTENT_CONNECTION (gsk_persistent_connection_get_type ())
#define GSK_PERSISTENT_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_PERSISTENT_CONNECTION, GskPersistentConnection))
#define GSK_PERSISTENT_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_PERSISTENT_CONNECTION, GskPersistentConnectionClass))
#define GSK_PERSISTENT_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_PERSISTENT_CONNECTION, GskPersistentConnectionClass))
#define GSK_IS_PERSISTENT_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_PERSISTENT_CONNECTION))
#define GSK_IS_PERSISTENT_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_PERSISTENT_CONNECTION))
/* --- structures --- */
/* NOTE: the "DOING_NAME_RESOLUTION" state is now obsolete,
but it is retained for backward compatibility.
Use the gsk_persistent_connection_is_doing_name_resolution()
macro, and know that when doing name-resolution,
state == CONNECTING. */
typedef enum
{
GSK_PERSISTENT_CONNECTION_INIT,
GSK_PERSISTENT_CONNECTION_DOING_NAME_RESOLUTION,
GSK_PERSISTENT_CONNECTION_CONNECTING,
GSK_PERSISTENT_CONNECTION_CONNECTED,
GSK_PERSISTENT_CONNECTION_WAITING
} GskPersistentConnectionState;
struct _GskPersistentConnectionClass
{
GskStreamClass base_class;
void (*handle_connected) (GskPersistentConnection *);
void (*handle_disconnected) (GskPersistentConnection *);
};
struct _GskPersistentConnection
{
GskStream base_instance;
GskPersistentConnectionState state;
guint retry_timeout_ms;
/* debugging */
guint warn_on_transport_errors : 1;
guint debug_connection : 1;
/* Alternate methods for specifying the address. */
/* by socket address */
GskSocketAddress *address;
/*< private >*/
GskStream *transport;
GskSource *retry_timeout_source;
gulong transport_on_connect_signal_handler;
gulong transport_on_error_signal_handler;
};
/* note: you will have to #include streamfd.h for this to work. */
#define gsk_persistent_connection_is_doing_name_resolution(pc) \
((pc)->state == GSK_PERSISTENT_CONNECTION_CONNECTING \
&& GSK_STREAM_FD ((pc)->transport)->is_resolving_name)
/* --- prototypes --- */
GskStream *gsk_persistent_connection_new (GskSocketAddress *address,
guint retry_timeout_ms);
GskStream *gsk_persistent_connection_new_lookup
(const char *host,
guint port,
guint retry_timeout_ms);
void gsk_persistent_connection_restart (GskPersistentConnection *connection,
guint retry_wait_ms);
G_END_DECLS
#endif
syntax highlighted by Code2HTML, v. 0.9.1