more code

This commit is contained in:
Florian Stinglmayr 2025-04-29 12:37:15 +02:00
parent 177e8d018f
commit d091272cea
6 changed files with 179 additions and 7 deletions

View File

@ -48,6 +48,12 @@ gchar const *ed_journal_entry_get_string(EDJournalEntry *self,
gchar const *ed_journal_entry_get_event(EDJournalEntry *self); gchar const *ed_journal_entry_get_event(EDJournalEntry *self);
GDateTime *ed_journal_entry_get_timestamp(EDJournalEntry *self);
gboolean ed_journal_entry_is_in_range(EDJournalEntry *self,
GDateTime *start,
GDateTime *end);
/** /**
* Returns true if the journal entry is of the given event. * Returns true if the journal entry is of the given event.
*/ */

View File

@ -50,6 +50,10 @@ gchar const *ed_journal_file_get_gameversion(EDJournalFile *self);
EDJournalEntry *ed_journal_file_get_first(EDJournalFile *self); EDJournalEntry *ed_journal_file_get_first(EDJournalFile *self);
EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self); EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self);
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(EDJournalFile *lhs, EDJournalFile *rhs);
G_END_DECLS G_END_DECLS

View File

@ -6,6 +6,7 @@
typedef struct { typedef struct {
json_t *entry; json_t *entry;
GDateTime *timestamp;
} EDJournalEntryPrivate; } EDJournalEntryPrivate;
G_DEFINE_QUARK("ed-json-error", ed_json_error); G_DEFINE_QUARK("ed-json-error", ed_json_error);
@ -24,7 +25,12 @@ static void ed_journal_entry_finalize(GObject *obj)
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self); EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
json_decref(p->entry); json_decref(p->entry);
p = NULL; p->entry = NULL;
if (p->timestamp != NULL) {
g_date_time_unref(p->timestamp);
p->timestamp = NULL;
}
G_OBJECT_CLASS(ed_journal_entry_parent_class)->finalize(obj); G_OBJECT_CLASS(ed_journal_entry_parent_class)->finalize(obj);
} }
@ -69,6 +75,7 @@ EDErrorCode ed_journal_entry_parse(EDJournalEntry *self,
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self); EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
EDErrorCode ret = ed_error_invalid; EDErrorCode ret = ed_error_invalid;
json_error_t e; json_error_t e;
char const *timestamp = NULL;
json_decref(p->entry); json_decref(p->entry);
p->entry = NULL; p->entry = NULL;
@ -88,10 +95,43 @@ EDErrorCode ed_journal_entry_parse(EDJournalEntry *self,
e.text e.text
); );
ret = ed_error_invalid_json; ret = ed_error_invalid_json;
} else { goto done;
ret = ed_error_success;
} }
timestamp = ed_journal_entry_get_string(self, "timestamp");
if (S_EMPTY(timestamp)) {
json_decref(p->entry);
p->entry = NULL;
g_set_error(
error,
ed_json_error_quark(),
ed_error_invalid_json,
"entry has no timestamp"
);
ret = ed_error_invalid_json;
goto done;
}
p->timestamp = g_date_time_new_from_iso8601(timestamp, NULL);
if (p->timestamp == NULL) {
json_decref(p->entry);
p->entry = NULL;
g_set_error(
error,
ed_json_error_quark(),
ed_error_invalid_json,
"entry has an invalid timestamp"
);
ret = ed_error_invalid_json;
goto done;
}
ret = ed_error_success;
done:
return ret; return ret;
} }
@ -128,3 +168,24 @@ gboolean ed_journal_entry_is(EDJournalEntry *self, gchar const *event)
return (g_ascii_strcasecmp(ev, event) == 0); return (g_ascii_strcasecmp(ev, event) == 0);
} }
GDateTime *ed_journal_entry_get_timestamp(EDJournalEntry *self)
{
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
return p->timestamp;
}
gboolean ed_journal_entry_is_in_range(EDJournalEntry *self,
GDateTime *start,
GDateTime *end)
{
GDateTime *timestamp = ed_journal_entry_get_timestamp(self);
return_if_true(timestamp == NULL, FALSE);
if (g_date_time_compare(start, timestamp) <= 0 &&
g_date_time_compare(timestamp, end) <= 0) {
return TRUE;
}
return FALSE;
}

View File

@ -601,3 +601,34 @@ gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs)
return g_date_time_compare(ldate, rdate); return g_date_time_compare(ldate, rdate);
} }
gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self,
GDateTime *start,
GDateTime *end)
{
return_if_true(self == NULL, FALSE);
EDJournalFilePrivate *p = ed_journal_file_get_instance_private(self);
return_if_true(p->first == NULL || p->last == NULL, FALSE);
GDateTime *first = ed_journal_entry_get_timestamp(p->first);
GDateTime *last = ed_journal_entry_get_timestamp(p->last);
if (g_date_time_compare(start, first) <= 0 &&
g_date_time_compare(last, end) <= 0) {
return TRUE;
}
if (g_date_time_compare(first, start) <= 0 &&
g_date_time_compare(start, last) <= 0) {
return TRUE;
}
if (g_date_time_compare(first, end) <= 0 &&
g_date_time_compare(end, last) <= 0) {
return TRUE;
}
return FALSE;
}

View File

@ -1,4 +1,4 @@
{ "timestamp":"2023-04-18T04:14:56Z", "event":"Fileheader", "part":1, "language":"English/UK", "Odyssey":true, "gameversion":"4.0.0.1477", "build":"r291050/r0 " } { "timestamp":"2024-04-18T04:14:56Z", "event":"Fileheader", "part":1, "language":"English/UK", "Odyssey":true, "gameversion":"4.0.0.1477", "build":"r291050/r0 " }
{ "timestamp":"2023-04-18T04:15:39Z", "event":"Commander", "FID":"F123456", "Name":"DeiMuata" } { "timestamp":"2024-04-18T04:15:39Z", "event":"Commander", "FID":"F123456", "Name":"DeiMuata" }
{ "timestamp":"2023-04-18T05:15:39Z", "event":"Something" } { "timestamp":"2024-04-18T05:15:39Z", "event":"Something" }
{ "timestamp":"2023-04-18T06:15:39Z", "event":"Shutdown" } { "timestamp":"2024-04-18T06:15:39Z", "event":"Shutdown" }

View File

@ -174,6 +174,75 @@ static void test_first_last(void **state)
g_clear_object(&file); g_clear_object(&file);
} }
static void test_in_range(void **state)
{
char const *filename = "Journal.2024-04-18T061507.01.log";
EDJournalFile *file = NULL;
EDErrorCode ret = 0;
GError *error = NULL;
GDateTime *start = NULL;
GDateTime *end = NULL;
gboolean b;
file = ed_journal_file_new();
assert_non_null(file);
ret = ed_journal_file_open(file, filename, &error);
assert_null(error);
assert_int_equal(ret, ed_error_success);
/* start in range
*/
start = g_date_time_new_from_iso8601("2024-04-18T04:15:39Z", NULL);
end = g_date_time_new_from_iso8601("2024-04-19T04:15:39Z", NULL);
b = ed_journal_file_has_entries_in_range(file, start, end);
assert_true(b);
g_date_time_unref(start);
g_date_time_unref(end);
/* end in range
*/
start = g_date_time_new_from_iso8601("2024-04-17T04:15:39Z", NULL);
end = g_date_time_new_from_iso8601("2024-04-18T05:15:39Z", NULL);
b = ed_journal_file_has_entries_in_range(file, start, end);
assert_true(b);
g_date_time_unref(start);
g_date_time_unref(end);
/* both outside
*/
start = g_date_time_new_from_iso8601("2023-04-17T04:15:39Z", NULL);
end = g_date_time_new_from_iso8601("2025-04-18T05:15:39Z", NULL);
b = ed_journal_file_has_entries_in_range(file, start, end);
assert_true(b);
g_date_time_unref(start);
g_date_time_unref(end);
/* too early
*/
start = g_date_time_new_from_iso8601("2023-04-17T04:15:39Z", NULL);
end = g_date_time_new_from_iso8601("2023-04-18T05:15:39Z", NULL);
b = ed_journal_file_has_entries_in_range(file, start, end);
assert_false(b);
g_date_time_unref(start);
g_date_time_unref(end);
/* too late
*/
start = g_date_time_new_from_iso8601("2025-04-17T04:15:39Z", NULL);
end = g_date_time_new_from_iso8601("2025-04-18T05:15:39Z", NULL);
b = ed_journal_file_has_entries_in_range(file, start, end);
assert_false(b);
g_date_time_unref(start);
g_date_time_unref(end);
g_clear_object(&file);
}
int main(int ac, char **av) int main(int ac, char **av)
{ {
static const struct CMUnitTest tests[] = { static const struct CMUnitTest tests[] = {
@ -184,6 +253,7 @@ int main(int ac, char **av)
cmocka_unit_test(test_old_datetime), cmocka_unit_test(test_old_datetime),
cmocka_unit_test(test_valid_peek), cmocka_unit_test(test_valid_peek),
cmocka_unit_test(test_first_last), cmocka_unit_test(test_first_last),
cmocka_unit_test(test_in_range),
}; };
return cmocka_run_group_tests(tests, NULL, NULL); return cmocka_run_group_tests(tests, NULL, NULL);