#include <sys/un.h>
#include <pthread.h>
-#include "json.h"
+#include <cx/json.h>
+
#include "utils.h"
#include "settings.h"
#include "playlist.h"
#define PLAYER_POLL_TIMEOUT 500
#define PLAYER_IN_BUFSIZE 8192
-static void json_print(JSONValue *value, char *name, int indent);
+static void json_print(CxJsonValue *value, char *name, int indent);
static void* start_player(void *data);
static void player_io(Player *p);
-static void handle_json_rpc_msg(Player *player, JSONValue *v);
-static void handle_json_rpc_reqid(Player *player, JSONValue *v, int reqid);
-static void handle_json_rpc_event(Player *player, JSONValue *v, JSONValue *event);
+static void handle_json_rpc_msg(Player *player, CxJsonValue *v);
+static void handle_json_rpc_reqid(Player *player, CxJsonValue *v, int reqid);
+static void handle_json_rpc_event(Player *player, CxJsonValue *v, CxJsonValue *event);
+
+static int json_strcmp(CxJsonValue *value, const char *str) {
+ if(value->type != CX_JSON_STRING) return 1;
+ return cx_strcmp(value->value.string, str);
+}
void PlayerOpenFile(MainWindow *win) {
pthread_t tid;
fds[1].fd = p->log;
fds[1].events = POLLIN;
fds[1].revents = 0;
- JSONParser *js = json_parser_new();
+ CxJson js;
+ cxJsonInit(&js, NULL);
char buf[PLAYER_IN_BUFSIZE];
while(p->isactive && (poll(fds, 2, PLAYER_POLL_TIMEOUT) >= 0)) {
}
//fwrite(buf, 1, r, stdout);
//fflush(stdout);
- json_parser_fill(js, buf, r);
+ cxJsonFilln(&js, buf, r);
- JSONValue *value;
+ CxJsonValue *value;
int ret;
- while((ret = json_read_value(js, &value)) == 1) {
+ while((ret = cxJsonNext(&js, &value)) == CX_JSON_NO_ERROR) {
handle_json_rpc_msg(p, value);
- json_value_free(value);
+ cxJsonValueFree(value);
}
if(ret == -1) {
printf("PlayerEnd: %s\n", strerror(errno));
fflush(stdout);
+
+ cxJsonDestroy(&js);
}
-static void handle_json_rpc_msg(Player *player, JSONValue *v) {
- if(v->type != JSON_OBJECT) return;
+static void handle_json_rpc_msg(Player *player, CxJsonValue *v) {
+ if(v->type != CX_JSON_OBJECT) return;
- JSONValue *request_id_v = json_obj_get(&v->value.object, "request_id");
- JSONValue *event = NULL;
- if(request_id_v && request_id_v->type == JSON_STRING) {
+ CxJsonValue *request_id_v = cxJsonObjGet(v, "request_id");
+ CxJsonValue *event = NULL;
+ if(request_id_v && request_id_v->type == CX_JSON_STRING) {
int request_id = 0;
if(request_id_v->value.string.length == 2) {
- request_id = 10 * (request_id_v->value.string.string[0] - '0') + (request_id_v->value.string.string[1] - '0');
+ request_id = 10 * (request_id_v->value.string.ptr[0] - '0') + (request_id_v->value.string.ptr[1] - '0');
handle_json_rpc_reqid(player, v, request_id);
return;
}
- } else if ((event = json_obj_get(&v->value.object, "event")) != NULL) {
+ } else if ((event = cxJsonObjGet(v, "event")) != NULL) {
handle_json_rpc_event(player, v, event);
}
}
}
-static void handle_json_rpc_reqid(Player *player, JSONValue *v, int reqid) {
- JSONValue *data = json_obj_get(&v->value.object, "data");
+static void handle_json_rpc_reqid(Player *player, CxJsonValue *v, int reqid) {
+ CxJsonValue *data = cxJsonObjGet(v, "data");
if(!data) return;
switch(reqid) {
case REQ_ID_PLAYBACK_TIME_INT: {
- if(data->type == JSON_NUMBER) {
- player->playback_time = data->value.number.value;
+ if(data->type == CX_JSON_NUMBER) {
+ player->playback_time = data->value.number;
}
break;
}
case REQ_ID_WIDTH_INT: {
- if(data->type == JSON_INTEGER) {
- player_set_size(player, data->value.integer.value, -1);
+ if(data->type == CX_JSON_INTEGER) {
+ player_set_size(player, data->value.integer, -1);
}
break;
}
case REQ_ID_HEIGHT_INT: {
- if(data->type == JSON_INTEGER) {
- player_set_size(player, -1, data->value.integer.value);
+ if(data->type == CX_JSON_INTEGER) {
+ player_set_size(player, -1, data->value.integer);
}
break;
}
}
}
-static void handle_json_rpc_event(Player *p, JSONValue *v, JSONValue *event) {
+static void handle_json_rpc_event(Player *p, CxJsonValue *v, CxJsonValue *event) {
if(!json_strcmp(event, "property-change")) {
- JSONValue *name = json_obj_get(&v->value.object, "name");
- JSONValue *data = json_obj_get(&v->value.object, "data");
+ CxJsonValue *name = cxJsonObjGet(v, "name");
+ CxJsonValue *data = cxJsonObjGet(v, "data");
if(!json_strcmp(name, "playback-time")) {
- if(data && data->type == JSON_NUMBER) {
- p->playback_time = data->value.number.value;
+ if(data && data->type == CX_JSON_NUMBER) {
+ p->playback_time = data->value.number;
//printf("playback-time: %f\n", p->playback_time);
check_hide_cursor(p);
}
} else if(!json_strcmp(name, "eof-reached")) {
- if(data && data->type == JSON_LITERAL && data->value.literal.literal == JSON_TRUE) {
+ if(data && data->type == CX_JSON_LITERAL && data->value.literal == CX_JSON_TRUE) {
PlayerEOF(p);
}
} else if(!json_strcmp(name, "osd-height")) {
- if(data->type == JSON_NUMBER) {
- p->osd_height = data->value.number.value;
+ if(data->type == CX_JSON_NUMBER) {
+ p->osd_height = data->value.number;
}
}
} else if(!p->isstarted && !json_strcmp(event, "playback-restart")) {
}
-static void json_print(JSONValue *value, char *name, int indent) {
+static void json_print(CxJsonValue *value, char *name, int indent) {
if(name) {
printf("%*s%s: ", indent*4, "", name);
} else {
switch(value->type) {
- case JSON_OBJECT: {
+ case CX_JSON_OBJECT: {
printf("{\n");
- for(int i=0;i<value->value.object.size;i++) {
- JSONObjValue val = value->value.object.values[i];
- json_print(val.value, val.name, indent+1);
- if(i+1 < value->value.object.size) {
+ for(int i=0;i<value->value.object.values_size;i++) {
+ CxJsonObjValue val = value->value.object.values[i];
+ json_print(val.value, val.name.ptr, indent+1);
+ if(i+1 < value->value.object.values_size) {
printf(",\n");
} else {
printf("\n");
printf("%*s}", indent*4, "");
break;
}
- case JSON_ARRAY: {
+ case CX_JSON_ARRAY: {
printf("[\n");
- for(int i=0;i<value->value.object.size;i++) {
- JSONValue *v = value->value.array.array[i];
+ for(int i=0;i<value->value.array.array_size;i++) {
+ CxJsonValue *v = value->value.array.array[i];
json_print(v, NULL, indent+1);
- if(i+1 < value->value.array.size) {
+ if(i+1 < value->value.array.array_size) {
printf(",\n");
} else {
printf("\n");
printf("%*s]", indent*4, "");
break;
}
- case JSON_STRING: {
- printf("\"%s\"", value->value.string.string);
+ case CX_JSON_STRING: {
+ printf("\"%.*s\"", (int)value->value.string.length, value->value.string.ptr);
break;
}
- case JSON_INTEGER: {
- printf("%i", (int)value->value.integer.value);
+ case CX_JSON_INTEGER: {
+ printf("%i", (int)value->value.integer);
break;
}
- case JSON_NUMBER: {
- printf("%f", value->value.number.value);
+ case CX_JSON_NUMBER: {
+ printf("%f", (float)value->value.number);
break;
}
- case JSON_LITERAL: {
+ case CX_JSON_LITERAL: {
char *lit = "NULL";
- switch(value->value.literal.literal) {
- case JSON_NULL: break;
- case JSON_TRUE: lit = "true"; break;
- case JSON_FALSE: lit = "false"; break;
+ switch(value->value.literal) {
+ case CX_JSON_NULL: break;
+ case CX_JSON_TRUE: lit = "true"; break;
+ case CX_JSON_FALSE: lit = "false"; break;
}
printf("%s\n", lit);
break;
#include "main.h"
#include "utils.h"
-#include "json.h"
#include "window.h"
#include "playlist.h"
#include <cx/buffer.h>
#include <cx/streams.h>
#include <cx/printf.h>
+#include <cx/json.h>
#define CONFIG_BASE_DIR ".config"
#define UWP_CONFIG_DIR "uwplayer"
/*
* root json config object
*/
-static JSONObject *uwp_config;
+static CxJsonValue *uwp_config;
/*
* global settings from json config converted to key/value pairs
int ret = 0;
if(cfgfile) {
- JSONParser *parser = json_parser_new();
+ CxJson parser;
+ cxJsonInit(&parser, NULL);
- JSONValue *value = NULL;
+ CxJsonValue *value = NULL;
char buf[JS_READ_BUFSIZE];
size_t r;
- while((ret = json_read_value(parser, &value)) >= 0) {
- if(ret == 0) {
- r = fread(buf, 1, JS_READ_BUFSIZE, cfgfile);
- if(r == 0) {
- break;
- }
- json_parser_fill(parser, buf, r);
- } else {
+ while((ret = cxJsonNext(&parser, &value)) == CX_JSON_INCOMPLETE_DATA) {
+ r = fread(buf, 1, JS_READ_BUFSIZE, cfgfile);
+ if(r == 0) {
break;
}
+ cxJsonFilln(&parser, buf, r);
}
- json_parser_free(parser);
+ cxJsonDestroy(&parser);
if(value) {
- if(value->type == JSON_OBJECT) {
+ if(value->type == CX_JSON_OBJECT) {
ret = 0;
- uwp_config = &value->value.object;
+ uwp_config = value;
conf_load_global_settings();
} else {
ret = 1;
}
static void conf_load_global_settings(void) {
- JSONValue *settings = json_obj_get(uwp_config, "settings");
+ CxJsonValue *settings = cxJsonObjGet(uwp_config, "settings");
if(!settings) {
return;
}
- if(settings->type != JSON_OBJECT) {
+ if(settings->type != CX_JSON_OBJECT) {
fprintf(stderr, "Warning: 'settings' not an object\n");
return;
}
- JSONObject *s = &settings->value.object;
+ CxJsonObject *s = &settings->value.object;
- for(size_t i=0;i<s->size;i++) {
- JSONObjValue *gs = &s->values[i];
- if(gs->value->type == JSON_STRING) {
- cxMapPut(uwp_settings, cx_hash_key_str(gs->name), strdup(gs->value->value.string.string));
+ for(size_t i=0;i<s->values_size;i++) {
+ CxJsonObjValue *gs = &s->values[i];
+ if(gs->value->type == CX_JSON_STRING) {
+ cxMapPut(uwp_settings, gs->name, cx_strdup(gs->value->value.string).ptr);
}
}
}