diff --git a/lib/include/edapi/journal/file.h b/lib/include/edapi/journal/file.h index 1a63ad0..0291408 100644 --- a/lib/include/edapi/journal/file.h +++ b/lib/include/edapi/journal/file.h @@ -54,7 +54,8 @@ gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self, GDateTime *start, GDateTime *end); -gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs); +gint ed_journal_file_compare_asc(EDJournalFile *lhs, EDJournalFile *rhs); +gint ed_journal_file_compare_desc(EDJournalFile *lhs, EDJournalFile *rhs); G_END_DECLS diff --git a/lib/include/edapi/journal/journal.h b/lib/include/edapi/journal/journal.h index 722b587..277edcd 100644 --- a/lib/include/edapi/journal/journal.h +++ b/lib/include/edapi/journal/journal.h @@ -15,9 +15,17 @@ G_DECLARE_FINAL_TYPE( EDJournal *ed_journal_new(void); +EDJournal *ed_journal_new_with_location(gchar const *dir); + gchar const *ed_journal_get_location(EDJournal *j); EDErrorCode ed_journal_set_location(EDJournal *j, gchar const *dir); +/** + * Get a list of files. Files are sorted in descending order, with + * newer files first in the list. + */ +GList *ed_journal_get_files(EDJournal *self); + G_END_DECLS #endif diff --git a/lib/src/journal/file.c b/lib/src/journal/file.c index 2350df3..dda46ee 100644 --- a/lib/src/journal/file.c +++ b/lib/src/journal/file.c @@ -591,7 +591,7 @@ EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self) return p->last; } -gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs) +gint ed_journal_file_compare_asc(EDJournalFile *lhs, EDJournalFile *rhs) { return_if_true(lhs == NULL || rhs == NULL, 0); @@ -602,6 +602,17 @@ gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs) return g_date_time_compare(ldate, rdate); } +gint ed_journal_file_compare_desc(EDJournalFile *lhs, EDJournalFile *rhs) +{ + return_if_true(lhs == NULL || rhs == NULL, 0); + + GDateTime *ldate = ed_journal_file_get_datetime(lhs); + GDateTime *rdate = ed_journal_file_get_datetime(rhs); + return_if_true(ldate == NULL || rdate == NULL, 0); + + return g_date_time_compare(rdate, ldate); +} + gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self, GDateTime *start, GDateTime *end) diff --git a/lib/src/journal/journal.c b/lib/src/journal/journal.c index 4c00d87..25b29e2 100644 --- a/lib/src/journal/journal.c +++ b/lib/src/journal/journal.c @@ -90,6 +90,23 @@ EDJournal *ed_journal_new(void) return g_object_new(ED_TYPE_JOURNAL, NULL); } +EDJournal *ed_journal_new_with_location(gchar const *dir) +{ + EDJournal *j = NULL; + EDErrorCode ret = ed_error_success; + + j = ed_journal_new(); + return_if_true(j == NULL, NULL); + + ret = ed_journal_set_location(j, dir); + if (ED_ERROR(ret)) { + g_clear_object(&j); + return NULL; + } + + return j; +} + static void ed_journal_load_files(EDJournal *self) { EDJournalPrivate *p = ed_journal_get_instance_private(self); @@ -137,7 +154,7 @@ static void ed_journal_load_files(EDJournal *self) } p->files = g_list_sort( - p->files, (GCompareFunc)ed_journal_file_compare); + p->files, (GCompareFunc)ed_journal_file_compare_desc); done: @@ -171,3 +188,10 @@ EDErrorCode ed_journal_set_location(EDJournal *self, gchar const *dir) return ed_error_success; } + +GList *ed_journal_get_files(EDJournal *self) +{ + return_if_true(self == NULL, NULL); + EDJournalPrivate *p = ed_journal_get_instance_private(self); + return p->files; +} diff --git a/lib/tests/Saved Games/Frontier Developments/Elite Dangerous/Journal.2024-04-18T061507.01.log b/lib/tests/Saved Games/Frontier Developments/Elite Dangerous/Journal.2024-04-18T061507.01.log new file mode 100644 index 0000000..e69de29 diff --git a/lib/tests/Saved Games/Frontier Developments/Elite Dangerous/Journal.2025-04-18T061507.01.log b/lib/tests/Saved Games/Frontier Developments/Elite Dangerous/Journal.2025-04-18T061507.01.log new file mode 100644 index 0000000..e69de29 diff --git a/lib/tests/test-journal.c b/lib/tests/test-journal.c index a31eb3a..d2f4c04 100644 --- a/lib/tests/test-journal.c +++ b/lib/tests/test-journal.c @@ -8,6 +8,7 @@ #include #include +#include static void test_userprofile_location(void **state) { @@ -22,10 +23,48 @@ static void test_userprofile_location(void **state) g_clear_object(&journal); } +static void test_file_sorting(void **state) +{ + setenv("USERPROFILE", "./", 1); + + EDJournal *journal = ed_journal_new(); + assert_non_null(journal); + + gchar const *location = ed_journal_get_location(journal); + assert_non_null(location); + + GList *files = ed_journal_get_files(journal); + assert_non_null(files); + assert_non_null(files->data); + + GDateTime *datetime = NULL; + + datetime = ed_journal_file_get_datetime( + ED_JOURNALFILE(files->data) + ); + assert_non_null(datetime); + assert_int_equal(g_date_time_get_year(datetime), 2025); + + datetime = ed_journal_file_get_datetime( + ED_JOURNALFILE(files->next->data) + ); + assert_non_null(datetime); + assert_int_equal(g_date_time_get_year(datetime), 2024); + + datetime = ed_journal_file_get_datetime( + ED_JOURNALFILE(files->next->next->data) + ); + assert_non_null(datetime); + assert_int_equal(g_date_time_get_year(datetime), 2023); + + g_clear_object(&journal); +} + int main(int ac, char **av) { static const struct CMUnitTest tests[] = { cmocka_unit_test(test_userprofile_location), + cmocka_unit_test(test_file_sorting), }; return cmocka_run_group_tests(tests, NULL, NULL);