forked from enlightenment/efl
204 lines
6.7 KiB
C
204 lines
6.7 KiB
C
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <Ecore.h>
|
|
|
|
#include "eldbus_suite.h"
|
|
#include "eldbus_fake_server.h"
|
|
|
|
#define FAKE_SERVER_DATA_KEY "data"
|
|
|
|
static void _fake_server_name_request_cb(void *, const Eldbus_Message *, Eldbus_Pending *);
|
|
static Eina_Bool _fakse_server_property_get(const Eldbus_Service_Interface *, const char *, Eldbus_Message_Iter *, const Eldbus_Message *, Eldbus_Message **);
|
|
static Eldbus_Message *_fake_server_property_set(const Eldbus_Service_Interface *, const char *, Eldbus_Message_Iter *, const Eldbus_Message *);
|
|
static Eldbus_Message *_fake_server_sum(const Eldbus_Service_Interface *, const Eldbus_Message *);
|
|
static Eldbus_Message *_fake_server_ping(const Eldbus_Service_Interface *, const Eldbus_Message *);
|
|
static Eina_Bool _fake_server_send_pong_signal(void *);
|
|
|
|
static Eldbus_Connection *conn;
|
|
|
|
static const Eldbus_Method methods[] = {
|
|
{
|
|
FAKE_SERVER_SUM_METHOD_NAME, ELDBUS_ARGS({"i", "a"}, {"i", "b"}), ELDBUS_ARGS({"i", "result"}),
|
|
_fake_server_sum,
|
|
0
|
|
},
|
|
{
|
|
FAKE_SERVER_PING_METHOD_NAME, ELDBUS_ARGS({"i", "a"}), NULL,
|
|
_fake_server_ping,
|
|
0
|
|
},
|
|
{ NULL, NULL, NULL, NULL, 0 }
|
|
};
|
|
|
|
enum
|
|
{
|
|
FAKE_SERVER_PONG_SIGNAL = 0
|
|
};
|
|
|
|
static const Eldbus_Signal signals[] = {
|
|
[FAKE_SERVER_PONG_SIGNAL] = {FAKE_SERVER_PONG_SIGNAL_NAME, ELDBUS_ARGS({ "i", NULL }), 0},
|
|
{ NULL, NULL, 0 }
|
|
};
|
|
|
|
static const Eldbus_Property properties[] = {
|
|
{ FAKE_SERVER_READONLY_PROPERTY, "i", _fakse_server_property_get, NULL, 0 },
|
|
{ FAKE_SERVER_WRITEONLY_PROPERTY, "i", NULL, _fake_server_property_set, 0 },
|
|
{ FAKE_SERVER_READWRITE_PROPERTY, "i", _fakse_server_property_get, _fake_server_property_set, 0 },
|
|
{ NULL, NULL, NULL, NULL, 0 }
|
|
};
|
|
|
|
static const Eldbus_Service_Interface_Desc test_interface_desc = {
|
|
FAKE_SERVER_INTERFACE, methods, signals, properties, NULL, NULL
|
|
};
|
|
|
|
|
|
Eldbus_Service_Interface *
|
|
fake_server_start(Fake_Server_Data *data, const char *name)
|
|
{
|
|
ck_assert_ptr_ne(NULL, data);
|
|
|
|
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
|
|
|
|
Eldbus_Service_Interface *interface = eldbus_service_interface_register(conn, FAKE_SERVER_PATH, &test_interface_desc);
|
|
eldbus_service_object_data_set(interface, FAKE_SERVER_DATA_KEY, data);
|
|
|
|
eldbus_name_request(conn, name, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE,
|
|
_fake_server_name_request_cb, interface);
|
|
|
|
ecore_main_loop_begin();
|
|
|
|
return interface;
|
|
}
|
|
|
|
void
|
|
fake_server_stop(Eldbus_Service_Interface *interface)
|
|
{
|
|
eldbus_service_object_unregister(interface);
|
|
eldbus_connection_unref(conn);
|
|
}
|
|
|
|
static Eldbus_Message *
|
|
_fake_server_sum(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
|
|
{
|
|
int a, b;
|
|
if (!eldbus_message_arguments_get(msg, "ii", &a, &b))
|
|
return eldbus_message_error_new(msg, "Invalid arguments", "Error getting arguments..");
|
|
|
|
int sum = a + b;
|
|
|
|
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
|
|
eldbus_message_arguments_append(reply, "i", sum);
|
|
return reply;
|
|
}
|
|
|
|
static Eldbus_Message *
|
|
_fake_server_ping(const Eldbus_Service_Interface *iface , const Eldbus_Message *msg)
|
|
{
|
|
int a;
|
|
if (!eldbus_message_arguments_get(msg, "i", &a))
|
|
return eldbus_message_error_new(msg, "Invalid arguments", "Error getting arguments..");
|
|
|
|
Fake_Server_Data *pd = eldbus_service_object_data_get(iface, FAKE_SERVER_DATA_KEY);
|
|
ck_assert_ptr_ne(NULL, pd);
|
|
|
|
pd->pong_response = a + 1;
|
|
Ecore_Timer *timer = ecore_timer_add(0.1, _fake_server_send_pong_signal, iface);
|
|
ck_assert_ptr_ne(NULL, timer);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_fake_server_send_pong_signal(void *data)
|
|
{
|
|
Eldbus_Service_Interface *iface = (Eldbus_Service_Interface*)data;
|
|
|
|
Fake_Server_Data *pd = eldbus_service_object_data_get(iface, FAKE_SERVER_DATA_KEY);
|
|
ck_assert_ptr_ne(NULL, pd);
|
|
|
|
eldbus_service_signal_emit(iface, FAKE_SERVER_PONG_SIGNAL, pd->pong_response);
|
|
return ECORE_CALLBACK_CANCEL;
|
|
}
|
|
|
|
Eina_Bool
|
|
_fakse_server_property_get(const Eldbus_Service_Interface *iface,
|
|
const char *propname,
|
|
Eldbus_Message_Iter *iter,
|
|
const Eldbus_Message *request_msg EINA_UNUSED,
|
|
Eldbus_Message **error EINA_UNUSED)
|
|
{
|
|
Fake_Server_Data *data = eldbus_service_object_data_get(iface, FAKE_SERVER_DATA_KEY);
|
|
ck_assert_ptr_ne(NULL, data);
|
|
|
|
if (strcmp(propname, FAKE_SERVER_READONLY_PROPERTY) == 0)
|
|
eldbus_message_iter_arguments_append(iter, "i", data->readonly_property);
|
|
else
|
|
if (strcmp(propname, FAKE_SERVER_READWRITE_PROPERTY) == 0)
|
|
eldbus_message_iter_arguments_append(iter, "i", data->readwrite_property);
|
|
else
|
|
return EINA_FALSE;
|
|
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Eldbus_Message *
|
|
_fake_server_property_set(const Eldbus_Service_Interface *iface,
|
|
const char *propname,
|
|
Eldbus_Message_Iter *iter,
|
|
const Eldbus_Message *msg)
|
|
{
|
|
Fake_Server_Data *data = eldbus_service_object_data_get(iface, FAKE_SERVER_DATA_KEY);
|
|
ck_assert_ptr_ne(NULL, data);
|
|
|
|
if (strcmp(propname, FAKE_SERVER_WRITEONLY_PROPERTY) == 0)
|
|
eldbus_message_iter_arguments_get(iter, "i", &data->writeonly_property);
|
|
else
|
|
if (strcmp(propname, FAKE_SERVER_READWRITE_PROPERTY) == 0)
|
|
eldbus_message_iter_arguments_get(iter, "i", &data->readwrite_property);
|
|
else
|
|
return eldbus_message_error_new(msg, "Invalid property", "Invalid property.");
|
|
|
|
return eldbus_message_method_return_new(msg);
|
|
}
|
|
|
|
static void
|
|
_fake_server_name_request_cb(void *data EINA_UNUSED,
|
|
const Eldbus_Message *msg,
|
|
Eldbus_Pending *pending EINA_UNUSED)
|
|
{
|
|
const char *name, *text;
|
|
if (eldbus_message_error_get(msg, &name, &text))
|
|
ck_abort_msg("error on _fake_server_name_request_cb: %s %s", name, text);
|
|
|
|
unsigned int reply;
|
|
if (!eldbus_message_arguments_get(msg, "u", &reply))
|
|
ck_abort_msg("error geting arguments on _fake_server_name_request_cb");
|
|
|
|
if (ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER != reply)
|
|
{
|
|
const char *errcode = "Unknown reply";
|
|
char errmsg[512];
|
|
switch (reply)
|
|
{
|
|
case ELDBUS_NAME_REQUEST_REPLY_IN_QUEUE:
|
|
errcode = "Service could not become the primary owner and has "
|
|
"been placed in the queue";
|
|
break;
|
|
case ELDBUS_NAME_REQUEST_REPLY_EXISTS:
|
|
errcode = "Service is already in the queue";
|
|
break;
|
|
case ELDBUS_NAME_REQUEST_REPLY_ALREADY_OWNER:
|
|
errcode = "Service is already the primary owner";
|
|
break;
|
|
default: break;
|
|
}
|
|
snprintf(errmsg, sizeof(errmsg), "Failed to start fake server: %s (%u)",
|
|
errcode, reply);
|
|
ck_abort_msg(errmsg);
|
|
}
|
|
|
|
ecore_main_loop_quit();
|
|
}
|