/*********************************************************/
/*    Autori:                                            */
/*            Pelosi Giovanni, 346787, pelosi            */
/*            Pesce  Agatino,  456868, pesce             */
/*                                                       */
/*  Progetto: Sistemi 2: biblioteca                      */
/*  Data Pr.: 9/2/96                                     */
/*      File: message.h                                  */
/*                                                       */
/*********************************************************/

#ifndef _MESSAGE_H
#define _MESSAGE_H

#include      "libro.h"
#include      "system.h"
/*#include    "socket.h"*/

typedef     char    Biblio_t[20];

typedef    enum MessageType_tag
  {
	 MsgTypeQuery         = 'A',        /* richiesta informazioni */
	 MsgTypeReply         = 'B',        /* risposta da server a client o server */
	 MsgTypeControl       = 'C',        /* connessione iniziale tra server */
	 MsgTypeError         = 'X',        /* messaggio di lunghezza errata */
	 MsgTypeEof           = 'Z'         /* fine lettura per chiusura socket */

  } MessageType_t;


typedef struct MessageQuery_tag
{
  char            NoForward;
  Libro_t Libro;                  /* struttura dati query/riposte */

} MessageQuery_t;

typedef struct MessageReply_tag
{
  Biblio_t                Biblio; /* nome biblioteca */
  Libro_t Libro;                  /* struttura dati query/riposte */

} MessageReply_t;


typedef struct MessageControl_tag    /* connessione iniziale tra server */
{
  struct sockaddr_in Sin;

} MessageControl_t;


typedef union MessageBody_tag     /* corpo messaggio */
{
  MessageQuery_t          Query;
  MessageReply_t          Reply;
  MessageControl_t        Control;

} MessageBody_t;

typedef struct Message_tag          /* messaggio generico */
{
  MessageType_t   Type;             /* tipo messaggio */
  MessageBody_t   Body;             /* corpo messaggio */

} Message_t;

typedef      char MessageText_t[1024];  /* testo messaggio completo (>= a sizeof(Message_t))*/

int PutRawLibro(char* t, Libro_t* Msg);
int GetRawLibro(Libro_t* Msg, char* t);

int PutMsgControl(int Socket, struct sockaddr_in* Sin);
int GetMsgControl(MessageControl_t* Msg ,char* p);

int PutMsgQuery(int Socket, char NoForward, Libro_t* Libro);
int GetMsgQuery(MessageQuery_t* Msg, char* t);

int PutMsgNil(int Socket);

int PutMsgReply(int Socket, Biblio_t Biblio, Libro_t* Libro);
int GetMsgReply(MessageReply_t* Msg, char* t);

int GetMsgText( Message_t* Msg, MessageText_t Text,int ReadLen);

int WriteMessage( int Socket );
int ReadMessage( int Socket, Message_t* Msg );

int ClPutMsgQuery(MessageText_t Text, char NoForward, Libro_t* Libro);
int ClGetMsgReply(MessageReply_t* Msg, char* t);

int SizeRawLibro(void);
int SizeMsgControl(void);
int SizeMsgQuery(void);
int SizeMsgReply(void);

int MessageLen(int Type);

#endif