summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/import/src/rtfMailDecoder.h
blob: 7f4063c5ae65162f564f77893ab6aef08ad7bd5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/Attributes.h"
#include <string>
#include "rtfDecoder.h"

class CRTFMailDecoder : public CRTFDecoder {
 public:
  enum Mode { mNone, mText, mHTML };
  CRTFMailDecoder() : m_mode(mNone), m_state(sNormal), m_skipLevel(0) {}
  void BeginGroup() override;
  void EndGroup() override;
  void Keyword(const char* name, const int* Val) override;
  void PCDATA(const wchar_t* data, size_t cch) override;
  void BDATA(const char* data, size_t sz) override;
  const wchar_t* text() { return m_text.c_str(); }
  std::wstring::size_type textSize() { return m_text.size(); }
  Mode mode() { return m_mode; }

 private:
  enum State {
    sNormal = 0x0000,
    sBeginGroup = 0x0001,
    sAsterisk = 0x0002,
    sHtmlRtf = 0x0004
  };

  std::wstring m_text;
  Mode m_mode;
  unsigned int m_state;  // bitmask of State
                         // bool m_beginGroup; // true just after the {
                         // bool m_asterisk; // true just after the {\*
  int m_skipLevel;       // if >0 then we ignore everything
                         // bool m_htmlrtf;
  inline void SetState(unsigned int s) { m_state |= s; }
  inline void ClearState(unsigned int s) { m_state &= ~s; }
  inline bool CheckState(State s) { return (m_state & s) != 0; }
  inline bool IsAsterisk() { return CheckState(sAsterisk); }
  inline bool IsBeginGroup() { return CheckState(sBeginGroup); }
  inline bool IsHtmlRtf() { return CheckState(sHtmlRtf); }
  void AddText(const wchar_t* txt, size_t cch = static_cast<size_t>(-1));
};