0f6a10db33d844ceef1e30999ba3a675e81d7c85
[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     if (ret != 0) {
238       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
239       return;
240     }
241
242     // response to HomeScreen
243     struct json_object *res = json_object_new_object();
244     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
245       _error,  ret);
246     afb_req_success(request, res, "afb_event_push event [showWindow]");
247 }
248
249 /**
250  * hideWindow event
251  *
252  * #### Parameters
253  *  - request : the request
254  *
255  * #### Return
256  * None
257  *
258  */
259 static void hideWindow(afb_req_t request)
260 {
261     HMI_NOTICE("homescreen-service","called.");
262
263     int ret = g_hs_instance->client_manager->hideWindow(request);
264     if (ret != 0) {
265       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
266       return;
267     }
268
269     // response to HomeScreen
270     struct json_object *res = json_object_new_object();
271     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
272       _error,  ret);
273     afb_req_success(request, res, "afb_event_push event [hideWindow]");
274 }
275
276 /**
277  * replyShowWindow event
278  *
279  * #### Parameters
280  *  - request : the request
281  *
282  * #### Return
283  *  None
284  *
285  */
286 static void replyShowWindow(afb_req_t request)
287 {
288     HMI_NOTICE("homescreen-service","called.");
289
290     int ret = g_hs_instance->client_manager->replyShowWindow(request);
291     if (ret != 0) {
292       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
293       return;
294     }
295
296     // response to HomeScreen
297     struct json_object *res = json_object_new_object();
298     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
299       _error,  ret);
300     afb_req_success(request, res, "afb_event_push event [replyShowWindow]");
301 }
302
303 /**
304  * showNotification event
305  *
306  * the contents to homescreen which display at top area.
307  *
308  * #### Parameters
309  *  - request : the request
310  *
311  * #### Return
312  * None
313  *
314  */
315 static void showNotification(afb_req_t request)
316 {
317     HMI_NOTICE("homescreen-service","called.");
318
319     int ret = g_hs_instance->client_manager->showNotification(request);
320     if (ret != 0) {
321       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
322       return;
323     }
324
325     // response to Application
326     struct json_object *res = json_object_new_object();
327     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
328       _error,  ret);
329     afb_req_success(request, res, "afb_event_push event [showNotification]");
330 }
331
332 /**
333  * showInformation event
334  *
335  * the contents to homescreen which display at bottom area.
336  *
337  * #### Parameters
338  *  - request : the request
339  *
340  * #### Return
341  * None
342  *
343  */
344 static void showInformation(afb_req_t request)
345 {
346     HMI_NOTICE("homescreen-service","called.");
347
348     int ret = g_hs_instance->client_manager->showInformation(request);
349     if (ret != 0) {
350       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
351       return;
352     }
353
354     // response to Application
355     struct json_object *res = json_object_new_object();
356     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
357       _error,  ret);
358     afb_req_success(request, res, "afb_event_push event [showInformation]");
359 }
360
361 /*
362  * array of the verbs exported to afb-daemon
363  */
364 static const afb_verb_t verbs[]= {
365     /* VERB'S NAME                 FUNCTION TO CALL                  */
366     { .verb="ping",              .callback=pingSample             },
367     { .verb="tap_shortcut",      .callback=tap_shortcut           },
368     { .verb="showWindow",        .callback=showWindow             },
369     { .verb="hideWindow",        .callback=hideWindow             },
370     { .verb="replyShowWindow",   .callback=replyShowWindow        },
371     { .verb="on_screen_message", .callback=on_screen_message      },
372     { .verb="on_screen_reply",   .callback=on_screen_reply        },
373     { .verb="subscribe",         .callback=subscribe              },
374     { .verb="unsubscribe",       .callback=unsubscribe            },
375     { .verb="showNotification",  .callback=showNotification       },
376     { .verb="showInformation",   .callback=showInformation        },
377     {NULL } /* marker for end of the array */
378 };
379
380 /**
381  * homescreen binding preinit function
382  *
383  * #### Parameters
384  *  - api : the api serving the request
385  *
386  * #### Return
387  * None
388  *
389  */
390 static int preinit(afb_api_t api)
391 {
392    HMI_NOTICE("homescreen-service","binding preinit (was register)");
393    return 0;
394 }
395
396 /**
397  * homescreen binding init function
398  *
399  * #### Parameters
400  *  - api : the api serving the request
401  *
402  * #### Return
403  * None
404  *
405  */
406 static int init(afb_api_t api)
407 {
408     HMI_NOTICE("homescreen-service","binding init");
409
410     // g_client_manager->init();
411     if(g_hs_instance != nullptr) {
412         HMI_WARNING("homescreen-service", "g_hs_instance isn't null.");
413         delete g_hs_instance->client_manager;
414         delete g_hs_instance->periphery_manager;
415         delete g_hs_instance;
416         g_hs_instance = nullptr;
417     }
418     g_hs_instance = new hs_instance();
419     if(g_hs_instance == nullptr) {
420         HMI_ERROR("homescreen-service", "Fatal Error: new g_hs_instance failed.");
421         return -1;
422     }
423
424     return g_hs_instance->init(api);
425 }
426
427 /**
428  * homescreen binding event function
429  *
430  * #### Parameters
431  *  - api : the api serving the request
432  *  - event  : event name
433  *  - object : event json object
434  *
435  * #### Return
436  * None
437  *
438  */
439 static void onevent(afb_api_t api, const char *event, struct json_object *object)
440 {
441    HMI_NOTICE("homescreen-service","on_event %s", event);
442    g_hs_instance->periphery_manager->onEvent(api, event, object);
443 }
444
445 const afb_binding_t afbBindingExport = {
446     .api = "homescreen",
447     .specification = NULL,
448     .info = NULL,
449     .verbs = verbs,
450     .preinit = preinit,
451     .init = init,
452     .onevent = onevent
453 };