From bf2487ed5290366bf14cd399f4c25a4564f511d0 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sat, 17 May 2014 10:51:51 +1000 Subject: Add a smarter server connect function. --- src/libraries/SledjHamr.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++ src/libraries/SledjHamr.h | 2 ++ 2 files changed, 76 insertions(+) (limited to 'src') diff --git a/src/libraries/SledjHamr.c b/src/libraries/SledjHamr.c index 2d6ed3a..17b7610 100644 --- a/src/libraries/SledjHamr.c +++ b/src/libraries/SledjHamr.c @@ -1,5 +1,79 @@ +#include #include "SledjHamr.h" + +struct _conct +{ + char *address; + int port; + void *pointer; + Ecore_Event_Handler_Cb addCb, dataCb, delCb; + Ecore_Event_Handler *add, *data, *del; +}; + + +static Eina_Bool _add(void *data, int type, Ecore_Con_Event_Server_Del *ev) +{ + struct _conct *this = data; + + ecore_event_handler_del(this->add); + ecore_event_handler_del(this->del); + + if (this->addCb) + { + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, this->addCb, this->pointer); + this->addCb(this->pointer, type, ev); + } + if (this->dataCb) + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, this->dataCb, this->pointer); + if (this->delCb) + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, this->delCb, this->pointer); + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool _del(void *data, int type, Ecore_Con_Event_Server_Del *ev) +{ + struct _conct *this = data; + + printf("FAILED to connect to server %s:%d, trying again!\n", this->address, this->port); + ecore_event_handler_del(this->add); + ecore_event_handler_del(this->del); + if (ev->server) ecore_con_server_del(ev->server); + sleep(1); + reachOut(this->address, this->port, this->pointer, this->addCb, this->dataCb, this->delCb); + return ECORE_CALLBACK_CANCEL; +} + +Ecore_Con_Server *reachOut(char *address, int port, void *data, Ecore_Event_Handler_Cb _addCb, Ecore_Event_Handler_Cb _dataCb, Ecore_Event_Handler_Cb _delCb) +{ + Ecore_Con_Server *server = NULL; + struct _conct *this = malloc(sizeof(struct _conct)); + int count = 0; + + this->address = address; + this->port = port; + this->pointer = data; + this->addCb = _addCb; + this->dataCb = _dataCb; + this->delCb = _delCb; + // This loop is overkill I think. + while ((!server) && (10 > count)) + { + if ((server = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, address, port, this->pointer))) + { + this->add = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb) _add, this); + this->del = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, (Ecore_Event_Handler_Cb) _del, this); + } + count++; + } + + if (!server) + printf("Failed to connect to server %s:%d!\n", this->address, this->port); + + return server; +} + void sendBack(Ecore_Con_Client *client, const char *SID, const char *message, ...) { va_list args; diff --git a/src/libraries/SledjHamr.h b/src/libraries/SledjHamr.h index 548c5e0..6c63bcc 100644 --- a/src/libraries/SledjHamr.h +++ b/src/libraries/SledjHamr.h @@ -10,11 +10,13 @@ #include +#include #include #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(*array)) +Ecore_Con_Server *reachOut(char *address, int port, void *data, Ecore_Event_Handler_Cb _add, Ecore_Event_Handler_Cb _data, Ecore_Event_Handler_Cb _del); void sendBack(Ecore_Con_Client *client, const char *SID, const char *message, ...); void sendForth(Ecore_Con_Server *server, const char *SID, const char *message, ...); -- cgit v1.1