From 6dbff67bee5fb2fc902298de23ebff061ca39cbe Mon Sep 17 00:00:00 2001 From: Florian Stinglmayr Date: Fri, 2 May 2025 11:37:44 +0200 Subject: [PATCH] restructure code --- lib/CMakeLists.txt | 2 + lib/include/edapi/commander.h | 25 ++++++++ lib/include/edapi/journal/file.h | 3 +- lib/src/commander.c | 97 ++++++++++++++++++++++++++++++++ lib/src/journal/file.c | 17 ++---- lib/tests/test-journal-file.c | 5 +- 6 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 lib/include/edapi/commander.h create mode 100644 lib/src/commander.c diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 1ca215b..d705890 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -8,9 +8,11 @@ PKG_CHECK_MODULES(GLIB2 REQUIRED glib-2.0) PKG_CHECK_MODULES(GOBJECT2 REQUIRED gobject-2.0) SET(SOURCES + "include/edapi/commander.h" "include/edapi/journal/entry.h" "include/edapi/journal/file.h" "include/edapi/journal/journal.h" + "src/commander.c" "src/journal/entry.c" "src/journal/file.c" "src/journal/journal.c" diff --git a/lib/include/edapi/commander.h b/lib/include/edapi/commander.h new file mode 100644 index 0000000..c214a6e --- /dev/null +++ b/lib/include/edapi/commander.h @@ -0,0 +1,25 @@ +#ifndef EDAPI_COMMANDER_H +#define EDAPI_COMMANDER_H + +#include +#include + +#include +#include + +G_BEGIN_DECLS + +G_DECLARE_FINAL_TYPE(EDCommander, ed_commander, ED, COMMANDER, GObject); + +#define ED_TYPE_COMMANDER ed_commander_get_type() + +EDCommander *ed_commander_new(void); + +EDCommander *ed_commander_new_from_entry(EDJournalEntry *entry); + +gchar const *ed_commander_get_name(EDCommander *self); +gchar const *ed_commander_get_fid(EDCommander *self); + +G_END_DECLS + +#endif diff --git a/lib/include/edapi/journal/file.h b/lib/include/edapi/journal/file.h index 0291408..557f62e 100644 --- a/lib/include/edapi/journal/file.h +++ b/lib/include/edapi/journal/file.h @@ -2,6 +2,7 @@ #define EDAPI_JOURNAL_FILE_H #include +#include #include #include @@ -43,7 +44,7 @@ EDErrorCode ed_journal_file_load(EDJournalFile *self, GError **error); GDateTime *ed_journal_file_get_datetime(EDJournalFile *self); -gchar const *ed_journal_file_get_commander(EDJournalFile *self); +EDCommander *ed_journal_file_get_commander(EDJournalFile *self); gchar const *ed_journal_file_get_gameversion(EDJournalFile *self); diff --git a/lib/src/commander.c b/lib/src/commander.c new file mode 100644 index 0000000..4fe423b --- /dev/null +++ b/lib/src/commander.c @@ -0,0 +1,97 @@ +#include + +#include + +typedef struct { + gchar *name; + gchar *fid; +} EDCommanderPrivate; + +struct _EDCommander { + GObject parent; +}; + +struct _EDCommanderClass { + GObjectClass parent_class; +}; + +G_DEFINE_TYPE_EXTENDED( + EDCommander, + ed_commander, + G_TYPE_OBJECT, + 0, + G_ADD_PRIVATE(EDCommander) + ); + +static void ed_commander_dispose(GObject *obj) +{ + G_OBJECT_CLASS(ed_commander_parent_class)->dispose(obj); +} + +static void ed_commander_finalize(GObject *obj) +{ + EDCommander *self = ED_COMMANDER(obj); + EDCommanderPrivate *p = ed_commander_get_instance_private(self); + + g_free(p->name); + p->name = NULL; + + g_free(p->fid); + p->fid = NULL; + + G_OBJECT_CLASS(ed_commander_parent_class)->finalize(obj); +} + +static void ed_commander_class_init(EDCommanderClass *klass) +{ + G_OBJECT_CLASS(klass)->dispose = ed_commander_dispose; + G_OBJECT_CLASS(klass)->finalize = ed_commander_finalize; +} + +static void ed_commander_init(EDCommander *self) +{ +} + +EDCommander *ed_commander_new(void) +{ + return g_object_new(ED_TYPE_COMMANDER, NULL); +} + +EDCommander *ed_commander_new_from_entry(EDJournalEntry *entry) +{ + return_if_true(entry == NULL, NULL); + + if (!ed_journal_entry_is(entry, ED_JOURNAL_ENTRY_COMMANDER)) { + return NULL; + } + + gchar const *cmdr = NULL; + gchar const *fid = NULL; + + cmdr = ed_journal_entry_get_string(entry, "Name"); + fid = ed_journal_entry_get_string(entry, "FID"); + + return_if_true(S_EMPTY(cmdr) || S_EMPTY(fid), NULL); + + EDCommander *self = ed_commander_new(); + return_if_true(self == NULL, NULL); + + EDCommanderPrivate *p = ed_commander_get_instance_private(self); + + p->name = g_strdup(cmdr); + p->fid = g_strdup(fid); + + return self; +} + +gchar const *ed_commander_get_name(EDCommander *self) +{ + EDCommanderPrivate *p = ed_commander_get_instance_private(self); + return p->name; +} + +gchar const *ed_commander_get_fid(EDCommander *self) +{ + EDCommanderPrivate *p = ed_commander_get_instance_private(self); + return p->fid; +} diff --git a/lib/src/journal/file.c b/lib/src/journal/file.c index dda46ee..c4cce47 100644 --- a/lib/src/journal/file.c +++ b/lib/src/journal/file.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -11,7 +12,7 @@ typedef struct { GDateTime *timestamp; gint part; GList *entries; - gchar *commander; + EDCommander *commander; gchar *gameversion; EDJournalEntry *first; @@ -41,6 +42,7 @@ static void ed_journal_file_dispose(GObject *obj) g_clear_object(&p->first); g_clear_object(&p->last); + g_clear_object(&p->commander); G_OBJECT_CLASS(ed_journal_file_parent_class)->dispose(obj); } @@ -64,9 +66,6 @@ static void ed_journal_file_finalize(GObject *obj) p->timestamp = NULL; } - g_free(p->commander); - p->commander = NULL; - g_free(p->gameversion); p->gameversion = NULL; @@ -248,14 +247,8 @@ ed_journal_file_parse_commander(EDJournalFile *self, EDJournalFilePrivate *p, EDJournalEntry *e) { - gchar const *cmdr = ed_journal_entry_get_string( - e, "Name"); - - if (!S_EMPTY(cmdr)) { - g_free(p->commander); - p->commander = g_strdup(cmdr); - } + p->commander = ed_commander_new_from_entry(e); return ed_error_success; } @@ -563,7 +556,7 @@ GDateTime *ed_journal_file_get_datetime(EDJournalFile *self) return p->timestamp; } -gchar const *ed_journal_file_get_commander(EDJournalFile *self) +EDCommander *ed_journal_file_get_commander(EDJournalFile *self) { return_if_true(self == NULL, NULL); EDJournalFilePrivate *p = ed_journal_file_get_instance_private(self); diff --git a/lib/tests/test-journal-file.c b/lib/tests/test-journal-file.c index 46a46e6..ead51a0 100644 --- a/lib/tests/test-journal-file.c +++ b/lib/tests/test-journal-file.c @@ -134,8 +134,11 @@ static void test_valid_peek(void **state) assert_int_equal(ret, ed_error_success); char const *sval = NULL; + EDCommander *cmdr = NULL; - sval = ed_journal_file_get_commander(file); + cmdr = ed_journal_file_get_commander(file); + assert_non_null(cmdr); + sval = ed_commander_get_name(cmdr); assert_non_null(sval); assert_string_equal(sval, "DeiMuata");