5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2003 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 #include "silcincludes.h"
21 #include "silcclient.h"
24 /******* Command Script Parsing **********************************************/
26 SILC_CONFIG_CALLBACK(silc_map_cmd_server);
27 SILC_CONFIG_CALLBACK(silc_map_cmd_loadmap);
28 SILC_CONFIG_CALLBACK(silc_map_cmd_writemap);
29 SILC_CONFIG_CALLBACK(silc_map_cmd_writemaphtml);
30 SILC_CONFIG_CALLBACK(silc_map_cmd_writehtml);
31 SILC_CONFIG_CALLBACK(silc_map_cmd_cut);
32 SILC_CONFIG_CALLBACK(silc_map_cmd_rectangle);
33 SILC_CONFIG_CALLBACK(silc_map_cmd_circle);
34 SILC_CONFIG_CALLBACK(silc_map_cmd_line);
35 SILC_CONFIG_CALLBACK(silc_map_cmd_text);
37 static const SilcConfigTable silc_map_table_loadmap[] =
39 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_loadmap, NULL },
42 static const SilcConfigTable silc_map_table_writemap[] =
44 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_writemap, NULL },
47 static const SilcConfigTable silc_map_table_writemaphtml[] =
49 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_writemaphtml, NULL },
50 { "image", SILC_CONFIG_ARG_STR, silc_map_cmd_writemaphtml, NULL },
51 { "cut_lat", SILC_CONFIG_ARG_STRE, silc_map_cmd_writemaphtml, NULL },
52 { "cut_lon", SILC_CONFIG_ARG_STRE, silc_map_cmd_writemaphtml, NULL },
55 static const SilcConfigTable silc_map_table_writehtml[] =
57 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_writehtml, NULL },
58 { "class", SILC_CONFIG_ARG_STRE, silc_map_cmd_writehtml, NULL },
61 static const SilcConfigTable silc_map_table_cut[] =
63 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_cut, NULL },
64 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_cut, NULL },
65 { "width", SILC_CONFIG_ARG_INT, silc_map_cmd_cut, NULL },
66 { "height", SILC_CONFIG_ARG_INT, silc_map_cmd_cut, NULL },
67 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_cut, NULL },
70 static const SilcConfigTable silc_map_table_rectangle[] =
72 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
73 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
74 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
75 { "label", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
76 { "lposx", SILC_CONFIG_ARG_INT, silc_map_cmd_rectangle, NULL },
77 { "lposy", SILC_CONFIG_ARG_INT, silc_map_cmd_rectangle, NULL },
78 { "lcolor", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
81 static const SilcConfigTable silc_map_table_circle[] =
83 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
84 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
85 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
86 { "label", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
87 { "lposx", SILC_CONFIG_ARG_INT, silc_map_cmd_circle, NULL },
88 { "lposy", SILC_CONFIG_ARG_INT, silc_map_cmd_circle, NULL },
89 { "lcolor", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
92 static const SilcConfigTable silc_map_table_line[] =
94 { "a_lat", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
95 { "a_lon", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
96 { "b_lat", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
97 { "b_lon", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
98 { "width", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
99 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
102 static const SilcConfigTable silc_map_table_text[] =
104 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
105 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
106 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
107 { "text", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
110 static const SilcConfigTable silc_map_table_server[] =
113 { "hostname", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
114 { "ip", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
115 { "port", SILC_CONFIG_ARG_INT, silc_map_cmd_server, NULL },
116 { "public_key", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
117 { "country", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
118 { "city", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
119 { "admin", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
120 { "description", SILC_CONFIG_ARG_STRE, silc_map_cmd_server, NULL },
121 { "html_url", SILC_CONFIG_ARG_STRE, silc_map_cmd_server, NULL },
124 { "connect", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
125 { "connect_timeout", SILC_CONFIG_ARG_INT, silc_map_cmd_server, NULL },
128 { "starttime", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
129 { "uptime", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
130 { "clients", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
131 { "channels", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
132 { "server_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
133 { "router_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
134 { "cell_clients", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
135 { "cell_channels", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
136 { "cell_servers", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
137 { "all_clients", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
138 { "all_channels", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
139 { "all_servers", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
140 { "all_routers", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
141 { "all_server_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
142 { "all_router_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
143 { "motd", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
146 { "up_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
147 { "down_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
148 { "up_text_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
149 { "down_text_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
152 { "cut", SILC_CONFIG_ARG_BLOCK,
153 silc_map_cmd_cut, silc_map_table_cut },
154 { "rectangle", SILC_CONFIG_ARG_BLOCK,
155 silc_map_cmd_rectangle, silc_map_table_rectangle },
156 { "circle", SILC_CONFIG_ARG_BLOCK,
157 silc_map_cmd_circle, silc_map_table_circle },
158 { "line", SILC_CONFIG_ARG_BLOCK,
159 silc_map_cmd_line, silc_map_table_line },
160 { "text", SILC_CONFIG_ARG_BLOCK,
161 silc_map_cmd_text, silc_map_table_text },
164 static const SilcConfigTable silc_map_table_main[] =
166 { "server", SILC_CONFIG_ARG_BLOCK,
167 silc_map_cmd_server, silc_map_table_server },
168 { "loadmap", SILC_CONFIG_ARG_BLOCK,
169 silc_map_cmd_loadmap, silc_map_table_loadmap },
170 { "writemap", SILC_CONFIG_ARG_BLOCK,
171 silc_map_cmd_writemap, silc_map_table_writemap },
172 { "writemaphtml", SILC_CONFIG_ARG_BLOCK,
173 silc_map_cmd_writemaphtml, silc_map_table_writemaphtml },
174 { "writehtml", SILC_CONFIG_ARG_BLOCK,
175 silc_map_cmd_writehtml, silc_map_table_writehtml },
176 { "cut", SILC_CONFIG_ARG_BLOCK,
177 silc_map_cmd_cut, silc_map_table_cut },
178 { "rectangle", SILC_CONFIG_ARG_BLOCK,
179 silc_map_cmd_rectangle, silc_map_table_rectangle },
180 { "circle", SILC_CONFIG_ARG_BLOCK,
181 silc_map_cmd_circle, silc_map_table_circle },
182 { "line", SILC_CONFIG_ARG_BLOCK,
183 silc_map_cmd_line, silc_map_table_line },
184 { "text", SILC_CONFIG_ARG_BLOCK,
185 silc_map_cmd_text, silc_map_table_text },
189 /* Command datas. Used when command is outside server { } section. */
190 static char *filename = NULL;
191 static char *lat = NULL;
192 static char *lon = NULL;
193 static char *lat2 = NULL;
194 static char *lon2 = NULL;
195 static SilcUInt32 width = 0;
196 static SilcUInt32 height = 0;
197 static SilcInt16 r = 0;
198 static SilcInt16 g = 0;
199 static SilcInt16 b = 0;
200 static SilcInt16 lr = -1;
201 static SilcInt16 lg = -1;
202 static SilcInt16 lb = -1;
203 static char *text = NULL;
204 static SilcInt32 lposx = 0;
205 static SilcInt32 lposy = 0;
206 static bool color_set = FALSE;
207 static bool lcolor_set = FALSE;
209 /* Current server section. */
210 SilcMapConnection curr_conn = NULL;
212 /* Command: server, performs the connection to the remote server and
213 gathers statistical information. */
215 SILC_CONFIG_CALLBACK(silc_map_cmd_server)
217 SilcMap map = context;
218 int retval = SILC_CONFIG_OK;
221 fprintf(stderr, "You must call loadmap command before server command\n");
222 return SILC_CONFIG_ESILENT;
225 if (type == SILC_CONFIG_ARG_BLOCK) {
226 SILC_LOG_DEBUG(("Server config parsed"));
228 if (!curr_conn->ips) {
229 fprintf(stderr, "IP must be configured\n");
230 return SILC_CONFIG_EMISSFIELDS;
232 if (!curr_conn->hostnames) {
233 fprintf(stderr, "Hostname must be configured\n");
234 return SILC_CONFIG_EMISSFIELDS;
236 if (!curr_conn->port) {
237 fprintf(stderr, "Port must be configured\n");
238 return SILC_CONFIG_EMISSFIELDS;
241 /* The server data is now gathered. We continue by creating the
242 connection to the server and executing the requested commands. */
243 silc_map_connect(map, curr_conn);
252 /* Mark the current parsed server */
254 curr_conn = silc_calloc(1, sizeof(*curr_conn));
256 return SILC_CONFIG_ESILENT;
258 curr_conn->hostnames = silc_dlist_init();
259 curr_conn->ips = silc_dlist_init();
260 curr_conn->commands = silc_dlist_init();
261 curr_conn->map = map;
263 map->conns = silc_dlist_init();
264 silc_dlist_add(map->conns, curr_conn);
267 if (!strcmp(name, "hostname")) {
268 silc_dlist_add(curr_conn->hostnames, strdup((char *)val));
269 } else if (!strcmp(name, "ip")) {
270 silc_dlist_add(curr_conn->ips, strdup((char *)val));
271 } else if (!strcmp(name, "port")) {
272 curr_conn->port = (SilcUInt32)*(int *)val;
273 } else if (!strcmp(name, "public_key")) {
274 curr_conn->public_key = strdup((char *)val);
275 } else if (!strcmp(name, "country")) {
276 curr_conn->country = strdup((char *)val);
277 } else if (!strcmp(name, "city")) {
278 curr_conn->city = strdup((char *)val);
279 } else if (!strcmp(name, "admin")) {
280 curr_conn->admin = strdup((char *)val);
281 } else if (!strcmp(name, "description")) {
282 curr_conn->description = strdup((char *)val);
283 } else if (!strcmp(name, "html_url")) {
284 curr_conn->html_url = strdup((char *)val);
285 } else if (!strcmp(name, "connect")) {
286 curr_conn->connect = (bool)*(int *)val;
287 } else if (!strcmp(name, "connect_timeout")) {
288 curr_conn->connect_timeout = (SilcUInt32)*(int *)val;
289 } else if (!strcmp(name, "starttime")) {
290 curr_conn->starttime = (bool)*(int *)val;
291 } else if (!strcmp(name, "uptime")) {
292 curr_conn->uptime = (bool)*(int *)val;
293 } else if (!strcmp(name, "clients")) {
294 curr_conn->clients = (bool)*(int *)val;
295 } else if (!strcmp(name, "channels")) {
296 curr_conn->channels = (bool)*(int *)val;
297 } else if (!strcmp(name, "server_ops")) {
298 curr_conn->server_ops = (bool)*(int *)val;
299 } else if (!strcmp(name, "router_ops")) {
300 curr_conn->router_ops = (bool)*(int *)val;
301 } else if (!strcmp(name, "cell_clients")) {
302 curr_conn->cell_clients = (bool)*(int *)val;
303 } else if (!strcmp(name, "cell_channels")) {
304 curr_conn->cell_channels = (bool)*(int *)val;
305 } else if (!strcmp(name, "cell_servers")) {
306 curr_conn->cell_servers = (bool)*(int *)val;
307 } else if (!strcmp(name, "all_clients")) {
308 curr_conn->all_clients = (bool)*(int *)val;
309 } else if (!strcmp(name, "all_channels")) {
310 curr_conn->all_channels = (bool)*(int *)val;
311 } else if (!strcmp(name, "all_servers")) {
312 curr_conn->all_servers = (bool)*(int *)val;
313 } else if (!strcmp(name, "all_routers")) {
314 curr_conn->all_routers = (bool)*(int *)val;
315 } else if (!strcmp(name, "all_server_ops")) {
316 curr_conn->all_server_ops = (bool)*(int *)val;
317 } else if (!strcmp(name, "all_router_ops")) {
318 curr_conn->all_router_ops = (bool)*(int *)val;
319 } else if (!strcmp(name, "motd")) {
320 curr_conn->motd = (bool)*(int *)val;
321 } else if (!strcmp(name, "up_color")) {
322 curr_conn->up_color = strdup((char *)val);
323 } else if (!strcmp(name, "down_color")) {
324 curr_conn->down_color = strdup((char *)val);
325 } else if (!strcmp(name, "up_text_color")) {
326 curr_conn->up_text_color = strdup((char *)val);
327 } else if (!strcmp(name, "down_text_color")) {
328 curr_conn->down_text_color = strdup((char *)val);
330 retval = SILC_CONFIG_ESILENT;
336 /* Command: loadmap, loadmaps the bitmap map image. */
338 SILC_CONFIG_CALLBACK(silc_map_cmd_loadmap)
340 SilcMap map = context;
341 int retval = SILC_CONFIG_OK;
343 if (type == SILC_CONFIG_ARG_BLOCK) {
345 return SILC_CONFIG_EMISSFIELDS;
347 SILC_LOG_DEBUG(("loadmap: file: %s", filename));
349 /* Destroy old bitmap if loadmaped */
350 silc_free(map->bitmap);
352 /* Loadmap the bitmap image */
353 if (!silc_map_load_ppm(map, filename))
354 retval = SILC_CONFIG_ESILENT;
363 if (!strcmp(name, "filename"))
364 filename = strdup((char *)val);
366 retval = SILC_CONFIG_ESILENT;
371 /* Command: writemap, writemap the map into bitmap file. */
373 SILC_CONFIG_CALLBACK(silc_map_cmd_writemap)
375 SilcMap map = context;
376 int retval = SILC_CONFIG_OK;
378 if (type == SILC_CONFIG_ARG_BLOCK) {
380 return SILC_CONFIG_EMISSFIELDS;
382 SILC_LOG_DEBUG(("writemap: file: %s", filename));
384 /* Execute directly if there are no connections */
385 if (map->conns_num == 0) {
386 /* Writemap the map */
387 if (!silc_map_write_ppm(map, filename))
388 retval = SILC_CONFIG_ESILENT;
390 map->writemap.filename = strdup(filename);
391 map->writemap.writemap = TRUE;
401 if (!strcmp(name, "filename"))
402 filename = strdup((char *)val);
404 retval = SILC_CONFIG_ESILENT;
409 /* Command: writemaphtml, writes HTML map of the image map. */
411 SILC_CONFIG_CALLBACK(silc_map_cmd_writemaphtml)
413 SilcMap map = context;
414 int retval = SILC_CONFIG_OK;
416 if (type == SILC_CONFIG_ARG_BLOCK) {
419 return SILC_CONFIG_EMISSFIELDS;
421 SILC_LOG_DEBUG(("writemaphtml: file: %s", filename));
423 /* Will generate HTML map page */
424 i = map->writemaphtml_count;
425 map->writemaphtml = silc_realloc(map->writemaphtml,
426 sizeof(*map->writemaphtml) * (i + 1));
427 map->writemaphtml[i].filename = filename;
428 map->writemaphtml[i].text = text;
430 map->writemaphtml[i].x = silc_map_lon2x(map, lon);
432 map->writemaphtml[i].y = silc_map_lat2y(map, lat);
433 map->writemaphtml[i].writemaphtml = TRUE;
434 map->writemaphtml_count++;
446 if (!strcmp(name, "filename"))
447 filename = strdup((char *)val);
448 else if (!strcmp(name, "image"))
449 text = strdup((char *)val);
450 else if (!strcmp(name, "cut_lat"))
451 lat = strdup((char *)val);
452 else if (!strcmp(name, "cut_lon"))
453 lon = strdup((char *)val);
455 retval = SILC_CONFIG_ESILENT;
460 /* Command: writehtml, writes the gathered data into HTML pages. */
462 SILC_CONFIG_CALLBACK(silc_map_cmd_writehtml)
464 SilcMap map = context;
465 int retval = SILC_CONFIG_OK;
467 if (type == SILC_CONFIG_ARG_BLOCK) {
469 return SILC_CONFIG_EMISSFIELDS;
471 SILC_LOG_DEBUG(("writehtml: file: %s", filename));
473 /* Will generate HTML pages */
474 map->writehtml.filename = filename;
475 map->writehtml.text = text; /* class */
476 map->writehtml.writehtml = TRUE;
477 filename = text = NULL;
481 if (!strcmp(name, "filename"))
482 filename = strdup((char *)val);
483 else if (!strcmp(name, "class"))
484 text = strdup((char *)val);
486 retval = SILC_CONFIG_ESILENT;
491 /* Command: cut, cut's a specified area from the map. */
493 SILC_CONFIG_CALLBACK(silc_map_cmd_cut)
495 SilcMap map = context;
496 int retval = SILC_CONFIG_OK;
499 if (type == SILC_CONFIG_ARG_BLOCK) {
503 if (!filename || !lat || !lon || !width || !height)
504 return SILC_CONFIG_EMISSFIELDS;
506 SILC_LOG_DEBUG(("cut: lat: %s lon: %s w: %ld h: %ld file: %s",
507 lat, lon, width, height, filename));
509 /* Execute directly if not inside connection block */
511 if (!map->conns_num) {
512 /* Before any connection blocks */
514 /* Cut the chunk from the map. */
515 ret = silc_map_cut(map, silc_map_lon2x(map, lon),
516 silc_map_lat2y(map, lat),
517 width, height, &map2);
519 /* Writemap the chunk. */
520 ret = silc_map_write_ppm(map2, filename);
524 retval = SILC_CONFIG_ESILENT;
526 /* After all connection blocks */
528 map->cut = silc_realloc(map->cut, sizeof(*map->cut) * (i + 1));
529 map->cut[i].filename = strdup(filename);
530 map->cut[i].x = silc_map_lon2x(map, lon);
531 map->cut[i].y = silc_map_lat2y(map, lat);
532 map->cut[i].width = width;
533 map->cut[i].height = height;
534 map->cut[i].cut = TRUE;
538 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
540 return SILC_CONFIG_ESILENT;
542 silc_dlist_add(curr_conn->commands, cmd);
543 cmd->filename = strdup(filename);
544 cmd->x = silc_map_lon2x(map, lon);
545 cmd->y = silc_map_lat2y(map, lat);
547 cmd->height = height;
564 if (!strcmp(name, "lat"))
565 lat = strdup((char *)val);
566 else if (!strcmp(name, "lon"))
567 lon = strdup((char *)val);
568 else if (!strcmp(name, "width"))
569 width = (SilcUInt32)*(int *)val;
570 else if (!strcmp(name, "height"))
571 height = (SilcUInt32)*(int *)val;
572 else if (!strcmp(name, "filename"))
573 filename = strdup((char *)val);
575 retval = SILC_CONFIG_ESILENT;
580 /* Command: rectangle, draws a rectangle on the map. */
582 SILC_CONFIG_CALLBACK(silc_map_cmd_rectangle)
584 SilcMap map = context;
585 int retval = SILC_CONFIG_OK;
588 if (type == SILC_CONFIG_ARG_BLOCK) {
590 return SILC_CONFIG_EMISSFIELDS;
592 SILC_LOG_DEBUG(("rectangle: lat: %s lon: %s color: %d %d %d",
601 /* Execute directly if not for connection */
603 /* Draw the rectangle */
604 ret = silc_map_draw_rectangle(map, silc_map_lon2x(map, lon),
605 silc_map_lat2y(map, lat),
606 r, g, b, text, lposx, lposy, lr, lg, lb);
608 retval = SILC_CONFIG_ESILENT;
610 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
612 return SILC_CONFIG_ESILENT;
614 silc_dlist_add(curr_conn->commands, cmd);
621 cmd->x = silc_map_lon2x(map, lon);
622 cmd->y = silc_map_lat2y(map, lat);
623 cmd->text = text ? strdup(text) : NULL;
626 cmd->draw_rectangle = TRUE;
627 cmd->color_set = color_set;
628 cmd->lcolor_set = lcolor_set;
641 color_set = lcolor_set = FALSE;
646 if (!strcmp(name, "lat"))
647 lat = strdup((char *)val);
648 else if (!strcmp(name, "lon"))
649 lon = strdup((char *)val);
650 else if (!strcmp(name, "color")) {
651 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
652 retval = SILC_CONFIG_ESILENT;
654 } else if (!strcmp(name, "label"))
655 text = strdup((char *)val);
656 else if (!strcmp(name, "lposx"))
657 lposx = (SilcInt32)*(int *)val;
658 else if (!strcmp(name, "lposy"))
659 lposy = (SilcInt32)*(int *)val;
660 else if (!strcmp(name, "lcolor")) {
661 if (!silc_map_parse_color((const char *)val, &lr, &lg, &lb))
662 retval = SILC_CONFIG_ESILENT;
665 retval = SILC_CONFIG_ESILENT;
670 /* Command: circle, draws a circle on the map. */
672 SILC_CONFIG_CALLBACK(silc_map_cmd_circle)
674 SilcMap map = context;
675 int retval = SILC_CONFIG_OK;
678 if (type == SILC_CONFIG_ARG_BLOCK) {
680 return SILC_CONFIG_EMISSFIELDS;
682 SILC_LOG_DEBUG(("circle: lat: %s lon: %s color: %d %d %d",
691 /* Execute directly if not for connection */
693 /* Draw the circle */
694 ret = silc_map_draw_circle(map, silc_map_lon2x(map, lon),
695 silc_map_lat2y(map, lat),
696 r, g, b, text, lposx, lposy, lr, lg, lb);
698 retval = SILC_CONFIG_ESILENT;
700 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
702 return SILC_CONFIG_ESILENT;
704 silc_dlist_add(curr_conn->commands, cmd);
711 cmd->x = silc_map_lon2x(map, lon);
712 cmd->y = silc_map_lat2y(map, lat);
713 cmd->text = text ? strdup(text) : NULL;
716 cmd->draw_circle = TRUE;
717 cmd->color_set = color_set;
718 cmd->lcolor_set = lcolor_set;
731 color_set = lcolor_set = FALSE;
736 if (!strcmp(name, "lat"))
737 lat = strdup((char *)val);
738 else if (!strcmp(name, "lon"))
739 lon = strdup((char *)val);
740 else if (!strcmp(name, "color")) {
741 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
742 retval = SILC_CONFIG_ESILENT;
744 } else if (!strcmp(name, "label"))
745 text = strdup((char *)val);
746 else if (!strcmp(name, "lposx"))
747 lposx = (SilcInt32)*(int *)val;
748 else if (!strcmp(name, "lposy"))
749 lposy = (SilcInt32)*(int *)val;
750 else if (!strcmp(name, "lcolor")) {
751 if (!silc_map_parse_color((const char *)val, &lr, &lg, &lb))
752 retval = SILC_CONFIG_ESILENT;
755 retval = SILC_CONFIG_ESILENT;
760 /* Command: line, draws a line between two points in the map. */
762 SILC_CONFIG_CALLBACK(silc_map_cmd_line)
764 SilcMap map = context;
765 int retval = SILC_CONFIG_OK;
768 if (type == SILC_CONFIG_ARG_BLOCK) {
769 if (!lat || !lon || !lat2 || !lon2)
770 return SILC_CONFIG_EMISSFIELDS;
772 SILC_LOG_DEBUG(("line: alat: %s alon: %s blat: %s blon: %s "
773 "width: %ld color: %d %d %d",
774 lat, lon, lat2, lon2, width, r, g, b));
779 /* Execute directly if not for connection */
782 ret = silc_map_draw_line(map, width,
783 silc_map_lon2x(map, lon),
784 silc_map_lat2y(map, lat),
785 silc_map_lon2x(map, lon2),
786 silc_map_lat2y(map, lat2),
789 retval = SILC_CONFIG_ESILENT;
791 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
793 return SILC_CONFIG_ESILENT;
795 silc_dlist_add(curr_conn->commands, cmd);
799 cmd->x = silc_map_lon2x(map, lon);
800 cmd->y = silc_map_lat2y(map, lat);
801 cmd->x2 = silc_map_lon2x(map, lon2);
802 cmd->y2 = silc_map_lat2y(map, lat2);
804 cmd->draw_line = TRUE;
805 cmd->color_set = color_set;
823 if (!strcmp(name, "a_lat"))
824 lat = strdup((char *)val);
825 else if (!strcmp(name, "a_lon"))
826 lon = strdup((char *)val);
827 else if (!strcmp(name, "b_lat"))
828 lat2 = strdup((char *)val);
829 else if (!strcmp(name, "b_lon"))
830 lon2 = strdup((char *)val);
831 else if (!strcmp(name, "width"))
832 width = (SilcUInt32)*(int *)val;
833 else if (!strcmp(name, "color")) {
834 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
835 retval = SILC_CONFIG_ESILENT;
838 retval = SILC_CONFIG_ESILENT;
843 /* Command: text, prints a text on the map. */
845 SILC_CONFIG_CALLBACK(silc_map_cmd_text)
847 SilcMap map = context;
848 int retval = SILC_CONFIG_OK;
851 if (type == SILC_CONFIG_ARG_BLOCK) {
852 if (!lat || !lon || !text)
853 return SILC_CONFIG_EMISSFIELDS;
855 SILC_LOG_DEBUG(("text: lat: %s lon: %s color: %d %d %d text: %s",
856 lat, lon, r, g, b, text));
858 /* Execute directly if not for connection */
861 ret = silc_map_draw_text(map, text,
862 silc_map_lon2x(map, lon),
863 silc_map_lat2y(map, lat),
866 retval = SILC_CONFIG_ESILENT;
868 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
870 return SILC_CONFIG_ESILENT;
872 silc_dlist_add(curr_conn->commands, cmd);
876 cmd->x = silc_map_lon2x(map, lon);
877 cmd->y = silc_map_lat2y(map, lat);
878 cmd->text = text ? strdup(text) : NULL;
879 cmd->draw_text = TRUE;
880 cmd->color_set = color_set;
895 if (!strcmp(name, "lat"))
896 lat = strdup((char *)val);
897 else if (!strcmp(name, "lon"))
898 lon = strdup((char *)val);
899 else if (!strcmp(name, "color")) {
900 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
901 retval = SILC_CONFIG_ESILENT;
903 } else if (!strcmp(name, "text"))
904 text = strdup((char *)val);
906 retval = SILC_CONFIG_ESILENT;
911 /* Parses the commands from the file `filename'. */
913 bool silc_map_commands_parse(SilcMap map, const char *filename)
915 SilcConfigEntity ent;
916 SilcConfigFile *file;
920 SILC_LOG_DEBUG(("Parsing commands"));
922 /* Open commands file */
923 file = silc_config_open(filename);
925 fprintf(stderr, "Cannot open commands file '%s'\n", filename);
929 /* Parse the commands */
930 ent = silc_config_init(file);
931 silc_config_register_table(ent, silc_map_table_main, map);
932 ret = silc_config_main(ent);
934 SILC_LOG_DEBUG(("Parsing status: %s", silc_config_strerror(ret)));
936 if (ret && ret != SILC_CONFIG_ESILENT) {
937 fprintf(stderr, "Error parsing commands: %s, line %ld\n",
938 silc_config_strerror(ret), silc_config_get_line(file));
943 silc_config_close(file);