From 012fb63dc2a1de79be7196b796f34d0c687d7f8c Mon Sep 17 00:00:00 2001 From: InHong Han Date: Mon, 2 Mar 2020 15:26:33 +0900 Subject: [PATCH] Add a logic for sending and receiving JSON data Change-Id: I35a22242645906d0cb4f7c4ac18df852d6f6266e --- receiver/CMakeLists.txt | 1 + receiver/inc/ft.h | 1 + receiver/src/ft.cpp | 263 ++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 246 insertions(+), 19 deletions(-) diff --git a/receiver/CMakeLists.txt b/receiver/CMakeLists.txt index 3d1e6a9..247230a 100644 --- a/receiver/CMakeLists.txt +++ b/receiver/CMakeLists.txt @@ -13,6 +13,7 @@ pkg_check_modules(pkgs_test REQUIRED dlog capi-appfw-service-application sap-client-stub-api + json-glib-1.0 ) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/receiver/inc) diff --git a/receiver/inc/ft.h b/receiver/inc/ft.h index bf25d8e..271a98f 100644 --- a/receiver/inc/ft.h +++ b/receiver/inc/ft.h @@ -30,5 +30,6 @@ gboolean initialize_sap(void); void deinitialize_sap(void); void sap_file_transfer_get_receive_filepath(char **filepath); +void request_sticker_data(const char *mode, const char *category, const char *type); #endif /* __FT_H__ */ diff --git a/receiver/src/ft.cpp b/receiver/src/ft.cpp index 7676b2e..49734f1 100644 --- a/receiver/src/ft.cpp +++ b/receiver/src/ft.cpp @@ -29,51 +29,129 @@ #include #include #include +#include +#include "ft.h" #include "log.h" #include "sticker_info.h" #define ACCESSORY_SERVICE_PROFILE_ID "/sample/filetransfersender" +#define ACCESSORY_SERVICE_CHANNEL_ID 107 + +#define STICKER_SYNC_START_REQ "sticker-sync-start-req" +#define STICKER_SYNC_START_RSP "sticker-sync-start-rsp" +#define STICKER_SEND_START_REQ "sticker-send-start-req" +#define STICKER_SEND_START_RSP "sticker-send-start-rsp" +#define STICKER_SEND_FACE_DATA "sticker-send-face-data" +#define STICKER_SEND_STOP_REQ "sticker-send-stop-req" +#define STICKER_SEND_STOP_RSP "sticker-send-stop-rsp" using namespace std; struct priv { sap_agent_h agent; - sap_file_transaction_h socket; + sap_socket_h socket; + sap_file_transaction_h file_socket; +}; + +static void _reset_sticker_data(); + +struct sticker_info { + string file_path; + string group; + string keyword; + string disp_type; + string description; + + sticker_info() + { + _reset_sticker_data(); + } }; static struct priv priv_data = { 0 }; +static struct sticker_info sticker_data; gboolean file_on_progress = 0; static string incoming_file_name; -static string recv_filepath; +static int t_id = 0; +static int rec_file_cnt = 0; + +static gboolean _send_json_data(JsonObject *obj) +{ + JsonGenerator *j_generator = NULL; + JsonNode *j_node = NULL; + gsize size = 0; + gchar *data = NULL; + int result = 1; + + j_generator = json_generator_new(); + if (j_generator == NULL) { + LOGE("Unable to json_generator_new"); + goto cleanup; + } + + j_node = json_node_new(JSON_NODE_OBJECT); + if (j_node == NULL) { + LOGE("Unable to json_node_new"); + goto cleanup; + } + + json_node_set_object(j_node, obj); + json_generator_set_root(j_generator, j_node); + + data = json_generator_to_data(j_generator, &size); + if (data == NULL) { + LOGE("Unable to json_generator_to_data"); + goto cleanup; + } + + if (priv_data.socket) { + LOGD("Send JSON data : %s", data); + result = sap_socket_send_data(priv_data.socket, ACCESSORY_SERVICE_CHANNEL_ID, strlen(data), (void *)data); + } + +cleanup: + if (data) + g_free(data); + + if (j_node) + json_node_free(j_node); + + if (j_generator) + g_object_unref(j_generator); + + return result ? FALSE : TRUE; +} static void _on_send_completed(sap_file_transaction_h file_transaction, sap_ft_transfer_e result, const char *file_path, void *user_data) { - if (priv_data.socket) { + if (priv_data.file_socket) { sap_file_transfer_destroy(file_transaction); - priv_data.socket = NULL; + priv_data.file_socket = NULL; } if (result == SAP_FT_TRANSFER_SUCCESS) { LOGI("Transfer Completed"); - if (chmod(recv_filepath.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) { - LOGE("Failed to change permission : %s. error : %s", recv_filepath.c_str(), strerror(errno)); + if (chmod(sticker_data.file_path.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) { + LOGE("Failed to change permission : %s. error : %s", sticker_data.file_path.c_str(), strerror(errno)); } else { - LOGI("Succeed to change permission : %s", recv_filepath.c_str()); + LOGI("Succeed to change permission : %s", sticker_data.file_path.c_str()); if (create_sticker_provider_handle() == STICKER_ERROR_NONE) { - insert_sticker_data(recv_filepath.c_str(), "keyword", "group", "test icon"); + insert_sticker_data(sticker_data.file_path.c_str(), sticker_data.keyword.c_str(), sticker_data.group.c_str(), sticker_data.description.c_str()); destroy_sticker_provider_handle(); - if (unlink(recv_filepath.c_str()) == -1) + if (unlink(sticker_data.file_path.c_str()) == -1) LOGE("Failed to remove sticker file"); } } + + rec_file_cnt++; } else { switch (result) { case (SAP_FT_TRANSFER_FAIL_CHANNEL_IO): { @@ -150,10 +228,10 @@ void accept_file() LOGI("Path : %s", data_path); sprintf(file_path, "%s/%s", data_path, incoming_file_name.c_str()); LOGI("Receive filepath : %s", file_path); - recv_filepath = string(file_path); + sticker_data.file_path = string(file_path); free(data_path); - ret = sap_file_transfer_receive(priv_data.socket, file_path); + ret = sap_file_transfer_receive(priv_data.file_socket, file_path); switch(ret) { case SAP_RESULT_PERMISSION_DENIED: LOGW("permission denied"); @@ -171,12 +249,32 @@ void accept_file() void sap_file_transfer_get_receive_filepath(char **filepath) { - *filepath = strdup(recv_filepath.c_str()); + *filepath = strdup(sticker_data.file_path.c_str()); +} + +void request_sticker_data(const char *mode, const char *category, const char *type) +{ + JsonObject *j_object = json_object_new(); + if (j_object == NULL) { + LOGE("json object create error"); + return; + } + + json_object_set_string_member(j_object, "msgId", STICKER_SYNC_START_REQ); + json_object_set_int_member(j_object, "tID", ++t_id); + json_object_set_string_member(j_object, "mode", mode); + json_object_set_string_member(j_object, "category", category); + json_object_set_string_member(j_object, "type", type); + + if (_send_json_data(j_object) == FALSE) + LOGE("Failed to request sticker data"); + + json_object_unref(j_object); } void reject_file() { - int ret = sap_file_transfer_reject(priv_data.socket); + int ret = sap_file_transfer_reject(priv_data.file_socket); LOGI("ret : %d", ret); file_on_progress = 0; @@ -188,9 +286,9 @@ static void _on_receive_file_cb(sap_peer_agent_h peer_agent_h, void *user_data) { file_on_progress = 1; - priv_data.socket = socket; + priv_data.file_socket = socket; LOGI("# incoming file request."); - __set_file_transfer_cb(priv_data.socket); + __set_file_transfer_cb(priv_data.file_socket); incoming_file_name = file_path; std::size_t found = incoming_file_name.find_last_of("/"); @@ -225,11 +323,136 @@ void conn_terminated(sap_peer_agent_h peer_agent, service_app_exit(); } +static void _reset_sticker_data() +{ + sticker_data.file_path.clear(); + sticker_data.group.clear(); + sticker_data.keyword.clear(); + sticker_data.disp_type.clear(); + sticker_data.description.clear(); +} + void on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned int payload_length, void *buffer, void *user_data) /* message exchange on_receive callback (sap_agent_data_received_cb) */ { LOGI("received data: %s, len:%d", (char *)buffer, payload_length); + + JsonParser *parser = json_parser_new(); + GError *err_msg = NULL; + JsonNode *root = NULL; + JsonObject *root_obj = NULL; + string msg_id; + const char *json_msgid = NULL; + + json_parser_load_from_data(parser, (char *)buffer, -1, &err_msg); + if (err_msg) { + LOGE("failed to load json file. error message: %s", err_msg->message); + goto cleanup; + } + + root = json_parser_get_root(parser); + if (root == NULL) { + LOGE("failed to get root"); + goto cleanup; + } + + root_obj = json_node_get_object(root); + if (root_obj == NULL) { + LOGE("failed to get object"); + goto cleanup; + } + + json_msgid = json_object_get_string_member(root_obj, "msgId"); + msg_id = string(json_msgid ? json_msgid : ""); + if (msg_id == STICKER_SYNC_START_RSP) { + LOGD("msg : %s", msg_id.c_str()); + const char *json_result = json_object_get_string_member(root_obj, "result"); + string result = string(json_result ? json_result : ""); + int result_code = json_object_get_int_member(root_obj, "resultCode"); + LOGD("result : %s, resultCode : %d", result.c_str(), result_code); + } else if (msg_id == STICKER_SEND_START_REQ) { + LOGD("msg : %s", msg_id.c_str()); + rec_file_cnt = 0; + t_id = json_object_get_int_member(root_obj, "tID"); + JsonArray *file_list = json_object_get_array_member(root_obj, "list"); + if (file_list) { + int arr_len = json_array_get_length(file_list); + for (int i = 0; i < arr_len; i++) { + JsonObject *file_obj = json_array_get_object_element(file_list, i); + int file_len = json_object_get_int_member(file_obj, "size"); + const char *json_filename = json_object_get_string_member(file_obj, "fileName"); + string file_name = string(json_filename ? json_filename : ""); + + if (file_len > 0) { + LOGD("fileName : %s, len : %d", file_name.c_str(), file_len); + } else { + // Delete sticker + LOGD("fileName : %s, len : %d", file_name.c_str(), file_len); + } + } + } + + JsonObject *j_object = json_object_new(); + if (j_object == NULL) { + LOGE("Unable to json_object_new"); + goto cleanup; + } + + json_object_set_string_member(j_object, "msgId", STICKER_SEND_START_RSP); + json_object_set_int_member(j_object, "tID", t_id); + json_object_set_string_member(j_object, "result", "success"); + + if (_send_json_data(j_object) == FALSE) + LOGE("Failed to send message"); + + json_object_unref(j_object); + } else if (msg_id == STICKER_SEND_FACE_DATA) { + LOGD("msg : %s", msg_id.c_str()); + _reset_sticker_data(); + + const char *type_data = json_object_get_string_member(root_obj, "type"); + if (type_data) + sticker_data.disp_type = string(type_data); + + const char *category = json_object_get_string_member(root_obj, "category"); + if (category) { + sticker_data.group = string(category); + sticker_data.keyword = string(category); + } + } else if (msg_id == STICKER_SEND_STOP_REQ) { + LOGD("msg : %s", msg_id.c_str()); + const char *json_reason = json_object_get_string_member(root_obj, "reason"); + string reason = string(json_reason ? json_reason : ""); + int file_len = json_object_get_int_member(root_obj, "count"); + + JsonObject *j_object = json_object_new(); + if (j_object == NULL) { + LOGE("Unable to json_object_new"); + goto cleanup; + } + + json_object_set_string_member(j_object, "msgId", STICKER_SEND_STOP_RSP); + json_object_set_int_member(j_object, "tID", t_id); + + if (reason == "complete" && rec_file_cnt != file_len) + json_object_set_string_member(j_object, "result", "failure"); + else + json_object_set_string_member(j_object, "result", "success"); + + if (_send_json_data(j_object) == FALSE) + LOGE("Failed to send message"); + + json_object_unref(j_object); + } else + LOGW("unknown msg id : %s", msg_id.c_str()); + +cleanup: + if (err_msg) + g_error_free(err_msg); + + if (parser) + g_object_unref(parser); } static void on_conn_req(sap_peer_agent_h peer_agent, @@ -237,10 +460,12 @@ static void on_conn_req(sap_peer_agent_h peer_agent, sap_service_connection_result_e result, void *user_data) { - sap_peer_agent_accept_service_connection(peer_agent); - sap_peer_agent_set_service_connection_terminated_cb(peer_agent, conn_terminated, NULL); - - sap_socket_set_data_received_cb(socket, on_data_received, peer_agent); + if (result == SAP_CONNECTION_SUCCESS) { + priv_data.socket = socket; + sap_peer_agent_accept_service_connection(peer_agent); + sap_peer_agent_set_service_connection_terminated_cb(peer_agent, conn_terminated, NULL); + sap_socket_set_data_received_cb(socket, on_data_received, peer_agent); + } } static void on_agent_initialized(sap_agent_h agent, -- 2.7.4