X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=src%2Fbackend.c;h=d71eb2965711aafa6444974b6a531b7cdb80c7f6;hb=6dd659c3cecfd75ccc58994d77b70a5a09d098cc;hp=f8bcf352e6de21fcdeca0a489191d96e67d1b050;hpb=98b34debbadc6b126a2c3bb817c0d72770e55e89;p=cascardo%2Fatompub.git diff --git a/src/backend.c b/src/backend.c index f8bcf35..d71eb29 100644 --- a/src/backend.c +++ b/src/backend.c @@ -18,11 +18,16 @@ #include + #include +#include + struct _atom_backend { - Atom * (*retrieve_resource) (AtomCtx *, IRI *); + AtomEntry * (*retrieve_entry) (AtomCtx *, AtomID *); + void (*enumerate_entries) (AtomCtx *, AtomEntry ***, size_t *); + int (*is_feed) (AtomCtx *, AtomID *); }; AtomBackend * @@ -30,7 +35,8 @@ atom_backend_new () { AtomBackend *backend; backend = g_slice_new (AtomBackend); - backend->retrieve_resource = NULL; + backend->retrieve_entry = NULL; + backend->enumerate_entries = NULL; return backend; } @@ -41,19 +47,111 @@ atom_backend_delete (AtomBackend *backend) } void -atom_backend_retrieve_resource_set (AtomBackend *backend, - Atom *retrieve_resource (AtomCtx *, - IRI *)) +atom_backend_retrieve_entry_set (AtomBackend *backend, + AtomEntry *retrieve_entry (AtomCtx *, + AtomID *)) +{ + backend->retrieve_entry = retrieve_entry; +} + +void +atom_backend_enumerate_entries_set (AtomBackend *backend, + void enumerate_entries (AtomCtx *, + AtomEntry ***, size_t*)) +{ + backend->enumerate_entries = enumerate_entries; +} + +void +atom_backend_is_feed_set (AtomBackend *backend, + int is_feed (AtomCtx *, AtomID *)) { - backend->retrieve_resource = retrieve_resource; + backend->is_feed = is_feed; } -Atom * -atom_retrieve_resource (AtomCtx *ctx, IRI *iri) +AtomEntry * +atom_retrieve_entry (AtomCtx *ctx, AtomID *id) { AtomBackend *backend; backend = atom_backend (ctx); - if (backend && backend->retrieve_resource) - return backend->retrieve_resource (ctx, iri); + if (backend && backend->retrieve_entry) + return backend->retrieve_entry (ctx, id); return NULL; } + +void +atom_backend_enumerate_entries (AtomCtx *ctx, AtomEntry *** entries, size_t *len) +{ + AtomBackend *backend; + backend = atom_backend (ctx); + if (backend && backend->enumerate_entries) + { + backend->enumerate_entries (ctx, entries, len); + return; + } + if (entries) + *entries = NULL; + if (len) + *len = 0; +} + +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; +} + +AtomFeed * +atom_retrieve_feed (AtomCtx *ctx) +{ + AtomFeed *feed; + AtomEntry **entries; + size_t len; + atom_backend_enumerate_entries (ctx, &entries, &len); + if (atom_error_get (ctx) != NULL) + return NULL; + feed = atom_feed_new (); + atom_feed_entry_append_array (feed, entries, len); + return feed; +} + +AtomResource * +atom_retrieve_resource (AtomCtx *ctx, AtomID *id) +{ + AtomResource *res; + res = NULL; + if (atom_is_feed (ctx, id)) + { + AtomFeed *feed; + feed = atom_retrieve_feed (ctx); + if (feed == NULL) + return NULL; + res = atom_resource_new_from_feed (feed); + atom_feed_delete (feed); + } + else if (atom_error_get (ctx) != NULL) + { + AtomEntry *entry; + entry = atom_retrieve_entry (ctx, id); + if (entry == NULL) + return NULL; + res = atom_resource_new_from_entry (entry); + atom_entry_delete (entry); + } + return res; +}