/*-
 * $Id: rr-connection.h,v 1.31 2002/11/21 17:04:47 jonas Exp $
 *
 * See the file LICENSE for redistribution information. 
 * If you have not received a copy of the license, please contact CodeFactory
 * by email at info@codefactory.se, or on the web at http://www.codefactory.se/
 * You may also write to: CodeFactory AB, SE-903 47, Umeå, Sweden.
 *
 * Copyright (c) 2002 Jonas Borgström <jonas@codefactory.se>
 * Copyright (c) 2002 Daniel Lundin   <daniel@codefactory.se>
 * Copyright (c) 2002 CodeFactory AB.  All rights reserved.
 */

#ifndef __RR_CONNECTION_H__
#define __RR_CONNECTION_H__

typedef struct _RRConnection RRConnection;
typedef struct _RRConnectionClass RRConnectionClass;

#include <glib-object.h>
#include <librr/rr-channel.h>
#include <librr/rr-frame.h>
#include <librr/rr-profileregistry.h>
#include <librr/rr-listener.h>
#include <librr/rr-filterstack.h>
#include <librr/rr-callbacklist.h>

#include <librr/rr-manager.h>

G_BEGIN_DECLS

#define RR_TYPE_CONNECTION (rr_connection_get_type ())
#define RR_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RR_TYPE_CONNECTION, RRConnection))
#define RR_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RR_TYPE_CONNECTION, RRConnectionClass))
#define RR_IS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), RR_TYPE_CONNECTION))
#define RR_IS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RR_TYPE_CONNECTION))
#define RR_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RR_TYPE_CONNECTION, RRConnectionClass))

typedef enum {
	RR_ROLE_LISTENER,
	RR_ROLE_INITIATOR
} RRRole;

struct _RRConnection {
	GObject parent_object;
	
	RRListener *listener;

	RRProfileRegistry *profreg;

	GStaticRWLock channel_lock;
	GHashTable *channel_by_id;
	RRRole role;
	RRManager *manager;

	RRFilterStack *filter_stack;

	GStaticRWLock languages_lock;
	GSList *languages; /* Requested languages after greeting */

	GMutex *out_queue_lock; /* protects out_queue and out_frames */
	GCond *out_queue_cond;
	GPtrArray *out_queue;  /* List of channels with active messages
				* in their out queue */
	GQueue *out_frames;    /* The frame queue has higher priority then the
				  out_queue */
	gint active_item;
	gboolean output_disabled;
	GSList *peer_profiles;
	char *server_name;
	RRCallbackList *quiescence_cb;
	gboolean connected;
};

struct _RRConnectionClass {
	GObjectClass parent_class;

	gboolean (* enable_input)   (RRConnection *connection);
	gboolean (* disable_input)  (RRConnection *connection);
	gboolean (* enable_output)  (RRConnection *connection);
	gboolean (* disable_output) (RRConnection *connection);
	gboolean (* disconnect)     (RRConnection *connection, GError **error);
};

GType rr_connection_get_type (void);

RRManager *rr_connection_get_manager (RRConnection *connection);
gboolean   rr_connection_disconnect (RRConnection *connection, GError **error);

RRChannel *rr_connection_start (RRConnection *connection, const gchar *server_name,
				GType profile_type, gpointer config_data, GError **error);

RRChannel *rr_connection_start_multi (RRConnection *connection, const gchar *server_name,
				      GError **error, ...);

void rr_connection_set_peer_profiles (RRConnection *connection, GSList *list);

const GSList *rr_connection_get_peer_profiles (RRConnection *connection);

gboolean rr_connection_peer_supports_profile (RRConnection *connection,
					      GType profile);

void rr_connection_do_quiescence (RRConnection *connection, GFunc callback,
				  gpointer data, gpointer user_data);
gboolean rr_connection_wait_quiescence (RRConnection *connection, 
					GError **error);

RRChannel *rr_connection_get_channel (RRConnection *connection, gint id);
RRChannel *rr_connection_get_channel_locked (RRConnection *connection, gint id);


void rr_connection_set_profile_registry (RRConnection *connection, 
					 RRProfileRegistry *profreg);

const gchar *rr_connection_get_server_name (RRConnection *connection);

void rr_connection_set_server_name (RRConnection *connection, 
				    const gchar *server_name);

gboolean rr_connection_send_frame (RRConnection *connection, 
				   RRFrame *frame, 
				   GError **error);

/* Tuning reset related functions */

gboolean rr_connection_begin_tuning_reset (RRConnection *connection, 
					   GError **error);

void rr_connection_complete_tuning_reset (RRConnection *connection,
					  RRChannel *channel);

void rr_connection_register_sender (RRConnection *connection, 
				    RRChannel *channel);

void rr_connection_add_channel (RRConnection *connection, RRChannel *channel);
void rr_connection_remove_channel (RRConnection *connection, RRChannel *channel);
gboolean rr_connection_enable_input   (RRConnection *connection);
gboolean rr_connection_disable_input  (RRConnection *connection);

gboolean rr_connection_enable_output  (RRConnection *connection);
gboolean rr_connection_disable_output (RRConnection *connection);

gboolean rr_connection_pending_transmissions_p (RRConnection *connection);

RRFrame *rr_connection_get_next_frame (RRConnection *connection, 
				       gsize buffer_size);

GSList * rr_connection_get_languages (RRConnection *connection);
gchar *rr_connection_get_languages_str (RRConnection *connection);

gboolean rr_connection_language_supported (RRConnection *connection, 
					   const gchar *lang);

void rr_connection_add_language (RRConnection *connection, 
				 const gchar *lang);

gboolean rr_connection_remove_language (RRConnection *connection, 
					const gchar *lang);


void rr_connection_close_all (RRConnection *conn);

G_END_DECLS

#endif /* __RR_CONNECTION_H__ */


syntax highlighted by Code2HTML, v. 0.9.1