Add routing infrastructure.

This commit is contained in:
Tristan Hume 2015-04-30 19:22:08 -04:00
parent 9a73bcaad2
commit e370a57a42
3 changed files with 137 additions and 4 deletions

View file

@ -5,6 +5,7 @@ import ddbus.conv;
import ddbus.util;
import std.string;
import std.typecons;
import std.exception;
class DBusException : Exception {
this(DBusError *err) {
@ -24,6 +25,11 @@ T wrapErrors(T)(T delegate(DBusError *err) del) {
return ret;
}
enum MessageType {
Invalid = 0,
Call, Return, Error, Signal
}
class Message {
this(string dest, string path, string iface, string method) {
msg = dbus_message_new_method_call(dest.toStringz(), path.toStringz(), iface.toStringz(), method.toStringz());
@ -64,22 +70,67 @@ class Message {
return ret;
}
const(char)[] signature() {
const(char)* cSig = dbus_message_get_signature(msg);
return fromStringz(cSig);
Message createReturn() {
return new Message(dbus_message_new_method_return(msg));
}
MessageType type() {
return cast(MessageType)dbus_message_get_type(msg);
}
bool isCall() {
return type() == MessageType.Call;
}
// Various string members
// TODO: make a mixin to avoid this copy-paste
string signature() {
const(char)* cStr = dbus_message_get_signature(msg);
assert(cStr != null);
return cStr.fromStringz().assumeUnique();
}
string path() {
const(char)* cStr = dbus_message_get_path(msg);
assert(cStr != null);
return cStr.fromStringz().assumeUnique();
}
string iface() {
const(char)* cStr = dbus_message_get_interface(msg);
assert(cStr != null);
return cStr.fromStringz().assumeUnique();
}
string member() {
const(char)* cStr = dbus_message_get_member(msg);
assert(cStr != null);
return cStr.fromStringz().assumeUnique();
}
string sender() {
const(char)* cStr = dbus_message_get_sender(msg);
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");
msg.path().assertEqual("/test");
}
class Connection {
DBusConnection *conn;
this(DBusConnection *connection) {
conn = connection;
}
void send(Message msg) {
dbus_connection_send(conn,msg.msg, null);
}
void sendBlocking(Message msg) {
dbus_connection_send(conn,msg.msg,null);
send(msg);
dbus_connection_flush(conn);
}