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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#ifndef CEPH_FORMATTER_H
#define CEPH_FORMATTER_H
#include "include/int_types.h"
#include <deque>
#include <iostream>
#include <list>
#include <ostream>
#include <sstream>
#include <stdarg.h>
#include <string>
#include "include/buffer.h"
namespace ceph {
struct FormatterAttrs {
std::list< std::pair<std::string, std::string> > attrs;
FormatterAttrs(const char *attr, ...);
};
class Formatter {
public:
Formatter();
virtual ~Formatter();
virtual void flush(std::ostream& os) = 0;
void flush(bufferlist &bl) {
std::stringstream os;
flush(os);
bl.append(os.str());
}
virtual void reset() = 0;
virtual void open_array_section(const char *name) = 0;
virtual void open_array_section_in_ns(const char *name, const char *ns) = 0;
virtual void open_object_section(const char *name) = 0;
virtual void open_object_section_in_ns(const char *name, const char *ns) = 0;
virtual void close_section() = 0;
virtual void dump_unsigned(const char *name, uint64_t u) = 0;
virtual void dump_int(const char *name, int64_t s) = 0;
virtual void dump_float(const char *name, double d) = 0;
virtual void dump_string(const char *name, std::string s) = 0;
virtual void dump_bool(const char *name, bool b) {
dump_string(name, (b ? "true" : "false"));
}
virtual std::ostream& dump_stream(const char *name) = 0;
virtual void dump_format(const char *name, const char *fmt, ...) = 0;
virtual void dump_format_unquoted(const char *name, const char *fmt, ...) = 0;
virtual int get_len() const = 0;
virtual void write_raw_data(const char *data) = 0;
/* with attrs */
virtual void open_array_section_with_attrs(const char *name, const FormatterAttrs& attrs) {
open_array_section(name);
}
virtual void open_object_section_with_attrs(const char *name, const FormatterAttrs& attrs) {
open_object_section(name);
}
virtual void dump_string_with_attrs(const char *name, std::string s, const FormatterAttrs& attrs) {
dump_string(name, s);
}
};
Formatter *new_formatter(const std::string type);
class JSONFormatter : public Formatter {
public:
JSONFormatter(bool p=false);
void flush(std::ostream& os);
void reset();
virtual void open_array_section(const char *name);
void open_array_section_in_ns(const char *name, const char *ns);
void open_object_section(const char *name);
void open_object_section_in_ns(const char *name, const char *ns);
void close_section();
void dump_unsigned(const char *name, uint64_t u);
void dump_int(const char *name, int64_t u);
void dump_float(const char *name, double d);
void dump_string(const char *name, std::string s);
std::ostream& dump_stream(const char *name);
void dump_format(const char *name, const char *fmt, ...);
void dump_format_unquoted(const char *name, const char *fmt, ...);
int get_len() const;
void write_raw_data(const char *data);
private:
struct json_formatter_stack_entry_d {
int size;
bool is_array;
json_formatter_stack_entry_d() : size(0), is_array(false) {}
};
bool m_pretty;
void open_section(const char *name, bool is_array);
void print_quoted_string(const char *s);
void print_name(const char *name);
void print_comma(json_formatter_stack_entry_d& entry);
void finish_pending_string();
std::stringstream m_ss, m_pending_string;
std::list<json_formatter_stack_entry_d> m_stack;
bool m_is_pending_string;
};
class XMLFormatter : public Formatter {
public:
static const char *XML_1_DTD;
XMLFormatter(bool pretty = false);
void flush(std::ostream& os);
void reset();
void open_array_section(const char *name);
void open_array_section_in_ns(const char *name, const char *ns);
void open_object_section(const char *name);
void open_object_section_in_ns(const char *name, const char *ns);
void close_section();
void dump_unsigned(const char *name, uint64_t u);
void dump_int(const char *name, int64_t u);
void dump_float(const char *name, double d);
void dump_string(const char *name, std::string s);
std::ostream& dump_stream(const char *name);
void dump_format(const char *name, const char *fmt, ...);
void dump_format_unquoted(const char *name, const char *fmt, ...);
int get_len() const;
void write_raw_data(const char *data);
/* with attrs */
void open_array_section_with_attrs(const char *name, const FormatterAttrs& attrs);
void open_object_section_with_attrs(const char *name, const FormatterAttrs& attrs);
void dump_string_with_attrs(const char *name, std::string s, const FormatterAttrs& attrs);
private:
void open_section_in_ns(const char *name, const char *ns, const FormatterAttrs *attrs);
void finish_pending_string();
void print_spaces();
static std::string escape_xml_str(const char *str);
void get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str);
std::stringstream m_ss, m_pending_string;
std::deque<std::string> m_sections;
bool m_pretty;
std::string m_pending_string_name;
};
}
#endif
|