/*
    Fichier mailrep.c
    Auteur Bernard Chardonneau

    Logiciel libre, droits d'utilisation précisés en français
    dans le fichier : licence-fr.txt

    Traductions des droits d'utilisation dans les fichiers :
    licence-de.txt , licence-en.txt , licence-es.txt ,
    licence-it.txt , licence-nl.txt , licence-pt.txt ,
    licence-eo.txt , licence-eo-utf.txt

    Droits d'utilisation également sur la page web :
    http://libremail.tuxfamily.org/voir.php?page=droits


    Bibliothèque de fonctions permettant d'avertir un expéditeur
    que son mail a été refusé.
    Le message à envoyer est mémorisé dans un fichier de données.

    Cette bibliothèque de fonctions est utilisée par les commandes
    supbcc, suphtm et supgrosmail .
*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "mailrep.h"
#include "messages.h"
#include "smtp.h"
#include "szchemin.h"

#define  szlig    120  // longueur maximale des lignes du fichier de données
#define  maxmemo    5  // nombre maximal de lignes du fichier mémorisées


/* variables globales au source */

char chem_mailrep [szchemin]; // chemin d'accès au fichier de données
FILE *fmailrep = NULL;        // descripteur du fichier de données
int  nbligmemo = 0;           // nombre de mots clés mémorisés
char mot_cle [maxmemo][20];   // liste des mots clés mémorisés
char chaine [maxmemo][szlig]; // et des chaines de caractères associées
long posmessage = 0;          // position dans le fichier du corps du message



/* si ce n'est déjà fait, ouvre de fichier décrivant le contenu d'un mail
   à envoyer automatiquement, et mémorise certaines données qu'il contient

   si le nom de fichier ficmailrep n'est pas NULL, c'est ce fichier qui sera
   utilisé, sinon le nom du fichier est fabriqué à partir du mot clé ncom */


FILE * acces_mailrep (char *ficmailrep, char *ncom)
{
    static int testacces = 0; // mémorise si on a déjà appelé cette fonction
    char nom_mailrep [20];    // nom du fichier sans suffixe linguistique
    char ligne [szlig];       // contenu d'une ligne du fichier de données
    int  i, j;                // indices pour traitement chaines de caractères


    // si on appelle cette fonction pour la première fois
    if (testacces == 0)
    {
        // on ne repassera plus dans ce bloc d'instructions
        testacces = 1;

        // générer le chemin d'accès au fichier du mail en réponse

        // si c'est un fichier spécifique
        if (ficmailrep)
            // recopier son nom
            strcpy (chem_mailrep, ficmailrep);
        // sinon
        else
        {
            // fabriquer le nom du fichier à partir du mot clé ncom
            sprintf (nom_mailrep, "mail-%s", ncom);
            strcpy (chem_mailrep, chemfichlang (nom_mailrep, 0));
        }

        // tenter de l'ouvrir en lecture
        fmailrep = fopen (chem_mailrep, "r");

        // si l'ouverture s'est bien passée
        if (fmailrep)
        {
            // tant qu'on n'est pas arrivé sur le ligne !MESSAGE, lire une ligne
            while (fgets (ligne, szlig, fmailrep) && ! posmessage)
            {
                // suppression de \n en fin de ligne
                ligne [strlen (ligne) - 1] = '\0';

                // si cette ligne contient une chaine à mémoriser
                if ('A' <= *ligne && *ligne <= 'Z')
                {
                    //
                    if (nbligmemo >= maxmemo)
                    {
                   // "Débordement : recompiler mailrep avec maxmemo plus grand"
                        affiche_err ("AUGM_MAXMEMO");
                        exit (-1);
                    }

                    // la mémoriser
                    i = 0;

                    // mémorisation du mot clé
                    while (ligne [i] > ' ')
                        mot_cle [nbligmemo][i++] = ligne [i];

                    mot_cle [nbligmemo][i++] = '\0';

                    // aller sur la chaine de caractères associée
                    while (ligne [i] == ' ' || ligne [i] == '\t')
                        i++;

                    j = 0;

                    // la mémorisation de la chaine diffère selon
                    // qu'elle soit encadrée ou non de '"'
                    if (ligne [i] == '"')
                    {
                        while (ligne [++i] != '"' && i < szlig)
                        {
                            if (ligne [i] == '\\')
                                i++;

                            chaine [nbligmemo][j++] = ligne [i];
                        }
                    }
                    else
                    {
                        while (ligne [i] > ' ')
                            chaine [nbligmemo][j++] = ligne [i++];
                    }

                    // fin de la mémorisation de la chaine associée
                    chaine [nbligmemo++][j] = '\0';
                }

                // sinon, si on vient de lire la ligne !MESSAGE
                else if (*ligne == '!' && strcmp (ligne, "!MESSAGE") == 0)
                    // mémoriser la position du début du message dans le fichier
                    posmessage = ftell (fmailrep);
            }
        }
        // sinon, message d'erreur (qui ne sera pas répété)
        else
        {
            // "Fichier %s manquant ou inaccessible"
            // "Les auteurs de mails détruits ne seront pas avertis"
            aff_err_arg ("FICH_MANQUANT", chem_mailrep);
            affiche_err ("PAS_AVERTIS");
        }
    }

    // retourner le résultat des opérations de chargement
    return (fmailrep);
}



/* retourne une chaine de caractères identifiée par un nom */

char *chaine_mailrep (char *motcle)
{
    int ligmemo;


    // chercher le mot clé dans la liste
    for (ligmemo = 0; ligmemo < nbligmemo; ligmemo++)
    {
        // si trouvé, retourner la chaine de caractères associée
        if (strcmp (mot_cle [ligmemo], motcle) == 0)
            return (chaine [ligmemo]);
    }

    // sinon, message d'erreur fatale
    // "Erreur dans le fichier %s :"
    // "Mot clé %s manquant"
    aff_err_arg ("ERREUR_FICHIER", chem_mailrep);
    errfatale   ("MOT_CLE_ABSENT", motcle);
}



/* envoie le corps du mail */

void envoi_mailrep ()
{
    char ligne [szlig];  // contenu d'une ligne du fichier de données


    // se positionner au début du message
    fseek (fmailrep, posmessage, SEEK_SET);

    // tant qu'on n'a pas envoyé tout le message, lire une ligne
    while (fgets (ligne, szlig, fmailrep))
    {
        // supprimer le \n en fin de ligne
        ligne [strlen (ligne) - 1] = '\0';

        // envoyer la ligne dans le mail
        envoie_smtp (ligne);
    }
}