[libgrss] Added grss_feeds_group_get_formats() Implemented grss_feeds_group_export_file()



commit 6dd1833bcba4afda73cf4edd14c0798b29e28b13
Author: Roberto Guido <bob4mail gmail com>
Date:   Wed Dec 28 18:16:44 2011 -0800

    Added grss_feeds_group_get_formats()
    Implemented grss_feeds_group_export_file()

 doc/reference/libgrss-sections.txt |    1 +
 src/feeds-group-handler.c          |    9 ++++
 src/feeds-group-handler.h          |    2 +
 src/feeds-group.c                  |   86 ++++++++++++++++++++++++++++++++++-
 src/feeds-group.h                  |    3 +-
 src/feeds-opml-group-handler.c     |   41 +++++++++++++++--
 src/feeds-xbel-group-handler.c     |   35 +++++++++++++--
 src/feeds-xoxo-group-handler.c     |   42 ++++++++++++++++--
 8 files changed, 203 insertions(+), 16 deletions(-)
---
diff --git a/doc/reference/libgrss-sections.txt b/doc/reference/libgrss-sections.txt
index 96707d9..0fc98db 100644
--- a/doc/reference/libgrss-sections.txt
+++ b/doc/reference/libgrss-sections.txt
@@ -159,6 +159,7 @@ grss_feed_channel_fetch_all_finish
 <TITLE>GrssFeedsGroup</TITLE>
 GrssFeedsGroup
 grss_feeds_group_new
+grss_feeds_group_get_formats
 grss_feeds_group_parse_file
 grss_feeds_group_export_file
 </SECTION>
diff --git a/src/feeds-group-handler.c b/src/feeds-group-handler.c
index 0699954..c46df3a 100644
--- a/src/feeds-group-handler.c
+++ b/src/feeds-group-handler.c
@@ -44,6 +44,15 @@ grss_feeds_group_handler_get_type ()
 	return iface_type;
 }
 
+const gchar*
+grss_feeds_group_handler_get_name (GrssFeedsGroupHandler *self)
+{
+	if (IS_FEEDS_GROUP_HANDLER (self) == FALSE)
+		return NULL;
+
+	return FEEDS_GROUP_HANDLER_GET_INTERFACE (self)->get_name (self);
+}
+
 gboolean
 grss_feeds_group_handler_check_format (GrssFeedsGroupHandler *self, xmlDocPtr doc, xmlNodePtr cur)
 {
diff --git a/src/feeds-group-handler.h b/src/feeds-group-handler.h
index 7c7ee0e..ea93a9e 100644
--- a/src/feeds-group-handler.h
+++ b/src/feeds-group-handler.h
@@ -34,6 +34,7 @@ typedef struct _GrssFeedsGroupHandlerInterface	GrssFeedsGroupHandlerInterface;
 struct _GrssFeedsGroupHandlerInterface {
 	GTypeInterface parent_iface;
 
+	const gchar* (*get_name) (GrssFeedsGroupHandler *self);
 	gboolean (*check_format) (GrssFeedsGroupHandler *self, xmlDocPtr doc, xmlNodePtr cur);
 	GList* (*parse) (GrssFeedsGroupHandler *self, xmlDocPtr doc, GError **error);
 	gchar* (*dump) (GrssFeedsGroupHandler *self, GList *channels, GError **error);
@@ -41,6 +42,7 @@ struct _GrssFeedsGroupHandlerInterface {
 
 GType		grss_feeds_group_handler_get_type	();
 
+const gchar*	grss_feeds_group_handler_get_name	(GrssFeedsGroupHandler *self);
 gboolean	grss_feeds_group_handler_check_format	(GrssFeedsGroupHandler *self, xmlDocPtr doc, xmlNodePtr cur);
 GList*		grss_feeds_group_handler_parse		(GrssFeedsGroupHandler *self, xmlDocPtr doc, GError **error);
 gchar*		grss_feeds_group_handler_dump		(GrssFeedsGroupHandler *self, GList *channels, GError **error);
diff --git a/src/feeds-group.c b/src/feeds-group.c
index fc21966..0690137 100644
--- a/src/feeds-group.c
+++ b/src/feeds-group.c
@@ -136,6 +136,34 @@ retrieve_group_handler (GrssFeedsGroup *group, xmlDocPtr doc, xmlNodePtr cur)
 }
 
 /**
+ * grss_feeds_group_get_formats:
+ * @group: a #GrssFeedsGroupClass
+ *
+ * Returns the list of supported file formats
+ *
+ * Return value: a list of constant strings with names of supported formats. The list must be
+ * freed when no longer used
+ */
+GList*
+grss_feeds_group_get_formats (GrssFeedsGroup *group)
+{
+	GSList *iter;
+	GList *names;
+	GrssFeedsGroupHandler *handler;
+
+	iter = feeds_groups_get_list (group);
+	names = NULL;
+
+	while (iter) {
+		handler = (GrssFeedsGroupHandler*) (iter->data);
+		names = g_list_prepend (names, grss_feeds_group_handler_get_name (handler));
+		iter = g_slist_next (iter);
+	}
+
+	return names;
+}
+
+/**
  * grss_feeds_group_parse_file:
  * @group: a #GrssFeedsGroup
  * @path: path of the file to parse
@@ -193,13 +221,65 @@ grss_feeds_group_parse_file (GrssFeedsGroup *group, const gchar *path, GError **
  * grss_feeds_group_export_file:
  * @group:
  * @channels:
- * @path:
+ * @format:
+ * @uri:
  * @error:
  *
  * Return value: FALSE
  */
 gboolean
-grss_feeds_group_export_file (GrssFeedsGroup *group, GList *channels, const gchar *path, GError *error)
+grss_feeds_group_export_file (GrssFeedsGroup *group, GList *channels, const gchar *format, const gchar *uri, GError **error)
 {
-	return FALSE;
+	gboolean ret;
+	gchar *contents;
+	gsize written;
+	GSList *iter;
+	GError *err;
+	GFile *file;
+	GFileOutputStream *stream;
+	GrssFeedsGroupHandler *handler;
+
+	contents = NULL;
+	stream = NULL;
+	iter = feeds_groups_get_list (group);
+
+	while (iter) {
+		handler = (GrssFeedsGroupHandler*) (iter->data);
+
+		if (strcasecmp (grss_feeds_group_handler_get_name (handler), format) == 0) {
+			err = NULL;
+			contents = grss_feeds_group_handler_dump (handler, channels, &err);
+
+			if (contents == NULL) {
+				g_propagate_error (error, err);
+				ret = FALSE;
+				break;
+			}
+
+			file = g_file_new_for_uri (uri);
+			stream = g_file_append_to (file, G_FILE_CREATE_NONE, NULL, &err);
+
+			if (stream == NULL) {
+				g_propagate_error (error, err);
+				ret = FALSE;
+				break;
+			}
+
+			if (g_output_stream_write_all (G_OUTPUT_STREAM (stream), contents, strlen (contents), &written, NULL, &err) == FALSE) {
+				g_propagate_error (error, err);
+				ret = FALSE;
+				break;
+			}
+
+			ret = TRUE;
+			break;
+		}
+	}
+
+	if (stream != NULL)
+		g_object_unref (stream);
+	if (contents != NULL)
+		g_free (contents);
+
+	return ret;
 }
diff --git a/src/feeds-group.h b/src/feeds-group.h
index 70f7d76..7f3cd00 100644
--- a/src/feeds-group.h
+++ b/src/feeds-group.h
@@ -46,7 +46,8 @@ GType		grss_feeds_group_get_type	() G_GNUC_CONST;
 
 GrssFeedsGroup*	grss_feeds_group_new		();
 
+GList*		grss_feeds_group_get_formats	(GrssFeedsGroup *group);
 GList*		grss_feeds_group_parse_file	(GrssFeedsGroup *group, const gchar *path, GError **error);
-gboolean	grss_feeds_group_export_file	(GrssFeedsGroup *group, GList *channels, const gchar *path, GError *error);
+gboolean	grss_feeds_group_export_file	(GrssFeedsGroup *group, GList *channels, const gchar *format, const gchar *uri, GError **error);
 
 #endif /* __FEEDS_GROUP_H__ */
diff --git a/src/feeds-opml-group-handler.c b/src/feeds-opml-group-handler.c
index 009a42b..eaa91b6 100644
--- a/src/feeds-opml-group-handler.c
+++ b/src/feeds-opml-group-handler.c
@@ -48,6 +48,12 @@ feeds_opml_group_handler_finalize (GObject *object)
 	G_OBJECT_CLASS (feeds_opml_group_handler_parent_class)->finalize (object);
 }
 
+static const gchar*
+feeds_opml_group_handler_get_name (GrssFeedsGroupHandler *self)
+{
+	return "OPML";
+}
+
 static gboolean
 feeds_opml_group_handler_check_format (GrssFeedsGroupHandler *self, xmlDocPtr doc, xmlNodePtr cur)
 {
@@ -207,16 +213,43 @@ feeds_opml_group_handler_parse (GrssFeedsGroupHandler *self, xmlDocPtr doc, GErr
 static gchar*
 feeds_opml_group_handler_dump (GrssFeedsGroupHandler *self, GList *channels, GError **error)
 {
-	/**
-		TODO
-	*/
+	int size;
+	xmlChar *ret;
+	xmlDocPtr doc;
+	xmlNodePtr cur;
+	xmlNodePtr opmlNode;
+	xmlNodePtr childNode;
+	GList *iter;
+	GrssFeedChannel *channel;
+
+	doc = xmlNewDoc (BAD_CAST"1.0");
+
+	opmlNode = xmlNewDocNode (doc, NULL, BAD_CAST"opml", NULL);
+	xmlNewProp (opmlNode, BAD_CAST"version", BAD_CAST"1.0");
+	xmlNewChild (opmlNode, NULL, BAD_CAST"head", NULL);
+
+	cur = xmlNewChild (opmlNode, NULL, BAD_CAST"body", NULL);
+	if (cur) {
+		for (iter = channels; iter; iter = g_list_next (iter)) {
+			channel = (GrssFeedChannel*) iter->data;
+			childNode = xmlNewChild (cur, NULL, BAD_CAST"outline", NULL);
+			xmlNewProp (childNode, BAD_CAST"text", BAD_CAST grss_feed_channel_get_title (channel));
+			xmlNewProp (childNode, BAD_CAST"type", BAD_CAST"rss");
+			xmlNewProp (childNode, BAD_CAST"xmlUrl", BAD_CAST grss_feed_channel_get_source (channel));
+		}
+	}
+
+	xmlDocSetRootElement (doc, opmlNode);
+	xmlDocDumpFormatMemoryEnc (doc, &ret, &size, "utf-8", 1);
+	xmlFreeDoc (doc);
 
-	return NULL;
+	return (gchar*) ret;
 }
 
 static void
 grss_feeds_group_handler_interface_init (GrssFeedsGroupHandlerInterface *iface)
 {
+	iface->get_name = feeds_opml_group_handler_get_name;
 	iface->check_format = feeds_opml_group_handler_check_format;
 	iface->parse = feeds_opml_group_handler_parse;
 	iface->dump = feeds_opml_group_handler_dump;
diff --git a/src/feeds-xbel-group-handler.c b/src/feeds-xbel-group-handler.c
index 1984e9d..f6d26d8 100644
--- a/src/feeds-xbel-group-handler.c
+++ b/src/feeds-xbel-group-handler.c
@@ -40,6 +40,12 @@ feeds_xbel_group_handler_finalize (GObject *object)
 	G_OBJECT_CLASS (feeds_xbel_group_handler_parent_class)->finalize (object);
 }
 
+static const gchar*
+feeds_xbel_group_handler_get_name (GrssFeedsGroupHandler *self)
+{
+	return "XBEL";
+}
+
 static gboolean
 feeds_xbel_group_handler_check_format (GrssFeedsGroupHandler *self, xmlDocPtr doc, xmlNodePtr cur)
 {
@@ -107,16 +113,37 @@ feeds_xbel_group_handler_parse (GrssFeedsGroupHandler *self, xmlDocPtr doc, GErr
 static gchar*
 feeds_xbel_group_handler_dump (GrssFeedsGroupHandler *self, GList *channels, GError **error)
 {
-	/**
-		TODO
-	*/
+	int size;
+	xmlChar *ret;
+	xmlDocPtr doc;
+	xmlNodePtr xbelNode;
+	xmlNodePtr childNode;
+	GList *iter;
+	GrssFeedChannel *channel;
+
+	doc = xmlNewDoc (BAD_CAST"1.0");
+
+	xbelNode = xmlNewDocNode (doc, NULL, BAD_CAST"xbel", NULL);
+	xmlNewProp (xbelNode, BAD_CAST"version", BAD_CAST"1.0");
+
+	for (iter = channels; iter; iter = g_list_next (iter)) {
+		channel = (GrssFeedChannel*) iter->data;
+		childNode = xmlNewChild (xbelNode, NULL, BAD_CAST"bookmark", NULL);
+		xmlNewProp (childNode, BAD_CAST"href", BAD_CAST grss_feed_channel_get_source (channel));
+		xmlNewTextChild (childNode, NULL, BAD_CAST"title", BAD_CAST grss_feed_channel_get_title (channel));
+	}
+
+	xmlDocSetRootElement (doc, xbelNode);
+	xmlDocDumpFormatMemoryEnc (doc, &ret, &size, "utf-8", 1);
+	xmlFreeDoc (doc);
 
-	return NULL;
+	return (gchar*) ret;
 }
 
 static void
 grss_feeds_group_handler_interface_init (GrssFeedsGroupHandlerInterface *iface)
 {
+	iface->get_name = feeds_xbel_group_handler_get_name;
 	iface->check_format = feeds_xbel_group_handler_check_format;
 	iface->parse = feeds_xbel_group_handler_parse;
 	iface->dump = feeds_xbel_group_handler_dump;
diff --git a/src/feeds-xoxo-group-handler.c b/src/feeds-xoxo-group-handler.c
index cad963a..2e43b0a 100644
--- a/src/feeds-xoxo-group-handler.c
+++ b/src/feeds-xoxo-group-handler.c
@@ -60,6 +60,12 @@ feeds_xoxo_group_handler_finalize (GObject *object)
 	G_OBJECT_CLASS (feeds_xoxo_group_handler_parent_class)->finalize (object);
 }
 
+static const gchar*
+feeds_xoxo_group_handler_get_name (GrssFeedsGroupHandler *self)
+{
+	return "XOXO";
+}
+
 static gboolean
 feeds_xoxo_group_handler_check_format (GrssFeedsGroupHandler *self, xmlDocPtr doc, xmlNodePtr cur)
 {
@@ -121,16 +127,44 @@ feeds_xoxo_group_handler_parse (GrssFeedsGroupHandler *self, xmlDocPtr doc, GErr
 static gchar*
 feeds_xoxo_group_handler_dump (GrssFeedsGroupHandler *self, GList *channels, GError **error)
 {
-	/**
-		TODO
-	*/
+	int size;
+	xmlChar *ret;
+	xmlDocPtr doc;
+	xmlNodePtr xoxoNode;
+	xmlNodePtr childNode;
+	xmlNodePtr linkNode;
+	xmlNodePtr funkyNode;
+	GList *iter;
+	GrssFeedChannel *channel;
+
+	doc = xmlNewDoc (BAD_CAST"1.0");
+
+	xoxoNode = xmlNewDocNode (doc, NULL, BAD_CAST"ol", NULL);
+	xmlNewProp (xoxoNode, BAD_CAST"class", BAD_CAST"xoxo");
+
+	funkyNode = xmlNewChild (xoxoNode, NULL, BAD_CAST"li", NULL);
+	funkyNode = xmlNewChild (funkyNode, NULL, BAD_CAST"ol", NULL);
+	funkyNode = xmlNewChild (funkyNode, NULL, BAD_CAST"li", NULL);
+	funkyNode = xmlNewChild (funkyNode, NULL, BAD_CAST"ul", NULL);
+
+	for (iter = channels; iter; iter = g_list_next (iter)) {
+		channel = (GrssFeedChannel*) iter->data;
+		childNode = xmlNewChild (funkyNode, NULL, BAD_CAST"li", NULL);
+		linkNode = xmlNewTextChild (childNode, NULL, BAD_CAST"a", BAD_CAST grss_feed_channel_get_title (channel));
+		xmlNewProp (linkNode, BAD_CAST"href", BAD_CAST grss_feed_channel_get_source (channel));
+	}
+
+	xmlDocSetRootElement (doc, xoxoNode);
+	xmlDocDumpFormatMemoryEnc (doc, &ret, &size, "utf-8", 1);
+	xmlFreeDoc (doc);
 
-	return NULL;
+	return (gchar*) ret;
 }
 
 static void
 grss_feeds_group_handler_interface_init (GrssFeedsGroupHandlerInterface *iface)
 {
+	iface->get_name = feeds_xoxo_group_handler_get_name;
 	iface->check_format = feeds_xoxo_group_handler_check_format;
 	iface->parse = feeds_xoxo_group_handler_parse;
 	iface->dump = feeds_xoxo_group_handler_dump;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]