/*
    Fichier selhtm.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


    Ce programme recopie les caractéristique de chaque mail
    en attente de téléchargement (ou de destruction).
    Ces informations sont mémorisées dans 2 fichiers distincts,
    un pour les message lisibles en mode texte, l'autre pour les
    mais rédigé seulement en HTML pur (fréquent pour les publicités).

    Un fichier de configuration est utilisé pour se connecter à la
    boite aux lettres.
*/


#define appli   // pour la déclaration de variables globales à l'application

#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"
#include "trtentete.h"


/* prototypes */
void lirentete (int numes);


/* variables globales au source
   (pour éviter des tonnes de passages de paramètres) */


FILE *fseltxt, *fselhtm;    // descripteurs des 2 fichiers résultat


/* programme principal */

int main (int nbarg, char *varg[])
{
    FILE *fconf;        // descripteur du fichier de configuration
    int  numes, nbmes;  // numéro du mail courant et nombre de mails


    // récupération du nom de l'exécutable
    memcom (*varg);

    if (--nbarg == 3)
    {
        // ouvrir le fichier de configuration
        fconf = ouvre_ficonf (varg [1]);

        if (fconf)
        {
            // connexion sur le compte mail du serveur pop
            if (connect_pop (fconf))
            {
                // ouvrir les fichiers résultat
                fseltxt = fopen (varg [2], "w");
                fselhtm = fopen (varg [3], "w");

                if (fseltxt && fselhtm)
                {
                    // récupération du nombre de mails
                    nbmes = nbmails ();

                    // récupération de la liste des mails
                    for (numes = 1; numes <= nbmes; numes++)
                        lirentete (numes);

                    // pour l'affichage propre
                    putchar ('\n');
                }
                else
                    // "Impossible d'écrire dans un fichier résultat"
                    affiche_err ("IMPOS_ECR_FICHRES");

                // se déconnecter proprement du serveur pop
                deconnect_pop ();
            }

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
    }
    else
        // "Syntaxe : %s fich_configuration fich_liste1 fich_liste2"
        psyntaxe ("SYNT_SELHTM");

    return (0);
}


/* lit l'entête d'un message et affiche certaines lignes */

void lirentete (int numes)
{
    char bufw [120];  // buffer d'envoi d'une requête
    // buffers pour affichage ordonné des caractéristiques du message
    char bufDate [120], bufFrom [120], bufTo [120], bufCc [120], bufReply [120],
         bufSubject [120], bufContent [120], bufRetPath [120];
    int  posbuf;     // simple compteur
    FILE *ficdest;   // descripteur du fichier qui mémorisera le message


    // initialisation
    bufDate [0]    = '\0';
    bufFrom [0]    = '\0';
    bufTo [0]      = '\0';
    bufCc [0]      = '\0';
    bufReply [0]   = '\0';
    bufSubject [0] = '\0';
    bufContent [0] = '\0';
    bufRetPath [0] = '\0';

    /* demande de lecture de l'entête du message
       On demande 5 lignes du corps du message pour trouver le
       2ème Content-type si le premier est multipart/mixed */

    sprintf (bufw, "TOP %d 5", numes);
    env_pop (bufw);

    // suivi de l'exécution
    // "\rMessage %d"
    printf (message ("ANALYSE_MAIL"), numes);
    fflush (stdout);

    // lecture et mémorisation des caractéristiques du message
    do
    {
        // lire une ligne de l'entête du message
        lire_pop ();

        // mémorisation des caractéristiques importantes
        if (start ("Date"))
            membuf (bufDate);
        else if (start ("From"))
            memconvbuf (bufFrom);
        else if (start ("To"))
            memconvbuf (bufTo);
        else if (start ("Cc"))
            memconvbuf (bufCc);
        else if (start ("Reply-To"))
            memconvbuf (bufReply);
        else if (start ("Subject"))
            memconvbuf (bufSubject);
        else if (start ("Content-Type"))
            membuf (bufContent);
        else if (start ("Return-Path"))
            membuf (bufRetPath);
    }
    // lecture terminée si ligne limitée à un .
    while (buf_lect [0] != '.' && buf_lect [1] != '\r');

    // positionnement sur le 2ème attribut de Content_type
    // nécessaire pour bonne détection s'il y à 0 ou plus
    // d'un blanc après le : du Content-Type
    posbuf = 17;

    while (bufContent [posbuf] != '/')
        posbuf++;

    // choix du fichier de destination
    if (*bufContent && tolower (bufContent [posbuf+1]) == 'h'
                    && tolower (bufContent [posbuf+2]) == 't')
        ficdest = fselhtm;
    else
        ficdest = fseltxt;

    // "Message %d\n"
    fputc ('\n', ficdest);
    fprintf (ficdest, message ("AFF_NUMAIL"), numes);

    // enregistrement des caractéristiques mémorisées
    if (bufDate [0])
        fprintf (ficdest, "%s\n", bufDate);
    if (bufFrom [0])
        fprintf (ficdest, "%s\n", bufFrom);
    if (bufTo [0])
        fprintf (ficdest, "%s\n", bufTo);
    if (bufCc [0])
        fprintf (ficdest, "%s\n", bufCc);
    if (bufReply [0])
        fprintf (ficdest, "%s\n", bufReply);
    if (bufRetPath [0])
        fprintf (ficdest, "%s\n", bufRetPath);
    if (bufSubject [0])
        fprintf (ficdest, "%s\n", bufSubject);
    if (bufContent [0])
        fprintf (ficdest, "%s\n", bufContent);
}