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: */
|