Add a CSS file.
[collection4.git] / src / action_list_graphs.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <errno.h>
5
6 #include "action_list_graphs.h"
7 #include "graph.h"
8 #include "graph_ident.h"
9 #include "graph_list.h"
10 #include "utils_cgi.h"
11
12 #include <fcgiapp.h>
13 #include <fcgi_stdio.h>
14
15 static int print_graph_inst_json (__attribute__((unused)) graph_config_t *cfg, /* {{{ */
16     graph_instance_t *inst,
17     void *user_data)
18 {
19   _Bool *first;
20   graph_ident_t *ident;
21   char *json;
22
23   first = user_data;
24
25   ident = inst_get_selector (inst);
26   if (ident == NULL)
27     return (-1);
28
29   json = ident_to_json (ident);
30   if (json == NULL)
31   {
32     ident_destroy (ident);
33     return (ENOMEM);
34   }
35
36   if (*first)
37     printf ("%s", json);
38   else
39     printf (",\n%s", json);
40
41   *first = 0;
42
43   ident_destroy (ident);
44   return (0);
45 } /* }}} int print_graph_inst_json */
46
47 static int print_graph_json (graph_config_t *cfg, /* {{{ */
48     void *user_data)
49 {
50   return (gl_graph_instance_get_all (cfg, print_graph_inst_json, user_data));
51 } /* }}} int print_graph_json */
52
53 static int list_graphs_json (void) /* {{{ */
54 {
55   _Bool first = 1;
56
57   printf ("Content-Type: application/json\n\n");
58
59   printf ("[\n");
60   gl_graph_get_all (print_graph_json, /* user_data = */ &first);
61   printf ("\n]");
62
63   return (0);
64 } /* }}} int list_graphs_json */
65
66 struct callback_data_s
67 {
68   graph_config_t *cfg;
69   int limit;
70 };
71 typedef struct callback_data_s callback_data_t;
72
73 static int print_graph_inst_html (graph_config_t *cfg, /* {{{ */
74     graph_instance_t *inst,
75     void *user_data)
76 {
77   callback_data_t *data = user_data;
78   char params[1024];
79   char desc[1024];
80
81   if (data->cfg != cfg)
82   {
83     if (data->cfg != NULL)
84       printf ("  </ul></li>\n");
85
86     memset (desc, 0, sizeof (desc));
87     graph_get_title (cfg, desc, sizeof (desc));
88     html_escape_buffer (desc, sizeof (desc));
89
90     printf ("  <li class=\"graph\">%s\n"
91         "  <ul class=\"instance_list\">\n", desc);
92
93     data->cfg = cfg;
94   }
95
96   memset (params, 0, sizeof (params));
97   inst_get_params (cfg, inst, params, sizeof (params));
98   html_escape_buffer (params, sizeof (params));
99
100   memset (desc, 0, sizeof (desc));
101   inst_describe (cfg, inst, desc, sizeof (desc));
102   html_escape_buffer (desc, sizeof (desc));
103
104   printf ("    <li class=\"instance\"><a href=\"%s?action=graph;%s\">%s</a></li>\n",
105       script_name (), params, desc);
106
107   if (data->limit > 0)
108     data->limit--;
109
110   /* Abort scan if limit is reached. */
111   if (data->limit == 0)
112     return (1);
113
114   return (0);
115 } /* }}} int print_graph_inst_html */
116
117 static int list_graphs_html (const char *term) /* {{{ */
118 {
119   callback_data_t data = { NULL, /* limit = */ 20 };
120   char *term_html;
121
122   term_html = NULL;
123   if (term != NULL)
124     term_html = html_escape (term);
125
126   printf ("Content-Type: text/html\n\n");
127
128   printf ("<html>\n  <head>\n");
129   if (term != NULL)
130     printf ("    <title>c4: Graphs matching &quot;%s&quot;</title>\n", term);
131   else
132     printf ("    <title>c4: List of all graphs</title>\n");
133   printf ("    <link rel=\"stylesheet\" type=\"text/css\" href=\"../share/style.css\" />\n");
134   printf ("  </head>\n  <body>\n");
135
136   printf ("<form action=\"%s\" method=\"get\">\n"
137       "  <input type=\"hidden\" name=\"action\" value=\"list_graphs\" />\n"
138       "  <input type=\"text\" name=\"search\" value=\"%s\" />\n"
139       "  <input type=\"submit\" name=\"button\" value=\"Search\" />\n"
140       "</form>\n",
141       script_name (), (term_html != NULL) ? term_html : "");
142
143   free (term_html);
144
145   printf ("    <ul class=\"graph_list\">\n");
146   if (term == NULL)
147     gl_instance_get_all (print_graph_inst_html, /* user_data = */ &data);
148   else
149     gl_search (term, print_graph_inst_html, /* user_data = */ &data);
150
151   if (data.cfg != NULL)
152     printf ("      </ul></li>\n");
153
154   printf ("    </ul>\n");
155
156   printf ("  </body>\n</html>\n");
157
158   return (0);
159 } /* }}} int list_graphs_html */
160
161 int action_list_graphs (void) /* {{{ */
162 {
163   const char *format;
164
165   gl_update ();
166
167   format = param ("format");
168   if (format == NULL)
169     format = "html";
170
171   if (strcmp ("json", format) == 0)
172     return (list_graphs_json ());
173   else
174     return (list_graphs_html (param ("search")));
175 } /* }}} int action_list_graphs */
176
177 /* vim: set sw=2 sts=2 et fdm=marker : */