Fix: set 'main' action after the query dispatch
[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   free (q->repo);
87   q->repo = cwa_strndup (v, v_sz);
88 }
89
90
91 static void
92 ctgit_action_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
93 {
94   (void) self;
95   struct ctgit_query* q = (struct ctgit_query*) u_dat;
96
97   free (q->action);
98   q->action = cwa_strndup (v, v_sz);
99 }
100
101
102 static void
103 ctgit_object_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
104 {
105   (void) self;
106   struct ctgit_query* q = (struct ctgit_query*) u_dat;
107
108   if (!q->action)
109     q->action = cwa_strndup ("object", SIZE_MAX);
110
111   free (q->object);
112   q->object = cwa_strndup (v, v_sz);
113 }
114
115
116 static void
117 ctgit_ref_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
118 {
119   (void) self;
120   struct ctgit_query* q = (struct ctgit_query*) u_dat;
121
122   free (q->head);
123   q->head = cwa_strndup (v, v_sz);
124 }
125
126
127 void
128 ctgit_param_dispatch (const Cgi self,
129                       const char* name,
130                       const char* value,
131                       size_t value_len,
132                       void* user_data)
133 {
134 #define CTGIT_PARAM(name, _) {#name, ctgit_##name##_param},
135   struct param_table{
136     char* name;
137     void (*cb)(const Cgi, const char* v, size_t v_sz, void* u_dat);
138   } cmds[] = {CTGIT_PARAMS {"", NULL}};
139 #undef CTGIT_PARAMS
140
141   for (struct param_table* j = cmds; j->cb; ++j)
142     {
143       if (!strcmp (j->name, name))
144         {
145           j->cb (self, value, value_len, user_data);
146           break;
147         }
148     }
149 }