Use local variables when calling backend enumerate function
[cascardo/atompub.git] / src / backend.c
index f6051be..5bcbb42 100644 (file)
 
 
 #include <atompub/atom.h>
+
 #include <glib.h>
 
+#include <string.h>
+
 struct _atom_backend
 {
-  AtomEntry * (*retrieve_resource) (AtomCtx *, IRI *);
-  void (*enumerate_entries) (AtomCtx *, AtomEntry ***, size_t *);
+  AtomEntry * (*retrieve_entry) (AtomCtx *, AtomID *);
+  void (*enumerate_entries) (AtomCtx *, char ***, AtomEntry ***, size_t *);
+  int  (*is_feed) (AtomCtx *, AtomID *);
 };
 
 AtomBackend *
@@ -31,7 +35,7 @@ atom_backend_new ()
 {
   AtomBackend *backend;
   backend = g_slice_new (AtomBackend);
-  backend->retrieve_resource = NULL;
+  backend->retrieve_entry = NULL;
   backend->enumerate_entries = NULL;
   return backend;
 }
@@ -43,39 +47,118 @@ atom_backend_delete (AtomBackend *backend)
 }
 
 void
-atom_backend_retrieve_resource_set (AtomBackend *backend,
-                                   AtomEntry *retrieve_resource (AtomCtx *,
-                                                                 IRI *))
+atom_backend_retrieve_entry_set (AtomBackend *backend,
+                                AtomEntry *retrieve_entry (AtomCtx *,
+                                                           AtomID *))
 {
-  backend->retrieve_resource = retrieve_resource;
+  backend->retrieve_entry = retrieve_entry;
 }
 
 void
 atom_backend_enumerate_entries_set (AtomBackend *backend,
                                    void enumerate_entries (AtomCtx *,
-                                                           AtomEntry ***, size_t*))
+                                                           char ***,
+                                                           AtomEntry ***,
+                                                           size_t *))
 {
   backend->enumerate_entries = enumerate_entries;
 }
 
+void
+atom_backend_is_feed_set (AtomBackend *backend,
+                         int is_feed (AtomCtx *, AtomID *))
+{
+  backend->is_feed = is_feed;
+}
+
 AtomEntry *
-atom_retrieve_resource (AtomCtx *ctx, IRI *iri)
+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)
+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;
   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;
+  if (entries)
+    *entries = rentries;
+  if (len)
+    *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;
+}
+
+AtomFeed *
+atom_retrieve_feed (AtomCtx *ctx)
+{
+  AtomFeed *feed;
+  AtomEntry **entries;
+  size_t 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);
+  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;
 }