TDE hw lib daemon: added standard DBus interfaces: Introspect, Peer,

Properties.
This relates to issue #9 and #12.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
feat/fix-suspend-code
Michele Calgaro 5 년 전
부모 5931eecd26
커밋 b2dc16ffc8
로그인 계정: MicheleC
GPG 키 ID: 2A75B7CA8ADED5CF

@ -13,17 +13,10 @@
<policy context="default">
<allow send_destination="org.trinitydesktop.hardwarecontrol"
send_interface="org.freedesktop.DBus.Introspectable"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol.Brightness"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol.CPUGovernor"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol.InputEvents"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol.Power"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol"
send_interface="org.freedesktop.DBus.Peer"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.trinitydesktop.hardwarecontrol"
send_interface="org.trinitydesktop.hardwarecontrol"/>

@ -90,6 +90,33 @@ void replyBool(DBusMessage* msg, DBusConnection* conn, int value) {
dbus_message_unref(reply);
}
void replyString(DBusMessage* msg, DBusConnection* conn, const char *str) {
DBusMessage* reply;
DBusMessageIter args;
const char* member = dbus_message_get_member(msg);
dbus_uint32_t serial = 0;
// create a reply from the message
reply = dbus_message_new_method_return(msg);
// add the arguments to the reply
dbus_message_iter_init_append(reply, &args);
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &str)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_message_iter_append_basic failed\n", member);
return;
}
// send the reply && flush the connection
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_connection_send failed\n", member);
return;
}
dbus_connection_flush(conn);
// free the reply
dbus_message_unref(reply);
}
bool setGivenPath(const char *path, const char *contents) {
int writable = (access(path, W_OK) == 0);
bool result = false;
@ -503,6 +530,40 @@ void reply_Introspect(DBusMessage* msg, DBusConnection* conn) {
strncat(data, " <node name=\"hardwarecontrol\" />\n", size-strlen(data));
}
else if(strcmp("/org/trinitydesktop/hardwarecontrol", path) == 0) {
strncat(data,
" <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
" <method name=\"Introspect\">\n"
" <arg name=\"xml_data\" direction=\"out\" type=\"s\" />\n"
" </method>\n"
" </interface>\n"
" <interface name=\"org.freedesktop.DBus.Peer\">\n"
" <method name=\"Ping\"/>\n"
" <method name=\"GetMachineId\">\n"
" <arg name=\"machineUuid\" direction=\"out\" type=\"s\"/>\n"
" </method>\n"
" </interface>\n"
" <interface name=\"org.freedesktop.DBus.Properties\">\n"
" <method name=\"Get\">\n"
" <arg name=\"interfaceName\" direction=\"in\" type=\"s\"/>\n"
" <arg name=\"propertyName\" direction=\"in\" type=\"s\"/>\n"
" <arg name=\"value\" direction=\"out\" type=\"v\"/>\n"
" </method>\n"
" <method name=\"GetAll\">\n"
" <arg name=\"interfaceName\" direction=\"in\" type=\"s\"/>\n"
" <arg name=\"propertyValues\" direction=\"out\" type=\"a{sv}\"/>\n"
" </method>\n"
" <method name=\"Set\">\n"
" <arg name=\"interfaceName\" direction=\"in\" type=\"s\"/>\n"
" <arg name=\"propertyName\" direction=\"in\" type=\"s\"/>\n"
" <arg name=\"value\" direction=\"in\" type=\"v\"/>\n"
" </method>\n"
" <signal name=\"PropertiesChanged\">\n"
" <arg name=\"interfaceName\" type=\"s\"/>\n"
" <arg name=\"changedProperties\" type=\"a{sv}\"/>\n"
" <arg name=\"invalidatedProperties\" type=\"as\"/>\n"
" </signal>\n"
" </interface>\n",
size-strlen(data));
strncat(data,
" <interface name=\"org.trinitydesktop.hardwarecontrol.Brightness\">\n"
" <method name=\"CanSetBrightness\">\n"
@ -607,16 +668,131 @@ void reply_Introspect(DBusMessage* msg, DBusConnection* conn) {
delete[] data;
}
void reply_PropertiesGetAll(DBusMessage* msg, DBusConnection* conn) {
DBusMessage* reply;
DBusMessageIter args, arrayIter;
void reply_PeerPing(DBusMessage* msg, DBusConnection* conn) {
// create and send a reply from the message
DBusMessage *reply = dbus_message_new_method_return(msg);
const char* member = dbus_message_get_member(msg);
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_connection_send failed\n", member);
return;
}
// flush the connection
dbus_connection_flush(conn);
// free the reply
dbus_message_unref(reply);
}
void reply_PeerGetMachineId(DBusMessage* msg, DBusConnection* conn) {
// get machine id from polkit service
TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
if (dbusConn.isConnected()) {
TQT_DBusProxy polkitProxy("org.freedesktop.PolicyKit1", "/org/freedesktop/DBus",
"org.freedesktop.DBus.Peer", dbusConn);
if (polkitProxy.canSend()) {
TQValueList<TQT_DBusData> params;
TQT_DBusMessage reply = polkitProxy.sendWithReply("GetMachineId", params);
if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
TQCString machineId = reply[0].toString().utf8();
replyString(msg, conn, (const char*)machineId);
return;
}
}
}
// Return an error in case of failure
DBusMessage* reply = dbus_message_new_error(msg, "org.freedesktop.DBus.Error.Failed", "Failed to get machine id.");
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] Failed to get machine id.\n");
return;
}
// flush the connection
dbus_connection_flush(conn);
// free the reply
dbus_message_unref(reply);
}
void reply_PropertiesGet(DBusMessage* msg, DBusConnection* conn) {
// create a reply from the message
reply = dbus_message_new_method_return(msg);
DBusMessage* reply = dbus_message_new_method_return(msg);
const char* member = dbus_message_get_member(msg);
// read the arguments
char *interfaceName, *propertyName;
bool argsOk = true;
DBusMessageIter args;
if (!dbus_message_iter_init(msg, &args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: no arguments supplied\n", member);
argsOk = false;
}
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: first argument not string\n", member);
argsOk = false;
}
else {
dbus_message_iter_get_basic(&args, &interfaceName);
}
if (argsOk) {
if (!dbus_message_iter_next(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: second argument not supplied\n", member);
argsOk = false;
}
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: second argument not string\n", member);
argsOk = false;
}
else {
dbus_message_iter_get_basic(&args, &propertyName);
}
}
// send the reply
if (!argsOk) {
DBusMessage* reply = dbus_message_new_error(msg,
"org.freedesktop.DBus.Error.InvalidArgs", "Number or type of arguments do not match the expected signature.");
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] Number or type of arguments do not match the expected signature.\n");
return;
}
}
else {
// Currently there are no properties at all, so return an error in all cases.
DBusMessage* reply = dbus_message_new_error_printf(msg,
"org.freedesktop.DBus.Error.InvalidArgs", "Property '%s' not found in interface '%s'.",
propertyName, interfaceName);
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] Property '%s' not found in interface '%s'.\n",
propertyName, interfaceName);
return;
}
}
// flush the connection
dbus_connection_flush(conn);
// free the reply
dbus_message_unref(reply);
}
void reply_PropertiesGetAll(DBusMessage* msg, DBusConnection* conn) {
// create a reply from the message
DBusMessage* reply = dbus_message_new_method_return(msg);
const char* member = dbus_message_get_member(msg);
// add the arguments to the reply
DBusMessageIter args, arrayIter;
dbus_message_iter_init_append(reply, &args);
if (!dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY, "sv", &arrayIter)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_message_iter_open_container failed\n", member);
@ -628,6 +804,7 @@ void reply_PropertiesGetAll(DBusMessage* msg, DBusConnection* conn) {
}
// send the reply && flush the connection
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_connection_send failed\n", member);
return;
@ -638,6 +815,93 @@ void reply_PropertiesGetAll(DBusMessage* msg, DBusConnection* conn) {
dbus_message_unref(reply);
}
void reply_PropertiesSet(DBusMessage* msg, DBusConnection* conn) {
// create a reply from the message
DBusMessage* reply = dbus_message_new_method_return(msg);
const char* member = dbus_message_get_member(msg);
// read the arguments
char *interfaceName, *propertyName;
bool argsOk = true;
DBusMessageIter args;
if (!dbus_message_iter_init(msg, &args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: no arguments supplied\n", member);
argsOk = false;
}
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: first argument not string\n", member);
argsOk = false;
}
else {
dbus_message_iter_get_basic(&args, &interfaceName);
}
if (argsOk) {
if (!dbus_message_iter_next(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: second argument not supplied\n", member);
argsOk = false;
}
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: second argument not string\n", member);
argsOk = false;
}
else {
dbus_message_iter_get_basic(&args, &propertyName);
}
}
if (argsOk) {
if (!dbus_message_iter_next(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: third argument not supplied\n", member);
argsOk = false;
}
else if (DBUS_TYPE_VARIANT != dbus_message_iter_get_arg_type(&args)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: third argument not variant\n", member);
argsOk = false;
}
else {
// TODO when real properties are passed: check variant type is consistent with required property
}
}
// send the reply
if (!argsOk) {
DBusMessage* reply = dbus_message_new_error(msg,
"org.freedesktop.DBus.Error.InvalidArgs", "Number or type of arguments do not match the expected signature.");
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] Number or type of arguments do not match the expected signature.\n");
return;
}
}
else {
// Currently there are no properties at all, so nothing to set
DBusMessage* reply = dbus_message_new_error_printf(msg,
"org.freedesktop.DBus.Error.InvalidArgs", "Property '%s' not found in interface '%s'.",
propertyName, interfaceName);
dbus_uint32_t serial = 0;
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "[tde_dbus_hardwarecontrol] Property '%s' not found in interface '%s'.\n",
propertyName, interfaceName);
return;
}
}
// flush the connection
dbus_connection_flush(conn);
// free the reply
dbus_message_unref(reply);
}
void signal_PropertiesChanged(DBusMessage* msg) {
// Currently there are no properties at all, so nothing to do
fprintf(stderr, "[tde_dbus_hardwarecontrol] PropertiesChanged signal was received\n");
}
void error_UnknownMessage(DBusMessage* msg, DBusConnection* conn) {
const char* member = dbus_message_get_member(msg);
const char* interface = dbus_message_get_interface(msg);
@ -912,9 +1176,24 @@ void listen() {
else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect")) {
reply_Introspect(msg, conn);
}
else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Peer", "Ping")) {
reply_PeerPing(msg, conn);
}
else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Peer", "GetMachineId")) {
reply_PeerGetMachineId(msg, conn);
}
else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Properties", "Get")) {
reply_PropertiesGet(msg, conn);
}
else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Properties", "GetAll")) {
reply_PropertiesGetAll(msg, conn);
}
else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Properties", "Set")) {
reply_PropertiesSet(msg, conn);
}
else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "PropertiesChanged")) {
signal_PropertiesChanged(msg);
}
else {
error_UnknownMessage(msg, conn);
}

불러오는 중...
취소
저장