/*-
 * $Id: rr-message.c,v 1.15 2002/12/12 14:59:53 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.
 */

#include <librr/rr.h>
#include <string.h>

static GObjectClass *parent_class = NULL;

static void
finalize (GObject *object)
{
	RRMessage *message = (RRMessage *)object;

	rr_frame_aggregator_free (&message->frame_list);
	parent_class->finalize (object);
}


static void
rr_message_init (GObject *object)
{
	RRMessage *msg = (RRMessage *)object;
	msg->msgno = -1;
	msg->aggregate_frames = TRUE;
}


static void
rr_message_class_init (GObjectClass *klass)
{
	klass->finalize = finalize;

	parent_class = g_type_class_peek_parent (klass);
}


GType 
rr_message_get_type (void)
{
	static GType rr_type = 0;

	if (!rr_type) {
		static GTypeInfo type_info = {
			sizeof (RRMessageClass),
			NULL,
			NULL,
			(GClassInitFunc) rr_message_class_init,
			NULL,
			NULL,
			sizeof (RRMessage),
			16,
			(GInstanceInitFunc) rr_message_init
		};
		rr_type = g_type_register_static (G_TYPE_OBJECT, "RRMessage", 
						  &type_info, G_TYPE_FLAG_ABSTRACT);
	}
	return rr_type;
}

RRFrame *
rr_message_get_frame (RRMessage *message, gsize max_size)
{
	g_return_val_if_fail (RR_MESSAGE_GET_CLASS (message)->get_frame, NULL);

	return RR_MESSAGE_GET_CLASS (message)->get_frame (message, max_size);
}


gboolean
rr_message_process_frame (RRMessage *message, RRFrame *frame, 
			  GError **error)
{
	g_return_val_if_fail (RR_MESSAGE_GET_CLASS (message)->process_frame,
			      FALSE);

	if (message->aggregate_frames) {
		RRFrame *new_frame;

		new_frame = rr_frame_aggregate (&message->frame_list, frame);

		if (new_frame) {
			gint ret;
			
			ret = RR_MESSAGE_GET_CLASS (message)->
				process_frame (message, frame, error);

			g_object_unref (G_OBJECT (new_frame));
			return ret;
		}
		else
			return TRUE;
	}
	return RR_MESSAGE_GET_CLASS (message)->process_frame (message, frame, 
							      error);
}

void
rr_message_set_channel (RRMessage *message, RRChannel *channel)
{
	g_return_if_fail (RR_IS_MESSAGE (message));
	g_return_if_fail (RR_IS_CHANNEL (channel));

	message->channel = channel;
}

/**
 * rr_message_set_aggregate:
 * @message: a #RRMessage
 * @aggregate: %TRUE or %FALSE.
 * 
 * Selects if the frames should be aggregated or not.
 **/
void
rr_message_set_aggregate (RRMessage *message, gboolean aggregate)
{
	g_return_if_fail (RR_IS_MESSAGE (message));

	message->aggregate_frames = aggregate;
}

/**
 * rr_message_get_aggregate:
 * @message: a #RRMessage
 * 
 * Returns %TRUE if the frames are aggregated or %FALSE if they are
 * passed to #rr_message_process_frame directly.
 * 
 * Return value: %TRUE or %FALSE. 
 **/
gboolean
rr_message_get_aggregate (RRMessage *message)
{
	g_return_val_if_fail (RR_IS_MESSAGE (message), FALSE);

	return message->aggregate_frames;
}


syntax highlighted by Code2HTML, v. 0.9.1