diff --git a/src/backend/readmng.c b/src/backend/readmng.c index 2fd2cf4..1c66981 100644 --- a/src/backend/readmng.c +++ b/src/backend/readmng.c @@ -28,11 +28,15 @@ G_DEFINE_TYPE (MgBackendReadmng, mg_backend_readmng, G_TYPE_OBJECT) static GParamSpec *mg_backend_readmng_properties[MG_BACKEND_READMNG_N_PROPERTIES] = { NULL, }; +static void +mg_backend_readmng_dispose (GObject *object); + static void mg_backend_readmng_class_init (MgBackendReadmngClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); object_class->set_property = mg_backend_readmng_set_property; object_class->get_property = mg_backend_readmng_get_property; + object_class->dispose = mg_backend_readmng_dispose; mg_backend_readmng_properties[MG_BACKEND_READMNG_BASE_URL] = g_param_spec_string ("base_url", "BaseURL", @@ -89,6 +93,16 @@ mg_backend_readmng_init (MgBackendReadmng *self) { } self->xml_utils = mg_util_xml_new (); } +static void +mg_backend_readmng_dispose (GObject *object) { + MgBackendReadmng *self = MG_BACKEND_READMNG (object); + g_clear_object (&self->xml_utils); + if (self->main_page_html) { + g_free (self->main_page_html); + self->main_page_html = NULL; + } + G_OBJECT_CLASS (mg_backend_readmng_parent_class)->dispose (object); +} char * mg_backend_readmng_get_base_url (MgBackendReadmng *self) { @@ -139,6 +153,8 @@ mg_backend_readmng_get_featured_manga (MgBackendReadmng *self) { xmlDocPtr html_document; html_document = mg_backend_readmng_fetch_xml_main_page (self); mangas = mg_backend_readmng_parse_main_page (self, html_document); + + xmlFreeDoc (html_document); return mangas; } @@ -157,7 +173,7 @@ mg_backend_readmng_retrieve_manga_details (MgBackendReadmng *self, size_t movie_detail_len = 0; if (mg_manga_has_details (manga)) { - return; + goto cleanup_mg_backend_readmng_retrieve_manga_details; } xml_utils = self->xml_utils; @@ -168,7 +184,7 @@ mg_backend_readmng_retrieve_manga_details (MgBackendReadmng *self, node_set = xpath_result->nodesetval; if (!node_set) { fprintf(stderr, "No match\n"); - return; + goto cleanup_mg_backend_readmng_retrieve_manga_details; } for (int i = 0; i < node_set->nodeNr; i++) { xmlNodePtr node = node_set->nodeTab[i]; @@ -182,6 +198,8 @@ mg_backend_readmng_retrieve_manga_details (MgBackendReadmng *self, manga_chapters = mg_backend_readmng_recover_chapter_list (self, html_document); mg_manga_set_chapter_list (manga, manga_chapters); mg_manga_details_recovered (manga); +cleanup_mg_backend_readmng_retrieve_manga_details: + g_free (movie_detail); } static GListStore * @@ -201,7 +219,7 @@ mg_backend_readmng_recover_chapter_list (MgBackendReadmng *self, node_set = xpath_result->nodesetval; if (!node_set) { fprintf(stderr, "No matching ul\n"); - return return_value; + goto cleanup_mg_backend_readmng_recover_chapter_list; } for (int i = 0; i < node_set->nodeNr; i++) { xmlNodePtr node = node_set->nodeTab[i]; @@ -210,7 +228,7 @@ mg_backend_readmng_recover_chapter_list (MgBackendReadmng *self, } if (!ul_len) { fprintf(stderr, "No matching chp_lst\n"); - return return_value; + goto cleanup_mg_backend_readmng_recover_chapter_list; } ul = uls[0]; for (xmlNodePtr li = ul->children; li; li = li->next) { @@ -221,6 +239,10 @@ mg_backend_readmng_recover_chapter_list (MgBackendReadmng *self, } } } +cleanup_mg_backend_readmng_recover_chapter_list: + if (uls) { + g_free (uls); + } return return_value; } @@ -282,6 +304,7 @@ mg_backend_readmng_fetch_xml_details (MgBackendReadmng *self, char *html_response = mg_util_soup_get_request (util_soup, request_url, &response_len); + g_object_unref (util_soup); return htmlReadMemory (html_response, response_len, NULL, NULL, HTML_PARSE_RECOVER | HTML_PARSE_NODEFDTD | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING ); @@ -307,6 +330,7 @@ mg_backend_readmng_get_main_page (MgBackendReadmng *self, size_t *len) { MgUtilSoup *util_soup = mg_util_soup_new (); self->main_page_html = mg_util_soup_get_request (util_soup, self->base_url, &self->main_page_html_len); + g_object_unref (util_soup); } if (len) { *len = self->main_page_html_len; @@ -329,6 +353,7 @@ mg_backend_readmng_parse_main_page (MgBackendReadmng *self, const xmlDocPtr html mangas, current_li); } + g_free (li); return mangas; } @@ -368,7 +393,7 @@ mg_backend_readmng_retrieve_slides (MgBackendReadmng *self, const xmlDocPtr html node_set = xpath_result->nodesetval; if (!node_set) { fprintf(stderr, "No match\n"); - return NULL; + goto cleanup_mg_backend_readmng_retrieve_slides; } for (int i = 0; i < node_set->nodeNr; i++) { xmlNodePtr node = node_set->nodeTab[i]; @@ -381,6 +406,8 @@ mg_backend_readmng_retrieve_slides (MgBackendReadmng *self, const xmlDocPtr html if (xpath_result) { xmlXPathFreeObject(xpath_result); } +cleanup_mg_backend_readmng_retrieve_slides: + g_free (nodes); return slides; } diff --git a/src/util/xml.c b/src/util/xml.c index d701407..eee52f6 100644 --- a/src/util/xml.c +++ b/src/util/xml.c @@ -36,14 +36,15 @@ mg_util_xml_new () { xmlNodePtr * mg_util_xml_find_class (MgUtilXML *self, xmlNodePtr node, char *class, size_t *len, xmlNodePtr *nodes, int return_on_first) { + char *attr = NULL; for (xmlNodePtr child = node->children; child; child=child->next) { - char *attr = mg_util_xml_get_attr (self, child, "class"); + attr = mg_util_xml_get_attr (self, child, "class"); if (attr && mg_util_xml_has_class (self, attr, class)) { (*len)++; nodes = g_realloc (nodes, sizeof *nodes * *len); nodes[*len-1] = child; if (return_on_first) { - return nodes; + goto cleanup_mg_util_xml_find_class; } } if (node->children) { @@ -52,11 +53,15 @@ mg_util_xml_find_class (MgUtilXML *self, xmlNodePtr node, char *class, nodes = mg_util_xml_find_class (self, child, class, len, nodes, return_on_first); if (*len) { - return nodes; + goto cleanup_mg_util_xml_find_class; } } } } +cleanup_mg_util_xml_find_class: + if (attr) { + g_free (attr); + } return nodes; } diff --git a/src/view/detail_manga.c b/src/view/detail_manga.c index 6fcf9be..fafff58 100644 --- a/src/view/detail_manga.c +++ b/src/view/detail_manga.c @@ -26,7 +26,9 @@ reverse_list (GtkButton *reverse_button, g_list_store_append (new_model, MG_MANGA_CHAPTER (g_list_model_get_item (G_LIST_MODEL (model), i))); } - gtk_single_selection_set_model (selection, G_LIST_MODEL (new_model)); + GtkSingleSelection *new_selection = gtk_single_selection_new + (G_LIST_MODEL (new_model)); + gtk_list_view_set_model (list_view, GTK_SELECTION_MODEL (new_selection)); g_object_unref (G_OBJECT (model)); } @@ -62,8 +64,9 @@ create_detail_view (MgManga *manga) { GtkListView *chapter_list = NULL; GtkPicture *manga_image = create_picture_from_url ( mg_manga_get_image_url(manga), 200); + char *manga_title_text = mg_manga_get_title (manga); char *title_text = mg_util_xml_get_title_text ( - xml_util, mg_manga_get_title (manga)); + xml_util, manga_title_text); char *description_text; scroll = gtk_scrolled_window_new (); @@ -98,8 +101,12 @@ create_detail_view (MgManga *manga) { gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_append (detail_view, GTK_WIDGET (toggle_folded_button)); - gtk_box_append (detail_view, GTK_WIDGET (reverse_list_button)); gtk_box_append (detail_view, scroll); + gtk_box_append (detail_view, GTK_WIDGET (reverse_list_button)); + g_clear_object (&readmng); + g_free (manga_title_text); + g_free (title_text); + g_free (description_text); return detail_view; } diff --git a/src/view/list_view_manga.c b/src/view/list_view_manga.c index 8b8ec51..5efacd6 100644 --- a/src/view/list_view_manga.c +++ b/src/view/list_view_manga.c @@ -50,14 +50,16 @@ setup_list_view_mangas (GtkSignalListItemFactory *factory, gpointer user_data) { MgManga *manga = gtk_list_item_get_item (list_item); GtkBox *box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); + char *manga_title = mg_manga_get_title (manga); - GtkWidget *label = gtk_label_new (mg_manga_get_title (manga)); + GtkWidget *label = gtk_label_new (manga_title); GtkWidget *picture = GTK_WIDGET ( create_picture_from_url (mg_manga_get_image_url(manga), 200)); gtk_box_append (box, picture); gtk_box_append (box, label); gtk_list_item_set_child (list_item, GTK_WIDGET (box)); + g_free (manga_title); } GtkListView * diff --git a/src/view/main_view.c b/src/view/main_view.c index 48b16a6..daab1a6 100644 --- a/src/view/main_view.c +++ b/src/view/main_view.c @@ -44,6 +44,7 @@ activate (AdwApplication *app, gtk_box_append (box, GTK_WIDGET (views_leaflet)); gtk_widget_show (window); + g_clear_object (&readmng); } static GtkBox * diff --git a/src/view/picture.c b/src/view/picture.c index a06ac07..e8dbd78 100644 --- a/src/view/picture.c +++ b/src/view/picture.c @@ -7,7 +7,7 @@ GtkPicture * create_picture_from_url (char *url, gint picture_height) { - GtkPicture *picture; + GtkPicture *picture = NULL; GFileIOStream *iostream; GFile *tmp_image; GError *error = NULL; @@ -21,16 +21,19 @@ create_picture_from_url (char *url, gint picture_height) { tmp_image = g_file_new_tmp ("mangareadertmpfileXXXXXX", &iostream, &error); if (error) { fprintf (stderr, "Unable to read file: %s\n", error->message); - return NULL; + goto cleanup_create_picture_from_url; } error = NULL; g_output_stream_write (g_io_stream_get_output_stream (G_IO_STREAM (iostream)), downloaded_image, size_downloaded_image, NULL, &error); if (error) { fprintf (stderr, "Unable to write file: %s\n", error->message); - return NULL; + goto cleanup_create_picture_from_url; } picture = GTK_PICTURE (gtk_picture_new_for_file (tmp_image)); g_object_set_property_int (G_OBJECT(picture), "height-request", picture_height); + +cleanup_create_picture_from_url: + g_free (downloaded_image); return picture; }