117 lines
2.4 KiB
C
117 lines
2.4 KiB
C
#include <edapi/journal/file.h>
|
|
#include <edapi/util.h>
|
|
|
|
typedef struct {
|
|
gchar *filename;
|
|
gchar *timestamp;
|
|
int index;
|
|
} EDJournalFilePrivate;
|
|
|
|
struct _EDJournalFile {
|
|
GObject parent;
|
|
};
|
|
|
|
struct _EDJournalFileClass {
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
G_DEFINE_TYPE_EXTENDED(
|
|
EDJournalFile,
|
|
ed_journal_file,
|
|
G_TYPE_OBJECT,
|
|
0,
|
|
G_ADD_PRIVATE(EDJournalFile)
|
|
);
|
|
|
|
static void ed_journal_file_finalize(GObject *obj)
|
|
{
|
|
EDJournalFile *self = ED_JOURNALFILE(obj);
|
|
EDJournalFilePrivate *p = ed_journal_file_get_instance_private(self);
|
|
|
|
free(p->filename);
|
|
p->filename = NULL;
|
|
|
|
free(p->timestamp);
|
|
p->timestamp = NULL;
|
|
|
|
G_OBJECT_CLASS(ed_journal_file_parent_class)->finalize(obj);
|
|
}
|
|
|
|
static void ed_journal_file_class_init(EDJournalFileClass *klass)
|
|
{
|
|
G_OBJECT_CLASS(klass)->finalize = ed_journal_file_finalize;
|
|
}
|
|
|
|
static void ed_journal_file_init(EDJournalFile *self)
|
|
{
|
|
}
|
|
|
|
EDJournalFile *ed_journal_file_new(void)
|
|
{
|
|
return g_object_new(ED_TYPE_JOURNALFILE, NULL);
|
|
}
|
|
|
|
EDErrorCode ed_journal_file_parse(EDJournalFile *file, char const *filename)
|
|
{
|
|
EDJournalFilePrivate *p = ed_journal_file_get_instance_private(file);
|
|
gchar *basename = NULL;
|
|
EDErrorCode ret = ed_error_internal;
|
|
|
|
GRegex *new_style = NULL;
|
|
GMatchInfo *matches = NULL;
|
|
|
|
gchar *timestamp = NULL;
|
|
gchar *index = NULL;
|
|
|
|
new_style = g_regex_new(
|
|
"Journal\\.([\\dT\\-]+)\\.(\\d+)\\.log",
|
|
0, 0, NULL
|
|
);
|
|
goto_if_true(new_style == NULL, done);
|
|
|
|
basename = g_path_get_basename(filename);
|
|
goto_if_true(S_EMPTY(basename), done);
|
|
|
|
if (g_regex_match(new_style, basename, 0, &matches)) {
|
|
timestamp = g_match_info_fetch(matches, 1);
|
|
index = g_match_info_fetch(matches, 2);
|
|
}
|
|
|
|
g_match_info_unref(matches);
|
|
matches = NULL;
|
|
|
|
goto_if_true(S_EMPTY(timestamp), done);
|
|
goto_if_true(S_EMPTY(index), done);
|
|
|
|
g_free(p->timestamp);
|
|
p->timestamp = g_strdup(timestamp);
|
|
|
|
p->index = strtol(index, NULL, 0);
|
|
|
|
g_free(p->filename);
|
|
p->filename = g_strdup(filename);
|
|
|
|
ret = ed_error_success;
|
|
|
|
done:
|
|
|
|
g_free(timestamp);
|
|
g_free(index);
|
|
g_free(basename);
|
|
g_regex_unref(new_style);
|
|
|
|
return ret;
|
|
}
|
|
|
|
EDErrorCode ed_journal_file_open(EDJournalFile *file, char const *filename)
|
|
{
|
|
EDErrorCode r = ed_error_success;
|
|
|
|
r = ed_journal_file_parse(file, filename);
|
|
if (ED_ERROR(r)) {
|
|
return r;
|
|
}
|
|
|
|
return r;
|
|
}
|