/*
    Fichier vsourcemail.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 affiche un mail en attente de téléchargement
    (ou de destruction).
    Un fichier de configuration est utilisé pour se connecter à la
    boite aux lettres.
    Le mail à afficher est repéré par son numéro d'ordre dans la
    liste des mails sur le serveur.
*/


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

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


/* prototype */
void affsource (int numes);


/* programme principal */

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


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

    // controle du nombre d'arguments
    if (--nbarg == 2)
    {
        // ouvrir le fichier de configuration
        fconf = ouvre_ficonf (varg [2]);

        if (fconf)
        {
            // connexion sur le compte mail du serveur pop
            if (connect_pop (fconf))
            {
                // récupérer le numéro de mail
                numes = atoi (varg [1]);

                // afficher ce mail si possible
                if (numes > 0 && numes <= nbmails ())
                    affsource (numes);
                else if (numes > 0)
                    // "Numéro de mail trop grand"
                    affiche_err ("NUMAIL_TROP_GRAND");
                else
                    // "Numéro de mail %s incorrect"
                    aff_err_arg ("NUMAIL_FAUX", varg [1]);

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

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
    }
    else
        // "Syntaxe : %s [-(h|H|b|B)] numéro_message fichier_configuration"
        psyntaxe ("SYNT_VSOURCEMAIL");

    // pour faire plaisir à gcc qui veut une fonction main de type int
    return (0);
}


/* lit le mail choisi et l'affiche sans traitement des lignes */

void affsource (int numes)
{
    char bufw [120]; // buffer d'envoi d'une requête

    // demande de lecture du message
    sprintf (bufw, "RETR %d", numes);
    env_pop (bufw);

    // "Message %d\n"
    printf (message ("AFF_NUMAIL"), numes);

    // lire une ligne de l'entête du message
    lire_pop ();

    // lecture et affichage du source du mail
    do
    {
        // affichage de la dernière ligne lue
        puts (buf_lect);

        // et lecture de la suivante
        lire_pop ();
    }
    // on s'arrête en fin de mail
    while (buf_lect [0] != '.' || buf_lect [1] != '\0');
}