]> git.cworth.org Git - apitrace/blob - thirdparty/qjson/parser.cpp
Update bundled QJson
[apitrace] / thirdparty / qjson / 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 }