File indexing completed on 2023-09-24 09:25:03

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 <QVector>
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     Q_REQUIRED_RESULT bool parse();
0031     Q_REQUIRED_RESULT QVector<QByteArray> parts() const
0032     {
0033         return m_parts;
0034     }
0035     Q_REQUIRED_RESULT QByteArray preamble() const
0036     {
0037         return m_preamble;
0038     }
0039     Q_REQUIRED_RESULT QByteArray epilouge() const
0040     {
0041         return m_epilouge;
0042     }
0043 
0044 private:
0045     QByteArray m_src;
0046     const QByteArray m_boundary;
0047     QByteArray m_preamble;
0048     QByteArray m_epilouge;
0049     QVector<QByteArray> m_parts;
0050 };
0051 
0052 /** Helper-class: abstract base class of all parsers for
0053     non-mime binary data (uuencoded, yenc)
0054     @internal
0055 */
0056 class NonMimeParser
0057 {
0058 public:
0059     explicit NonMimeParser(const QByteArray &src);
0060     virtual ~NonMimeParser();
0061     virtual bool parse() = 0;
0062     Q_REQUIRED_RESULT bool isPartial() const
0063     {
0064         return (m_partNr > -1 && m_totalNr > -1 && m_totalNr != 1);
0065     }
0066     Q_REQUIRED_RESULT int partialNumber() const
0067     {
0068         return m_partNr;
0069     }
0070     Q_REQUIRED_RESULT int partialCount() const
0071     {
0072         return m_totalNr;
0073     }
0074     Q_REQUIRED_RESULT bool hasTextPart() const
0075     {
0076         return (m_text.length() > 1);
0077     }
0078     Q_REQUIRED_RESULT QByteArray textPart() const
0079     {
0080         return m_text;
0081     }
0082     Q_REQUIRED_RESULT QVector<QByteArray> binaryParts() const
0083     {
0084         return m_bins;
0085     }
0086     Q_REQUIRED_RESULT QVector<QByteArray> filenames() const
0087     {
0088         return m_filenames;
0089     }
0090     Q_REQUIRED_RESULT QVector<QByteArray> mimeTypes() const
0091     {
0092         return m_mimeTypes;
0093     }
0094 
0095 protected:
0096     static QByteArray guessMimeType(const QByteArray &fileName);
0097 
0098     QByteArray m_src, m_text;
0099     QVector<QByteArray> m_bins, m_filenames, m_mimeTypes;
0100     int m_partNr, m_totalNr;
0101 };
0102 
0103 /** Helper-class: tries to extract the data from a possibly
0104     uuencoded message
0105     @internal
0106 */
0107 class UUEncoded : public NonMimeParser
0108 {
0109 public:
0110     UUEncoded(const QByteArray &src, const QByteArray &subject);
0111 
0112     Q_REQUIRED_RESULT bool parse() override;
0113 
0114 private:
0115     QByteArray m_subject;
0116 };
0117 
0118 /** Helper-class: tries to extract the data from a possibly
0119     yenc encoded message
0120     @internal
0121 */
0122 class YENCEncoded : public NonMimeParser
0123 {
0124 public:
0125     explicit YENCEncoded(const QByteArray &src);
0126 
0127     Q_REQUIRED_RESULT bool parse() override;
0128 
0129 private:
0130     static bool yencMeta(QByteArray &src, const QByteArray &name, int *value);
0131 };
0132 
0133 } // namespace Parser
0134 
0135 } // namespace KMime
0136