Improve HS_ClientManager and fix issue
[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_name[] = "application_name";
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_name   : application name
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 = g_client_manager->tap_shortcut(request);
62     if (ret != 0) {
63       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
64       return;
65     }
66
67     // response to HomeScreen
68     struct json_object *res = json_object_new_object();
69     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
70       _error,  ret);
71     afb_req_success(request, res, "afb_event_push event [tap_shortcut]");
72 }
73
74 /**
75  * HomeScreen OnScreen message
76  *
77  * #### Parameters
78  * Request key
79  * - display_message   : message for display
80  *
81  * #### Return
82  * None
83  *
84  */
85 static void on_screen_message (afb_req_t request)
86 {
87     HMI_NOTICE("homescreen-service","called.");
88
89     int ret = g_client_manager->on_screen_message(request);
90     if (ret != 0) {
91       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__);
92       return;
93     }
94
95   // response to HomeScreen
96     struct json_object *res = json_object_new_object();
97     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
98       _error,  ret);
99     afb_req_success(request, res, "afb_event_push event [on_screen_message]");
100 }
101
102 /**
103  * HomeScreen OnScreen Reply
104  *
105  * #### Parameters
106  * Request key
107  * - reply_message   : message for reply
108  *
109  * #### Return
110  * None
111  *
112  */
113 static void on_screen_reply (afb_req_t request)
114 {
115     HMI_NOTICE("homescreen-service","called.");
116
117     int ret = g_client_manager->on_screen_reply(request);
118     if (ret != 0) {
119       afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __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_reply]");
128 }
129
130 /**
131  * Subscribe event
132  *
133  * #### Parameters
134  *  - event  : Event name. Event list is written in libhomescreen.cpp
135  *
136  * #### Return
137  * None
138  *
139  */
140 static void subscribe(afb_req_t request)
141 {
142     HMI_NOTICE("homescreen-service","called.");
143
144     int ret = g_client_manager->subscribe(request);
145     if(ret) {
146       afb_req_fail_f(request, "afb_req_subscribe failed", "called %s.", __FUNCTION__);
147       return;
148     }
149
150     /*create response json object*/
151     struct json_object *res = json_object_new_object();
152     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
153         _error, ret);
154     afb_req_success_f(request, res, "homescreen binder subscribe.");
155 }
156
157 /**
158  * Unsubscribe event
159  *
160  * #### Parameters
161  *  - event  : Event name. Event list is written in libhomescreen.cpp
162  *
163  * #### Return
164  * None
165  *
166  */
167 static void unsubscribe(afb_req_t request)
168 {
169     HMI_NOTICE("homescreen-service","called.");
170
171     int ret = g_client_manager->unsubscribe(request);
172     if(ret) {
173       afb_req_fail_f(request, "afb_req_unsubscribe failed", "called %s.", __FUNCTION__);
174       return;
175     }
176
177     /*create response json object*/
178     struct json_object *res = json_object_new_object();
179     hs_add_object_to_json_object_func(res, __FUNCTION__, 2,
180         _error, ret);
181     afb_req_success_f(request, res, "homescreen binder unsubscribe success.");
182 }
183
184 /*
185  * array of the verbs exported to afb-daemon
186  */
187 static const afb_verb_t verbs[]= {
188     /* VERB'S NAME                 FUNCTION TO CALL                  */
189     { .verb="ping",              .callback=pingSample             },
190     { .verb="tap_shortcut",      .callback=tap_shortcut           },
191     { .verb="on_screen_message", .callback=on_screen_message      },
192     { .verb="on_screen_reply",   .callback=on_screen_reply        },
193     { .verb="subscribe",         .callback=subscribe              },
194     { .verb="unsubscribe",       .callback=unsubscribe            },
195     {NULL } /* marker for end of the array */
196 };
197
198 /**
199  * homescreen binding preinit function
200  *
201  * #### Parameters
202  *  - api : the api serving the request
203  *
204  * #### Return
205  * None
206  *
207  */
208 static int preinit(afb_api_t api)
209 {
210    HMI_NOTICE("homescreen-service","binding preinit (was register)");
211    return 0;
212 }
213
214 /**
215  * homescreen binding init function
216  *
217  * #### Parameters
218  *  - api : the api serving the request
219  *
220  * #### Return
221  * None
222  *
223  */
224 static int init(afb_api_t api)
225 {
226     HMI_NOTICE("homescreen-service","binding init");
227
228     g_client_manager->init();
229
230     return 0;
231 }
232
233 /**
234  * homescreen binding event function
235  *
236  * #### Parameters
237  *  - api : the api serving the request
238  *  - event  : event name
239  *  - object : event json object
240  *
241  * #### Return
242  * None
243  *
244  */
245 static void onevent(afb_api_t api, const char *event, struct json_object *object)
246 {
247    HMI_NOTICE("homescreen-service","on_event %s", event);
248 }
249
250 const afb_binding_t afbBindingExport = {
251     .api = "homescreen",
252     .specification = NULL,
253     .info = NULL,
254     .verbs = verbs,
255     .preinit = preinit,
256     .init = init,
257     .onevent = onevent
258 };