Add a logic for sending and receiving JSON data 13/225513/9
authorInHong Han <inhong1.han@samsung.com>
Mon, 2 Mar 2020 06:26:33 +0000 (15:26 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Thu, 5 Mar 2020 01:42:07 +0000 (10:42 +0900)
Change-Id: I35a22242645906d0cb4f7c4ac18df852d6f6266e

receiver/CMakeLists.txt
receiver/inc/ft.h
receiver/src/ft.cpp

index 3d1e6a9..247230a 100644 (file)
@@ -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)
index bf25d8e..271a98f 100644 (file)
@@ -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__ */
index 7676b2e..49734f1 100644 (file)
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <pwd.h>
+#include <json-glib/json-glib.h>
 
+#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,