From 23ee42119b4613aacaef80a8c4f0940c7b0b0a34 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Fri, 24 Apr 2020 20:35:11 +0900 Subject: [PATCH 01/16] Fix invalid condition check Change-Id: Ifccd8a1252d05c160d88192594f00c8100dae770 --- consumer/sticker_consumer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consumer/sticker_consumer.c b/consumer/sticker_consumer.c index 8f6c03f..1c11f19 100644 --- a/consumer/sticker_consumer.c +++ b/consumer/sticker_consumer.c @@ -539,7 +539,7 @@ EXPORT_API int sticker_consumer_add_recent_data(sticker_consumer_h consumer_hand int ret; - if (!consumer_handle || !data_handle || (data_handle->sticker_info_id > 0) || !data_handle->uri) + if (!consumer_handle || !data_handle || (data_handle->sticker_info_id <= 0) || !data_handle->uri) return STICKER_ERROR_INVALID_PARAMETER; ret = sticker_dbus_insert_recent_sticker_info(consumer_handle->gdbus_connection, data_handle->sticker_info_id); -- 2.7.4 From 6d405cff562ce00105ba8aabf60639e937deff54 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Fri, 24 Apr 2020 20:36:13 +0900 Subject: [PATCH 02/16] Update package version to 0.1.38 Change-Id: Ia1688a1ad27d65008b89c12b28250c69f3b5ae7f --- packaging/capi-ui-sticker.spec | 2 +- receiver/tizen-manifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 37f6025..05b11c7 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -1,6 +1,6 @@ Name: capi-ui-sticker Summary: Sticker client library and daemon -Version: 0.1.37 +Version: 0.1.38 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 diff --git a/receiver/tizen-manifest.xml b/receiver/tizen-manifest.xml index f14bb80..d169a2e 100644 --- a/receiver/tizen-manifest.xml +++ b/receiver/tizen-manifest.xml @@ -1,5 +1,5 @@ - + -- 2.7.4 From c6361adaaabf0c4db39fa589a58f2a70930c45ae Mon Sep 17 00:00:00 2001 From: InHong Han Date: Mon, 27 Apr 2020 09:52:24 +0900 Subject: [PATCH 03/16] Fix issue detected by static analysis tool Use of vulnerable function 'sprintf'. This function is unsafe, use snprintf instead. Change-Id: Ie3eba653e1a0986979b411814fbe19adc7da8504 --- receiver/src/ft.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/receiver/src/ft.cpp b/receiver/src/ft.cpp index 723c8f2..7fbbffb 100644 --- a/receiver/src/ft.cpp +++ b/receiver/src/ft.cpp @@ -211,7 +211,7 @@ static void _on_transfer_completed(sap_file_transaction_h file_transaction, char thumb_path[PATH_MAX]; char *data_path = NULL; data_path = app_get_shared_data_path(); - sprintf(thumb_path, "%s/thumbnail/%s", data_path, incoming_file_name.c_str()); + snprintf(thumb_path, sizeof(thumb_path), "%s/thumbnail/%s", data_path, incoming_file_name.c_str()); sticker_data.thumbnail_path = string(thumb_path); if (data_path) @@ -318,7 +318,7 @@ void accept_file() data_path = app_get_shared_data_path(); LOGI("Path : %s", data_path); - sprintf(file_path, "%s/%s", data_path, incoming_file_name.c_str()); + snprintf(file_path, sizeof(file_path), "%s/%s", data_path, incoming_file_name.c_str()); LOGI("Receive filepath : %s", file_path); sticker_data.file_path = string(file_path); @@ -346,7 +346,7 @@ static int _create_thumbnail_directory() char thumb_path[PATH_MAX]; char *data_path = NULL; data_path = app_get_shared_data_path(); - sprintf(thumb_path, "%s/thumbnail", data_path); + snprintf(thumb_path, sizeof(thumb_path), "%s/thumbnail", data_path); if (data_path) free(data_path); -- 2.7.4 From 94196a2f18b8ef7ee2d987a35003cffb59eb99db Mon Sep 17 00:00:00 2001 From: InHong Han Date: Mon, 27 Apr 2020 13:41:35 +0900 Subject: [PATCH 04/16] Only manual sync is possible after sync fails for 48hours Change-Id: I1e0683e4231cf9b99e32bcc5a8f3b5961015955a --- receiver/inc/config.h | 1 + receiver/inc/ft.h | 1 + receiver/src/ft.cpp | 20 ++++++++++++++++++++ receiver/src/main.cpp | 12 +++++++++--- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/receiver/inc/config.h b/receiver/inc/config.h index 10b742f..ecc3c10 100644 --- a/receiver/inc/config.h +++ b/receiver/inc/config.h @@ -21,6 +21,7 @@ #define ACCESSORY_SERVICE_CHANNEL_ID 107 #define SYNC_INTERVAL 12*60*60 +#define MAX_WAIT_TIME 48*60*60 #define REMOTE_APP_ID "com.samsung.w-input-selector" #define MESSAGE_PORT_REMOTE_NAME REMOTE_APP_ID"_msg_port_rcv" diff --git a/receiver/inc/ft.h b/receiver/inc/ft.h index 90d506f..6c91c66 100644 --- a/receiver/inc/ft.h +++ b/receiver/inc/ft.h @@ -35,6 +35,7 @@ void request_all_sticker_data(const char *mode, const char *type); bool request_sticker_data(const char *mode, const char *category, const char *type); void request_sticker_feature(); void send_disconnect_message(); +void request_show_sync_notification(); bool get_job_progress(); diff --git a/receiver/src/ft.cpp b/receiver/src/ft.cpp index 7fbbffb..ae52546 100644 --- a/receiver/src/ft.cpp +++ b/receiver/src/ft.cpp @@ -48,6 +48,7 @@ #define STICKER_SYNC_FEATURE_REQ "sticker-sync-feature-req" #define STICKER_SYNC_FEATURE_RSP "sticker-sync-feature-rsp" #define STICKER_REQUEST_SYNC_REQ "sticker-request-sync-req" +#define STICKER_REQUEST_NOTI_REQ "sticker-request-noti-req" #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" @@ -488,6 +489,25 @@ void send_disconnect_message() json_object_unref(j_object); } +void request_show_sync_notification() +{ + JsonObject *j_object = NULL; + j_object = json_object_new(); + if (j_object == NULL) { + LOGE("json object create error"); + return; + } + + json_object_set_string_member(j_object, "msgId", STICKER_REQUEST_NOTI_REQ); + json_object_set_int_member(j_object, "tID", ++t_id); + + if (_send_json_data(j_object) == FALSE) { + LOGE("Failed to send STICKER_REQUEST_NOTI_REQ"); + } + + json_object_unref(j_object); +} + void reject_file() { int ret = sap_file_transfer_reject(priv_data.file_socket); diff --git a/receiver/src/main.cpp b/receiver/src/main.cpp index 0de1ef9..c959151 100644 --- a/receiver/src/main.cpp +++ b/receiver/src/main.cpp @@ -99,10 +99,16 @@ static bool check_sync_time_condition() // compare time LOGD("current time : %f, last_sync_time : %f", ecore_time_get(), last_sync_time); - if (ecore_time_get() - last_sync_time > SYNC_INTERVAL) - result = true; - else + + if (ecore_time_get() - last_sync_time > MAX_WAIT_TIME) { + request_show_sync_notification(); result = false; + } else { + if (ecore_time_get() - last_sync_time > SYNC_INTERVAL) + result = true; + else + result = false; + } } else { -- 2.7.4 From 399d356d660fefbf3f04b586f461c6cff66a8e39 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Mon, 27 Apr 2020 13:51:47 +0900 Subject: [PATCH 05/16] Update package version to 0.1.39 Change-Id: I7e05e31de765f90496e0e153c02a1ab22db08fb0 --- packaging/capi-ui-sticker.spec | 2 +- receiver/tizen-manifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 05b11c7..c4ca5cf 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -1,6 +1,6 @@ Name: capi-ui-sticker Summary: Sticker client library and daemon -Version: 0.1.38 +Version: 0.1.39 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 diff --git a/receiver/tizen-manifest.xml b/receiver/tizen-manifest.xml index d169a2e..33d9343 100644 --- a/receiver/tizen-manifest.xml +++ b/receiver/tizen-manifest.xml @@ -1,5 +1,5 @@ - + -- 2.7.4 From 2eb7c968eef3900a447f5294e8a8e9897a344d61 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 6 May 2020 10:22:27 +0900 Subject: [PATCH 06/16] Fix memory leak issue Change-Id: I84fa3ae708b0449a98fb5a8beca07c567bf02177 Signed-off-by: Jihoon Kim --- sticker-parser/sticker-parser.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sticker-parser/sticker-parser.c b/sticker-parser/sticker-parser.c index 9d73dd3..a9c92ea 100644 --- a/sticker-parser/sticker-parser.c +++ b/sticker-parser/sticker-parser.c @@ -605,8 +605,10 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path goto free_memory; char *rel_thumbnail = __get_string_from_object(info_object, "thumbnail"); - if (rel_thumbnail && rel_thumbnail[0] != '\0') { - thumbnail_path = __convert_sticker_uri(rel_thumbnail, appid, app_path); + if (rel_thumbnail) { + if (rel_thumbnail[0] != '\0') + thumbnail_path = __convert_sticker_uri(rel_thumbnail, appid, app_path); + free(rel_thumbnail); } -- 2.7.4 From f766628dfd02ed2ceeef26a6e664619825e7ea7d Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 6 May 2020 10:23:49 +0900 Subject: [PATCH 07/16] Update package version to 0.1.40 Change-Id: I396421b0811f263f036e618963284bff514dcdfc Signed-off-by: Jihoon Kim --- packaging/capi-ui-sticker.spec | 2 +- receiver/tizen-manifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index c4ca5cf..d3f2dd7 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -1,6 +1,6 @@ Name: capi-ui-sticker Summary: Sticker client library and daemon -Version: 0.1.39 +Version: 0.1.40 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 diff --git a/receiver/tizen-manifest.xml b/receiver/tizen-manifest.xml index 33d9343..829c920 100644 --- a/receiver/tizen-manifest.xml +++ b/receiver/tizen-manifest.xml @@ -1,5 +1,5 @@ - + -- 2.7.4 From bb680bc7dae7c787499bfe2f430401c94f5c53dd Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 6 May 2020 14:25:57 +0900 Subject: [PATCH 08/16] Fix issue detected by static analysis tool Change-Id: Ic7e6a5d75b2ac90298a62ef22e2f8d581ccef53a Signed-off-by: Jihoon Kim --- server/stickerd_data_manager.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index 9e6455c..0e40774 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -869,12 +869,15 @@ int stickerd_insert_sticker_info_by_json(GVariant *parameters, GVariant **reply_ } sticker_info->app_id = strdup(app_id); + if (!sticker_info->app_id) + goto free_memory; + sticker_info->type = _get_int_from_object(info_object, "type"); if (sticker_info->type < 1) goto free_memory; sticker_info->uri = _get_string_from_object(info_object, "uri"); - if (!sticker_info->uri || sticker_info->uri[0] != '\0') + if (!sticker_info->uri || sticker_info->uri[0] == '\0') goto free_memory; if (sticker_info->type == 1) { -- 2.7.4 From be64eee06ad1659de43519584d32d422768ed506 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 6 May 2020 15:05:12 +0900 Subject: [PATCH 09/16] Update package version to 0.1.41 Change-Id: Id229d0f6286e9400ae61069c1c39c58bd9682fce Signed-off-by: Jihoon Kim --- packaging/capi-ui-sticker.spec | 2 +- receiver/tizen-manifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index d3f2dd7..2094ce6 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -1,6 +1,6 @@ Name: capi-ui-sticker Summary: Sticker client library and daemon -Version: 0.1.40 +Version: 0.1.41 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 diff --git a/receiver/tizen-manifest.xml b/receiver/tizen-manifest.xml index 829c920..7793c64 100644 --- a/receiver/tizen-manifest.xml +++ b/receiver/tizen-manifest.xml @@ -1,5 +1,5 @@ - + -- 2.7.4 From 5a807756138948bb91b6238f02dd000b138b810d Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 6 May 2020 17:07:20 +0900 Subject: [PATCH 10/16] Reduce unnecessary logs Change-Id: I60bdbb3b2058cc321fdcce509b6e6352dd69162b Signed-off-by: Jihoon Kim --- receiver/src/message.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/receiver/src/message.cpp b/receiver/src/message.cpp index e1c4689..6e06820 100644 --- a/receiver/src/message.cpp +++ b/receiver/src/message.cpp @@ -29,8 +29,6 @@ bool send_message(const char *cmd, const char *data) int ret; bool found = false; - LOGD("command: %s, data: %s", cmd, data); - bundle *b = bundle_create(); bundle_add_str(b, "command", cmd); if (data) @@ -63,7 +61,6 @@ bool send_message(const char *cmd, const char *data) } else { - LOGD("Succeed to send message through event publish"); result = true; } -- 2.7.4 From 355553693802021b9e61cee593830a7e21a8c1bd Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 29 Apr 2020 10:38:55 +0900 Subject: [PATCH 11/16] Add a new API for getting the data handle Change-Id: Ib4a38dacd50402b07f0345137f2a23091ca842ef --- client/sticker_data.c | 113 +++++++++++++++++++++++++++++++++++++++++ client/sticker_dbus.c | 33 ++++++++++++ client/sticker_dbus.h | 1 + include/sticker_data.h | 17 +++++++ server/stickerd_data_manager.c | 61 ++++++++++++++++++++++ server/stickerd_data_manager.h | 1 + server/stickerd_db_manager.c | 5 +- server/stickerd_db_manager.h | 1 + 8 files changed, 229 insertions(+), 3 deletions(-) diff --git a/client/sticker_data.c b/client/sticker_data.c index 2a64633..5b6b7ae 100644 --- a/client/sticker_data.c +++ b/client/sticker_data.c @@ -93,6 +93,50 @@ cleanup: return NULL; } +static void _free_sticker_data(sticker_data_h sticker_data) +{ + if (!sticker_data) + return; + + if (sticker_data->app_id) { + free(sticker_data->app_id); + sticker_data->app_id = NULL; + } + + if (sticker_data->uri) { + free(sticker_data->uri); + sticker_data->uri = NULL; + } + + if (sticker_data->thumbnail) { + free(sticker_data->thumbnail); + sticker_data->thumbnail = NULL; + } + + if (sticker_data->keyword) { + g_list_free_full(sticker_data->keyword, free); + sticker_data->keyword = NULL; + } + + if (sticker_data->group) { + free(sticker_data->group); + sticker_data->group = NULL; + } + + if (sticker_data->description) { + free(sticker_data->description); + sticker_data->description = NULL; + } + + if (sticker_data->date) { + free(sticker_data->date); + sticker_data->date = NULL; + } + + free(sticker_data); + sticker_data = NULL; +} + EXPORT_API int sticker_data_create(sticker_data_h *data_handle) { CHECK_STICKER_FEATURE(); @@ -215,6 +259,75 @@ EXPORT_API int sticker_data_clone(sticker_data_h origin_handle, sticker_data_h * return STICKER_ERROR_NONE; } +EXPORT_API int sticker_data_get_handle(const char* uri, sticker_data_h *data_handle) +{ + CHECK_STICKER_FEATURE(); + + int ret; + GDBusConnection *gdbus_connection = NULL; + int server_watcher_id = 0; + int monitor_id = 0; + int server_monitor_id = 0; + int is_exist = 0; + + if (!uri || uri[0] == '\0' || !data_handle) + return STICKER_ERROR_INVALID_PARAMETER; + + struct sticker_data_s *handle = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s)); + if (!handle) + return STICKER_ERROR_OUT_OF_MEMORY; + + ret = sticker_dbus_init(&gdbus_connection, &server_watcher_id, &monitor_id, &server_monitor_id, STICKER_CLIENT_LIB_PROVIDER, NULL); + if (ret != STICKER_ERROR_NONE) { + LOGE("Failed to initialize dbus : %d", ret); + ret = STICKER_ERROR_OPERATION_FAILED; + goto cleanup; + } + + ret = sticker_dbus_check_file_exists(gdbus_connection, uri, &is_exist); + if (ret != STICKER_ERROR_NONE) { + LOGE("Failed to check file exists : %d", ret); + ret = STICKER_ERROR_OPERATION_FAILED; + goto cleanup; + } + + if (!is_exist) { + LOGE("Sticker does not exist. URI : %s", uri); + ret = STICKER_ERROR_NO_SUCH_FILE; + goto cleanup; + } + + ret = sticker_dbus_get_sticker_info_by_uri(gdbus_connection, handle, uri); + if (ret != STICKER_ERROR_NONE) { + LOGE("Failed to get sticker information : %d", ret); + goto cleanup; + } + + *data_handle = handle; + + ret = sticker_dbus_shutdown(gdbus_connection, &server_watcher_id, &server_monitor_id, &monitor_id, STICKER_CLIENT_LIB_PROVIDER); + if (ret != STICKER_ERROR_NONE) + LOGE("Failed to finalize dbus : %d", ret); + + g_object_unref(gdbus_connection); + + return STICKER_ERROR_NONE; + +cleanup: + if (handle) + _free_sticker_data(handle); + + if (gdbus_connection) { + ret = sticker_dbus_shutdown(gdbus_connection, &server_watcher_id, &server_monitor_id, &monitor_id, STICKER_CLIENT_LIB_PROVIDER); + if (ret != STICKER_ERROR_NONE) + LOGE("Failed to finalize dbus : %d", ret); + + g_object_unref(gdbus_connection); + } + + return ret; +} + EXPORT_API int sticker_data_get_app_id(sticker_data_h data_handle, char **app_id) { CHECK_STICKER_FEATURE(); diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 412a143..6cf0088 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -88,6 +88,9 @@ static void _get_sticker_info_from_gvariant(GVariantIter *info_iter, GVariantIte while (g_variant_iter_loop (info_iter, "{iv}", &key, &value)) { switch(key) { + case STICKER_DATA_TYPE_INFO_ID: + sticker_data->sticker_info_id = g_variant_get_int32(value); + break; case STICKER_DATA_TYPE_APP_ID: sticker_data->app_id = g_variant_dup_string(value, NULL); break; @@ -1196,4 +1199,34 @@ int sticker_dbus_get_recent_sticker_list(GDBusConnection *gdbus_connection, int g_object_unref(reply); return ret; +} + +int sticker_dbus_get_sticker_info_by_uri(GDBusConnection *gdbus_connection, sticker_data_h sticker_data, const char *uri) +{ + int ret; + GDBusMessage *reply = NULL; + GVariant *reply_body = NULL; + GVariantIter *info_iter = NULL; + GVariantIter *keyword_iter = NULL; + + ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", uri), &reply, "get_sticker_info_by_uri"); + if (ret == STICKER_CLIENT_ERROR_NONE) { + reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(a{iv}a(s))", &info_iter, &keyword_iter); + _get_sticker_info_from_gvariant(info_iter, keyword_iter, sticker_data); + + if (reply_body) + g_variant_unref(reply_body); + + if (info_iter) + g_variant_iter_free(info_iter); + + if (keyword_iter) + g_variant_iter_free(keyword_iter); + } + + if (reply) + g_object_unref(reply); + + return ret; } \ No newline at end of file diff --git a/client/sticker_dbus.h b/client/sticker_dbus.h index 4115e1d..c5643db 100644 --- a/client/sticker_dbus.h +++ b/client/sticker_dbus.h @@ -68,6 +68,7 @@ int sticker_dbus_get_group_list_by_display_type(GDBusConnection *gdbus_connectio int sticker_dbus_check_file_exists(GDBusConnection *gdbus_connection, const char *uri, int *result); int sticker_dbus_insert_recent_sticker_info(GDBusConnection *gdbus_connection, int record_id); int sticker_dbus_get_recent_sticker_list(GDBusConnection *gdbus_connection, int count, GVariantIter **id_iter); +int sticker_dbus_get_sticker_info_by_uri(GDBusConnection *gdbus_connection, sticker_data_h sticker_data, const char *uri); #ifdef __cplusplus } diff --git a/include/sticker_data.h b/include/sticker_data.h index 2a59af1..4f75071 100644 --- a/include/sticker_data.h +++ b/include/sticker_data.h @@ -119,6 +119,23 @@ int sticker_data_destroy(sticker_data_h data_handle); int sticker_data_clone(sticker_data_h origin_handle, sticker_data_h *target_handle); /** + * @brief Gets the sticker data handle for the given URI. + * @since_tizen 5.5 + * @remarks If the function succeeds, @a data_handle must be released with sticker_data_destroy(). + * @param[in] uri The URI of the sticker data handle + * @param[out] data_handle The sticker data handle for the given sticker URI + * @return 0 on success, otherwise a negative error value + * @retval #STICKER_ERROR_NONE Successful + * @retval #STICKER_ERROR_NOT_SUPPORTED Not supported + * @retval #STICKER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #STICKER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #STICKER_ERROR_OPERATION_FAILED Operation failed + * @retval #STICKER_ERROR_NO_SUCH_FILE A sticker with given @a uri does not exist + * @see sticker_data_destroy() + */ +int sticker_data_get_handle(const char* uri, sticker_data_h *data_handle); + +/** * @brief Gets the name of the sticker provider application from sticker data handle. * @since_tizen 5.5 * @remarks @a app_id must be released using free(). diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index 0e40774..c731971 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -164,6 +164,8 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con ret = stickerd_get_recent_sticker_info(parameters, &reply_body); } else if (g_strcmp0(method_name, "send_update_event") == 0) { ret = stickerd_send_update_event(parameters, &reply_body); + } else if (g_strcmp0(method_name, "get_sticker_info_by_uri") == 0) { + ret = stickerd_get_sticker_info_by_uri(parameters, &reply_body); } if (ret == STICKERD_SERVER_ERROR_NONE) { @@ -345,6 +347,12 @@ int stickerd_register_dbus_interface(void) " " " " " " + + " " + " " + " " + " " + " " " " " "; @@ -1776,4 +1784,57 @@ int stickerd_send_update_event(GVariant *parameters, GVariant **reply_body) } return ret; +} + +int stickerd_get_sticker_info_by_uri(GVariant *parameters, GVariant **reply_body) +{ + int ret; + char *uri = NULL; + GVariantBuilder *info_builder; + GVariantBuilder *keyword_builder; + + g_variant_get(parameters, "(&s)", &uri); + + sticker_info_db *sticker_info = (sticker_info_db *)calloc(1, sizeof(sticker_info_db)); + + if (!sticker_info) + return STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + + ret = stickerd_db_get_sticker_info_by_uri(uri, sticker_info); + if (ret != STICKERD_SERVER_ERROR_NONE) { + LOGE("Failed to get sticker info"); + ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; + goto cleanup; + } + + info_builder = g_variant_builder_new(G_VARIANT_TYPE("a{iv}")); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_INFO_ID, g_variant_new_int32(sticker_info->record_id)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_APP_ID, g_variant_new_string((const gchar *)sticker_info->app_id)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_URI_TYPE, g_variant_new_int32(sticker_info->type)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_URI, g_variant_new_string((const gchar *)sticker_info->uri)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_THUMBNAIL, g_variant_new_string((const gchar *)sticker_info->thumbnail)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DESCRIPTION, g_variant_new_string((const gchar *)sticker_info->description)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_GROUP, g_variant_new_string((const gchar *)sticker_info->group)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DATE, g_variant_new_string((const gchar *)sticker_info->date)); + g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DISP_TYPE, g_variant_new_int32(sticker_info->display_type)); + + keyword_builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)")); + g_list_foreach(sticker_info->keyword, (GFunc) _set_keyword_builder, keyword_builder); + + *reply_body = g_variant_new("(a{iv}a(s))", info_builder, keyword_builder); + g_variant_builder_unref(info_builder); + g_variant_builder_unref(keyword_builder); + + if (*reply_body == NULL) { + LOGE("Failed to create reply_body"); + ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; + } + +cleanup: + if (sticker_info) { + _free_sticker_data(sticker_info); + sticker_info = NULL; + } + + return ret; } \ No newline at end of file diff --git a/server/stickerd_data_manager.h b/server/stickerd_data_manager.h index 6b54c68..e6ac7e7 100644 --- a/server/stickerd_data_manager.h +++ b/server/stickerd_data_manager.h @@ -51,6 +51,7 @@ int stickerd_check_file_exists(GVariant *parameters, GVariant **reply_body); int stickerd_insert_recent_sticker_info(GVariant *parameters, GVariant **reply_body); int stickerd_get_recent_sticker_info(GVariant *parameters, GVariant **reply_body); int stickerd_send_update_event(GVariant *parameters, GVariant **reply_body); +int stickerd_get_sticker_info_by_uri(GVariant *parameters, GVariant **reply_body); #ifdef __cplusplus } diff --git a/server/stickerd_db_manager.c b/server/stickerd_db_manager.c index 6e3ace3..b13c2ee 100644 --- a/server/stickerd_db_manager.c +++ b/server/stickerd_db_manager.c @@ -1016,7 +1016,6 @@ cleanup: int stickerd_db_get_sticker_info_by_uri(char *uri, sticker_info_db *sticker_info) { int ret; - int record_id; sqlite3 *db = NULL; sqlite3_stmt *stmt = NULL; @@ -1038,7 +1037,7 @@ int stickerd_db_get_sticker_info_by_uri(char *uri, sticker_info_db *sticker_info goto cleanup; } - record_id = sticker_info->display_type = sqlite3_column_int(stmt, 0); + sticker_info->record_id = sqlite3_column_int(stmt, 0); const unsigned char *tmp_app_id = sqlite3_column_text(stmt, 1); if (tmp_app_id) @@ -1077,7 +1076,7 @@ int stickerd_db_get_sticker_info_by_uri(char *uri, sticker_info_db *sticker_info goto cleanup; } - sqlite3_bind_int(stmt, 1, record_id); + sqlite3_bind_int(stmt, 1, sticker_info->record_id); while (sqlite3_step(stmt) == SQLITE_ROW) { const unsigned char *keyword = sqlite3_column_text(stmt, 0); diff --git a/server/stickerd_db_manager.h b/server/stickerd_db_manager.h index 83bf132..53c1e42 100644 --- a/server/stickerd_db_manager.h +++ b/server/stickerd_db_manager.h @@ -38,6 +38,7 @@ typedef enum { } sticker_info_db_type; typedef struct { + int record_id; char *app_id; int type; char *uri; -- 2.7.4 From 19c75cd455514701a094c536957a29e3beba45fc Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 6 May 2020 17:41:37 +0900 Subject: [PATCH 12/16] Modified to send show_notification message when mobile is disconnected Change-Id: I8013592edbb13703a0d1553295d49d86430de47b --- receiver/inc/sticker_request.h | 3 ++- receiver/src/ft.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/receiver/inc/sticker_request.h b/receiver/inc/sticker_request.h index 583bd9a..9fa6f2e 100644 --- a/receiver/inc/sticker_request.h +++ b/receiver/inc/sticker_request.h @@ -23,7 +23,8 @@ using namespace std; typedef enum { REQUEST_TYPE_SYNC, - REQUEST_TYPE_FEATURE_REQ + REQUEST_TYPE_FEATURE_REQ, + REQUEST_TYPE_SHOW_NOTIFICATION } request_type; struct StickerRequest { diff --git a/receiver/src/ft.cpp b/receiver/src/ft.cpp index ae52546..b375757 100644 --- a/receiver/src/ft.cpp +++ b/receiver/src/ft.cpp @@ -492,6 +492,16 @@ void send_disconnect_message() void request_show_sync_notification() { JsonObject *j_object = NULL; + + if (!priv_data.socket) { + job_progress = TRUE; + StickerRequest pending_request; + pending_request.req_type = REQUEST_TYPE_SHOW_NOTIFICATION; + ReqQueue.push(pending_request); + LOGI("Push show notification request"); + return; + } + j_object = json_object_new(); if (j_object == NULL) { LOGE("json object create error"); @@ -503,6 +513,8 @@ void request_show_sync_notification() if (_send_json_data(j_object) == FALSE) { LOGE("Failed to send STICKER_REQUEST_NOTI_REQ"); + } else { + job_progress = TRUE; } json_object_unref(j_object); @@ -586,6 +598,11 @@ static bool process_request_queue() if (request_sticker_data(request.mode.c_str(), request.category.c_str(), request.type.c_str())) ReqQueue.pop(); } + else if (request.req_type == REQUEST_TYPE_SHOW_NOTIFICATION) { + LOGD("[Request to show notification]"); + request_show_sync_notification(); + ReqQueue.pop(); + } return true; } -- 2.7.4 From 671cf61a50296bdea2689e1c0ed27a0d7e96a1fc Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 6 May 2020 21:07:17 +0900 Subject: [PATCH 13/16] Update package version to 0.1.42 Change-Id: I66c4a4e4721533769c278be8162b2451ba51f0c5 --- packaging/capi-ui-sticker.spec | 2 +- receiver/tizen-manifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 2094ce6..6f5f7c4 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -1,6 +1,6 @@ Name: capi-ui-sticker Summary: Sticker client library and daemon -Version: 0.1.41 +Version: 0.1.42 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 diff --git a/receiver/tizen-manifest.xml b/receiver/tizen-manifest.xml index 7793c64..b3d16c0 100644 --- a/receiver/tizen-manifest.xml +++ b/receiver/tizen-manifest.xml @@ -1,5 +1,5 @@ - + -- 2.7.4 From f0797686a6b2a84e808a20c4bbd8c2ba49a9ba91 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 6 May 2020 20:45:33 +0900 Subject: [PATCH 14/16] Modified to change the vconf flag when any of the stickers are synchronized Change-Id: I72bc6eebd322e5f06501e4132c44819883a58367 --- receiver/src/ft.cpp | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/receiver/src/ft.cpp b/receiver/src/ft.cpp index b375757..0d8fade 100644 --- a/receiver/src/ft.cpp +++ b/receiver/src/ft.cpp @@ -815,36 +815,12 @@ on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned in 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_in_group != file_len) { - json_object_set_string_member(j_object, "result", "failure"); - } - else { + if (reason == "complete" && rec_file_cnt_in_group == file_len) { int feature_flag = 0; #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE - 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"); - } + set_sync_complete(); + set_sync_progressing(FALSE); #else LOGW("No vconf supported feature"); #endif /* VCONFKEY_STICKER_SUPPORTED_FEATURE */ @@ -852,6 +828,9 @@ on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned in json_object_set_string_member(j_object, "result", "success"); sync_success_cnt++; } + else { + json_object_set_string_member(j_object, "result", "failure"); + } if (_send_json_data(j_object) == FALSE) LOGE("Failed to send message"); -- 2.7.4 From 87e9b5c13c995433e52a986d611e06be7ba40465 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Thu, 7 May 2020 13:07:38 +0900 Subject: [PATCH 15/16] Add missing function to create sap agent Change-Id: Idf0c8fb062d390611067a0ce5023949943fcab05 --- receiver/src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/receiver/src/main.cpp b/receiver/src/main.cpp index c959151..6a7cb61 100644 --- a/receiver/src/main.cpp +++ b/receiver/src/main.cpp @@ -101,6 +101,7 @@ static bool check_sync_time_condition() LOGD("current time : %f, last_sync_time : %f", ecore_time_get(), last_sync_time); if (ecore_time_get() - last_sync_time > MAX_WAIT_TIME) { + initialize_sap(); request_show_sync_notification(); result = false; } else { -- 2.7.4 From 10ad2f992d8f51ee30304027c4861c535a7076ed Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Thu, 7 May 2020 13:31:14 +0900 Subject: [PATCH 16/16] Set sync complete vconf value after completing to sync Change-Id: I29048342acd2076f550332a559c6a310a784a7ed Signed-off-by: Jihoon Kim --- receiver/src/ft.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/receiver/src/ft.cpp b/receiver/src/ft.cpp index 0d8fade..29450fa 100644 --- a/receiver/src/ft.cpp +++ b/receiver/src/ft.cpp @@ -741,6 +741,30 @@ on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned in if (result_code != SYNC_START_RSP_SUCCESS) { 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 */ + set_sync_progressing(FALSE); if (result_code == SYNC_START_RSP_NO_STICKER) save_last_sync_time(); @@ -815,18 +839,44 @@ on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned in 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_in_group == file_len) { - int feature_flag = 0; - + if (reason == "complete") { + if (rec_file_cnt_in_group == file_len) { #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE - set_sync_complete(); - set_sync_progressing(FALSE); + 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"); + LOGW("No vconf supported feature"); #endif /* VCONFKEY_STICKER_SUPPORTED_FEATURE */ - json_object_set_string_member(j_object, "result", "success"); - sync_success_cnt++; + 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"); -- 2.7.4