/*
* File Name: messages.h
* Author: Jade Cheng
* Date: March 29, 2009
* Course: ICS 451
* Assignment: Project 2
*/
#ifndef MESSAGES_H_
#define MESSAGES_H_
/** The maximum size in bytes for all messages.*/
#define MESSAGE_BUFFER_SIZE 1200
/** The maximum number of items in the listing messages.*/
#define MAX_LISTING_COUNT 56
/** The maximum number of items in the try messages. */
#define MAX_TRY_COUNT \
((MESSAGE_BUFFER_SIZE - (2 + NAME_BUFFER_SIZE + 2)) / \
(sizeof(u_short) + sizeof(u_long)))
/** Data corresponding to a data message. */
typedef struct data_msg_t {
/** The name of the file contained in the data message. */
char name[NAME_BUFFER_SIZE];
/** The contents of the file contained in the data message. */
u_char data[MAX_CONTENT_LENGTH];
/** The length of the contents in bytes of the data message. */
u_short size;
} data_msg_t;
/** Data corresponding to a listing message. */
typedef struct listing_msg_t {
/** The array of names contained in the listing message. */
char entries[MAX_LISTING_COUNT][NAME_BUFFER_SIZE];
/** The number of items in the listing message.*/
u_short count;
} listing_msg_t;
/** The possible message types. */
typedef enum msg_type {
msg_type_unknown,
msg_type_data,
msg_type_listing,
msg_type_request,
msg_type_try
} msg_type;
/** Data corresponding to a message buffer that is sent or received. */
typedef struct msg_buf_t {
/** The contents of the message. */
u_char buffer[MESSAGE_BUFFER_SIZE];
/** The size of the message in bytes. */
size_t size;
/** An index indicating the current read position in the buffer. */
size_t index;
} msg_buf_t;
/** Data corresponding to a request message. */
typedef struct request_msg_t {
/** The name of file being requested. */
char name[NAME_BUFFER_SIZE];
} request_msg_t;
/** Data corresponding to a try message. */
typedef struct try_msg_t {
/** The name of the file. */
char name[NAME_BUFFER_SIZE];
/** A collection of peers to try. */
peer_t peers[MAX_TRY_COUNT];
/** The number of peers. */
u_short count;
} try_msg_t;
/**
* Parses a message buffer as a data message.
*
* @param src A message buffer.
* @param dst A data message.
*
* @return EXIT_SUCCESS or EXIT_FAILURE.
*/
extern int data_msg_read(msg_buf_t * src, data_msg_t * dst);
/**
* Writes a data message to a message buffer. The message buffer can be used
* for UDP sending.
*
* @param dst A message buffer.
* @param src A data message.
*/
extern void data_msg_write(msg_buf_t * dst, const data_msg_t * src);
/**
* Returns the message type from a message buffer based on the header.
*
* @param src A message buffer.
*
* @return The message type.
*/
extern msg_type get_msg_type(msg_buf_t * src);
/**
* Parses a message buffer as a listing message.
*
* @param src A message buffer.
* @param dst A listing message.
*
* @return EXIT_SUCCESS or EXIT_FAILURE.
*/
extern int listing_msg_read(msg_buf_t * src, listing_msg_t * dst);
/**
* Writes a listing message to a message buffer. The message bufer can be
* used for UDP sending.
*
* @param dst A message buffer.
* @param src A listing message.
*/
extern void listing_msg_write(msg_buf_t * dst, listing_msg_t * src);
/**
* Parses a message buffer as a request message.
*
* @param src A message buffer.
* @param dst A request message.
*
* @return EXIT_SUCCESS or EXIT_FAILURE.
*/
extern int request_msg_read(msg_buf_t * src, request_msg_t * dst);
/**
* Writes a request message to a message buffer. The message buffer can be
* used for UDP sending.
*
* @param dst A message buffer.
* @param src A request message.
*/
extern void request_msg_write(msg_buf_t * dst, request_msg_t * src);
/**
* Parses a message buffer as a try message.
*
* @param src A message buffer.
* @param dst A try message.
*
* @return EXIT_SUCCESS or EXIT_FAILURE.
*/
extern int try_msg_read(msg_buf_t * src, try_msg_t * dst);
/**
* Writes a try message to a message buffer. The message buffer can be used
* for UDP sending.
*
* @param dst A message buffer.
* @param src A try message.
*/
extern void try_msg_write(msg_buf_t * dst, try_msg_t * src);
#endif /* MESSAGES_H_ */