4 * Copyright (c) 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.
20 #include <sensor_log.h>
21 #include "dbus_listener.h"
23 #define HANDLE_GERROR(Err) \
26 _E("GError: %s", Err->message); \
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"
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)
43 g_variant_get(param, "(i)", &state);
44 //sensor_event_listener::get_instance().set_display_rotation(state);
47 static void rotation_read_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
50 GDBusConnection *conn = G_DBUS_CONNECTION(source_object);
51 GVariant *result = g_dbus_connection_call_finish(conn, res, &error);
53 ret_if(result == NULL);
56 g_variant_get(result, "(i)", &state);
57 g_variant_unref(result);
58 //sensor_event_listener::get_instance().set_display_rotation(state);
61 dbus_listener::dbus_listener()
64 #ifndef GLIB_VERSION_2_36
69 dbus_listener::~dbus_listener()
74 void dbus_listener::init(void)
76 static dbus_listener listener;
77 static bool done = false;
83 void dbus_listener::connect(void)
87 gchar *addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &gerr);
89 retm_if(addr == NULL, "Getting address failed");
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);
97 void dbus_listener::on_connection_ready(GObject *source_object, GAsyncResult *res, gpointer user_data)
100 dbus_listener *listener = static_cast<dbus_listener*>(user_data);
102 GDBusConnection *conn = g_dbus_connection_new_finish(res, &gerr);
105 retm_if(conn == NULL, "Connection failed");
106 _D("Dbus connection established: %s", g_dbus_connection_get_unique_name(conn));
108 listener->m_connection = conn;
109 listener->get_current_state();
110 listener->subscribe();
113 void dbus_listener::disconnect(void)
115 ret_if(!m_connection);
116 g_dbus_connection_close_sync(m_connection, NULL, NULL);
117 g_object_unref(m_connection);
120 void dbus_listener::subscribe(void)
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);
128 void dbus_listener::get_current_state(void)
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);