summaryrefslogtreecommitdiff
path: root/json-glib/json-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'json-glib/json-reader.c')
-rw-r--r--json-glib/json-reader.c177
1 files changed, 154 insertions, 23 deletions
diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c
index 73e0ea3..ddce658 100644
--- a/json-glib/json-reader.c
+++ b/json-glib/json-reader.c
@@ -571,10 +571,19 @@ json_reader_count_elements (JsonReader *reader)
priv = reader->priv;
if (priv->current_node == NULL)
- return -1;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return -1;
+ }
if (!JSON_NODE_HOLDS_ARRAY (priv->current_node))
- return -1;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_ARRAY,
+ _("The current position holds a '%s' and not an array"),
+ json_node_type_get_name (JSON_NODE_TYPE (priv->current_node)));
+ return -1;
+ }
return json_array_get_length (json_node_get_array (priv->current_node));
}
@@ -715,10 +724,19 @@ json_reader_list_members (JsonReader *reader)
priv = reader->priv;
if (priv->current_node == NULL)
- return NULL;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return NULL;
+ }
if (!JSON_NODE_HOLDS_OBJECT (priv->current_node))
- return NULL;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_OBJECT,
+ _("The current position holds a '%s' and not an object"),
+ json_node_type_get_name (JSON_NODE_TYPE (priv->current_node)));
+ return NULL;
+ }
members = json_object_get_members (json_node_get_object (priv->current_node));
if (members == NULL)
@@ -757,10 +775,19 @@ json_reader_count_members (JsonReader *reader)
priv = reader->priv;
if (priv->current_node == NULL)
- return -1;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return -1;
+ }
if (!JSON_NODE_HOLDS_OBJECT (priv->current_node))
- return -1;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_OBJECT,
+ _("The current position holds a '%s' and not an object"),
+ json_node_type_get_name (JSON_NODE_TYPE (priv->current_node)));
+ return -1;
+ }
return json_object_get_size (json_node_get_object (priv->current_node));
}
@@ -780,14 +807,27 @@ json_reader_count_members (JsonReader *reader)
JsonNode *
json_reader_get_value (JsonReader *reader)
{
+ JsonNode *node;
+
g_return_val_if_fail (JSON_IS_READER (reader), NULL);
json_reader_return_val_if_error_set (reader, NULL);
if (reader->priv->current_node == NULL)
- return NULL;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return NULL;
+ }
- if (!JSON_NODE_HOLDS_VALUE (reader->priv->current_node))
- return NULL;
+ node = reader->priv->current_node;
+
+ if (!JSON_NODE_HOLDS_VALUE (node))
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE,
+ _("The current position holds a '%s' and not a value"),
+ json_node_type_get_name (JSON_NODE_TYPE (node)));
+ return NULL;
+ }
return reader->priv->current_node;
}
@@ -805,14 +845,34 @@ json_reader_get_value (JsonReader *reader)
gint64
json_reader_get_int_value (JsonReader *reader)
{
+ JsonNode *node;
+
g_return_val_if_fail (JSON_IS_READER (reader), 0);
json_reader_return_val_if_error_set (reader, 0);
if (reader->priv->current_node == NULL)
- return 0;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return 0;
+ }
+
+ node = reader->priv->current_node;
+
+ if (!JSON_NODE_HOLDS_VALUE (node))
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE,
+ _("The current position holds a '%s' and not a value"),
+ json_node_type_get_name (JSON_NODE_TYPE (node)));
+ return 0;
+ }
- if (!JSON_NODE_HOLDS_VALUE (reader->priv->current_node))
- return 0;
+ if (json_node_get_value_type (node) != G_TYPE_INT64)
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_TYPE,
+ _("The current position does not hold an integer type"));
+ return 0;
+ }
return json_node_get_int (reader->priv->current_node);
}
@@ -830,14 +890,34 @@ json_reader_get_int_value (JsonReader *reader)
gdouble
json_reader_get_double_value (JsonReader *reader)
{
+ JsonNode *node;
+
g_return_val_if_fail (JSON_IS_READER (reader), 0.0);
json_reader_return_val_if_error_set (reader, 0.0);
if (reader->priv->current_node == NULL)
- return 0.0;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return 0.0;
+ }
+
+ node = reader->priv->current_node;
+
+ if (!JSON_NODE_HOLDS_VALUE (node))
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE,
+ _("The current position holds a '%s' and not a value"),
+ json_node_type_get_name (JSON_NODE_TYPE (node)));
+ return 0.0;
+ }
- if (!JSON_NODE_HOLDS_VALUE (reader->priv->current_node))
- return 0.0;
+ if (json_node_get_value_type (node) != G_TYPE_DOUBLE)
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_TYPE,
+ _("The current position does not hold a floating point type"));
+ return 0.0;
+ }
return json_node_get_double (reader->priv->current_node);
}
@@ -855,14 +935,34 @@ json_reader_get_double_value (JsonReader *reader)
const gchar *
json_reader_get_string_value (JsonReader *reader)
{
+ JsonNode *node;
+
g_return_val_if_fail (JSON_IS_READER (reader), NULL);
json_reader_return_val_if_error_set (reader, NULL);
if (reader->priv->current_node == NULL)
- return NULL;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return NULL;
+ }
- if (!JSON_NODE_HOLDS_VALUE (reader->priv->current_node))
- return NULL;
+ node = reader->priv->current_node;
+
+ if (!JSON_NODE_HOLDS_VALUE (node))
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE,
+ _("The current position holds a '%s' and not a value"),
+ json_node_type_get_name (JSON_NODE_TYPE (node)));
+ return NULL;
+ }
+
+ if (json_node_get_value_type (node) != G_TYPE_STRING)
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_TYPE,
+ _("The current position does not hold a string type"));
+ return NULL;
+ }
return json_node_get_string (reader->priv->current_node);
}
@@ -880,16 +980,36 @@ json_reader_get_string_value (JsonReader *reader)
gboolean
json_reader_get_boolean_value (JsonReader *reader)
{
+ JsonNode *node;
+
g_return_val_if_fail (JSON_IS_READER (reader), FALSE);
json_reader_return_val_if_error_set (reader, FALSE);
if (reader->priv->current_node == NULL)
- return FALSE;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return FALSE;
+ }
- if (!JSON_NODE_HOLDS_VALUE (reader->priv->current_node))
- return FALSE;
+ node = reader->priv->current_node;
+
+ if (!JSON_NODE_HOLDS_VALUE (node))
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE,
+ _("The current position holds a '%s' and not a value"),
+ json_node_type_get_name (JSON_NODE_TYPE (node)));
+ return FALSE;
+ }
+
+ if (json_node_get_value_type (node) != G_TYPE_BOOLEAN)
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_TYPE,
+ _("The current position does not hold a boolean type"));
+ return FALSE;
+ }
- return json_node_get_boolean (reader->priv->current_node);
+ return json_node_get_boolean (node);
}
/**
@@ -909,7 +1029,11 @@ json_reader_get_null_value (JsonReader *reader)
json_reader_return_val_if_error_set (reader, FALSE);
if (reader->priv->current_node == NULL)
- return FALSE;
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return FALSE;
+ }
return JSON_NODE_HOLDS_NULL (reader->priv->current_node);
}
@@ -930,5 +1054,12 @@ json_reader_get_member_name (JsonReader *reader)
g_return_val_if_fail (JSON_IS_READER (reader), NULL);
json_reader_return_val_if_error_set (reader, NULL);
+ if (reader->priv->current_node == NULL)
+ {
+ json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE,
+ _("No node available at the current position"));
+ return FALSE;
+ }
+
return reader->priv->current_member;
}