1
/* This file is part of Strigi Desktop Search
3
* Copyright (C) 2006 Jos van den Oever <jos@vandenoever.info>
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Library General Public
7
* License as published by the Free Software Foundation; either
8
* version 2 of the License, or (at your option) any later version.
10
* This library is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* Library General Public License for more details.
15
* You should have received a copy of the GNU Library General Public License
16
* along with this library; see the file COPYING.LIB. If not, write to
17
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18
* Boston, MA 02110-1301, USA.
20
#include "dbusmessagewriter.h"
21
#include <dbus/dbus.h>
24
DBusMessageWriter::DBusMessageWriter(DBusConnection* c, DBusMessage* msg)
25
:conn(c), reply(dbus_message_new_method_return(msg)), reply_to(msg), error(0) {
26
dbus_message_iter_init_append(reply, &it);
28
DBusMessageWriter::DBusMessageWriter(DBusConnection* c, const char* object,
29
const char* interface, const char* function)
30
:conn(c), reply(dbus_message_new_signal(object, interface, function)),
31
reply_to(0), error(0) {
32
dbus_message_iter_init_append(reply, &it);
34
DBusMessageWriter::~DBusMessageWriter() {
36
DBusMessage* msg = (error) ?error :reply;
37
dbus_uint32_t serial = 0;
38
dbus_connection_send(conn, msg, &serial);
39
dbus_connection_flush(conn);
40
dbus_message_unref(reply);
42
dbus_message_unref(error);
47
DBusMessageWriter::setError(const std::string &e) {
48
// allow for only one error
50
// if this is an error in a reply, use the reply in the constructor
52
error = dbus_message_new_error(reply_to,
53
"org.freedesktop.DBus.Error.Failed", e.c_str());
55
error = dbus_message_new(DBUS_MESSAGE_TYPE_ERROR);
56
dbus_message_set_error_name(error,
57
"org.freedesktop.DBus.Error.Failed");
62
operator<<(DBusMessageWriter& w, bool b) {
64
dbus_message_iter_append_basic(&w.it, DBUS_TYPE_BOOLEAN, &db);
68
operator<<(DBusMessageWriter& w, int32_t i) {
69
dbus_message_iter_append_basic(&w.it, DBUS_TYPE_INT32, &i);
73
operator<<(DBusMessageWriter& w, uint32_t i) {
74
dbus_message_iter_append_basic(&w.it, DBUS_TYPE_UINT32, &i);
78
operator<<(DBusMessageWriter& w, int64_t i) {
79
dbus_message_iter_append_basic(&w.it, DBUS_TYPE_INT64, &i);
83
operator<<(DBusMessageWriter& w, double d) {
84
dbus_message_iter_append_basic(&w.it, DBUS_TYPE_DOUBLE, &d);
88
operator<<(DBusMessageWriter& w, const std::string& s) {
89
const char* c = s.c_str();
90
dbus_message_iter_append_basic(&w.it, DBUS_TYPE_STRING, &c);
94
operator<<(DBusMessageWriter& w, const set<string>& s) {
96
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY,
97
DBUS_TYPE_STRING_AS_STRING, &sub);
98
set<string>::const_iterator i;
99
for (i = s.begin(); i != s.end(); ++i) {
100
const char* c = i->c_str();
101
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &c);
103
dbus_message_iter_close_container(&w.it, &sub);
107
operator<<(DBusMessageWriter& w, const std::map<std::string, std::string>& m) {
108
DBusMessageIter sub, ssub;
109
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "{ss}", &sub);
110
map<string, string>::const_iterator i;
111
for (i = m.begin(); i != m.end(); ++i) {
112
dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, 0, &ssub);
113
const char* c = i->first.c_str();
114
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &c);
115
c = i->second.c_str();
116
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &c);
117
dbus_message_iter_close_container(&sub, &ssub);
119
dbus_message_iter_close_container(&w.it, &sub);
123
operator<<(DBusMessageWriter& w, const std::vector<std::string>& s) {
125
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY,
126
DBUS_TYPE_STRING_AS_STRING, &sub);
127
vector<string>::const_iterator i;
128
for (i = s.begin(); i != s.end(); ++i) {
129
const char* c = i->c_str();
130
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &c);
132
dbus_message_iter_close_container(&w.it, &sub);
136
operator<<(DBusMessageWriter& w, const std::vector<int32_t>& s) {
138
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "i", &sub);
139
vector<int32_t>::const_iterator i;
140
for (i = s.begin(); i != s.end(); ++i) {
142
dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &v);
144
dbus_message_iter_close_container(&w.it, &sub);
148
operator<<(DBusMessageWriter& w, const std::vector<uint32_t>& s) {
150
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "u", &sub);
151
vector<uint32_t>::const_iterator i;
152
for (i = s.begin(); i != s.end(); ++i) {
154
dbus_message_iter_append_basic(&sub, DBUS_TYPE_UINT32, &v);
156
dbus_message_iter_close_container(&w.it, &sub);
159
/** map multimap<int,string> to 'a(is)' **/
161
operator<<(DBusMessageWriter& w, const std::multimap<int, std::string>& m) {
162
DBusMessageIter sub, ssub;
163
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "(is)", &sub);
164
multimap<int,string>::const_iterator i;
165
for (i = m.begin(); i != m.end(); ++i) {
166
dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, 0, &ssub);
167
int32_t n = i->first;
168
const char* s = i->second.c_str();
169
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_INT32, &n);
170
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &s);
171
dbus_message_iter_close_container(&sub, &ssub);
173
dbus_message_iter_close_container(&w.it, &sub);
177
operator<<(DBusMessageWriter& w, const std::vector<std::pair<bool, std::string> >& s) {
178
DBusMessageIter sub, ssub;
179
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "(bs)", &sub);
180
vector<pair<bool,string> >::const_iterator i;
181
for (i = s.begin(); i != s.end(); ++i) {
182
dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, 0, &ssub);
183
dbus_bool_t n = i->first;
184
const char* s = i->second.c_str();
185
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_BOOLEAN, &n);
186
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &s);
187
dbus_message_iter_close_container(&sub, &ssub);
189
dbus_message_iter_close_container(&w.it, &sub);
193
operator<<(DBusMessageWriter& w, const std::vector<std::pair<std::string, dbus_uint32_t> >& s) {
194
DBusMessageIter sub, ssub;
195
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "(su)", &sub);
196
vector<pair<string,dbus_uint32_t> >::const_iterator i;
197
for (i = s.begin(); i != s.end(); ++i) {
198
dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, 0, &ssub);
199
const char* s = i->first.c_str();
200
dbus_uint32_t n = i->second;
201
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &s);
202
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_UINT32, &n);
203
dbus_message_iter_close_container(&sub, &ssub);
205
dbus_message_iter_close_container(&w.it, &sub);
210
operator<<(DBusMessageWriter& w, const std::vector<std::vector<std::string> >& v) {
211
DBusMessageIter sub, ssub;
212
dbus_message_iter_open_container(&w.it, DBUS_TYPE_ARRAY, "as", &sub);
213
vector<vector<string> >::const_iterator i;
214
for (i = v.begin(); i != v.end(); ++i) {
215
dbus_message_iter_open_container(&sub, DBUS_TYPE_ARRAY,
216
DBUS_TYPE_STRING_AS_STRING, &ssub);
217
vector<string>::const_iterator j;
218
vector<string>::const_iterator end = (*i).end();
219
for (j = (*i).begin(); j != end; ++j) {
220
const char* c = j->c_str();
221
dbus_message_iter_append_basic(&ssub, DBUS_TYPE_STRING, &c);
223
dbus_message_iter_close_container(&sub, &ssub);
225
dbus_message_iter_close_container(&w.it, &sub);