static gboolean parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error) { if (gdata_parser_is_namespace (node, "http://schemas.google.com/photos/2007") == TRUE) { if (xmlStrcmp (node->name, (xmlChar*) "user") == 0 || xmlStrcmp (node->name, (xmlChar*) "nickname") == 0 || xmlStrcmp (node->name, (xmlChar*) "quotacurrent") == 0 || xmlStrcmp (node->name, (xmlChar*) "quotalimit") == 0 || xmlStrcmp (node->name, (xmlChar*) "maxPhotosPerAlbum") == 0 || xmlStrcmp (node->name, (xmlChar*) "thumbnail") == 0 || xmlStrcmp (node->name, (xmlChar*) "allowDownloads") == 0 || xmlStrcmp (node->name, (xmlChar*) "allowPrints") == 0 || xmlStrcmp (node->name, (xmlChar*) "id") == 0 || xmlStrcmp (node->name, (xmlChar*) "rights") == 0 || xmlStrcmp (node->name, (xmlChar*) "location") == 0 || xmlStrcmp (node->name, (xmlChar*) "access") == 0 || xmlStrcmp (node->name, (xmlChar*) "timestamp") == 0 || xmlStrcmp (node->name, (xmlChar*) "numphotos") == 0 || xmlStrcmp (node->name, (xmlChar*) "numphotosremaining") == 0 || xmlStrcmp (node->name, (xmlChar*) "bytesUsed") == 0) { /* From user's feed of album entries. Redundant with user entry represented by #GDataPicasaWebUser. * Capturing and ignoring. See bgo #589858. */ } else { return GDATA_PARSABLE_CLASS (gdata_picasaweb_feed_parent_class)->parse_xml (parsable, doc, node, user_data, error); } } else if (gdata_parser_is_namespace (node, "http://www.georss.org/georss") == TRUE && xmlStrcmp (node->name, (xmlChar*) "where") == 0) { /* From user's feed of album entries. Redundant with user entry represented by #GDataPicasaWebUser. * Capturing and ignoring. See bgo #589858. */ } else { return GDATA_PARSABLE_CLASS (gdata_picasaweb_feed_parent_class)->parse_xml (parsable, doc, node, user_data, error); } return TRUE; }
static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error) { GDataFreebaseTopicResultPrivate *priv = GDATA_FREEBASE_TOPIC_RESULT (parsable)->priv; const gchar *member_name; GDATA_PARSABLE_CLASS (gdata_freebase_topic_result_parent_class)->parse_json (parsable, reader, user_data, error); member_name = json_reader_get_member_name (reader); if (member_name == NULL) return FALSE; if (strcmp (member_name, "id") == 0) { /* We only expect one member containing information */ g_assert (priv->object == NULL); priv->object = object_new (json_reader_get_string_value (reader)); } else if (strcmp (member_name, "property") == 0) { reader_get_properties (reader, priv->object, error); } else { return FALSE; } return TRUE; }
static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error) { gboolean success; if (g_strcmp0 (json_reader_get_member_name (reader), "role") == 0) { gchar *role = NULL; /* owned */ g_assert (gdata_parser_string_from_json_member (reader, "role", P_REQUIRED | P_NON_EMPTY, &role, &success, error)); if (!success) { return FALSE; } gdata_access_rule_set_role (GDATA_ACCESS_RULE (parsable), role_v3_to_v2 (role)); g_free (role); return TRUE; } else if (g_strcmp0 (json_reader_get_member_name (reader), "scope") == 0) { const gchar *scope_type; const gchar *scope_value; /* Check this is an object. */ if (!json_reader_is_object (reader)) { return gdata_parser_error_required_json_content_missing (reader, error); } json_reader_read_member (reader, "type"); scope_type = json_reader_get_string_value (reader); json_reader_end_member (reader); json_reader_read_member (reader, "value"); scope_value = json_reader_get_string_value (reader); json_reader_end_member (reader); /* Scope type is required. */ if (scope_type == NULL) { return gdata_parser_error_required_json_content_missing (reader, error); } gdata_access_rule_set_scope (GDATA_ACCESS_RULE (parsable), scope_type_v3_to_v2 (scope_type), scope_value); return TRUE; } return GDATA_PARSABLE_CLASS (gdata_calendar_access_rule_parent_class)->parse_json (parsable, reader, user_data, error); }
static void gdata_freebase_topic_result_class_init (GDataFreebaseTopicResultClass *klass) { GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (GDataFreebaseTopicResultPrivate)); gobject_class->finalize = gdata_freebase_topic_result_finalize; parsable_class->parse_json = parse_json; }
static void gdata_documents_access_rule_class_init (GDataDocumentsAccessRuleClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass); gobject_class->finalize = gdata_documents_access_rule_finalize; parsable_class->parse_json = parse_json; parsable_class->post_parse_json = post_parse_json; parsable_class->get_content_type = get_content_type; parsable_class->get_json = get_json; }
static void gdata_calendar_access_rule_class_init (GDataCalendarAccessRuleClass *klass) { GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass); GDataEntryClass *entry_class = GDATA_ENTRY_CLASS (klass); parsable_class->parse_json = parse_json; parsable_class->post_parse_json = post_parse_json; parsable_class->get_json = get_json; parsable_class->get_content_type = get_content_type; entry_class->kind_term = "calendar#aclRule"; }
static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error) { GDataDocumentsAccessRulePrivate *priv; gboolean success; gchar *key = NULL; gchar *role = NULL; gchar *scope_type = NULL; priv = gdata_documents_access_rule_get_instance_private (GDATA_DOCUMENTS_ACCESS_RULE (parsable)); /* JSON format: https://developers.google.com/drive/v2/reference/permissions */ if (gdata_parser_string_from_json_member (reader, "emailAddress", P_REQUIRED | P_NON_EMPTY, &(priv->email), &success, error) == TRUE || gdata_parser_string_from_json_member (reader, "domain", P_REQUIRED | P_NON_EMPTY, &(priv->domain), &success, error) == TRUE) { return success; } else if (gdata_parser_string_from_json_member (reader, "authKey", P_REQUIRED | P_NON_EMPTY, &key, &success, error) == TRUE) { if (success && key != NULL && key[0] != '\0') _gdata_access_rule_set_key (GDATA_ACCESS_RULE (parsable), key); g_free (key); return success; } else if (gdata_parser_string_from_json_member (reader, "role", P_REQUIRED | P_NON_EMPTY, &role, &success, error) == TRUE) { if (success && role != NULL && role[0] != '\0') gdata_access_rule_set_role (GDATA_ACCESS_RULE (parsable), role); g_free (role); return success; } else if (gdata_parser_string_from_json_member (reader, "type", P_REQUIRED | P_NON_EMPTY, &scope_type, &success, error) == TRUE) { if (g_strcmp0 (scope_type, "anyone") == 0) { priv->scope_type = g_strdup (GDATA_ACCESS_SCOPE_DEFAULT); } else { priv->scope_type = scope_type; scope_type = NULL; } g_free (scope_type); return success; } return GDATA_PARSABLE_CLASS (gdata_documents_access_rule_parent_class)->parse_json (parsable, reader, user_data, error); }
static void get_json (GDataParsable *parsable, JsonBuilder *builder) { const gchar *key; const gchar *role; const gchar *scope_type; const gchar *scope_value; GDATA_PARSABLE_CLASS (gdata_documents_access_rule_parent_class)->get_json (parsable, builder); key = gdata_access_rule_get_key (GDATA_ACCESS_RULE (parsable)); if (key != NULL && key[0] != '\0') { json_builder_set_member_name (builder, "authKey"); json_builder_add_string_value (builder, key); } role = gdata_access_rule_get_role (GDATA_ACCESS_RULE (parsable)); if (role != NULL && role[0] != '\0') { json_builder_set_member_name (builder, "role"); json_builder_add_string_value (builder, role); } gdata_access_rule_get_scope (GDATA_ACCESS_RULE (parsable), &scope_type, &scope_value); if (scope_type != NULL && scope_type[0] != '\0') { if (g_strcmp0 (scope_type, GDATA_ACCESS_SCOPE_DEFAULT) == 0) scope_type = "anyone"; json_builder_set_member_name (builder, "type"); json_builder_add_string_value (builder, scope_type); } if (scope_value != NULL && scope_value[0] != '\0') { json_builder_set_member_name (builder, "value"); json_builder_add_string_value (builder, scope_value); } }
static void gdata_documents_feed_class_init (GDataDocumentsFeedClass *klass) { GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass); parsable_class->parse_json = parse_json; }
static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error) { gboolean success = TRUE; gchar *next_uri = NULL; /* JSON format: https://developers.google.com/drive/v2/reference/files/list */ if (gdata_parser_string_from_json_member (reader, "nextLink", P_DEFAULT, &next_uri, &success, error) == TRUE) { if (success && next_uri != NULL && next_uri[0] != '\0') { GDataLink *_link; _link = gdata_link_new (next_uri, "http://www.iana.org/assignments/relation/next"); _gdata_feed_add_link (GDATA_FEED (parsable), _link); g_object_unref (_link); } g_free (next_uri); return success; } else if (g_strcmp0 (json_reader_get_member_name (reader), "items") == 0) { guint i, elements; if (json_reader_is_array (reader) == FALSE) { g_set_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_PROTOCOL_ERROR, /* Translators: the parameter is an error message */ _("Error parsing JSON: %s"), "JSON node ‘items’ is not an array."); return FALSE; } /* Loop through the elements array. */ for (i = 0, elements = (guint) json_reader_count_elements (reader); success && i < elements; i++) { GDataEntry *entry = NULL; GError *child_error = NULL; GType entry_type = G_TYPE_INVALID; gchar *kind = NULL; gchar *mime_type = NULL; json_reader_read_element (reader, i); if (json_reader_is_object (reader) == FALSE) { g_set_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_PROTOCOL_ERROR, /* Translators: the parameter is an error message */ _("Error parsing JSON: %s"), "JSON node inside ‘items’ is not an object"); success = FALSE; goto continuation; } get_kind_and_mime_type (reader, &kind, &mime_type, &child_error); if (child_error != NULL) { g_propagate_error (error, child_error); success = FALSE; goto continuation; } if (g_strcmp0 (kind, "drive#file") == 0) { entry_type = gdata_documents_utils_get_type_from_content_type (mime_type); } else { g_warning ("%s files are not handled yet", kind); } if (entry_type == G_TYPE_INVALID) goto continuation; entry = GDATA_ENTRY (_gdata_parsable_new_from_json_node (entry_type, reader, NULL, error)); /* Call the progress callback in the main thread */ _gdata_feed_call_progress_callback (GDATA_FEED (parsable), user_data, entry); _gdata_feed_add_entry (GDATA_FEED (parsable), entry); continuation: g_clear_object (&entry); g_free (kind); g_free (mime_type); json_reader_end_element (reader); } return success; } return GDATA_PARSABLE_CLASS (gdata_documents_feed_parent_class)->parse_json (parsable, reader, user_data, error); }
static void gdata_picasaweb_feed_class_init (GDataPicasaWebFeedClass *klass) { GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass); parsable_class->parse_xml = parse_xml; }