1/*
2 * This file is part of the KDE libraries
3 * Copyright (C) 2012 Bernd Buschinski (b.buschinski@googlemail.com)
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
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 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library 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
22#ifndef JSONSTRINGIFY_H
23#define JSONSTRINGIFY_H
24
25#include "ustring.h"
26#include "identifier.h"
27#include "CommonIdentifiers.h"
28
29#include <HashSet.h>
30
31#include <vector>
32
33namespace KJS {
34
35class JSValue;
36class ExecState;
37class JSObject;
38
39class JSONStringify
40{
41public:
42 enum StringifyState {
43 Success,
44 FailedCyclic,
45 FailedException,
46 FailedStackLimitExceeded
47 };
48
49 JSONStringify(ExecState* exec, JSValue* replacer, JSValue* spacer);
50
51 JSValue* stringify(ExecState* exec, JSValue* object, StringifyState& state);
52
53private:
54 enum ReplacerType {
55 Invalid,
56 Function,
57 Array
58 };
59
60 UString stringifyObject(KJS::ExecState* exec, KJS::JSValue* object, KJS::JSValue* propertyName, KJS::JSObject* holder);
61 UString quotedString(ExecState* exec, const UString& string);
62 UString stringifyValue(ExecState* exec, JSValue* object, JSValue* propertyName, JSObject* holder);
63
64 bool isWhiteListed(const Identifier& propertyName);
65
66 StringifyState m_state;
67 ReplacerType m_replacerType;
68 JSObject* m_replacerObject;
69 WTF::HashSet<Identifier> m_whitelistNames;
70 UString m_spacer;
71
72 //Object Stack for cyclic detection
73 std::vector<JSValue*> m_objectStack;
74
75 bool m_rootIsUndefined;
76 bool m_emtpySpacer;
77};
78
79}
80
81#endif // JSONSTRINGIFY_H
82