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