QJson - a Qt based library for mapping JSON data to QVariant objects

QJson home page

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List

parser.cpp
1 /* This file is part of QJson
2 *
3 * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License version 2.1, as published by the Free Software Foundation.
8 *
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21 #include "parser.h"
22 #include "parser_p.h"
23 #include "json_parser.hh"
24 #include "json_scanner.h"
25
26 #include <QtCore/QBuffer>
27 #include <QtCore/QStringList>
28 #include <QtCore/QTextStream>
29 #include <QtCore/QDebug>
30
31 using namespace QJson;
32
33 ParserPrivate::ParserPrivate() :
34 m_scanner(0)
35 , m_negate(false)
36 , m_error(false)
37 , m_errorLine(0)
38 , m_specialNumbersAllowed(false)
39 {
40 }
41
42 ParserPrivate::~ParserPrivate()
43 {
44 delete m_scanner;
45 }
46
47 void ParserPrivate::setError(QString errorMsg, int errorLine) {
48 m_error = true;
49 m_errorMsg = errorMsg;
50 m_errorLine = errorLine;
51 }
52
53 Parser::Parser() :
54 d(new ParserPrivate)
55 {
56 }
57
58 Parser::~Parser()
59 {
60 delete d;
61 }
62
63 QVariant Parser::parse (QIODevice* io, bool* ok)
64 {
65 d->m_errorMsg.clear();
66 delete d->m_scanner;
67 d->m_scanner = 0;
68
69 if (!io->isOpen()) {
70 if (!io->open(QIODevice::ReadOnly)) {
71 if (ok != 0)
72 *ok = false;
73 qCritical ("Error opening device");
74 return QVariant();
75 }
76 }
77
78 if (!io->isReadable()) {
79 if (ok != 0)
80 *ok = false;
81 qCritical ("Device is not readable");
82 io->close();
83 return QVariant();
84 }
85
86 d->m_scanner = new JSonScanner (io);
87 d->m_scanner->allowSpecialNumbers(d->m_specialNumbersAllowed);
88 yy::json_parser parser(d);
89 parser.parse();
90
91 delete d->m_scanner;
92 d->m_scanner = 0;
93
94 if (ok != 0)
95 *ok = !d->m_error;
96
97 io->close();
98 return d->m_result;
99 }
100
101 QVariant Parser::parse(const QByteArray& jsonString, bool* ok) {
102 QBuffer buffer;
103 buffer.open(QBuffer::ReadWrite);
104 buffer.write(jsonString);
105 buffer.seek(0);
106 return parse (&buffer, ok);
107 }
108
109 QString Parser::errorString() const
110 {
111 return d->m_errorMsg;
112 }
113
114 int Parser::errorLine() const
115 {
116 return d->m_errorLine;
117 }
118
119 void QJson::Parser::allowSpecialNumbers(bool allowSpecialNumbers) {
120 d->m_specialNumbersAllowed = allowSpecialNumbers;
121 }
122
123 bool Parser::specialNumbersAllowed() const {
124 return d->m_specialNumbersAllowed;
125 }
yy::json_parser
A Bison parser.
Definition: json_parser.hh:119
QJson::Parser::allowSpecialNumbers
void allowSpecialNumbers(bool allowSpecialNumbers)
Definition: parser.cpp:119
yy::json_parser::parse
virtual int parse()
Definition: json_parser.cc:240
QJson
Definition: json_parser.hh:66

| hosts this site. |  | Send comments to: QJson Developers