示例#1
0
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;
}
示例#2
0
/**
 * 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;
}