GDataFeed * gdata_feed_new_from_xml(const gchar* feedXML, const gint length) { GDataFeed *feed; GDataFeedPrivate *priv; xmlDocPtr doc; xmlNodePtr cur; xmlChar *value; gint value_size; g_return_val_if_fail(feedXML != NULL && *feedXML != '\0', NULL); doc = xmlReadMemory(feedXML, length, "feed.xml", NULL, 0); if (doc == NULL) return NULL; cur = xmlDocGetRootElement(doc); if (cur == NULL) { /* Empty */ xmlFreeDoc(doc); return NULL; } if (xmlStrcmp(cur->name, (xmlChar *)"feed")) { xmlFreeDoc(doc); return NULL; } feed = g_object_new(GDATA_TYPE_FEED, NULL); priv = GDATA_FEED_GET_PRIVATE(feed); cur = cur->xmlChildrenNode; while (cur != NULL) { if (!xmlStrcmp(cur->name, (xmlChar *)"author")) { priv->authors = g_slist_prepend(priv->authors, xmlnode_to_author(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"link")) { priv->links = g_slist_prepend(priv->links, xmlnode_to_link(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"category")) { priv->categories = g_slist_prepend(priv->categories, xmlnode_to_category(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"updated")) { value = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); priv->updated = g_strdup ((gchar*)value); xmlFree(value); } else if (!xmlStrcmp(cur->name, (xmlChar *)"entry")) { priv->entries = g_slist_prepend(priv->entries, gdata_entry_new_from_xmlptr(doc,cur)); } else { value = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); g_hash_table_insert(priv->field_table, g_strdup((gchar *)cur->name), g_strdup((gchar *)value)); xmlFree(value); } cur = cur->next; } xmlDocDumpFormatMemory(doc, &value, &value_size, 1); priv->feedXML = g_strdup(feedXML); xmlFree(value); xmlFreeDoc(doc); return feed; }
/** * gdata_entry_new_from_xmlptr: * @doc: A xml document pointer * @ptr: A xml Node pointer **/ GDataEntry * gdata_entry_new_from_xmlptr (xmlDocPtr doc, xmlNodePtr cur) { GDataEntry *entry; GDataEntryPrivate *priv; xmlChar *value = NULL; xmlOutputBufferPtr buf; gchar *xmlString; g_return_val_if_fail(doc != NULL, NULL); g_return_val_if_fail(cur != NULL, NULL); if (xmlStrcmp(cur->name, (xmlChar *)"entry")) { return NULL; } entry = gdata_entry_new (); priv = GDATA_ENTRY_GET_PRIVATE(entry); buf = xmlAllocOutputBuffer (NULL); if (buf == NULL) { xmlString = NULL; } else { xmlNodeDumpOutput (buf, NULL, cur, 0, 1, NULL); xmlOutputBufferFlush (buf); if (buf->conv == NULL) xmlString = g_strdup ((gchar *)buf->buffer->content); else xmlString = g_strdup ((gchar *)buf->conv->content); xmlOutputBufferClose (buf); } priv->entry_xml = g_strdup (xmlString); cur = cur->xmlChildrenNode; while (cur != NULL) { if (!xmlStrcmp(cur->name, (xmlChar *)"author")) { priv->authors = g_slist_prepend(priv->authors, xmlnode_to_author(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"link")) { priv->links = g_slist_prepend(priv->links, xmlnode_to_link(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"category")) { priv->categories = g_slist_prepend(priv->categories, xmlnode_to_category(doc, cur)); } else if (!xmlStrcmp (cur->name, (xmlChar *)"where")) { priv->location = (gchar *)xmlGetProp (cur, (xmlChar *)"valueString"); } else if (!xmlStrcmp (cur->name, (xmlChar *)"eventStatus")) { priv->status = (gchar *)xmlGetProp (cur, (xmlChar *)"value"); } else if (!xmlStrcmp (cur->name, (xmlChar *)"visibility")) { priv->visibility = (gchar *)xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); } else if (!xmlStrcmp (cur->name, (xmlChar *)"when")) { priv->start_time = (gchar *)xmlGetProp (cur, (xmlChar *)"startTime"); priv->end_time = (gchar *)xmlGetProp (cur, (xmlChar *)"endTime"); } else if (!xmlStrcmp (cur->name, (xmlChar *)"recurrence")) { priv->is_recurrent = TRUE; } else if (!xmlStrcmp (cur->name, (xmlChar *)"who")) { priv->attendees = g_slist_prepend (priv->attendees, xmlnode_to_attendee (doc, cur)); priv->has_attendees = TRUE; } else if (!xmlStrcmp (cur->name, (xmlChar *)"sendEventNotifications")) { priv->send_notification =(gchar *)xmlGetProp (cur, (xmlChar *)"value"); } else if (!xmlStrcmp (cur->name, (xmlChar *)"comments")) { /*FIXME Call _comment_to_xml_node */ } else if (!xmlStrcmp(cur->name, (xmlChar *)"email")) { priv->email_addresses = g_slist_prepend(priv->email_addresses, xmlnode_to_email_address(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"im")) { priv->im_addresses = g_slist_prepend(priv->im_addresses, xmlnode_to_im_address(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"organization")) { priv->organizations = g_slist_prepend(priv->organizations, xmlnode_to_organization(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"phoneNumber")) { priv->phone_numbers = g_slist_prepend(priv->phone_numbers, xmlnode_to_phone_number(doc, cur)); } else if (!xmlStrcmp(cur->name, (xmlChar *)"postalAddress")) { priv->postal_addresses = g_slist_prepend(priv->postal_addresses, xmlnode_to_postal_address(doc, cur)); } else if (!xmlStrcmp (cur->name, (xmlChar *)"deleted")) { priv->is_deleted = TRUE; } else { value = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); g_hash_table_insert(priv->field_table, g_strdup((gchar *)cur->name), g_strdup((gchar *)value)); xmlFree(value); } cur = cur->next; } return entry; }