summaryrefslogtreecommitdiff
path: root/src/lib/SW602Parser.cpp
blob: 52202cc297bc52c6e0f033b7fa9b1d67a3d42fb0 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
 * This file is part of the libsw602 project.
 *
 * 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 "SW602Parser.h"

#include "SW602GraphicListener.h"
#include "SW602GraphicStyle.h"
#include "SW602List.h"
#include "SW602SpreadsheetListener.h"
#include "SW602TextListener.h"

namespace libsw602
{

SW602ParserState::SW602ParserState(SW602ParserState::Type type, boost::shared_ptr<librevenge::RVNGInputStream> input) :
  m_type(type), m_kind(Software602Document::KIND_TEXT), m_version(0), m_input(input), m_pageSpan(),
  m_graphicListener(), m_listManager(), m_spreadsheetListener(), m_textListener(), m_asciiFile(input)
{
  m_listManager.reset(new SW602ListManager);
}

SW602ParserState::~SW602ParserState()
{
  if (getMainListener()) try
    {
      /* must never happen, only sanity check....

            Ie. the parser which creates a listener, must delete it.
            */
      SW602_DEBUG_MSG(("SW602ParserState::~SW602ParserState: the listener is NOT closed, call enddocument without any subdoc\n"));
      getMainListener()->endDocument(false);
    }
    catch (const libsw602::ParseException &)
    {
      SW602_DEBUG_MSG(("SW602ParserState::~SW602ParserState: endDocument FAILS\n"));
      /* must never happen too...

      Ie. the different parsers are responsable to create enough pages,
      if we have exception here, this will indicate a second error in code
      */
    }
}

SW602ListenerPtr SW602ParserState::getMainListener()
{
  switch (m_type)
  {
  case Graphic:
    return m_graphicListener;
  case Spreadsheet:
    return m_spreadsheetListener;
  case Text:
    return m_textListener;
  default:
    SW602_DEBUG_MSG(("SW602ParserState:::getMainListener unexpected document type\n"));
  }
  return SW602ListenerPtr();
}

SW602Parser::SW602Parser(SW602ParserState::Type type, boost::shared_ptr<librevenge::RVNGInputStream> input):
  m_parserState(), m_asciiName("")
{
  m_parserState.reset(new SW602ParserState(type, input));
}

SW602Parser::~SW602Parser()
{
}

SW602ListenerPtr SW602Parser::getMainListener()
{
  return m_parserState->getMainListener();
}

void SW602Parser::setGraphicListener(SW602GraphicListenerPtr &listener)
{
  m_parserState->m_graphicListener=listener;
}

void SW602Parser::resetGraphicListener()
{
  if (getGraphicListener()) getGraphicListener()->endDocument();
  m_parserState->m_graphicListener.reset();
}

void SW602Parser::setSpreadsheetListener(SW602SpreadsheetListenerPtr &listener)
{
  m_parserState->m_spreadsheetListener=listener;
}

void SW602Parser::resetSpreadsheetListener()
{
  if (getSpreadsheetListener()) getSpreadsheetListener()->endDocument();
  m_parserState->m_spreadsheetListener.reset();
}

void SW602Parser::setTextListener(SW602TextListenerPtr &listener)
{
  m_parserState->m_textListener=listener;
}

void SW602Parser::resetTextListener()
{
  if (getTextListener()) getTextListener()->endDocument();
  m_parserState->m_textListener.reset();
}

}

/* vim:set shiftwidth=2 softtabstop=2 expandtab: */