Skip to content

Commit

Permalink
Use yajl instead of jsoncpp
Browse files Browse the repository at this point in the history
  • Loading branch information
rbuehlma committed Aug 10, 2016
1 parent 5f75dad commit 71633c9
Show file tree
Hide file tree
Showing 12 changed files with 198 additions and 127 deletions.
10 changes: 5 additions & 5 deletions CMakeLists.txt
Expand Up @@ -9,18 +9,17 @@ enable_language(CXX)
find_package(Kodi REQUIRED)
find_package(kodiplatform REQUIRED)
find_package(p8-platform REQUIRED)
find_package(JsonCpp REQUIRED)

find_package(YAJL REQUIRED)

include_directories(${kodiplatform_INCLUDE_DIRS}
${p8-platform_INCLUDE_DIRS}
${KODI_INCLUDE_DIR}
${JSONCPP_INCLUDE_DIRS}
${YAJL_INCLUDE_DIR}
${PROJECT_SOURCE_DIR}/lib)

set(DEPLIBS ${kodiplatform_LIBRARIES}
${p8-platform_LIBRARIES}
${JSONCPP_LIBRARIES}
${p8-platform_LIBRARIES}
${YAJL_LIBRARY}
)

set(ZATTOO_SOURCES
Expand All @@ -30,6 +29,7 @@ set(ZATTOO_SOURCES
src/HTTPSocket.cpp
src/client.cpp
src/ZatData.cpp
src/JsonParser.cpp
)

build_addon(pvr.zattoo ZATTOO DEPLIBS)
Expand Down
15 changes: 0 additions & 15 deletions FindJsonCpp.cmake

This file was deleted.

31 changes: 31 additions & 0 deletions FindYAJL.cmake
@@ -0,0 +1,31 @@
# - Find YAJL
# This module finds an installed YAJL package.
#
# It sets the following variables:
# YAJL_FOUND - Set to false, or undefined, if YAJL isn't found.
# YAJL_INCLUDE_DIR - The YAJL include directory.
# YAJL_LIBRARY - The YAJL library to link against.

FIND_PATH(YAJL_INCLUDE_DIR yajl/yajl_gen.h)
FIND_LIBRARY(YAJL_LIBRARY NAMES yajl)

IF (YAJL_INCLUDE_DIR AND YAJL_LIBRARY)
SET(YAJL_FOUND TRUE)
ENDIF (YAJL_INCLUDE_DIR AND YAJL_LIBRARY)

IF (YAJL_FOUND)

# show which YAJL was found only if not quiet
IF (NOT YAJL_FIND_QUIETLY)
MESSAGE(STATUS "Found YAJL: ${YAJL_LIBRARY}")
ENDIF (NOT YAJL_FIND_QUIETLY)

ELSE (YAJL_FOUND)

# fatal error if YAJL is required but not found
IF (YAJL_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find YAJL")
ENDIF (YAJL_FIND_REQUIRED)

ENDIF (YAJL_FOUND)

15 changes: 0 additions & 15 deletions depends/common/jsoncpp/CMakeLists.txt

This file was deleted.

1 change: 0 additions & 1 deletion depends/common/jsoncpp/jsoncpp.txt

This file was deleted.

1 change: 1 addition & 0 deletions depends/common/yajl/yajl.txt
@@ -0,0 +1 @@
yajl https://github.com/lloyd/yajl/archive/2.1.0.tar.gz
74 changes: 74 additions & 0 deletions src/JsonParser.cpp
@@ -0,0 +1,74 @@
#include "JsonParser.h"

#define DEBUG

#ifdef DEBUG
#define D(x) x
#else
#define D(x)
#endif

using namespace std;

yajl_val JsonParser::parse(string jsonString) {
char errbuf[1024];
yajl_val json = yajl_tree_parse(jsonString.c_str(), errbuf, sizeof(errbuf));
if (json == NULL) {
D(cout << "Error parsing json:\n" << jsonString << "\nMessage:\n" << errbuf << "\n");
}
return json;
}

const char** JsonParser::getPath(int path_len, va_list args) {
char** path = new char*[path_len + 1];
for (int i = 0; i < path_len; i++) {
path[i] = va_arg(args, char*);
}
path[path_len] = (char*)0;
return (const char**)path;
}

bool JsonParser::getBoolean(yajl_val json, int path_len, ...) {
va_list args;
va_start(args, path_len);
const char **path = getPath(path_len, args);
bool ret = YAJL_IS_TRUE(yajl_tree_get(json, path, yajl_t_true));
va_end(args);
delete [] path;
return ret;
}

string JsonParser::getString(yajl_val json, int path_len, ...) {
va_list args;
va_start(args, path_len);
const char **path = getPath(path_len, args);
char *str = YAJL_GET_STRING(yajl_tree_get(json, path, yajl_t_string));
va_end(args);
delete [] path;
if (str == NULL) {
return "";
}
return str;
}

int JsonParser::getInt(yajl_val json, int path_len, ...) {
va_list args;
va_start(args, path_len);
const char **path = getPath(path_len, args);
int ret = YAJL_GET_INTEGER(yajl_tree_get(json, path, yajl_t_number));
va_end(args);
delete [] path;
return ret;
}

yajl_val JsonParser::getArray(yajl_val json, int path_len, ...) {
va_list args;
va_start(args, path_len);
const char **path = getPath(path_len, args);
yajl_val ret = yajl_tree_get(json, path, yajl_t_array);
va_end(args);
delete [] path;
return ret;
}


17 changes: 17 additions & 0 deletions src/JsonParser.h
@@ -0,0 +1,17 @@
#include "yajl/yajl_tree.h"
#include <iostream>
#include <stdarg.h>

using namespace std;

class JsonParser
{
public:
static yajl_val parse(string jsonString);
static bool getBoolean(yajl_val json, int path_len, ...);
static string getString(yajl_val json, int path_len, ...);
static int getInt(yajl_val json, int path_len, ...);
static yajl_val getArray(yajl_val json, int path_len, ...);
private:
static const char** getPath(int path_len, va_list args);
};
22 changes: 11 additions & 11 deletions src/Utils.cpp
Expand Up @@ -89,29 +89,29 @@ std::string Utils::ConcatenateStringList(const std::vector<std::string> &list)
return oss.str();
}

int Utils::GetIntFromJsonValue(Json::Value &value, int defaultValue)
int Utils::GetIntFromJsonValue(yajl_val &value, int defaultValue)
{
int iTemp = defaultValue;

// some json responses have have ints formated as strings
if (value.isString())
iTemp = StringToInt(value.asString());
else if (value.isInt())
iTemp = value.asInt();
if (YAJL_IS_STRING(value))
iTemp = StringToInt(YAJL_GET_STRING(value));
else if (YAJL_IS_INTEGER(value))
iTemp = YAJL_GET_INTEGER(value);

return iTemp;
}

double Utils::GetDoubleFromJsonValue(Json::Value &value, double defaultValue)
double Utils::GetDoubleFromJsonValue(yajl_val &value, double defaultValue)
{
double dTemp = defaultValue;

/* some json responses have have doubles formated as strings,
or an expected double is formated as an int */
if (value.isString())
dTemp = StringToDouble(value.asString());
else if (value.isInt() || value.isDouble())
dTemp = value.asDouble();
if (YAJL_IS_STRING(value))
dTemp = StringToDouble(YAJL_GET_STRING(value));
else if (YAJL_IS_INTEGER(value) || YAJL_IS_DOUBLE(value))
dTemp = YAJL_GET_DOUBLE(value);

return dTemp;
}
}
9 changes: 4 additions & 5 deletions src/Utils.h
Expand Up @@ -25,8 +25,7 @@
#include <sstream>
#include <string>
#include <vector>

#include <json/json.h>
#include "yajl/yajl_tree.h"

class Utils
{
Expand All @@ -36,8 +35,8 @@ class Utils
static double StringToDouble(const std::string &value);
static int StringToInt(const std::string &value);
static std::string ConcatenateStringList(const std::vector<std::string> &list);
static int GetIntFromJsonValue(Json::Value &value, int defaultValue = 0);
static double GetDoubleFromJsonValue(Json::Value &value, double defaultValue = 0);
static int GetIntFromJsonValue(yajl_val &value, int defaultValue = 0);
static double GetDoubleFromJsonValue(yajl_val &value, double defaultValue = 0);

template<typename T> static std::string ToString(const T &value)
{
Expand All @@ -50,4 +49,4 @@ class Utils
{
value1.insert(value1.end(), value2.begin(), value2.end());
}
};
};

0 comments on commit 71633c9

Please sign in to comment.