4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the License);
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
30 /* -1 is a default timeout value, it's converted to 25*1000 internally. */
31 #define DBUS_REPLY_TIMEOUT (-1)
33 struct pending_call_data {
38 int append_variant(DBusMessageIter *iter, const char *sig, char *param[])
43 dbus_bool_t bool_type;
46 struct dbus_byte *byte;
51 for (ch = (char*)sig, i = 0; *ch != '\0'; ++i, ++ch) {
54 bool_type = (atoi(param[i])) ? TRUE:FALSE;
55 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &bool_type);
58 int_type = atoi(param[i]);
59 dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &int_type);
62 int_type = strtoul(param[i], NULL, 10);
63 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &int_type);
66 int64_type = atoll(param[i]);
67 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT64, &int64_type);
70 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, ¶m[i]);
76 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &arr);
77 byte = (struct dbus_byte*)param[i];
78 dbus_message_iter_append_fixed_array(&arr, DBUS_TYPE_BYTE, &(byte->data), byte->size);
79 dbus_message_iter_close_container(iter, &arr);
93 DBusMessage *dbus_method_sync_with_reply(const char *dest, const char *path,
94 const char *interface, const char *method,
95 const char *sig, char *param[])
104 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
106 _E("dbus_bus_get error");
110 msg = dbus_message_new_method_call(dest, path, interface, method);
112 _E("dbus_message_new_method_call(%s:%s-%s)",
113 path, interface, method);
117 dbus_message_iter_init_append(msg, &iter);
118 r = append_variant(&iter, sig, param);
120 _E("append_variant error(%d) %s %s:%s-%s",
121 r, dest, path, interface, method);
122 dbus_message_unref(msg);
126 dbus_error_init(&err);
128 reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
130 _E("dbus_connection_send error(No reply) %s %s:%s-%s",
131 dest, path, interface, method);
134 if (dbus_error_is_set(&err)) {
135 _E("dbus_connection_send error(%s:%s) %s %s:%s-%s",
136 err.name, err.message, dest, path, interface, method);
137 dbus_error_free(&err);
141 dbus_message_unref(msg);
145 int dbus_method_sync(const char *dest, const char *path,
146 const char *interface, const char *method,
147 const char *sig, char *param[])
149 DBusConnection *conn;
151 DBusMessageIter iter;
156 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
158 _E("dbus_bus_get error");
162 msg = dbus_message_new_method_call(dest, path, interface, method);
164 _E("dbus_message_new_method_call(%s:%s-%s)",
165 path, interface, method);
169 dbus_message_iter_init_append(msg, &iter);
170 ret = append_variant(&iter, sig, param);
172 _E("append_variant error(%d) %s %s:%s-%s",
173 ret, dest, path, interface, method);
174 dbus_message_unref(msg);
178 dbus_error_init(&err);
180 reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
181 dbus_message_unref(msg);
183 _E("dbus_connection_send error(%s:%s) %s %s:%s-%s",
184 err.name, err.message, dest, path, interface, method);
185 dbus_error_free(&err);
189 ret = dbus_message_get_args(reply, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
190 dbus_message_unref(reply);
192 _E("no message : [%s:%s] %s %s:%s-%s",
193 err.name, err.message, dest, path, interface, method);
194 dbus_error_free(&err);
201 int dbus_method_sync_timeout(const char *dest, const char *path,
202 const char *interface, const char *method,
203 const char *sig, char *param[], int timeout)
205 DBusConnection *conn;
207 DBusMessageIter iter;
212 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
214 _E("dbus_bus_get error");
218 msg = dbus_message_new_method_call(dest, path, interface, method);
220 _E("dbus_message_new_method_call(%s:%s-%s)",
221 path, interface, method);
225 dbus_message_iter_init_append(msg, &iter);
226 ret = append_variant(&iter, sig, param);
228 _E("append_variant error(%d) %s %s:%s-%s",
229 ret, dest, path, interface, method);
230 dbus_message_unref(msg);
234 dbus_error_init(&err);
236 reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
237 dbus_message_unref(msg);
239 _E("dbus_connection_send error(%s:%s) %s %s:%s-%s",
240 err.name, err.message, dest, path, interface, method);
241 dbus_error_free(&err);
245 ret = dbus_message_get_args(reply, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
246 dbus_message_unref(reply);
248 _E("no message : [%s:%s] %s %s:%s-%s",
249 err.name, err.message, dest, path, interface, method);
250 dbus_error_free(&err);
257 int dbus_method_async(const char *dest, const char *path,
258 const char *interface, const char *method,
259 const char *sig, char *param[])
261 DBusConnection *conn;
263 DBusMessageIter iter;
266 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
268 _E("dbus_bus_get error");
272 msg = dbus_message_new_method_call(dest, path, interface, method);
274 _E("dbus_message_new_method_call(%s:%s-%s)",
275 path, interface, method);
279 dbus_message_iter_init_append(msg, &iter);
280 ret = append_variant(&iter, sig, param);
282 _E("append_variant error(%d) %s %s:%s-%s",
283 ret, dest, path, interface, method);
284 dbus_message_unref(msg);
288 ret = dbus_connection_send(conn, msg, NULL);
289 dbus_message_unref(msg);
291 _E("dbus_connection_send error(%s %s:%s-%s)",
292 dest, path, interface, method);
299 static void cb_pending(DBusPendingCall *pending, void *user_data)
303 struct pending_call_data *data = user_data;
306 ret = dbus_pending_call_get_completed(pending);
308 _I("dbus_pending_call_get_completed() fail");
309 dbus_pending_call_unref(pending);
313 dbus_error_init(&err);
314 msg = dbus_pending_call_steal_reply(pending);
316 _E("no message : [%s:%s]", err.name, err.message);
319 dbus_set_error(&err, "org.tizen.system.deviced.NoReply",
320 "There was no reply to this method call");
321 data->func(data->data, NULL, &err);
322 dbus_error_free(&err);
327 ret = dbus_set_error_from_message(&err, msg);
329 _E("error msg : [%s:%s]", err.name, err.message);
332 data->func(data->data, NULL, &err);
333 dbus_error_free(&err);
336 data->func(data->data, msg, &err);
339 dbus_message_unref(msg);
340 dbus_pending_call_unref(pending);
343 int dbus_method_async_with_reply(const char *dest, const char *path,
344 const char *interface, const char *method,
345 const char *sig, char *param[], dbus_pending_cb cb, int timeout, void *data)
347 DBusConnection *conn;
349 DBusMessageIter iter;
350 DBusPendingCall *pending = NULL;
351 struct pending_call_data *pdata;
354 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
356 _E("dbus_bus_get error");
360 msg = dbus_message_new_method_call(dest, path, interface, method);
362 _E("dbus_message_new_method_call(%s:%s-%s)",
363 path, interface, method);
367 dbus_message_iter_init_append(msg, &iter);
368 ret = append_variant(&iter, sig, param);
370 _E("append_variant error(%d)%s %s:%s-%s",
371 ret, dest, path, interface, method);
372 dbus_message_unref(msg);
376 ret = dbus_connection_send_with_reply(conn, msg, &pending, timeout);
378 dbus_message_unref(msg);
379 _E("dbus_connection_send error(%s %s:%s-%s)",
380 dest, path, interface, method);
384 dbus_message_unref(msg);
387 pdata = malloc(sizeof(struct pending_call_data));
394 ret = dbus_pending_call_set_notify(pending, cb_pending, pdata, free);
397 dbus_pending_call_cancel(pending);
405 int check_systemd_active(void)
410 DBusMessageIter iter, sub;
414 pa[0] = "org.freedesktop.systemd1.Unit";
415 pa[1] = "ActiveState";
417 _I("%s %s", pa[0], pa[1]);
419 msg = dbus_method_sync_with_reply("org.freedesktop.systemd1",
420 "/org/freedesktop/systemd1/unit/default_2etarget",
421 "org.freedesktop.DBus.Properties",
426 dbus_error_init(&err);
428 if (!dbus_message_iter_init(msg, &iter) ||
429 dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
432 dbus_message_iter_recurse(&iter, &sub);
434 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
439 dbus_message_iter_get_basic(&sub, &state);
441 if (strncmp(state, "active", 6) == 0)
444 dbus_message_unref(msg);
445 dbus_error_free(&err);
449 static void __CONSTRUCTOR__ dbus_init(void)
451 dbus_threads_init_default();