1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/json.h"
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <errno.h>
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <limits.h>
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <stdlib.h>
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <sstream>
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
19cb76b895728c888c60cf474070fff6aee4f8731cThiago Farinanamespace rtc {
20cb76b895728c888c60cf474070fff6aee4f8731cThiago Farina
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetStringFromJson(const Json::Value& in, std::string* out) {
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isString()) {
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    std::ostringstream s;
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (in.isBool()) {
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      s << std::boolalpha << in.asBool();
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else if (in.isInt()) {
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      s << in.asInt();
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else if (in.isUInt()) {
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      s << in.asUInt();
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else if (in.isDouble()) {
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      s << in.asDouble();
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else {
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      return false;
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *out = s.str();
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *out = in.asString();
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetIntFromJson(const Json::Value& in, int* out) {
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool ret;
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isString()) {
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = in.isConvertibleTo(Json::intValue);
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (ret) {
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *out = in.asInt();
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    long val;  // NOLINT
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    const char* c_str = in.asCString();
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    char* end_ptr;
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    errno = 0;
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    val = strtol(c_str, &end_ptr, 10);  // NOLINT
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno &&
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org           val >= INT_MIN && val <= INT_MAX);
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *out = val;
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return ret;
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetUIntFromJson(const Json::Value& in, unsigned int* out) {
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool ret;
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isString()) {
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = in.isConvertibleTo(Json::uintValue);
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (ret) {
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *out = in.asUInt();
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    unsigned long val;  // NOLINT
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    const char* c_str = in.asCString();
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    char* end_ptr;
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    errno = 0;
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    val = strtoul(c_str, &end_ptr, 10);  // NOLINT
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno &&
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org           val <= UINT_MAX);
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *out = val;
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return ret;
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetBoolFromJson(const Json::Value& in, bool* out) {
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool ret;
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isString()) {
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = in.isConvertibleTo(Json::booleanValue);
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (ret) {
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *out = in.asBool();
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (in.asString() == "true") {
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *out = true;
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      ret = true;
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else if (in.asString() == "false") {
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *out = false;
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      ret = true;
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else {
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      ret = false;
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return ret;
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetDoubleFromJson(const Json::Value& in, double* out) {
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool ret;
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isString()) {
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = in.isConvertibleTo(Json::realValue);
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (ret) {
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      *out = in.asDouble();
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    double val;
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    const char* c_str = in.asCString();
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    char* end_ptr;
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    errno = 0;
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    val = strtod(c_str, &end_ptr);
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno);
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *out = val;
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return ret;
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace {
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate<typename T>
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToVector(const Json::Value& value,
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                       bool (*getter)(const Json::Value& in, T* out),
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                       std::vector<T> *vec) {
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  vec->clear();
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!value.isArray()) {
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  for (Json::Value::ArrayIndex i = 0; i < value.size(); ++i) {
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    T val;
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (!getter(value[i], &val)) {
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      return false;
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    vec->push_back(val);
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Trivial getter helper
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetValueFromJson(const Json::Value& in, Json::Value* out) {
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  *out = in;
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // unnamed namespace
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToValueVector(const Json::Value& in,
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                            std::vector<Json::Value>* out) {
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return JsonArrayToVector(in, GetValueFromJson, out);
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToIntVector(const Json::Value& in,
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                          std::vector<int>* out) {
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return JsonArrayToVector(in, GetIntFromJson, out);
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToUIntVector(const Json::Value& in,
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           std::vector<unsigned int>* out) {
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return JsonArrayToVector(in, GetUIntFromJson, out);
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToStringVector(const Json::Value& in,
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                             std::vector<std::string>* out) {
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return JsonArrayToVector(in, GetStringFromJson, out);
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToBoolVector(const Json::Value& in,
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           std::vector<bool>* out) {
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return JsonArrayToVector(in, GetBoolFromJson, out);
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool JsonArrayToDoubleVector(const Json::Value& in,
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                             std::vector<double>* out) {
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return JsonArrayToVector(in, GetDoubleFromJson, out);
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace {
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate<typename T>
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value VectorToJsonArray(const std::vector<T>& vec) {
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value result(Json::arrayValue);
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  for (size_t i = 0; i < vec.size(); ++i) {
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    result.append(Json::Value(vec[i]));
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return result;
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // unnamed namespace
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value ValueVectorToJsonArray(const std::vector<Json::Value>& in) {
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return VectorToJsonArray(in);
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value IntVectorToJsonArray(const std::vector<int>& in) {
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return VectorToJsonArray(in);
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value UIntVectorToJsonArray(const std::vector<unsigned int>& in) {
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return VectorToJsonArray(in);
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value StringVectorToJsonArray(const std::vector<std::string>& in) {
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return VectorToJsonArray(in);
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value BoolVectorToJsonArray(const std::vector<bool>& in) {
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return VectorToJsonArray(in);
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgJson::Value DoubleVectorToJsonArray(const std::vector<double>& in) {
211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return VectorToJsonArray(in);
212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetValueFromJsonArray(const Json::Value& in, size_t n,
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           Json::Value* out) {
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isArray() || !in.isValidIndex(static_cast<int>(n))) {
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  *out = in[static_cast<Json::Value::ArrayIndex>(n)];
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetIntFromJsonArray(const Json::Value& in, size_t n,
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                         int* out) {
226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetIntFromJson(x, out);
228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetUIntFromJsonArray(const Json::Value& in, size_t n,
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                          unsigned int* out)  {
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetUIntFromJson(x, out);
234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetStringFromJsonArray(const Json::Value& in, size_t n,
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                            std::string* out) {
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetStringFromJson(x, out);
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetBoolFromJsonArray(const Json::Value& in, size_t n,
243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                          bool* out) {
244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetBoolFromJson(x, out);
246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetDoubleFromJsonArray(const Json::Value& in, size_t n,
249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                            double* out) {
250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetDoubleFromJson(x, out);
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetValueFromJsonObject(const Json::Value& in, const std::string& k,
255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                            Json::Value* out) {
256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!in.isObject() || !in.isMember(k)) {
257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  *out = in[k];
261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetIntFromJsonObject(const Json::Value& in, const std::string& k,
265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                          int* out) {
266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetIntFromJson(x, out);
268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetUIntFromJsonObject(const Json::Value& in, const std::string& k,
271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           unsigned int* out)  {
272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetUIntFromJson(x, out);
274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetStringFromJsonObject(const Json::Value& in, const std::string& k,
277f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                             std::string* out)  {
278f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
279f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetStringFromJson(x, out);
280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetBoolFromJsonObject(const Json::Value& in, const std::string& k,
283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           bool* out) {
284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetBoolFromJson(x, out);
286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
288f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool GetDoubleFromJsonObject(const Json::Value& in, const std::string& k,
289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                             double* out) {
290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::Value x;
291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetDoubleFromJson(x, out);
292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string JsonValueToString(const Json::Value& json) {
295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Json::FastWriter w;
296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string value = w.write(json);
297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return value.substr(0, value.size() - 1);  // trim trailing newline
298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
299cb76b895728c888c60cf474070fff6aee4f8731cThiago Farina
300cb76b895728c888c60cf474070fff6aee4f8731cThiago Farina}  // namespace rtc
301