evisum/src/bin/evisum_server.c

170 lines
4.1 KiB
C
Raw Normal View History

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Eina.h>
#include <Ecore.h>
#include <Ecore_Con.h>
#include "evisum_server.h"
#include "src/bin/ui/ui.h"
#define LISTEN_SOCKET_NAME "evisum_server"
#define WANTED "bonjour monde"
typedef struct _Evisum_Server {
Ecore_Event_Handler *handler;
Ecore_Con_Server *srv;
} Evisum_Server;
static void *_evisum_server = NULL;
static Eina_Bool
_evisum_server_server_client_connect_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
{
Ecore_Con_Event_Client_Data *ev;
Evisum_Action *action;
Ui *ui;
int *pid;
ev = event;
action = ev->data;
ui = data;
pid = ev->data + sizeof(int);
ecore_con_client_send(ev->client, WANTED, strlen(WANTED));
ecore_con_client_flush(ev->client);
evisum_ui_activate(ui, *action, *pid);
return ECORE_CALLBACK_RENEW;
}
void
evisum_server_shutdown(void)
{
Evisum_Server *server = _evisum_server;
if (!server) return;
ecore_event_handler_del(server->handler);
ecore_con_server_del(server->srv);
free(server);
}
Eina_Bool
evisum_server_init(void *data)
{
Ui *ui = data;
Evisum_Server *server = calloc(1, sizeof(Evisum_Server));
2021-01-24 05:48:40 -08:00
if (!server) return 0;
server->srv = ecore_con_server_add(ECORE_CON_LOCAL_USER, LISTEN_SOCKET_NAME, 0, NULL);
2021-01-24 05:48:40 -08:00
if (!server->srv) return 0;
server->handler = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, _evisum_server_server_client_connect_cb, ui);
_evisum_server = server;
2021-01-24 05:48:40 -08:00
return 1;
}
typedef struct _Evisum_Server_Client {
2020-12-24 02:16:19 -08:00
Ecore_Con_Server *srv;
Evisum_Action action;
int pid;
Eina_Bool success;
} Evisum_Server_Client;
static Eina_Bool
_evisum_server_client_done_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
{
Ecore_Con_Event_Server_Del *ev;
Evisum_Server_Client *client = data;
ev = event;
if (client->srv != ev->server) return ECORE_CALLBACK_RENEW;
ecore_main_loop_quit();
return ECORE_CALLBACK_DONE;
}
static Eina_Bool
_evisum_server_client_data_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
{
Ecore_Con_Server *srv;
Ecore_Con_Event_Server_Data *ev;
Evisum_Server_Client *client = data;
ev = event;
srv = ev->server;
if (client->srv != srv) return ECORE_CALLBACK_RENEW;
client->success = 1;
ecore_main_loop_quit();
return ECORE_CALLBACK_DONE;
}
static Eina_Bool
_evisum_server_client_connect_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
{
Ecore_Con_Event_Server_Add *ev;
Ecore_Con_Server *srv;
Evisum_Server_Client *client;
ev = event;
srv = ev->server;
client = data;
if (client->srv != srv) return ECORE_CALLBACK_RENEW;
ecore_con_server_send(srv, &client->action, sizeof(Evisum_Action));
ecore_con_server_send(srv, &client->pid, sizeof(int));
ecore_con_server_flush(srv);
return ECORE_CALLBACK_DONE;
}
Eina_Bool
evisum_server_client_add(Evisum_Action action, int pid)
{
Evisum_Server_Client *client;
2020-12-24 02:16:19 -08:00
Ecore_Event_Handler *handler[4];
Eina_Bool ok;
Ecore_Con_Server *srv = ecore_con_server_connect(ECORE_CON_LOCAL_USER, LISTEN_SOCKET_NAME, 0, NULL);
if (!srv)
2021-01-24 05:48:40 -08:00
return 0;
client = calloc(1, sizeof(Evisum_Server_Client));
2021-01-24 05:48:40 -08:00
if (!client) return 0;
client->action = action;
client->pid = pid;
client->srv = srv;
2020-12-24 02:16:19 -08:00
handler[0] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
2020-12-29 17:54:33 -08:00
_evisum_server_client_connect_cb, client);
2020-12-24 02:16:19 -08:00
handler[1] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
_evisum_server_client_done_cb, client);
handler[2] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ERROR,
_evisum_server_client_done_cb, client);
handler[3] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
_evisum_server_client_data_cb, client);
ecore_main_loop_begin();
2020-12-24 02:16:19 -08:00
ecore_event_handler_del(handler[0]);
ecore_event_handler_del(handler[1]);
ecore_event_handler_del(handler[2]);
ecore_event_handler_del(handler[3]);
ok = client->success;
free(client);
return ok;
}