You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.5 KiB
125 lines
3.5 KiB
/*****************************************************************************
|
|
* json_helper.h:
|
|
*****************************************************************************
|
|
* Copyright (C) 2012-2019 VLC authors, VideoLabs and VideoLAN
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
#ifndef JSON_HELPER_H
|
|
#define JSON_HELPER_H
|
|
|
|
#include <vlc_common.h>
|
|
#include <vlc_stream.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include "json.h"
|
|
|
|
static inline
|
|
const json_value * json_getbyname(const json_value *object, const char *psz_name)
|
|
{
|
|
if (object->type != json_object) return NULL;
|
|
for (unsigned int i=0; i < object->u.object.length; i++)
|
|
if (strcmp(object->u.object.values[i].name, psz_name) == 0)
|
|
return object->u.object.values[i].value;
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
char * jsongetstring(const json_value *node, const char *key)
|
|
{
|
|
node = json_getbyname(node, key);
|
|
if (node && node->type == json_string)
|
|
return node->u.string.ptr;
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
char * json_dupstring(const json_value *node, const char *key)
|
|
{
|
|
const char *str = jsongetstring(node, key);
|
|
return (str) ? strdup(str) : NULL;
|
|
}
|
|
|
|
static inline
|
|
json_value * json_parse_document(vlc_object_t *p_obj, const char *psz_buffer)
|
|
{
|
|
json_settings settings;
|
|
char psz_error[128];
|
|
memset (&settings, 0, sizeof (json_settings));
|
|
json_value *root = json_parse_ex(&settings, psz_buffer, psz_error);
|
|
if (root == NULL)
|
|
{
|
|
msg_Warn(p_obj, "Can't parse json data: %s", psz_error);
|
|
goto error;
|
|
}
|
|
if (root->type != json_object)
|
|
{
|
|
msg_Warn(p_obj, "wrong json root node");
|
|
goto error;
|
|
}
|
|
|
|
return root;
|
|
|
|
error:
|
|
if (root) json_value_free(root);
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
void * json_retrieve_document(vlc_object_t *p_obj, const char *psz_url)
|
|
{
|
|
bool saved_no_interact = p_obj->no_interact;
|
|
p_obj->no_interact = true;
|
|
stream_t *p_stream = vlc_stream_NewURL(p_obj, psz_url);
|
|
|
|
p_obj->no_interact = saved_no_interact;
|
|
if (p_stream == NULL)
|
|
return NULL;
|
|
|
|
stream_t *p_chain = vlc_stream_FilterNew(p_stream, "inflate");
|
|
if(p_chain)
|
|
p_stream = p_chain;
|
|
|
|
/* read answer */
|
|
char *p_buffer = NULL;
|
|
int i_ret = 0;
|
|
for(;;)
|
|
{
|
|
int i_read = 65536;
|
|
|
|
if(i_ret >= INT_MAX - i_read)
|
|
break;
|
|
|
|
p_buffer = realloc_or_free(p_buffer, 1 + i_ret + i_read);
|
|
if(unlikely(p_buffer == NULL))
|
|
{
|
|
vlc_stream_Delete(p_stream);
|
|
return NULL;
|
|
}
|
|
|
|
i_read = vlc_stream_Read(p_stream, &p_buffer[i_ret], i_read);
|
|
if(i_read <= 0)
|
|
break;
|
|
|
|
i_ret += i_read;
|
|
}
|
|
vlc_stream_Delete(p_stream);
|
|
p_buffer[i_ret] = 0;
|
|
|
|
return p_buffer;
|
|
}
|
|
|
|
#endif
|
|
|