X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=backend%2Fgio%2Fgio.c;h=095345b28ded3ea7b7968b3d16c99fc56b013ad0;hb=0b5e74111b3dabb856855efc3f08318608d1b9bd;hp=b930e1084b623d99853d50d1418c70b097059fb6;hpb=28f92055c4f63c94fea145871f1dab5bb56c0240;p=cascardo%2Fatompub.git diff --git a/backend/gio/gio.c b/backend/gio/gio.c index b930e10..095345b 100644 --- a/backend/gio/gio.c +++ b/backend/gio/gio.c @@ -21,12 +21,13 @@ #include #include #include +#include static GFile * -gio_iri_to_file (AtomCtx *ctx, IRI *iri) +gio_id_to_file (AtomCtx *ctx, AtomID *id) { gchar *root = atom_config_get_str (ctx, "gio", "root"); - gchar *path = iri_get_path (iri); + gchar *path = atom_id_string (id); gchar *filename = g_build_filename (root, path, NULL); GFile *file = g_file_new_for_path (filename); g_free (root); @@ -34,35 +35,111 @@ gio_iri_to_file (AtomCtx *ctx, IRI *iri) return file; } -static Atom * -gio_atom_retrieve_resource (AtomCtx *ctx, IRI *iri) +static AtomEntry * +gio_file_to_atom (AtomCtx *ctx, GFile *file) { - GFile *file; GError *error = NULL; gchar *data; gsize len; - Atom *atom; - file = gio_iri_to_file (ctx, iri); + AtomEntry *atom; error = NULL; if (!g_file_load_contents (file, NULL, &data, &len, NULL, &error)) { AtomError *aerr = atom_error_new_from_gerror (error); - g_object_unref (file); atom_error_set (ctx, aerr); g_error_free (error); return NULL; } - g_object_unref (file); - atom = atom_new_data_len (data, len); + atom = atom_entry_new_data_len (data, len); g_free (data); return atom; } +static AtomEntry * +gio_atom_retrieve_entry (AtomCtx *ctx, AtomID *id) +{ + GFile *file; + AtomEntry *atom; + file = gio_id_to_file (ctx, id); + atom = gio_file_to_atom (ctx, file); + g_object_unref (file); + return atom; +} + +static void +gio_enumerate_entries (AtomCtx *ctx, char ***reqs, AtomEntry ***entries, + size_t *len) +{ + GFile *dir; + GFileEnumerator *enumerator; + GFileInfo *info; + GFile *file; + AtomEntry *entry; + GError *error; + gchar *root; + gchar *name; + gchar *filename; + GPtrArray *array; + GPtrArray *filenames; + root = atom_config_get_str (ctx, "gio", "root"); + dir = g_file_new_for_path (root); + error = NULL; + enumerator = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_NAME, + G_FILE_QUERY_INFO_NONE, NULL, &error); + if (enumerator == NULL) + { + AtomError *aerr = atom_error_new_from_gerror (error); + atom_error_set (ctx, aerr); + g_error_free (error); + return; + } + array = g_ptr_array_new (); + filenames = g_ptr_array_new (); + while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) + { + name = g_file_info_get_name (info); + filename = g_build_filename (root, name, NULL); + g_object_unref (info); + file = g_file_new_for_path (filename); + entry = gio_file_to_atom (ctx, file); + if (entry) + { + g_ptr_array_add (array, entry); + g_ptr_array_add (filenames, g_strdup (name)); + } + else + { + atom_error_set (ctx, NULL); + } + g_object_unref (file); + g_free (filename); + } + g_object_unref (enumerator); + g_object_unref (dir); + g_free (root); + if (reqs) + *reqs = filenames->pdata; + if (entries) + *entries = array->pdata; + if (len) + *len = array->len; + g_ptr_array_free (array, FALSE); + g_ptr_array_free (filenames, FALSE); +} + +static int +gio_atom_is_feed (AtomCtx *ctx, AtomID *id) +{ + return (!strcmp (atom_id_string (id), "/")); +} + AtomBackend * gio_backend (void) { AtomBackend *backend; backend = atom_backend_new (); - atom_backend_retrieve_resource_set (backend, gio_atom_retrieve_resource); + atom_backend_retrieve_entry_set (backend, gio_atom_retrieve_entry); + atom_backend_enumerate_entries_set (backend, gio_enumerate_entries); + atom_backend_is_feed_set (backend, gio_atom_is_feed); return backend; }