Switch to structs for thin wrappers.

This commit is contained in:
Tristan Hume 2015-05-01 16:59:40 -04:00
parent e370a57a42
commit 5905d50e1a
6 changed files with 38 additions and 21 deletions

View file

@ -1,3 +1,4 @@
/// Thin OO wrapper around DBus types
module ddbus.thin;
import ddbus.c_lib;
@ -30,7 +31,9 @@ enum MessageType {
Call, Return, Error, Signal
}
class Message {
struct Message {
DBusMessage *msg;
this(string dest, string path, string iface, string method) {
msg = dbus_message_new_method_call(dest.toStringz(), path.toStringz(), iface.toStringz(), method.toStringz());
}
@ -39,6 +42,10 @@ class Message {
msg = m;
}
this(this) {
dbus_message_ref(msg);
}
~this() {
dbus_message_unref(msg);
}
@ -71,7 +78,7 @@ class Message {
}
Message createReturn() {
return new Message(dbus_message_new_method_return(msg));
return Message(dbus_message_new_method_return(msg));
}
MessageType type() {
@ -109,22 +116,32 @@ class Message {
assert(cStr != null);
return cStr.fromStringz().assumeUnique();
}
DBusMessage *msg;
}
unittest {
import dunit.toolkit;
auto msg = new Message("org.example.test", "/test","org.example.testing","testMethod");
auto msg = Message("org.example.test", "/test","org.example.testing","testMethod");
msg.path().assertEqual("/test");
}
class Connection {
struct Connection {
DBusConnection *conn;
this(DBusConnection *connection) {
conn = connection;
}
this(this) {
dbus_connection_ref(conn);
}
~this() {
dbus_connection_unref(conn);
}
void close() {
dbus_connection_close(conn);
}
void send(Message msg) {
dbus_connection_send(conn,msg.msg, null);
}
@ -135,20 +152,20 @@ class Connection {
}
Message sendWithReplyBlocking(Message msg, int timeout = 100) {
DBusMessage *dbusMsg = msg.msg;
dbus_message_ref(dbusMsg);
DBusMessage *reply = wrapErrors((err) {
return dbus_connection_send_with_reply_and_block(conn,msg.msg,timeout,err);
auto ret = dbus_connection_send_with_reply_and_block(conn,dbusMsg,timeout,err);
dbus_message_unref(dbusMsg);
return ret;
});
return new Message(reply);
}
~this() {
dbus_connection_unref(conn);
return Message(reply);
}
}
Connection connectToBus(DBusBusType bus = DBusBusType.DBUS_BUS_SESSION) {
DBusConnection *conn = wrapErrors((err) { return dbus_bus_get(bus,err); });
return new Connection(conn);
return Connection(conn);
}
unittest {