Simple mainpage generation, skeletons for further work
[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 <time.h>
29 #include <stdint.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 = cwa_strndup ("main", SIZE_MAX);
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     {
56       struct ctgit_repo_info* h = (struct ctgit_repo_info*)head;
57
58       free (h->path);
59       free (h->name);
60
61       free (h->owner);
62       free (h->description);
63       free (h->pull_url);
64
65       llist_unlink (head);
66       free (h);
67     }
68
69   return q;
70 }
71
72
73 void
74 ctgit_query_add_repo (struct ctgit_query* q, const char* path)
75 {
76
77   struct ctgit_repo_info* ri = ctgit_repoinfo_new (path);
78   if (!ri)
79     return;
80
81   LList p = &q->repos;
82   LLIST_FOREACH (&q->repos, node)
83     {
84       struct ctgit_repo_info* n = (struct ctgit_repo_info*)node;
85       if (strcmp (n->name, ri->name) > 0)
86         break;
87       p = node;
88     }
89   llist_insert_next (p, &ri->node);
90 }
91
92
93 static void
94 ctgit_repo_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
95 {
96   struct ctgit_query* q = (struct ctgit_query*) u_dat;
97
98   free (q->repo);
99   q->repo = cwa_strndup(v, SIZE_MAX);
100
101   fprintf (stderr,"repo='%s'\n", v);
102 }
103
104 static void
105 ctgit_action_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
106 {
107   struct ctgit_query* q = (struct ctgit_query*) u_dat;
108
109   free (q->action);
110   q->action = cwa_strndup(v, SIZE_MAX);
111
112   fprintf (stderr,"action='%s'\n", v);
113 }
114
115 static void
116 ctgit_object_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
117 {
118   struct ctgit_query* q = (struct ctgit_query*) u_dat;
119
120   free (q->object);
121   q->object = cwa_strndup (v, SIZE_MAX);
122
123   fprintf (stderr,"object='%s'\n", v);
124 }
125
126 static void
127 ctgit_ref_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
128 {
129   struct ctgit_query* q = (struct ctgit_query*) u_dat;
130
131   free (q->head);
132   q->head = cwa_strndup(v, SIZE_MAX);
133
134   fprintf (stderr,"head='%s'\n", v);
135 }
136
137
138
139 void
140 ctgit_param_dispatch (const Cgi self,
141                       const char* name,
142                       const char* value,
143                       size_t value_len,
144                       void* user_data)
145 {
146 #define CTGIT_PARAM(name, _) {#name, ctgit_##name##_param},
147   struct param_table{
148     char* name;
149     void (*cb)(const Cgi, const char* v, size_t v_sz, void* u_dat);
150   } cmds[] = {CTGIT_PARAMS {"", NULL}};
151 #undef CTGIT_PARAMS
152
153   for (struct param_table* j = cmds; j->cb; ++j)
154     {
155       if (!strcmp (j->name, name))
156         {
157           j->cb (self, value, value_len, user_data);
158           break;
159         }
160     }
161 }