#ifndef H_ED_REC_20030409094644
#define H_ED_REC_20030409094644

#ifdef __cplusplus
extern "C"
{
#endif

/* ---------------------------------------------------------------------
   (c) ED 1999-2002
   Projet       : FLEXPRO II
   Fonction     : Assembleur de trame
   Module       : REC
   Fichier      : REC.H
   Creation     : 08-10-1999
   Modification : 13-07-2002
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Journal

   0.0 du 08-10-1999 Creation
   1.0 du 10-10-1999 Version operationelle
   1.1 du 11-10-1999 Ajoute do-while dans assemble (il peut y avoir
   .                 plusieurs separateurs dans le bloc recu)
   1.2 du 11-10-1999 Les donnees recues sont obligatoirement des chaines
   .                 de caracteres (pas de 0). Modification du parametre
   .                 de REC_assemble()
   1.3 du 11-10-1999 Remontee des trames vides (le buffer est alors NULL)
   1.4 du 12-10-1999 Fichier de config / Option de remontee ou non du
   .                 separateur
   1.5 du 13-10-1999 Correction de bug lorsque la chaine touche la limite
   .                 Verification des parametres de config
   .                 Validation avec/sans remontee. Filtrage des chaines
   .                 vides.
   1.6 du 26-11-1999 Mise au point de init (memoire defaillante)
   2.0 du 03-08-2000 Evolution en vue d'accepter plusieurs patterns
   .                 BUG : Si un pattern est reconnu, tout est envoye,
   .                 meme la suite :
   .                    assemble(pRec,"<commande1>"EOL"<commande2>"EOL)
   .                 donne :
   .                    out_trame('<commande1><CR><LF><commande2><CR><LF>')
   .                 au lieu de :
   .                    out_trame('<commande1><CR><LF>')
   .                    out_trame('<commande2><CR><LF>')
   .
   2.1 du 28-12-2000 Correction bug 2.0
   2.2 du 19-01-2001 Suppression calloc()
   2.3 du 15-02-2001 Suppression assert() dans les points d'entree.
   .                 Complete initalisation
   .                 Mise au point suppression du separateur
   2.4 du 13-07-2002 assert() -> ASSERT()
   .                 LCLint

   ---------------------------------------------------------------------
   Specifications

   Cet objet assemble des trames et appele une fonction "trame"
   lorsqu'une trame est complete. Si la trame est trop longue, elle est
   effacee, et une alarme "trame erronne" est generee.
   Le separateur est programmable. Il est elimine lors de la remontee,
   qui se fait sous la forme d'une chaine ASCIIz.

   Les parametres de config sont
   - Longueur max de la trame recue ::= len>0
   - chaine separateur "<sep>"      ::= sep <> NULL
   len(sep) >0)


   Les entrees sont donc

   - assemble(buffer, longueur)

   les sorties sont
   - trame (chaine)
   - alarme(code)

   --------------------------------------------------------------------- */

#include "ed/inc/buf.h"
#include "ed/inc/bufsz.h"

/* ---------------------------------------------------------------------
   Constantes
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Structures
   --------------------------------------------------------------------- */

/* format des sorties */

/* ---------------------------------------------------------------------
   out_trame()
   ---------------------------------------------------------------------
   Role : Signaler la reception d'une trame
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   E : Adresse de la chaine dynamique A LIBERER si non NULL,
   sinon, c'est une TRAME-VIDE (recu separateur sans commande)
   S :
   --------------------------------------------------------------------- */
   typedef void fREC_CBTRAME (void *pData, sBUFSZ * pBuf);

/* ---------------------------------------------------------------------
   out_alarme()
   ---------------------------------------------------------------------
   Role : Signaler un defaut de trame.
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   E : Adresse du buffer
   E : Longueur
   S :
   --------------------------------------------------------------------- */
   typedef void fREC_CBALARME (void *pData, sBUF * pBuf);

/* ---------------------------------------------------------------------
   out_debug()
   ---------------------------------------------------------------------
   Role : Debugger
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   E : buffer
   E : Adresse de pWrite
   E : Adresse de pRead
   E : Message (ou NULL)
   S :
   --------------------------------------------------------------------- */
   typedef void fREC_CBDEBUG (void *pData
                              ,sBUF * pBuf
                              ,const char *pWrite
                              ,const char *pRead
                              ,const char *szMsg);

/* Configuration */
   typedef struct
   {
      size_t len;               /* Longueur max d'une trame */
      size_t nbsep;             /* nombre de separateurs */
      const char
       *const *aszSep;          /* liste des separateurs (tableau de literals) */
      int sep;                  /*   0=Ne pas remonter le separateur
                                 *   1=Remonter le separateur
                                 */
   }
   sREC_CFG;

/* Contexte */
   typedef struct
   {
      void *pPrivate;
   }
   sREC;


/* ---------------------------------------------------------------------
   Donnees
   --------------------------------------------------------------------- */

/* =====================================================================
   Fonctions
   ===================================================================== */

/* ---------------------------------------------------------------------
   REC_sver()
   ---------------------------------------------------------------------
   Role : Retourne une chaine "Version"
   ---------------------------------------------------------------------
   E :
   S : Pointeur de chaine ASCIIZ
   --------------------------------------------------------------------- */
   const char *REC_sver (void);

/* ---------------------------------------------------------------------
   REC_sid()
   ---------------------------------------------------------------------
   Role : Retourne une chaine "Identification"
   ---------------------------------------------------------------------
   E :
   S : Pointeur de chaine ASCIIZ
   --------------------------------------------------------------------- */
   const char *REC_sid (void);

/* ---------------------------------------------------------------------
   REC_init()
   ---------------------------------------------------------------------
   Role : Creation/Initialisation
   ---------------------------------------------------------------------
   E : Taille du buffer de reception
   E : Chaine de separation
   S : Pointeur de donnees
   --------------------------------------------------------------------- */
   sREC *REC_init (sREC_CFG const *pCfg);

/* ---------------------------------------------------------------------
   REC_end()
   ---------------------------------------------------------------------
   Role : Suppression
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   S :
   --------------------------------------------------------------------- */
   void REC_end (sREC * pRec);

/* ---------------------------------------------------------------------
   REC_installe_trame()
   ---------------------------------------------------------------------
   Role :
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   S :
   --------------------------------------------------------------------- */
   void REC_installe_trame (sREC * pRec, fREC_CBTRAME * pFunc, void *pData);

/* ---------------------------------------------------------------------
   REC_installe_alarme()
   ---------------------------------------------------------------------
   Role :
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   S :
   --------------------------------------------------------------------- */
   void REC_installe_alarme (sREC * pRec, fREC_CBALARME * pFunc, void *pData);

/* ---------------------------------------------------------------------
   REC_installe_debug()
   ---------------------------------------------------------------------
   Role :
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   S :
   --------------------------------------------------------------------- */
   void REC_installe_debug (sREC * pRec, fREC_CBDEBUG * pFunc, void *pData);

/* ---------------------------------------------------------------------
   REC_assemble()
   ---------------------------------------------------------------------
   Role : Assembler des sequence d'octets en chaine formattee
   ---------------------------------------------------------------------
   E : Pointeur de donnees
   E : Adresse de la chaine
   S :
   --------------------------------------------------------------------- */
   void REC_assemble (sREC * pRec, sBUFSZ * pBuf);

/* File generated by 'NEW.EXE' Ver 1.17 (c) ED 1998-99 */

#ifdef __cplusplus
}
#endif

#endif                          /* H_ED_REC_20030409094644 */

/* Guards added by GUARD (c) ED 2000-2003 Feb 14 2003 Ver. 1.5 */
