From e1a25ccd0e6b84b4031de5e15f2a96dec185c402 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Mon, 10 Dec 2012 00:05:29 +0100 Subject: first version that acualy displays something ! * add nodes and connections on the graph uppon gg_packet receive * improve UI --- gg_map/gg_map.c | 153 +++++++++++++++++++++++++++++++++++++++----------------- 1 file 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 #include +#include #include #include -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; -- cgit v1.2.3-59-g8ed1b