e921febc4554b14271f811a1e501960dca5fc15c
[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
27 const char _error[] = "error";
28 const char _application_id[] = "application_id";
29 const char _display_message[] = "display_message";
30 const char _reply_message[] = "reply_message";
31
32 static HS_ClientManager* g_client_manager = HS_ClientManager::instance();
33
34 /*
35 ********** Method of HomeScreen Service (API) **********
36 */
37
38 static void pingSample(afb_req_t request)
39 {
40    static int pingcount = 0;
41    afb_req_success_f(request, json_object_new_int(pingcount), "Ping count = %d", pingcount);
42    HMI_NOTICE("homescreen-service","Verbosity macro at level notice invoked at ping invocation count = %d", pingcount);
43    pingcount++;
44 }
45
46 /**
47  * tap_shortcut notify for homescreen
48  * When Shortcut area is tapped,  notify these applciations
49  *
50  * #### Parameters
51  * Request key
52  * - application_id   : application id
53  *
54  * #### Return
55  * None
56  *
57  */
58 static void tap_shortcut (afb_req_t request)
59 {
60     HMI_NOTICE("homescreen-service","called.");
61     int ret = 0;
62     const char* value = afb_req_value(request, _application_id);
63     if (value) {
64         HMI_NOTICE("homescreen-service","request appid = %s.", value);
65         ret = g_client_manager->handleRequest(request, __FUNCTION__, value);
66     }
67     else {
68         ret = AFB_EVENT_BAD_REQUEST;
69     }
70
71     if (ret) {
72         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
73     }
74     else {
75         struct json_object *res = json_object_new_object();
76         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
77           _error,  ret);
78         afb_req_success(request, res, "afb_event_push event [tap_shortcut]");
79     }
80 }
81
82 /**
83  * HomeScreen OnScreen message
84  *
85  * #### Parameters
86  * Request key
87  * - display_message   : message for display
88  *
89  * #### Return
90  * None
91  *
92  */
93 static void on_screen_message (afb_req_t request)
94 {
95     HMI_NOTICE("homescreen-service","called.");
96     int ret = g_client_manager->handleRequest(request, __FUNCTION__);
97     if (ret) {
98         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
99     }
100     else {
101         struct json_object *res = json_object_new_object();
102         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
103           _error,  ret);
104         afb_req_success(request, res, "afb_event_push event [on_screen_message]");
105     }
106 }
107
108 /**
109  * HomeScreen OnScreen Reply
110  *
111  * #### Parameters
112  * Request key
113  * - reply_message   : message for reply
114  *
115  * #### Return
116  * None
117  *
118  */
119 static void on_screen_reply (afb_req_t request)
120 {
121     HMI_NOTICE("homescreen-service","called.");
122     int ret = g_client_manager->handleRequest(request, __FUNCTION__);
123     if (ret) {
124         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
125     }
126     else {
127         struct json_object *res = json_object_new_object();
128         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
129           _error,  ret);
130         afb_req_success(request, res, "afb_event_push event [on_screen_reply]");
131     }
132 }
133
134 /**
135  * Subscribe event
136  *
137  * #### Parameters
138  *  - event  : Event name. Event list is written in libhomescreen.cpp
139  *
140  * #### Return
141  * None
142  *
143  */
144 static void subscribe(afb_req_t request)
145 {
146     HMI_NOTICE("homescreen-service","called.");
147     int ret = 0;
148     std::string req_appid = std::move(get_application_id(request));
149     if(!req_appid.empty()) {
150         ret = g_client_manager->handleRequest(request, __FUNCTION__, req_appid.c_str());
151     }
152     else {
153         ret = AFB_EVENT_BAD_REQUEST;
154     }
155
156     if(ret) {
157         afb_req_fail_f(request, "afb_req_subscribe failed", "called %s.", __FUNCTION__);
158     }
159     else {
160         struct json_object *res = json_object_new_object();
161         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
162             _error, ret);
163         afb_req_success_f(request, res, "homescreen binder subscribe.");
164     }
165 }
166
167 /**
168  * Unsubscribe event
169  *
170  * #### Parameters
171  *  - event  : Event name. Event list is written in libhomescreen.cpp
172  *
173  * #### Return
174  * None
175  *
176  */
177 static void unsubscribe(afb_req_t request)
178 {
179     HMI_NOTICE("homescreen-service","called.");
180     int ret = 0;
181     std::string req_appid = std::move(get_application_id(request));
182     if(!req_appid.empty()) {
183         ret = g_client_manager->handleRequest(request, __FUNCTION__, req_appid.c_str());
184     }
185     else {
186         ret = AFB_EVENT_BAD_REQUEST;
187     }
188
189     if(ret) {
190         afb_req_fail_f(request, "afb_req_unsubscribe failed", "called %s.", __FUNCTION__);
191     }
192     else {
193         struct json_object *res = json_object_new_object();
194         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
195             _error, ret);
196         afb_req_success_f(request, res, "homescreen binder unsubscribe success.");
197     }
198 }
199
200 /**
201  * showWindow event
202  *
203  * #### Parameters
204  *  - request : the request
205  *
206  * #### Return
207  * None
208  *
209  */
210 static void showWindow(afb_req_t request)
211 {
212     HMI_NOTICE("homescreen-service","called.");
213     int ret = 0;
214     const char* value = afb_req_value(request, _application_id);
215     if (value) {
216         ret = g_client_manager->handleRequest(request, __FUNCTION__, value);
217     }
218     else {
219         ret = AFB_EVENT_BAD_REQUEST;
220     }
221
222     if (ret) {
223         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
224     }
225     else {
226         struct json_object *res = json_object_new_object();
227         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
228           _error,  ret);
229         afb_req_success(request, res, "afb_event_push event [showWindow]");
230     }
231 }
232
233 /**
234  * hideWindow event
235  *
236  * #### Parameters
237  *  - request : the request
238  *
239  * #### Return
240  * None
241  *
242  */
243 static void hideWindow(afb_req_t request)
244 {
245     HMI_NOTICE("homescreen-service","called.");
246     int ret = 0;
247     const char* value = afb_req_value(request, _application_id);
248     if (value) {
249         ret = g_client_manager->handleRequest(request, __FUNCTION__, value);
250     }
251     else {
252         ret = AFB_EVENT_BAD_REQUEST;
253     }
254
255     if (ret) {
256         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
257     }
258     else {
259         struct json_object *res = json_object_new_object();
260         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
261           _error,  ret);
262         afb_req_success(request, res, "afb_event_push event [hideWindow]");
263     }
264 }
265
266 /**
267  * replyShowWindow event
268  *
269  * #### Parameters
270  *  - request : the request
271  *
272  * #### Return
273  *  None
274  *
275  */
276 static void replyShowWindow(afb_req_t request)
277 {
278     HMI_NOTICE("homescreen-service","called.");
279     int ret = 0;
280     const char* value = afb_req_value(request, _application_id);
281     if (value) {
282         ret = g_client_manager->handleRequest(request, __FUNCTION__, value);
283     }
284     else {
285         ret = AFB_EVENT_BAD_REQUEST;
286     }
287
288     if (ret) {
289         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
290     }
291     else {
292         struct json_object *res = json_object_new_object();
293         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
294           _error,  ret);
295         afb_req_success(request, res, "afb_event_push event [replyShowWindow]");
296     }
297 }
298
299 /**
300  * showNotification event
301  *
302  * the contents to homescreen which display at top area.
303  *
304  * #### Parameters
305  *  - request : the request
306  *
307  * #### Return
308  * None
309  *
310  */
311 static void showNotification(afb_req_t request)
312 {
313     HMI_NOTICE("homescreen-service","called.");
314     int ret = g_client_manager->handleRequest(request, __FUNCTION__, "homescreen");
315     if (ret) {
316         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
317     }
318     else {
319         struct json_object *res = json_object_new_object();
320         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
321           _error,  ret);
322         afb_req_success(request, res, "afb_event_push event [showNotification]");
323     }
324 }
325
326 /**
327  * showInformation event
328  *
329  * the contents to homescreen which display at bottom area.
330  *
331  * #### Parameters
332  *  - request : the request
333  *
334  * #### Return
335  * None
336  *
337  */
338 static void showInformation(afb_req_t request)
339 {
340     HMI_NOTICE("homescreen-service","called.");
341     int ret = g_client_manager->handleRequest(request,  __FUNCTION__, "homescreen");
342     if (ret) {
343         afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
344     }
345     else {
346         struct json_object *res = json_object_new_object();
347         hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
348           _error,  ret);
349         afb_req_success(request, res, "afb_event_push event [showInformation]");
350     }
351 }
352
353 /*
354  * array of the verbs exported to afb-daemon
355  */
356 static const afb_verb_t verbs[]= {
357     /* VERB'S NAME                 FUNCTION TO CALL                  */
358     { .verb="ping",              .callback=pingSample             },
359     { .verb="tap_shortcut",      .callback=tap_shortcut           },
360     { .verb="showWindow",        .callback=showWindow             },
361     { .verb="hideWindow",        .callback=hideWindow             },
362     { .verb="replyShowWindow",   .callback=replyShowWindow        },
363     { .verb="on_screen_message", .callback=on_screen_message      },
364     { .verb="on_screen_reply",   .callback=on_screen_reply        },
365     { .verb="subscribe",         .callback=subscribe              },
366     { .verb="unsubscribe",       .callback=unsubscribe            },
367     { .verb="showNotification",  .callback=showNotification       },
368     { .verb="showInformation",   .callback=showInformation        },
369     {NULL } /* marker for end of the array */
370 };
371
372 /**
373  * homescreen binding preinit function
374  *
375  * #### Parameters
376  *  - api : the api serving the request
377  *
378  * #### Return
379  * None
380  *
381  */
382 static int preinit(afb_api_t api)
383 {
384    HMI_NOTICE("homescreen-service","binding preinit (was register)");
385    return 0;
386 }
387
388 /**
389  * homescreen binding init function
390  *
391  * #### Parameters
392  *  - api : the api serving the request
393  *
394  * #### Return
395  * None
396  *
397  */
398 static int init(afb_api_t api)
399 {
400     HMI_NOTICE("homescreen-service","binding init");
401
402     g_client_manager->init();
403
404     return 0;
405 }
406
407 /**
408  * homescreen binding event function
409  *
410  * #### Parameters
411  *  - api : the api serving the request
412  *  - event  : event name
413  *  - object : event json object
414  *
415  * #### Return
416  * None
417  *
418  */
419 static void onevent(afb_api_t api, const char *event, struct json_object *object)
420 {
421    HMI_NOTICE("homescreen-service","on_event %s", event);
422 }
423
424 const afb_binding_t afbBindingExport = {
425     .api = "homescreen",
426     .specification = NULL,
427     .info = NULL,
428     .verbs = verbs,
429     .preinit = preinit,
430     .init = init,
431     .onevent = onevent
432 };