-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDBusProxy.cpp
104 lines (93 loc) · 3.15 KB
/
DBusProxy.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* DBusProxy.cpp
*
* Created on: 28-08-2008
* Author: Christian Surlykke
*/
#include <iostream>
#include "DBusProxy.h"
#include "dbus/dbus.h"
namespace Xanguli {
DBusProxy::DBusProxy(DBusConnection *bus, std::string service, std::string interface, std::string path) {
this->bus = bus;
this->service = service;
this->interface = interface;
this->path = path;
}
DBusProxy::~DBusProxy() {
}
bool DBusProxy::call(std::string method, std::string in_signature, std::string out_signature, ... ) {
DBusError error;
std::cout << "service = " << service << "\n"
<< "path = " << path << "\n"
<< "interface = " << interface << "\n"
<< "method = " << method << "\n";
DBusMessage* message = dbus_message_new_method_call(service.c_str(), path.c_str(), interface.c_str(), method.c_str());
DBusMessageIter messageIter;
dbus_message_iter_init_append(message, &messageIter);
std::cout << "iter initted\n";
va_list arguments;
va_start(arguments, out_signature);
std::string s = "test";
for (std::string::const_iterator it = in_signature.begin(); it != in_signature.end(); it++) {
std::cout << "signature '" << *it << "'\n";
if (*it == 'i') {
int i = va_arg(arguments, int);
dbus_message_iter_append_basic(&messageIter, DBUS_TYPE_INT32, &i);
std::cout << "Appended " << i << "\n";
}
else if (*it == 'u') {
unsigned int i = va_arg(arguments, unsigned int);
dbus_message_iter_append_basic(&messageIter, DBUS_TYPE_UINT32, &i);
std::cout << "Appended " << i << "\n";
}
else if (*it == 's') {
char* s = va_arg(arguments, char*);
dbus_message_iter_append_basic(&messageIter, DBUS_TYPE_STRING, &s);
std::cout << "Appended '" << s << "'\n";
}
else {
std::cerr << "Signature type'" << in_signature << "' not known\n";
}
}
dbus_error_init(&error);
DBusMessage* reply = dbus_connection_send_with_reply_and_block(bus, message, 20, &error);
if (reply != NULL) {
std::cout << "Got reply\n";
DBusMessageIter replyIter;
dbus_message_iter_init(reply, &replyIter);
for (std::string::const_iterator it = out_signature.begin(); it != out_signature.end(); it++) {
std::cout << "out_signature '" << *it << "'\n";
if (*it == 'i') {
int* i = va_arg(arguments, int*);
dbus_message_iter_get_basic(&replyIter, i);
std::cout << "Got " << *i << "\n";
}
else if (*it == 'u') {
std::cout << "Getting argument\n";
unsigned int* i = va_arg(arguments, unsigned int*);
std::cout << "Getting value from message\n";
dbus_message_iter_get_basic(&replyIter, i);
std::cout << "Got value: ";
std::cout << *i << "\n";
}
else if (*it == 's') {
char** s = va_arg(arguments, char**);
dbus_message_iter_get_basic(&replyIter, s);
std::cout << "Got '" << *s << "'\n";
}
else {
std::cerr << "Signature type'" << out_signature << "' not known\n";
}
}
}
else {
std::cout << "Got error\n";
std::cout << "Error name: " << error.name << "\n";
std::cout << "Error message: " << error.message << "\n";
}
va_end(arguments);
std::cout << "Leaving call\n";
return true;
}
}