Exemple #1
1
// Parse a json object, a json object stripped of {} or an json array
// stripped of [] into a JsonNode.
JsonNode *glib_jsonrpc_json_string_to_json_node(const gchar *str)
{
  JsonParser *parser = json_parser_new();
  GError *error;

  // First try to parse the string
  if (!json_parser_load_from_data(parser, str, -1, &error))
    {
      // Wrap it in a { } pair and try again.
      g_error_free(error); error = NULL;
      GString *j_str = g_string_new("");
      g_string_append_printf(j_str, "{%s}", str);

      // Try parsing it as an object
      if (!json_parser_load_from_data(parser, j_str->str, -1, &error))
        {
          // Still fail, try to parse it as an array
          g_string_free(j_str, TRUE);
          g_string_append_printf(j_str, "[%s]", str);
          if (!json_parser_load_from_data(parser, j_str->str, -1, &error))
            {
              // That's it, we give up.
              g_object_unref(parser);
              return NULL;
            }
        }
    }

  JsonNode *node = json_node_copy(json_parser_get_root(parser));
  g_object_unref(parser);
  return node;
}
gboolean
twitter_user_list_load_from_data (TwitterUserList  *user_list,
                                 const gchar       *buffer,
                                 GError           **error)
{
  JsonParser *parser;
  GError *parse_error;
  gboolean retval = TRUE;

  g_return_val_if_fail (TWITTER_IS_USER_LIST (user_list), FALSE);
  g_return_val_if_fail (buffer != NULL, FALSE);

  twitter_user_list_clean (user_list);

  parser = json_parser_new ();
  parse_error = NULL;
  json_parser_load_from_data (parser, buffer, -1, &parse_error);
  if (parse_error)
    {
      g_set_error (error, TWITTER_ERROR,
                   TWITTER_ERROR_PARSE_ERROR,
                   "Parse error (%s)",
                   parse_error->message);
      g_error_free (parse_error);

      retval = FALSE;
    }
  else
    twitter_user_list_build (user_list, json_parser_get_root (parser));

  g_object_unref (parser);

  return retval;
}
/*!
 * Convert a JSON file into a tree of nodes.
 *
 * \param[out] node Tree representation of \p filename.
 * \param filename Absolute path to JSON file to parse.
 *
 * \return \c true on success, else \c false.
 */
bool
clr_oci_json_parse (GNode** node, const gchar* filename) {
	bool result = false;
	GError* error = NULL;
	JsonParser* parser = NULL;
	JsonNode *root = NULL;

	if ((!node) || (!filename) || (!(*filename))) {
		return false;
	}

	parser = json_parser_new();
	if (! json_parser_load_from_file(parser, filename, &error)) {
		g_debug("unable to parse '%s'", filename);
		if (error) {
			g_debug("Error parsing '%s': %s", filename, error->message);
			g_error_free(error);
		}
		goto exit;
	}

	root = json_parser_get_root (parser);
	if (! root) {
		goto exit;
	}

	*node = g_node_new(g_strdup(filename));
	clr_oci_json_parse_aux(root, *node, false);

	result = true;

exit:
	g_object_unref(parser);
	return result;
}
static GHashTable* toHashTable(std::string msg)
{
    g_print("toHashTable\n");
    JsonParser *parser;
    GError *error = NULL;

    parser = json_parser_new ();

    GHashTable *map = g_hash_table_new(g_str_hash, g_str_equal);

    if (json_parser_load_from_data (parser, msg.c_str(), -1, &error))
    {
        JsonNode *root;
        JsonObject *object;

        g_assert (NULL != json_parser_get_root (parser));

        root = json_parser_get_root (parser);
        if (JSON_NODE_TYPE (root) == JSON_NODE_OBJECT)
        {
            object = json_node_get_object (root);
            g_assert (object != NULL);

            json_object_foreach_member(object, parseMembers, map);
        }
    }
    else
    {
        g_error_free (error);
    }
    g_object_unref (parser);

    return map;
}
Exemple #5
0
static void
got_user_cb (RestProxyCall *call,
             const GError  *error,
             GObject       *weak_object,
             gpointer       userdata)
{
  SwService *service = SW_SERVICE (weak_object);
  SwServiceMySpace *myspace = SW_SERVICE_MYSPACE (service);
  JsonParser *parser = NULL;
  JsonNode *node;

  if (error) {
    g_message ("Error: %s", error->message);
    return;
  }

  parser = json_parser_new ();
  node = node_from_call (call, parser);
  if (node == NULL)
    return;

  construct_user_data (myspace, node);

  g_object_unref (node);
  g_object_unref (parser);

  sw_service_emit_capabilities_changed (service, get_dynamic_caps (service));
}
TwitterUserList *
twitter_user_list_new_from_data (const gchar *buffer)
{
  TwitterUserList *retval;
  JsonParser *parser;
  GError *parse_error;

  g_return_val_if_fail (buffer != NULL, NULL);

  retval = twitter_user_list_new ();

  parser = json_parser_new ();
  parse_error = NULL;
  json_parser_load_from_data (parser, buffer, -1, &parse_error);
  if (parse_error)
    {
      g_warning ("Unable to parse data into a user list: %s",
                 parse_error->message);
      g_error_free (parse_error);
    }
  else
    twitter_user_list_build (retval, json_parser_get_root (parser));

  g_object_unref (parser);

  return retval;
}
Exemple #7
0
static void
on_web_socket_message(SoupWebsocketConnection *ws,
                      SoupWebsocketDataType type,
                      GBytes *message,
                      void *user_data)
{
	const gchar *data;
	gsize len;

	data = g_bytes_get_data (message, &len);
	imgflo_debug("RECV: %.*s\n", (int)len, data);

    JsonParser *parser = json_parser_new();
    gboolean success = json_parser_load_from_data(parser, data, len, NULL);
    if (success) {
        JsonNode *r = json_parser_get_root(parser);
        g_assert(JSON_NODE_HOLDS_OBJECT(r));
        JsonObject *root = json_node_get_object(r);

        const gchar *protocol = json_object_get_string_member(root, "protocol");
        const gchar *command = json_object_get_string_member(root, "command");

        JsonNode *pnode = json_object_get_member(root, "payload");
        JsonObject *payload = JSON_NODE_HOLDS_OBJECT(pnode) ? json_object_get_object_member(root, "payload") : NULL;

        UiConnection *ui = (UiConnection *)user_data;
        ui_connection_handle_message(ui, protocol, command, payload, ws);

    } else {
        imgflo_warning("Unable to parse WebSocket message as JSON");
    }

    g_object_unref(parser);
}
Exemple #8
0
void
twitter_status_load_from_data (TwitterStatus *status,
                               const gchar   *buffer)
{
  JsonParser *parser;
  GError *parse_error;

  g_return_if_fail (TWITTER_IS_STATUS (status));
  g_return_if_fail (buffer != NULL);

  twitter_status_clean (status);

  parser = json_parser_new ();
  parse_error = NULL;
  json_parser_load_from_data (parser, buffer, -1, &parse_error);
  if (parse_error)
    {
      g_warning ("Unable to parse data into a status: %s",
                 parse_error->message);
      g_error_free (parse_error);
    }
  else
    twitter_status_build (status, json_parser_get_root (parser));

  g_object_unref (parser);
}
struct json_rpc_tt *json_rpc_tt_tcp_new(struct json_rpc *jr, struct bufevent *bufev, everrcb ecb, void *arg)
{
	struct json_rpc_tt *jt = json_rpc_tt_new(jr);
	if (jt == NULL)
		return NULL;

	struct jrpc_bufevent *jb = (struct jrpc_bufevent *)malloc(sizeof(struct jrpc_bufevent));
	if (jb == NULL) {
		free(jt);
		return NULL;
	}

	struct json_parser *jp = json_parser_new(json_objectcb, json_errorcb, jt);
	if (jp == NULL) {
		free(jb);
		free(jt);
		return NULL;
	}

	jb->bufev = bufev;
	jb->jp = jp;
	jb->err_cb = ecb;
	jb->cb_arg = arg;

	jt->impl = jb;
	jt->free = tt_bufevent_free;
	jt->write = tt_bufevent_write;

	bufevent_setcb(bufev, bufevent_readcb, NULL, bufevent_errorcb, jt);

	return jt;
}
static void
pb_process_frame(PushBulletAccount *pba, const gchar *frame)
{
	JsonParser *parser = json_parser_new();
	JsonNode *root;
	
	purple_debug_info("pushbullet", "got frame data: %s\n", frame);
	
	if (!json_parser_load_from_data(parser, frame, -1, NULL))
	{
		purple_debug_error("pushbullet", "Error parsing response: %s\n", frame);
		return;
	}
	
	root = json_parser_get_root(parser);
	
	if (root != NULL) {
		JsonObject *message = json_node_get_object(root);
		const gchar *type = json_object_get_string_member(message, "type");
		if (purple_strequal(type, "tickle")) {
			pb_get_everything_since(pba, purple_account_get_int(pba->account, "last_message_timestamp", 0));
		} else if (purple_strequal(type, "push")) {
			JsonObject *push = json_object_get_object_member(message, "push");
			//{"type":"push","targets":["stream","android","ios"],"push":{"guid":"purple6e94d282","type":"messaging_extension_reply","package_name":"com.pushbullet.android","target_device_iden":"uffvytgsjAoIRwhIL6","conversation_iden":"+6421478252","message":"test2"}}
			//{"type":"push","targets":["stream"],"push":{"type":"sms_changed"}}
			type = json_object_get_string_member(push, "type");
			if (purple_strequal(type, "sms_changed")) {
				pb_get_phone_threads(pba, NULL);
			}
		}
	}
	
	g_object_unref(parser);
}
static void
gb_project_format_real_open_async (GbProjectFormat     *format,
                                   const gchar         *directory,
                                   GInputStream        *stream,
                                   GCancellable        *cancellable,
                                   GAsyncReadyCallback  callback,
                                   gpointer             user_data)
{
   GSimpleAsyncResult *simple;
   JsonParser *parser;

   ENTRY;

   simple = g_simple_async_result_new(G_OBJECT(format), callback, user_data,
                                      gb_project_format_real_open_async);
   g_object_set_data_full(G_OBJECT(simple), "directory",
                          g_strdup(directory), g_free);

   parser = json_parser_new();
   json_parser_load_from_stream_async(parser, stream, cancellable,
                                      gb_project_format_real_open_cb,
                                      simple);
   g_object_unref(parser);

   EXIT;
}
static void utc_libjson_json_parser_has_assignment_func_04(void)
{
	JsonParser *parser = NULL; 
	GError *error = NULL; 
	gboolean ret = FALSE;
	gchar *var = NULL; 
	int i = 0;

	parser = json_parser_new ();  
	g_assert (JSON_IS_PARSER (parser));

	for (i = 0; i < n_test_assignments; i++)
	{
		error = NULL;
		if (!json_parser_load_from_data (parser, test_assignments[i].str, -1, &error))
		{
			g_error_free (error);
		}
		else
		{
			ret = json_parser_has_assignment (parser, &var);
			dts_check_eq("json_parser_has_assignment", ret, TRUE);
			dts_check_ne("json_parser_has_assignment", var, NULL);
			dts_check_str_eq ("json_parser_has_assignment", var, test_assignments[i].var);
		}
	}
	dts_pass("json_parser_has_assignment", "pass");
	g_object_unref (parser);
}
static void
search_response_cb (SoupSession *session, SoupMessage *msg, RBPodcastSearchITunes *search)
{
	JsonParser *parser;
	GError *error = NULL;
	int code;

	g_object_get (msg, SOUP_MESSAGE_STATUS_CODE, &code, NULL);
	if (code != 200) {
		char *reason;

		g_object_get (msg, SOUP_MESSAGE_REASON_PHRASE, &reason, NULL);
		rb_debug ("search request failed: %s", reason);
		g_free (reason);
		rb_podcast_search_finished (RB_PODCAST_SEARCH (search), FALSE);
		return;
	}

	if (msg->response_body->data == NULL) {
		rb_debug ("no response data");
		rb_podcast_search_finished (RB_PODCAST_SEARCH (search), TRUE);
		return;
	}

	parser = json_parser_new ();
	if (json_parser_load_from_data (parser, msg->response_body->data, msg->response_body->length, &error)) {
		process_results (search, parser);
	} else {
		rb_debug ("unable to parse response data: %s", error->message);
		g_clear_error (&error);
	}

	g_object_unref (parser);
	rb_podcast_search_finished (RB_PODCAST_SEARCH (search), TRUE);
}
/* grl.lua.json.string_to_table
 *
 * @json_str: (string) A Json object as a string.
 *
 * @return: All json content as a table.
 */
static gint
grl_json_parse_string (lua_State *L)
{
  JsonParser *parser = NULL;
  JsonReader *reader = NULL;
  const gchar *json_str = NULL;
  GError *err = NULL;

  luaL_argcheck (L, lua_isstring (L, 1), 1, "json string expected");
  json_str = lua_tostring (L, 1);

  parser = json_parser_new ();
  if (!json_parser_load_from_data (parser, json_str, -1, &err)) {
    GRL_DEBUG ("Can't parse json string: '%s'", err->message);
    g_error_free (err);
    g_object_unref (parser);
    return 0;
  }

  reader = json_reader_new (json_parser_get_root (parser));

  /* The return of recursive function will be a table with all
   * json content in it */
  lua_pushnil (L);
  build_table_from_json_reader (L, reader);

  g_object_unref (reader);
  g_object_unref (parser);

  return 1;
}
Exemple #15
0
static JsonNode *
postal_http_parse_body (SoupMessage  *message,
                        GError      **error)
{
   JsonParser *p;
   JsonNode *ret;

   g_assert(SOUP_IS_MESSAGE(message));

   p = json_parser_new();

   if (!json_parser_load_from_data(p,
                                   message->request_body->data,
                                   message->request_body->length,
                                   error)) {
      g_object_unref(p);
      return NULL;
   }

   if ((ret = json_parser_get_root(p))) {
      ret = json_node_copy(ret);
   }

   g_object_unref(p);

   if (!ret) {
      g_set_error(error,
                  postal_json_error_quark(),
                  0,
                  "Missing JSON payload.");
   }

   return ret;
}
Exemple #16
0
static GType
json_op_register_type_for_file (GTypeModule *type_module, const gchar *filepath)
{
    GType ret = 0;
    GError *error = NULL;
    JsonParser *parser = json_parser_new();
    const gboolean success = json_parser_load_from_file(parser, filepath, &error);

    if (success) {
        JsonNode *root_node = json_node_copy (json_parser_get_root (parser));
        JsonObject *root = json_node_get_object (root_node);
        const gchar *name;
        gchar *type_name;

        g_assert(root_node);

        name = metadata_get_property(root, "name");
        type_name = (name) ? component2gtypename(name) : component2gtypename(filepath);
        ret = json_op_register_type(type_module, type_name, root);
        g_free(type_name);
    }

//    g_object_unref(parser);
    return ret;
}
Exemple #17
0
gchar *
get_value (gchar *data, gchar *key)
{
    JsonParser *parser = json_parser_new ();
    JsonReader *reader = json_reader_new (NULL);
    GError *error = NULL;
    gchar *val = NULL;

    json_parser_load_from_data (parser, data, -1, &error);
    if (error) {
        g_error_free (error);
        goto out;
    }

    json_reader_set_root (reader, json_parser_get_root (parser));
    if (!json_reader_is_object (reader)) {
        goto out;
    }

    json_reader_read_member (reader, key);
    val = g_strdup (json_reader_get_string_value (reader));
    json_reader_end_member (reader);
out:
    g_object_unref (parser);
    g_object_unref (reader);

    return val;
}
/**
 * gfbgraph_connectable_default_parse_connected_data:
 * @self: a #GFBGraphConnectable.
 * @payload: a const #gchar with the response string from the Facebook Graph API.
 * @error: (allow-none): a #GError or %NULL.
 *
 * In most cases, #GFBGraphConnectable implementers can use this function in order to parse
 * the response when a gfbgraph_node_get_connection_nodes() is executed and the
 * gfbgraph_connectable_parse_connected_data() was called.
 *
 * Normally, Facebook Graph API returns the connections in the same way, using JSON objects,
 * with a root object called "data".
 *
 * Returns: (element-type GFBGraphNode) (transfer full): a newly-allocated #GList of #GFBGraphNode with the same #GType as @self.
 **/
GList*
gfbgraph_connectable_default_parse_connected_data (GFBGraphConnectable *self, const gchar *payload, GError **error)
{
        GList *nodes_list = NULL;
        JsonParser *jparser;
        GType node_type;

        node_type = G_OBJECT_TYPE (self);

        jparser = json_parser_new ();
        if (json_parser_load_from_data (jparser, payload, -1, error)) {
                JsonNode *root_jnode;
                JsonObject *main_jobject;
                JsonArray *nodes_jarray;
                int i = 0;

                root_jnode = json_parser_get_root (jparser);
                main_jobject = json_node_get_object (root_jnode);
                nodes_jarray = json_object_get_array_member (main_jobject, "data");
                for (i = 0; i < json_array_get_length (nodes_jarray); i++) {
                        JsonNode *jnode;
                        GFBGraphNode *node;

                        jnode = json_array_get_element (nodes_jarray, i);
                        node = GFBGRAPH_NODE (json_gobject_deserialize (node_type, jnode));
                        nodes_list = g_list_append (nodes_list, node);
                }
        }

        g_clear_object (&jparser);

        return nodes_list;
}
Exemple #19
0
static void
test_invalid_array (gconstpointer user_data)
{
  const char *json = user_data;
  GError *error = NULL;
  JsonParser *parser;
  gboolean res;

  parser = json_parser_new ();
  g_assert (JSON_IS_PARSER (parser));

  if (g_test_verbose ())
    g_print ("invalid data: '%s'...", json);

  res = json_parser_load_from_data (parser, json, -1, &error);

  g_assert (!res);
  g_assert (error != NULL);

  if (g_test_verbose ())
    g_print ("expected error: %s\n", error->message);

  g_clear_error (&error);

  g_object_unref (parser);
}
static void
on_message (FridaScript * script,
            const gchar * message,
            GBytes * data,
            gpointer user_data)
{
  JsonParser * parser;
  JsonObject * root;
  const gchar * type;

  parser = json_parser_new ();
  json_parser_load_from_data (parser, message, -1, NULL);
  root = json_node_get_object (json_parser_get_root (parser));

  type = json_object_get_string_member (root, "type");
  if (strcmp (type, "log") == 0)
  {
    const gchar * log_message;

    log_message = json_object_get_string_member (root, "payload");
    g_print ("%s\n", log_message);
  }
  else
  {
    g_print ("on_message: %s\n", message);
  }

  g_object_unref (parser);
}
static void
_got_login_data (RestProxyCall *call,
                 const GError  *error,
                 GObject       *weak_object,
                 gpointer       userdata)
{
  SwService *service = SW_SERVICE (weak_object);
  SwServicePlurk *plurk = SW_SERVICE_PLURK (service);
  JsonParser *parser = NULL;
  JsonNode *root;

  if (error) {
    // TODO sanity_check_date (call);
    g_message ("Error: %s", error->message);

    plurk->priv->credentials = CREDS_INVALID;
    sw_service_emit_capabilities_changed (service, get_dynamic_caps (service));

    return;
  }

  plurk->priv->credentials = CREDS_VALID;

  parser = json_parser_new ();
  root = node_from_call (call, parser);
  construct_user_data (plurk, root);
  g_object_unref (root);

  sw_service_emit_capabilities_changed (service, get_dynamic_caps (service));

  g_object_unref (call);
}
/**
 * @brief Positive test case of json_parser_new()
 */
static void utc_libjson_json_parser_new_func_01(void)
{
	JsonParser *parser = NULL;  

  	parser = json_parser_new ();
	dts_check_ne("json_parser_new", parser, NULL);
	g_object_unref (parser);
}
Exemple #23
0
static FBContext *fb_api_init()
{
  FBContext *ctx = (FBContext*)g_malloc0(sizeof(FBContext));
  ctx->curl_ctx = curl_easy_init();
  ctx->errmsg = g_string_new("");
  ctx->json_parser = json_parser_new();
  return ctx;
}
/*!
 * Check a QMP "execute" response message.
 *
 * \param result Response from server.
 * \param bytes Size of \p result.
 * \param expect_empty \c true if the result is expected to be an
 *   empty json message, else \c false.
 *
 * \warning FIXME: no validation performed on non-empty QMP messages yet.
 *
 * \return \c true on success, else \c false.
 */
static gboolean
clr_oci_qmp_check_result (const char *result, gsize bytes,
		gboolean expect_empty)
{
	gboolean      ret;
	JsonParser   *parser = NULL;
	JsonReader   *reader = NULL;
	GError       *error = NULL;
	gint          count = 0;

	g_assert (result);

	parser = json_parser_new ();
	reader = json_reader_new (NULL);

	ret = json_parser_load_from_data (parser, result,
			(gssize)bytes, &error);
	if (! ret) {
		g_critical ("failed to check qmp response: %s",
				error->message);
		g_error_free (error);

		goto out;
	}

	json_reader_set_root (reader, json_parser_get_root (parser));

	ret = json_reader_read_member (reader, "return");
	if (! ret) {
		goto out;
	}

	ret = json_reader_is_object (reader);
	if (! ret) {
		goto out;
	}

	count = json_reader_count_members (reader);
	if (count && expect_empty) {
		g_critical ("expected empty object denoting success, "
				"but found %d members", count);
		goto out;
	}

	ret = true;

out:
	if (reader) {
		json_reader_end_member (reader);
		g_object_unref (reader);
	}

	if (parser) {
		g_object_unref (parser);
	}

	return ret;
}
Exemple #25
0
gsweb_t json_parse_gsweb() {
    JsonParser *parser;
    JsonNode *root;
    JsonReader *reader;
    GError *error;
    int array_size = 0;
    const char * tmp;
    gsweb_t ret;
    memset(&ret, 0, sizeof(ret));

    g_type_init();

    parser = json_parser_new();
    error = NULL;
    json_parser_load_from_file(parser, GTMPFILE, &error);
    if (error)
    {
        g_error_free(error);
        g_object_unref(parser);
        ret.success = 2;
        return ret;
    }
    root = json_parser_get_root(parser);
    reader = json_reader_new(root);

    json_reader_read_member (reader, "responseData");
    json_reader_read_member (reader, "results");
    array_size = json_reader_count_elements(reader);
    if (array_size > 0) {
        json_reader_read_element (reader, 0);

        json_reader_read_member (reader, "unescapedUrl");
        tmp = json_reader_get_string_value (reader);
        strncpy(ret.url, tmp, (strlen(tmp) < BUFF_SIZE)?strlen(tmp):BUFF_SIZE);
        json_reader_end_member (reader);

        json_reader_read_member (reader, "titleNoFormatting");
        tmp = json_reader_get_string_value (reader);
        strncpy(ret.title, tmp, (strlen(tmp) < BUFF_SIZE)?strlen(tmp):BUFF_SIZE);
        json_reader_end_member (reader);

        json_reader_read_member (reader, "content");
        tmp = json_reader_get_string_value (reader);
        strncpy(ret.content, tmp, (strlen(tmp) < BUFF_SIZE)?strlen(tmp):BUFF_SIZE);
        json_reader_end_member (reader);

        json_reader_end_element (reader);
        ret.success = 0;
    }
    else
        ret.success = 1;
    json_reader_end_member (reader);
    json_reader_end_member (reader);

    g_object_unref(parser);
    g_object_unref(reader);
    return ret;
}
static void
got_token_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
{
    /* parses the authentication token from the response
     */
    RBAudioscrobblerAccount *account;
    JsonParser *parser;

    account = RB_AUDIOSCROBBLER_ACCOUNT (user_data);

    parser = json_parser_new ();

    if (msg->response_body->data != NULL &&
            json_parser_load_from_data (parser, msg->response_body->data, msg->response_body->length, NULL)) {
        JsonObject *root_object;

        root_object = json_node_get_object (json_parser_get_root (parser));
        if (json_object_has_member (root_object, "token")) {
            char *url;

            account->priv->auth_token = g_strdup (json_object_get_string_member (root_object, "token"));
            rb_debug ("granted auth token \"%s\"", account->priv->auth_token);

            /* send the user to the web page using the token */
            url = g_strdup_printf ("%s?api_key=%s&token=%s",
                                   rb_audioscrobbler_service_get_auth_url (account->priv->service),
                                   rb_audioscrobbler_service_get_api_key (account->priv->service),
                                   account->priv->auth_token);
            rb_debug ("sending user to %s", url);
            gtk_show_uri (NULL, url, GDK_CURRENT_TIME, NULL);

            /* add timeout which will ask for session key */
            account->priv->session_key_timeout_id =
                g_timeout_add_seconds (SESSION_KEY_REQUEST_TIMEOUT,
                                       request_session_key_timeout_cb,
                                       account);

            g_free (url);
        } else {
            rb_debug ("error retrieving auth token: %s",
                      json_object_get_string_member (root_object, "message"));

            /* go back to being logged out */
            rb_audioscrobbler_account_logout (account);
        }
    } else {
        /* treat as connection error */
        rb_debug ("empty or invalid response retrieving auth token. treating as connection error");

        cancel_session (account);

        account->priv->login_status = RB_AUDIOSCROBBLER_ACCOUNT_LOGIN_STATUS_CONNECTION_ERROR;
        g_signal_emit (account, rb_audioscrobbler_account_signals[LOGIN_STATUS_CHANGED],
                       0, account->priv->login_status);
    }

    g_object_unref (parser);
}
/*!
 * Read the expected QMP welcome message.
 *
 * \param socket \c GSocket to use.
 *
 * \return \c true on success, else \c false.
 */
static gboolean
clr_oci_qmp_check_welcome (GSocket *socket)
{
	GError      *error = NULL;
	JsonParser  *parser = NULL;
	JsonReader  *reader = NULL;
	GSList      *msgs = NULL;
	gsize        msg_count = 0;
	gboolean     ret;
	GString     *msg = NULL;

	g_assert (socket);

	ret = clr_oci_qmp_msg_recv (socket, 1, &msgs, &msg_count);
	if (! ret) {
		goto out;
	}

	msg = g_slist_nth_data (msgs, 0);
	g_assert (msg);

	parser = json_parser_new ();
	reader = json_reader_new (NULL);

	ret = json_parser_load_from_data (parser, msg->str, (gssize)msg->len, &error);
	if (! ret) {
		g_critical ("failed to parse json: %s", error->message);
		g_error_free (error);
		goto out;
	}

	json_reader_set_root (reader, json_parser_get_root (parser));

	/* FIXME: perform more checks on the data received */
	ret = json_reader_read_member (reader, "QMP");
	if (! ret) {
		g_critical ("unexpected json data");
		json_reader_end_member (reader);
		goto out;
	}

	json_reader_end_member (reader);

out:
	if (reader) {
		g_object_unref (reader);
	}
	if (parser) {
		g_object_unref (parser);
	}
	if (msgs) {
		clr_oci_net_msgs_free_all (msgs);
	}

	g_debug ("handled qmp welcome");

	return true;
}
/* Called by RPC transport. */
gchar* 
searpc_server_call_function (const char *svc_name,
                             gchar *func, gsize len, gsize *ret_len)
{
    SearpcService *service;
    JsonParser *parser;
    JsonNode *root;
    JsonArray *array;
    gchar* ret;
    GError *error = NULL;
#ifdef PROFILE
    struct timeval start, end, intv;

    gettimeofday(&start, NULL);
#endif

    service = g_hash_table_lookup (service_table, svc_name);
    if (!service) {
        char buf[256];
        snprintf (buf, 255, "cannot find service %s.", svc_name);
        return error_to_json (501, buf, ret_len);
    }
          
    parser = json_parser_new ();
    
    if (!json_parser_load_from_data (parser, func, len, &error)) {
        char buf[512];
        snprintf (buf, 511, "failed to parse RPC call: %s\n", error->message);
        g_object_unref (parser);        
        return error_to_json (511, buf, ret_len);
    }

    root = json_parser_get_root (parser);
    array = json_node_get_array (root);

    const char *fname = json_array_get_string_element(array, 0);
    FuncItem *fitem = g_hash_table_lookup(service->func_table, fname);
    if (!fitem) {
        char buf[256];
        snprintf (buf, 255, "cannot find function %s.", fname);
        g_object_unref (parser);
        return error_to_json (500, buf, ret_len);
    }

    ret = fitem->marshal->mfunc (fitem->func, array, ret_len);

#ifdef PROFILE
    gettimeofday(&end, NULL);
    timersub(&end, &start, &intv);
    g_debug ("[searpc] Time spend in call %s: %ds %dus\n",
             fname, intv.tv_sec, intv.tv_usec);
#endif

    g_object_unref (parser);

    return ret;
}
GssAdaptive *
gss_adaptive_load (GssServer * server, const char *key, const char *dir,
    const char *version, GssDrmType drm_type, GssAdaptiveStream stream_type)
{
  GssAdaptive *adaptive;
  char *filename;
  gboolean ret;
  GError *error = NULL;
  JsonParser *parser;

  g_return_val_if_fail (GSS_IS_SERVER (server), NULL);
  g_return_val_if_fail (key != NULL, NULL);
  g_return_val_if_fail (dir != NULL, NULL);

  GST_DEBUG ("looking for %s", key);

  parser = json_parser_new ();
  filename = g_strdup_printf ("%s/gss-manifest", dir);
  ret = json_parser_load_from_file (parser, filename, &error);
  if (!ret) {
    GST_DEBUG ("failed to open %s", filename);
    g_free (filename);
    g_object_unref (parser);
    g_error_free (error);
    return NULL;
  }
  g_free (filename);

  GST_DEBUG ("loading %s", key);

  adaptive = gss_adaptive_new ();

  adaptive->server = server;

  adaptive->content_id = g_strdup (key);
  adaptive->kid = create_key_id (key);
  adaptive->kid_len = 16;
  adaptive->drm_type = drm_type;
  adaptive->stream_type = stream_type;

  gss_playready_generate_key (server->playready, adaptive->content_key,
      adaptive->kid, adaptive->kid_len);

  ret = parse_json (adaptive, parser, dir, version);
  if (!ret) {
    gss_adaptive_free (adaptive);
    g_object_unref (parser);
    GST_WARNING ("json format error in %s/gss-manifest", dir);
    return NULL;
  }

  g_object_unref (parser);

  GST_DEBUG ("loading done");

  return adaptive;
}
/**
 * @brief Negative test case of ug_init json_parser_new()
 */
static void utc_libjson_json_parser_new_func_02(void)
{
	JsonParser *parser = NULL;  

   	parser = json_parser_new();

	dts_check_eq("json_parser_new", JSON_IS_PARSER(parser), TRUE);
	g_object_unref (parser);
}