#ifndef __RR_FRAME_H__
#define __RR_FRAME_H__

typedef struct _RRFrame RRFrame;
typedef struct _RRFrameClass RRFrameClass;

#include <librr/rr-channel.h>
#include <librr/rr-mime.h>
#include <librr/message/rr-message.h>

G_BEGIN_DECLS

#define RR_NEXT_MSGNO (-1)
#define RR_BEEP_MIME_HEADER_LEN 38
#define RR_BEEP_MIME_HEADER "Content-Type: application/beep+xml\r\n\r\n"

#define RR_TYPE_FRAME (rr_frame_get_type ())
#define RR_FRAME(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RR_TYPE_FRAME, RRFrame))
#define RR_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RR_TYPE_FRAME, RRFrameClass))
#define RR_IS_FRAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), RR_TYPE_FRAME))
#define RR_IS_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RR_TYPE_FRAME))
#define RR_FRAME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RR_TYPE_FRAME, RRFrameClass))

typedef enum {
	RR_FRAME_TYPE_UNKNOWN,
	RR_FRAME_TYPE_MSG,
	RR_FRAME_TYPE_RPY,
	RR_FRAME_TYPE_ERR,
	RR_FRAME_TYPE_ANS,
	RR_FRAME_TYPE_NUL
} RRFrameType;

struct _RRFrame {
	GObject parent_object;

	RRFrameType type;
	gint32   channel_id;
	gint32   msgno;
	gboolean more;
	guint32  seqno;
	gint32   size;
	gint32   ansno;
	gchar   *payload;

	/* <private> */
	RRMimePart *part;
	gboolean should_free;

	/* The frame can hold a reference of the message the frame
	 * "belongs" to. This can be helpful to be able to make sure
	 * the frame is finalized before the message */
	RRMessage *msg;
};

struct _RRFrameClass {
	GObjectClass parent_class;
	gint (* parse) (RRFrame *frame, const gchar *buffer, 
			const gchar *body, gint len, GError **error);
	gint (* build) (RRFrame *frame, gchar *buffer);
};

GType        rr_frame_get_type           (void);

RRFrame     *rr_frame_new                (RRFrameType type, 
					  gint32 channel_id, 
			                  gboolean more, 
					  gint32 msgno, 
					  gint32 size, 
					  gint32 ansno, 
					  gchar *payload, 
					  gboolean should_free);

const gchar *rr_frame_mime_get_body      (RRFrame *frame);
gint32       rr_frame_mime_get_body_size (RRFrame *frame);

RRMimePart  *rr_frame_parse_mime         (RRFrame *frame);

gint         rr_frame_build              (RRFrame *frame, gchar *buffer);
gint         rr_frame_parse              (RRFrame *frame, 
					  const gchar *buffer, 
					  const gchar *body, gint len, 
					  GError **error);

void         rr_frame_reference_message  (RRFrame *frame, RRMessage *msg);

RRFrame     *rr_frame_aggregate          (GSList **list, RRFrame *frame);
void         rr_frame_aggregator_free    (GSList **list);


G_END_DECLS

#endif /* __RR_FRAME_H__ */


syntax highlighted by Code2HTML, v. 0.9.1