a3039c574e2df8286363e821dbea9f0581c38002
[apps/agl-service-homescreen.git] / src / homescreen.cpp
1 /*
2  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #ifndef _GNU_SOURCE
18 #define _GNU_SOURCE
19 #endif
20 #include <memory>
21 #include <algorithm>
22 #include "hs-helper.h"
23 #include "hmi-debug.h"
24 #include "hs-clientmanager.h"
25
26 #define EVENT_SUBSCRIBE_ERROR_CODE 100
27
28 const char _error[] = "error";
29 const char _application_name[] = "application_name";
30 const char _display_message[] = "display_message";
31 const char _reply_message[] = "reply_message";
32
33 static HS_ClientManager* g_client_manager = HS_ClientManager::instance();
34
35 /*
36 ********** Method of HomeScreen Service (API) **********
37 */
38
39 static void pingSample(struct afb_req request)
40 {
41    static int pingcount = 0;
42    afb_req_success_f(request, json_object_new_int(pingcount), "Ping count = %d", pingcount);
43    HMI_NOTICE("homescreen-service","Verbosity macro at level notice invoked at ping invocation count = %d", pingcount);
44    pingcount++;
45 }
46
47 /**
48  * tap_shortcut notify for homescreen
49  * When Shortcut area is tapped,  notify these applciations
50  *
51  * #### Parameters
52  * Request key
53  * - application_name   : application name
54  *
55  * #### Return
56  * None
57  *
58  */
59 static void tap_shortcut (struct afb_req request)
60 {
61     HMI_NOTICE("homescreen-service","called.");
62
63     int ret = 0;
64     const char* value = afb_req_value(request, _application_name);
65     if (value) {
66       HMI_NOTICE("homescreen-service","request params = %s.", value);
67       // first step get appid from appname, next step change appname to appid
68       std::string appid(value);
69       std::transform(appid.begin(), appid.end(), appid.begin(), ::tolower);
70       HS_Client* client = g_client_manager->find(appid);
71       if(client != nullptr) {
72         if(client->tap_shortcut(value) != 0) {
73           afb_req_fail_f(request, "afb_event_push failed", "called %s.", __FUNCTION__);
74           return;
75         }
76       }
77       else {
78           // app is not started, do nothing
79       }
80     } else {
81       afb_req_fail_f(request, "failed", "called %s, Unknown palameter", __FUNCTION__);
82       return;
83     }
84
85   // response to HomeScreen
86     struct json_object *res = json_object_new_object();
87     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
88       _error,  ret);
89     afb_req_success(request, res, "afb_event_push event [tap_shortcut]");
90 }
91
92 /**
93  * HomeScreen OnScreen message
94  *
95  * #### Parameters
96  * Request key
97  * - display_message   : message for display
98  *
99  * #### Return
100  * None
101  *
102  */
103 static void on_screen_message (struct afb_req request)
104 {
105     HMI_NOTICE("homescreen-service","called.");
106
107     int ret = 0;
108     const char* value = afb_req_value(request, _display_message);
109     if (value) {
110
111       HMI_NOTICE("homescreen-service","request params = %s.", value);
112       for(auto m : g_client_manager->getAllClient()) {
113         if(m->on_screen_message(request, value) != 0) {
114           afb_req_fail_f(request, "afb_event_push failed", "called %s.", __FUNCTION__);
115           return;
116         }
117       }
118     } else {
119       afb_req_fail_f(request, "failed", "called %s, Unknown palameter", __FUNCTION__);
120       return;
121     }
122
123   // response to HomeScreen
124     struct json_object *res = json_object_new_object();
125     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
126       _error,  ret);
127     afb_req_success(request, res, "afb_event_push event [on_screen_message]");
128 }
129
130 /**
131  * HomeScreen OnScreen Reply
132  *
133  * #### Parameters
134  * Request key
135  * - reply_message   : message for reply
136  *
137  * #### Return
138  * None
139  *
140  */
141 static void on_screen_reply (struct afb_req request)
142 {
143     HMI_NOTICE("homescreen-service","called.");
144
145     int ret = 0;
146     const char* value = afb_req_value(request, _reply_message);
147     if (value) {
148
149       HMI_NOTICE("homescreen-service","request params = %s.", value);
150       for(auto m : g_client_manager->getAllClient()) {
151         if(m->on_screen_reply(request, value) != 0) {
152           afb_req_fail_f(request, "afb_event_push failed", "called %s.", __FUNCTION__);
153           return;
154         }
155       }
156     } else {
157       afb_req_fail_f(request, "failed", "called %s, Unknown palameter", __FUNCTION__);
158       return;
159     }
160
161   // response to HomeScreen
162     struct json_object *res = json_object_new_object();
163     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
164       _error,  ret);
165     afb_req_success(request, res, "afb_event_push event [on_screen_reply]");
166 }
167
168 /**
169  * Subscribe event
170  *
171  * #### Parameters
172  *  - event  : Event name. Event list is written in libhomescreen.cpp
173  *
174  * #### Return
175  * None
176  *
177  */
178 static void subscribe(struct afb_req request)
179 {
180     const char *value = afb_req_value(request, "event");
181     HMI_NOTICE("homescreen-service","value is %s", value);
182     int ret = 0;
183     if(value) {
184         std::string appid(afb_req_get_application_id(request));
185         std::transform(appid.begin(), appid.end(), appid.begin(), ::tolower);
186         if(g_client_manager->getClient(request, appid)->subscribe(request, value) != 0) {
187           afb_req_fail_f(request, "afb_req_subscribe failed", "called %s.", __FUNCTION__);
188           return;
189         }
190     }
191     else {
192         HMI_NOTICE("homescreen-service","Please input event name");
193         ret = EVENT_SUBSCRIBE_ERROR_CODE;
194     }
195     /*create response json object*/
196     struct json_object *res = json_object_new_object();
197     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
198         _error, ret);
199     afb_req_success_f(request, res, "homescreen binder subscribe event name [%s]", value);
200 }
201
202 /**
203  * Unsubscribe event
204  *
205  * #### Parameters
206  *  - event  : Event name. Event list is written in libhomescreen.cpp
207  *
208  * #### Return
209  * None
210  *
211  */
212 static void unsubscribe(struct afb_req request)
213 {
214     const char *value = afb_req_value(request, "event");
215     HMI_NOTICE("homescreen-service","value is %s", value);
216     int ret = 0;
217     if(value) {
218         std::string appid(afb_req_get_application_id(request));
219         std::transform(appid.begin(), appid.end(), appid.begin(), ::tolower);
220         HS_Client* client = g_client_manager->find(appid);
221         if(client != nullptr) {
222             if(client->unsubscribe(request, value) != 0) {
223                 afb_req_fail_f(request, "afb_req_unsubscribe failed", "called %s.", __FUNCTION__);
224                 return;
225             }
226         }
227         else {
228             HMI_NOTICE("homescreen-service","not find app's client, unsubscribe failed");
229             ret = EVENT_SUBSCRIBE_ERROR_CODE;
230         }
231     }
232     else{
233         HMI_NOTICE("homescreen-service","Please input event name");
234         ret = EVENT_SUBSCRIBE_ERROR_CODE;
235     }
236     /*create response json object*/
237     struct json_object *res = json_object_new_object();
238     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
239         _error, ret);
240     afb_req_success_f(request, res, "homescreen binder unsubscribe event name [%s]", value);
241 }
242
243 /*
244  * array of the verbs exported to afb-daemon
245  */
246 static const struct afb_verb_v2 verbs[]= {
247     /* VERB'S NAME                 FUNCTION TO CALL               authorisation     some info         SESSION MANAGEMENT                                    */
248     { .verb = "ping",              .callback = pingSample,        .auth = NULL,     .info = NULL,     .session = AFB_SESSION_NONE     },
249     { .verb = "tap_shortcut",      .callback = tap_shortcut,      .auth = NULL,     .info = NULL,     .session = AFB_SESSION_NONE     },
250     { .verb = "on_screen_message", .callback = on_screen_message, .auth = NULL,     .info = NULL,     .session = AFB_SESSION_NONE     },
251     { .verb = "on_screen_reply",   .callback = on_screen_reply,   .auth = NULL,     .info = NULL,     .session = AFB_SESSION_NONE     },
252     { .verb = "subscribe",         .callback = subscribe,         .auth = NULL,     .info = NULL,     .session = AFB_SESSION_NONE     },
253     { .verb = "unsubscribe",       .callback = unsubscribe,       .auth = NULL,     .info = NULL,     .session = AFB_SESSION_NONE     },
254     {NULL } /* marker for end of the array */
255 };
256
257 /**
258  * homescreen binding preinit function
259  *
260  * #### Parameters
261  *  - null
262  *
263  * #### Return
264  * None
265  *
266  */
267 static int preinit()
268 {
269    HMI_NOTICE("homescreen-service","binding preinit (was register)");
270    return 0;
271 }
272
273 /**
274  * homescreen binding init function
275  *
276  * #### Parameters
277  *  - null
278  *
279  * #### Return
280  * None
281  *
282  */
283 static int init()
284 {
285     HMI_NOTICE("homescreen-service","binding init");
286
287     g_client_manager->init();
288
289     return 0;
290 }
291
292 /**
293  * homescreen binding event function
294  *
295  * #### Parameters
296  *  - event  : event name
297  *  - object : event json object
298  *
299  * #### Return
300  * None
301  *
302  */
303 static void onevent(const char *event, struct json_object *object)
304 {
305    HMI_NOTICE("homescreen-service","on_event %s", event);
306 }
307
308 const struct afb_binding_v2 afbBindingV2 = {
309     .api = "homescreen",
310     .specification = NULL,
311     .info = NULL,
312     .verbs = verbs,
313     .preinit = preinit,
314     .init = init,
315     .onevent = onevent
316 };