#ifndef __CDDB_h
#define __CDDB_h

#include "WimpLib:Event.h"

/****************/
/* A CDDB Entry */

typedef struct track_struct
{
	const char*	title;
	const char*	extra_info;
} track_struct;

typedef struct CDDB_Area
{
	unsigned int	num_tracks;
	const char*	disc_title;
	const char*	extra_disc_info;
	const char*	category;
	unsigned long	discid;
	int		entry_revision;
	track_struct	tracks[99];
}CDDB_Area;

/*******************************/
/* A message to query the CDDB */

typedef struct CDDB_Query_Message
{
	Msg_Hdr		hdr;
	unsigned int	flags;
	unsigned int	drive_number;
}CDDB_Query_Message;

#define CDDB_Query_Flags_DisallowRemote   0
#define CDDB_Query_Flags_AllowRemote      1

#define CDDB_Query_Flags_NoForceRemote      0
#define CDDB_Query_Flags_ForceRemote    (1<<1)

#define CDDB_Query_Flags_NoOpenStatus       0
#define CDDB_Query_Flags_OpenStatus     (1<<2)

/**********************************************/
/* A message to return the results of a query */

typedef struct CDDB_QueryResults_Message
{
	Msg_Hdr			hdr;
	unsigned int		return_code;
	const CDDB_Area*	area;
	int			area_id;
}CDDB_QueryResults_Message;

#define CDDB_QueryResults_Code_LocalMatch       0
#define CDDB_QueryResults_Code_RemotePending    1
#define CDDB_QueryResults_Code_RemoteNeeded     2
#define CDDB_QueryResults_Code_RemoteFinished   3
#define CDDB_QueryResults_Code_RemoteConnectFailed    4
#define CDDB_QueryResults_Code_RemoteHandshakeFailed  5
#define CDDB_QueryResults_Code_RemoteQueryError       6
#define CDDB_QueryResults_Code_RemoteReadError        7
#define CDDB_QueryResults_Code_RemoteSaveError        8
#define CDDB_QueryResults_Code_ErrorReadingTOC        9
#define CDDB_QueryResults_Code_NoMatch               10
#define CDDB_QueryResults_Code_SearchStopped         11
#define CDDB_QueryResults_Code_UnexpectedError       12
#define CDDB_QueryResults_Code_DisconnectError       13
#define CDDB_QueryResults_Code_Busy                  14

/**************************************/
/* A message used to free a CDDB_Area */

typedef struct CDDB_FreeArea_Message
{
	Msg_Hdr		hdr;
	unsigned int	flags;
	int		area_id;
}CDDB_FreeArea_Message;

/********************************************/
/* A message used to stop the remote lookup */

typedef struct CDDB_StopRemote_Message
{
	Msg_Hdr		hdr;
	unsigned int	flags;
}CDDB_StopRemote_Message;

/*********************************************/
/* A message used to submit a new CDDB entry */

typedef struct CDDB_SubmitRequest_Message
{
	Msg_Hdr			hdr;
	unsigned int		flags;
	unsigned int		drive_num;
	const CDDB_Area*	area;
	int			area_id;

}CDDB_SubmitRequest_Message;

#define CDDB_SubmitRequest_Flags_DisallowRemote   0   /* Don't submit the entry remotely */
#define CDDB_SubmitRequest_Flags_AllowRemote      1   /* Submit the entry remotely */


typedef struct CDDB_SubmitResult_Message
{
	Msg_Hdr		hdr;
	unsigned int	flags;
	unsigned int	result_code;
	int		area_id;

}CDDB_SubmitResult_Message;

#define CDDB_SubmitResult_Code_InvalidEntry      0
#define CDDB_SubmitResult_Code_MailerError       1
#define CDDB_SubmitResult_Code_SubmittedOK       2
#define CDDB_SubmitResult_Code_ErrorReadingTOC   3
#define CDDB_SubmitResult_Code_ErrorWritingLocal 4



#define CDDB_Query_MessageNum          0x51BC0
#define CDDB_QueryResults_MessageNum   0x51BC1
#define CDDB_FreeArea_MessageNum       0x51BC2
#define CDDB_StopRemote_MessageNum     0x52BC3
#define CDDB_SubmitRequest_MessageNum  0x52BC4
#define CDDB_SubmitResult_MessageNum   0x52BC5

#endif
