[LICENSE] change to Flora-1.1 license
[profile/tv/apps/native/screen-reader.git] / src / dbus_gesture_adapter.c
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
3  *
4  * This file is a modified version of BSD licensed file and
5  * licensed under the Flora License, Version 1.1 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://floralicense.org/license/
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an AS IS BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * Please, see the LICENSE file for the original copyright owner and
18  * license.
19  */
20
21 #include "dbus_gesture_adapter.h"
22 #include "logger.h"
23
24 #include <Eldbus.h>
25
26 #define E_A11Y_SERVICE_BUS_NAME "com.samsung.EModule"
27 #define E_A11Y_SERVICE_NAVI_IFC_NAME "com.samsung.GestureNavigation"
28 #define E_A11Y_SERVICE_NAVI_OBJ_PATH "/com/samsung/GestureNavigation"
29
30 static Eldbus_Connection *conn;
31 static Eldbus_Service_Interface *service;
32
33 enum _Signals
34 {
35    GESTURE_DETECTED = 0,
36 };
37
38 static const Eldbus_Signal _signals[] = {
39    [GESTURE_DETECTED] = {"GestureDetected", ELDBUS_ARGS({"siiiiu", NULL}), 0},
40    {NULL, ELDBUS_ARGS({NULL, NULL}), 0}
41 };
42
43 static const Eldbus_Service_Interface_Desc desc = {
44    E_A11Y_SERVICE_NAVI_IFC_NAME, NULL, _signals, NULL, NULL, NULL
45 };
46
47 void _on_get_a11y_address(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
48 {
49    const char *sock_addr;
50    const char *errname, *errmsg;
51    Eldbus_Connection *session = data;
52
53    if (eldbus_message_error_get(msg, &errname, &errmsg))
54      {
55         ERROR("GetAddress failed: %s %s", errname, errmsg);
56         return;
57      }
58
59    if (!eldbus_message_arguments_get(msg, "s", &sock_addr) || !sock_addr)
60      {
61         ERROR("Could not get A11Y Bus socket address.");
62         goto end;
63      }
64
65    if (!(conn = eldbus_address_connection_get(sock_addr)))
66      {
67         ERROR("Failed to connect to %s", sock_addr);
68         goto end;
69      }
70
71    if (!(service = eldbus_service_interface_register(conn, E_A11Y_SERVICE_NAVI_OBJ_PATH, &desc)))
72      {
73         ERROR("Failed to register %s interface", E_A11Y_SERVICE_NAVI_IFC_NAME);
74         eldbus_connection_unref(conn);
75         conn = NULL;
76         goto end;
77      }
78
79    eldbus_name_request(conn, E_A11Y_SERVICE_BUS_NAME, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, NULL, NULL);
80
81 end:
82    eldbus_connection_unref(session);
83 }
84
85 void dbus_gesture_adapter_init(void)
86 {
87    Eldbus_Connection *session;
88    Eldbus_Message *msg;
89
90    eldbus_init();
91
92    if (!(session = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION)))
93      {
94         ERROR("Unable to get session bus");
95         return;
96      }
97
98    if (!(msg = eldbus_message_method_call_new("org.a11y.Bus", "/org/a11y/bus",
99                                       "org.a11y.Bus", "GetAddress")))
100      {
101         ERROR("DBus message allocation failed");
102         goto fail_msg;
103      }
104
105    if (!eldbus_connection_send(session, msg, _on_get_a11y_address, session, -1))
106      {
107         ERROR("Message send failed");
108         goto fail_send;
109      }
110
111    return;
112
113 fail_send:
114    eldbus_message_unref(msg);
115 fail_msg:
116    eldbus_connection_unref(session);
117 }
118
119 void dbus_gesture_adapter_shutdown(void)
120 {
121    if (service) eldbus_service_object_unregister(service);
122    if (conn) eldbus_connection_unref(conn);
123
124    conn = NULL;
125    service = NULL;
126
127    eldbus_shutdown();
128 }
129
130 static const char *_gesture_enum_to_string(Gesture g)
131 {
132    switch(g)
133      {
134       case ONE_FINGER_HOVER:
135          return "OneFingerHover";
136       case TWO_FINGERS_HOVER:
137          return "TwoFingersHover";
138       case THREE_FINGERS_HOVER:
139          return "ThreeFingersHover";
140       case ONE_FINGER_FLICK_LEFT:
141          return "OneFingerFlickLeft";
142       case ONE_FINGER_FLICK_RIGHT:
143          return "OneFingerFlickRight";
144       case ONE_FINGER_FLICK_UP:
145          return "OneFingerFlickUp";
146       case ONE_FINGER_FLICK_DOWN:
147          return "OneFingerFlickDown";
148       case TWO_FINGERS_FLICK_UP:
149          return "TwoFingersFlickUp";
150       case TWO_FINGERS_FLICK_DOWN:
151          return "TwoFingersFlickDown";
152       case TWO_FINGERS_FLICK_LEFT:
153          return "TwoFingersFlickLeft";
154       case TWO_FINGERS_FLICK_RIGHT:
155          return "TwoFingersFlickRight";
156       case THREE_FINGERS_FLICK_LEFT:
157          return "ThreeFingersFlickLeft";
158       case THREE_FINGERS_FLICK_RIGHT:
159          return "ThreeFingersFlickRight";
160       case THREE_FINGERS_FLICK_UP:
161          return "ThreeFingersFlickUp";
162       case THREE_FINGERS_FLICK_DOWN:
163          return "ThreeFingersFlickDown";
164       case ONE_FINGER_SINGLE_TAP:
165          return "OneFingerSingleTap";
166       case ONE_FINGER_DOUBLE_TAP:
167          return "OneFingerDoubleTap";
168       case ONE_FINGER_TRIPLE_TAP:
169          return "OneFingerTripleTap";
170       case TWO_FINGERS_SINGLE_TAP:
171          return "TwoFingersSingleTap";
172       case TWO_FINGERS_DOUBLE_TAP:
173          return "TwoFingersDoubleTap";
174       case TWO_FINGERS_TRIPLE_TAP:
175          return "TwoFingersTripleTap";
176       case THREE_FINGERS_SINGLE_TAP:
177          return "ThreeFingersSingleTap";
178       case THREE_FINGERS_DOUBLE_TAP:
179          return "ThreeFingersDoubleTap";
180       case THREE_FINGERS_TRIPLE_TAP:
181          return "ThreeFingersTripleTap";
182       case ONE_FINGER_FLICK_LEFT_RETURN:
183          return "OneFingerFlickLeftReturn";
184       case ONE_FINGER_FLICK_RIGHT_RETURN:
185          return "OneFingerFlickRightReturn";
186       case ONE_FINGER_FLICK_UP_RETURN:
187          return "OneFingerFlickUpReturn";
188       case ONE_FINGER_FLICK_DOWN_RETURN:
189          return "OneFingerFlickDownReturn";
190       case TWO_FINGERS_FLICK_LEFT_RETURN:
191          return "TwoFingersFlickLeftReturn";
192       case TWO_FINGERS_FLICK_RIGHT_RETURN:
193          return "TwoFingersFlickRightReturn";
194       case TWO_FINGERS_FLICK_UP_RETURN:
195          return "TwoFingersFlickUpReturn";
196       case TWO_FINGERS_FLICK_DOWN_RETURN:
197          return "TwoFingersFlickDownReturn";
198       case THREE_FINGERS_FLICK_LEFT_RETURN:
199          return "ThreeFingersFlickLeftReturn";
200       case THREE_FINGERS_FLICK_RIGHT_RETURN:
201          return "ThreeFingersFlickRightReturn";
202       case THREE_FINGERS_FLICK_UP_RETURN:
203          return "ThreeFingersFlickUpReturn";
204       case THREE_FINGERS_FLICK_DOWN_RETURN:
205          return "ThreeFingersFlickDownReturn";
206       default:
207          ERROR("unhandled gesture enum");
208          return NULL;
209      }
210 }
211
212 void dbus_gesture_adapter_emit(const Gesture_Info *info)
213 {
214    const char *name;
215
216    if (!service)
217      return;
218
219    name = _gesture_enum_to_string(info->type);
220    if (!name)
221      return;
222
223    if (!eldbus_service_signal_emit(service, GESTURE_DETECTED, name, info->x_beg, info->y_beg,
224                                    info->x_end, info->y_end, info->state))
225      {
226         ERROR("Unable to send GestureDetected signal");
227      }
228    else
229      DEBUG("Successfullt send GestureDetected singal");
230 }