+ unsigned int buf_len = strlen((char *)buffer);
+ LOGI("received data: %s, len: %d, buffer len : %d", (char *)buffer, payload_length, buf_len);
+
+ 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, payload_length, &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_REQUEST_SYNC_REQ) {
+ request_all_sticker_data("manual", "input");
+ } else if (msg_id == STICKER_SYNC_FEATURE_RSP) {
+ LOGD("msg : %s", msg_id.c_str());
+#ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
+ const char *json_aremoji = json_object_get_string_member(root_obj, "arEmoji");
+ const char *json_bitmoji = json_object_get_string_member(root_obj, "bitmoji");
+ string support_aremoji = string(json_aremoji ? json_aremoji : "");
+ string support_bitmoji = string(json_bitmoji ? json_bitmoji : "");
+ int supported_feature = VCONFKEY_STICKER_FEATURE_NONE;
+
+ if (support_aremoji == "support")
+ supported_feature |= VCONFKEY_STICKER_FEATURE_AREMOJI;
+
+ if (support_bitmoji == "support")
+ supported_feature |= VCONFKEY_STICKER_FEATURE_BITMOJI;
+
+ if (vconf_set_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, supported_feature) == 0)
+ LOGD("Succeed to set supported feature");
+ else
+ LOGW("Fail to set supported feature");
+#else
+ LOGW("No vconf supported feature");
+#endif
+
+ if (!process_request_queue()) {
+ quit();
+ }
+ } else 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);
+
+ if(result_code == SYNC_START_RSP_SUCCESS) {
+ send_sync_start_response(result_code);
+ if (current_request.category == string("bitmoji")) {
+ LOGD("Delete all bitmoji stickers");
+ delete_all_stickers("bitmoji");
+ }
+ } else if (result_code == SYNC_START_RSP_SYNC_AFTER_DELETING_AREMOJI) {
+ send_sync_start_response(result_code);
+ LOGD("Delete all AR Emoji stickers");
+ delete_all_stickers("arsticker");
+ } else {
+ if (result_code == SYNC_START_RSP_BITMOJI_ALL_DELETE) {
+ LOGD("Delete all bitmoji stickers");
+ delete_all_stickers("bitmoji");
+ } else if (result_code == SYNC_START_RSP_AREMOJI_ALL_DELETE) {
+ LOGD("Delete all AR Emoji stickers");
+ delete_all_stickers("arsticker");
+ }
+
+ if (!process_request_queue()) {
+#ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
+ int feature_flag = 0;
+
+ if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0)
+ {
+ LOGD("feature : %d, current request category : %s", feature_flag, current_request.category.c_str());
+ if (feature_flag & VCONFKEY_STICKER_FEATURE_BITMOJI)
+ {
+ if (current_request.category == string("bitmoji"))
+ {
+ /* other sticker group(s) has been synchronized completely */
+ if (sync_success_cnt > 0) {
+ set_sync_complete();
+ }
+ }
+ }
+ }
+ else {
+ LOGW("Failed to read support feature");
+ }
+#else
+ LOGW("No vconf supported feature");
+#endif /* VCONFKEY_STICKER_SUPPORTED_FEATURE */
+
+ send_sync_start_response(result_code);
+ set_sync_progressing(FALSE);
+ save_last_sync_time();
+
+ quit();
+ }
+ }
+ } else if (msg_id == STICKER_SEND_START_REQ) {
+ LOGD("msg : %s", msg_id.c_str());
+ total_file_count_in_group = 0;
+ rec_file_cnt_in_group = 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("Add file : %s, len : %d", file_name.c_str(), file_len);
+ total_file_count_in_group++;
+ } else {
+ char *app_id = NULL;
+ char file_path[PATH_MAX];
+ char del_path[PATH_MAX];
+ std::size_t found = file_name.find_last_of("/");
+ string del_file_name = file_name.substr(found+1);
+ char *data_path = app_get_shared_data_path();
+ app_get_id(&app_id);
+ snprintf(file_path, sizeof(file_path), "%s/%s", data_path, del_file_name.c_str());
+ snprintf(del_path, sizeof(del_path), "%s/%s%s",STICKER_DIRECTORY, app_id, file_path);
+
+ LOGD("Delete file : %s, len : %d", del_path, file_len);
+ delete_sticker_data(del_path);
+
+ if (app_id)
+ free(app_id);
+ }
+ }
+ }
+
+ 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());
+ 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") {
+ if (rec_file_cnt_in_group == file_len) {
+#ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
+ int feature_flag = 0;
+
+ if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0)
+ {
+ LOGD("feature : %d, current request category : %s", feature_flag, current_request.category.c_str());
+ if (feature_flag == VCONFKEY_STICKER_FEATURE_AREMOJI)
+ {
+ if (current_request.category == string("arsticker"))
+ {
+ set_sync_complete();
+ set_sync_progressing(FALSE);
+ }
+ }
+ else if (feature_flag & VCONFKEY_STICKER_FEATURE_BITMOJI)
+ {
+ if (current_request.category == string("bitmoji"))
+ {
+ set_sync_complete();
+ set_sync_progressing(FALSE);
+ }
+ }
+ }
+ else {
+ LOGW("Failed to read support feature");
+ }
+#else
+ LOGW("No vconf supported feature");
+#endif /* VCONFKEY_STICKER_SUPPORTED_FEATURE */
+
+ json_object_set_string_member(j_object, "result", "success");
+ sync_success_cnt++;
+ }
+ else {
+ json_object_set_string_member(j_object, "result", "failure");
+ }
+ }
+ else {
+ json_object_set_string_member(j_object, "result", "failure");
+ }
+
+ if (_send_json_data(j_object) == FALSE)
+ LOGE("Failed to send message");
+
+ json_object_unref(j_object);
+
+ send_message("sync_stop_result", reason.c_str());
+
+ current_request.mode.clear();
+ current_request.category.clear();
+ current_request.type.clear();
+
+ if (!process_request_queue()) {
+ sync_success_cnt = 0;
+
+ quit();
+ }
+ } 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);