From c0d907c5534b7e1a580555af02e874ad4e76a098 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Tue, 8 Oct 2019 15:18:03 +0900 Subject: [PATCH 01/16] Fix memory leak Change-Id: Ie57fdd246e3381c19bf7a886899a8ffb26b855c8 Signed-off-by: InHong Han --- client/sticker_dbus.c | 2 +- server/stickerd_data_manager.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index a3e2377..847283a 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -558,7 +558,7 @@ static void _set_keyword_builder(char *keyword, GVariantBuilder *keyword_builder return; } - g_variant_builder_add(keyword_builder, "(s)", strdup((const char *)keyword)); + g_variant_builder_add(keyword_builder, "(s)", (const char *)keyword); } int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_data_h sticker_data) diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index a3e235d..b0922da 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -902,7 +902,7 @@ static void _set_keyword_builder(char *keyword, GVariantBuilder *keyword_builder return; } - g_variant_builder_add(keyword_builder, "(s)", strdup((const char *)keyword)); + g_variant_builder_add(keyword_builder, "(s)", (const char *)keyword); } int stickerd_get_sticker_info(GVariant *parameters, GVariant **reply_body) -- 2.7.4 From c37c613fc0656e20d61e50916f2a6aae9457f622 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Tue, 8 Oct 2019 15:20:33 +0900 Subject: [PATCH 02/16] Update package version to 0.1.3 Change-Id: Ie333498a2f455f08c4fbc200b40fc9194de39754 --- packaging/capi-ui-sticker.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index caa2293..9bc90ad 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.2 +Version: 0.1.3 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4 From c25dd19263570ca8b5dac175c1514cc78fa729a5 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 18 Oct 2019 19:44:56 +0900 Subject: [PATCH 03/16] Support to generate gcov package Change-Id: I060934c1a13e9447aa2b370cdf1236f362a31e1c Signed-off-by: Jihoon Kim --- packaging/capi-ui-sticker.spec | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 9bc90ad..57ba2cb 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -39,20 +39,39 @@ Requires: %{name} = %{version}-%{release} %description devel Sticker client library and daemon (Development) +%if 0%{?gcov:1} +%package gcov +Summary: Sticker client library and daemon (gcov) +Group: Graphics & UI Framework/Input +%description gcov +Sticker client library and daemon (gcov) +%endif + %prep %setup -q -n %{name}-%{version} cp %{SOURCE2} . %build +%if 0%{?gcov:1} +export CFLAGS+=" -fprofile-arcs -ftest-coverage" +export CXXFLAGS+=" -fprofile-arcs -ftest-coverage" +export FFLAGS+=" -fprofile-arcs -ftest-coverage" +export LDFLAGS+=" -lgcov" +%endif export CFLAGS+=" -DTIZEN_DEBUG_ENABLE -fvisibility=hidden -Werror" export CXXFLAGS+=" -DTIZEN_DEBUG_ENABLE -fvisibility=hidden -Werror" export FFLAGS+=" -DTIZEN_DEBUG_ENABLE -fvisibility=hidden" -cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DBINDIR=%{_bindir} -DINCLUDEDIR=%{_includedir} \ - -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN -DTZ_SYS_SHARE=%TZ_SYS_SHARE +%cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DBINDIR=%{_bindir} -DINCLUDEDIR=%{_includedir} \ + -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN -DTZ_SYS_SHARE=%TZ_SYS_SHARE make %{?jobs:-j%jobs} +%if 0%{?gcov:1} +mkdir -p gcov-obj +find . -name '*.gcno' -exec cp '{}' gcov-obj ';' +%endif + %install rm -rf %{buildroot} %make_install @@ -67,6 +86,11 @@ install -m 0644 %SOURCE2 %{buildroot}%{_datadir}/dbus-1/system-services/org.tize mkdir -p %{buildroot}%{_sysconfdir}/dbus-1/system.d install -m 0644 %SOURCE3 %{buildroot}%{_sysconfdir}/dbus-1/system.d/capi-ui-sticker.conf +%if 0%{?gcov:1} +mkdir -p %{buildroot}%{_datadir}/gcov/obj +install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj +%endif + %post /sbin/ldconfig @@ -100,3 +124,8 @@ chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data %{_includedir}/sticker_data.h %{_includedir}/sticker_consumer.h %{_includedir}/sticker_provider.h + +%if 0%{?gcov:1} +%files gcov +%{_datadir}/gcov/obj/* +%endif -- 2.7.4 From 78cccd3e56fdc5277edd7f26ce5f822f96cb6aea Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 18 Oct 2019 19:53:03 +0900 Subject: [PATCH 04/16] Add exclude section of coverage Change-Id: Idb6ff03963afc7afcdbe639c90fe10ee62f9d14e Signed-off-by: Jihoon Kim --- client/sticker_dbus.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 847283a..12b6722 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -30,10 +30,12 @@ static void _server_appeared_cb(GDBusConnection *connection, const gchar *name, LOGD("name : %s, name_owner : %s", name, name_owner); } +//LCOV_EXCL_START static void _server_vanished_cb(GDBusConnection *connection, const gchar *name, gpointer user_data) { LOGD("name : %s", name); } +//LCOV_EXCL_STOP static int _dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id) { @@ -178,6 +180,7 @@ static void _call_insert_finished_cb(sticker_provider_h provider_handle, GVarian } } +//LCOV_EXCL_START static void _handle_sticker_consumer_cb(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -244,6 +247,7 @@ static void _handle_sticker_consumer_cb(GDBusConnection *connection, _free_sticker_data(sticker_data); #endif } +//LCOV_EXCL_STOP static void _handle_sticker_provider_cb(GDBusConnection *connection, const gchar *sender_name, @@ -486,12 +490,14 @@ static void _on_name_appeared(GDBusConnection *connection, _monitor_register(connection); } +//LCOV_EXCL_START static void _on_name_vanished(GDBusConnection *connection, const gchar *name, gpointer user_data) { is_server_started = 0; } +//LCOV_EXCL_STOP int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data) -- 2.7.4 From c4286a559c95f9d9bef09d028a435c210f99e6fb Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 18 Oct 2019 19:53:43 +0900 Subject: [PATCH 05/16] Update package version to 0.1.4 Change-Id: I1c75f17b4a964d815805671a5fbd291a41f983b6 Signed-off-by: Jihoon Kim --- packaging/capi-ui-sticker.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 57ba2cb..50c55df 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.3 +Version: 0.1.4 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4 From b2c90860c6edd7f79225faf89b05470ac6503fee Mon Sep 17 00:00:00 2001 From: InHong Han Date: Thu, 7 Nov 2019 14:03:04 +0900 Subject: [PATCH 06/16] Support on-demand launch Change-Id: I58af3046adb9eef35e85d6466b286b345adfae6e (cherry picked from commit ec53be564d596116ed261e6150a8cf98a4e376f9) --- client/sticker_dbus.c | 112 +++++++++++++++++----------------- client/sticker_dbus.h | 4 +- consumer/sticker_consumer.c | 3 +- consumer/sticker_consumer_main.h | 2 +- packaging/capi-ui-sticker.spec | 4 +- provider/sticker_provider.c | 3 +- provider/sticker_provider_main.h | 2 +- server/stickerd_data_manager.c | 35 +++++++++-- server/stickerd_dbus.c | 127 +++++++++++++++++++++++---------------- server/stickerd_dbus.h | 3 +- server/stickerd_main.c | 2 +- 11 files changed, 175 insertions(+), 122 deletions(-) diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 12b6722..627fe46 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -37,9 +37,10 @@ static void _server_vanished_cb(GDBusConnection *connection, const gchar *name, } //LCOV_EXCL_STOP -static int _dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id) +static int _dbus_init(GDBusConnection **gdbus_connection) { GError *error = NULL; + int watch_id = 0; if (*gdbus_connection == NULL) { GDBusConnection *conn = NULL; @@ -55,17 +56,15 @@ static int _dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ } LOGD("Connected bus name : %s", g_dbus_connection_get_unique_name(*gdbus_connection)); - if (*server_watcher_id == 0) { - *server_watcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, - STICKER_DBUS_NAME, - G_BUS_NAME_WATCHER_FLAGS_NONE, - _server_appeared_cb, - _server_vanished_cb, - NULL, NULL); - } + watch_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, + STICKER_DBUS_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + _server_appeared_cb, + _server_vanished_cb, + NULL, NULL); - LOGD("server_watcher_id : %d", *server_watcher_id); - if (*server_watcher_id == 0) { + LOGD("watch_id : %d", watch_id); + if (watch_id == 0) { LOGE("Failed to get identifier"); return STICKER_CLIENT_ERROR_IO_ERROR; } @@ -413,70 +412,54 @@ static int _send_sync_message(GDBusConnection *gdbus_connection, GVariant *body, return ret; } -static void _gdbus_reply_message_async_cb(GDBusConnection *connection, GAsyncResult *res, gpointer user_data) -{ - GDBusMessage *reply = NULL; - GError *err = NULL; - - reply = g_dbus_connection_send_message_with_reply_finish(connection, res, &err); - - if (reply) { - if (g_dbus_message_to_gerror(reply, &err)) { - LOGE("error message = %s, code = %d", err->message, err->code); - g_error_free(err); - return; - } - } else { - LOGE("There is no reply"); - return; - } - - if (reply) - g_object_unref(reply); - - LOGD("Reply message was received"); - return; -} - static int _send_async_message(GDBusConnection *gdbus_connection, GVariant *body, char *cmd) { int ret = STICKER_CLIENT_ERROR_NONE; GDBusMessage *msg = NULL; + GError *err = NULL; msg = _get_gbus_message(body, cmd); if (msg == NULL) return STICKER_CLIENT_ERROR_IO_ERROR; - g_dbus_connection_send_message_with_reply( - gdbus_connection, - msg, - G_DBUS_SEND_MESSAGE_FLAGS_NONE, - -1, - NULL, - NULL, - (GAsyncReadyCallback)_gdbus_reply_message_async_cb, - NULL); + g_dbus_connection_send_message(gdbus_connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &err); if (msg) g_object_unref(msg); + if (err != NULL) { + ret = STICKER_CLIENT_ERROR_SERVICE_NOT_READY; + LOGE("Error occurred when sending message(%s) : %s", cmd, err->message); + + if (err->code == G_DBUS_ERROR_ACCESS_DENIED) + ret = STICKER_CLIENT_ERROR_PERMISSION_DENIED; + + g_error_free(err); + return ret; + } + return ret; } -static int _monitor_register(GDBusConnection *gdbus_connection) +static int _monitor_register(GDBusConnection *gdbus_connection, int *server_watcher_id) { int ret; GDBusMessage *reply = NULL; + GVariant *reply_body = NULL; ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "sticker_service_register"); - if (reply) - g_object_unref(reply); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_send_sync_message() failed : %d", ret); return ret; } + reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(i)", server_watcher_id); + + if (reply) + g_object_unref(reply); + is_server_started = 1; return ret; } @@ -486,8 +469,10 @@ static void _on_name_appeared(GDBusConnection *connection, const gchar *name_owner, gpointer user_data) { - if (is_server_started == 0) - _monitor_register(connection); + if (is_server_started == 0) { + int *watcher_id = (int *)user_data; + _monitor_register(connection, watcher_id); + } } //LCOV_EXCL_START @@ -499,12 +484,12 @@ static void _on_name_vanished(GDBusConnection *connection, } //LCOV_EXCL_STOP -int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, +int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data) { int ret; - ret = _dbus_init(gdbus_connection, server_watcher_id); + ret = _dbus_init(gdbus_connection); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_dbus_init() failed : %d", ret); return ret; @@ -516,7 +501,7 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ return ret; } - ret = _monitor_register(*gdbus_connection); + ret = _monitor_register(*gdbus_connection, server_watcher_id); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_monitor_register() failed : %d", ret); return ret; @@ -529,7 +514,7 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ G_BUS_NAME_WATCHER_FLAGS_NONE, _on_name_appeared, _on_name_vanished, - NULL, + server_watcher_id, NULL); if (*server_monitor_id == 0) { g_dbus_connection_signal_unsubscribe(*gdbus_connection, *monitor_id); @@ -542,8 +527,22 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ return STICKER_CLIENT_ERROR_NONE; } -int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor_id, int *monitor_id) +int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id) { + int ret; + GVariant *body = NULL; + + if (server_watcher_id) { + body = g_variant_new("(i)", *server_watcher_id); + ret = _send_async_message(gdbus_connection, body, "sticker_service_unregister"); + if (ret != STICKER_CLIENT_ERROR_NONE) { + LOGE("Failed to unregister sticker service"); + return ret; + } + + *server_watcher_id = 0; + } + if (*server_monitor_id) { g_bus_unwatch_name(*server_monitor_id); *server_monitor_id = 0; @@ -554,6 +553,9 @@ int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor *monitor_id = 0; } + if (body) + g_variant_unref(body); + return STICKER_CLIENT_ERROR_NONE; } diff --git a/client/sticker_dbus.h b/client/sticker_dbus.h index d8fcbcd..44d2309 100644 --- a/client/sticker_dbus.h +++ b/client/sticker_dbus.h @@ -42,9 +42,9 @@ enum sticker_client_error { STICKER_CLIENT_ERROR_IO_ERROR, }; -int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, +int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data); -int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor_id, int *monitor_id); +int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id); int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_data_h sticker_data); int sticker_dbus_insert_sticker_info_by_json(GDBusConnection *gdbus_connection, const char *app_id, const char *json_path); int sticker_dbus_delete_sticker_info(GDBusConnection *gdbus_connection, int record_id); diff --git a/consumer/sticker_consumer.c b/consumer/sticker_consumer.c index 7b5d544..8602652 100644 --- a/consumer/sticker_consumer.c +++ b/consumer/sticker_consumer.c @@ -180,7 +180,8 @@ EXPORT_API int sticker_consumer_destroy(sticker_consumer_h consumer_handle) return STICKER_ERROR_INVALID_PARAMETER; LOGD("consumer_handle : %p", consumer_handle); - ret = sticker_dbus_shutdown(consumer_handle->gdbus_connection, &consumer_handle->server_monitor_id, &consumer_handle->monitor_id); + ret = sticker_dbus_shutdown(consumer_handle->gdbus_connection, &consumer_handle->server_watcher_id, + &consumer_handle->server_monitor_id, &consumer_handle->monitor_id); if (ret != STICKER_ERROR_NONE) { LOGE("Failed to finalize dbus : %d", ret); free(consumer_handle); diff --git a/consumer/sticker_consumer_main.h b/consumer/sticker_consumer_main.h index ba7f90d..7a08ad2 100644 --- a/consumer/sticker_consumer_main.h +++ b/consumer/sticker_consumer_main.h @@ -28,7 +28,7 @@ extern "C" struct sticker_consumer_s { GDBusConnection *gdbus_connection; - guint server_watcher_id; + int server_watcher_id; int monitor_id; int server_monitor_id; }; diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 50c55df..9ded0a6 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -76,9 +76,8 @@ find . -name '*.gcno' -exec cp '{}' gcov-obj ';' rm -rf %{buildroot} %make_install -mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants +mkdir -p %{buildroot}%{_prefix}/lib/systemd/system install -m 0644 %SOURCE1 %{buildroot}%{_unitdir}/capi-ui-sticker.service -%install_service multi-user.target.wants capi-ui-sticker.service mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services install -m 0644 %SOURCE2 %{buildroot}%{_datadir}/dbus-1/system-services/org.tizen.sticker.server.service @@ -107,7 +106,6 @@ chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data %{_libdir}/lib*.so %attr(0755,ui_fw,ui_fw) %{_bindir}/sticker-server %attr(0644,root,root) %{_unitdir}/capi-ui-sticker.service -%attr(0644,root,root) %{_unitdir}/multi-user.target.wants/capi-ui-sticker.service %attr(0644,root,root) %{_datadir}/dbus-1/system-services/org.tizen.sticker.server.service %config %{_sysconfdir}/dbus-1/system.d/capi-ui-sticker.conf %{TZ_SYS_RO_SHARE}/parser-plugins/capi-ui-sticker.info diff --git a/provider/sticker_provider.c b/provider/sticker_provider.c index 3761d6a..a271ca6 100644 --- a/provider/sticker_provider.c +++ b/provider/sticker_provider.c @@ -106,7 +106,8 @@ EXPORT_API int sticker_provider_destroy(sticker_provider_h provider_handle) return STICKER_ERROR_INVALID_PARAMETER; LOGD("provider_handle : %p", provider_handle); - ret = sticker_dbus_shutdown(provider_handle->gdbus_connection, &provider_handle->server_monitor_id, &provider_handle->monitor_id); + ret = sticker_dbus_shutdown(provider_handle->gdbus_connection, &provider_handle->server_watcher_id, + &provider_handle->server_monitor_id, &provider_handle->monitor_id); if (ret != STICKER_ERROR_NONE) { LOGE("Failed to finalize dbus : %d", ret); free(provider_handle); diff --git a/provider/sticker_provider_main.h b/provider/sticker_provider_main.h index 6280801..4f1c9dd 100644 --- a/provider/sticker_provider_main.h +++ b/provider/sticker_provider_main.h @@ -28,7 +28,7 @@ extern "C" struct sticker_provider_s { GDBusConnection *gdbus_connection; - guint server_watcher_id; + int server_watcher_id; int monitor_id; int server_monitor_id; sticker_provider_insert_finished_cb insert_finished_cb; diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index b0922da..f7a1e7b 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -42,8 +42,19 @@ #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data") #define MAX_ERROR_BUFFER 256 -static GHashTable *_monitoring_hash; +static GHashTable *_monitoring_hash = NULL; static char error_buffer[MAX_ERROR_BUFFER]; +extern GMainLoop *main_loop; + +static void _check_watcher_exist() +{ + if (_monitoring_hash != NULL && g_hash_table_size(_monitoring_hash) == 0) { + LOGD("Terminate sticker daemon"); + g_hash_table_destroy(_monitoring_hash); + _monitoring_hash = NULL; + g_main_loop_quit(main_loop); + } +} static void _on_name_appeared(GDBusConnection *connection, const gchar *name, @@ -60,15 +71,19 @@ static void _on_name_vanished(GDBusConnection *connection, monitoring_info_s *info = (monitoring_info_s *)user_data; if (info) { - LOGD("name: %s", name); - g_bus_unwatch_name(info->watcher_id); - delete_monitoring_list(&_monitoring_hash, info->bus_name, info->uid); + if (_monitoring_hash != NULL && g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(info->watcher_id)) != NULL) { + LOGD("name: %s", name); + g_bus_unwatch_name(info->watcher_id); + delete_monitoring_list(&_monitoring_hash, info->bus_name, info->watcher_id); + } if (info->bus_name) free(info->bus_name); free(info); info = NULL; } + + _check_watcher_exist(); } static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, const gchar *sender, const gchar *object_path, @@ -77,12 +92,17 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con { LOGD("stickerd method_name: %s, sender: %s", method_name, sender); + if (_monitoring_hash == NULL) + _monitoring_hash = g_hash_table_new(g_direct_hash, g_direct_equal); + GVariant *reply_body = NULL; int ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; if (g_strcmp0(method_name, "sticker_service_register") == 0) { ret = stickerd_server_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash); + } else if (g_strcmp0(method_name, "sticker_service_unregister") == 0) { + ret = stickerd_server_unregister(parameters, &reply_body, sender, &_monitoring_hash); } else if (g_strcmp0(method_name, "insert_sticker_info") == 0) { ret = stickerd_insert_sticker_info(parameters, &reply_body); } else if (g_strcmp0(method_name, "update_sticker_info_by_json") == 0) { @@ -131,6 +151,8 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con if (reply_body) g_variant_unref(reply_body); + + _check_watcher_exist(); } static const GDBusInterfaceVTable _sticker_interface_vtable = { @@ -145,6 +167,11 @@ int stickerd_register_dbus_interface(void) " " " " " " + " " + " " + + " " + " " " " " " diff --git a/server/stickerd_dbus.c b/server/stickerd_dbus.c index 4ff175a..6184033 100644 --- a/server/stickerd_dbus.c +++ b/server/stickerd_dbus.c @@ -29,67 +29,92 @@ #define LOG_TAG "STICKERD_DBUS" static GDBusConnection *_gdbus_connection; +extern GMainLoop *main_loop; int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash) { - GList *sender_list = NULL; - const char *bus_name = sender; + int ret = STICKERD_SERVER_ERROR_NONE; + char *m_info_bus_name = NULL; + char *list_bus_name = NULL; monitoring_info_s *m_info = NULL; - uid_t request_uid = 0; GList *monitoring_list = NULL; - if (bus_name == NULL) - return STICKERD_SERVER_ERROR_IO_ERROR; - - g_variant_get(parameters, "(i)", &request_uid); - monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)); - sender_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc) strcmp); + if (reply_body == NULL) + return STICKERD_SERVER_ERROR_INVALID_PARAMETER; - if (sender_list == NULL) { - LOGD("Add a new sender"); - m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); - if (m_info == NULL) { - LOGE("Failed to alloc memory"); - return STICKERD_SERVER_ERROR_IO_ERROR; - } + m_info_bus_name = strdup(sender); + list_bus_name = strdup(sender); + if (m_info_bus_name == NULL || list_bus_name == NULL) { + ret = STICKERD_SERVER_ERROR_IO_ERROR; + goto cleanup; + } - m_info->bus_name = strdup(bus_name); - m_info->uid = request_uid; - m_info->watcher_id = g_bus_watch_name_on_connection( - _gdbus_connection, - bus_name, - G_BUS_NAME_WATCHER_FLAGS_NONE, - name_appeared_handler, - name_vanished_handler, - m_info, - NULL); - if (m_info->watcher_id == 0) { - LOGE("Failed to get identifier"); - free(m_info->bus_name); - free(m_info); - return STICKERD_SERVER_ERROR_IO_ERROR; - } + LOGD("Add a new sender"); + m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); + if (m_info == NULL) { + LOGE("Failed to alloc memory"); + ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + goto cleanup; + } - monitoring_list = g_list_append(monitoring_list, strdup(bus_name)); - LOGD("sender: %s, len: %d", sender, g_list_length(monitoring_list)); - if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)) == NULL) - g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(request_uid), monitoring_list); - } else { - LOGW("Sender(%s) already exist", sender); + m_info->bus_name = m_info_bus_name; + m_info->watcher_id = g_bus_watch_name_on_connection( + _gdbus_connection, + m_info_bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + name_appeared_handler, + name_vanished_handler, + m_info, + NULL); + if (m_info->watcher_id == 0) { + LOGE("Failed to get identifier"); + ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; + goto cleanup; } - *reply_body = g_variant_new("()"); + *reply_body = g_variant_new("(i)", m_info->watcher_id); if (*reply_body == NULL) { - if (m_info) { - if (m_info->bus_name) - free(m_info->bus_name); - free(m_info); - } - monitoring_list = g_list_remove(monitoring_list, bus_name); LOGE("Failed to make reply"); - return STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + goto cleanup; } + + LOGD("sender: %s, watcher: %d", sender, m_info->watcher_id); + monitoring_list = g_list_append(monitoring_list, list_bus_name); + if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id)) == NULL) + g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id), monitoring_list); + else + LOGW("Sender(%s) already exist", sender); + + return STICKERD_SERVER_ERROR_NONE; + +cleanup: + if (m_info_bus_name) + free(m_info_bus_name); + + if (list_bus_name) + free(list_bus_name); + + if (m_info) { + free(m_info); + m_info = NULL; + } + + return ret; +} + +int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash) +{ + int watcher_id = 0; + + g_variant_get(parameters, "(i)", &watcher_id); + + if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)) != NULL) { + g_bus_unwatch_name(watcher_id); + delete_monitoring_list(monitoring_hash, sender, watcher_id); + } + return STICKERD_SERVER_ERROR_NONE; } @@ -156,15 +181,15 @@ cleanup: return result; } -int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid) +int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int watcher_id) { GList *monitoring_list = NULL; GList *del_list = NULL; char *bus_name; - monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(uid)); + monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)); if (monitoring_list == NULL) { - LOGE("The key(%d) is not found", uid); + LOGE("The key(%d) is not found", watcher_id); return STICKERD_SERVER_ERROR_IO_ERROR; } @@ -179,10 +204,10 @@ int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid monitoring_list = g_list_delete_link(monitoring_list, del_list); if (monitoring_list == NULL) { - g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(uid)); + g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(watcher_id)); } else { monitoring_list = g_list_first(monitoring_list); - g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(uid), monitoring_list); + g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(watcher_id), monitoring_list); } } return STICKERD_SERVER_ERROR_NONE; diff --git a/server/stickerd_dbus.h b/server/stickerd_dbus.h index 0197793..e8ad143 100644 --- a/server/stickerd_dbus.h +++ b/server/stickerd_dbus.h @@ -28,14 +28,13 @@ extern "C" { typedef struct monitoring_info { int watcher_id; char *bus_name; - uid_t uid; } monitoring_info_s; int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash); int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash); int stickerd_server_register_dbus_interface(char *introspection_xml, GDBusInterfaceVTable interface_vtable); -int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid); +int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int monitoring_id); int stickerd_send_dbus_message(GVariant *body, const char *dest, char *cmd, CLIENT_LIB lib); #ifdef __cplusplus diff --git a/server/stickerd_main.c b/server/stickerd_main.c index 1650437..38d92f9 100644 --- a/server/stickerd_main.c +++ b/server/stickerd_main.c @@ -33,7 +33,7 @@ #define MAX_ERROR_BUFFER 256 -static GMainLoop *main_loop; +GMainLoop *main_loop = NULL; static GIOChannel *channel = NULL; static guint source = 0; -- 2.7.4 From 04273ab462bac38e61e1155ba755ab37a9a6c859 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 18 Dec 2019 16:20:12 +0900 Subject: [PATCH 07/16] Change reference link in doc file Change-Id: I84396053b9b2550fd99775040f2511c64708f4fc --- doc/sticker_doc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sticker_doc.h b/doc/sticker_doc.h index 9c7b385..4c3b325 100644 --- a/doc/sticker_doc.h +++ b/doc/sticker_doc.h @@ -33,7 +33,7 @@ * It is recommended to design feature related codes in your application for reliability.\n * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n - * More details on featuring your application can be found from Feature Element. + * More details on featuring your application can be found from Feature Element. * */ -- 2.7.4 From 2ba3acf703133cbc8556c7305c20d625b6c2afdb Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 17 Jan 2020 13:58:30 +0900 Subject: [PATCH 08/16] Fix memory leak Variable err going out of scope leaks the storage it points to. Change-Id: I30cada1f00544e19d8369816f5d5269bca9f1283 Signed-off-by: Jihoon Kim --- server/stickerd_db_manager.c | 3 +++ sticker-parser/sticker-parser.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/server/stickerd_db_manager.c b/server/stickerd_db_manager.c index de33abc..8f62916 100644 --- a/server/stickerd_db_manager.c +++ b/server/stickerd_db_manager.c @@ -263,6 +263,9 @@ static sqlite3 *_db_open(void) LOGE("Failed to turn on foreign keys : %s", err); } + if (err) + sqlite3_free(err); + return db; } diff --git a/sticker-parser/sticker-parser.c b/sticker-parser/sticker-parser.c index 5771e72..d0437c1 100644 --- a/sticker-parser/sticker-parser.c +++ b/sticker-parser/sticker-parser.c @@ -91,6 +91,9 @@ static sqlite3 *__db_open(const char *path) LOGE("Failed to turn on foreign keys : %s", err); } + if (err) + sqlite3_free(err); + return db; } -- 2.7.4 From ff8d422357da8146f3ff931f9de833805979f01b Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 17 Jan 2020 13:59:51 +0900 Subject: [PATCH 09/16] Update package version to 0.1.5 Change-Id: I98edb0c09db8639772aa626c26a647774da825bb Signed-off-by: Jihoon Kim --- packaging/capi-ui-sticker.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 9ded0a6..2fddfcb 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.4 +Version: 0.1.5 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4 From bd7666712e20d3c531919951b32a730c8f743d68 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 29 Jan 2020 17:06:20 +0900 Subject: [PATCH 10/16] Revert "Support on-demand launch" This reverts commit b2c90860c6edd7f79225faf89b05470ac6503fee. Change-Id: I2a686b9071817a3071ffddf3de4950261473c7c2 --- client/sticker_dbus.c | 112 +++++++++++++++++----------------- client/sticker_dbus.h | 4 +- consumer/sticker_consumer.c | 3 +- consumer/sticker_consumer_main.h | 2 +- packaging/capi-ui-sticker.spec | 4 +- provider/sticker_provider.c | 3 +- provider/sticker_provider_main.h | 2 +- server/stickerd_data_manager.c | 35 ++--------- server/stickerd_dbus.c | 127 ++++++++++++++++----------------------- server/stickerd_dbus.h | 3 +- server/stickerd_main.c | 2 +- 11 files changed, 122 insertions(+), 175 deletions(-) diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 627fe46..12b6722 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -37,10 +37,9 @@ static void _server_vanished_cb(GDBusConnection *connection, const gchar *name, } //LCOV_EXCL_STOP -static int _dbus_init(GDBusConnection **gdbus_connection) +static int _dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id) { GError *error = NULL; - int watch_id = 0; if (*gdbus_connection == NULL) { GDBusConnection *conn = NULL; @@ -56,15 +55,17 @@ static int _dbus_init(GDBusConnection **gdbus_connection) } LOGD("Connected bus name : %s", g_dbus_connection_get_unique_name(*gdbus_connection)); - watch_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, - STICKER_DBUS_NAME, - G_BUS_NAME_WATCHER_FLAGS_NONE, - _server_appeared_cb, - _server_vanished_cb, - NULL, NULL); + if (*server_watcher_id == 0) { + *server_watcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, + STICKER_DBUS_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + _server_appeared_cb, + _server_vanished_cb, + NULL, NULL); + } - LOGD("watch_id : %d", watch_id); - if (watch_id == 0) { + LOGD("server_watcher_id : %d", *server_watcher_id); + if (*server_watcher_id == 0) { LOGE("Failed to get identifier"); return STICKER_CLIENT_ERROR_IO_ERROR; } @@ -412,54 +413,70 @@ static int _send_sync_message(GDBusConnection *gdbus_connection, GVariant *body, return ret; } +static void _gdbus_reply_message_async_cb(GDBusConnection *connection, GAsyncResult *res, gpointer user_data) +{ + GDBusMessage *reply = NULL; + GError *err = NULL; + + reply = g_dbus_connection_send_message_with_reply_finish(connection, res, &err); + + if (reply) { + if (g_dbus_message_to_gerror(reply, &err)) { + LOGE("error message = %s, code = %d", err->message, err->code); + g_error_free(err); + return; + } + } else { + LOGE("There is no reply"); + return; + } + + if (reply) + g_object_unref(reply); + + LOGD("Reply message was received"); + return; +} + static int _send_async_message(GDBusConnection *gdbus_connection, GVariant *body, char *cmd) { int ret = STICKER_CLIENT_ERROR_NONE; GDBusMessage *msg = NULL; - GError *err = NULL; msg = _get_gbus_message(body, cmd); if (msg == NULL) return STICKER_CLIENT_ERROR_IO_ERROR; - g_dbus_connection_send_message(gdbus_connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &err); + g_dbus_connection_send_message_with_reply( + gdbus_connection, + msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + NULL, + NULL, + (GAsyncReadyCallback)_gdbus_reply_message_async_cb, + NULL); if (msg) g_object_unref(msg); - if (err != NULL) { - ret = STICKER_CLIENT_ERROR_SERVICE_NOT_READY; - LOGE("Error occurred when sending message(%s) : %s", cmd, err->message); - - if (err->code == G_DBUS_ERROR_ACCESS_DENIED) - ret = STICKER_CLIENT_ERROR_PERMISSION_DENIED; - - g_error_free(err); - return ret; - } - return ret; } -static int _monitor_register(GDBusConnection *gdbus_connection, int *server_watcher_id) +static int _monitor_register(GDBusConnection *gdbus_connection) { int ret; GDBusMessage *reply = NULL; - GVariant *reply_body = NULL; ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "sticker_service_register"); + if (reply) + g_object_unref(reply); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_send_sync_message() failed : %d", ret); return ret; } - reply_body = g_dbus_message_get_body(reply); - g_variant_get(reply_body, "(i)", server_watcher_id); - - if (reply) - g_object_unref(reply); - is_server_started = 1; return ret; } @@ -469,10 +486,8 @@ static void _on_name_appeared(GDBusConnection *connection, const gchar *name_owner, gpointer user_data) { - if (is_server_started == 0) { - int *watcher_id = (int *)user_data; - _monitor_register(connection, watcher_id); - } + if (is_server_started == 0) + _monitor_register(connection); } //LCOV_EXCL_START @@ -484,12 +499,12 @@ static void _on_name_vanished(GDBusConnection *connection, } //LCOV_EXCL_STOP -int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id, +int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data) { int ret; - ret = _dbus_init(gdbus_connection); + ret = _dbus_init(gdbus_connection, server_watcher_id); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_dbus_init() failed : %d", ret); return ret; @@ -501,7 +516,7 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id return ret; } - ret = _monitor_register(*gdbus_connection, server_watcher_id); + ret = _monitor_register(*gdbus_connection); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_monitor_register() failed : %d", ret); return ret; @@ -514,7 +529,7 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id G_BUS_NAME_WATCHER_FLAGS_NONE, _on_name_appeared, _on_name_vanished, - server_watcher_id, + NULL, NULL); if (*server_monitor_id == 0) { g_dbus_connection_signal_unsubscribe(*gdbus_connection, *monitor_id); @@ -527,22 +542,8 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id return STICKER_CLIENT_ERROR_NONE; } -int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id) +int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor_id, int *monitor_id) { - int ret; - GVariant *body = NULL; - - if (server_watcher_id) { - body = g_variant_new("(i)", *server_watcher_id); - ret = _send_async_message(gdbus_connection, body, "sticker_service_unregister"); - if (ret != STICKER_CLIENT_ERROR_NONE) { - LOGE("Failed to unregister sticker service"); - return ret; - } - - *server_watcher_id = 0; - } - if (*server_monitor_id) { g_bus_unwatch_name(*server_monitor_id); *server_monitor_id = 0; @@ -553,9 +554,6 @@ int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher *monitor_id = 0; } - if (body) - g_variant_unref(body); - return STICKER_CLIENT_ERROR_NONE; } diff --git a/client/sticker_dbus.h b/client/sticker_dbus.h index 44d2309..d8fcbcd 100644 --- a/client/sticker_dbus.h +++ b/client/sticker_dbus.h @@ -42,9 +42,9 @@ enum sticker_client_error { STICKER_CLIENT_ERROR_IO_ERROR, }; -int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id, +int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data); -int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id); +int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor_id, int *monitor_id); int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_data_h sticker_data); int sticker_dbus_insert_sticker_info_by_json(GDBusConnection *gdbus_connection, const char *app_id, const char *json_path); int sticker_dbus_delete_sticker_info(GDBusConnection *gdbus_connection, int record_id); diff --git a/consumer/sticker_consumer.c b/consumer/sticker_consumer.c index 8602652..7b5d544 100644 --- a/consumer/sticker_consumer.c +++ b/consumer/sticker_consumer.c @@ -180,8 +180,7 @@ EXPORT_API int sticker_consumer_destroy(sticker_consumer_h consumer_handle) return STICKER_ERROR_INVALID_PARAMETER; LOGD("consumer_handle : %p", consumer_handle); - ret = sticker_dbus_shutdown(consumer_handle->gdbus_connection, &consumer_handle->server_watcher_id, - &consumer_handle->server_monitor_id, &consumer_handle->monitor_id); + ret = sticker_dbus_shutdown(consumer_handle->gdbus_connection, &consumer_handle->server_monitor_id, &consumer_handle->monitor_id); if (ret != STICKER_ERROR_NONE) { LOGE("Failed to finalize dbus : %d", ret); free(consumer_handle); diff --git a/consumer/sticker_consumer_main.h b/consumer/sticker_consumer_main.h index 7a08ad2..ba7f90d 100644 --- a/consumer/sticker_consumer_main.h +++ b/consumer/sticker_consumer_main.h @@ -28,7 +28,7 @@ extern "C" struct sticker_consumer_s { GDBusConnection *gdbus_connection; - int server_watcher_id; + guint server_watcher_id; int monitor_id; int server_monitor_id; }; diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 2fddfcb..4781e4b 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -76,8 +76,9 @@ find . -name '*.gcno' -exec cp '{}' gcov-obj ';' rm -rf %{buildroot} %make_install -mkdir -p %{buildroot}%{_prefix}/lib/systemd/system +mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants install -m 0644 %SOURCE1 %{buildroot}%{_unitdir}/capi-ui-sticker.service +%install_service multi-user.target.wants capi-ui-sticker.service mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services install -m 0644 %SOURCE2 %{buildroot}%{_datadir}/dbus-1/system-services/org.tizen.sticker.server.service @@ -106,6 +107,7 @@ chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data %{_libdir}/lib*.so %attr(0755,ui_fw,ui_fw) %{_bindir}/sticker-server %attr(0644,root,root) %{_unitdir}/capi-ui-sticker.service +%attr(0644,root,root) %{_unitdir}/multi-user.target.wants/capi-ui-sticker.service %attr(0644,root,root) %{_datadir}/dbus-1/system-services/org.tizen.sticker.server.service %config %{_sysconfdir}/dbus-1/system.d/capi-ui-sticker.conf %{TZ_SYS_RO_SHARE}/parser-plugins/capi-ui-sticker.info diff --git a/provider/sticker_provider.c b/provider/sticker_provider.c index a271ca6..3761d6a 100644 --- a/provider/sticker_provider.c +++ b/provider/sticker_provider.c @@ -106,8 +106,7 @@ EXPORT_API int sticker_provider_destroy(sticker_provider_h provider_handle) return STICKER_ERROR_INVALID_PARAMETER; LOGD("provider_handle : %p", provider_handle); - ret = sticker_dbus_shutdown(provider_handle->gdbus_connection, &provider_handle->server_watcher_id, - &provider_handle->server_monitor_id, &provider_handle->monitor_id); + ret = sticker_dbus_shutdown(provider_handle->gdbus_connection, &provider_handle->server_monitor_id, &provider_handle->monitor_id); if (ret != STICKER_ERROR_NONE) { LOGE("Failed to finalize dbus : %d", ret); free(provider_handle); diff --git a/provider/sticker_provider_main.h b/provider/sticker_provider_main.h index 4f1c9dd..6280801 100644 --- a/provider/sticker_provider_main.h +++ b/provider/sticker_provider_main.h @@ -28,7 +28,7 @@ extern "C" struct sticker_provider_s { GDBusConnection *gdbus_connection; - int server_watcher_id; + guint server_watcher_id; int monitor_id; int server_monitor_id; sticker_provider_insert_finished_cb insert_finished_cb; diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index f7a1e7b..b0922da 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -42,19 +42,8 @@ #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data") #define MAX_ERROR_BUFFER 256 -static GHashTable *_monitoring_hash = NULL; +static GHashTable *_monitoring_hash; static char error_buffer[MAX_ERROR_BUFFER]; -extern GMainLoop *main_loop; - -static void _check_watcher_exist() -{ - if (_monitoring_hash != NULL && g_hash_table_size(_monitoring_hash) == 0) { - LOGD("Terminate sticker daemon"); - g_hash_table_destroy(_monitoring_hash); - _monitoring_hash = NULL; - g_main_loop_quit(main_loop); - } -} static void _on_name_appeared(GDBusConnection *connection, const gchar *name, @@ -71,19 +60,15 @@ static void _on_name_vanished(GDBusConnection *connection, monitoring_info_s *info = (monitoring_info_s *)user_data; if (info) { - if (_monitoring_hash != NULL && g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(info->watcher_id)) != NULL) { - LOGD("name: %s", name); - g_bus_unwatch_name(info->watcher_id); - delete_monitoring_list(&_monitoring_hash, info->bus_name, info->watcher_id); - } + LOGD("name: %s", name); + g_bus_unwatch_name(info->watcher_id); + delete_monitoring_list(&_monitoring_hash, info->bus_name, info->uid); if (info->bus_name) free(info->bus_name); free(info); info = NULL; } - - _check_watcher_exist(); } static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, const gchar *sender, const gchar *object_path, @@ -92,17 +77,12 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con { LOGD("stickerd method_name: %s, sender: %s", method_name, sender); - if (_monitoring_hash == NULL) - _monitoring_hash = g_hash_table_new(g_direct_hash, g_direct_equal); - GVariant *reply_body = NULL; int ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; if (g_strcmp0(method_name, "sticker_service_register") == 0) { ret = stickerd_server_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash); - } else if (g_strcmp0(method_name, "sticker_service_unregister") == 0) { - ret = stickerd_server_unregister(parameters, &reply_body, sender, &_monitoring_hash); } else if (g_strcmp0(method_name, "insert_sticker_info") == 0) { ret = stickerd_insert_sticker_info(parameters, &reply_body); } else if (g_strcmp0(method_name, "update_sticker_info_by_json") == 0) { @@ -151,8 +131,6 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con if (reply_body) g_variant_unref(reply_body); - - _check_watcher_exist(); } static const GDBusInterfaceVTable _sticker_interface_vtable = { @@ -167,11 +145,6 @@ int stickerd_register_dbus_interface(void) " " " " " " - " " - " " - - " " - " " " " " " diff --git a/server/stickerd_dbus.c b/server/stickerd_dbus.c index 6184033..4ff175a 100644 --- a/server/stickerd_dbus.c +++ b/server/stickerd_dbus.c @@ -29,92 +29,67 @@ #define LOG_TAG "STICKERD_DBUS" static GDBusConnection *_gdbus_connection; -extern GMainLoop *main_loop; int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash) { - int ret = STICKERD_SERVER_ERROR_NONE; - char *m_info_bus_name = NULL; - char *list_bus_name = NULL; + GList *sender_list = NULL; + const char *bus_name = sender; monitoring_info_s *m_info = NULL; + uid_t request_uid = 0; GList *monitoring_list = NULL; - if (reply_body == NULL) - return STICKERD_SERVER_ERROR_INVALID_PARAMETER; - - m_info_bus_name = strdup(sender); - list_bus_name = strdup(sender); - if (m_info_bus_name == NULL || list_bus_name == NULL) { - ret = STICKERD_SERVER_ERROR_IO_ERROR; - goto cleanup; - } + if (bus_name == NULL) + return STICKERD_SERVER_ERROR_IO_ERROR; - LOGD("Add a new sender"); - m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); - if (m_info == NULL) { - LOGE("Failed to alloc memory"); - ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY; - goto cleanup; - } + g_variant_get(parameters, "(i)", &request_uid); + monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)); + sender_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc) strcmp); - m_info->bus_name = m_info_bus_name; - m_info->watcher_id = g_bus_watch_name_on_connection( - _gdbus_connection, - m_info_bus_name, - G_BUS_NAME_WATCHER_FLAGS_NONE, - name_appeared_handler, - name_vanished_handler, - m_info, - NULL); - if (m_info->watcher_id == 0) { - LOGE("Failed to get identifier"); - ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; - goto cleanup; - } + if (sender_list == NULL) { + LOGD("Add a new sender"); + m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); + if (m_info == NULL) { + LOGE("Failed to alloc memory"); + return STICKERD_SERVER_ERROR_IO_ERROR; + } - *reply_body = g_variant_new("(i)", m_info->watcher_id); - if (*reply_body == NULL) { - LOGE("Failed to make reply"); - ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY; - goto cleanup; - } + m_info->bus_name = strdup(bus_name); + m_info->uid = request_uid; + m_info->watcher_id = g_bus_watch_name_on_connection( + _gdbus_connection, + bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + name_appeared_handler, + name_vanished_handler, + m_info, + NULL); + if (m_info->watcher_id == 0) { + LOGE("Failed to get identifier"); + free(m_info->bus_name); + free(m_info); + return STICKERD_SERVER_ERROR_IO_ERROR; + } - LOGD("sender: %s, watcher: %d", sender, m_info->watcher_id); - monitoring_list = g_list_append(monitoring_list, list_bus_name); - if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id)) == NULL) - g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id), monitoring_list); - else + monitoring_list = g_list_append(monitoring_list, strdup(bus_name)); + LOGD("sender: %s, len: %d", sender, g_list_length(monitoring_list)); + if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)) == NULL) + g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(request_uid), monitoring_list); + } else { LOGW("Sender(%s) already exist", sender); - - return STICKERD_SERVER_ERROR_NONE; - -cleanup: - if (m_info_bus_name) - free(m_info_bus_name); - - if (list_bus_name) - free(list_bus_name); - - if (m_info) { - free(m_info); - m_info = NULL; } - return ret; -} - -int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash) -{ - int watcher_id = 0; - - g_variant_get(parameters, "(i)", &watcher_id); - - if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)) != NULL) { - g_bus_unwatch_name(watcher_id); - delete_monitoring_list(monitoring_hash, sender, watcher_id); + *reply_body = g_variant_new("()"); + if (*reply_body == NULL) { + if (m_info) { + if (m_info->bus_name) + free(m_info->bus_name); + free(m_info); + } + monitoring_list = g_list_remove(monitoring_list, bus_name); + LOGE("Failed to make reply"); + return STICKERD_SERVER_ERROR_OUT_OF_MEMORY; } - return STICKERD_SERVER_ERROR_NONE; } @@ -181,15 +156,15 @@ cleanup: return result; } -int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int watcher_id) +int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid) { GList *monitoring_list = NULL; GList *del_list = NULL; char *bus_name; - monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)); + monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(uid)); if (monitoring_list == NULL) { - LOGE("The key(%d) is not found", watcher_id); + LOGE("The key(%d) is not found", uid); return STICKERD_SERVER_ERROR_IO_ERROR; } @@ -204,10 +179,10 @@ int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int monitoring_list = g_list_delete_link(monitoring_list, del_list); if (monitoring_list == NULL) { - g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(watcher_id)); + g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(uid)); } else { monitoring_list = g_list_first(monitoring_list); - g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(watcher_id), monitoring_list); + g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(uid), monitoring_list); } } return STICKERD_SERVER_ERROR_NONE; diff --git a/server/stickerd_dbus.h b/server/stickerd_dbus.h index e8ad143..0197793 100644 --- a/server/stickerd_dbus.h +++ b/server/stickerd_dbus.h @@ -28,13 +28,14 @@ extern "C" { typedef struct monitoring_info { int watcher_id; char *bus_name; + uid_t uid; } monitoring_info_s; int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash); int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash); int stickerd_server_register_dbus_interface(char *introspection_xml, GDBusInterfaceVTable interface_vtable); -int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int monitoring_id); +int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid); int stickerd_send_dbus_message(GVariant *body, const char *dest, char *cmd, CLIENT_LIB lib); #ifdef __cplusplus diff --git a/server/stickerd_main.c b/server/stickerd_main.c index 38d92f9..1650437 100644 --- a/server/stickerd_main.c +++ b/server/stickerd_main.c @@ -33,7 +33,7 @@ #define MAX_ERROR_BUFFER 256 -GMainLoop *main_loop = NULL; +static GMainLoop *main_loop; static GIOChannel *channel = NULL; static guint source = 0; -- 2.7.4 From 0f971197e935e0ae8ed8cdec783b82f9d9a7bcce Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 29 Jan 2020 17:28:48 +0900 Subject: [PATCH 11/16] Fix issues detected by static analysis tool Change-Id: Ib804abcd232d0c31b373458605e4940f291f399b Signed-off-by: Jihoon Kim --- client/sticker_data.c | 3 +-- server/stickerd_data_manager.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/client/sticker_data.c b/client/sticker_data.c index fc4d716..decbfe3 100644 --- a/client/sticker_data.c +++ b/client/sticker_data.c @@ -118,8 +118,7 @@ EXPORT_API int sticker_data_create(sticker_data_h *data_handle) *data_handle = data_struct; cleanup: - if (app_id) - free(app_id); + free(app_id); return ret; } diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index b0922da..71203aa 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -921,6 +921,28 @@ int stickerd_get_sticker_info(GVariant *parameters, GVariant **reply_body) ret = stickerd_db_get_sticker_info_by_record_id(record_id, sticker_info); if (ret != STICKERD_SERVER_ERROR_NONE) { LOGE("Failed to get sticker info"); + + if (sticker_info->app_id) + free(sticker_info->app_id); + + if (sticker_info->uri) + free(sticker_info->uri); + + if (sticker_info->thumbnail) + free(sticker_info->thumbnail); + + if (sticker_info->keyword) + free(sticker_info->keyword); + + if (sticker_info->group) + free(sticker_info->group); + + if (sticker_info->description) + free(sticker_info->description); + + if (sticker_info->date) + free(sticker_info->date); + free(sticker_info); sticker_info = NULL; return STICKERD_SERVER_ERROR_OPERATION_FAILED; -- 2.7.4 From fc1142f67e7b981327659d3a1f66995e0d2f4963 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 29 Jan 2020 18:00:08 +0900 Subject: [PATCH 12/16] Update package version to 0.1.6 Change-Id: Ie81683bf6208614cbd897122e2bf08e2927f195b Signed-off-by: Jihoon Kim --- packaging/capi-ui-sticker.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 4781e4b..d905a62 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.5 +Version: 0.1.6 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4 From 1083756c02e3acafb0413ec1951c6767aa18ce8f Mon Sep 17 00:00:00 2001 From: InHong Han Date: Thu, 30 Jan 2020 14:02:27 +0900 Subject: [PATCH 13/16] Support on-demand launch This reverts commit bd7666712e20d3c531919951b32a730c8f743d68. Change-Id: I370f4226ad6e13a8410604370a41ed6ff3d589a5 --- client/sticker_dbus.c | 112 +++++++++++++++++----------------- client/sticker_dbus.h | 4 +- consumer/sticker_consumer.c | 3 +- consumer/sticker_consumer_main.h | 2 +- packaging/capi-ui-sticker.spec | 4 +- provider/sticker_provider.c | 3 +- provider/sticker_provider_main.h | 2 +- server/stickerd_data_manager.c | 35 +++++++++-- server/stickerd_dbus.c | 127 +++++++++++++++++++++++---------------- server/stickerd_dbus.h | 3 +- server/stickerd_main.c | 2 +- 11 files changed, 175 insertions(+), 122 deletions(-) diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 12b6722..627fe46 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -37,9 +37,10 @@ static void _server_vanished_cb(GDBusConnection *connection, const gchar *name, } //LCOV_EXCL_STOP -static int _dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id) +static int _dbus_init(GDBusConnection **gdbus_connection) { GError *error = NULL; + int watch_id = 0; if (*gdbus_connection == NULL) { GDBusConnection *conn = NULL; @@ -55,17 +56,15 @@ static int _dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ } LOGD("Connected bus name : %s", g_dbus_connection_get_unique_name(*gdbus_connection)); - if (*server_watcher_id == 0) { - *server_watcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, - STICKER_DBUS_NAME, - G_BUS_NAME_WATCHER_FLAGS_NONE, - _server_appeared_cb, - _server_vanished_cb, - NULL, NULL); - } + watch_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, + STICKER_DBUS_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + _server_appeared_cb, + _server_vanished_cb, + NULL, NULL); - LOGD("server_watcher_id : %d", *server_watcher_id); - if (*server_watcher_id == 0) { + LOGD("watch_id : %d", watch_id); + if (watch_id == 0) { LOGE("Failed to get identifier"); return STICKER_CLIENT_ERROR_IO_ERROR; } @@ -413,70 +412,54 @@ static int _send_sync_message(GDBusConnection *gdbus_connection, GVariant *body, return ret; } -static void _gdbus_reply_message_async_cb(GDBusConnection *connection, GAsyncResult *res, gpointer user_data) -{ - GDBusMessage *reply = NULL; - GError *err = NULL; - - reply = g_dbus_connection_send_message_with_reply_finish(connection, res, &err); - - if (reply) { - if (g_dbus_message_to_gerror(reply, &err)) { - LOGE("error message = %s, code = %d", err->message, err->code); - g_error_free(err); - return; - } - } else { - LOGE("There is no reply"); - return; - } - - if (reply) - g_object_unref(reply); - - LOGD("Reply message was received"); - return; -} - static int _send_async_message(GDBusConnection *gdbus_connection, GVariant *body, char *cmd) { int ret = STICKER_CLIENT_ERROR_NONE; GDBusMessage *msg = NULL; + GError *err = NULL; msg = _get_gbus_message(body, cmd); if (msg == NULL) return STICKER_CLIENT_ERROR_IO_ERROR; - g_dbus_connection_send_message_with_reply( - gdbus_connection, - msg, - G_DBUS_SEND_MESSAGE_FLAGS_NONE, - -1, - NULL, - NULL, - (GAsyncReadyCallback)_gdbus_reply_message_async_cb, - NULL); + g_dbus_connection_send_message(gdbus_connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &err); if (msg) g_object_unref(msg); + if (err != NULL) { + ret = STICKER_CLIENT_ERROR_SERVICE_NOT_READY; + LOGE("Error occurred when sending message(%s) : %s", cmd, err->message); + + if (err->code == G_DBUS_ERROR_ACCESS_DENIED) + ret = STICKER_CLIENT_ERROR_PERMISSION_DENIED; + + g_error_free(err); + return ret; + } + return ret; } -static int _monitor_register(GDBusConnection *gdbus_connection) +static int _monitor_register(GDBusConnection *gdbus_connection, int *server_watcher_id) { int ret; GDBusMessage *reply = NULL; + GVariant *reply_body = NULL; ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "sticker_service_register"); - if (reply) - g_object_unref(reply); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_send_sync_message() failed : %d", ret); return ret; } + reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(i)", server_watcher_id); + + if (reply) + g_object_unref(reply); + is_server_started = 1; return ret; } @@ -486,8 +469,10 @@ static void _on_name_appeared(GDBusConnection *connection, const gchar *name_owner, gpointer user_data) { - if (is_server_started == 0) - _monitor_register(connection); + if (is_server_started == 0) { + int *watcher_id = (int *)user_data; + _monitor_register(connection, watcher_id); + } } //LCOV_EXCL_START @@ -499,12 +484,12 @@ static void _on_name_vanished(GDBusConnection *connection, } //LCOV_EXCL_STOP -int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, +int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data) { int ret; - ret = _dbus_init(gdbus_connection, server_watcher_id); + ret = _dbus_init(gdbus_connection); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_dbus_init() failed : %d", ret); return ret; @@ -516,7 +501,7 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ return ret; } - ret = _monitor_register(*gdbus_connection); + ret = _monitor_register(*gdbus_connection, server_watcher_id); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_monitor_register() failed : %d", ret); return ret; @@ -529,7 +514,7 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ G_BUS_NAME_WATCHER_FLAGS_NONE, _on_name_appeared, _on_name_vanished, - NULL, + server_watcher_id, NULL); if (*server_monitor_id == 0) { g_dbus_connection_signal_unsubscribe(*gdbus_connection, *monitor_id); @@ -542,8 +527,22 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_ return STICKER_CLIENT_ERROR_NONE; } -int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor_id, int *monitor_id) +int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id) { + int ret; + GVariant *body = NULL; + + if (server_watcher_id) { + body = g_variant_new("(i)", *server_watcher_id); + ret = _send_async_message(gdbus_connection, body, "sticker_service_unregister"); + if (ret != STICKER_CLIENT_ERROR_NONE) { + LOGE("Failed to unregister sticker service"); + return ret; + } + + *server_watcher_id = 0; + } + if (*server_monitor_id) { g_bus_unwatch_name(*server_monitor_id); *server_monitor_id = 0; @@ -554,6 +553,9 @@ int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor *monitor_id = 0; } + if (body) + g_variant_unref(body); + return STICKER_CLIENT_ERROR_NONE; } diff --git a/client/sticker_dbus.h b/client/sticker_dbus.h index d8fcbcd..44d2309 100644 --- a/client/sticker_dbus.h +++ b/client/sticker_dbus.h @@ -42,9 +42,9 @@ enum sticker_client_error { STICKER_CLIENT_ERROR_IO_ERROR, }; -int sticker_dbus_init(GDBusConnection **gdbus_connection, guint *server_watcher_id, +int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id, int *monitor_id, int *server_monitor_id, CLIENT_LIB lib, void *data); -int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_monitor_id, int *monitor_id); +int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id); int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_data_h sticker_data); int sticker_dbus_insert_sticker_info_by_json(GDBusConnection *gdbus_connection, const char *app_id, const char *json_path); int sticker_dbus_delete_sticker_info(GDBusConnection *gdbus_connection, int record_id); diff --git a/consumer/sticker_consumer.c b/consumer/sticker_consumer.c index 7b5d544..8602652 100644 --- a/consumer/sticker_consumer.c +++ b/consumer/sticker_consumer.c @@ -180,7 +180,8 @@ EXPORT_API int sticker_consumer_destroy(sticker_consumer_h consumer_handle) return STICKER_ERROR_INVALID_PARAMETER; LOGD("consumer_handle : %p", consumer_handle); - ret = sticker_dbus_shutdown(consumer_handle->gdbus_connection, &consumer_handle->server_monitor_id, &consumer_handle->monitor_id); + ret = sticker_dbus_shutdown(consumer_handle->gdbus_connection, &consumer_handle->server_watcher_id, + &consumer_handle->server_monitor_id, &consumer_handle->monitor_id); if (ret != STICKER_ERROR_NONE) { LOGE("Failed to finalize dbus : %d", ret); free(consumer_handle); diff --git a/consumer/sticker_consumer_main.h b/consumer/sticker_consumer_main.h index ba7f90d..7a08ad2 100644 --- a/consumer/sticker_consumer_main.h +++ b/consumer/sticker_consumer_main.h @@ -28,7 +28,7 @@ extern "C" struct sticker_consumer_s { GDBusConnection *gdbus_connection; - guint server_watcher_id; + int server_watcher_id; int monitor_id; int server_monitor_id; }; diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index d905a62..82b6ae0 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -76,9 +76,8 @@ find . -name '*.gcno' -exec cp '{}' gcov-obj ';' rm -rf %{buildroot} %make_install -mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants +mkdir -p %{buildroot}%{_prefix}/lib/systemd/system install -m 0644 %SOURCE1 %{buildroot}%{_unitdir}/capi-ui-sticker.service -%install_service multi-user.target.wants capi-ui-sticker.service mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services install -m 0644 %SOURCE2 %{buildroot}%{_datadir}/dbus-1/system-services/org.tizen.sticker.server.service @@ -107,7 +106,6 @@ chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data %{_libdir}/lib*.so %attr(0755,ui_fw,ui_fw) %{_bindir}/sticker-server %attr(0644,root,root) %{_unitdir}/capi-ui-sticker.service -%attr(0644,root,root) %{_unitdir}/multi-user.target.wants/capi-ui-sticker.service %attr(0644,root,root) %{_datadir}/dbus-1/system-services/org.tizen.sticker.server.service %config %{_sysconfdir}/dbus-1/system.d/capi-ui-sticker.conf %{TZ_SYS_RO_SHARE}/parser-plugins/capi-ui-sticker.info diff --git a/provider/sticker_provider.c b/provider/sticker_provider.c index 3761d6a..a271ca6 100644 --- a/provider/sticker_provider.c +++ b/provider/sticker_provider.c @@ -106,7 +106,8 @@ EXPORT_API int sticker_provider_destroy(sticker_provider_h provider_handle) return STICKER_ERROR_INVALID_PARAMETER; LOGD("provider_handle : %p", provider_handle); - ret = sticker_dbus_shutdown(provider_handle->gdbus_connection, &provider_handle->server_monitor_id, &provider_handle->monitor_id); + ret = sticker_dbus_shutdown(provider_handle->gdbus_connection, &provider_handle->server_watcher_id, + &provider_handle->server_monitor_id, &provider_handle->monitor_id); if (ret != STICKER_ERROR_NONE) { LOGE("Failed to finalize dbus : %d", ret); free(provider_handle); diff --git a/provider/sticker_provider_main.h b/provider/sticker_provider_main.h index 6280801..4f1c9dd 100644 --- a/provider/sticker_provider_main.h +++ b/provider/sticker_provider_main.h @@ -28,7 +28,7 @@ extern "C" struct sticker_provider_s { GDBusConnection *gdbus_connection; - guint server_watcher_id; + int server_watcher_id; int monitor_id; int server_monitor_id; sticker_provider_insert_finished_cb insert_finished_cb; diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index 71203aa..ef332a2 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -42,8 +42,19 @@ #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data") #define MAX_ERROR_BUFFER 256 -static GHashTable *_monitoring_hash; +static GHashTable *_monitoring_hash = NULL; static char error_buffer[MAX_ERROR_BUFFER]; +extern GMainLoop *main_loop; + +static void _check_watcher_exist() +{ + if (_monitoring_hash != NULL && g_hash_table_size(_monitoring_hash) == 0) { + LOGD("Terminate sticker daemon"); + g_hash_table_destroy(_monitoring_hash); + _monitoring_hash = NULL; + g_main_loop_quit(main_loop); + } +} static void _on_name_appeared(GDBusConnection *connection, const gchar *name, @@ -60,15 +71,19 @@ static void _on_name_vanished(GDBusConnection *connection, monitoring_info_s *info = (monitoring_info_s *)user_data; if (info) { - LOGD("name: %s", name); - g_bus_unwatch_name(info->watcher_id); - delete_monitoring_list(&_monitoring_hash, info->bus_name, info->uid); + if (_monitoring_hash != NULL && g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(info->watcher_id)) != NULL) { + LOGD("name: %s", name); + g_bus_unwatch_name(info->watcher_id); + delete_monitoring_list(&_monitoring_hash, info->bus_name, info->watcher_id); + } if (info->bus_name) free(info->bus_name); free(info); info = NULL; } + + _check_watcher_exist(); } static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, const gchar *sender, const gchar *object_path, @@ -77,12 +92,17 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con { LOGD("stickerd method_name: %s, sender: %s", method_name, sender); + if (_monitoring_hash == NULL) + _monitoring_hash = g_hash_table_new(g_direct_hash, g_direct_equal); + GVariant *reply_body = NULL; int ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; if (g_strcmp0(method_name, "sticker_service_register") == 0) { ret = stickerd_server_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash); + } else if (g_strcmp0(method_name, "sticker_service_unregister") == 0) { + ret = stickerd_server_unregister(parameters, &reply_body, sender, &_monitoring_hash); } else if (g_strcmp0(method_name, "insert_sticker_info") == 0) { ret = stickerd_insert_sticker_info(parameters, &reply_body); } else if (g_strcmp0(method_name, "update_sticker_info_by_json") == 0) { @@ -131,6 +151,8 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con if (reply_body) g_variant_unref(reply_body); + + _check_watcher_exist(); } static const GDBusInterfaceVTable _sticker_interface_vtable = { @@ -145,6 +167,11 @@ int stickerd_register_dbus_interface(void) " " " " " " + " " + " " + + " " + " " " " " " diff --git a/server/stickerd_dbus.c b/server/stickerd_dbus.c index 4ff175a..6184033 100644 --- a/server/stickerd_dbus.c +++ b/server/stickerd_dbus.c @@ -29,67 +29,92 @@ #define LOG_TAG "STICKERD_DBUS" static GDBusConnection *_gdbus_connection; +extern GMainLoop *main_loop; int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash) { - GList *sender_list = NULL; - const char *bus_name = sender; + int ret = STICKERD_SERVER_ERROR_NONE; + char *m_info_bus_name = NULL; + char *list_bus_name = NULL; monitoring_info_s *m_info = NULL; - uid_t request_uid = 0; GList *monitoring_list = NULL; - if (bus_name == NULL) - return STICKERD_SERVER_ERROR_IO_ERROR; - - g_variant_get(parameters, "(i)", &request_uid); - monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)); - sender_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc) strcmp); + if (reply_body == NULL) + return STICKERD_SERVER_ERROR_INVALID_PARAMETER; - if (sender_list == NULL) { - LOGD("Add a new sender"); - m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); - if (m_info == NULL) { - LOGE("Failed to alloc memory"); - return STICKERD_SERVER_ERROR_IO_ERROR; - } + m_info_bus_name = strdup(sender); + list_bus_name = strdup(sender); + if (m_info_bus_name == NULL || list_bus_name == NULL) { + ret = STICKERD_SERVER_ERROR_IO_ERROR; + goto cleanup; + } - m_info->bus_name = strdup(bus_name); - m_info->uid = request_uid; - m_info->watcher_id = g_bus_watch_name_on_connection( - _gdbus_connection, - bus_name, - G_BUS_NAME_WATCHER_FLAGS_NONE, - name_appeared_handler, - name_vanished_handler, - m_info, - NULL); - if (m_info->watcher_id == 0) { - LOGE("Failed to get identifier"); - free(m_info->bus_name); - free(m_info); - return STICKERD_SERVER_ERROR_IO_ERROR; - } + LOGD("Add a new sender"); + m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); + if (m_info == NULL) { + LOGE("Failed to alloc memory"); + ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + goto cleanup; + } - monitoring_list = g_list_append(monitoring_list, strdup(bus_name)); - LOGD("sender: %s, len: %d", sender, g_list_length(monitoring_list)); - if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)) == NULL) - g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(request_uid), monitoring_list); - } else { - LOGW("Sender(%s) already exist", sender); + m_info->bus_name = m_info_bus_name; + m_info->watcher_id = g_bus_watch_name_on_connection( + _gdbus_connection, + m_info_bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + name_appeared_handler, + name_vanished_handler, + m_info, + NULL); + if (m_info->watcher_id == 0) { + LOGE("Failed to get identifier"); + ret = STICKERD_SERVER_ERROR_OPERATION_FAILED; + goto cleanup; } - *reply_body = g_variant_new("()"); + *reply_body = g_variant_new("(i)", m_info->watcher_id); if (*reply_body == NULL) { - if (m_info) { - if (m_info->bus_name) - free(m_info->bus_name); - free(m_info); - } - monitoring_list = g_list_remove(monitoring_list, bus_name); LOGE("Failed to make reply"); - return STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY; + goto cleanup; } + + LOGD("sender: %s, watcher: %d", sender, m_info->watcher_id); + monitoring_list = g_list_append(monitoring_list, list_bus_name); + if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id)) == NULL) + g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id), monitoring_list); + else + LOGW("Sender(%s) already exist", sender); + + return STICKERD_SERVER_ERROR_NONE; + +cleanup: + if (m_info_bus_name) + free(m_info_bus_name); + + if (list_bus_name) + free(list_bus_name); + + if (m_info) { + free(m_info); + m_info = NULL; + } + + return ret; +} + +int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash) +{ + int watcher_id = 0; + + g_variant_get(parameters, "(i)", &watcher_id); + + if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)) != NULL) { + g_bus_unwatch_name(watcher_id); + delete_monitoring_list(monitoring_hash, sender, watcher_id); + } + return STICKERD_SERVER_ERROR_NONE; } @@ -156,15 +181,15 @@ cleanup: return result; } -int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid) +int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int watcher_id) { GList *monitoring_list = NULL; GList *del_list = NULL; char *bus_name; - monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(uid)); + monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)); if (monitoring_list == NULL) { - LOGE("The key(%d) is not found", uid); + LOGE("The key(%d) is not found", watcher_id); return STICKERD_SERVER_ERROR_IO_ERROR; } @@ -179,10 +204,10 @@ int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid monitoring_list = g_list_delete_link(monitoring_list, del_list); if (monitoring_list == NULL) { - g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(uid)); + g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(watcher_id)); } else { monitoring_list = g_list_first(monitoring_list); - g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(uid), monitoring_list); + g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(watcher_id), monitoring_list); } } return STICKERD_SERVER_ERROR_NONE; diff --git a/server/stickerd_dbus.h b/server/stickerd_dbus.h index 0197793..e8ad143 100644 --- a/server/stickerd_dbus.h +++ b/server/stickerd_dbus.h @@ -28,14 +28,13 @@ extern "C" { typedef struct monitoring_info { int watcher_id; char *bus_name; - uid_t uid; } monitoring_info_s; int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash); int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash); int stickerd_server_register_dbus_interface(char *introspection_xml, GDBusInterfaceVTable interface_vtable); -int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid); +int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int monitoring_id); int stickerd_send_dbus_message(GVariant *body, const char *dest, char *cmd, CLIENT_LIB lib); #ifdef __cplusplus diff --git a/server/stickerd_main.c b/server/stickerd_main.c index 1650437..38d92f9 100644 --- a/server/stickerd_main.c +++ b/server/stickerd_main.c @@ -33,7 +33,7 @@ #define MAX_ERROR_BUFFER 256 -static GMainLoop *main_loop; +GMainLoop *main_loop = NULL; static GIOChannel *channel = NULL; static guint source = 0; -- 2.7.4 From 953023a4a0d09bb902c018133234d87c8a99ccc0 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Thu, 30 Jan 2020 19:50:47 +0900 Subject: [PATCH 14/16] Fix crash issue If the GDBusMessage created using GVariant, GDBusMessage has an ownership of GVariant. Therefore it is not necessary to free the memory of the GVariant. Change-Id: I6d84b66343a3a2494eb723d60f36180a1d2bdd44 --- client/sticker_dbus.c | 136 ++++++++--------------------------------- server/stickerd_data_manager.c | 3 - 2 files changed, 24 insertions(+), 115 deletions(-) diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 627fe46..7984351 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -530,11 +530,9 @@ int sticker_dbus_init(GDBusConnection **gdbus_connection, int *server_watcher_id int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher_id, int *server_monitor_id, int *monitor_id) { int ret; - GVariant *body = NULL; if (server_watcher_id) { - body = g_variant_new("(i)", *server_watcher_id); - ret = _send_async_message(gdbus_connection, body, "sticker_service_unregister"); + ret = _send_async_message(gdbus_connection, g_variant_new("(i)", *server_watcher_id), "sticker_service_unregister"); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("Failed to unregister sticker service"); return ret; @@ -553,9 +551,6 @@ int sticker_dbus_shutdown(GDBusConnection *gdbus_connection, int *server_watcher *monitor_id = 0; } - if (body) - g_variant_unref(body); - return STICKER_CLIENT_ERROR_NONE; } @@ -574,7 +569,6 @@ int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_ int ret; int ret_id = -1; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; GVariantBuilder *info_builder; GVariantBuilder *keyword_builder; @@ -595,12 +589,7 @@ int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_ keyword_builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)")); g_list_foreach(sticker_data->keyword, (GFunc) _set_keyword_builder, keyword_builder); - body = g_variant_new("(a{iv}a(s))", info_builder, keyword_builder); - - g_variant_builder_unref(info_builder); - g_variant_builder_unref(keyword_builder); - - ret = _send_sync_message(gdbus_connection, body, &reply, "insert_sticker_info"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(a{iv}a(s))", info_builder, keyword_builder), &reply, "insert_sticker_info"); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGW("Failed to save sticker info"); return ret; @@ -611,8 +600,9 @@ int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_ sticker_data->sticker_info_id = ret_id; LOGD("ret_id : %d", ret_id); - if (body) - g_variant_unref(body); + + g_variant_builder_unref(info_builder); + g_variant_builder_unref(keyword_builder); if (reply_body) g_variant_unref(reply_body); @@ -626,16 +616,11 @@ int sticker_dbus_insert_sticker_info(GDBusConnection *gdbus_connection, sticker_ int sticker_dbus_insert_sticker_info_by_json(GDBusConnection *gdbus_connection, const char *app_id, const char *json_path) { int ret; - GVariant *body = NULL; - body = g_variant_new("(ss)", app_id, json_path); - ret = _send_async_message(gdbus_connection, body, "update_sticker_info_by_json"); + ret = _send_async_message(gdbus_connection, g_variant_new("(ss)", app_id, json_path), "update_sticker_info_by_json"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to send json path"); - if (body) - g_variant_unref(body); - return ret; } @@ -643,16 +628,11 @@ int sticker_dbus_delete_sticker_info(GDBusConnection *gdbus_connection, int reco { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; - body = g_variant_new("(i)", record_id); - ret = _send_sync_message(gdbus_connection, body, &reply, "delete_sticker_info"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", record_id), &reply, "delete_sticker_info"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to delete sticker info"); - if (body) - g_variant_unref(body); - if (reply) g_object_unref(reply); @@ -663,7 +643,6 @@ int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_ { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; sticker_data_h origin_data = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s)); @@ -672,9 +651,7 @@ int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_ return STICKER_CLIENT_ERROR_OUT_OF_MEMORY; } - body = g_variant_new("(i)", sticker_data->sticker_info_id); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_info"); - + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", sticker_data->sticker_info_id), &reply, "get_sticker_info"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); _get_sticker_info_from_gvariant(reply_body, origin_data); @@ -683,72 +660,56 @@ int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_ free(origin_data); if (reply) g_object_unref(reply); - if (body) - g_variant_unref(body); return ret; } if (sticker_data->type != 0 && sticker_data->type != origin_data->type) { LOGD("origin_type : %d, new_type : %d", origin_data->type, sticker_data->type); - g_variant_unref(body); - body = g_variant_new("(ii)", sticker_data->sticker_info_id, sticker_data->type); - ret = _send_sync_message(gdbus_connection, body, &reply, "update_sticker_type"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(ii)", sticker_data->sticker_info_id, sticker_data->type), &reply, "update_sticker_type"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to update sticker type"); } if (sticker_data->uri && strcmp(sticker_data->uri, origin_data->uri) != 0) { LOGD("origin_uri : %s, new_uri : %s", origin_data->uri, sticker_data->uri); - g_variant_unref(body); - body = g_variant_new("(isis)", sticker_data->sticker_info_id, sticker_data->app_id, sticker_data->type, sticker_data->uri); - ret = _send_sync_message(gdbus_connection, body, &reply, "update_sticker_uri"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(isis)", sticker_data->sticker_info_id, sticker_data->app_id, sticker_data->type, sticker_data->uri), &reply, "update_sticker_uri"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to update sticker uri"); } if (sticker_data->thumbnail && strcmp(sticker_data->thumbnail, origin_data->thumbnail) != 0) { LOGD("origin_thumbnail : %s, new_thumbnail : %s", origin_data->thumbnail, sticker_data->thumbnail); - g_variant_unref(body); - body = g_variant_new("(is)", sticker_data->sticker_info_id, sticker_data->thumbnail); - ret = _send_sync_message(gdbus_connection, body, &reply, "update_sticker_thumbnail"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(is)", sticker_data->sticker_info_id, sticker_data->thumbnail), &reply, "update_sticker_thumbnail"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to update sticker thumbnail"); } if (sticker_data->description && strcmp(sticker_data->description, origin_data->description) != 0) { LOGD("origin_description : %s, new_description : %s", origin_data->description, sticker_data->description); - g_variant_unref(body); - body = g_variant_new("(is)", sticker_data->sticker_info_id, sticker_data->description); - ret = _send_sync_message(gdbus_connection, body, &reply, "update_sticker_description"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(is)", sticker_data->sticker_info_id, sticker_data->description), &reply, "update_sticker_description"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to update sticker description"); } if (sticker_data->group && strcmp(sticker_data->group, origin_data->group) != 0) { LOGD("origin_group : %s, new_group : %s", origin_data->group, sticker_data->group); - g_variant_unref(body); - body = g_variant_new("(is)", sticker_data->sticker_info_id, sticker_data->group); - ret = _send_sync_message(gdbus_connection, body, &reply, "update_sticker_group"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(is)", sticker_data->sticker_info_id, sticker_data->group), &reply, "update_sticker_group"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to update sticker group"); } if (sticker_data->keyword) { GVariantBuilder *keyword_builder; - g_variant_unref(body); keyword_builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)")); g_list_foreach(sticker_data->keyword, (GFunc) _set_keyword_builder, keyword_builder); - body = g_variant_new("(ia(s))", sticker_data->sticker_info_id, keyword_builder); - ret = _send_sync_message(gdbus_connection, body, &reply, "update_sticker_keyword"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(ia(s))", sticker_data->sticker_info_id, keyword_builder), &reply, "update_sticker_keyword"); if (ret != STICKER_CLIENT_ERROR_NONE) LOGE("failed to update sticker keyword"); + g_variant_builder_unref(keyword_builder); } _free_sticker_data(origin_data); - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -762,12 +723,9 @@ int sticker_dbus_get_sticker_info_by_record_id(GDBusConnection *gdbus_connection { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(i)", record_id); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_info"); - + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", record_id), &reply, "get_sticker_info"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); sticker_data->sticker_info_id = record_id; @@ -777,9 +735,6 @@ int sticker_dbus_get_sticker_info_by_record_id(GDBusConnection *gdbus_connection g_variant_unref(reply_body); } - if (body) - g_variant_unref(body); - if (reply) g_object_unref(reply); @@ -791,7 +746,6 @@ int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group int ret; GDBusMessage *reply = NULL; GVariantIter *iter = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; char *group = NULL; @@ -800,9 +754,7 @@ int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group return STICKER_CLIENT_ERROR_INVALID_PARAMETER; } - body = g_variant_new("()"); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_group_list"); - + ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "get_group_list"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(s))", &iter); @@ -819,9 +771,6 @@ int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group g_variant_iter_free(iter); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -836,7 +785,6 @@ int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, GList **key int ret; GDBusMessage *reply = NULL; GVariantIter *iter = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; char *keyword = NULL; @@ -845,9 +793,7 @@ int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, GList **key return STICKER_CLIENT_ERROR_INVALID_PARAMETER; } - body = g_variant_new("()"); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_keyword_list"); - + ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "get_keyword_list"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(s))", &iter); @@ -864,9 +810,6 @@ int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, GList **key g_variant_iter_free(iter); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -880,20 +823,14 @@ int sticker_dbus_get_sticker_count(GDBusConnection *gdbus_connection, const char { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(s)", app_id); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_count"); - + ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", app_id), &reply, "get_sticker_count"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(i)", count); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -907,19 +844,14 @@ int sticker_dbus_get_all_sticker_info(GDBusConnection *gdbus_connection, int off { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(ii)", offset, count); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_all_sticker_info"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(ii)", offset, count), &reply, "get_all_sticker_info"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(i))", &(*id_iter)); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -933,19 +865,14 @@ int sticker_dbus_get_sticker_info_by_appid(GDBusConnection *gdbus_connection, co { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(sii)", app_id, offset, count); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_info_by_appid"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", app_id, offset, count), &reply, "get_sticker_info_by_appid"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(i))", &(*id_iter)); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -959,19 +886,14 @@ int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, sti { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(iii)", (int)type, offset, count); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_info_by_type"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(iii)", (int)type, offset, count), &reply, "get_sticker_info_by_type"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(i))", &(*id_iter)); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -985,19 +907,14 @@ int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, co { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(sii)", group, offset, count); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_info_by_group"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", group, offset, count), &reply, "get_sticker_info_by_group"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(i))", &(*id_iter)); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); @@ -1011,19 +928,14 @@ int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, { int ret; GDBusMessage *reply = NULL; - GVariant *body = NULL; GVariant *reply_body = NULL; - body = g_variant_new("(sii)", keyword, offset, count); - ret = _send_sync_message(gdbus_connection, body, &reply, "get_sticker_info_by_keyword"); + ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", keyword, offset, count), &reply, "get_sticker_info_by_keyword"); if (ret == STICKER_CLIENT_ERROR_NONE) { reply_body = g_dbus_message_get_body(reply); g_variant_get(reply_body, "(a(i))", &(*id_iter)); } - if (body) - g_variant_unref(body); - if (reply_body) g_variant_unref(reply_body); diff --git a/server/stickerd_data_manager.c b/server/stickerd_data_manager.c index ef332a2..6581922 100644 --- a/server/stickerd_data_manager.c +++ b/server/stickerd_data_manager.c @@ -149,9 +149,6 @@ static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, con g_dbus_method_invocation_return_error(invocation, G_DBUS_ERROR, ret, "sticker error"); } - if (reply_body) - g_variant_unref(reply_body); - _check_watcher_exist(); } -- 2.7.4 From 1651349c5a696e6554d416ab33ea931c84d6b941 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Thu, 30 Jan 2020 20:03:32 +0900 Subject: [PATCH 15/16] Update package version to 0.1.7 Change-Id: I7e0218508c8af0ca10cd5bbbd178cf15c04a9efc --- packaging/capi-ui-sticker.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 82b6ae0..1efb809 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.6 +Version: 0.1.7 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4 From afcc615f5fc43f8d302cafc59e76ff5fb74b8bd2 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Tue, 4 Feb 2020 20:24:54 +0900 Subject: [PATCH 16/16] Modified to create the DB tables when sticker daemon was not launched Change-Id: Ib828fde1922bd96d7664b3fd1fc13a7d4e4a5984 --- sticker-parser/sticker-parser.c | 104 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/sticker-parser/sticker-parser.c b/sticker-parser/sticker-parser.c index d0437c1..f8fba16 100644 --- a/sticker-parser/sticker-parser.c +++ b/sticker-parser/sticker-parser.c @@ -41,11 +41,14 @@ #define LOG_TAG "STICKER_PARSER" #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data") +#define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL);" +#define STICKER_KEYWORD_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_keyword_info(keyword_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, keyword TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)" #define UIFW_ID 502 #define APPFW_ID 301 #define MAX_ERROR_BUFFER 256 static char error_buffer[MAX_ERROR_BUFFER]; +static gboolean is_corrupted = FALSE; typedef struct metadata { const char *key; @@ -74,6 +77,105 @@ static int __get_int_from_object(JsonObject *object, const char *key) return type; } +static void __recover_db() +{ + int ret; + sqlite3 *db = NULL; + char *err = NULL; + const char *db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db"); + + LOGD("Start to recover sticker db"); + if (unlink(db_path) == -1) + LOGE("Failed to remove db file"); + + ret = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + LOGE("Failed to open db : %s", sqlite3_errmsg(db)); + if (unlink(db_path) == -1) + LOGE("Failed to remove db file"); + goto cleanup; + } + + ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err); + if (ret != SQLITE_OK) { + LOGE("Failed to create sticker_info table : %s" , err); + goto cleanup; + } + + ret = sqlite3_exec(db, STICKER_KEYWORD_INFO_CREATE_TABLE, NULL, NULL, &err); + if (ret != SQLITE_OK) { + LOGE("Failed to create sticker_keyword_info table : %s", err); + goto cleanup; + } + + is_corrupted = FALSE; + +cleanup: + if (err) + sqlite3_free(err); + + if (db) + sqlite3_close(db); +} + +static int __integrity_check_cb(void *pid, int argc, char **argv, char **notUsed) +{ + if (strcmp(argv[0], "ok") != 0) { + LOGE("DB integrity check failed : %s", argv[0]); + is_corrupted = TRUE; + return -1; + } + + LOGD("Result integrity : %s", argv[0]); + return 0; +} + +static void __db_init() +{ + int ret; + sqlite3 *db = NULL; + char *err = NULL; + const char *db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db"); + + ret = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + LOGE("Failed to open db : %s", sqlite3_errmsg(db)); + goto cleanup; + } + + ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err); + if (ret != SQLITE_OK) { + LOGE("Failed to create sticker_info table : %s" , err); + goto cleanup; + } + + ret = sqlite3_exec(db, STICKER_KEYWORD_INFO_CREATE_TABLE, NULL, NULL, &err); + if (ret != SQLITE_OK) { + LOGE("Failed to create sticker_keyword_info table : %s", err); + goto cleanup; + } + + ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err); + if (ret != SQLITE_OK) { + LOGE("Failed to set journal_mode : %s", err); + goto cleanup; + } + + ret = sqlite3_exec(db, "PRAGMA integrity_check", __integrity_check_cb, NULL, &err); + if (ret != SQLITE_OK) + LOGE("Failed to check integrity : %s", err); + +cleanup: + if (err) + sqlite3_free(err); + + if (db) + sqlite3_close(db); + + if (ret == SQLITE_CORRUPT || ret == SQLITE_NOTADB || is_corrupted) + __recover_db(); +} + static sqlite3 *__db_open(const char *path) { int ret; @@ -627,6 +729,8 @@ int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList * char *file_path = NULL; int ret = 0; + __db_init(); + ret = package_info_create(pkgid, &package_info); if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info == NULL) { LOGE("failed to create package_info. ret: %d", ret); -- 2.7.4