aboutsummaryrefslogtreecommitdiffstats
path: root/gg_map/gg_map.c
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2012-12-10 00:05:29 +0100
committerLaurent Ghigonis <laurent@p1sec.com>2012-12-10 00:05:29 +0100
commite1a25ccd0e6b84b4031de5e15f2a96dec185c402 (patch)
tree876b21897598857453e598ffca72fef7f13e1c7b /gg_map/gg_map.c
parentCFLAGS: include debug symbols and remove optimisation (diff)
downloadglouglou-e1a25ccd0e6b84b4031de5e15f2a96dec185c402.tar.xz
glouglou-e1a25ccd0e6b84b4031de5e15f2a96dec185c402.zip
first version that acualy displays something !
* add nodes and connections on the graph uppon gg_packet receive * improve UI
Diffstat (limited to 'gg_map/gg_map.c')
-rw-r--r--gg_map/gg_map.c153
1 files changed, 108 insertions, 45 deletions
diff --git a/gg_map/gg_map.c b/gg_map/gg_map.c
index 04e2aca..d646132 100644
--- a/gg_map/gg_map.c
+++ b/gg_map/gg_map.c
@@ -1,15 +1,17 @@
#include <err.h>
#include <Elementary.h>
+#include <Egraph.h>
#include <libglouglou.h>
#include <libggnet.h>
-Evas_Object *_mainwin, *_connbox;
-Eina_List *_conns = NULL;
-Eina_List *_nodes = NULL;
+Evas_Object *_mainwin;
+Evas_Object *_egraph;
+struct ggnet *_ggnet;
struct event_base *_ev_base;
+/* link between ecore loop and libevent loop */
static Eina_Bool
_cb_ecore_libevent(void *data) {
if (event_base_got_exit(_ev_base))
@@ -19,14 +21,64 @@ _cb_ecore_libevent(void *data) {
return EINA_TRUE;
}
+static Egraph_Vertice *
+_node_to_vertice(struct ggnet_node *n)
+{
+ Egraph_Vertice *v;
+ char name[EGRAPH_VERTICE_NAME_MAXLEN];
+
+ v = ggnet_node_usrdata_get(n);
+ if (!v) {
+ snprintf(name, sizeof(name), "%x", n->addr.s_addr);
+ v = egraph_vertice_add(_egraph, name, n);
+ ggnet_node_usrdata_set(n, v);
+ }
+ return v;
+}
+
+static void
+_conn_add(u_int id, u_int src, u_int dst, u_int proto, u_int size)
+{
+ struct ggnet_conn *conn;
+ Egraph_Vertice *a, *b;
+ Egraph_Edge *e;
+ struct in_addr srcaddr, dstaddr;
+
+ srcaddr.s_addr = src;
+ dstaddr.s_addr = dst;
+
+ conn = ggnet_conn_add(_ggnet, &srcaddr, -1, &dstaddr, -1, proto, size, id);
+ a = _node_to_vertice(ggnet_conn_src_get(conn));
+ b = _node_to_vertice(ggnet_conn_dst_get(conn));
+ e = egraph_edge_find(_egraph, a, b);
+ if (!e)
+ e = egraph_edge_add(_egraph, a, b, conn);
+ ggnet_conn_usrdata_set(conn, e);
+}
+
+static void
+_conn_del(int id) {
+ struct ggnet_conn *conn, *otherconn;
+ struct ggnet_node *a, *b;
+ Egraph_Edge *e;
+
+ conn = ggnet_conn_find_by_id(_ggnet, id);
+ if (conn) {
+ a = ggnet_conn_src_get(conn);
+ b = ggnet_conn_dst_get(conn);
+ e = ggnet_conn_usrdata_get(conn);
+ ggnet_conn_del(_ggnet, conn);
+ /* is there other connections between these peers ? */
+ otherconn = ggnet_conn_find_by_node(_ggnet, a, b);
+ if (!otherconn) {
+ egraph_edge_del(_egraph, e);
+ }
+ }
+}
+
int
_cb_packet(struct gg_client *cli, struct gg_packet *pkt)
{
- struct ggnet_node *n, *nsrc, *ndst;
- struct ggnet_conn *c;
- char *fqdn;
- int i;
-
switch(pkt->type) {
case PACKET_NEWCONN:
printf(" type PACKET_NEWCONN\n");
@@ -36,29 +88,27 @@ _cb_packet(struct gg_client *cli, struct gg_packet *pkt)
printf(" newconn_proto %d\n", pkt->newconn_proto);
printf(" newconn_size %d\n", pkt->newconn_size);
- //nsrc = node_find_or_create(pkt->newconn_src);
- //ndst = node_find_or_create(pkt->newconn_dst);
- //conn_find_or_create(pkt->newconn_id, pkt->newconn_nsrc, pkt->newconn_ndst, pkt->newconn_proto, pkt->newconn_size);
-
+ _conn_del(pkt->newconn_id); /* in case we missed a previous del */
+ _conn_add(pkt->newconn_id, pkt->newconn_src, pkt->newconn_dst,
+ pkt->newconn_proto, pkt->newconn_size);
break;
+
case PACKET_DELCONN:
printf(" type PACKET_DELCONN\n");
printf(" delconn_id %d\n", pkt->delconn_id);
-
- //n = node_find(id);
- //if (n)
- // node_del(n);
-
+
+ _conn_del(pkt->delconn_id);
break;
+
case PACKET_DATA:
printf(" type PACKET_DATA\n");
printf(" data_connid %d\n", pkt->data_connid);
printf(" data_size %d\n", pkt->data_size);
- //c = conn_find(id);
+ //conn = ggnet_conn_find_by_id(_ggnet, pkt->data_connid);
// XXX evas_point on conn line
-
break;
+
case PACKET_NAME:
printf(" type PACKET_NAME\n");
printf(" name_addr %4x\n", pkt->name_addr);
@@ -68,7 +118,7 @@ _cb_packet(struct gg_client *cli, struct gg_packet *pkt)
//n = node_find(ip);
//if (n)
// node_update_name(n, fqdn, len);
-
+ //
break;
}
@@ -84,47 +134,60 @@ _cb_on_done(void *data, Evas_Object *obj, void *event_info)
EAPI_MAIN int
elm_main(int argc, char **argv)
{
- Evas_Object *box, *lab, *btn, *bg;
- Ecore_Timer *timer_libevent;
+ Evas_Object *win, *bg, *panes, *bt, *egraph;
+ Evas *evas;
struct gg_client *ggcli;
int retval = -1;
- _mainwin = elm_win_util_standard_add("hello", "Hello");
- evas_object_smart_callback_add(_mainwin, "delete,request", _cb_on_done, NULL);
+ win = elm_win_add(NULL, "panes", ELM_WIN_BASIC);
+ evas = evas_object_evas_get(win);
+ elm_win_title_set(win, "Glouglou Network Mapper");
+ evas_object_smart_callback_add(win, "delete,request", _cb_on_done, NULL);
- bg = elm_bg_add(_mainwin);
+ bg = elm_bg_add(win);
+ elm_win_resize_object_add(win, bg);
evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_win_resize_object_add(_mainwin, bg);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
evas_object_show(bg);
- box = elm_box_add(_mainwin);
- elm_box_horizontal_set(box, EINA_TRUE);
- elm_win_resize_object_add(_mainwin, box);
- evas_object_show(box);
-
- lab = elm_label_add(_mainwin);
- elm_object_text_set(lab, "Welcome to Glouglou Map");
- elm_box_pack_end(box, lab);
- evas_object_show(lab);
-
- btn = elm_button_add(_mainwin);
- elm_object_text_set(btn, "Quit");
- elm_box_pack_end(box, btn);
- evas_object_show(btn);
- evas_object_smart_callback_add(btn, "clicked", _cb_on_done, NULL);
+ panes = elm_panes_add(win);
+ elm_win_resize_object_add(win, panes);
+ evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(panes, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(panes);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Quit");
+ //evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ //evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _cb_on_done, bt);
+ evas_object_show(bt);
+ elm_object_part_content_set(panes, "left", bt);
+
+ egraph = egraph_new(evas, 1);
+ if (!egraph)
+ goto quit;
+ evas_object_size_hint_weight_set(egraph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(egraph, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(egraph);
+ elm_object_part_content_set(panes, "right", egraph);
- _connbox = elm_box_add(_mainwin);
- evas_object_show(_connbox);
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+ evas_object_show(win);
- evas_object_show(_mainwin);
+ _egraph = egraph;
+ _mainwin = win;
+ _ggnet = ggnet_new(GGNET_MANAGE_CONNID_FALSE);
_ev_base = event_base_new();
+
ggcli = gg_client_connect(_ev_base, "127.0.0.1", GLOUGLOU_ANALY_DEFAULT_PORT,
NULL, _cb_packet, NULL);
if (!ggcli)
goto quit;
- timer_libevent = ecore_timer_add(0.1, _cb_ecore_libevent, NULL);
+ ecore_timer_add(0.1, _cb_ecore_libevent, NULL);
elm_run();
retval = 0;