implicit 'action=object' when 'object=' is given and no action set
[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
30 void
31 ctgit_query_init (struct ctgit_query* q)
32 {
33   q->request = NULL;
34   q->now = time (NULL);
35
36   q->repo = NULL;
37   q->action = cwa_strndup ("main", SIZE_MAX);
38   q->object = NULL;
39   q->head = NULL;
40   llist_init (&q->repos);
41 }
42
43 struct ctgit_query*
44 ctgit_query_destroy (struct ctgit_query* q)
45 {
46   cgi_free (q->request);
47
48   free (q->repo);
49   free (q->action);
50   free (q->object);
51   free (q->head);
52
53   LLIST_WHILE_HEAD (&q->repos, head)
54     ctgit_repoinfo_free ((struct ctgit_repo_info*) head);
55
56   return q;
57 }
58
59
60 void
61 ctgit_query_add_repo (struct ctgit_query* q, const char* path)
62 {
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   struct ctgit_query* q = (struct ctgit_query*) u_dat;
84
85   free (q->repo);
86   q->repo = cwa_strndup(v, SIZE_MAX);
87
88   fprintf (stderr,"repo='%s'\n", v);
89 }
90
91 static void
92 ctgit_action_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
93 {
94   struct ctgit_query* q = (struct ctgit_query*) u_dat;
95
96   free (q->action);
97   q->action = cwa_strndup(v, SIZE_MAX);
98
99   fprintf (stderr,"action='%s'\n", v);
100 }
101
102 static void
103 ctgit_object_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
104 {
105   struct ctgit_query* q = (struct ctgit_query*) u_dat;
106
107   if (*q->action == '\0')
108     {
109       free (q->action);
110       q->action = cwa_strndup ("object", SIZE_MAX);
111     }
112
113   free (q->object);
114   q->object = cwa_strndup (v, SIZE_MAX);
115
116   fprintf (stderr,"object='%s'\n", v);
117 }
118
119 static void
120 ctgit_ref_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
121 {
122   struct ctgit_query* q = (struct ctgit_query*) u_dat;
123
124   free (q->head);
125   q->head = cwa_strndup(v, SIZE_MAX);
126
127   fprintf (stderr,"head='%s'\n", v);
128 }
129
130
131
132 void
133 ctgit_param_dispatch (const Cgi self,
134                       const char* name,
135                       const char* value,
136                       size_t value_len,
137                       void* user_data)
138 {
139 #define CTGIT_PARAM(name, _) {#name, ctgit_##name##_param},
140   struct param_table{
141     char* name;
142     void (*cb)(const Cgi, const char* v, size_t v_sz, void* u_dat);
143   } cmds[] = {CTGIT_PARAMS {"", NULL}};
144 #undef CTGIT_PARAMS
145
146   for (struct param_table* j = cmds; j->cb; ++j)
147     {
148       if (!strcmp (j->name, name))
149         {
150           j->cb (self, value, value_len, user_data);
151           break;
152         }
153     }
154 }