[libgrss] Added grss_feeds_group_get_formats() Implemented grss_feeds_group_export_file()
- From: Roberto Guido <rguido src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgrss] Added grss_feeds_group_get_formats() Implemented grss_feeds_group_export_file()
- Date: Mon, 13 Feb 2012 00:22:57 +0000 (UTC)
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]