                                                             



     /**\
      *                                                          *
      * Fichier d'aide sur le protocole BBT                      *
      *                       *
      *                                                          *
      *  Le  protocole  bbt  a  ete  a l'origine realise afin    *
      *  d'echanger des fichiers via le minitel.                 *
      *                                                          *
      *  Ce protocole relativement simple  dans  sa  conception  *
      *  permet  de  telecharger tout  fichier binaire a partir  *
      *  d'un moyen de communication 7 bits tel que le minitel.  *
      *                                                          *
     \**/




-------------------------------------------------------------------

 Le protocole BBT a ete cree en Juin 89 par Jean-Claude MICHOT, la
 signification des lettres BBT est "Bulletin Board Transfert".
 Le terme BBS, "Bulletin Board System" designe un certain type de
 serveur tres rependu outre atlantique.

-------------------------------------------------------------------


/*
 * Description du protocole BBT au niveau 1.7
 * ==========================================
 *
 *
 * Par convention le caractere "\r" dans les textes suivant,
 * represente le caractere dont la valeur en hexa est 0x0d.
 *
 * Numero des valeurs de version envoyer par BBT en fonction
 * des implementations de BBT.
 *
 *    BBT V1.0 : version originale
 *    BBT V1.1 : version date + perm
 *    BBT V1.2 : version slide window
 *    BBT V1.3 : version CRC
 *    BBT V1.4 : version eclate avec plein de goodies
 *    BBT V1.4b: version nouvelle encodage
 *    BBT V1.5 : version ou le nouveau CRC en asm est debuge
 *    BBT V1.6 : version (Alpha Tourne sous Qterm)
 *    BBT V1.7 : version avec compression & crash recovery
 *    BBT V1.8 : version avec numerotation de paquet
 *
 *    VV = 0 = 1.0, 1.1, 1.2
 *    VV = 1 = 1.3
 *    VV = 2 = 1.4, 1.5, 1.6
 *    VV = 3 = 1.7
 *    VV = 4 = 1.8
 *
 *
 * a) Le paquet d'entete:
 * ----------------------
 * 
 * ENVOI de : "\r@@!@@\rSSSSSS FILENAME DDDDDDDD PPP VV\r"
 * 
 * SSSSSS: Taille du fichier en decimal (c'est un long)
 *         au niveau ascii la longeur de la taille n'est
 *         pas constante.
 * 
 * FILENAME: Nom du fichier en ascii (sans espace), il est
 *             preferable de ne pas mettre de chemin d'acces
 *             dans ce champ. En effet certaine implementation
 *           de BBT pourais ne pas du tout apprecier.
 *           Je vous conseille aussi de faire attention a
 *           la taille des fichiers envoyes !
 *           Sous MS-DOS le maximuum est "XXXXXXXX.EXT" 8 car
 *           comme nom et 3 car comme extention.
 *           Moi je vous conseille quand meme d'etre un peu
 *           plus large... POSIX normalise la taille des noms
 *           de fichier a 14 car.
 *
 * DDDDDDDD: Date et heure du fichier. Cette date est un
 *           long en hexa. Ce longue represente le nombre
 *           de seconde ecoule depuis le 01-Jan-70. Ceci
 *           est une convention sous Unix.
 *
 * PPP: Permission d'acces au fichier (3 digits decimal)
 *      PPP est un nombre constitue par un OU logique
 *      entre les elements suivants:
 *        400 Lecture par le proprietaire
 *        200 Eriture par le proprietaire
 *        100 Execution par le proprietaire
 *        040 Lecture par le groupe
 *        020 Ecriture par le groupe
 *        010 Execution par le groupe
 *        004 Lecture par les autres
 *        002 Ecriture par les autres
 *        001 Execution par les autres
 *
 * VV: Numero de version de BBT ce qui permet de faire tourne
 *     toute les versions de BBT entre elle meme s'il elle ont
 *     des niveaux d'implementation completement different.
 *     Ce numero est sur deux digit en hexa.
 *
 * Sur certaine tres vielle version les elements tel que Date
 * Permission et Version peuvent ne pas etre presente.
 *
 *
 * b) La reponse au paquet d'entete:
 * ---------------------------------
 *
 * ENVOI de : "!VV SSSSSSSSS\r"
 *
 * VV: Numero de version du BBT qui va recevoir le fichier.
 *     Ceci permet entre autre au serveur de se mettre au
 *     niveau du recepteur.
 *     Ce numero est sur deux digits en hexa.
 *     (Il peut ne pas etre present sur d'ancienne version)
 *
 * SSSSSSSSS: Si le recepteur a deja un fichier du nom de celui
 *            que l'on cherche a lui envoyer, ce dernier considere
 *            qu'il y a eu une interuption lors d'un precedent
 *            transfert et il renvoi la taille du fichier existant
 *            en local. Ceci permet au serveur de reprendre l'envoi
 *            du fichier apres ce qui a deja ete recu.
 *            Si SSSSSSSSS n'existe pas ou est egale a zero dans ce
 *            cas le transfert n'est pas une reprise sur un fichier
 *            qui n'a pas ete transfere completement.
 *
 *
 * c) Envoi d'un paquet de donnees:
 * --------------------------------
 *
 * Pour les version < a la 1.7
 *   ENVOI de : "LLLLDDDDD.....DDDDCCCC"
 *
 *   LLLL: Est la longeur du paquet en decimal du paquet qui va
 *         etre recu.
 *
 *   DDDD: C'est les donnee par elle meme encode en 7 bits par
 *         l'un des deux algorithme integre a BBT.
 *         Dans le cas ou la version est < a la 1.5 l'encodage
 *          est celui utilise par uuencode/uudecode des systemes
 *          d'exploitation unix. (On encode 3 octets 8 bits en
 *          4 octets 7 bits)
 *         Dans le cas ou la version est > a la 1.4 l'encodage
 *          est un encodage propre a bbt ou l'on encode 4 octets
 *          8 bits en 5 octets 7 bits)
 *
 *   CCCC: C'est un CRC-16 CCITT ou un Checksum sur 4 digits en
 *         hexa. Dans le cas ou la version est < a la 1.3, CCCC
 *         est un checksum sinon c'est un CRC-16. (Ce type de
 *         CRC est tres rependu dans plein de protocole, xmodem,
 *         ymodem, zmodem, etc....)
 *
 * Pour la version 1.7
 *   ENVOI de : "PPLLLDDDDD.....DDDDCCCC"
 *
 *   PP: Est le numero en hexa sur deux digits du paquet qui va
 *       etre emis. Ce numero varie de 01 a FF.
 *
 *   LLL:  Est la longeur du paquet en hexa sur 3 digits.
 *
 *   DDDD: C'est les donnees par elle meme encode en 7 bits par
 *         l'algorithme propre a BBT.
 *
 *   CCCC: C'est un CRC-16 CCITT ou un Checksum sur 4 digits en
 *         hexa. Dans le cas ou la version est < a la 1.3, CCCC
 *         est un checksum sinon c'est un CRC-16. (Ce type de
 *         CRC est tres rependu dans plein de protocole, xmodem,
 *         ymodem, zmodem, etc....)
 *
 *
 * d) Reponse a un paquet de donnees:
 * ----------------------------------
 *
 * Pour les version < a la 1.7
 *   Dans le cas ou le paquet a ete bien recu :
 *     ENVOI de : "!\r"
 *   Dans le cas ou le paquet n'a pas ete recu correctement :
 *     ENVOI de : "?\r"
 *
 * Pour la version 1.7
 *   Dans le cas ou le paquet a ete bien recu :
 *     ENVOI de : ":PP\r"
 *     ou PP est le numero de Paquet que l'on a bien recu.
 *   Dans le cas ou le paquet n'a pas ete recu correctement :
 *     ENVOI de : ";\r"
 *
 *
 * e) Fin de tranfert:
 * -------------------
 *
 * Pour toute les versions de BBT, le tranfert ce fini toujours de
 * la maniere suivante :
 *
 * ENVOI de : "@@!@@\r"
 *
 *
 * f) Aquitement de fin de tranfert:
 * ---------------------------------
 *
 * Pour toute les versions de BBT, l'aquitement de fin de tranfert
 * ce fait toujours de la maniere suivante :
 *
 * ENVOI de : "#" dans le cas ou le tranfert se fini tout a fait
 *            normalement.
 *
 * ENVOI de : "#BREAK#" dans le cas ou le tranfert ce fini pour
 *            cause anormale. ex: Trop de Bad CRC.
 *
 */


Description technique sur l'encode de paquet en version 1.3
-----------------------------------------------------------


/*
 * Encodage/Decodage de paquet de donnees
 * --------------------------------------
 *
 *  C'est le meme principe que pour uuencode/uudecode (utilitaire unix)
 *  Le principe est simple, On code 3 Octets 8 bits en 4 Octets 7 Bits
 *  d'ascii visualisable.
 *
 *  --------------------------------------------------------------------
 *  --------------------------------------------------------------------
 *  TRANSACTION ECRITE EN CONTINUUM ALGO A LA SUITE DES DEMANDES
 *  --------------------------------------------------------------------
 *  --------------------------------------------------------------------
 *
 *  Decodage d'un PAQUET 7 Bits de BBT:
 *  Les paquets de donne ont le format suivant :
 *
 *  TAILLE_DU_PAQUET + DONNEES_EN_7_BITS + CRC ou CHECKSUM
 *
 *  Comment decoder un paquet ?
 *
 *  - Il faut savoir que 3 octets 8 bits sont transforme en
 *    4 Octets 7 bits...
 *
 *  Voila grosso modo un exemple de decodage :
 *
 *
 *         12345678 12345678 12345678 12345678    Octet en 7 Bits
 *         -----------------------------------
 *  
 *  Phase 1: on retise 32 decimal ou 20 hexa a chaqu'un des 4 octets recu.
 *
 *  Phase 2: on a alors le look suivant au niveau bits
 *
 *         soit 'a' le 1er  octet 8 bits
 *         soit 'b' le 2eme octet 8 bits
 *         soit 'c' le 3eme octet 8 bits
 *
 *         12345678 12345678 12345678 12345678    Octet en 7 Bits
 *         -----------------------------------
 *         00aaaaaa 00aabbbb 00bbbbcc 00cccccc
 *
 *  Phase 3: Passe au format 3 octets.
 *
 *         et apres avoir replace les bits dans 3 octets a la place
 *         de 4 octet on a
 *
 *         12345678 12345678 12345678             Octet en 8 Bits
 *         --------------------------
 *         aaaaaaaa bbbbbbbb cccccccc
 *
 *    En C ca fait fait la chose suivante :
 *
 *    recu1 -= ' '; recu2 -= ' '; recu3 -= ' '; recu4 -= ' ';
 *    r8_1 = (recu1 << 2) | ((recu2 >> 4) & 0x3);
 *    r8_2 = (recu2 << 4) | ((recu3 >> 2) & 0xf);
 *    r8_3 = (recu2 << 6) | recu4;
 *
 *    La meme chose en Francais mathematique ca donne qqchose comme :
 *
 *    - On retire 32 au 4 octet recu,
 *    - Le 1er octet 8 bits est egale au (1er octet recu * par 4)
 *      ou (logique) le ( (2eme octet recu / par 16) et 3 )
 *    - Le 2eme octet 8 bits est egale au (2eme octet recu * par 16)
 *      ou (logique) le ( (3eme octet recu / par 4) et 15 )
 *    - Le 3eme octet 8 bits est egale au (3eme octet recu * par 64)
 *      ou (logique) le ( 4eme octet recu )
 *
 *  [jcm]
 *  --------------------------------------------------------------------
 *  --------------------------------------------------------------------
 * 
 */ 

APPENDIX E) Calcule du CRC utilise par BBT. (CRC-16)


/*
 * SUITE a de nombreuses demandes, voici un exemple de calcule de
 * CRC-16. BBT utilise en effet un CRC qui est utilise par bon
 * nombre de protocoles comme (Xmodem,Ymodem,Zmodem)...
 *
 * Le polynome utilise pour le calcule est le suivant :
 * 
 * (X^16 + X^12 + X^5 + 1)
 * 
 *
 * En pratique en C ca donne une fonction de calcule de CRC comme
 * celle qui suit et qui proviens de la documentation sur du
 * protocole Ymodem.
 *
 * 
 * int calcrc(ptr, count)
 * char *ptr;
 * int count;
 * {
 *     int crc, i;
 * 
 *     crc = 0;
 *     while(--count >= 0)
 *     {
 *     crc = crc ^ (int)*ptr++ << 8;
 *     for(i = 0; i < 8; ++i)
 *       if(crc & 0x8000)
 *           crc = crc << 1 ^ 0x1021;
 *       else
 *           crc = crc << 1;
 *     }
 *     return (crc & 0xFFFF);
 * }
 *
 */
