More fixes from Jim.
[iwhd.git] / template.c
blob4434c5b9d6ba2dc91e1f4fd9098a9a28d02d5dad
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "template.h"
6 char xml_root_header[] = "\
7 <api service=\"%s\" version=\"%s\">\
8 ";
10 char xml_root_entry[] = "\
11 \n\
12 <link rel=\"%s\" href=\"http://%s/\%s\"/>\
15 char xml_root_footer[] = "\
16 \n\
17 </api>\n\
20 char xml_prov_header[] = "\
21 <providers>\
24 char xml_prov_entry[] = "\
25 \n\
26 <provider name=\"%s\">\n\
27 <type>%s</type>\n\
28 <host>%s</host>\n\
29 <port>%d</port>\n\
30 <username>%s</username>\n\
31 <password>%s</password>\n\
32 </provider>\
35 char xml_prov_footer[] = "\
36 \n\
37 </providers>\n\
40 char xml_obj_header[] = "\
41 <objects>\
44 char xml_obj_entry[] = "\
45 \n\
46 <object>\n\
47 <bucket>%s</bucket>\n\
48 <key>%s</key>\n\
49 </object>\
52 char xml_obj_footer[] = "\
53 \n\
54 </objects>\n\
58 tmpl_format_t xml_format = {
59 .root_header = xml_root_header,
60 .root_entry = xml_root_entry,
61 .root_footer = xml_root_footer,
62 .prov_header = xml_prov_header,
63 .prov_entry = xml_prov_entry,
64 .prov_footer = xml_prov_footer,
65 .obj_header = xml_obj_header,
66 .obj_entry = xml_obj_entry,
67 .obj_footer = xml_obj_footer,
68 .z_offset = 0
71 char json_root_header[] = "\
72 {\n\
73 \"service\": \"%s\",\n\
74 \"version\": \"%s\",\n\
78 char json_root_entry[] = "\
79 ,\n\
80 {\n\
81 \"rel\": \"%s\",\n\
82 \"link\": \"http://%s/%s\"\n\
86 char json_root_footer[] = "\
87 \n\
88 ]\n\
89 }\n\
92 char json_prov_header[] = "\
96 char json_prov_entry[] = "\
97 ,\n\
98 {\n\
99 \"name\": \"%s\",\n\
100 \"type\": \"%s\",\n\
101 \"host\": \"%s\",\n\
102 \"port\": %d,\n\
103 \"username\": \"%s\",\n\
104 \"password\": \"%s\"\n\
108 char json_prov_footer[] = "\
110 ]\n\
113 char json_obj_header[] = "\
117 char json_obj_entry[] = "\
118 ,\n\
119 {\n\
120 \"bucket\": \"%s\",\n\
121 \"key\": \"%s\"\n\
125 char json_obj_footer[] = "\
127 ]\n\
130 tmpl_format_t json_format = {
131 .root_header = json_root_header,
132 .root_entry = json_root_entry,
133 .root_footer = json_root_footer,
134 .prov_header = json_prov_header,
135 .prov_entry = json_prov_entry,
136 .prov_footer = json_prov_footer,
137 .obj_header = json_obj_header,
138 .obj_entry = json_obj_entry,
139 .obj_footer = json_obj_footer,
140 .z_offset = 1
143 tmpl_ctx_t *
144 tmpl_get_ctx (const char *type)
146 tmpl_ctx_t *tmp;
148 tmp = malloc(sizeof(*tmp));
149 if (tmp) {
150 if (type && strstr(type,"/json")) {
151 tmp->format = &json_format;
153 else {
154 tmp->format = &xml_format;
156 tmp->index = 0;
158 return tmp;
162 tmpl_root_header (tmpl_ctx_t *ctx, char *name, char *version)
164 int size;
165 tmpl_format_t *fmt = ctx->format;
167 size = snprintf(ctx->raw_buf,TMPL_BUF_SIZE,fmt->root_header,
168 name,version);
169 if (size >= TMPL_BUF_SIZE) {
170 return 0;
172 ctx->buf = ctx->raw_buf;
174 return size;
178 tmpl_root_entry (tmpl_ctx_t *ctx, char *rel, char *link)
180 int size;
181 tmpl_format_t *fmt = ctx->format;
183 size = snprintf(ctx->raw_buf,TMPL_BUF_SIZE,fmt->root_entry,
184 rel, ctx->base, link);
185 if (size >= TMPL_BUF_SIZE) {
186 return 0;
188 ctx->buf = ctx->raw_buf;
190 if (size && (ctx->index == 0)) {
191 ctx->buf += fmt->z_offset;
192 size -= fmt->z_offset;
195 ++(ctx->index);
196 return size;
200 tmpl_root_footer (tmpl_ctx_t *ctx)
202 ctx->buf = ctx->format->root_footer;
203 return strlen(ctx->buf);
207 tmpl_prov_header (tmpl_ctx_t *ctx)
209 ctx->buf = ctx->format->prov_header;
210 return strlen(ctx->buf);
214 tmpl_prov_entry (tmpl_ctx_t *ctx,
215 const char *name, const char *type,
216 const char *host, int port,
217 const char *user, const char *pass)
219 int size;
220 tmpl_format_t *fmt = ctx->format;
222 size = snprintf(ctx->raw_buf,TMPL_BUF_SIZE,fmt->prov_entry,
223 name, type, host, port, user, pass);
224 if (size >= TMPL_BUF_SIZE) {
225 return 0;
227 ctx->buf = ctx->raw_buf;
229 if (size && (ctx->index == 0)) {
230 ctx->buf += fmt->z_offset;
231 size -= fmt->z_offset;
234 ++(ctx->index);
235 return size;
239 tmpl_prov_footer (tmpl_ctx_t *ctx)
241 ctx->buf = ctx->format->prov_footer;
242 return strlen(ctx->buf);
246 tmpl_obj_header (tmpl_ctx_t *ctx)
248 ctx->buf = ctx->format->obj_header;
249 return strlen(ctx->buf);
253 tmpl_obj_entry (tmpl_ctx_t *ctx, const char *bucket, const char *key)
255 int size;
256 tmpl_format_t *fmt = ctx->format;
258 size = snprintf(ctx->raw_buf,TMPL_BUF_SIZE,fmt->obj_entry,bucket,key);
259 if (size >= TMPL_BUF_SIZE) {
260 return 0;
262 ctx->buf = ctx->raw_buf;
264 if (size && (ctx->index == 0)) {
265 ctx->buf += fmt->z_offset;
266 size -= fmt->z_offset;
269 ++(ctx->index);
270 return size;
274 tmpl_obj_footer (tmpl_ctx_t *ctx)
276 ctx->buf = ctx->format->obj_footer;
277 return strlen(ctx->buf);