Submitted By: Douglas R. Reno Date: 2019-09-10 Initial Package Version: 0.7.0 Upstream Status: Submitted (PR) Origin: Self Description: Fixes several bugs in libgrss. This includes porting to the new libsoup API, fixing memory leaks, bumping the version to the one that tracker-miners wants, fixing signal emission problems, upgrading g-i files, fixing authentication bugs, and porting from GSimpleAsync to GTask. diff -Naurp libgrss-0.7.0.orig/configure.ac libgrss-0.7.0/configure.ac --- libgrss-0.7.0.orig/configure.ac 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/configure.ac 2019-04-10 00:01:12.448526750 -0500 @@ -2,13 +2,13 @@ # bump micro_version to the next odd number after each release m4_define([grss_major_version], [0]) m4_define([grss_minor_version], [7]) -m4_define([grss_micro_version], [0]) +m4_define([grss_micro_version], [1]) m4_define([grss_version], [grss_major_version.grss_minor_version.grss_micro_version]) # bump up by 1 for every micro release with no API changes, otherwise # set to 0. after release, bump up by 1 -m4_define([grss_interface_age], [0]) +m4_define([grss_interface_age], [1]) m4_define([grss_binary_age], [m4_eval(100 * grss_minor_version + grss_micro_version)]) m4_define([lt_current], [m4_eval(100 * grss_minor_version + grss_micro_version - grss_interface_age)]) diff -Naurp libgrss-0.7.0.orig/doc/reference/libgrss-docs.sgml libgrss-0.7.0/doc/reference/libgrss-docs.sgml --- libgrss-0.7.0.orig/doc/reference/libgrss-docs.sgml 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/doc/reference/libgrss-docs.sgml 2019-04-09 23:51:42.414042258 -0500 @@ -55,7 +55,6 @@ - diff -Naurp libgrss-0.7.0.orig/doc/reference/version.xml.in libgrss-0.7.0/doc/reference/version.xml.in --- libgrss-0.7.0.orig/doc/reference/version.xml.in 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/doc/reference/version.xml.in 2019-04-10 00:01:52.056757372 -0500 @@ -1 +1 @@ -@LIBGRSS_VERSION@ +@GRSS_VERSION@ diff -Naurp libgrss-0.7.0.orig/src/feed-atom-handler.c libgrss-0.7.0/src/feed-atom-handler.c --- libgrss-0.7.0.orig/src/feed-atom-handler.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feed-atom-handler.c 2019-04-10 00:28:07.125200045 -0500 @@ -63,6 +63,14 @@ feed_atom_handler_error_quark () static void feed_atom_handler_finalize (GObject *object) { + /* Ensure that the Feed Atom Handler's hash tables and objects are cleared + * properly. Without this, we risk triggering a memory leak. */ + FeedAtomHandler *self = FEED_ATOM_HANDLER (object); + + g_clear_object (&self->priv->handler); + g_hash_table_destroy (self->priv->feed_elements_hash); + g_hash_table_destroy (self->priv->entry_elements_hash); + G_OBJECT_CLASS (feed_atom_handler_parent_class)->finalize (object); } @@ -329,6 +337,8 @@ atom10_parse_link (xmlNodePtr cur, GrssF const gchar *home; gchar *alternate = NULL; + g_return_val_if_fail (GRSS_IS_FEED_CHANNEL (feed), NULL); + href = (gchar*) xmlGetNsProp (cur, BAD_CAST"href", NULL); if (href) { @@ -384,11 +394,9 @@ atom10_parse_link (xmlNodePtr cur, GrssF */ } else if (g_str_equal (relation, "hub")) { - if (feed != NULL) grss_feed_channel_set_pubsubhub (feed, url); } else if (g_str_equal (relation, "self")) { - if (feed != NULL) grss_feed_channel_set_source (feed, url); } @@ -782,7 +790,7 @@ feed_atom_handler_parse (FeedHandler *se parser = FEED_ATOM_HANDLER (self); while (TRUE) { - if (xmlStrcmp (cur->name, BAD_CAST"feed")) { + if (!cur || xmlStrcmp (cur->name, BAD_CAST"feed")) { g_set_error (error, FEED_ATOM_HANDLER_ERROR, FEED_ATOM_HANDLER_PARSE_ERROR, "Could not find Atom 1.0 header!"); break; } diff -Naurp libgrss-0.7.0.orig/src/feed-channel.c libgrss-0.7.0/src/feed-channel.c --- libgrss-0.7.0.orig/src/feed-channel.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feed-channel.c 2019-04-10 00:45:23.191159682 -0500 @@ -103,6 +103,8 @@ grss_feed_channel_finalize (GObject *obj FREE_STRING (chan->priv->rsscloud.path); FREE_STRING (chan->priv->rsscloud.protocol); FREE_STRING (chan->priv->copyright); + FREE_STRING (chan->priv->format); + FREE_STRING (chan->priv->source); if (chan->priv->editor) grss_person_unref (chan->priv->editor); FREE_STRING (chan->priv->webmaster); @@ -215,6 +217,7 @@ GrssFeedChannel* grss_feed_channel_new_from_memory (const gchar *data, GError **error) { xmlDocPtr doc; + GrssFeedChannel *ret; doc = content_to_xml (data, strlen (data)); if (doc == NULL) { @@ -222,7 +225,11 @@ grss_feed_channel_new_from_memory (const return NULL; } - return grss_feed_channel_new_from_xml (doc, error); + ret = grss_feed_channel_new_from_xml (doc, error); + + xmlFreeDoc (doc); + + return ret; } /** @@ -944,7 +951,6 @@ static gboolean quick_and_dirty_parse (GrssFeedChannel *channel, SoupMessage *msg, GList **save_items) { GList *items; - GList *iter; xmlDocPtr doc; GrssFeedParser *parser; @@ -1010,7 +1016,7 @@ grss_feed_channel_fetch (GrssFeedChannel ret = FALSE; - session = soup_session_sync_new (); + session = soup_session_new (); init_soup_session (session, channel); msg = soup_message_new ("GET", grss_feed_channel_get_source (channel)); @@ -1036,26 +1042,27 @@ grss_feed_channel_fetch (GrssFeedChannel static void feed_downloaded (SoupSession *session, SoupMessage *msg, gpointer user_data) { guint status; - GSimpleAsyncResult *result; + GTask *task; GrssFeedChannel *channel; - result = user_data; - channel = GRSS_FEED_CHANNEL (g_async_result_get_source_object (G_ASYNC_RESULT (result))); + task = user_data; + channel = GRSS_FEED_CHANNEL (g_task_get_source_object (task)); g_object_get (msg, "status-code", &status, NULL); if (status >= 200 && status <= 299) { if (quick_and_dirty_parse (channel, msg, NULL) == FALSE) - g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR, + g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR, "Unable to parse feed from %s", grss_feed_channel_get_source (channel)); + else + g_task_return_boolean (task, TRUE); } else { - g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR, + g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR, "Unable to download from %s", grss_feed_channel_get_source (channel)); } - g_simple_async_result_complete_in_idle (result); g_clear_object (&channel->priv->fetchcancel); - g_object_unref (result); + g_object_unref (task); } /** @@ -1074,10 +1081,7 @@ feed_downloaded (SoupSession *session, S gboolean grss_feed_channel_fetch_finish (GrssFeedChannel *channel, GAsyncResult *res, GError **error) { - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return FALSE; - else - return TRUE; + return g_task_propagate_boolean (G_TASK (res), error); } static void @@ -1098,7 +1102,7 @@ do_prefetch (GrssFeedChannel *channel) void grss_feed_channel_fetch_async (GrssFeedChannel *channel, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *result; + GTask *task; SoupMessage *msg; SoupSession *session; @@ -1107,16 +1111,15 @@ grss_feed_channel_fetch_async (GrssFeedC */ do_prefetch (channel); - result = g_simple_async_result_new (G_OBJECT (channel), callback, user_data, grss_feed_channel_fetch_async); - g_simple_async_result_set_check_cancellable (result, channel->priv->fetchcancel); + task = g_task_new (channel, channel->priv->fetchcancel, callback, user_data); - session = soup_session_async_new (); + session = soup_session_new (); init_soup_session (session, channel); msg = soup_message_new ("GET", grss_feed_channel_get_source (channel)); init_soup_message (msg, channel); - soup_session_queue_message (session, msg, feed_downloaded, result); + soup_session_queue_message (session, msg, feed_downloaded, task); } /** @@ -1140,7 +1143,7 @@ grss_feed_channel_fetch_all (GrssFeedCha SoupMessage *msg; SoupSession *session; - session = soup_session_sync_new (); + session = soup_session_new (); init_soup_session (session, channel); msg = soup_message_new ("GET", grss_feed_channel_get_source (channel)); @@ -1182,30 +1185,29 @@ feed_downloaded_return_items (SoupSessio { guint status; GList *items; - GSimpleAsyncResult *result; + GTask *task; GrssFeedChannel *channel; - result = user_data; - channel = GRSS_FEED_CHANNEL (g_async_result_get_source_object (G_ASYNC_RESULT (result))); + task = user_data; + channel = GRSS_FEED_CHANNEL (g_task_get_source_object (task)); g_object_get (msg, "status-code", &status, NULL); if (status >= 200 && status <= 299) { items = NULL; if (quick_and_dirty_parse (channel, msg, &items) == TRUE) - g_simple_async_result_set_op_res_gpointer (result, items, free_items_list); + g_task_return_pointer (task, items, free_items_list); else - g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR, + g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR, "Unable to parse feed from %s", grss_feed_channel_get_source (channel)); } else { - g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR, + g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR, "Unable to download from %s", grss_feed_channel_get_source (channel)); } - g_simple_async_result_complete_in_idle (result); g_clear_object (&channel->priv->fetchcancel); - g_object_unref (result); + g_object_unref (task); } /** @@ -1219,21 +1221,20 @@ feed_downloaded_return_items (SoupSessio void grss_feed_channel_fetch_all_async (GrssFeedChannel *channel, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *result; + GTask *task; SoupMessage *msg; SoupSession *session; do_prefetch (channel); - result = g_simple_async_result_new (G_OBJECT (channel), callback, user_data, grss_feed_channel_fetch_async); - g_simple_async_result_set_check_cancellable (result, channel->priv->fetchcancel); + task = g_task_new (channel, channel->priv->fetchcancel, callback, user_data); - session = soup_session_async_new (); + session = soup_session_new (); init_soup_session (session, channel); msg = soup_message_new ("GET", grss_feed_channel_get_source (channel)); init_soup_message (msg, channel); - soup_session_queue_message (session, msg, feed_downloaded_return_items, result); + soup_session_queue_message (session, msg, feed_downloaded_return_items, task); } /** @@ -1254,10 +1255,7 @@ grss_feed_channel_fetch_all_async (GrssF GList* grss_feed_channel_fetch_all_finish (GrssFeedChannel *channel, GAsyncResult *res, GError **error) { - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return NULL; - else - return (GList*) g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); + return g_task_propagate_pointer (G_TASK (res), error); } /** @@ -1275,11 +1273,10 @@ grss_feed_channel_fetch_cancel (GrssFeed { if (channel->priv->fetchcancel != NULL) { g_cancellable_cancel (channel->priv->fetchcancel); - g_object_unref (channel->priv->fetchcancel); + g_clear_object (&channel->priv->fetchcancel); return TRUE; } else { return FALSE; } } - diff -Naurp libgrss-0.7.0.orig/src/feed-enclosure.c libgrss-0.7.0/src/feed-enclosure.c --- libgrss-0.7.0.orig/src/feed-enclosure.c 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/feed-enclosure.c 2019-04-10 00:21:24.288851984 -0500 @@ -219,7 +219,7 @@ grss_feed_enclosure_fetch (GrssFeedEnclo ret = NULL; url = grss_feed_enclosure_get_url (enclosure); - session = soup_session_sync_new (); + session = soup_session_new (); msg = soup_message_new ("GET", url); status = soup_session_send_message (session, msg); @@ -239,12 +239,12 @@ enclosure_downloaded (SoupSession *sessi guint status; const gchar *url; GFile *file; - GSimpleAsyncResult *result; + GTask *task; GrssFeedEnclosure *enclosure; GError *error; - result = user_data; - enclosure = GRSS_FEED_ENCLOSURE (g_async_result_get_source_object (G_ASYNC_RESULT (result))); + task = user_data; + enclosure = GRSS_FEED_ENCLOSURE (g_task_get_source_object (task)); url = grss_feed_enclosure_get_url (enclosure); g_object_get (msg, "status-code", &status, NULL); @@ -253,17 +253,16 @@ enclosure_downloaded (SoupSession *sessi file = msg_to_internal_file (enclosure, msg, &error); if (file != NULL) - g_simple_async_result_set_op_res_gpointer (result, file, g_object_unref); + g_task_return_pointer (task, file, g_object_unref); else - g_simple_async_result_take_error (result, error); + g_task_return_error (task, error); } else { - g_simple_async_result_set_error (result, FEED_ENCLOSURE_ERROR, FEED_ENCLOSURE_FETCH_ERROR, + g_task_return_new_error (task, FEED_ENCLOSURE_ERROR, FEED_ENCLOSURE_FETCH_ERROR, "Unable to download from %s", url); } - g_simple_async_result_complete_in_idle (result); - g_object_unref (result); + g_object_unref (task); } /** @@ -277,14 +276,14 @@ enclosure_downloaded (SoupSession *sessi void grss_feed_enclosure_fetch_async (GrssFeedEnclosure *enclosure, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *result; + GTask *task; SoupMessage *msg; SoupSession *session; - result = g_simple_async_result_new (G_OBJECT (enclosure), callback, user_data, grss_feed_enclosure_fetch_async); - session = soup_session_async_new (); + task = g_task_new (enclosure, NULL, callback, user_data); + session = soup_session_new (); msg = soup_message_new ("GET", grss_feed_enclosure_get_url (enclosure)); - soup_session_queue_message (session, msg, enclosure_downloaded, result); + soup_session_queue_message (session, msg, enclosure_downloaded, task); } /** @@ -303,8 +302,5 @@ grss_feed_enclosure_fetch_async (GrssFee GFile* grss_feed_enclosure_fetch_finish (GrssFeedEnclosure *enclosure, GAsyncResult *res, GError **error) { - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return NULL; - else - return (GFile*) g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); + return g_task_propagate_pointer (G_TASK (res), error); } diff -Naurp libgrss-0.7.0.orig/src/feed-item.c libgrss-0.7.0/src/feed-item.c --- libgrss-0.7.0.orig/src/feed-item.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feed-item.c 2019-04-10 00:02:49.610543227 -0500 @@ -136,7 +136,6 @@ grss_feed_item_new (GrssFeedChannel *par item = GRSS_FEED_ITEM (g_object_new (GRSS_FEED_ITEM_TYPE, NULL)); item->priv->parent = parent; - item->priv->pub_time = time (NULL); return item; } diff -Naurp libgrss-0.7.0.orig/src/feed-parser.c libgrss-0.7.0/src/feed-parser.c --- libgrss-0.7.0.orig/src/feed-parser.c 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/feed-parser.c 2019-04-09 23:31:31.714083101 -0500 @@ -65,6 +65,9 @@ grss_feed_parser_error_quark () static void grss_feed_parser_finalize (GObject *object) { + GrssFeedParser *parser = GRSS_FEED_PARSER (object); + g_slist_free_full (parser->priv->handlers, g_object_unref); + G_OBJECT_CLASS (grss_feed_parser_parent_class)->finalize (object); } @@ -89,24 +92,26 @@ feed_parsers_get_list (GrssFeedParser *p FeedHandler *feed; NSHandler *ns; - ns = ns_handler_new (); - if (parser->priv->handlers == NULL) { /* - TODO Parsers may be dinamically loaded and managed as external plugins + TODO Parsers may be dynamically loaded and managed as external plugins */ + ns = ns_handler_new (); + feed = FEED_HANDLER (feed_rss_handler_new ()); - feed_handler_set_ns_handler (feed, ns); + feed_handler_set_ns_handler (feed, g_object_ref (ns)); parser->priv->handlers = g_slist_append (parser->priv->handlers, feed); feed = FEED_HANDLER (feed_atom_handler_new ()); /* Must be before pie */ - feed_handler_set_ns_handler (feed, ns); + feed_handler_set_ns_handler (feed, g_object_ref (ns)); parser->priv->handlers = g_slist_append (parser->priv->handlers, feed); feed = FEED_HANDLER (feed_pie_handler_new ()); - feed_handler_set_ns_handler (feed, ns); + feed_handler_set_ns_handler (feed, g_object_ref (ns)); parser->priv->handlers = g_slist_append (parser->priv->handlers, feed); + + g_object_unref (ns); } return parser->priv->handlers; diff -Naurp libgrss-0.7.0.orig/src/feed-pie-handler.c libgrss-0.7.0/src/feed-pie-handler.c --- libgrss-0.7.0.orig/src/feed-pie-handler.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feed-pie-handler.c 2019-04-10 00:24:39.979851646 -0500 @@ -62,7 +62,11 @@ feed_pie_handler_error_quark () static void feed_pie_handler_finalize (GObject *object) { - G_OBJECT_CLASS (feed_pie_handler_parent_class)->finalize (object); + FeedPieHandler *self = FEED_PIE_HANDLER (object); + + g_clear_object (&self->priv->handler); + + G_OBJECT_CLASS (feed_pie_handler_parent_class)->finalize (object); } static void @@ -326,7 +330,7 @@ feed_pie_handler_parse (FeedHandler *sel cur = cur->next; while (TRUE) { - if (xmlStrcmp (cur->name, BAD_CAST"feed")) { + if (!cur || xmlStrcmp (cur->name, BAD_CAST"feed")) { g_set_error (error, FEED_PIE_HANDLER_ERROR, FEED_PIE_HANDLER_PARSE_ERROR, "Could not find Atom/PIE header!"); break; } diff -Naurp libgrss-0.7.0.orig/src/feed-rss-formatter.c libgrss-0.7.0/src/feed-rss-formatter.c --- libgrss-0.7.0.orig/src/feed-rss-formatter.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feed-rss-formatter.c 2019-04-09 23:35:19.729038185 -0500 @@ -41,8 +41,7 @@ feed_rss_formatter_format (GrssFeedForma time_t date; GList *iter; GList *items; - GrssPerson *person; - const GList *list; + GrssPerson *person; GString *text; GrssFeedChannel *channel; GrssFeedItem *item; diff -Naurp libgrss-0.7.0.orig/src/feed-rss-handler.c libgrss-0.7.0/src/feed-rss-handler.c --- libgrss-0.7.0.orig/src/feed-rss-handler.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feed-rss-handler.c 2019-04-10 00:26:49.126809861 -0500 @@ -75,6 +75,11 @@ feed_rss_handler_error_quark () static void feed_rss_handler_finalize (GObject *object) { + + FeedRssHandler *self = FEED_RSS_HANDLER (object); + + g_clear_object (&self->priv->handler); + G_OBJECT_CLASS (feed_rss_handler_parent_class)->finalize (object); } @@ -452,16 +457,17 @@ feed_rss_handler_parse (FeedHandler *sel while (cur && xmlIsBlankNode (cur)) cur = cur->next; - if (!xmlStrcmp (cur->name, BAD_CAST"rss")) { + if (cur && !xmlStrcmp (cur->name, BAD_CAST"rss")) { cur = cur->xmlChildrenNode; rdf = FALSE; } - else if (!xmlStrcmp (cur->name, BAD_CAST"rdf") || - !xmlStrcmp (cur->name, BAD_CAST"RDF")) { + else if (cur && + (!xmlStrcmp (cur->name, BAD_CAST"rdf") || + !xmlStrcmp (cur->name, BAD_CAST"RDF"))) { cur = cur->xmlChildrenNode; rdf = TRUE; } - else if (!xmlStrcmp (cur->name, BAD_CAST"Channel")) { + else if (cur && !xmlStrcmp (cur->name, BAD_CAST"Channel")) { rdf = FALSE; } else { diff -Naurp libgrss-0.7.0.orig/src/feeds-group.c libgrss-0.7.0/src/feeds-group.c --- libgrss-0.7.0.orig/src/feeds-group.c 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/feeds-group.c 2019-04-10 00:37:07.985868698 -0500 @@ -238,7 +238,7 @@ grss_feeds_group_parse_file (GrssFeedsGr * @error: location for eventual errors. * * Creates a new file with the list of @channels rappresented in the required - * @format. It a file already exists at the @uri location, it is overwritten. + * @format. It the file already exists at the @uri location, it is overwritten. * * Returns: %TRUE if the file is created correctly, or %FALSE if an error * occours and @error is set. @@ -273,7 +273,7 @@ grss_feeds_group_export_file (GrssFeedsG } file = g_file_new_for_uri (uri); - stream = g_file_append_to (file, G_FILE_CREATE_NONE, NULL, &err); + stream = g_file_replace (file, NULL, TRUE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, &err); if (stream == NULL) { g_propagate_error (error, err); diff -Naurp libgrss-0.7.0.orig/src/feeds-pool.c libgrss-0.7.0/src/feeds-pool.c --- libgrss-0.7.0.orig/src/feeds-pool.c 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/feeds-pool.c 2019-04-10 00:53:11.331558847 -0500 @@ -177,7 +177,7 @@ grss_feeds_pool_init (GrssFeedsPool *nod node->priv = FEEDS_POOL_GET_PRIVATE (node); memset (node->priv, 0, sizeof (GrssFeedsPoolPrivate)); node->priv->parser = grss_feed_parser_new (); - node->priv->soupsession = soup_session_async_new (); + node->priv->soupsession = soup_session_new (); } /** @@ -291,19 +291,21 @@ feed_downloaded (GObject *source, GAsync { GList *items; GrssFeedChannelWrap *feed; + GError *error = NULL; feed = (GrssFeedChannelWrap*) user_data; if (feed->pool->priv->running == FALSE) return; - items = grss_feed_channel_fetch_all_finish (GRSS_FEED_CHANNEL (source), res, NULL); + items = grss_feed_channel_fetch_all_finish (GRSS_FEED_CHANNEL (source), res, &error); - if (items != NULL) + if (error == NULL) g_signal_emit (feed->pool, signals [FEED_READY], 0, feed->channel, items, NULL); else g_signal_emit (feed->pool, signals [FEED_FAIL], 0, feed->channel, NULL); feed->next_fetch = time (NULL) + (grss_feed_channel_get_update_interval (feed->channel) * 60); + g_clear_error (&error); } static gboolean @@ -324,9 +326,11 @@ fetch_feeds (gpointer data) for (iter = pool->priv->feeds_list; iter; iter = g_list_next (iter)) { feed = (GrssFeedChannelWrap*) iter->data; - if (feed->next_fetch <= now) + if (feed->next_fetch <= now) { + g_signal_emit (feed->pool, signals[FEED_FETCHING], 0, feed->channel); grss_feed_channel_fetch_all_async (feed->channel, feed_downloaded, feed); - } + } + } return TRUE; } diff -Naurp libgrss-0.7.0.orig/src/feeds-publisher.c libgrss-0.7.0/src/feeds-publisher.c --- libgrss-0.7.0.orig/src/feeds-publisher.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/feeds-publisher.c 2019-04-10 00:34:22.232723193 -0500 @@ -102,7 +102,7 @@ enum { G_DEFINE_TYPE (GrssFeedsPublisher, grss_feeds_publisher, G_TYPE_OBJECT); static GQuark -feeds_publisher_error_quark () +feeds_publisher_error_quark (void) { return g_quark_from_static_string ("feeds_publisher_error"); } @@ -219,7 +219,7 @@ grss_feeds_publisher_init (GrssFeedsPubl * Returns: a new #GrssFeedsPublisher. */ GrssFeedsPublisher* -grss_feeds_publisher_new () +grss_feeds_publisher_new (void) { return g_object_new (FEEDS_PUBLISHER_TYPE, NULL); } @@ -624,7 +624,7 @@ remove_client_to_topic (GrssFeedsPublish } static gchar* -random_string () +random_string (void) { register int i; gchar str [50]; @@ -663,7 +663,7 @@ verification_message_for_client (RemoteS break; } - body = g_strdup_printf ("%s?hub.mode=%s&hub.topic=%s&hub.challenge=%s&hub.lease_seconds=%lld", + body = g_strdup_printf ("%s?hub.mode=%s&hub.topic=%s&hub.challenge=%s&hub.lease_seconds=%ld", client->callback, mode, client->topic, client->challenge, client->lease_interval); ret = soup_message_new ("GET", body); @@ -840,12 +840,18 @@ handle_incoming_requests_cb (SoupServer } } else if (strcmp (mode, "unsubscribe") == 0) { - client = search_subscriber_by_topic_and_callback (pub, topic, callback); - if (client != NULL) - client->status = REMOTE_UNSUBSCRIBING; + if (callback == NULL) { + soup_message_set_status (msg, 400); + } + else { + client = search_subscriber_by_topic_and_callback (pub, topic, callback); + + if (client != NULL) + client->status = REMOTE_UNSUBSCRIBING; + } } - if (client != NULL) { + if (client != NULL && verify != NULL) { verify_msg = verification_message_for_client (client); if (strcmp (verify, "sync") == 0) { @@ -859,6 +865,9 @@ handle_incoming_requests_cb (SoupServer soup_message_set_status (msg, 202); } } + else if (client != NULL) { + soup_message_set_status (msg, 400); + } } g_strfreev (contents); @@ -869,7 +878,7 @@ close_server (GrssFeedsPublisher *pub) { if (pub->priv->server != NULL) { soup_server_remove_handler (pub->priv->server, NULL); - soup_server_quit (pub->priv->server); + soup_server_disconnect (pub->priv->server); g_object_unref (pub->priv->server); pub->priv->server = NULL; } @@ -881,14 +890,15 @@ create_and_run_server (GrssFeedsPublishe SoupAddress *soup_addr; if (pub->priv->soupsession == NULL) - pub->priv->soupsession = soup_session_async_new (); + pub->priv->soupsession = soup_session_new (); soup_addr = soup_address_new_any (SOUP_ADDRESS_FAMILY_IPV4, pub->priv->port); pub->priv->server = soup_server_new ("port", pub->priv->port, "interface", soup_addr, NULL); g_object_unref (soup_addr); soup_server_add_handler (pub->priv->server, NULL, handle_incoming_requests_cb, pub, NULL); - soup_server_run_async (pub->priv->server); + /* TODO - Add IPv6 support - Send PR upstream */ + soup_server_listen_all (pub->priv->server, pub->priv->port, SOUP_SERVER_LISTEN_IPV4_ONLY, NULL); } /** diff -Naurp libgrss-0.7.0.orig/src/feeds-publisher.h libgrss-0.7.0/src/feeds-publisher.h --- libgrss-0.7.0.orig/src/feeds-publisher.h 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/feeds-publisher.h 2019-04-10 00:34:54.054712602 -0500 @@ -45,9 +45,9 @@ typedef struct { void (*delete_subscription) (GrssFeedsPublisher *pub, GrssFeedChannel *topic, gchar *callback); } GrssFeedsPublisherClass; -GType grss_feeds_publisher_get_type () G_GNUC_CONST; +GType grss_feeds_publisher_get_type (void) G_GNUC_CONST; -GrssFeedsPublisher* grss_feeds_publisher_new (); +GrssFeedsPublisher* grss_feeds_publisher_new (void); gchar* grss_feeds_publisher_format_content (GrssFeedsPublisher *pub, GrssFeedChannel *channel, GList *items, GError **error); gboolean grss_feeds_publisher_publish_web (GrssFeedsPublisher *pub, GrssFeedChannel *channel, GList *items, const gchar *id, GError **error); diff -Naurp libgrss-0.7.0.orig/src/feeds-subscriber.c libgrss-0.7.0/src/feeds-subscriber.c --- libgrss-0.7.0.orig/src/feeds-subscriber.c 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/feeds-subscriber.c 2019-04-09 23:47:50.782967714 -0500 @@ -389,7 +389,7 @@ close_server (GrssFeedsSubscriber *sub) { if (sub->priv->server != NULL) { unregister_handlers (sub); - soup_server_quit (sub->priv->server); + soup_server_disconnect (sub->priv->server); g_object_unref (sub->priv->server); sub->priv->server = NULL; } @@ -514,7 +514,7 @@ init_run_server (GrssFeedsSubscriber *su GInetAddress *addr; if (sub->priv->soupsession == NULL) - sub->priv->soupsession = soup_session_async_new (); + sub->priv->soupsession = soup_session_new (); /* Flow: diff -Naurp libgrss-0.7.0.orig/src/Makefile.am libgrss-0.7.0/src/Makefile.am --- libgrss-0.7.0.orig/src/Makefile.am 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/Makefile.am 2019-04-10 00:22:54.753625871 -0500 @@ -1,4 +1,4 @@ -SUBDIRS = tests +SUBDIRS = . tests NULL = @@ -128,6 +128,8 @@ introspection_sources = \ Grss-0.7.gir: libgrss.la Grss_0_7_gir_INCLUDES = GObject-2.0 Gio-2.0 Soup-2.4 libxml2-2.0 +Grss_0_7_gir_C_INCLUDES = libgrss.h +Grss_0_7_gir_EXPORT_PACKAGES = libgrss_ Grss_0_7_gir_CFLAGS = $(INCLUDES) Grss_0_7_gir_LIBS = libgrss.la Grss_0_7_gir_FILES = $(introspection_sources) diff -Naurp libgrss-0.7.0.orig/src/ns-handler.c libgrss-0.7.0/src/ns-handler.c --- libgrss-0.7.0.orig/src/ns-handler.c 2015-07-18 16:43:44.000000000 -0500 +++ libgrss-0.7.0/src/ns-handler.c 2019-04-09 23:48:42.071534115 -0500 @@ -502,7 +502,7 @@ ns_handler_init (NSHandler *node) memset (node->priv, 0, sizeof (NSHandlerPrivate)); node->priv->href_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); - node->priv->prefix_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); + node->priv->prefix_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); nsh = g_new0 (InternalNsHandler, 1); nsh->handle_channel = ns_admin_channel; @@ -545,7 +545,7 @@ ns_handler_init (NSHandler *node) nsh->handle_item = ns_dc_item; g_hash_table_insert (node->priv->prefix_handlers, "dc", nsh); g_hash_table_insert (node->priv->href_handlers, "http://purl.org/dc/elements/1.1/", nsh); - g_hash_table_insert (node->priv->href_handlers, "http://purl.org/dc/elements/1.0/", nsh); + g_hash_table_insert (node->priv->href_handlers, "http://purl.org/dc/elements/1.0/", g_memdup (nsh, sizeof(InternalNsHandler))); nsh = g_new0 (InternalNsHandler, 1); nsh->handle_channel = NULL; diff -Naurp libgrss-0.7.0.orig/src/tests/formatter.c libgrss-0.7.0/src/tests/formatter.c --- libgrss-0.7.0.orig/src/tests/formatter.c 2015-07-18 15:22:27.000000000 -0500 +++ libgrss-0.7.0/src/tests/formatter.c 2019-04-09 23:50:47.141354039 -0500 @@ -66,6 +66,9 @@ test_format_atom () formatter = grss_feed_atom_formatter_new (); do_the_job (GRSS_FEED_FORMATTER (formatter)); + + grss_feed_formatter_reset (GRSS_FEED_FORMATTER (formatter)); + g_object_unref (formatter); } static void @@ -75,6 +78,9 @@ test_format_rss () formatter = grss_feed_rss_formatter_new (); do_the_job (GRSS_FEED_FORMATTER (formatter)); + + grss_feed_formatter_reset (GRSS_FEED_FORMATTER (formatter)); + g_object_unref (formatter); } int diff -Naurp libgrss-0.7.0.orig/src/utils.c libgrss-0.7.0/src/utils.c --- libgrss-0.7.0.orig/src/utils.c 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/utils.c 2019-04-10 00:33:27.328014093 -0500 @@ -559,7 +559,7 @@ detect_internet_address () return NULL; sockfd = socket (AF_INET, SOCK_DGRAM, 0); - if (!sockfd) + if (sockfd < 0) return NULL; if (connect (sockfd, (struct sockaddr*) &serv_add, sizeof (serv_add)) == -1) { diff -Naurp libgrss-0.7.0.orig/src/utils.h libgrss-0.7.0/src/utils.h --- libgrss-0.7.0.orig/src/utils.h 2015-07-15 15:59:07.000000000 -0500 +++ libgrss-0.7.0/src/utils.h 2019-04-10 00:05:27.316424768 -0500 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include