11 #include "JSONRPCUtils.h" 12 #include "playlists/SmartPlayList.h" 13 #include "utils/JSONVariantParser.h" 14 #include "utils/JSONVariantWriter.h" 15 #include "utils/SortUtils.h" 16 #include "utils/StringUtils.h" 17 #include "utils/Variant.h" 49 static void MillisecondsToTimeObject(
int time,
CVariant &result)
52 result[
"milliseconds"] = ms;
53 time = (time - ms) / 1000;
56 result[
"seconds"] = s;
57 time = (time - s) / 60;
60 result[
"minutes"] = m;
61 time = (time -m) / 60;
63 result[
"hours"] = time;
67 static void HandleLimits(
const CVariant ¶meterObject,
CVariant &result,
int size,
int &start,
int &end)
72 start = (int)parameterObject[
"limits"][
"start"].asInteger();
73 end = (int)parameterObject[
"limits"][
"end"].asInteger();
74 end = (end <= 0 || end > size) ? size : end;
75 start = start > end ? end : start;
77 result[
"limits"][
"start"] = start;
78 result[
"limits"][
"end"] = end;
79 result[
"limits"][
"total"] = size;
82 static bool ParseSorting(
const CVariant ¶meterObject,
SortBy &sortBy, SortOrder &sortOrder, SortAttribute &sortAttributes)
84 std::string method = parameterObject[
"sort"][
"method"].asString();
85 std::string order = parameterObject[
"sort"][
"order"].asString();
86 StringUtils::ToLower(method);
87 StringUtils::ToLower(order);
90 sortAttributes = SortAttributeNone;
91 if (parameterObject[
"sort"][
"ignorearticle"].asBoolean())
92 sortAttributes =
static_cast<SortAttribute
>(sortAttributes | SortAttributeIgnoreArticle);
93 if (parameterObject[
"sort"][
"useartistsortname"].asBoolean())
94 sortAttributes = static_cast<SortAttribute>(sortAttributes | SortAttributeUseArtistSortName);
97 sortOrder = SortUtils::SortOrderFromString(order);
98 if (sortOrder == SortOrderNone)
102 sortBy = SortUtils::SortMethodFromString(method);
107 static void ParseLimits(
const CVariant ¶meterObject,
int &limitStart,
int &limitEnd)
109 limitStart = (int)parameterObject[
"limits"][
"start"].asInteger();
110 limitEnd = (int)parameterObject[
"limits"][
"end"].asInteger();
125 const std::string& key,
126 unsigned int position)
129 (parameterObject.isArray() && parameterObject.size() > position);
142 return value.isMember(key);
158 const std::string& key,
159 unsigned int position)
161 return IsValueMember(parameterObject, key) ? parameterObject[key] : parameterObject[position];
180 const std::string& key,
181 unsigned int position,
185 ? parameterObject[key]
186 : ((parameterObject.isArray() && parameterObject.size() > position)
187 ? parameterObject[position]
200 std::string str = defaultValue;
201 if (value.isString())
203 str = value.asString();
217 if (transport.compare(
"Announcing") == 0)
219 if (transport.compare(
"FileDownloadDirect") == 0)
220 return FileDownloadDirect;
221 if (transport.compare(
"FileDownloadRedirect") == 0)
222 return FileDownloadRedirect;
235 if (valueType.compare(
"null") == 0)
237 if (valueType.compare(
"string") == 0)
239 if (valueType.compare(
"number") == 0)
241 if (valueType.compare(
"integer") == 0)
243 if (valueType.compare(
"boolean") == 0)
245 if (valueType.compare(
"array") == 0)
247 if (valueType.compare(
"object") == 0)
261 std::vector<JSONSchemaType> types = std::vector<JSONSchemaType>();
262 for (
unsigned int value = 0x01; value <= (
unsigned int)AnyValue; value *= 2)
264 if (HasType(valueType, (JSONSchemaType)value))
265 types.push_back((JSONSchemaType)value);
269 if (types.size() > 1)
272 for (
unsigned int index = 0; index < types.size(); index++)
275 strType.append(
", ");
277 switch (types.at(index))
280 strType.append(
"string");
283 strType.append(
"number");
286 strType.append(
"integer");
289 strType.append(
"boolean");
292 strType.append(
"array");
295 strType.append(
"object");
298 strType.append(
"any");
301 strType.append(
"null");
304 strType.append(
"unknown");
308 if (types.size() > 1)
322 jsonObject =
CVariant(CVariant::VariantTypeArray);
323 for (
unsigned int value = 0x01; value <= (
unsigned int)AnyValue; value *= 2)
325 if (HasType(valueType, (JSONSchemaType)value))
329 if (jsonObject.size() == 1)
332 jsonObject = jsonType;
336 static inline const char *ValueTypeToString(CVariant::VariantType valueType)
340 case CVariant::VariantTypeString:
342 case CVariant::VariantTypeDouble:
344 case CVariant::VariantTypeInteger:
345 case CVariant::VariantTypeUnsignedInteger:
347 case CVariant::VariantTypeBoolean:
349 case CVariant::VariantTypeArray:
351 case CVariant::VariantTypeObject:
353 case CVariant::VariantTypeNull:
354 case CVariant::VariantTypeConstNull:
370 static inline bool IsParameterType(
const CVariant ¶meterObject,
const char *key,
unsigned int position, JSONSchemaType valueType)
372 if ((valueType & AnyValue) == AnyValue)
377 parameter = parameterObject[key];
378 else if(parameterObject.isArray() && parameterObject.size() > position)
379 parameter = parameterObject[position];
381 return IsType(parameter, valueType);
392 if (HasType(valueType, AnyValue))
394 if (HasType(valueType, StringValue) && value.isString())
396 if (HasType(valueType, NumberValue) && (value.isInteger() || value.isUnsignedInteger() || value.isDouble()))
398 if (HasType(valueType, IntegerValue) && (value.isInteger() || value.isUnsignedInteger()))
400 if (HasType(valueType, BooleanValue) && value.isBoolean())
402 if (HasType(valueType, ArrayValue) && value.isArray())
404 if (HasType(valueType, ObjectValue) && value.isObject())
407 return value.isNull();
424 value =
CVariant(CVariant::VariantTypeDouble);
427 value =
CVariant(CVariant::VariantTypeInteger);
430 value =
CVariant(CVariant::VariantTypeBoolean);
433 value =
CVariant(CVariant::VariantTypeArray);
436 value =
CVariant(CVariant::VariantTypeObject);
439 value =
CVariant(CVariant::VariantTypeNull);
443 static inline bool HasType(JSONSchemaType typeObject, JSONSchemaType type) {
return (typeObject & type) == type; }
445 static inline bool ParameterNotNull(
const CVariant& parameterObject,
const std::string& key)
447 return parameterObject.isMember(key) && !parameterObject[key].isNull();
458 if (!jsonStringArray.isArray())
462 for (CVariant::const_iterator_array it = jsonStringArray.begin_array(); it != jsonStringArray.end_array(); ++it)
463 stringArray.push_back(it->asString());
470 static bool GetXspFiltering(
const std::string &type,
const CVariant &filter, std::string &xsp)
472 if (type.empty() || !filter.isObject())
475 CVariant xspObj(CVariant::VariantTypeObject);
476 xspObj[
"type"] = type;
478 if (filter.isMember(
"field"))
480 xspObj[
"rules"][
"and"] =
CVariant(CVariant::VariantTypeArray);
481 xspObj[
"rules"][
"and"].push_back(filter);
484 xspObj[
"rules"] = filter;
487 return playlist.Load(xspObj) && playlist.SaveAsJson(xsp,
false);
static TransportLayerCapability StringToTransportLayer(const std::string &transport)
Returns a TransportLayerCapability value of the given string representation.
Definition: JSONUtils.h:215
static CVariant GetParameter(const CVariant ¶meterObject, const std::string &key, unsigned int position, const CVariant &fallback)
Returns the json value of a parameter or the given default value.
Definition: JSONUtils.h:179
static void CopyStringArray(const CVariant &jsonStringArray, std::vector< std::string > &stringArray)
Copies the values from the jsonStringArray to the stringArray. stringArray is cleared.
Definition: JSONUtils.h:456
Definition: AddonsOperations.h:23
static void SetDefaultValue(CVariant &value, JSONSchemaType valueType)
Sets the value of the given json value to the default value of the given type.
Definition: JSONUtils.h:416
static void SchemaValueTypeToJson(JSONSchemaType valueType, CVariant &jsonObject)
Converts the given json schema type into a json object.
Definition: JSONUtils.h:320
static std::string SchemaValueTypeToString(JSONSchemaType valueType)
Returns a string representation for the given JSONSchemaType.
Definition: JSONUtils.h:259
static bool IsParameterType(const CVariant ¶meterObject, const char *key, unsigned int position, JSONSchemaType valueType)
Checks if the parameter with the given name or at the given position is of a certain type...
Definition: JSONUtils.h:370
DateTime class, which uses FileTime as it's base.
Definition: XBDateTime.h:63
SortBy
Definition: SortUtils.h:49
static JSONSchemaType StringToSchemaValueType(const std::string &valueType)
Returns a JSONSchemaType value for the given string representation.
Definition: JSONUtils.h:233
static std::string GetString(const CVariant &value, const char *defaultValue)
Returns the given json value as a string.
Definition: JSONUtils.h:198
Definition: SmartPlayList.h:90
static bool IsType(const CVariant &value, JSONSchemaType valueType)
Checks if the given json value is of the given type.
Definition: JSONUtils.h:390
Helper class containing utility methods to handle json rpc method calls.
Definition: JSONUtils.h:46
static bool ParameterExists(const CVariant ¶meterObject, const std::string &key, unsigned int position)
Checks if the given object contains a parameter.
Definition: JSONUtils.h:124
static CVariant GetParameter(const CVariant ¶meterObject, const std::string &key, unsigned int position)
Returns the json value of a parameter.
Definition: JSONUtils.h:157
static bool IsValueMember(const CVariant &value, const std::string &key)
Checks if the given object contains a value with the given key.
Definition: JSONUtils.h:140