IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Parser message MIME


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Parser message MIME
    BOnjour, je poste ici car n'ayant pas un niveau très avancé de C++ j'aurais besoin d'un peu d'aide...
    Je suis en train d'aider au développement d'un client mail en C++ et là je m'occupe de la partie des messages MIME. Je bloque sur une méthode :

    void initParse(std::istream& in, const HeadersType& headers)

    voici son principe :
    si la partie des entetes est vide il faut lire les entetes + le contenu à partir du flux d'entrée.
    On attend une entrée de ce type :
    Entete 1 : xxx\r\n
    Entete 2 : yyy\r\n
    \r\n
    [contenu ]
    Faut -il que je récupère tout d'un coup ou que je parcours au fur et à mesure le flux en entrée en repérant les " \r\n ". Y a t-il une fonction qui existe pour ça ?

    Le deuxième cas c'est si au contraire elle n'est pas vide, il faut lire uniquement le contenu en prenant en considération les entetes transmis.

    Voilà, mon problème est que je ne suis pas très familière avec istream, j'ai regardé quelques exemples sur le net mais je reste toujours bloquée... Je pense qu'il faudrait que je récupère toutes les données quelque part pour pouvoir ensuite les manipuler.
    Si vous avez des infos pour m'éclairer je vous en remercie !

  2. #2
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Ne peux-tu pas utiliser istringstream ?
    Cette classe te facilitera la manipulation de chaine...
    Cherche aussi du coté de getline().

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui je comptais utiliser getline, mais en fait je ne sais pas trop dans quoi mettre les données présentes dans le flux.
    Est ce que si je déclare un std::stringstream par exemple il y aurait une méthode pour copier les données dans ce dernier ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je ne comprend pas l'idée des stringstream ? Pour parser la ligne d'en-tête ?

    Citation Envoyé par oDREY Voir le message
    Oui je comptais utiliser getline, mais en fait je ne sais pas trop dans quoi mettre les données présentes dans le flux.
    Je ne comprend pas cette remarque ? Tu récupères les données dans un std::[w]string avec getline. Ensuite, soit tu les gardes pour les traiter plus tard. Auquel cas, un conteneur de la STL devrait faire l'affaire. Soit tu les traites au fur et à mesure.

    Ceci dit que les en-têtes passés en paramètres (const HeadersType& headers) soient vides ou pas, tu devras commencer par lire tous les en-têtes de ton flux avant d'arriver au contenu car de toute façon tu ne sais pas à l'avance combien il y a de lignes d'en-têtes et de quelle taille.

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Désolé pour les remarques un peu "bêtes" mais j'ai du mal à voir comment celà fonctionne du coup je regarde un peu tout et n'importe quoi sur le net...
    Bref, pour en revenir à mon problème :

    Si j'attends la fin du flux, en faisant plusieurs getline, je peux arriver à mettre toutes les données dans le string ?
    Genre en faisant :

    std::string mess;
    while(in)
    mess = std::getline(in,mess)

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par oDREY Voir le message
    Désolé pour les remarques un peu "bêtes"
    Les remarques ne sont pas bêtes, c'est juste que c'est moins facile de se comprendre par écrit qu'en vis-à-vis.

    Citation Envoyé par oDREY Voir le message
    Bref, pour en revenir à mon problème :

    Si j'attends la fin du flux, en faisant plusieurs getline, je peux arriver à mettre toutes les données dans le string ?
    Genre en faisant :

    std::string mess;
    while(in)
    mess = std::getline(in,mess)
    Presque : F.A.Q. : Comment faire pour lire un fichier ligne par ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::string ligne;
       while ( std::getline( fichier, ligne ) )
       {
           // traitement de ligne en fonction des paramètres (header ou pas)
       }

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci je pense avoir réussi à récupérer les entêtes et leurs valeurs .

    Il faut maintenant que je récupère le contenu et que je le stocke dans le paramètre :
    std::vector<unsigned char> _data;

    Pour ça je dois repérer la ligne correspondant à " \r\n"
    est ce que ceci marchera :

    std::getline(in,ligne);
    if(ligne[0] == '\r' ) // \r correspond bien à UN caractère ?
    {
    // récupération du contenu
    }

    Pour récupérer le contenu, est ce que si je fais un getline j'aurais tout le contenu d'un seul coup ou non ? sachant que le flux est de type :

    En-Tete1: xxx\r\n
    En-Tete2: yyy\r\n
    \r\n
    [contenu]

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Il me semble qu'une ligne '\r\n' sera lue comme une ligne vide. Donc, std::string::empty() devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::getline(in,ligne);
    if(ligne.empty() ) // Ligne vide
    {
    // récupération du contenu
    }

  9. #9
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui en effet c'est évident Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encrypter un message MIME
    Par Mograine dans le forum C#
    Réponses: 1
    Dernier message: 01/12/2014, 11h04
  2. Réponses: 1
    Dernier message: 05/03/2008, 21h41
  3. Importer message mime dans Lotus
    Par daniel_gre dans le forum VBScript
    Réponses: 0
    Dernier message: 10/12/2007, 18h46
  4. Parser un message
    Par jro-daemon dans le forum C
    Réponses: 1
    Dernier message: 21/02/2007, 13h33
  5. API pour parser/modifier des messages HTTP
    Par Diody dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 09/02/2007, 00h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo