File indexing completed on 2024-04-28 05:18:41

0001 /*
0002     kmime_parsers.h
0003 
0004     KMime, the KDE Internet mail/usenet news message library.
0005     SPDX-FileCopyrightText: 2001 the KMime authors.
0006     See file AUTHORS for details
0007 
0008     SPDX-License-Identifier: LGPL-2.0-or-later
0009 */
0010 #pragma once
0011 
0012 #include <QByteArray>
0013 #include <QList>
0014 
0015 namespace KMime
0016 {
0017 
0018 namespace Parser
0019 {
0020 
0021 /** Helper-class: splits a multipart-message into single
0022     parts as described in RFC 2046
0023     @internal
0024 */
0025 class MultiPart
0026 {
0027 public:
0028     MultiPart(const QByteArray &src, const QByteArray &boundary);
0029 
0030     [[nodiscard]] bool parse();
0031     [[nodiscard]] QList<QByteArray> parts() const { return m_parts; }
0032     [[nodiscard]] QByteArray preamble() const { return m_preamble; }
0033     [[nodiscard]] QByteArray epilouge() const { return m_epilouge; }
0034 
0035   private:
0036     QByteArray m_src;
0037     const QByteArray m_boundary;
0038     QByteArray m_preamble;
0039     QByteArray m_epilouge;
0040     QList<QByteArray> m_parts;
0041 };
0042 
0043 /** Helper-class: abstract base class of all parsers for
0044     non-mime binary data (uuencoded, yenc)
0045     @internal
0046 */
0047 class NonMimeParser
0048 {
0049 public:
0050     [[nodiscard]] bool isPartial() const {
0051       return (m_partNr > -1 && m_totalNr > -1 && m_totalNr != 1);
0052     }
0053     [[nodiscard]] int partialNumber() const { return m_partNr; }
0054     [[nodiscard]] int partialCount() const { return m_totalNr; }
0055     [[nodiscard]] bool hasTextPart() const { return (m_text.length() > 1); }
0056     [[nodiscard]] QByteArray textPart() const { return m_text; }
0057     [[nodiscard]] QList<QByteArray> binaryParts() const { return m_bins; }
0058     [[nodiscard]] QList<QByteArray> filenames() const { return m_filenames; }
0059     [[nodiscard]] QList<QByteArray> mimeTypes() const { return m_mimeTypes; }
0060 
0061 protected:
0062     explicit NonMimeParser(const QByteArray &src);
0063     ~NonMimeParser();
0064 
0065     static QByteArray guessMimeType(const QByteArray &fileName);
0066 
0067     QByteArray m_src, m_text;
0068     QList<QByteArray> m_bins, m_filenames, m_mimeTypes;
0069     int m_partNr, m_totalNr;
0070 };
0071 
0072 /** Helper-class: tries to extract the data from a possibly
0073     uuencoded message
0074     @internal
0075 */
0076 class UUEncoded : public NonMimeParser
0077 {
0078 public:
0079     UUEncoded(const QByteArray &src, const QByteArray &subject);
0080 
0081     [[nodiscard]] bool parse();
0082 
0083   private:
0084     QByteArray m_subject;
0085 };
0086 
0087 /** Helper-class: tries to extract the data from a possibly
0088     yenc encoded message
0089     @internal
0090 */
0091 class YENCEncoded : public NonMimeParser
0092 {
0093 public:
0094     explicit YENCEncoded(const QByteArray &src);
0095 
0096     [[nodiscard]] bool parse();
0097 
0098   private:
0099     static bool yencMeta(QByteArray &src, const QByteArray &name, int *value);
0100 };
0101 
0102 } // namespace Parser
0103 
0104 } // namespace KMime
0105