forked from sergiotarxz/mangareader
301 lines
8.4 KiB
C
301 lines
8.4 KiB
C
#include <stdio.h>
|
|
|
|
#include <glib-object.h>
|
|
#include <gio/gio.h>
|
|
|
|
#include <openmg/util/string.h>
|
|
#include <openmg/manga.h>
|
|
#include <openmg/chapter.h>
|
|
|
|
struct _MgManga {
|
|
GObject parent_instance;
|
|
char *image_url;
|
|
char *title;
|
|
char *id;
|
|
char *description;
|
|
GListStore *chapter_list;
|
|
int has_details;
|
|
};
|
|
|
|
G_DEFINE_TYPE (MgManga, mg_manga, G_TYPE_OBJECT)
|
|
|
|
typedef enum {
|
|
MG_MANGA_IMAGE_URL = 1,
|
|
MG_MANGA_TITLE,
|
|
MG_MANGA_ID,
|
|
MG_MANGA_DESCRIPTION,
|
|
MG_MANGA_CHAPTER_LIST,
|
|
MG_MANGA_N_PROPERTIES
|
|
} MgMangaProperties;
|
|
|
|
static GParamSpec *manga_properties[MG_MANGA_N_PROPERTIES] = { NULL, };
|
|
|
|
static void
|
|
mg_manga_set_property (GObject *object,
|
|
guint property_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec);
|
|
static void
|
|
mg_manga_get_property (GObject *object,
|
|
guint property_id,
|
|
GValue *value,
|
|
GParamSpec *pspec);
|
|
|
|
static void
|
|
mg_manga_dispose (GObject *object);
|
|
|
|
static void
|
|
mg_manga_class_init (MgMangaClass *class) {
|
|
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
|
object_class->set_property = mg_manga_set_property;
|
|
object_class->get_property = mg_manga_get_property;
|
|
object_class->dispose = mg_manga_dispose;
|
|
|
|
manga_properties[MG_MANGA_IMAGE_URL] = g_param_spec_string ("image_url",
|
|
"ImageURL",
|
|
"Url of the image.",
|
|
NULL,
|
|
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
|
|
manga_properties[MG_MANGA_TITLE] = g_param_spec_string ("title",
|
|
"Title",
|
|
"Title of the manga.",
|
|
NULL,
|
|
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
|
|
manga_properties[MG_MANGA_ID] = g_param_spec_string ("id",
|
|
"Id",
|
|
"Id of the manga.",
|
|
NULL,
|
|
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
|
|
manga_properties[MG_MANGA_DESCRIPTION] = g_param_spec_string (
|
|
"description",
|
|
"Description",
|
|
"Description of the manga.",
|
|
NULL,
|
|
G_PARAM_READWRITE);
|
|
manga_properties[MG_MANGA_CHAPTER_LIST] = g_param_spec_object (
|
|
"chapter_list",
|
|
"ChapterList",
|
|
"List of chapters.",
|
|
G_TYPE_LIST_STORE,
|
|
G_PARAM_READWRITE);
|
|
|
|
|
|
g_object_class_install_properties (object_class,
|
|
MG_MANGA_N_PROPERTIES,
|
|
manga_properties);
|
|
}
|
|
|
|
static void
|
|
mg_manga_init (MgManga *self) {
|
|
self->has_details = 0;
|
|
}
|
|
|
|
static void
|
|
mg_manga_dispose (GObject *object) {
|
|
MgManga *self = MG_MANGA (object);
|
|
if (self->description) {
|
|
g_free (self->description);
|
|
self->description = NULL;
|
|
}
|
|
if (self->title) {
|
|
g_free (self->title);
|
|
self->title = NULL;
|
|
}
|
|
if (self->id) {
|
|
g_free (self->id);
|
|
self->id = NULL;
|
|
}
|
|
if (self->image_url) {
|
|
g_free (self->image_url);
|
|
self->image_url = NULL;
|
|
}
|
|
|
|
g_clear_object (&(self->chapter_list));
|
|
}
|
|
|
|
int
|
|
mg_manga_has_details (MgManga *self) {
|
|
return self->has_details;
|
|
}
|
|
|
|
void
|
|
mg_manga_details_recovered (MgManga *self) {
|
|
self->has_details = 1;
|
|
}
|
|
|
|
char *
|
|
mg_manga_get_id (MgManga *self) {
|
|
GValue value = G_VALUE_INIT;
|
|
char *return_value = NULL;
|
|
g_value_init (&value, G_TYPE_STRING);
|
|
g_object_get_property (G_OBJECT (self),
|
|
"id",
|
|
&value);
|
|
return_value = g_value_dup_string (&value);
|
|
g_value_unset (&value);
|
|
return return_value;
|
|
}
|
|
|
|
char *
|
|
mg_manga_get_image_url (MgManga *self) {
|
|
GValue value = G_VALUE_INIT;
|
|
char *return_value = NULL;
|
|
g_value_init (&value, G_TYPE_STRING);
|
|
g_object_get_property (G_OBJECT (self),
|
|
"image_url",
|
|
&value);
|
|
return_value = g_value_dup_string (&value);
|
|
g_value_unset (&value);
|
|
return return_value;
|
|
}
|
|
|
|
char *
|
|
mg_manga_get_title (MgManga *self) {
|
|
GValue value = G_VALUE_INIT;
|
|
char *return_value = NULL;
|
|
g_value_init (&value, G_TYPE_STRING);
|
|
g_object_get_property (G_OBJECT (self),
|
|
"title",
|
|
&value);
|
|
return_value = g_value_dup_string (&value);
|
|
g_value_unset (&value);
|
|
return return_value;
|
|
}
|
|
|
|
char *
|
|
mg_manga_get_description (MgManga *self) {
|
|
GValue value = G_VALUE_INIT;
|
|
char *result;
|
|
g_value_init (&value, G_TYPE_STRING);
|
|
g_object_get_property (G_OBJECT (self),
|
|
"description",
|
|
&value);
|
|
result = g_value_dup_string (&value);
|
|
g_value_unset (&value);
|
|
return result;
|
|
}
|
|
|
|
GListStore *
|
|
mg_manga_get_chapter_list (MgManga *self) {
|
|
if (!mg_manga_has_details (self)) {
|
|
fprintf(stderr, "Manga has still not details\n");
|
|
return NULL;
|
|
}
|
|
GValue value = G_VALUE_INIT;
|
|
GListStore *return_value;
|
|
|
|
g_value_init (&value, G_TYPE_LIST_STORE);
|
|
g_object_get_property (G_OBJECT (self),
|
|
"chapter_list",
|
|
&value);
|
|
return_value = G_LIST_STORE (g_value_peek_pointer (&value));
|
|
g_object_ref (G_OBJECT (return_value));
|
|
g_value_unset (&value);
|
|
|
|
return return_value;
|
|
}
|
|
|
|
void
|
|
mg_manga_set_description (MgManga *self, const char *description) {
|
|
GValue value = G_VALUE_INIT;
|
|
g_value_init (&value, G_TYPE_STRING);
|
|
g_value_set_string (&value, description);
|
|
g_object_set_property (G_OBJECT (self), "description", &value);
|
|
g_value_unset (&value);
|
|
}
|
|
|
|
void
|
|
mg_manga_set_chapter_list (MgManga *self, GListStore *chapter_list) {
|
|
GValue value = G_VALUE_INIT;
|
|
g_object_ref (G_OBJECT (chapter_list));
|
|
g_value_init (&value, G_TYPE_LIST_STORE);
|
|
g_value_set_instance (&value, chapter_list);
|
|
g_object_set_property (G_OBJECT (self), "chapter_list", &value);
|
|
g_value_unset (&value);
|
|
}
|
|
|
|
static void
|
|
mg_manga_set_property (GObject *object,
|
|
guint property_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec) {
|
|
MgManga *self = MG_MANGA (object);
|
|
GListStore *chapter_list;
|
|
switch ((MgMangaProperties) property_id) {
|
|
case MG_MANGA_IMAGE_URL:
|
|
g_free (self->image_url);
|
|
self->image_url = g_value_dup_string (value);
|
|
break;
|
|
case MG_MANGA_TITLE:
|
|
g_free (self->title);
|
|
self->title = g_value_dup_string (value);
|
|
break;
|
|
case MG_MANGA_ID:
|
|
g_free (self->id);
|
|
self->id = g_value_dup_string (value);
|
|
break;
|
|
case MG_MANGA_DESCRIPTION:
|
|
g_free (self->description);
|
|
self->description = g_value_dup_string (value);
|
|
break;
|
|
case MG_MANGA_CHAPTER_LIST:
|
|
g_free (self->chapter_list);
|
|
chapter_list = g_value_peek_pointer (value);
|
|
self->chapter_list = chapter_list;
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
mg_manga_get_property (GObject *object,
|
|
guint property_id,
|
|
GValue *value,
|
|
GParamSpec *pspec) {
|
|
MgManga *self = MG_MANGA (object);
|
|
switch ((MgMangaProperties) property_id) {
|
|
case MG_MANGA_IMAGE_URL:
|
|
g_value_set_string (value, self->image_url);
|
|
break;
|
|
case MG_MANGA_TITLE:
|
|
g_value_set_string (value, self->title);
|
|
break;
|
|
case MG_MANGA_ID:
|
|
g_value_set_string (value, self->id);
|
|
break;
|
|
case MG_MANGA_DESCRIPTION:
|
|
g_value_set_string (value, self->description);
|
|
break;
|
|
case MG_MANGA_CHAPTER_LIST:
|
|
g_value_set_instance (value, self->chapter_list);
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
MgManga *
|
|
mg_manga_new (const char *const image_url, const char *const title, const char *id) {
|
|
MgManga *self = NULL;
|
|
MgUtilString *string_util = mg_util_string_new ();
|
|
self = MG_MANGA ((g_object_new (MG_TYPE_MANGA, NULL)));
|
|
self->image_url = mg_util_string_alloc_string (string_util,
|
|
strlen (image_url));
|
|
self->title = mg_util_string_alloc_string (string_util,
|
|
strlen (title));
|
|
self->id = mg_util_string_alloc_string (string_util,
|
|
strlen (id));
|
|
mg_util_string_copy_substring (string_util,
|
|
image_url, self->image_url,
|
|
strlen(image_url) + 1, 0, strlen (image_url));
|
|
mg_util_string_copy_substring (string_util,
|
|
title, self->title, strlen(title) + 1, 0, strlen (title));
|
|
mg_util_string_copy_substring (string_util,
|
|
id, self->id, strlen(id) + 1, 0, strlen (id));
|
|
g_clear_object (&string_util);
|
|
return self;
|
|
}
|