1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <errno.h>
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"
12 #include <fcgiapp.h>
13 #include <fcgi_stdio.h>
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;
23 first = user_data;
25 ident = inst_get_selector (inst);
26 if (ident == NULL)
27 return (-1);
29 json = ident_to_json (ident);
30 if (json == NULL)
31 {
32 ident_destroy (ident);
33 return (ENOMEM);
34 }
36 if (*first)
37 printf ("%s", json);
38 else
39 printf (",\n%s", json);
41 *first = 0;
43 ident_destroy (ident);
44 return (0);
45 } /* }}} int print_graph_inst_json */
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 */
53 static int list_graphs_json (void) /* {{{ */
54 {
55 _Bool first = 1;
57 printf ("Content-Type: application/json\n\n");
59 printf ("[\n");
60 gl_graph_get_all (print_graph_json, /* user_data = */ &first);
61 printf ("\n]");
63 return (0);
64 } /* }}} int list_graphs_json */
66 struct callback_data_s
67 {
68 graph_config_t *cfg;
69 int limit;
70 };
71 typedef struct callback_data_s callback_data_t;
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];
81 if (data->cfg != cfg)
82 {
83 if (data->cfg != NULL)
84 printf (" </ul></li>\n");
86 memset (desc, 0, sizeof (desc));
87 graph_get_title (cfg, desc, sizeof (desc));
89 printf (" <li>%s\n <ul>\n", desc);
91 data->cfg = cfg;
92 }
94 memset (params, 0, sizeof (params));
95 inst_get_params (cfg, inst, params, sizeof (params));
97 memset (desc, 0, sizeof (desc));
98 inst_describe (cfg, inst, desc, sizeof (desc));
100 printf (" <li><a href=\"%s?action=graph;%s\">%s</a></li>\n",
101 script_name (), params, desc);
103 if (data->limit > 0)
104 data->limit--;
106 /* Abort scan if limit is reached. */
107 if (data->limit == 0)
108 return (1);
110 return (0);
111 } /* }}} int print_graph_inst_html */
113 static int list_graphs_html (const char *term) /* {{{ */
114 {
115 callback_data_t data = { NULL, /* limit = */ 20 };
116 printf ("Content-Type: text/html\n\n");
118 printf ("<html>\n <head>\n");
119 if (term != NULL)
120 printf (" <title>c4: Graphs matching "%s"</title>\n", term);
121 else
122 printf (" <title>c4: List of all graphs</title>\n");
123 printf (" </head>\n <body>\n");
125 printf ("<form action=\"%s\" method=\"get\">\n"
126 " <input type=\"hidden\" name=\"action\" value=\"list_graphs\" />\n"
127 " <input type=\"text\" name=\"search\" value=\"%s\" />\n"
128 " <input type=\"submit\" name=\"button\" value=\"Search\" />\n"
129 "</form>\n",
130 script_name (), (term != NULL) ? term : "");
132 printf (" <ul>\n");
133 if (term == NULL)
134 gl_instance_get_all (print_graph_inst_html, /* user_data = */ &data);
135 else
136 gl_search (term, print_graph_inst_html, /* user_data = */ &data);
138 if (data.cfg != NULL)
139 printf (" </ul></li>\n");
141 printf (" </ul>\n");
143 printf (" </body>\n</html>\n");
145 return (0);
146 } /* }}} int list_graphs_html */
148 int action_list_graphs (void) /* {{{ */
149 {
150 const char *format;
152 gl_update ();
154 format = param ("format");
155 if (format == NULL)
156 format = "html";
158 if (strcmp ("json", format) == 0)
159 return (list_graphs_json ());
160 else
161 return (list_graphs_html (param ("search")));
162 } /* }}} int action_list_graphs */
164 /* vim: set sw=2 sts=2 et fdm=marker : */