Change lookup method to find if content is of XML type.
[cascardo/atompub.git] / atom / backend.c
1 /*
2  *  Copyright (C) 2007  Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License along
15  *  with this program; if not, write to the Free Software Foundation, Inc.,
16  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18
19
20 #include <atompub/atom.h>
21
22 #include <glib.h>
23
24 #include <string.h>
25
26 struct _atom_backend
27 {
28   AtomEntry * (*retrieve_entry) (AtomCtx *, char *);
29   void (*enumerate_entries) (AtomCtx *, char ***, AtomEntry ***, size_t *);
30   void (*publish_entry) (AtomCtx *, char *, AtomEntry *);
31 };
32
33 AtomBackend *
34 atom_backend_new ()
35 {
36   AtomBackend *backend;
37   backend = g_slice_new (AtomBackend);
38   backend->retrieve_entry = NULL;
39   backend->enumerate_entries = NULL;
40   return backend;
41 }
42
43 void
44 atom_backend_delete (AtomBackend *backend)
45 {
46   g_slice_free (AtomBackend, backend);
47 }
48
49 void
50 atom_backend_retrieve_entry_set (AtomBackend *backend,
51                                  AtomEntry *retrieve_entry (AtomCtx *,
52                                                             char *))
53 {
54   backend->retrieve_entry = retrieve_entry;
55 }
56
57 void
58 atom_backend_enumerate_entries_set (AtomBackend *backend,
59                                     void enumerate_entries (AtomCtx *,
60                                                             char ***,
61                                                             AtomEntry ***,
62                                                             size_t *))
63 {
64   backend->enumerate_entries = enumerate_entries;
65 }
66
67 void
68 atom_backend_publish_entry_set (AtomBackend *backend,
69                                 void publish_entry (AtomCtx *, char *,
70                                                     AtomEntry *))
71 {
72   backend->publish_entry = publish_entry;
73 }
74
75 AtomEntry *
76 atom_retrieve_entry (AtomCtx *ctx, char *req)
77 {
78   AtomBackend *backend;
79   backend = atom_backend (ctx);
80   if (backend && backend->retrieve_entry)
81     return backend->retrieve_entry (ctx, req);
82   return NULL;
83 }
84
85 void
86 atom_backend_enumerate_entries (AtomCtx *ctx, char *** reqs,
87                                 AtomEntry *** entries, size_t *len)
88 {
89   AtomBackend *backend;
90   char **rreqs = NULL;
91   AtomEntry **rentries = NULL;
92   size_t rlen = 0;
93   int i;
94   backend = atom_backend (ctx);
95   if (backend && backend->enumerate_entries)
96     {
97       backend->enumerate_entries (ctx, &rreqs, &rentries, &rlen);
98       atom_map_backend_requests (ctx, rreqs, rentries, rlen);
99       atom_frontend_map_entries (ctx, rreqs, rentries, rlen);
100     }
101   if (reqs)
102     {
103       *reqs = rreqs;
104     }
105   else
106     {
107       for (i = 0; i < rlen; i++)
108         g_free (rreqs[i]);
109       g_free (rreqs);
110     }
111   if (entries)
112     {
113       *entries = rentries;
114     }
115   else
116     {
117       for (i = 0; i < rlen; i++)
118         atom_entry_delete (rentries[i]);
119       g_free (rentries);
120     }
121   if (len)
122     *len = rlen;
123 }
124
125 AtomFeed *
126 atom_retrieve_feed (AtomCtx *ctx)
127 {
128   AtomFeed *feed;
129   AtomEntry **entries;
130   size_t len;
131   atom_backend_enumerate_entries (ctx, NULL, &entries, &len);
132   if (atom_error_get (ctx) != NULL)
133     return NULL;
134   feed = atom_feed_new ();
135   atom_feed_entry_append_array (feed, entries, len);
136   g_free (entries);
137   return feed;
138 }
139
140 void
141 atom_publish_entry (AtomCtx *ctx, char *req, AtomEntry *entry)
142 {
143   AtomBackend *backend;
144   AtomError *aerr;
145   backend = atom_backend (ctx);
146   if (backend && backend->publish_entry)
147     {
148       backend->publish_entry (ctx, req, entry);
149     }
150   else
151     {
152       aerr = atom_error_new ();
153       atom_error_code_set (aerr, 501);
154       atom_error_message_set (aerr, "Not Implemented");
155       atom_error_set (ctx, aerr);
156     }
157 }