sensord: replace usleep() code with sleep()
[platform/core/system/sensord.git] / src / server / dbus_listener.cpp
1 /*
2  * sensord
3  *
4  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include <sensor_log.h>
21 #include "dbus_listener.h"
22
23 #define HANDLE_GERROR(Err) \
24         do { \
25                 if ((Err)) { \
26                         _E("GError: %s", Err->message); \
27                         g_error_free(Err); \
28                         Err = NULL; \
29                 } \
30         } while (0)
31
32 #define ROTATION_DBUS_DEST              "org.tizen.system.coord"
33 #define ROTATION_DBUS_OBJ_PATH  "/Org/Tizen/System/Coord/Rotation"
34 #define ROTATION_DBUS_IFACE             "org.tizen.system.coord.rotation"
35 #define ROTATION_DBUS_SIGNAL    "Changed"
36 #define ROTATION_DBUS_METHOD    "Degree"
37
38 static void rotation_signal_cb(GDBusConnection *conn, const gchar *sender,
39                 const gchar *obj_path, const gchar *iface, const gchar *signal_name,
40                 GVariant *param, gpointer user_data)
41 {
42         gint state;
43         g_variant_get(param, "(i)", &state);
44         //sensor_event_listener::get_instance().set_display_rotation(state);
45 }
46
47 static void rotation_read_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
48 {
49         GError *error = NULL;
50         GDBusConnection *conn = G_DBUS_CONNECTION(source_object);
51         GVariant *result = g_dbus_connection_call_finish(conn, res, &error);
52         HANDLE_GERROR(error);
53         ret_if(result == NULL);
54
55         gint state;
56         g_variant_get(result, "(i)", &state);
57         g_variant_unref(result);
58         //sensor_event_listener::get_instance().set_display_rotation(state);
59 }
60
61 dbus_listener::dbus_listener()
62 : m_connection(NULL)
63 {
64 #ifndef GLIB_VERSION_2_36
65         g_type_init();
66 #endif
67 }
68
69 dbus_listener::~dbus_listener()
70 {
71         disconnect();
72 }
73
74 void dbus_listener::init(void)
75 {
76         static dbus_listener listener;
77         static bool done = false;
78         ret_if(done);
79         listener.connect();
80         done = true;
81 }
82
83 void dbus_listener::connect(void)
84 {
85         GError *gerr = NULL;
86
87         gchar *addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &gerr);
88         HANDLE_GERROR(gerr);
89         retm_if(addr == NULL, "Getting address failed");
90
91         g_dbus_connection_new_for_address(addr,
92                         (GDBusConnectionFlags)(G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION),
93                         NULL, NULL, on_connection_ready, this);
94         g_free(addr);
95 }
96
97 void dbus_listener::on_connection_ready(GObject *source_object, GAsyncResult *res, gpointer user_data)
98 {
99         GError *gerr = NULL;
100         dbus_listener *listener = static_cast<dbus_listener*>(user_data);
101
102         GDBusConnection *conn = g_dbus_connection_new_finish(res, &gerr);
103         HANDLE_GERROR(gerr);
104
105         retm_if(conn == NULL, "Connection failed");
106         _D("Dbus connection established: %s", g_dbus_connection_get_unique_name(conn));
107
108         listener->m_connection = conn;
109         listener->get_current_state();
110         listener->subscribe();
111 }
112
113 void dbus_listener::disconnect(void)
114 {
115         ret_if(!m_connection);
116         g_dbus_connection_close_sync(m_connection, NULL, NULL);
117         g_object_unref(m_connection);
118 }
119
120 void dbus_listener::subscribe(void)
121 {
122         /* Diplay rotation */
123         g_dbus_connection_signal_subscribe(m_connection,
124                         ROTATION_DBUS_DEST, ROTATION_DBUS_IFACE, ROTATION_DBUS_SIGNAL, ROTATION_DBUS_OBJ_PATH,
125                         NULL, G_DBUS_SIGNAL_FLAGS_NONE, (GDBusSignalCallback)rotation_signal_cb, NULL, NULL);
126 }
127
128 void dbus_listener::get_current_state(void)
129 {
130         /* Display rotation */
131         g_dbus_connection_call(m_connection,
132                         ROTATION_DBUS_DEST, ROTATION_DBUS_OBJ_PATH, ROTATION_DBUS_IFACE, ROTATION_DBUS_METHOD,
133                         NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback)rotation_read_cb, NULL);
134 }