forked from sergiotarxz/mangareader
Multiple bug and leaks fixes.
This commit is contained in:
parent
5287d215dc
commit
d91cd296a9
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 *
|
||||
|
@ -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 *
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user