From c4286a559c95f9d9bef09d028a435c210f99e6fb Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 18 Oct 2019 19:53:43 +0900 Subject: [PATCH 01/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 02/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 03/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 04/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 05/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 06/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 07/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 08/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 09/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 10/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 11/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 12/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 From 4917d4e52c551a83289ddb858082fb56fd4e0bce Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Tue, 4 Feb 2020 20:08:47 +0900 Subject: [PATCH 13/16] Add initial companion service Change-Id: I2edf5681b4f6998d778e2c40b7a8c4fde17fc518 Signed-off-by: Jihoon Kim --- CMakeLists.txt | 7 +- companion/CMakeLists.txt | 43 ++++ companion/inc/ft.h | 33 +++ companion/inc/log.h | 33 +++ companion/inc/main.h | 14 ++ companion/inc/sticker_info.h | 10 + companion/org.tizen.sticker-consumer.manifest | 5 + companion/res/xml/accessoryservices.xml | 21 ++ companion/src/ft.cpp | 350 ++++++++++++++++++++++++++ companion/src/main.cpp | 44 ++++ companion/src/sticker_info.cpp | 106 ++++++++ companion/tizen-manifest.xml | 17 ++ packaging/capi-ui-sticker.spec | 53 +++- 13 files changed, 733 insertions(+), 3 deletions(-) create mode 100644 companion/CMakeLists.txt create mode 100644 companion/inc/ft.h create mode 100644 companion/inc/log.h create mode 100644 companion/inc/main.h create mode 100644 companion/inc/sticker_info.h create mode 100644 companion/org.tizen.sticker-consumer.manifest create mode 100644 companion/res/xml/accessoryservices.xml create mode 100644 companion/src/ft.cpp create mode 100644 companion/src/main.cpp create mode 100644 companion/src/sticker_info.cpp create mode 100644 companion/tizen-manifest.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index e27150e..b03a770 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,5 +46,10 @@ ADD_SUBDIRECTORY(consumer) ## Sticker parser ## ADD_SUBDIRECTORY(sticker-parser) +IF(DEFINED COMPANION_MODE) +## Sticker companion service ## +ADD_SUBDIRECTORY(companion) +ENDIF() + ## config ## -INSTALL(FILES ${CMAKE_SOURCE_DIR}/capi-ui-sticker.info DESTINATION ${TZ_SYS_RO_SHARE}/parser-plugins) \ No newline at end of file +INSTALL(FILES ${CMAKE_SOURCE_DIR}/capi-ui-sticker.info DESTINATION ${TZ_SYS_RO_SHARE}/parser-plugins) diff --git a/companion/CMakeLists.txt b/companion/CMakeLists.txt new file mode 100644 index 0000000..e326999 --- /dev/null +++ b/companion/CMakeLists.txt @@ -0,0 +1,43 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(sticker-consumer CXX) + +SET(SRCS + src/main.cpp + src/ft.cpp + src/sticker_info.cpp +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs_test REQUIRED + capi-base-common + dlog + capi-appfw-service-application + sap-client-stub-api +) + +INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/companion/inc) + +FOREACH(flag ${pkgs_test_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +ADD_DEFINITIONS("-DEXPORTED=__attribute__((visibility(\"default\")))") + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -fPIE") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") + +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_test_LDFLAGS} capi-ui-sticker-provider) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${TZ_SYS_RO_APP}/org.tizen.${PROJECT_NAME}/bin) +INSTALL(FILES ${CMAKE_BINARY_DIR}/companion/tizen-manifest.xml DESTINATION ${TZ_SYS_RO_PACKAGES} RENAME org.tizen.${PROJECT_NAME}.xml) +INSTALL(FILES ${CMAKE_BINARY_DIR}/companion/res/xml/accessoryservices.xml DESTINATION ${TZ_SYS_RO_APP}/org.tizen.${PROJECT_NAME}/res/xml) diff --git a/companion/inc/ft.h b/companion/inc/ft.h new file mode 100644 index 0000000..9aa4b9b --- /dev/null +++ b/companion/inc/ft.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +#ifndef __FT_H__ +#define __FT_H__ + +#if !defined(PACKAGE) +#define PACKAGE "org.tizen.sticker-consumer" +#endif + +#define GRP_MAIN "main" + +void reject_file(void); +void accept_file(void); +gboolean initialize_sap(void); + +void sap_file_transfer_get_receive_filepath(char **filepath); + +#endif /* __FT_H__ */ diff --git a/companion/inc/log.h b/companion/inc/log.h new file mode 100644 index 0000000..df3f0b2 --- /dev/null +++ b/companion/inc/log.h @@ -0,0 +1,33 @@ +#ifndef __debug_H__ +#define __debug_H__ + +#include + +#ifndef _LOG +#define _LOG(logLevel, fmt, ...) do { \ + dlog_print(logLevel, LOG_TAG, "%s : %s(%d) > " fmt, rindex(__FILE__, '/')+1, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ +} while (0) +#endif + +#ifndef LOGD +#define LOGD(format, arg...) _LOG(DLOG_DEBUG, format, ##arg) +#endif + +#ifndef LOGI +#define LOGI(format, arg...) _LOG(DLOG_INFO, format, ##arg) +#endif + +#ifndef LOGW +#define LOGW(format, arg...) _LOG(DLOG_WARN, format, ##arg) +#endif + +#ifndef LOGE +#define LOGE(format, arg...) _LOG(DLOG_ERROR, format, ##arg) +#endif + +#ifndef LOGF +#define LOGF(format, arg...) _LOG(DLOG_FATAL, format, ##arg) +#endif + +#endif /* __debug_H__ */ + diff --git a/companion/inc/main.h b/companion/inc/main.h new file mode 100644 index 0000000..361bdd5 --- /dev/null +++ b/companion/inc/main.h @@ -0,0 +1,14 @@ +#include +#include +#include + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#define TAG "STICKER_CONSUMER" + +#if !defined(PACKAGE) +#define PACKAGE "org.tizen.sticker-consumer" +#endif + +#endif /* __MAIN_H__ */ diff --git a/companion/inc/sticker_info.h b/companion/inc/sticker_info.h new file mode 100644 index 0000000..b06c885 --- /dev/null +++ b/companion/inc/sticker_info.h @@ -0,0 +1,10 @@ +#ifndef __STICKER_INFO_H__ +#define __STICKER_INFO_H__ + +#define TAG "STICKER_CONSUMER" + +void insert_sticker_data(const char *filepath, const char *keyword, const char *group, const char *desc); +void create_sticker_provider_handle(void); +void destroy_sticker_provider_handle(void); + +#endif /* __STICKER_INF_H__ */ \ No newline at end of file diff --git a/companion/org.tizen.sticker-consumer.manifest b/companion/org.tizen.sticker-consumer.manifest new file mode 100644 index 0000000..017d22d --- /dev/null +++ b/companion/org.tizen.sticker-consumer.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/companion/res/xml/accessoryservices.xml b/companion/res/xml/accessoryservices.xml new file mode 100644 index 0000000..6419f03 --- /dev/null +++ b/companion/res/xml/accessoryservices.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/companion/src/ft.cpp b/companion/src/ft.cpp new file mode 100644 index 0000000..1cc0c38 --- /dev/null +++ b/companion/src/ft.cpp @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sticker_info.h" + +using namespace std; + +struct priv { + sap_agent_h agent; + sap_file_transaction_h socket; +}; + +static struct priv priv_data = { 0 }; + +gboolean file_on_progress = 0; +static string incoming_file_name; +static string recv_filepath; + +static void _on_send_completed(sap_file_transaction_h file_transaction, + sap_ft_transfer_e result, + const char *file_path, + void *user_data) +{ + char error_message[100]; + + dlog_print(DLOG_INFO, TAG, "# transfer completed"); + + if (priv_data.socket) { + sap_file_transfer_destroy(file_transaction); + priv_data.socket = NULL; + } + + if (result == SAP_FT_TRANSFER_SUCCESS) { + sprintf(error_message, "Transfer Completed"); + dlog_print(DLOG_INFO, TAG, "Transfer Completed"); + + if (chmod(recv_filepath.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) { + dlog_print(DLOG_ERROR, TAG, "Failed to change permission : %s. error : %s", recv_filepath.c_str(), strerror(errno)); + } + else { + dlog_print(DLOG_INFO, TAG, "Succeed to change permission : %s", recv_filepath.c_str()); + create_sticker_provider_handle(); + insert_sticker_data(recv_filepath.c_str(), "keyword", "group", "test icon"); + destroy_sticker_provider_handle(); + } + } else { + switch (result) { + case (SAP_FT_TRANSFER_FAIL_CHANNEL_IO): { + sprintf(error_message, "Channel IO Error."); + dlog_print(DLOG_WARN, TAG, "Channel IO Error."); + break; + } + + case (SAP_FT_TRANSFER_FAIL_FILE_IO): { + sprintf(error_message, "File IO Error."); + dlog_print(DLOG_WARN, TAG, "File IO Error."); + break; + } + + case (SAP_FT_TRANSFER_FAIL_CMD_DROPPED): { + sprintf(error_message, "Transfer dropped."); + dlog_print(DLOG_WARN, TAG, "Transfer dropped."); + break; + } + + case (SAP_FT_TRANSFER_FAIL_PEER_UNRESPONSIVE): { + sprintf(error_message, "Peer Un Responsive."); + dlog_print(DLOG_WARN, TAG, "Peer Un Responsive."); + break; + } + + case (SAP_FT_TRANSFER_FAIL_PEER_CONN_LOST): { + sprintf(error_message, "Connection Lost."); + dlog_print(DLOG_WARN, TAG, "Connection Lost."); + break; + } + + case (SAP_FT_TRANSFER_FAIL_PEER_CANCELLED): { + sprintf(error_message, "Peer Cancelled."); + dlog_print(DLOG_WARN, TAG, "Peer Cancelled."); + break; + } + + case (SAP_FT_TRANSFER_FAIL_SPACE_NOT_AVAILABLE): { + sprintf(error_message, "No Space."); + dlog_print(DLOG_WARN, TAG, "No Space."); + break; + } + + default: + sprintf(error_message, "Unknown Error"); + dlog_print(DLOG_WARN, TAG, "Unknown Error"); + } + } + + file_on_progress = 0; +} + +static void _on_sending_file_in_progress(sap_file_transaction_h file_transaction, + unsigned short int percentage_progress, + void *user_data) +{ + dlog_print(DLOG_INFO, TAG, "# progress %d", percentage_progress); +} + +static void __set_file_transfer_cb(sap_file_transaction_h file_socket) +{ + dlog_print(DLOG_INFO, TAG, "# set callbacks"); + sap_file_transfer_set_progress_cb(file_socket, _on_sending_file_in_progress, NULL); + + sap_file_transfer_set_done_cb(file_socket, _on_send_completed, NULL); +} + +void accept_file() +{ + int ret; + char file_path[100]; + char *data_path = NULL; + + data_path = app_get_shared_data_path(); + dlog_print(DLOG_INFO, TAG, "Path : %s", data_path); + sprintf(file_path, "%s/%s", data_path, incoming_file_name.c_str()); + dlog_print(DLOG_INFO, TAG, "Receive filepath : %s", file_path); + recv_filepath = string(file_path); + free(data_path); + + ret = sap_file_transfer_receive(priv_data.socket, file_path); + switch(ret) { + case SAP_RESULT_PERMISSION_DENIED: + dlog_print(DLOG_WARN, TAG, "permission denied"); + break; + case SAP_RESULT_FAILURE: + dlog_print(DLOG_WARN, TAG, "Fail"); + break; + case SAP_RESULT_SUCCESS: + dlog_print(DLOG_INFO, TAG, "Success"); + break; + } + + file_on_progress = 1; +} + +void sap_file_transfer_get_receive_filepath(char **filepath) +{ + *filepath = strdup(recv_filepath.c_str()); +} + +void reject_file() +{ + int ret = sap_file_transfer_reject(priv_data.socket); + dlog_print(DLOG_INFO, TAG, "ret : %d", ret); + + file_on_progress = 0; +} + +static void _on_receive_file_cb(sap_peer_agent_h peer_agent_h, + sap_file_transaction_h socket, + const char *file_path, + void *user_data) +{ + file_on_progress = 1; + priv_data.socket = socket; + dlog_print(DLOG_INFO, TAG, "# incoming file request."); + __set_file_transfer_cb(priv_data.socket); + + incoming_file_name = file_path; + std::size_t found = incoming_file_name.find_last_of("/"); + incoming_file_name = incoming_file_name.substr(found+1); + + dlog_print(DLOG_INFO, TAG, "# file path : %s, incoming file name : %s", file_path, incoming_file_name.c_str()); + + accept_file(); +} + +void conn_terminated(sap_peer_agent_h peer_agent, + sap_socket_h socket, + sap_service_connection_terminated_reason_e result, + void *user_data) +{ + dlog_print(DLOG_INFO, TAG, "connection terminated"); +} + +void +on_message_received(sap_peer_agent_h peer_agent, unsigned int payload_length, void *buffer, + void *user_data) /* message exchange on_receive callback (sap_agent_data_received_cb) */ +{ + char *peer_app; + sap_peer_agent_get_app_name(peer_agent, &peer_app); + dlog_print(DLOG_INFO, TAG, "received data: %s, len:%d from %s", (char *)buffer, payload_length, peer_app); + g_free(peer_app); +} + +void +on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned int payload_length, void *buffer, + void *user_data) /* message exchange on_receive callback (sap_agent_data_received_cb) */ +{ + dlog_print(DLOG_INFO, TAG, "received data: %s, len:%d", (char *)buffer, payload_length); +} + +static void on_conn_req(sap_peer_agent_h peer_agent, + sap_socket_h socket, + sap_service_connection_result_e result, + void *user_data) +{ + sap_peer_agent_accept_service_connection(peer_agent); + sap_peer_agent_set_service_connection_terminated_cb(peer_agent, conn_terminated, NULL); + + sap_socket_set_data_received_cb(socket, on_data_received, peer_agent); +} + +static void on_agent_initialized(sap_agent_h agent, + sap_agent_initialized_result_e result, + void *user_data) +{ + switch (result) { + case SAP_AGENT_INITIALIZED_RESULT_SUCCESS: + + dlog_print(DLOG_DEBUG, TAG, "agent is initialized"); + + priv_data.agent = agent; + + sap_file_transfer_set_incoming_file_cb(agent, _on_receive_file_cb, NULL); + sap_agent_set_service_connection_requested_cb(agent, on_conn_req, NULL); + + break; + + case SAP_AGENT_INITIALIZED_RESULT_DUPLICATED: + dlog_print(DLOG_ERROR, TAG, "duplicate registration"); + + break; + + case SAP_AGENT_INITIALIZED_RESULT_INVALID_ARGUMENTS: + dlog_print(DLOG_ERROR, TAG, "invalid arguments"); + + break; + + case SAP_AGENT_INITIALIZED_RESULT_INTERNAL_ERROR: + dlog_print(DLOG_ERROR, TAG, "internal sap error"); + + break; + + default: + dlog_print(DLOG_ERROR, TAG, "unknown status (%d)", result); + + break; + } +} + +static void _on_device_status_changed(sap_device_status_e status, + sap_transport_type_e transport_type, + void *user_data) +{ + dlog_print(DLOG_DEBUG, TAG, "%s, status :%d", __func__, status); + + switch (transport_type) { + case SAP_TRANSPORT_TYPE_BT: + dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): bt", transport_type); + break; + + case SAP_TRANSPORT_TYPE_BLE: + dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): ble", transport_type); + break; + + case SAP_TRANSPORT_TYPE_TCP: + dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): tcp/ip", transport_type); + break; + + case SAP_TRANSPORT_TYPE_USB: + dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): usb", transport_type); + break; + + case SAP_TRANSPORT_TYPE_MOBILE: + dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): mobile", transport_type); + break; + + default: + dlog_print(DLOG_ERROR, TAG, "unknown transport_type (%d)", transport_type); + break; + } + + switch (status) { + case SAP_DEVICE_STATUS_DETACHED: + dlog_print(DLOG_DEBUG, TAG, "device is not connected."); + break; + + case SAP_DEVICE_STATUS_ATTACHED: + dlog_print(DLOG_DEBUG, TAG, "Attached calling find peer now"); + break; + + default: + dlog_print(DLOG_ERROR, TAG, "unknown status (%d)", status); + break; + } +} + +gboolean agent_initialize() +{ + int result = 0; + + do { + result = sap_agent_initialize(priv_data.agent, "/sample/filetransfer", SAP_AGENT_ROLE_PROVIDER, + on_agent_initialized, NULL); + + dlog_print(DLOG_DEBUG, TAG, "SAP >>> getRegisteredServiceAgent() >>> %d", result); + } while (result != SAP_RESULT_SUCCESS); + + return TRUE; +} + +gboolean initialize_sap(void) +{ + sap_agent_h agent = NULL; + + sap_agent_create(&agent); + + priv_data.agent = agent; + + agent_initialize(); + + sap_set_device_status_changed_cb(_on_device_status_changed, NULL); + + return TRUE; +} diff --git a/companion/src/main.cpp b/companion/src/main.cpp new file mode 100644 index 0000000..3192e42 --- /dev/null +++ b/companion/src/main.cpp @@ -0,0 +1,44 @@ +#include "main.h" +#include "ft.h" +#include +#include + +static bool app_create(void *data) +{ + /* Hook to take necessary actions before main event loop starts + Initialize UI resources and application's data + If this function returns true, the main loop of application starts + If this function returns false, the application is terminated */ + + initialize_sap(); + + return true; +} + +static void app_control(app_control_h app_control, void *data) +{ + /* Handle the launch request. */ +} + +static void app_terminate(void *data) +{ + /* Release all resources. */ +} + +int main(int argc, char *argv[]) +{ + int ret = 0; + + service_app_lifecycle_callback_s event_callback; + memset(&event_callback, 0x0, sizeof(service_app_lifecycle_callback_s)); + + event_callback.create = (service_app_create_cb)app_create; + event_callback.terminate = (service_app_terminate_cb)app_terminate; + event_callback.app_control = (service_app_control_cb)app_control; + + ret = service_app_main(argc, argv, &event_callback, NULL); + if (ret != APP_ERROR_NONE) { + dlog_print(DLOG_ERROR, TAG, "app_main() is failed. err = %d", ret); + } + return ret; +} diff --git a/companion/src/sticker_info.cpp b/companion/src/sticker_info.cpp new file mode 100644 index 0000000..280b357 --- /dev/null +++ b/companion/src/sticker_info.cpp @@ -0,0 +1,106 @@ +#include "sticker_info.h" +#include +#include +#include +#include +#include + +static sticker_provider_h sticker_provider = NULL; + +sticker_data_h +set_sticker_data(sticker_data_uri_type_e type, const char* uri, const char* keyword, +int len, const char* group, const char* thumbnail, const char* description) +{ + + sticker_data_h sticker_data; + int ret; + + /* Creates a Sticker data handle */ + ret = sticker_data_create(&sticker_data); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to create sticker data"); + } + + /* Sets the URI and URI type of the sticker */ + ret = sticker_data_set_uri(sticker_data, type, uri); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to set uri"); + } + + //for (int i = 0; i < len; i++) + { + /* Adds a keyword of the sticker to the list */ + ret = sticker_data_add_keyword(sticker_data, keyword); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to add keyword"); + } + } + + /* Sets the group name of the sticker */ + ret = sticker_data_set_group_name(sticker_data, group); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to set group name"); + } + + /* Sets the thumbnail local path of the sticker */ + if (thumbnail) { + ret = sticker_data_set_thumbnail(sticker_data, thumbnail); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to set thumbnail"); + } + } + + /* Sets the description of the sticker */ + ret = sticker_data_set_description(sticker_data, description); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to set description"); + } + + return sticker_data; +} + +void +insert_sticker_data(const char *filepath, const char *keyword, const char *group, const char *desc) +{ + sticker_data_h data_handle; + int ret; + + data_handle = set_sticker_data(STICKER_DATA_URI_LOCAL_PATH, filepath, keyword, 1, group, NULL, desc); + + ret = sticker_provider_insert_data(sticker_provider, data_handle); + if (ret != STICKER_ERROR_NONE) { + dlog_print(DLOG_ERROR, TAG, "Failed to insert data. error code : %x. message : %s", ret, get_error_message(ret)); + } + else { + dlog_print(DLOG_INFO, TAG, "Succeeded to insert data"); + } + + /* Destroys a sticker data handle */ + ret = sticker_data_destroy(data_handle); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to destroy sticker data"); + } +} + +void create_sticker_provider_handle(void) +{ + int ret; + ret = sticker_provider_create(&sticker_provider); + if (ret != STICKER_ERROR_NONE) { + /* Error handling */ + dlog_print(DLOG_ERROR, TAG, "Failed to create sticker provider"); + } +} + +void destroy_sticker_provider_handle(void) +{ + sticker_provider_destroy(sticker_provider); + sticker_provider = NULL; +} \ No newline at end of file diff --git a/companion/tizen-manifest.xml b/companion/tizen-manifest.xml new file mode 100644 index 0000000..f5f784e --- /dev/null +++ b/companion/tizen-manifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + http://developer.samsung.com/tizen/privilege/accessoryprotocol + http://tizen.org/privilege/content.write + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/appdir.shareddata + + + diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 1efb809..c57ea60 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -23,6 +23,16 @@ BuildRequires: pkgconfig(json-glib-1.0) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(sqlite3) + +%if 0%{?sec_product_feature_profile_wearable} +BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(capi-appfw-service-application) +BuildRequires: pkgconfig(sap-client-stub-api) +BuildRequires: hash-signer + +Requires(post): signing-client +%endif + Requires: security-config Requires(post): /sbin/ldconfig Requires(post): dbus @@ -36,9 +46,24 @@ Summary: Sticker client library and daemon (Development) Group: Graphics & UI Framework/Input Requires: %{name} = %{version}-%{release} +%if 0%{?sec_product_feature_profile_wearable} +%define _companion_app_name org.tizen.sticker-consumer + +%package -n %{_companion_app_name} +Summary: Sticker companion service +Group: Graphics & UI Framework/Input +Requires: %{name} = %{version}-%{release} +%endif + + %description devel Sticker client library and daemon (Development) +%if 0%{?sec_product_feature_profile_wearable} +%description -n %{_companion_app_name} +Sticker companion service +%endif + %if 0%{?gcov:1} %package gcov Summary: Sticker client library and daemon (gcov) @@ -63,8 +88,13 @@ 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 . \ +%if 0%{?sec_product_feature_profile_wearable} + -DCOMPANION_MODE=true \ +%endif + -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 \ + -DTZ_SYS_RO_APP=%TZ_SYS_RO_APP -DTZ_SYS_RO_PACKAGES=%TZ_SYS_RO_PACKAGES make %{?jobs:-j%jobs} %if 0%{?gcov:1} @@ -90,6 +120,14 @@ mkdir -p %{buildroot}%{_datadir}/gcov/obj install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj %endif +%if 0%{?sec_product_feature_profile_wearable} +%define tizen_sign 1 +%define tizen_sign_base %{TZ_SYS_RO_APP}/%{_companion_app_name} +%define tizen_sign_level public +%define tizen_author_sign 1 +%define tizen_dist_sign 1 +%endif + %post /sbin/ldconfig @@ -98,6 +136,10 @@ chown -R ui_fw:ui_fw %{TZ_SYS_SHARE}/sticker-data chsmack -t %{TZ_SYS_SHARE}/sticker-data chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data +%if 0%{?sec_product_feature_profile_wearable} +/usr/bin/signing-client/hash-signer-client.sh -a -d -p platform %{TZ_SYS_RO_APP}/%{_companion_app_name} +%endif + %postun -p /sbin/ldconfig %files @@ -123,6 +165,13 @@ chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data %{_includedir}/sticker_consumer.h %{_includedir}/sticker_provider.h +%if 0%{?sec_product_feature_profile_wearable} +%files -n %{_companion_app_name} +%manifest companion/%{_companion_app_name}.manifest +%{TZ_SYS_RO_PACKAGES}/%{_companion_app_name}.xml +%{TZ_SYS_RO_APP}/%{_companion_app_name}/* +%endif + %if 0%{?gcov:1} %files gcov %{_datadir}/gcov/obj/* -- 2.7.4 From 4486b1d623aa47919a457c33ad308987eca98240 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 7 Feb 2020 11:38:18 +0900 Subject: [PATCH 14/16] Update package version to 0.1.8 Change-Id: I7c23134439895d79a90ff756dcf92591f3c0f18e 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 c57ea60..3db2912 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.7 +Version: 0.1.8 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4 From 9f0e658cd2f4a1c6123f17ae15bc1ed06e2f64ae Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 7 Feb 2020 16:04:58 +0900 Subject: [PATCH 15/16] Rename from companion to receiver Change-Id: I16e037853f89dd05363e49b56da7d017685357d7 Signed-off-by: Jihoon Kim --- CMakeLists.txt | 2 +- packaging/capi-ui-sticker.spec | 4 ++-- {companion => receiver}/CMakeLists.txt | 8 ++++---- {companion => receiver}/inc/ft.h | 2 +- {companion => receiver}/inc/log.h | 0 {companion => receiver}/inc/main.h | 4 ++-- {companion => receiver}/inc/sticker_info.h | 4 ++-- {companion => receiver}/org.tizen.sticker-consumer.manifest | 0 receiver/org.tizen.sticker-receiver.manifest | 5 +++++ {companion => receiver}/res/xml/accessoryservices.xml | 4 ++-- {companion => receiver}/src/ft.cpp | 0 {companion => receiver}/src/main.cpp | 0 {companion => receiver}/src/sticker_info.cpp | 0 {companion => receiver}/tizen-manifest.xml | 6 +++--- 14 files changed, 22 insertions(+), 17 deletions(-) rename {companion => receiver}/CMakeLists.txt (74%) rename {companion => receiver}/inc/ft.h (95%) rename {companion => receiver}/inc/log.h (100%) rename {companion => receiver}/inc/main.h (67%) rename {companion => receiver}/inc/sticker_info.h (80%) rename {companion => receiver}/org.tizen.sticker-consumer.manifest (100%) create mode 100644 receiver/org.tizen.sticker-receiver.manifest rename {companion => receiver}/res/xml/accessoryservices.xml (81%) rename {companion => receiver}/src/ft.cpp (100%) rename {companion => receiver}/src/main.cpp (100%) rename {companion => receiver}/src/sticker_info.cpp (100%) rename {companion => receiver}/tizen-manifest.xml (79%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b03a770..e2f43a7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ ADD_SUBDIRECTORY(sticker-parser) IF(DEFINED COMPANION_MODE) ## Sticker companion service ## -ADD_SUBDIRECTORY(companion) +ADD_SUBDIRECTORY(receiver) ENDIF() ## config ## diff --git a/packaging/capi-ui-sticker.spec b/packaging/capi-ui-sticker.spec index 3db2912..d14e2c0 100644 --- a/packaging/capi-ui-sticker.spec +++ b/packaging/capi-ui-sticker.spec @@ -47,7 +47,7 @@ Group: Graphics & UI Framework/Input Requires: %{name} = %{version}-%{release} %if 0%{?sec_product_feature_profile_wearable} -%define _companion_app_name org.tizen.sticker-consumer +%define _companion_app_name org.tizen.sticker-receiver %package -n %{_companion_app_name} Summary: Sticker companion service @@ -167,7 +167,7 @@ chsmack -a "System::Shared" %{TZ_SYS_SHARE}/sticker-data %if 0%{?sec_product_feature_profile_wearable} %files -n %{_companion_app_name} -%manifest companion/%{_companion_app_name}.manifest +%manifest receiver/%{_companion_app_name}.manifest %{TZ_SYS_RO_PACKAGES}/%{_companion_app_name}.xml %{TZ_SYS_RO_APP}/%{_companion_app_name}/* %endif diff --git a/companion/CMakeLists.txt b/receiver/CMakeLists.txt similarity index 74% rename from companion/CMakeLists.txt rename to receiver/CMakeLists.txt index e326999..3d1e6a9 100644 --- a/companion/CMakeLists.txt +++ b/receiver/CMakeLists.txt @@ -1,5 +1,5 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(sticker-consumer CXX) +PROJECT(sticker-receiver CXX) SET(SRCS src/main.cpp @@ -15,7 +15,7 @@ pkg_check_modules(pkgs_test REQUIRED sap-client-stub-api ) -INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/companion/inc) +INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/receiver/inc) FOREACH(flag ${pkgs_test_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -39,5 +39,5 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_test_LDFLAGS} capi-ui-sticker-provider) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${TZ_SYS_RO_APP}/org.tizen.${PROJECT_NAME}/bin) -INSTALL(FILES ${CMAKE_BINARY_DIR}/companion/tizen-manifest.xml DESTINATION ${TZ_SYS_RO_PACKAGES} RENAME org.tizen.${PROJECT_NAME}.xml) -INSTALL(FILES ${CMAKE_BINARY_DIR}/companion/res/xml/accessoryservices.xml DESTINATION ${TZ_SYS_RO_APP}/org.tizen.${PROJECT_NAME}/res/xml) +INSTALL(FILES ${CMAKE_BINARY_DIR}/receiver/tizen-manifest.xml DESTINATION ${TZ_SYS_RO_PACKAGES} RENAME org.tizen.${PROJECT_NAME}.xml) +INSTALL(FILES ${CMAKE_BINARY_DIR}/receiver/res/xml/accessoryservices.xml DESTINATION ${TZ_SYS_RO_APP}/org.tizen.${PROJECT_NAME}/res/xml) diff --git a/companion/inc/ft.h b/receiver/inc/ft.h similarity index 95% rename from companion/inc/ft.h rename to receiver/inc/ft.h index 9aa4b9b..b64fa8d 100644 --- a/companion/inc/ft.h +++ b/receiver/inc/ft.h @@ -19,7 +19,7 @@ #define __FT_H__ #if !defined(PACKAGE) -#define PACKAGE "org.tizen.sticker-consumer" +#define PACKAGE "org.tizen.sticker-receiver" #endif #define GRP_MAIN "main" diff --git a/companion/inc/log.h b/receiver/inc/log.h similarity index 100% rename from companion/inc/log.h rename to receiver/inc/log.h diff --git a/companion/inc/main.h b/receiver/inc/main.h similarity index 67% rename from companion/inc/main.h rename to receiver/inc/main.h index 361bdd5..473ac68 100644 --- a/companion/inc/main.h +++ b/receiver/inc/main.h @@ -5,10 +5,10 @@ #ifndef __MAIN_H__ #define __MAIN_H__ -#define TAG "STICKER_CONSUMER" +#define TAG "STICKER_RECEIVER" #if !defined(PACKAGE) -#define PACKAGE "org.tizen.sticker-consumer" +#define PACKAGE "org.tizen.sticker-receiver" #endif #endif /* __MAIN_H__ */ diff --git a/companion/inc/sticker_info.h b/receiver/inc/sticker_info.h similarity index 80% rename from companion/inc/sticker_info.h rename to receiver/inc/sticker_info.h index b06c885..e65c244 100644 --- a/companion/inc/sticker_info.h +++ b/receiver/inc/sticker_info.h @@ -1,10 +1,10 @@ #ifndef __STICKER_INFO_H__ #define __STICKER_INFO_H__ -#define TAG "STICKER_CONSUMER" +#define TAG "STICKER_RECEIVER" void insert_sticker_data(const char *filepath, const char *keyword, const char *group, const char *desc); void create_sticker_provider_handle(void); void destroy_sticker_provider_handle(void); -#endif /* __STICKER_INF_H__ */ \ No newline at end of file +#endif /* __STICKER_INF_H__ */ diff --git a/companion/org.tizen.sticker-consumer.manifest b/receiver/org.tizen.sticker-consumer.manifest similarity index 100% rename from companion/org.tizen.sticker-consumer.manifest rename to receiver/org.tizen.sticker-consumer.manifest diff --git a/receiver/org.tizen.sticker-receiver.manifest b/receiver/org.tizen.sticker-receiver.manifest new file mode 100644 index 0000000..017d22d --- /dev/null +++ b/receiver/org.tizen.sticker-receiver.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/companion/res/xml/accessoryservices.xml b/receiver/res/xml/accessoryservices.xml similarity index 81% rename from companion/res/xml/accessoryservices.xml rename to receiver/res/xml/accessoryservices.xml index 6419f03..fee8e4c 100644 --- a/companion/res/xml/accessoryservices.xml +++ b/receiver/res/xml/accessoryservices.xml @@ -1,8 +1,8 @@ - + - + - - + + -- 2.7.4 From ebbae0c2ac0fc22b07add78a9c3cdb1f9a9d6bf0 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Fri, 7 Feb 2020 16:12:18 +0900 Subject: [PATCH 16/16] Update package version to 0.1.9 Change-Id: Ic81ac37352d1c82aad49de963bfb84829e44070b 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 d14e2c0..dac6ebc 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.8 +Version: 0.1.9 Release: 1 Group: Graphics & UI Framework/Input License: Apache-2.0 -- 2.7.4