enlightenment/src/bin/e_msgbus.c

130 lines
3.9 KiB
C

#include "e.h"
#define PATH "/org/enlightenment/wm/RemoteObject"
/* local subsystem functions */
static void _e_msgbus_request_name_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending);
static Eldbus_Message *_e_msgbus_core_version_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static Eldbus_Message *_e_msgbus_core_restart_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static Eldbus_Message *_e_msgbus_core_shutdown_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg);
static const Eldbus_Method core_methods[] =
{
{ "Version", NULL, ELDBUS_ARGS({"s", "version"}), _e_msgbus_core_version_cb, 0 },
{ "Restart", NULL, NULL, _e_msgbus_core_restart_cb, 0 },
{ "Shutdown", NULL, NULL, _e_msgbus_core_shutdown_cb, 0 },
{ NULL, NULL, NULL, NULL, 0}
};
static const Eldbus_Service_Interface_Desc core_desc = {
"org.enlightenment.wm.Core", core_methods, NULL, NULL, NULL, NULL
};
/* local subsystem globals */
static E_Msgbus_Data *_e_msgbus_data = NULL;
/* externally accessible functions */
EINTERN int
e_msgbus_init(void)
{
_e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
eldbus_init();
_e_msgbus_data->conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
if (!_e_msgbus_data->conn)
{
WRN("Cannot get ELDBUS_CONNECTION_TYPE_SESSION");
return 0;
}
_e_msgbus_data->iface = eldbus_service_interface_register
(_e_msgbus_data->conn, PATH, &core_desc);
eldbus_name_request(_e_msgbus_data->conn,
"org.enlightenment.wm.service",
0, _e_msgbus_request_name_cb, NULL);
return 1;
}
EINTERN int
e_msgbus_shutdown(void)
{
if (_e_msgbus_data->iface)
eldbus_service_object_unregister(_e_msgbus_data->iface);
if (_e_msgbus_data->conn)
{
eldbus_name_release(_e_msgbus_data->conn,
"org.enlightenment.wm.service",
NULL, NULL);
eldbus_connection_unref(_e_msgbus_data->conn);
}
eldbus_shutdown();
E_FREE(_e_msgbus_data);
_e_msgbus_data = NULL;
return 1;
}
E_API Eldbus_Service_Interface *
e_msgbus_interface_attach(const Eldbus_Service_Interface_Desc *desc)
{
if (!_e_msgbus_data->iface) return NULL;
return eldbus_service_interface_register(_e_msgbus_data->conn, PATH, desc);
}
static void
_e_msgbus_request_name_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
{
unsigned int flag;
if (eldbus_message_error_get(msg, NULL, NULL))
{
ERR("Could not request bus name");
return;
}
if (!eldbus_message_arguments_get(msg, "u", &flag))
{
ERR("Could not get arguments on on_name_request");
return;
}
if (!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER))
WRN("Name already in use\n");
}
/* Core Handlers */
static Eldbus_Message *
_e_msgbus_core_version_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
EINA_SAFETY_ON_NULL_RETURN_VAL(reply, NULL);
eldbus_message_arguments_append(reply, "s", VERSION);
return reply;
}
static Eldbus_Message *
_e_msgbus_core_restart_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
ERR("DBus restart API disabled for security reasons");
else
e_sys_action_do(E_SYS_RESTART, NULL);
return eldbus_message_method_return_new(msg);
}
static Eldbus_Message *
_e_msgbus_core_shutdown_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Message *msg)
{
if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
ERR("DBus shutdown API disabled for security reasons");
else
e_sys_action_do(E_SYS_EXIT, NULL);
return eldbus_message_method_return_new(msg);
}