cleanup and cosmetics
[webgit] / src / query.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007,               Christian Thaeter <ct@pipapo.org>
6
7   This program is free software; you can redistribute it and/or
8   modify it under the terms of the GNU General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22
23 #include "query.h"
24 #include "repo.h"
25
26 #include "cwa.h"
27
28 #include <stdint.h>
29 #include <time.h>
30
31 void
32 ctgit_query_init (struct ctgit_query* q)
33 {
34   q->request = NULL;
35   q->now = time (NULL);
36
37   q->repo = NULL;
38   q->action = NULL;
39   q->object = NULL;
40   q->head = NULL;
41   llist_init (&q->repos);
42 }
43
44 struct ctgit_query*
45 ctgit_query_destroy (struct ctgit_query* q)
46 {
47   cgi_free (q->request);
48
49   free (q->repo);
50   free (q->action);
51   free (q->object);
52   free (q->head);
53
54   LLIST_WHILE_HEAD (&q->repos, head)
55     ctgit_repoinfo_free ((struct ctgit_repo_info*) head);
56
57   return q;
58 }
59
60
61 void
62 ctgit_query_add_repo (struct ctgit_query* q, const char* path)
63 {
64   struct ctgit_repo_info* ri = ctgit_repoinfo_new (q, path);
65   if (!ri)
66     return;
67
68   LList p = &q->repos;
69   LLIST_FOREACH (&q->repos, node)
70     {
71       struct ctgit_repo_info* n = (struct ctgit_repo_info*)node;
72       if (strcmp (n->name, ri->name) > 0)
73         break;
74       p = node;
75     }
76   llist_insert_next (p, &ri->node);
77 }
78
79
80 static void
81 ctgit_repo_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
82 {
83   (void) self;
84   struct ctgit_query* q = (struct ctgit_query*) u_dat;
85
86   /* TODO validate that v is a probably legal repo name (alnum()) */
87
88   free (q->repo);
89   q->repo = cwa_strndup (v, v_sz);
90 }
91
92
93 static void
94 ctgit_action_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
95 {
96   (void) self;
97   struct ctgit_query* q = (struct ctgit_query*) u_dat;
98
99   /* TODO validate that v is a probably legal action name alpha() */
100
101   free (q->action);
102   q->action = cwa_strndup (v, v_sz);
103 }
104
105
106 static void
107 ctgit_object_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
108 {
109   (void) self;
110   struct ctgit_query* q = (struct ctgit_query*) u_dat;
111
112   if (!q->action)
113     q->action = cwa_strndup ("object", SIZE_MAX);
114
115   /* TODO validate that v is a probably sha1 (<=40 chars, hex) */
116
117   free (q->object);
118   q->object = cwa_strndup (v, v_sz);
119 }
120
121
122 static void
123 ctgit_ref_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
124 {
125   (void) self;
126   struct ctgit_query* q = (struct ctgit_query*) u_dat;
127
128   /* TODO validate that v is a probably legal reference (alnum() || one of '_/.') */
129
130   free (q->head);
131   q->head = cwa_strndup (v, v_sz);
132 }
133
134
135 void
136 ctgit_param_dispatch (const Cgi self,
137                       const char* name,
138                       const char* value,
139                       size_t value_len,
140                       void* user_data)
141 {
142 #define CTGIT_PARAM(name, _) {#name, ctgit_##name##_param},
143   struct param_table{
144     char* name;
145     void (*cb)(const Cgi, const char* v, size_t v_sz, void* u_dat);
146   } cmds[] = {CTGIT_PARAMS {"", NULL}};
147 #undef CTGIT_PARAMS
148
149   for (struct param_table* j = cmds; j->cb; ++j)
150     {
151       if (!strcmp (j->name, name))
152         {
153           j->cb (self, value, value_len, user_data);
154           break;
155         }
156     }
157 }