X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=src%2Fbackend.c;h=7fe3bebb1333fa67b3977d514b3d090c48e175e4;hb=032449048eaddbee3f02324d33979ba0f6aa2719;hp=1eb4aeb8348a5cb12964b3ae911b50e15775c3f5;hpb=870a4779e00e0eb6a52d70577e4c1581e2241b5f;p=cascardo%2Fatompub.git diff --git a/src/backend.c b/src/backend.c index 1eb4aeb..7fe3beb 100644 --- a/src/backend.c +++ b/src/backend.c @@ -26,7 +26,7 @@ struct _atom_backend { AtomEntry * (*retrieve_entry) (AtomCtx *, AtomID *); - void (*enumerate_entries) (AtomCtx *, AtomEntry ***, size_t *); + void (*enumerate_entries) (AtomCtx *, char ***, AtomEntry ***, size_t *); int (*is_feed) (AtomCtx *, AtomID *); }; @@ -57,7 +57,9 @@ atom_backend_retrieve_entry_set (AtomBackend *backend, void atom_backend_enumerate_entries_set (AtomBackend *backend, void enumerate_entries (AtomCtx *, - AtomEntry ***, size_t*)) + char ***, + AtomEntry ***, + size_t *)) { backend->enumerate_entries = enumerate_entries; } @@ -80,30 +82,61 @@ atom_retrieve_entry (AtomCtx *ctx, AtomID *id) } void -atom_backend_enumerate_entries (AtomCtx *ctx, AtomEntry *** entries, size_t *len) +atom_backend_enumerate_entries (AtomCtx *ctx, char *** reqs, + AtomEntry *** entries, size_t *len) { AtomBackend *backend; + char **rreqs = NULL; + AtomEntry **rentries = NULL; + size_t rlen = 0; + int i; backend = atom_backend (ctx); if (backend && backend->enumerate_entries) { - backend->enumerate_entries (ctx, entries, len); - return; + backend->enumerate_entries (ctx, &rreqs, &rentries, &rlen); + } + if (reqs) + { + *reqs = rreqs; + } + else + { + for (i = 0; i < rlen; i++) + g_free (rreqs[i]); + g_free (rreqs); } if (entries) - *entries = NULL; + { + *entries = rentries; + } + else + { + for (i = 0; i < rlen; i++) + atom_entry_delete (rentries[i]); + g_free (rentries); + } if (len) - *len = 0; + *len = rlen; } int atom_is_feed (AtomCtx *ctx, AtomID *id) { AtomBackend *backend; + AtomError *aerr; backend = atom_backend (ctx); if (backend && backend->is_feed) { return backend->is_feed (ctx, id); } + /* Frontend may make the decision of whether the requested resource is + * a feed or not. If it is not able to do so and backend isn't either, + * it is an error. + */ + aerr = atom_error_new (); + atom_error_code_set (aerr, 404); + atom_error_message_set (aerr, "Not Found"); + atom_error_set (ctx, aerr); return 0; } @@ -113,9 +146,12 @@ atom_retrieve_feed (AtomCtx *ctx) AtomFeed *feed; AtomEntry **entries; size_t len; - atom_backend_enumerate_entries (ctx, &entries, &len); + atom_backend_enumerate_entries (ctx, NULL, &entries, &len); + if (atom_error_get (ctx) != NULL) + return NULL; feed = atom_feed_new (); atom_feed_entry_append_array (feed, entries, len); + g_free (entries); return feed; } @@ -123,6 +159,7 @@ AtomResource * atom_retrieve_resource (AtomCtx *ctx, AtomID *id) { AtomResource *res; + res = NULL; if (atom_is_feed (ctx, id)) { AtomFeed *feed; @@ -132,7 +169,7 @@ atom_retrieve_resource (AtomCtx *ctx, AtomID *id) res = atom_resource_new_from_feed (feed); atom_feed_delete (feed); } - else + else if (atom_error_get (ctx) == NULL) { AtomEntry *entry; entry = atom_retrieve_entry (ctx, id);