2 * Copyright (C) 2005-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
23 #include "JSONVariantWriter.h"
27 string CJSONVariantWriter::Write(const CVariant &value, bool compact)
32 yajl_gen g = yajl_gen_alloc(NULL);
33 yajl_gen_config(g, yajl_gen_beautify, compact ? 0 : 1);
34 yajl_gen_config(g, yajl_gen_indent_string, "\t");
36 yajl_gen_config conf = { compact ? 0 : 1, "\t" };
37 yajl_gen g = yajl_gen_alloc(&conf, NULL);
40 // Set locale to classic ("C") to ensure valid JSON numbers
41 const char *currentLocale = setlocale(LC_NUMERIC, NULL);
42 if (currentLocale != NULL)
43 setlocale(LC_NUMERIC, "C");
45 if (InternalWrite(g, value))
47 const unsigned char * buffer;
51 yajl_gen_get_buf(g, &buffer, &length);
54 yajl_gen_get_buf(g, &buffer, &length);
56 output = string((const char *)buffer, length);
59 // Re-set locale to what it was before using yajl
60 if (currentLocale != NULL)
61 setlocale(LC_NUMERIC, currentLocale);
69 bool CJSONVariantWriter::InternalWrite(yajl_gen g, const CVariant &value)
75 case CVariant::VariantTypeInteger:
77 success = yajl_gen_status_ok == yajl_gen_integer(g, (long long int)value.asInteger());
79 success = yajl_gen_status_ok == yajl_gen_integer(g, (long int)value.asInteger());
82 case CVariant::VariantTypeUnsignedInteger:
84 success = yajl_gen_status_ok == yajl_gen_integer(g, (long long int)value.asUnsignedInteger());
86 success = yajl_gen_status_ok == yajl_gen_integer(g, (long int)value.asUnsignedInteger());
89 case CVariant::VariantTypeDouble:
90 success = yajl_gen_status_ok == yajl_gen_double(g, value.asDouble());
92 case CVariant::VariantTypeBoolean:
93 success = yajl_gen_status_ok == yajl_gen_bool(g, value.asBoolean() ? 1 : 0);
95 case CVariant::VariantTypeString:
97 success = yajl_gen_status_ok == yajl_gen_string(g, (const unsigned char*)value.c_str(), (size_t)value.size());
99 success = yajl_gen_status_ok == yajl_gen_string(g, (const unsigned char*)value.c_str(), value.size());
102 case CVariant::VariantTypeArray:
103 success = yajl_gen_status_ok == yajl_gen_array_open(g);
105 for (CVariant::const_iterator_array itr = value.begin_array(); itr != value.end_array() && success; itr++)
106 success &= InternalWrite(g, *itr);
109 success = yajl_gen_status_ok == yajl_gen_array_close(g);
112 case CVariant::VariantTypeObject:
113 success = yajl_gen_status_ok == yajl_gen_map_open(g);
115 for (CVariant::const_iterator_map itr = value.begin_map(); itr != value.end_map() && success; itr++)
118 success &= yajl_gen_status_ok == yajl_gen_string(g, (const unsigned char*)itr->first.c_str(), (size_t)itr->first.length());
120 success &= yajl_gen_status_ok == yajl_gen_string(g, (const unsigned char*)itr->first.c_str(), itr->first.length());
123 success &= InternalWrite(g, itr->second);
127 success &= yajl_gen_status_ok == yajl_gen_map_close(g);
130 case CVariant::VariantTypeConstNull:
131 case CVariant::VariantTypeNull:
133 success = yajl_gen_status_ok == yajl_gen_null(g);