2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <dbus/dbus-glib.h>
19 #include <dbus/dbus-glib-lowlevel.h>
21 #include "dbus_util.h"
24 #define DBUS_REPLY_TIMEOUT (120 * 1000)
26 #define POWEROFF_BUS_NAME "org.tizen.system.popup"
27 #define POWEROFF_OBJECT_PATH "/Org/Tizen/System/Popup/Poweroff"
28 #define POWEROFF_INTERFACE_NAME POWEROFF_BUS_NAME".Poweroff"
29 #define METHOD_POWEROFF_NAME "PopupLaunch"
31 #define CPU_BOOSTER_OBJECT_PATH DEVICED_OBJECT_PATH"/PmQos"
32 #define CPU_BOOSTER_INTERFACE DEVICED_BUS_NAME".PmQos"
33 #define METHOD_CPU_BOOSTER "AppLaunchHome"
34 #define DBUS_CPU_BOOSTER_SEC 200
36 #define METHOD_LOCK_PMQOS_NAME "LockScreen"
37 #define DBUS_LOCK_PMQOS_SEC (2 * 1000)
40 DBusConnection *connection;
47 static DBusConnection *_dbus_connection_get(void)
50 DBusConnection *connection = NULL;
52 if (s_info.connection) {
53 return s_info.connection;
56 _W("no connection for dbus. get dbus connection");
58 dbus_error_init(&derror);
59 connection = dbus_bus_get_private(DBUS_BUS_SYSTEM, &derror);
61 _E("Failed to get dbus connection:%s", derror.message);
62 dbus_error_free(&derror);
65 dbus_connection_setup_with_g_main(connection, NULL);
66 dbus_error_free(&derror);
68 s_info.connection = connection;
70 return s_info.connection;
75 static int _append_variant(DBusMessageIter *iter, const char *sig, char *param[])
85 for (ch = (char*)sig, i = 0; *ch != '\0'; ++i, ++ch) {
88 int_type = atoi(param[i]);
89 dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &int_type);
92 int_type = atoi(param[i]);
93 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &int_type);
96 int64_type = (uint64_t) atoi(param[i]);
97 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT64, &int64_type);
100 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, ¶m[i]);
112 static DBusMessage *_invoke_dbus_method_sync(const char *dest, const char *path,
113 const char *interface, const char *method,
114 const char *sig, char *param[])
116 DBusConnection *conn = NULL;
118 DBusMessageIter iter;
123 conn = (DBusConnection *)_dbus_connection_get();
125 _E("dbus_bus_get error");
129 msg = dbus_message_new_method_call(dest, path, interface, method);
131 _E("dbus_message_new_method_call(%s:%s-%s)", path, interface, method);
135 dbus_message_iter_init_append(msg, &iter);
136 r = _append_variant(&iter, sig, param);
138 _E("append_variant error(%d)", r);
139 dbus_message_unref(msg);
143 dbus_error_init(&err);
145 reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
146 dbus_message_unref(msg);
148 _E("dbus_connection_send error(%s:%s)", err.name, err.message);
149 dbus_error_free(&err);
158 static int _invoke_dbus_method_async(const char *dest, const char *path,
159 const char *interface, const char *method,
160 const char *sig, char *param[])
162 DBusConnection *conn;
164 DBusMessageIter iter;
167 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
169 _E("dbus_bus_get error");
173 msg = dbus_message_new_method_call(dest, path, interface, method);
175 _E("dbus_message_new_method_call(%s:%s-%s)", path, interface, method);
179 dbus_message_iter_init_append(msg, &iter);
180 r = _append_variant(&iter, sig, param);
182 _E("append_variant error(%d)", r);
183 dbus_message_unref(msg);
187 r = dbus_connection_send(conn, msg, NULL);
188 dbus_message_unref(msg);
190 _E("dbus_connection_send error(%s:%s:%s-%s)", dest, path, interface, method);
194 _D("dbus_connection_send, ret=%d", r);
201 static int _dbus_message_send(const char *path, const char *interface, const char *member)
204 DBusMessage *msg = NULL;
205 DBusConnection *conn = NULL;
207 conn = (DBusConnection *)_dbus_connection_get();
209 _E("dbus_bus_get error");
213 msg = dbus_message_new_signal(path, interface, member);
215 _E("dbus_message_new_signal(%s:%s-%s)", path, interface, member);
219 ret = dbus_connection_send(conn, msg, NULL); //async call
220 dbus_message_unref(msg);
222 _E("dbus_connection_send error(%s:%s-%s)", path, interface, member);
225 _D("dbus_connection_send, ret=%d", ret);
232 int dbus_util_send_oomadj(int pid, int oom_adj_value)
237 char buf1[BUF_SIZE_16];
238 char buf2[BUF_SIZE_16];
242 _E("Pid is invalid");
246 snprintf(buf1, sizeof(buf1), "%d", pid);
247 snprintf(buf2, sizeof(buf2), "%d", oom_adj_value);
249 pa[0] = DEVICED_SET_METHOD;
254 msg = _invoke_dbus_method_sync(DEVICED_BUS_NAME, DEVICED_PATH, DEVICED_INTERFACE, DEVICED_SET_METHOD, "siss", pa);
258 dbus_error_init(&err);
260 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
262 _E("no message : [%s:%s]", err.name, err.message);
266 dbus_message_unref(msg);
267 dbus_error_free(&err);
269 _D("%s-%s : %d", DEVICED_INTERFACE, pa[0], val);
275 void dbus_util_send_cpu_booster_signal(void)
279 char val[BUF_SIZE_32];
281 snprintf(val, sizeof(val), "%d", DBUS_CPU_BOOSTER_SEC);
284 ret = _invoke_dbus_method_async(DEVICED_BUS_NAME, CPU_BOOSTER_OBJECT_PATH, CPU_BOOSTER_INTERFACE,
285 METHOD_CPU_BOOSTER, "i", arr);
288 _D("%s-%s", CPU_BOOSTER_INTERFACE, METHOD_CPU_BOOSTER);
293 void dbus_util_send_poweroff_signal(void)
297 ret = _invoke_dbus_method_async(POWEROFF_BUS_NAME, POWEROFF_OBJECT_PATH, POWEROFF_INTERFACE_NAME,
298 METHOD_POWEROFF_NAME, NULL, NULL);
301 _D("%s-%s", POWEROFF_INTERFACE_NAME, METHOD_POWEROFF_NAME);
306 void dbus_util_send_lock_PmQos_signal(void)
311 char val[BUF_SIZE_32];
313 snprintf(val, sizeof(val), "%d", DBUS_LOCK_PMQOS_SEC);
316 ret = _invoke_dbus_method_async(DEVICED_BUS_NAME, CPU_BOOSTER_OBJECT_PATH, CPU_BOOSTER_INTERFACE,
317 METHOD_LOCK_PMQOS_NAME, "i", arr);
320 _D("%s-%s", CPU_BOOSTER_INTERFACE, METHOD_LOCK_PMQOS_NAME);
325 void dbus_util_send_sys_lock_teminate_signal(void)
327 E_DBus_Connection *conn;
331 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
333 _E("e_dbus_bus_get error");
336 msg = dbus_message_new_signal(SYS_LOCK_OBJECT_PATH,
337 SYS_LOCK_INTERFACE_TERMINATE,
338 SYS_LOCK_MEMBER_TERMINATE);
340 dbus_message_append_args(msg,
341 DBUS_TYPE_INT32, &ret,
344 e_dbus_message_send(conn, msg, NULL, -1, NULL);
345 dbus_message_unref(msg);
347 _D("%s-%s", SYS_LOCK_INTERFACE_TERMINATE, SYS_LOCK_MEMBER_TERMINATE);
352 int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data)
354 E_DBus_Connection *conn;
355 E_DBus_Signal_Handler *handler;
357 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
359 _E("e_dbus_bus_get error");
363 handler = e_dbus_signal_handler_add(conn, NULL, DISPLAY_OBJECT_PATH,
364 DEVICED_INTERFACE_DISPLAY, MEMBER_LCD_ON,
366 if (handler == NULL) {
367 _E("e_dbus_signal_handler_add error");
371 handler = e_dbus_signal_handler_add(conn, NULL, DISPLAY_OBJECT_PATH,
372 DEVICED_INTERFACE_DISPLAY, MEMBER_LCD_OFF,
374 if (handler == NULL) {
375 _E("e_dbus_signal_handler_add error");
384 int dbus_util_receive_sys_lock_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data)
386 E_DBus_Connection *conn;
387 E_DBus_Signal_Handler *handler;
389 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
391 _E("e_dbus_bus_get error");
395 handler = e_dbus_signal_handler_add(conn, NULL, SYS_LOCK_OBJECT_PATH,
396 SYS_LOCK_INTERFACE_UNLOCK, SYS_LOCK_MEMBER_UNLOCK,
398 if (handler == NULL) {
399 _E("e_dbus_signal_handler_add error");
406 char *dbus_util_msg_arg_get_str(DBusMessage *msg)
410 const char *state = NULL;
411 dbus_error_init(&derror);
413 ret = dbus_message_get_args(msg, &derror, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
414 goto_if(!ret, ERROR);
416 dbus_error_free(&derror);
418 return strdup(state);
421 _E("Failed to get reply (%s:%s)", derror.name, derror.message);
422 dbus_error_free(&derror);