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 },
43 static const SilcConfigTable silc_map_table_writemap[] =
45 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_writemap, NULL },
49 static const SilcConfigTable silc_map_table_writemaphtml[] =
51 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_writemaphtml, NULL },
52 { "image", SILC_CONFIG_ARG_STR, silc_map_cmd_writemaphtml, NULL },
53 { "cut_lat", SILC_CONFIG_ARG_STRE, silc_map_cmd_writemaphtml, NULL },
54 { "cut_lon", SILC_CONFIG_ARG_STRE, silc_map_cmd_writemaphtml, NULL },
58 static const SilcConfigTable silc_map_table_writehtml[] =
60 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_writehtml, NULL },
61 { "class", SILC_CONFIG_ARG_STRE, silc_map_cmd_writehtml, NULL },
65 static const SilcConfigTable silc_map_table_cut[] =
67 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_cut, NULL },
68 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_cut, NULL },
69 { "width", SILC_CONFIG_ARG_INT, silc_map_cmd_cut, NULL },
70 { "height", SILC_CONFIG_ARG_INT, silc_map_cmd_cut, NULL },
71 { "filename", SILC_CONFIG_ARG_STR, silc_map_cmd_cut, NULL },
75 static const SilcConfigTable silc_map_table_rectangle[] =
77 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
78 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
79 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
80 { "label", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
81 { "lposx", SILC_CONFIG_ARG_INT, silc_map_cmd_rectangle, NULL },
82 { "lposy", SILC_CONFIG_ARG_INT, silc_map_cmd_rectangle, NULL },
83 { "lcolor", SILC_CONFIG_ARG_STR, silc_map_cmd_rectangle, NULL },
87 static const SilcConfigTable silc_map_table_circle[] =
89 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
90 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
91 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
92 { "label", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
93 { "lposx", SILC_CONFIG_ARG_INT, silc_map_cmd_circle, NULL },
94 { "lposy", SILC_CONFIG_ARG_INT, silc_map_cmd_circle, NULL },
95 { "lcolor", SILC_CONFIG_ARG_STR, silc_map_cmd_circle, NULL },
99 static const SilcConfigTable silc_map_table_line[] =
101 { "a_lat", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
102 { "a_lon", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
103 { "b_lat", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
104 { "b_lon", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
105 { "width", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
106 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_line, NULL },
110 static const SilcConfigTable silc_map_table_text[] =
112 { "lat", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
113 { "lon", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
114 { "color", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
115 { "text", SILC_CONFIG_ARG_STR, silc_map_cmd_text, NULL },
119 static const SilcConfigTable silc_map_table_server[] =
122 { "hostname", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
123 { "ip", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
124 { "port", SILC_CONFIG_ARG_INT, silc_map_cmd_server, NULL },
125 { "public_key", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
126 { "country", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
127 { "city", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
128 { "admin", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
129 { "description", SILC_CONFIG_ARG_STRE, silc_map_cmd_server, NULL },
130 { "html_url", SILC_CONFIG_ARG_STRE, silc_map_cmd_server, NULL },
133 { "connect", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
134 { "connect_timeout", SILC_CONFIG_ARG_INT, silc_map_cmd_server, NULL },
137 { "starttime", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
138 { "uptime", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
139 { "clients", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
140 { "channels", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
141 { "server_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
142 { "router_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
143 { "cell_clients", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
144 { "cell_channels", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
145 { "cell_servers", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
146 { "all_clients", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
147 { "all_channels", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
148 { "all_servers", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
149 { "all_routers", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
150 { "all_server_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
151 { "all_router_ops", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
152 { "motd", SILC_CONFIG_ARG_TOGGLE, silc_map_cmd_server, NULL },
155 { "up_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
156 { "down_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
157 { "up_text_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
158 { "down_text_color", SILC_CONFIG_ARG_STR, silc_map_cmd_server, NULL },
161 { "cut", SILC_CONFIG_ARG_BLOCK,
162 silc_map_cmd_cut, silc_map_table_cut },
163 { "rectangle", SILC_CONFIG_ARG_BLOCK,
164 silc_map_cmd_rectangle, silc_map_table_rectangle },
165 { "circle", SILC_CONFIG_ARG_BLOCK,
166 silc_map_cmd_circle, silc_map_table_circle },
167 { "line", SILC_CONFIG_ARG_BLOCK,
168 silc_map_cmd_line, silc_map_table_line },
169 { "text", SILC_CONFIG_ARG_BLOCK,
170 silc_map_cmd_text, silc_map_table_text },
174 static const SilcConfigTable silc_map_table_main[] =
176 { "server", SILC_CONFIG_ARG_BLOCK,
177 silc_map_cmd_server, silc_map_table_server },
178 { "loadmap", SILC_CONFIG_ARG_BLOCK,
179 silc_map_cmd_loadmap, silc_map_table_loadmap },
180 { "writemap", SILC_CONFIG_ARG_BLOCK,
181 silc_map_cmd_writemap, silc_map_table_writemap },
182 { "writemaphtml", SILC_CONFIG_ARG_BLOCK,
183 silc_map_cmd_writemaphtml, silc_map_table_writemaphtml },
184 { "writehtml", SILC_CONFIG_ARG_BLOCK,
185 silc_map_cmd_writehtml, silc_map_table_writehtml },
186 { "cut", SILC_CONFIG_ARG_BLOCK,
187 silc_map_cmd_cut, silc_map_table_cut },
188 { "rectangle", SILC_CONFIG_ARG_BLOCK,
189 silc_map_cmd_rectangle, silc_map_table_rectangle },
190 { "circle", SILC_CONFIG_ARG_BLOCK,
191 silc_map_cmd_circle, silc_map_table_circle },
192 { "line", SILC_CONFIG_ARG_BLOCK,
193 silc_map_cmd_line, silc_map_table_line },
194 { "text", SILC_CONFIG_ARG_BLOCK,
195 silc_map_cmd_text, silc_map_table_text },
199 /* Command datas. Used when command is outside server { } section. */
200 static char *filename = NULL;
201 static char *lat = NULL;
202 static char *lon = NULL;
203 static char *lat2 = NULL;
204 static char *lon2 = NULL;
205 static SilcUInt32 width = 0;
206 static SilcUInt32 height = 0;
207 static SilcInt16 r = 0;
208 static SilcInt16 g = 0;
209 static SilcInt16 b = 0;
210 static SilcInt16 lr = -1;
211 static SilcInt16 lg = -1;
212 static SilcInt16 lb = -1;
213 static char *text = NULL;
214 static SilcInt32 lposx = 0;
215 static SilcInt32 lposy = 0;
216 static bool color_set = FALSE;
217 static bool lcolor_set = FALSE;
219 /* Current server section. */
220 SilcMapConnection curr_conn = NULL;
222 /* Command: server, performs the connection to the remote server and
223 gathers statistical information. */
225 SILC_CONFIG_CALLBACK(silc_map_cmd_server)
227 SilcMap map = context;
228 int retval = SILC_CONFIG_OK;
231 fprintf(stderr, "You must call loadmap command before server command\n");
232 return SILC_CONFIG_ESILENT;
235 if (type == SILC_CONFIG_ARG_BLOCK) {
236 SILC_LOG_DEBUG(("Server config parsed"));
238 if (!curr_conn->ips) {
239 fprintf(stderr, "IP must be configured\n");
240 return SILC_CONFIG_EMISSFIELDS;
242 if (!curr_conn->hostnames) {
243 fprintf(stderr, "Hostname must be configured\n");
244 return SILC_CONFIG_EMISSFIELDS;
246 if (!curr_conn->port) {
247 fprintf(stderr, "Port must be configured\n");
248 return SILC_CONFIG_EMISSFIELDS;
251 /* The server data is now gathered. We continue by creating the
252 connection to the server and executing the requested commands. */
253 silc_map_connect(map, curr_conn);
262 /* Mark the current parsed server */
264 curr_conn = silc_calloc(1, sizeof(*curr_conn));
266 return SILC_CONFIG_ESILENT;
268 curr_conn->hostnames = silc_dlist_init();
269 curr_conn->ips = silc_dlist_init();
270 curr_conn->commands = silc_dlist_init();
271 curr_conn->map = map;
273 map->conns = silc_dlist_init();
274 silc_dlist_add(map->conns, curr_conn);
277 if (!strcmp(name, "hostname")) {
278 silc_dlist_add(curr_conn->hostnames, strdup((char *)val));
279 } else if (!strcmp(name, "ip")) {
280 silc_dlist_add(curr_conn->ips, strdup((char *)val));
281 } else if (!strcmp(name, "port")) {
282 curr_conn->port = (SilcUInt32)*(int *)val;
283 } else if (!strcmp(name, "public_key")) {
284 curr_conn->public_key = strdup((char *)val);
285 } else if (!strcmp(name, "country")) {
286 curr_conn->country = strdup((char *)val);
287 } else if (!strcmp(name, "city")) {
288 curr_conn->city = strdup((char *)val);
289 } else if (!strcmp(name, "admin")) {
290 curr_conn->admin = strdup((char *)val);
291 } else if (!strcmp(name, "description")) {
292 curr_conn->description = strdup((char *)val);
293 } else if (!strcmp(name, "html_url")) {
294 curr_conn->html_url = strdup((char *)val);
295 } else if (!strcmp(name, "connect")) {
296 curr_conn->connect = (bool)*(int *)val;
297 } else if (!strcmp(name, "connect_timeout")) {
298 curr_conn->connect_timeout = (SilcUInt32)*(int *)val;
299 } else if (!strcmp(name, "starttime")) {
300 curr_conn->starttime = (bool)*(int *)val;
301 } else if (!strcmp(name, "uptime")) {
302 curr_conn->uptime = (bool)*(int *)val;
303 } else if (!strcmp(name, "clients")) {
304 curr_conn->clients = (bool)*(int *)val;
305 } else if (!strcmp(name, "channels")) {
306 curr_conn->channels = (bool)*(int *)val;
307 } else if (!strcmp(name, "server_ops")) {
308 curr_conn->server_ops = (bool)*(int *)val;
309 } else if (!strcmp(name, "router_ops")) {
310 curr_conn->router_ops = (bool)*(int *)val;
311 } else if (!strcmp(name, "cell_clients")) {
312 curr_conn->cell_clients = (bool)*(int *)val;
313 } else if (!strcmp(name, "cell_channels")) {
314 curr_conn->cell_channels = (bool)*(int *)val;
315 } else if (!strcmp(name, "cell_servers")) {
316 curr_conn->cell_servers = (bool)*(int *)val;
317 } else if (!strcmp(name, "all_clients")) {
318 curr_conn->all_clients = (bool)*(int *)val;
319 } else if (!strcmp(name, "all_channels")) {
320 curr_conn->all_channels = (bool)*(int *)val;
321 } else if (!strcmp(name, "all_servers")) {
322 curr_conn->all_servers = (bool)*(int *)val;
323 } else if (!strcmp(name, "all_routers")) {
324 curr_conn->all_routers = (bool)*(int *)val;
325 } else if (!strcmp(name, "all_server_ops")) {
326 curr_conn->all_server_ops = (bool)*(int *)val;
327 } else if (!strcmp(name, "all_router_ops")) {
328 curr_conn->all_router_ops = (bool)*(int *)val;
329 } else if (!strcmp(name, "motd")) {
330 curr_conn->motd = (bool)*(int *)val;
331 } else if (!strcmp(name, "up_color")) {
332 curr_conn->up_color = strdup((char *)val);
333 } else if (!strcmp(name, "down_color")) {
334 curr_conn->down_color = strdup((char *)val);
335 } else if (!strcmp(name, "up_text_color")) {
336 curr_conn->up_text_color = strdup((char *)val);
337 } else if (!strcmp(name, "down_text_color")) {
338 curr_conn->down_text_color = strdup((char *)val);
340 retval = SILC_CONFIG_ESILENT;
346 /* Command: loadmap, loadmaps the bitmap map image. */
348 SILC_CONFIG_CALLBACK(silc_map_cmd_loadmap)
350 SilcMap map = context;
351 int retval = SILC_CONFIG_OK;
353 if (type == SILC_CONFIG_ARG_BLOCK) {
355 return SILC_CONFIG_EMISSFIELDS;
357 SILC_LOG_DEBUG(("loadmap: file: %s", filename));
359 /* Destroy old bitmap if loadmaped */
360 silc_free(map->bitmap);
362 /* Loadmap the bitmap image */
363 if (!silc_map_load_ppm(map, filename))
364 retval = SILC_CONFIG_ESILENT;
373 if (!strcmp(name, "filename"))
374 filename = strdup((char *)val);
376 retval = SILC_CONFIG_ESILENT;
381 /* Command: writemap, writemap the map into bitmap file. */
383 SILC_CONFIG_CALLBACK(silc_map_cmd_writemap)
385 SilcMap map = context;
386 int retval = SILC_CONFIG_OK;
388 if (type == SILC_CONFIG_ARG_BLOCK) {
390 return SILC_CONFIG_EMISSFIELDS;
392 SILC_LOG_DEBUG(("writemap: file: %s", filename));
394 /* Execute directly if there are no connections */
395 if (map->conns_num == 0) {
396 /* Writemap the map */
397 if (!silc_map_write_ppm(map, filename))
398 retval = SILC_CONFIG_ESILENT;
400 map->writemap.filename = strdup(filename);
401 map->writemap.writemap = TRUE;
411 if (!strcmp(name, "filename"))
412 filename = strdup((char *)val);
414 retval = SILC_CONFIG_ESILENT;
419 /* Command: writemaphtml, writes HTML map of the image map. */
421 SILC_CONFIG_CALLBACK(silc_map_cmd_writemaphtml)
423 SilcMap map = context;
424 int retval = SILC_CONFIG_OK;
426 if (type == SILC_CONFIG_ARG_BLOCK) {
429 return SILC_CONFIG_EMISSFIELDS;
431 SILC_LOG_DEBUG(("writemaphtml: file: %s", filename));
433 /* Will generate HTML map page */
434 i = map->writemaphtml_count;
435 map->writemaphtml = silc_realloc(map->writemaphtml,
436 sizeof(*map->writemaphtml) * (i + 1));
437 map->writemaphtml[i].filename = filename;
438 map->writemaphtml[i].text = text;
440 map->writemaphtml[i].x = silc_map_lon2x(map, lon);
442 map->writemaphtml[i].y = silc_map_lat2y(map, lat);
443 map->writemaphtml[i].writemaphtml = TRUE;
444 map->writemaphtml_count++;
456 if (!strcmp(name, "filename"))
457 filename = strdup((char *)val);
458 else if (!strcmp(name, "image"))
459 text = strdup((char *)val);
460 else if (!strcmp(name, "cut_lat"))
461 lat = strdup((char *)val);
462 else if (!strcmp(name, "cut_lon"))
463 lon = strdup((char *)val);
465 retval = SILC_CONFIG_ESILENT;
470 /* Command: writehtml, writes the gathered data into HTML pages. */
472 SILC_CONFIG_CALLBACK(silc_map_cmd_writehtml)
474 SilcMap map = context;
475 int retval = SILC_CONFIG_OK;
477 if (type == SILC_CONFIG_ARG_BLOCK) {
479 return SILC_CONFIG_EMISSFIELDS;
481 SILC_LOG_DEBUG(("writehtml: file: %s", filename));
483 /* Will generate HTML pages */
484 map->writehtml.filename = filename;
485 map->writehtml.text = text; /* class */
486 map->writehtml.writehtml = TRUE;
487 filename = text = NULL;
491 if (!strcmp(name, "filename"))
492 filename = strdup((char *)val);
493 else if (!strcmp(name, "class"))
494 text = strdup((char *)val);
496 retval = SILC_CONFIG_ESILENT;
501 /* Command: cut, cut's a specified area from the map. */
503 SILC_CONFIG_CALLBACK(silc_map_cmd_cut)
505 SilcMap map = context;
506 int retval = SILC_CONFIG_OK;
509 if (type == SILC_CONFIG_ARG_BLOCK) {
513 if (!filename || !lat || !lon || !width || !height)
514 return SILC_CONFIG_EMISSFIELDS;
516 SILC_LOG_DEBUG(("cut: lat: %s lon: %s w: %ld h: %ld file: %s",
517 lat, lon, width, height, filename));
519 /* Execute directly if not inside connection block */
521 if (!map->conns_num) {
522 /* Before any connection blocks */
524 /* Cut the chunk from the map. */
525 ret = silc_map_cut(map, silc_map_lon2x(map, lon),
526 silc_map_lat2y(map, lat),
527 width, height, &map2);
529 /* Writemap the chunk. */
530 ret = silc_map_write_ppm(map2, filename);
534 retval = SILC_CONFIG_ESILENT;
536 /* After all connection blocks */
538 map->cut = silc_realloc(map->cut, sizeof(*map->cut) * (i + 1));
539 map->cut[i].filename = strdup(filename);
540 map->cut[i].x = silc_map_lon2x(map, lon);
541 map->cut[i].y = silc_map_lat2y(map, lat);
542 map->cut[i].width = width;
543 map->cut[i].height = height;
544 map->cut[i].cut = TRUE;
548 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
550 return SILC_CONFIG_ESILENT;
552 silc_dlist_add(curr_conn->commands, cmd);
553 cmd->filename = strdup(filename);
554 cmd->x = silc_map_lon2x(map, lon);
555 cmd->y = silc_map_lat2y(map, lat);
557 cmd->height = height;
574 if (!strcmp(name, "lat"))
575 lat = strdup((char *)val);
576 else if (!strcmp(name, "lon"))
577 lon = strdup((char *)val);
578 else if (!strcmp(name, "width"))
579 width = (SilcUInt32)*(int *)val;
580 else if (!strcmp(name, "height"))
581 height = (SilcUInt32)*(int *)val;
582 else if (!strcmp(name, "filename"))
583 filename = strdup((char *)val);
585 retval = SILC_CONFIG_ESILENT;
590 /* Command: rectangle, draws a rectangle on the map. */
592 SILC_CONFIG_CALLBACK(silc_map_cmd_rectangle)
594 SilcMap map = context;
595 int retval = SILC_CONFIG_OK;
598 if (type == SILC_CONFIG_ARG_BLOCK) {
600 return SILC_CONFIG_EMISSFIELDS;
602 SILC_LOG_DEBUG(("rectangle: lat: %s lon: %s color: %d %d %d",
611 /* Execute directly if not for connection */
613 /* Draw the rectangle */
614 ret = silc_map_draw_rectangle(map, silc_map_lon2x(map, lon),
615 silc_map_lat2y(map, lat),
616 r, g, b, text, lposx, lposy, lr, lg, lb);
618 retval = SILC_CONFIG_ESILENT;
620 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
622 return SILC_CONFIG_ESILENT;
624 silc_dlist_add(curr_conn->commands, cmd);
631 cmd->x = silc_map_lon2x(map, lon);
632 cmd->y = silc_map_lat2y(map, lat);
633 cmd->text = text ? strdup(text) : NULL;
636 cmd->draw_rectangle = TRUE;
637 cmd->color_set = color_set;
638 cmd->lcolor_set = lcolor_set;
651 color_set = lcolor_set = FALSE;
656 if (!strcmp(name, "lat"))
657 lat = strdup((char *)val);
658 else if (!strcmp(name, "lon"))
659 lon = strdup((char *)val);
660 else if (!strcmp(name, "color")) {
661 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
662 retval = SILC_CONFIG_ESILENT;
664 } else if (!strcmp(name, "label"))
665 text = strdup((char *)val);
666 else if (!strcmp(name, "lposx"))
667 lposx = (SilcInt32)*(int *)val;
668 else if (!strcmp(name, "lposy"))
669 lposy = (SilcInt32)*(int *)val;
670 else if (!strcmp(name, "lcolor")) {
671 if (!silc_map_parse_color((const char *)val, &lr, &lg, &lb))
672 retval = SILC_CONFIG_ESILENT;
675 retval = SILC_CONFIG_ESILENT;
680 /* Command: circle, draws a circle on the map. */
682 SILC_CONFIG_CALLBACK(silc_map_cmd_circle)
684 SilcMap map = context;
685 int retval = SILC_CONFIG_OK;
688 if (type == SILC_CONFIG_ARG_BLOCK) {
690 return SILC_CONFIG_EMISSFIELDS;
692 SILC_LOG_DEBUG(("circle: lat: %s lon: %s color: %d %d %d",
701 /* Execute directly if not for connection */
703 /* Draw the circle */
704 ret = silc_map_draw_circle(map, silc_map_lon2x(map, lon),
705 silc_map_lat2y(map, lat),
706 r, g, b, text, lposx, lposy, lr, lg, lb);
708 retval = SILC_CONFIG_ESILENT;
710 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
712 return SILC_CONFIG_ESILENT;
714 silc_dlist_add(curr_conn->commands, cmd);
721 cmd->x = silc_map_lon2x(map, lon);
722 cmd->y = silc_map_lat2y(map, lat);
723 cmd->text = text ? strdup(text) : NULL;
726 cmd->draw_circle = TRUE;
727 cmd->color_set = color_set;
728 cmd->lcolor_set = lcolor_set;
741 color_set = lcolor_set = FALSE;
746 if (!strcmp(name, "lat"))
747 lat = strdup((char *)val);
748 else if (!strcmp(name, "lon"))
749 lon = strdup((char *)val);
750 else if (!strcmp(name, "color")) {
751 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
752 retval = SILC_CONFIG_ESILENT;
754 } else if (!strcmp(name, "label"))
755 text = strdup((char *)val);
756 else if (!strcmp(name, "lposx"))
757 lposx = (SilcInt32)*(int *)val;
758 else if (!strcmp(name, "lposy"))
759 lposy = (SilcInt32)*(int *)val;
760 else if (!strcmp(name, "lcolor")) {
761 if (!silc_map_parse_color((const char *)val, &lr, &lg, &lb))
762 retval = SILC_CONFIG_ESILENT;
765 retval = SILC_CONFIG_ESILENT;
770 /* Command: line, draws a line between two points in the map. */
772 SILC_CONFIG_CALLBACK(silc_map_cmd_line)
774 SilcMap map = context;
775 int retval = SILC_CONFIG_OK;
778 if (type == SILC_CONFIG_ARG_BLOCK) {
779 if (!lat || !lon || !lat2 || !lon2)
780 return SILC_CONFIG_EMISSFIELDS;
782 SILC_LOG_DEBUG(("line: alat: %s alon: %s blat: %s blon: %s "
783 "width: %ld color: %d %d %d",
784 lat, lon, lat2, lon2, width, r, g, b));
789 /* Execute directly if not for connection */
792 ret = silc_map_draw_line(map, width,
793 silc_map_lon2x(map, lon),
794 silc_map_lat2y(map, lat),
795 silc_map_lon2x(map, lon2),
796 silc_map_lat2y(map, lat2),
799 retval = SILC_CONFIG_ESILENT;
801 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
803 return SILC_CONFIG_ESILENT;
805 silc_dlist_add(curr_conn->commands, cmd);
809 cmd->x = silc_map_lon2x(map, lon);
810 cmd->y = silc_map_lat2y(map, lat);
811 cmd->x2 = silc_map_lon2x(map, lon2);
812 cmd->y2 = silc_map_lat2y(map, lat2);
814 cmd->draw_line = TRUE;
815 cmd->color_set = color_set;
833 if (!strcmp(name, "a_lat"))
834 lat = strdup((char *)val);
835 else if (!strcmp(name, "a_lon"))
836 lon = strdup((char *)val);
837 else if (!strcmp(name, "b_lat"))
838 lat2 = strdup((char *)val);
839 else if (!strcmp(name, "b_lon"))
840 lon2 = strdup((char *)val);
841 else if (!strcmp(name, "width"))
842 width = (SilcUInt32)*(int *)val;
843 else if (!strcmp(name, "color")) {
844 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
845 retval = SILC_CONFIG_ESILENT;
848 retval = SILC_CONFIG_ESILENT;
853 /* Command: text, prints a text on the map. */
855 SILC_CONFIG_CALLBACK(silc_map_cmd_text)
857 SilcMap map = context;
858 int retval = SILC_CONFIG_OK;
861 if (type == SILC_CONFIG_ARG_BLOCK) {
862 if (!lat || !lon || !text)
863 return SILC_CONFIG_EMISSFIELDS;
865 SILC_LOG_DEBUG(("text: lat: %s lon: %s color: %d %d %d text: %s",
866 lat, lon, r, g, b, text));
868 /* Execute directly if not for connection */
871 ret = silc_map_draw_text(map, text,
872 silc_map_lon2x(map, lon),
873 silc_map_lat2y(map, lat),
876 retval = SILC_CONFIG_ESILENT;
878 SilcMapCommand cmd = silc_calloc(1, sizeof(*cmd));
880 return SILC_CONFIG_ESILENT;
882 silc_dlist_add(curr_conn->commands, cmd);
886 cmd->x = silc_map_lon2x(map, lon);
887 cmd->y = silc_map_lat2y(map, lat);
888 cmd->text = text ? strdup(text) : NULL;
889 cmd->draw_text = TRUE;
890 cmd->color_set = color_set;
905 if (!strcmp(name, "lat"))
906 lat = strdup((char *)val);
907 else if (!strcmp(name, "lon"))
908 lon = strdup((char *)val);
909 else if (!strcmp(name, "color")) {
910 if (!silc_map_parse_color((const char *)val, &r, &g, &b))
911 retval = SILC_CONFIG_ESILENT;
913 } else if (!strcmp(name, "text"))
914 text = strdup((char *)val);
916 retval = SILC_CONFIG_ESILENT;
921 /* Parses the commands from the file `filename'. */
923 bool silc_map_commands_parse(SilcMap map, const char *filename)
925 SilcConfigEntity ent;
926 SilcConfigFile *file;
930 SILC_LOG_DEBUG(("Parsing commands"));
932 /* Open commands file */
933 file = silc_config_open(filename);
935 fprintf(stderr, "Cannot open commands file '%s'\n", filename);
939 /* Parse the commands */
940 ent = silc_config_init(file);
941 silc_config_register_table(ent, silc_map_table_main, map);
942 ret = silc_config_main(ent);
944 SILC_LOG_DEBUG(("Parsing status: %s", silc_config_strerror(ret)));
946 if (ret && ret != SILC_CONFIG_ESILENT) {
947 fprintf(stderr, "Error parsing commands: %s, line %ld\n",
948 silc_config_strerror(ret), silc_config_get_line(file));
953 silc_config_close(file);