From 9f0d5664dd8f80c2546e08dcd53cdc4a82320c4e Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sun, 2 Dec 2012 14:01:21 +0100 Subject: rename gg_net to gg_map --- gg_map/gg_net.c | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 gg_map/gg_net.c (limited to 'gg_map/gg_net.c') diff --git a/gg_map/gg_net.c b/gg_map/gg_net.c new file mode 100644 index 0000000..646cfac --- /dev/null +++ b/gg_map/gg_net.c @@ -0,0 +1,290 @@ +#include + +#include + +#include + +struct conn { + int id; + struct node *nsrc; + struct node *ndst; + int proto; + int size; + char name[DNSNAME_MAX]; + Evas_Object *line; +}; + +struct node { + char name[DNSNAME_MAX]; + u_int ip; + char fqdn[DNSNAME_MAX]; + Evas_Object *btn; +}; + +Evas_Object *_mainwin, *_connbox; +Eina_List *_conns = NULL; +Eina_List *_nodes = NULL; + +static struct conn *conn_add(u_int, struct node *, struct node *, u_int, u_int); +static void conn_del(struct conn *); +static struct conn *conn_find(u_int); +static struct conn *conn_find_or_create(u_int, struct node *, struct node *, u_int, u_int); +static struct node *node_add(u_int); +static void node_del(struct node *); +static struct node *node_find(u_int); +static struct node *node_find_or_create(u_int); +static void node_update_name(struct node *, char *, int); + +static struct conn * +conn_add(u_int id, struct node *nsrc, struct node *ndst, u_int proto, u_int size) +{ + struct conn *c; + + c = calloc(sizeof(struct conn), 1); + if (!c) + err(1, "calloc failed in conn_add\n"); + c->id = id; + c->nsrc = nsrc; + c->ndst = ndst; + c->proto = proto; + c->size = size; + snprintf(c->name, sizeof(c->name), "%d: %x -> %x - %d", + id, nsrc->ip, ndst->ip, proto); + + _conns = eina_list_append(_conns, c); + + // XXX c->line evas + + return c; +} + +static void +conn_del(struct conn *c) +{ + if (c->line) + evas_object_del(c->line); + _conns = eina_list_prepend(_conns, c); + free(c); +} + +static struct conn * +conn_find(u_int id) +{ + struct conn *c; + Eina_List *l; + + EINA_LIST_FOREACH(_conns, l, c) + if (c->id == id) + return c; + return NULL; +} + +static struct conn * +conn_find_or_create(u_int id, struct node *nsrc, struct node *ndst, u_int proto, u_int size) +{ + struct conn *c; + + c = conn_find(id); + if (!c) + c = conn_add(id, nsrc, ndst, proto, size); + return c; +} + +static struct node * +node_add(u_int ip) +{ + struct node *n; + + n = calloc(sizeof(struct node), 1); + if (!n) + err(1, "calloc failed in node_add\n"); + n->ip = ip; + + _nodes = eina_list_append(_nodes, n); + + n->btn = elm_button_add(_mainwin); + node_update_name(n, NULL, 0); + elm_box_pack_end(_connbox, n->btn); + evas_object_show(n->btn); + + return n; +} + +static void +node_del(struct node *n) +{ + if (n->btn) + evas_object_del(n->btn); + _nodes = eina_list_prepend(_nodes, n); + free(n); +} + +static struct node * +node_find(u_int ip) +{ + struct node *n; + Eina_List *l; + + EINA_LIST_FOREACH(_nodes, l, n) + if (n->ip == ip) + return n; + return NULL; +} + +static struct node * +node_find_or_create(u_int ip) +{ + struct node *n; + + n = node_find(ip); + if (!n) + n = node_add(ip); + return n; +} + +static void +node_update_name(struct node *n, char *name, int len) +{ + if (!name) { + snprintf(n->name, sizeof(n->name), "%x", n->ip); + } else { + if (len > sizeof(n->name)) + len = sizeof(n->name); + strncpy(n->name, name, len); + } + elm_object_text_set(n->btn, n->name); +} + +static Eina_Bool +_cb_conn_data(void *data, int type, Ecore_Con_Event_Server_Data *ev) +{ + u_int id, ip, src, dst, proto, size, len; + struct node *n, *nsrc, *ndst; + struct conn *c; + struct packet *p; + char *fqdn; + int i; + + printf("data received:\n"); + for (i=0; i < ev->size; i++){ + printf("%2.2x ", ((u_char *)ev->data)[i]); + if( (i%15 == 0 && i!=0) || i==ev->size-1 ) + printf("\n"); + } + + p = ev->data; + switch(p->type) { + case PACKET_NEWCONN: + id = p->newconn_id; + src = ntohl(p->newconn_src); + dst = ntohl(p->newconn_dst); + proto = p->newconn_proto; + size = ntohs(p->newconn_size); + + printf(" type PACKET_NEWCONN\n"); + printf(" newconn_id %d\n", id); + printf(" newconn_src %4x\n", src); + printf(" newconn_dst %4x\n", dst); + printf(" newconn_proto %d\n", proto); + printf(" newconn_size %d\n", size); + + nsrc = node_find_or_create(src); + ndst = node_find_or_create(dst); + conn_find_or_create(id, nsrc, ndst, proto, size); + + break; + case PACKET_DELCONN: + id = p->delconn_id; + + printf(" type PACKET_DELCONN\n"); + printf(" delconn_id %d\n", id); + + n = node_find(id); + if (n) + node_del(n); + + break; + case PACKET_DATA: + id = p->data_connid; + size = ntohs(p->data_size); + + printf(" type PACKET_DATA\n"); + printf(" data_connid %d\n", id); + printf(" data_size %d\n", size); + + c = conn_find(id); + // XXX evas_point on conn line + + break; + case PACKET_NAME: + ip = ntohl(p->name_addr); + len = p->name_len; + fqdn = (char *)p->name_fqdn; + + printf(" type PACKET_NAME\n"); + printf(" name_addr %4x\n", ip); + printf(" name_len %d\n", len); + printf(" name_name_fqdn %s\n", fqdn); + + n = node_find(ip); + if (n) + node_update_name(n, fqdn, len); + + break; + } + + return ECORE_CALLBACK_RENEW; +} + +static void +_cb_on_done(void *data, Evas_Object *obj, void *event_info) +{ + elm_exit(); +} + +EAPI_MAIN int +elm_main(int argc, char **argv) +{ + Evas_Object *box, *lab, *btn, *bg; + Ecore_Con_Server *conn; + + _mainwin = elm_win_util_standard_add("hello", "Hello"); + evas_object_smart_callback_add(_mainwin, "delete,request", _cb_on_done, NULL); + + bg = elm_bg_add(_mainwin); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(_mainwin, bg); + 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_efl"); + 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); + + _connbox = elm_box_add(_mainwin); + evas_object_show(_connbox); + + evas_object_show(_mainwin); + + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, + (Ecore_Event_Handler_Cb)_cb_conn_data, NULL); + conn = ecore_con_server_connect(ECORE_CON_REMOTE_UDP, "127.0.0.1", 4430, NULL); + ecore_con_server_send(conn, "hello", 5); + ecore_con_server_flush(conn); + + elm_run(); + elm_shutdown(); + return 0; +} +ELM_MAIN() -- cgit v1.2.3-59-g8ed1b