|
|
|
#include "ephoto.h"
|
|
|
|
#undef ERR
|
|
|
|
#define ERR(...) do { printf(__VA_ARGS__); putc('\n', stdout); } while (0)
|
|
|
|
|
|
|
|
#ifdef USE_IPC
|
|
|
|
/* local subsystem functions */
|
|
|
|
static Eina_Bool _e_ipc_cb_client_del(void *data EINA_UNUSED,
|
|
|
|
int type EINA_UNUSED, void *event);
|
|
|
|
static Eina_Bool _e_ipc_cb_client_data(void *data EINA_UNUSED,
|
|
|
|
int type EINA_UNUSED, void *event);
|
|
|
|
|
|
|
|
/* local subsystem globals */
|
|
|
|
static Ecore_Ipc_Server *_e_ipc_server = NULL;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* externally accessible functions */
|
|
|
|
int
|
|
|
|
e_ipc_init(void)
|
|
|
|
{
|
|
|
|
#ifdef USE_IPC
|
|
|
|
int port = getpid();
|
|
|
|
/* NOTE: windows has no getppid(), so use an envvar */
|
|
|
|
char port_str[sizeof("2147483648")] = "";
|
|
|
|
snprintf(port_str, sizeof(port_str), "%d", port);
|
|
|
|
setenv("EPHOTO_IPC_PORT", port_str, 1);
|
|
|
|
_e_ipc_server = ecore_ipc_server_add
|
|
|
|
(ECORE_IPC_LOCAL_SYSTEM, "ephoto", port, NULL);
|
|
|
|
if (!_e_ipc_server)
|
|
|
|
{
|
|
|
|
ERR("Couldn't create Ephoto IPC server port=%d", port);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
|
|
|
|
_e_ipc_cb_client_del, NULL);
|
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
|
|
|
|
_e_ipc_cb_client_data, NULL);
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
e_ipc_shutdown(void)
|
|
|
|
{
|
|
|
|
#ifdef USE_IPC
|
|
|
|
if (_e_ipc_server)
|
|
|
|
{
|
|
|
|
ecore_ipc_server_del(_e_ipc_server);
|
|
|
|
_e_ipc_server = NULL;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef USE_IPC
|
|
|
|
/* local subsystem globals */
|
|
|
|
static Eina_Bool
|
|
|
|
_e_ipc_cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Ipc_Event_Client_Del *e;
|
|
|
|
|
|
|
|
e = event;
|
|
|
|
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
/* delete client sruct */
|
|
|
|
e_thumb_client_del(e);
|
|
|
|
ecore_ipc_client_del(e->client);
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_e_ipc_cb_client_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Ipc_Event_Client_Data *e;
|
|
|
|
|
|
|
|
e = event;
|
|
|
|
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
switch (e->major)
|
|
|
|
{
|
|
|
|
case EPHOTO_IPC_DOMAIN_THUMB:
|
|
|
|
e_thumb_client_data(e);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|