#ifndef __GSK_PACKET_QUEUE_H_
#define __GSK_PACKET_QUEUE_H_
#include "gskio.h"
#include "gskpacket.h"
#include "gsksocketaddress.h"
G_BEGIN_DECLS
/* --- typedefs --- */
typedef struct _GskPacketQueue GskPacketQueue;
typedef struct _GskPacketQueueClass GskPacketQueueClass;
/* --- type macros --- */
GType gsk_packet_queue_get_type(void) G_GNUC_CONST;
#define GSK_TYPE_PACKET_QUEUE (gsk_packet_queue_get_type ())
#define GSK_PACKET_QUEUE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_PACKET_QUEUE, GskPacketQueue))
#define GSK_PACKET_QUEUE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_PACKET_QUEUE, GskPacketQueueClass))
#define GSK_PACKET_QUEUE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_PACKET_QUEUE, GskPacketQueueClass))
#define GSK_IS_PACKET_QUEUE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_PACKET_QUEUE))
#define GSK_IS_PACKET_QUEUE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_PACKET_QUEUE))
/* --- structures --- */
struct _GskPacketQueueClass
{
GskIOClass io_class;
gboolean (*bind) (GskPacketQueue *queue,
GskSocketAddress *addr,
GError **error);
GskPacket *(*read) (GskPacketQueue *queue,
gboolean save_address,
GError **error);
gboolean (*write) (GskPacketQueue *queue,
GskPacket *out,
GError **error);
};
struct _GskPacketQueue
{
GskIO io;
guint allow_address : 1;
guint allow_no_address : 1;
guint misses_packets : 1;
GskSocketAddress *bound_address;
};
/* --- prototypes --- */
gboolean gsk_packet_queue_bind (GskPacketQueue *queue,
GskSocketAddress *address,
GError **error);
GskPacket *gsk_packet_queue_read (GskPacketQueue *queue,
gboolean save_address,
GError **error);
gboolean gsk_packet_queue_write (GskPacketQueue *queue,
GskPacket *out,
GError **error);
#define gsk_packet_queue_get_allow_address(queue) _gsk_packet_queue_get(queue,allow_address)
#define gsk_packet_queue_get_allow_no_address(queue) _gsk_packet_queue_get(queue,allow_no_address)
#define gsk_packet_queue_get_misses_packets(queue) _gsk_packet_queue_get(queue,misses_packets)
#define gsk_packet_queue_get_is_readable(queue) _gsk_packet_queue_get_io(queue,is_readable)
#define gsk_packet_queue_get_is_writable(queue) _gsk_packet_queue_get_io(queue,is_writable)
#define gsk_packet_queue_peek_bound_address(queue) ((queue)->bound_address)
/*< protected >*/
#define gsk_packet_queue_mark_allow_address(queue) _gsk_packet_queue_mark(queue,allow_address)
#define gsk_packet_queue_mark_allow_no_address(queue) _gsk_packet_queue_mark(queue,allow_no_address)
#define gsk_packet_queue_mark_misses_packets(queue) _gsk_packet_queue_mark(queue,misses_packets)
#define gsk_packet_queue_mark_is_readable(queue) _gsk_packet_queue_mark_io(queue,is_readable)
#define gsk_packet_queue_mark_is_writable(queue) _gsk_packet_queue_mark_io(queue,is_writable)
#define gsk_packet_queue_clear_allow_address(queue) _gsk_packet_queue_clear(queue,allow_address)
#define gsk_packet_queue_clear_allow_no_address(queue) _gsk_packet_queue_clear(queue,allow_no_address)
#define gsk_packet_queue_clear_misses_packets(queue) _gsk_packet_queue_clear(queue,misses_packets)
#define gsk_packet_queue_clear_is_readable(queue) _gsk_packet_queue_clear_io(queue,is_readable)
#define gsk_packet_queue_clear_is_writable(queue) _gsk_packet_queue_clear_io(queue,is_writable)
/*< private >*/
#define _gsk_packet_queue_get(queue, field) ((queue)->field != 0)
#define _gsk_packet_queue_mark(queue, field) G_STMT_START{ (queue)->field = 1; }G_STMT_END
#define _gsk_packet_queue_clear(queue, field) G_STMT_START{ (queue)->field = 0; }G_STMT_END
#define _gsk_packet_queue_get_io(queue, field) _gsk_packet_queue_get(queue,io.field)
#define _gsk_packet_queue_mark_io(queue, field) _gsk_packet_queue_mark(queue,io.field)
#define _gsk_packet_queue_clear_io(queue, field) _gsk_packet_queue_clear(queue,io.field)
void gsk_packet_queue_set_bound_addresss (GskPacketQueue *queue,
GskSocketAddress *address);
G_END_DECLS
#endif
syntax highlighted by Code2HTML, v. 0.9.1