X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fhs-client.cpp;h=7b631ebd88bba6466442fc7e6e67f3b7b9de0272;hb=aa43a07d4e86421aefec8c603018d14f5e249087;hp=807b068de094cf2b0fe7cecbc3d885d36d0d6dea;hpb=ea459cc8988c3e664c3f9d56d3a9929775d8b57b;p=apps%2Fagl-service-homescreen.git diff --git a/src/hs-client.cpp b/src/hs-client.cpp index 807b068..7b631eb 100644 --- a/src/hs-client.cpp +++ b/src/hs-client.cpp @@ -14,11 +14,33 @@ * limitations under the License. */ +#include #include "hs-client.h" #include "hs-helper.h" -#include "hmi-debug.h" +static const char _event[] = "event"; static const char _type[] = "type"; +static const char _text[] = "text"; +static const char _info[] = "info"; +static const char _icon[] = "icon"; +static const char _parameter[] = "parameter"; +static const char _replyto[] = "replyto"; +static const char _caller[] = "caller"; + +// homescreen-service event and event handler function list +const std::unordered_map HS_Client::func_list { + {"tap_shortcut", &HS_Client::tap_shortcut}, + {"showWindow", &HS_Client::showWindow}, + {"hideWindow", &HS_Client::hideWindow}, + {"replyShowWindow", &HS_Client::replyShowWindow}, + {"on_screen_message", &HS_Client::on_screen_message}, + {"on_screen_reply", &HS_Client::on_screen_reply}, + {"subscribe", &HS_Client::subscribe}, + {"unsubscribe", &HS_Client::unsubscribe}, + {"showNotification", &HS_Client::showNotification}, + {"showInformation", &HS_Client::showInformation}, + {"application-list-changed", nullptr} +}; /** * HS_Client construction function @@ -30,10 +52,9 @@ static const char _type[] = "type"; * None * */ -HS_Client::HS_Client(struct afb_req request, std::string id) : my_id(id) +HS_Client::HS_Client(afb_req_t request, std::string id) : my_id(id) { - HMI_NOTICE("homescreen-service","called."); - my_event = afb_daemon_make_event(id.c_str()); + my_event = afb_api_make_event(request->api, id.c_str()); } /** @@ -48,7 +69,6 @@ HS_Client::HS_Client(struct afb_req request, std::string id) : my_id(id) */ HS_Client::~HS_Client() { - HMI_NOTICE("homescreen-service","called."); afb_event_unref(my_event); } @@ -56,106 +76,325 @@ HS_Client::~HS_Client() * push tap_shortcut event * * #### Parameters - * - appname: app's name. + * - request : the request * * #### Return - * result + * 0 : success + * others : fail * */ -int HS_Client::tap_shortcut(const char* appname) +int HS_Client::tap_shortcut(afb_req_t request) { - if(!checkEvent(__FUNCTION__)) - return 0; - - HMI_NOTICE("homescreen-service","%s application_name = %s.", __FUNCTION__, appname); + AFB_INFO("request appid = %s.", my_id.c_str()); struct json_object* push_obj = json_object_new_object(); - hs_add_object_to_json_object_str( push_obj, 4, _application_name, appname, + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); - return afb_event_push(my_event, push_obj); + afb_event_push(my_event, push_obj); + return 0; } /** * push on_screen_message event * * #### Parameters - * - message: post message. + * - request : the request * * #### Return - * result + * 0 : success + * others : fail * */ -int HS_Client::on_screen_message(struct afb_req request, const char* message) +int HS_Client::on_screen_message(afb_req_t request) { - if(!checkEvent(__FUNCTION__)) - return 0; + int ret = 0; + const char* value = afb_req_value(request, _display_message); + if (value) { + AFB_INFO("push %s event message [%s].", __FUNCTION__, value); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _display_message, value, + _type, __FUNCTION__); + afb_event_push(my_event, push_obj); + } + else { + AFB_WARNING("Please input display_message"); + ret = AFB_EVENT_BAD_REQUEST; + } + return ret; +} - HMI_NOTICE("homescreen-service","push %s event message [%s].", __FUNCTION__, message); +/** + * push on_screen_reply event + * + * #### Parameters + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::on_screen_reply(afb_req_t request) +{ + int ret = 0; + const char* value = afb_req_value(request, _reply_message); + if (value) { + AFB_INFO("push %s event message [%s].", __FUNCTION__, value); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _reply_message, value, + _type, __FUNCTION__); + afb_event_push(my_event, push_obj); + } + else { + AFB_WARNING("Please input reply_message"); + ret = AFB_EVENT_BAD_REQUEST; + } + return ret; +} + +/** + * subscribe event + * + * #### Parameters + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::subscribe(afb_req_t request) +{ + int ret = 0; + const char *value = afb_req_value(request, _event); + if(value) { + AFB_INFO("subscribe event %s", value); + if(!isSupportEvent(value)) { + AFB_WARNING("subscibe event isn't existing."); + ret = AFB_EVENT_BAD_REQUEST; + } + else { + event_list.insert(std::string(value)); + if(!subscription) { + ret = afb_req_subscribe(request, my_event); + if(ret == 0) { + subscription = true; + } + } + } + } + else { + AFB_WARNING("Please input event name"); + ret = AFB_EVENT_BAD_REQUEST; + } + return ret; +} + +/** + * unsubscribe event + * + * #### Parameters + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::unsubscribe(afb_req_t request) +{ + int ret = 0; + const char *value = afb_req_value(request, _event); + if(value) { + AFB_INFO("unsubscribe %s event", value); + event_list.erase(std::string(value)); + if(event_list.empty()) { + ret = afb_req_unsubscribe(request, my_event); + } + } + else { + AFB_WARNING("Please input event name"); + ret = AFB_EVENT_BAD_REQUEST; + } + return ret; +} + +/** + * showWindow event + * + * #### Parameters + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::showWindow(afb_req_t request) +{ + AFB_INFO("%s application_id = %s.", __FUNCTION__, my_id.c_str()); + int ret = 0; struct json_object* push_obj = json_object_new_object(); - hs_add_object_to_json_object_str( push_obj, 4, _display_message, message, - _type, __FUNCTION__); - return afb_event_push(my_event, push_obj); + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); + const char* param = afb_req_value(request, _parameter); + if(param) { + std::string req_appid = std::move(get_application_id(request)); + if(req_appid.empty()) { + AFB_WARNING("can't get application identifier"); + return AFB_REQ_GETAPPLICATIONID_ERROR; + } + + struct json_object* param_obj = json_tokener_parse(param); + json_object_object_add(param_obj, _replyto, json_object_new_string(req_appid.c_str())); + json_object_object_add(push_obj, _parameter, param_obj); + afb_event_push(my_event, push_obj); + } + else { + AFB_WARNING("please input correct parameter."); + ret = AFB_EVENT_BAD_REQUEST; + } + return ret; } /** - * push on_screen_reply event + * hideWindow event * * #### Parameters - * - message: reply message. + * - request : the request * * #### Return - * result + * 0 : success + * others : fail * */ -int HS_Client::on_screen_reply(struct afb_req request, const char* message) +int HS_Client::hideWindow(afb_req_t request) { - if(!checkEvent(__FUNCTION__)) - return 0; + std::string req_appid = std::move(get_application_id(request)); + if(req_appid.empty()) { + AFB_WARNING("can't get application identifier"); + return AFB_REQ_GETAPPLICATIONID_ERROR; + } - HMI_NOTICE("homescreen-service","push %s event message [%s].", __FUNCTION__, message); struct json_object* push_obj = json_object_new_object(); - hs_add_object_to_json_object_str( push_obj, 4, _reply_message, message, + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); - return afb_event_push(my_event, push_obj); + struct json_object* param_obj = json_object_new_object(); + json_object_object_add(param_obj, _caller, json_object_new_string(req_appid.c_str())); + json_object_object_add(push_obj, _parameter, param_obj); + afb_event_push(my_event, push_obj); + return 0; } /** - * subscribe event + * replyShowWindow event * * #### Parameters - * - event: homescreen event, tap_shortcut etc. + * - request : the request * * #### Return - * result + * 0 : success + * others : fail * */ -int HS_Client::subscribe(struct afb_req request, const char* event) +int HS_Client::replyShowWindow(afb_req_t request) { + AFB_INFO("%s application_id = %s.", __FUNCTION__, my_id.c_str()); int ret = 0; - auto ip = event_list.find(std::string(event)); - if(ip == event_list.end()) { - event_list[std::string(event)] = 0; - ret = afb_req_subscribe(request, my_event); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); + const char* param = afb_req_value(request, _parameter); + if(param) { + json_object_object_add(push_obj, _parameter, json_tokener_parse(param)); + afb_event_push(my_event, push_obj); + } + else { + AFB_WARNING("please input correct parameter."); + ret = AFB_EVENT_BAD_REQUEST; } return ret; } /** - * unsubscribe event + * showNotification event * * #### Parameters - * - event: homescreen event, tap_shortcut etc. + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::showNotification(afb_req_t request) +{ + int ret = 0; + const char *value = afb_req_value(request, _text); + if(value) { + AFB_INFO("text is %s", value); + std::string appid =std::move(get_application_id(request)); + if(appid.empty()) { + AFB_WARNING("can't get application identifier"); + return AFB_REQ_GETAPPLICATIONID_ERROR; + } + + struct json_object* param_obj = json_object_new_object(); + const char *icon = afb_req_value(request, _icon); + if(icon) { + json_object_object_add(param_obj, _icon, json_object_new_string(icon)); + json_object_object_add(param_obj, _text, json_object_new_string(value)); + json_object_object_add(param_obj, _caller, json_object_new_string(appid.c_str())); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); + json_object_object_add(push_obj, _parameter, param_obj); + afb_event_push(my_event, push_obj); + } + else { + AFB_WARNING("please input icon."); + ret = AFB_REQ_SHOWNOTIFICATION_ERROR; + } + } + else { + AFB_WARNING("please input text."); + ret = AFB_REQ_SHOWNOTIFICATION_ERROR; + } + + return ret; +} + +/** + * showInformation event + * + * #### Parameters + * - request : the request * * #### Return - * result + * 0 : success + * others : fail * */ -int HS_Client::unsubscribe(struct afb_req request, const char* event) +int HS_Client::showInformation(afb_req_t request) { int ret = 0; - event_list.erase(std::string(event)); - if(event_list.empty()) { - ret = afb_req_unsubscribe(request, my_event); + const char *value = afb_req_value(request, _info); + if(value) { + AFB_INFO("info is %s", value); + std::string appid = std::move(get_application_id(request)); + if(appid.empty()) { + AFB_WARNING("can't get application identifier"); + return AFB_REQ_GETAPPLICATIONID_ERROR; + } + + struct json_object* param_obj = json_object_new_object(); + json_object_object_add(param_obj, _info, json_object_new_string(value)); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); + json_object_object_add(push_obj, _parameter, param_obj); + afb_event_push(my_event, push_obj); } + else { + AFB_WARNING("please input information."); + ret = AFB_REQ_SHOWINFORMATION_ERROR; + } + return ret; } @@ -178,3 +417,75 @@ bool HS_Client::checkEvent(const char* event) else return true; } + +/** + * check if event is supporting + * + * #### Parameters + * - event: homescreen event, tap_shortcut etc. + * + * #### Return + * true: support + * false: not fosupportund + * + */ +bool HS_Client::isSupportEvent(const char* event) +{ + auto ip = func_list.find(std::string(event)); + if(ip == func_list.end()) + return false; + else + return true; +} + +/** + * handle homescreen event + * + * #### Parameters + * - request : the request + * - verb: request verb name + * + * #### Return + * 0: success + * others: fail + * + */ +int HS_Client::handleRequest(afb_req_t request, const char *verb) +{ + if((strcasecmp(verb, "subscribe") && strcasecmp(verb, "unsubscribe")) && !checkEvent(verb)) + return 0; + + int ret = AFB_EVENT_BAD_REQUEST; + auto ip = func_list.find(std::string(verb)); + if(ip != func_list.end() && ip->second != nullptr) { + AFB_INFO("[%s]verb found", verb); + ret = (this->*(ip->second))(request); + } + return ret; +} + +/** + * push event + * + * #### Parameters + * - event : the event want to push + * - param : the parameter contents of event + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::pushEvent(const char *event, struct json_object *param) +{ + if(!checkEvent(event)) + return 0; + + AFB_INFO("called, event=%s.",event); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, event); + if(param != nullptr) + json_object_object_add(push_obj, _parameter, param); + afb_event_push(my_event, push_obj); + return 0; +} \ No newline at end of file