aboutsummaryrefslogtreecommitdiffstats
path: root/gg_efl
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2012-11-29 22:03:15 +0100
committerLaurent Ghigonis <laurent@p1sec.com>2012-11-29 22:03:15 +0100
commit496bbfaebe6e6207e0a62b70069263e6b06f9d69 (patch)
treed7b222b8633ce994b89c8a6e12a2a52a90d14d8c /gg_efl
parentbetter naming (diff)
downloadglouglou-496bbfaebe6e6207e0a62b70069263e6b06f9d69.tar.xz
glouglou-496bbfaebe6e6207e0a62b70069263e6b06f9d69.zip
better naming
Diffstat (limited to 'gg_efl')
-rw-r--r--gg_efl/BUGS.txt8
-rw-r--r--gg_efl/Makefile20
-rw-r--r--gg_efl/README.txt9
-rw-r--r--gg_efl/glouglou_efl.c290
4 files changed, 327 insertions, 0 deletions
diff --git a/gg_efl/BUGS.txt b/gg_efl/BUGS.txt
new file mode 100644
index 0000000..bf3fc1e
--- /dev/null
+++ b/gg_efl/BUGS.txt
@@ -0,0 +1,8 @@
+#0000 TITLE
+DESCRIPTION
+
+=== TODO ===
+
+
+=== DONE ===
+
diff --git a/gg_efl/Makefile b/gg_efl/Makefile
new file mode 100644
index 0000000..8f8617c
--- /dev/null
+++ b/gg_efl/Makefile
@@ -0,0 +1,20 @@
+CFLAGS += $(shell pkg-config --cflags elementary evas ecore)
+LIBS += $(shell pkg-config --libs elementary evas ecore)
+CFLAGS += -Wall -O2
+
+BINARY=glouglou_efl
+
+PREFIX=/usr/local
+BINDIR=$(PREFIX)/bin
+
+$(BINARY): $(BINARY).o
+ $(CC) -o $@ $< $(LIBS)
+
+install: $(BINARY)
+ @echo "installation of $(BINARY)"
+ mkdir -p $(BINDIR)
+ install -m 0755 $(BINARY) $(BINDIR)
+
+clean:
+ rm -f $(BINARY) $(BINARY).o
+
diff --git a/gg_efl/README.txt b/gg_efl/README.txt
new file mode 100644
index 0000000..223fa98
--- /dev/null
+++ b/gg_efl/README.txt
@@ -0,0 +1,9 @@
+glouglou_efl - glougloud client in C using EFL
+
+
+=== Requirements ===
+
+* libglouglou
+
+* Enlightenment Foundation Libraries
+http://www.enlightenment.org
diff --git a/gg_efl/glouglou_efl.c b/gg_efl/glouglou_efl.c
new file mode 100644
index 0000000..646cfac
--- /dev/null
+++ b/gg_efl/glouglou_efl.c
@@ -0,0 +1,290 @@
+#include <err.h>
+
+#include <Elementary.h>
+
+#include <libglouglou.h>
+
+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()