X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=src%2Fbackend.c;h=31c8ecd458ce162466bbe45e89b44e331087948a;hb=2392a801e9b0375d6628911270bf764b1300d880;hp=f8bcf352e6de21fcdeca0a489191d96e67d1b050;hpb=98b34debbadc6b126a2c3bb817c0d72770e55e89;p=cascardo%2Fatompub.git diff --git a/src/backend.c b/src/backend.c index f8bcf35..31c8ecd 100644 --- a/src/backend.c +++ b/src/backend.c @@ -18,11 +18,15 @@ #include + #include +#include + struct _atom_backend { - Atom * (*retrieve_resource) (AtomCtx *, IRI *); + AtomEntry * (*retrieve_entry) (AtomCtx *, IRI *); + void (*enumerate_entries) (AtomCtx *, AtomEntry ***, size_t *); }; AtomBackend * @@ -30,7 +34,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 +46,82 @@ 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 *, + IRI *)) { - backend->retrieve_resource = retrieve_resource; + backend->retrieve_entry = retrieve_entry; } -Atom * -atom_retrieve_resource (AtomCtx *ctx, IRI *iri) +void +atom_backend_enumerate_entries_set (AtomBackend *backend, + void enumerate_entries (AtomCtx *, + AtomEntry ***, size_t*)) +{ + backend->enumerate_entries = enumerate_entries; +} + +AtomEntry * +atom_retrieve_entry (AtomCtx *ctx, IRI *iri) { 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, iri); 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; +} + +AtomFeed * +atom_retrieve_feed (AtomCtx *ctx) +{ + AtomFeed *feed; + AtomEntry **entries; + size_t len; + atom_backend_enumerate_entries (ctx, &entries, &len); + feed = atom_feed_new (); + atom_feed_entry_append_array (feed, entries, len); + return feed; +} + +AtomResource * +atom_retrieve_resource (AtomCtx *ctx, IRI *iri) +{ + AtomResource *res; + char * path; + path = iri_get_path (iri); + if (!strcmp (path, "/")) + { + AtomFeed *feed; + feed = atom_retrieve_feed (ctx); + if (feed == NULL) + return NULL; + res = atom_resource_new_from_feed (feed); + atom_feed_delete (feed); + } + else + { + AtomEntry *entry; + entry = atom_retrieve_entry (ctx, iri); + if (entry == NULL) + return NULL; + res = atom_resource_new_from_entry (entry); + atom_entry_delete (entry); + } + return res; +}