2 * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <tzplatform_config.h>
21 #include <gio/gunixfdlist.h>
23 #include <json-glib/json-glib.h>
24 #include <package_manager.h>
26 #include <sys/types.h>
31 #include "stickerd_dbus.h"
32 #include "stickerd_data_manager.h"
33 #include "stickerd_db_manager.h"
34 #include "sticker_defs.h"
35 #include "stickerd_error.h"
40 #define LOG_TAG "STICKERD_DATA_MANAGER"
42 #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data")
43 #define MAX_ERROR_BUFFER 256
45 static GHashTable *_monitoring_hash = NULL;
46 static char error_buffer[MAX_ERROR_BUFFER];
47 extern GMainLoop *main_loop;
49 static void _check_watcher_exist()
51 if (_monitoring_hash != NULL && g_hash_table_size(_monitoring_hash) == 0) {
52 LOGD("Terminate sticker daemon");
53 g_hash_table_destroy(_monitoring_hash);
54 _monitoring_hash = NULL;
55 g_main_loop_quit(main_loop);
59 static void _on_name_appeared(GDBusConnection *connection,
61 const gchar *name_owner,
64 LOGD("name: %s", name);
67 static void _on_name_vanished(GDBusConnection *connection,
71 monitoring_info_s *info = (monitoring_info_s *)user_data;
74 if (_monitoring_hash != NULL && g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(info->watcher_id)) != NULL) {
75 LOGD("name: %s", name);
76 g_bus_unwatch_name(info->watcher_id);
77 delete_monitoring_list(&_monitoring_hash, info->bus_name, info->watcher_id);
86 _check_watcher_exist();
89 static void _stickerd_client_dbus_method_call_handler(GDBusConnection *conn, const gchar *sender, const gchar *object_path,
90 const gchar *iface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation,
93 LOGD("stickerd method_name: %s, sender: %s", method_name, sender);
95 if (_monitoring_hash == NULL)
96 _monitoring_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
98 GVariant *reply_body = NULL;
99 int ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
101 if (g_strcmp0(method_name, "sticker_service_register") == 0) {
102 ret = stickerd_server_register(parameters, &reply_body, sender,
103 _on_name_appeared, _on_name_vanished, &_monitoring_hash);
104 } else if (g_strcmp0(method_name, "sticker_service_unregister") == 0) {
105 ret = stickerd_server_unregister(parameters, &reply_body, sender, &_monitoring_hash);
106 } else if (g_strcmp0(method_name, "insert_sticker_info") == 0) {
107 ret = stickerd_insert_sticker_info(parameters, &reply_body);
108 } else if (g_strcmp0(method_name, "update_sticker_info_by_json") == 0) {
109 ret = stickerd_insert_sticker_info_by_json(parameters, &reply_body, sender);
110 } else if (g_strcmp0(method_name, "delete_sticker_info") == 0) {
111 ret = stickerd_del_sticker_info(parameters, &reply_body);
112 } else if (g_strcmp0(method_name, "update_sticker_type") == 0) {
113 ret = stickerd_update_sticker_type(parameters, &reply_body);
114 } else if (g_strcmp0(method_name, "update_sticker_uri") == 0) {
115 ret = stickerd_update_sticker_uri(parameters, &reply_body);
116 } else if (g_strcmp0(method_name, "update_sticker_thumbnail") == 0) {
117 ret = stickerd_update_sticker_thumbnail(parameters, &reply_body);
118 } else if (g_strcmp0(method_name, "update_sticker_description") == 0) {
119 ret = stickerd_update_sticker_description(parameters, &reply_body);
120 } else if (g_strcmp0(method_name, "update_sticker_group") == 0) {
121 ret = stickerd_update_sticker_group(parameters, &reply_body);
122 } else if (g_strcmp0(method_name, "update_sticker_keyword") == 0) {
123 ret = stickerd_update_sticker_keyword(parameters, &reply_body);
124 } else if (g_strcmp0(method_name, "get_sticker_info") == 0) {
125 ret = stickerd_get_sticker_info(parameters, &reply_body);
126 } else if (g_strcmp0(method_name, "get_group_list") == 0) {
127 ret = stickerd_get_group_list(parameters, &reply_body);
128 } else if (g_strcmp0(method_name, "get_keyword_list") == 0) {
129 ret = stickerd_get_keyword_list(parameters, &reply_body);
130 } else if (g_strcmp0(method_name, "get_sticker_count") == 0) {
131 ret = stickerd_get_sticker_count(parameters, &reply_body);
132 } else if (g_strcmp0(method_name, "get_all_sticker_info") == 0) {
133 ret = stickerd_get_all_sticker_info(parameters, &reply_body);
134 } else if (g_strcmp0(method_name, "get_sticker_info_by_appid") == 0) {
135 ret = stickerd_get_sticker_info_by_app_id(parameters, &reply_body);
136 } else if (g_strcmp0(method_name, "get_sticker_info_by_type") == 0) {
137 ret = stickerd_get_sticker_info_by_type(parameters, &reply_body);
138 } else if (g_strcmp0(method_name, "get_sticker_info_by_group") == 0) {
139 ret = stickerd_get_sticker_info_by_group(parameters, &reply_body);
140 } else if (g_strcmp0(method_name, "get_sticker_info_by_keyword") == 0) {
141 ret = stickerd_get_sticker_info_by_keyword(parameters, &reply_body);
144 if (ret == STICKERD_SERVER_ERROR_NONE) {
145 LOGD("method_call successful, method_name : %s", method_name);
146 g_dbus_method_invocation_return_value(invocation, reply_body);
148 LOGE("method_call failed, method_name : %s", method_name);
149 g_dbus_method_invocation_return_error(invocation, G_DBUS_ERROR, ret, "sticker error");
153 g_variant_unref(reply_body);
155 _check_watcher_exist();
158 static const GDBusInterfaceVTable _sticker_interface_vtable = {
159 _stickerd_client_dbus_method_call_handler,
164 int stickerd_register_dbus_interface(void)
166 static gchar introspection_xml[] =
168 " <interface name='org.tizen.sticker_service'>"
169 " <method name='sticker_service_register'>"
170 " <arg type='i' name='watcher_id' direction='out'/>"
173 " <method name='sticker_service_unregister'>"
174 " <arg type='i' name='watcher_id' direction='in'/>"
177 " <method name='insert_sticker_info'>"
178 " <arg type='a{iv}' name='sticker_info' direction='in'/>"
179 " <arg type='a(s)' name='keyword_list' direction='in'/>"
180 " <arg type='i' name='record_id' direction='out'/>"
183 " <method name='update_sticker_info_by_json'>"
184 " <arg type='s' name='app_id' direction='in'/>"
185 " <arg type='s' name='json_path' direction='in'/>"
188 " <method name='delete_sticker_info'>"
189 " <arg type='i' name='record_id' direction='in'/>"
192 " <method name='update_sticker_type'>"
193 " <arg type='i' name='record_id' direction='in'/>"
194 " <arg type='i' name='type' direction='in'/>"
197 " <method name='update_sticker_uri'>"
198 " <arg type='i' name='record_id' direction='in'/>"
199 " <arg type='s' name='app_id' direction='in'/>"
200 " <arg type='i' name='type' direction='in'/>"
201 " <arg type='s' name='uri' direction='in'/>"
204 " <method name='update_sticker_thumbnail'>"
205 " <arg type='i' name='record_id' direction='in'/>"
206 " <arg type='s' name='thumbnail' direction='in'/>"
209 " <method name='update_sticker_description'>"
210 " <arg type='i' name='record_id' direction='in'/>"
211 " <arg type='s' name='description' direction='in'/>"
214 " <method name='update_sticker_group'>"
215 " <arg type='i' name='record_id' direction='in'/>"
216 " <arg type='s' name='group' direction='in'/>"
219 " <method name='update_sticker_keyword'>"
220 " <arg type='i' name='record_id' direction='in'/>"
221 " <arg type='a(s)' name='keyword' direction='in'/>"
224 " <method name='get_sticker_info'>"
225 " <arg type='i' name='record_id' direction='in'/>"
226 " <arg type='a{iv}' name='sticker_info' direction='out'/>"
227 " <arg type='a(s)' name='keyword_list' direction='out'/>"
230 " <method name='get_group_list'>"
231 " <arg type='a(s)' name='group_list' direction='out'/>"
234 " <method name='get_keyword_list'>"
235 " <arg type='a(s)' name='keyword_list' direction='out'/>"
238 " <method name='get_sticker_count'>"
239 " <arg type='s' name='app_id' direction='in'/>"
240 " <arg type='i' name='count' direction='out'/>"
243 " <method name='get_all_sticker_info'>"
244 " <arg type='i' name='offset' direction='in'/>"
245 " <arg type='i' name='count' direction='in'/>"
246 " <arg type='a(i)' name='id_list' direction='out'/>"
249 " <method name='get_sticker_info_by_appid'>"
250 " <arg type='s' name='app_id' direction='in'/>"
251 " <arg type='i' name='offset' direction='in'/>"
252 " <arg type='i' name='count' direction='in'/>"
253 " <arg type='a(i)' name='id_list' direction='out'/>"
256 " <method name='get_sticker_info_by_type'>"
257 " <arg type='i' name='type' direction='in'/>"
258 " <arg type='i' name='offset' direction='in'/>"
259 " <arg type='i' name='count' direction='in'/>"
260 " <arg type='a(i)' name='id_list' direction='out'/>"
263 " <method name='get_sticker_info_by_group'>"
264 " <arg type='s' name='group' direction='in'/>"
265 " <arg type='i' name='offset' direction='in'/>"
266 " <arg type='i' name='count' direction='in'/>"
267 " <arg type='a(i)' name='id_list' direction='out'/>"
270 " <method name='get_sticker_info_by_keyword'>"
271 " <arg type='s' name='keyword' direction='in'/>"
272 " <arg type='i' name='offset' direction='in'/>"
273 " <arg type='i' name='count' direction='in'/>"
274 " <arg type='a(i)' name='id_list' direction='out'/>"
279 return stickerd_server_register_dbus_interface(introspection_xml, _sticker_interface_vtable);
282 int stickerd_dbus_init(void)
286 ret = stickerd_register_dbus_interface();
287 if (ret != STICKERD_SERVER_ERROR_NONE) {
288 LOGE("Failed to register dbus interface : %d", ret);
289 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
292 return STICKERD_SERVER_ERROR_NONE;
295 static int _check_file_exist(const char *app_id, const char *path)
298 package_info_h package_info = NULL;
299 char *app_path = NULL;
300 char *file_path = NULL;
302 if (access(path, F_OK) == 0) {
307 ret = package_info_create(app_id, &package_info);
308 if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info == NULL) {
309 LOGE("failed to create package_info. ret: %d", ret);
314 ret = package_info_get_root_path(package_info, &app_path);
315 if (ret != PACKAGE_MANAGER_ERROR_NONE || app_path == NULL) {
316 LOGE("failed to create package_info. ret: %d", ret);
321 int path_len = strlen(app_path) + strlen(path) + 2;
322 file_path = (char *)calloc(path_len, sizeof(char));
324 LOGE("Failed to alloc memory");
330 snprintf(file_path, path_len, "%s%s",app_path, path);
332 snprintf(file_path, path_len, "%s%s%s",app_path, "/", path);
334 if (access(file_path, F_OK) != 0) {
335 LOGE("%s does not exist", file_path);
342 package_info_destroy(package_info);
357 static int _mkdirs(const char *path, mode_t mode)
360 char prev_path[2048];
361 const char *tmp = path;
363 if (!path || strlen(path) > 2048)
366 memset(prev_path, '\0', 2048);
367 while ((tmp = strchr(tmp, '/')) != NULL) {
374 strncpy(prev_path, path, len);
375 prev_path[len] = 0x00;
377 if (mkdir(prev_path, mode) == -1 && errno != EEXIST) {
378 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
379 LOGE("directory create error : %s", error_buffer);
384 if (mkdir(prev_path, mode) == -1 && errno != EEXIST) {
385 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
386 LOGE("directory create error : %s", error_buffer);
393 static int _file_copy(const char *src, const char *dest)
396 int fd = -1, n_fd = -1;
401 memset(buf, '\0', 4096);
402 fd = open(src, O_RDONLY);
403 n_fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0755);
405 if (fd == -1 || n_fd == -1) {
411 while((size = read(fd, buf, 4096))) {
421 while(write(n_fd, buf, size) == -1) {
442 static char* _convert_sticker_uri(const char *uri, const char *appid)
445 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(uri) + 3;
446 char * new_path = (char *)calloc(len, sizeof(char));
447 if (new_path == NULL) {
448 LOGE("Failed to alloc memory");
453 snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, uri);
455 snprintf(new_path, len, "%s/%s/%s",STICKER_DIRECTORY, appid, uri);
457 if (access(new_path, F_OK) == 0) {
458 LOGE("sticker file already exists");
463 ret = _mkdirs(new_path, 0755);
465 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
466 LOGE("directory create error : %s", error_buffer);
470 ret = _file_copy(uri, new_path);
472 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
473 LOGE("failed to copy sticker file : %s", error_buffer);
486 int stickerd_insert_sticker_info(GVariant *parameters, GVariant **reply_body)
490 STICKER_DAT_TYPE key;
491 sticker_info_db *sticker_info = NULL;
492 GVariant *value = NULL;
493 GVariantIter *info_iter = NULL;
494 GVariantIter *keyword_iter = NULL;
497 g_variant_get(parameters, "(a{iv}a(s))", &info_iter, &keyword_iter);
498 if (!info_iter || !keyword_iter) {
499 LOGD("failed to get iter");
500 ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
504 sticker_info = (sticker_info_db *)calloc(1, sizeof(sticker_info_db));
507 ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
511 while (g_variant_iter_loop (info_iter, "{iv}", &key, &value)) {
513 case STICKER_DATA_TYPE_APP_ID:
514 sticker_info->app_id = (char *) g_variant_get_string(value, NULL);
516 case STICKER_DATA_TYPE_URI_TYPE:
517 sticker_info->type = g_variant_get_int32(value);
519 case STICKER_DATA_TYPE_URI:
520 sticker_info->uri = (char *) g_variant_get_string(value, NULL);
522 case STICKER_DATA_TYPE_THUMBNAIL:
523 sticker_info->thumbnail = (char *) g_variant_get_string(value, NULL);
525 case STICKER_DATA_TYPE_DESCRIPTION:
526 sticker_info->description = (char *) g_variant_get_string(value, NULL);
528 case STICKER_DATA_TYPE_GROUP:
529 sticker_info->group = (char *) g_variant_get_string(value, NULL);
536 while (g_variant_iter_loop (keyword_iter, "(s)", &keyword)) {
537 sticker_info->keyword = g_list_append(sticker_info->keyword, strdup((const char *)keyword));
540 if (sticker_info->type == 1) {
541 if (_check_file_exist(sticker_info->app_id, sticker_info->uri) == 0) {
542 sticker_info->uri = _convert_sticker_uri(sticker_info->uri, sticker_info->app_id);
543 if (!sticker_info->uri) {
544 LOGE("failed to copy sticker file");
545 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
549 LOGE("sticker file does not exist");
550 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
555 ret = stickerd_db_insert_sticker_info(&record_id, sticker_info);
556 if (ret != STICKERD_SERVER_ERROR_NONE) {
557 LOGE("Failed to insert sticker info");
558 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
562 *reply_body = g_variant_new("(i)", record_id);
563 if (*reply_body == NULL) {
564 LOGE("Failed to create reply_body");
565 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
570 g_variant_unref(value);
573 g_variant_iter_free(info_iter);
576 g_variant_iter_free(keyword_iter);
586 static char* _get_string_from_object(JsonObject *object, const char *key)
588 if (json_object_has_member(object, key) == false)
591 const char *str = json_object_get_string_member(object, key);
598 static int _get_int_from_object(JsonObject *object, const char *key)
600 if (json_object_has_member(object, key) == false)
603 int type = json_object_get_int_member(object, key);
608 int stickerd_insert_sticker_info_by_json(GVariant *parameters, GVariant **reply_body, const char *sender)
610 int ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
612 sticker_info_db *sticker_info = NULL;
614 char *json_path = NULL;
615 JsonParser* parser = NULL;
616 GError* err_msg = NULL;
617 GVariant *body = NULL;
618 char *cmd = "send_insert_result";
620 *reply_body = g_variant_new("()");
621 if (*reply_body == NULL) {
622 LOGE("Failed to create reply_body");
623 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
626 g_variant_get(parameters, "(&s&s)", &app_id, &json_path);
628 if (!app_id || !json_path) {
629 LOGE("failed to get parameter");
630 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
633 SECURE_LOGD("app_id: %s, json path: %s", app_id, json_path);
635 parser = json_parser_new();
636 json_parser_load_from_file(parser, json_path, &err_msg);
638 LOGE("failed to load json file. error message: %s", err_msg->message);
639 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
643 JsonNode *root = json_parser_get_root(parser);
645 LOGE("failed to get root");
646 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
650 JsonObject *root_obj = json_node_get_object(root);
651 if (root_obj == NULL) {
652 LOGE("failed to get object");
653 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
657 JsonArray *sticker_arr = json_object_get_array_member(root_obj, "sticker");
658 if (sticker_arr == NULL) {
659 LOGE("failed to get array member");
660 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
664 int arr_len = json_array_get_length(sticker_arr);
665 for (int i = 0; i < arr_len; i++) {
666 JsonObject *info_object = json_array_get_object_element(sticker_arr, i);
667 if (info_object != NULL) {
668 sticker_info = (sticker_info_db *)calloc(1, sizeof(sticker_info_db));
670 LOGE("Failed to alloc memory");
674 sticker_info->app_id = app_id;
675 sticker_info->type = _get_int_from_object(info_object, "type");
676 if (sticker_info->type < 1)
679 sticker_info->uri = _get_string_from_object(info_object, "uri");
680 if (!sticker_info->uri)
683 if (sticker_info->type == 1) {
684 if (_check_file_exist(sticker_info->app_id, sticker_info->uri) == 0) {
685 sticker_info->uri = _convert_sticker_uri(sticker_info->uri, sticker_info->app_id);
686 if (!sticker_info->uri)
691 sticker_info->group = _get_string_from_object(info_object, "group");
692 if (!sticker_info->group)
695 sticker_info->thumbnail = _get_string_from_object(info_object, "thumbnail");
696 if (!sticker_info->thumbnail)
699 sticker_info->description = _get_string_from_object(info_object, "description");
701 JsonArray *keyword_arr = json_object_get_array_member(info_object, "keyword");
702 int keyword_arr_len = json_array_get_length(keyword_arr);
703 if (keyword_arr_len < 1)
706 for (int j = 0; j < keyword_arr_len; j++) {
707 sticker_info->keyword = g_list_append(sticker_info->keyword, strdup((const char *)json_array_get_string_element(keyword_arr, j)));
710 ret = stickerd_db_insert_sticker_info(&record_id, sticker_info);
711 if (ret != STICKERD_SERVER_ERROR_NONE) {
712 LOGE("Failed to insert sticker info");
713 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
724 g_error_free(err_msg);
726 g_object_unref(parser);
728 body = g_variant_new("(i)", ret);
730 ret = stickerd_send_dbus_message(body, sender, cmd, STICKER_CLIENT_LIB_PROVIDER);
731 if (ret != STICKERD_SERVER_ERROR_NONE)
732 LOGE("Failed to send insert result to client");
735 g_variant_unref(body);
740 int stickerd_del_sticker_info(GVariant *parameters, GVariant **reply_body)
745 *reply_body = g_variant_new("()");
746 if (*reply_body == NULL) {
747 LOGE("Failed to create reply_body");
748 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
751 g_variant_get(parameters, "(i)", &record_id);
753 ret = stickerd_db_delete_sticker_info(record_id);
754 if (ret != STICKERD_SERVER_ERROR_NONE) {
755 LOGE("Failed to delete sticker info");
756 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
762 int stickerd_update_sticker_type(GVariant *parameters, GVariant **reply_body)
768 *reply_body = g_variant_new("()");
769 if (*reply_body == NULL) {
770 LOGE("Failed to create reply_body");
771 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
774 g_variant_get(parameters, "(ii)", &record_id, &type);
776 ret = stickerd_db_update_sticker_info(record_id, STICKER_DB_STICKER_TYPE, &type);
777 if (ret != STICKERD_SERVER_ERROR_NONE) {
778 LOGE("Failed to update sticker type");
779 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
785 int stickerd_update_sticker_uri(GVariant *parameters, GVariant **reply_body)
793 *reply_body = g_variant_new("()");
794 if (*reply_body == NULL) {
795 LOGE("Failed to create reply_body");
796 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
799 g_variant_get(parameters, "(i&si&s)", &record_id, &app_id, &type, &uri);
802 if (_check_file_exist(app_id, uri) == 0) {
803 uri = _convert_sticker_uri(uri, app_id);
805 LOGE("failed to copy sticker file");
806 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
811 ret = stickerd_db_update_sticker_info(record_id, STICKER_DB_STICKER_URI, (void *)uri);
812 if (ret != STICKERD_SERVER_ERROR_NONE) {
813 LOGE("Failed to update sticker uri");
814 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
820 int stickerd_update_sticker_thumbnail(GVariant *parameters, GVariant **reply_body)
826 *reply_body = g_variant_new("()");
827 if (*reply_body == NULL) {
828 LOGE("Failed to create reply_body");
829 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
832 g_variant_get(parameters, "(i&s)", &record_id, &thumbnail);
834 ret = stickerd_db_update_sticker_info(record_id, STICKER_DB_STICKER_THUMBNAIL, (void *)thumbnail);
835 if (ret != STICKERD_SERVER_ERROR_NONE) {
836 LOGE("Failed to update sticker thumbnail");
837 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
843 int stickerd_update_sticker_description(GVariant *parameters, GVariant **reply_body)
849 *reply_body = g_variant_new("()");
850 if (*reply_body == NULL) {
851 LOGE("Failed to create reply_body");
852 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
855 g_variant_get(parameters, "(i&s)", &record_id, &description);
857 ret = stickerd_db_update_sticker_info(record_id, STICKER_DB_STICKER_DESCRIPTION, (void *)description);
858 if (ret != STICKERD_SERVER_ERROR_NONE) {
859 LOGE("Failed to update sticker description");
860 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
866 int stickerd_update_sticker_group(GVariant *parameters, GVariant **reply_body)
872 *reply_body = g_variant_new("()");
873 if (*reply_body == NULL) {
874 LOGE("Failed to create reply_body");
875 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
878 g_variant_get(parameters, "(i&s)", &record_id, &group);
880 ret = stickerd_db_update_sticker_info(record_id, STICKER_DB_STICKER_GROUP, (void *)group);
881 if (ret != STICKERD_SERVER_ERROR_NONE) {
882 LOGE("Failed to update sticker group");
883 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
889 int stickerd_update_sticker_keyword(GVariant *parameters, GVariant **reply_body)
893 GVariantIter *keyword_iter = NULL;
894 char *keyword = NULL;
895 GList *keyword_list = NULL;
897 *reply_body = g_variant_new("()");
898 if (*reply_body == NULL) {
899 LOGE("Failed to create reply_body");
900 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
903 g_variant_get(parameters, "(ia(s))", &record_id, &keyword_iter);
906 LOGD("failed to get iter");
907 return STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
910 while (g_variant_iter_loop (keyword_iter, "(s)", &keyword)) {
911 keyword_list = g_list_append(keyword_list, strdup((const char *)keyword));
914 g_variant_iter_free(keyword_iter);
916 ret = stickerd_db_update_sticker_info(record_id, STICKER_DB_STICKER_KEYWORD, (void *)keyword_list);
917 if (ret != STICKERD_SERVER_ERROR_NONE) {
918 LOGE("Failed to update sticker keyword");
919 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
925 static void _set_keyword_builder(char *keyword, GVariantBuilder *keyword_builder)
928 LOGE("keyword doesn't exist");
932 g_variant_builder_add(keyword_builder, "(s)", (const char *)keyword);
935 int stickerd_get_sticker_info(GVariant *parameters, GVariant **reply_body)
939 GVariantBuilder *info_builder;
940 GVariantBuilder *keyword_builder;
942 g_variant_get(parameters, "(i)", &record_id);
943 sticker_info_db *sticker_info = (sticker_info_db *)calloc(1, sizeof(sticker_info_db));
946 return STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
948 ret = stickerd_db_get_sticker_info_by_record_id(record_id, sticker_info);
949 if (ret != STICKERD_SERVER_ERROR_NONE) {
950 LOGE("Failed to get sticker info");
953 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
956 info_builder = g_variant_builder_new(G_VARIANT_TYPE("a{iv}"));
957 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_APP_ID, g_variant_new_string((const gchar *)sticker_info->app_id));
958 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_URI_TYPE, g_variant_new_int32(sticker_info->type));
959 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_URI, g_variant_new_string((const gchar *)sticker_info->uri));
960 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_THUMBNAIL, g_variant_new_string((const gchar *)sticker_info->thumbnail));
961 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DESCRIPTION, g_variant_new_string((const gchar *)sticker_info->description));
962 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_GROUP, g_variant_new_string((const gchar *)sticker_info->group));
963 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DATE, g_variant_new_string((const gchar *)sticker_info->date));
965 keyword_builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
966 g_list_foreach(sticker_info->keyword, (GFunc) _set_keyword_builder, keyword_builder);
968 *reply_body = g_variant_new("(a{iv}a(s))", info_builder, keyword_builder);
969 g_variant_builder_unref(info_builder);
970 g_variant_builder_unref(keyword_builder);
972 if (*reply_body == NULL) {
973 LOGE("Failed to create reply_body");
976 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
984 int stickerd_get_group_list(GVariant *parameters, GVariant **reply_body)
987 GVariantBuilder *builder = NULL;
989 builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
990 ret = stickerd_db_get_group_list(builder);
992 if (ret != STICKERD_SERVER_ERROR_NONE) {
993 LOGE("Failed to get sticker group list");
994 g_variant_builder_unref(builder);
995 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
998 *reply_body = g_variant_new("(a(s))", builder);
999 g_variant_builder_unref(builder);
1001 if (*reply_body == NULL) {
1002 LOGE("Failed to create reply_body");
1003 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1009 int stickerd_get_keyword_list(GVariant *parameters, GVariant **reply_body)
1012 GVariantBuilder *builder = NULL;
1014 builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
1015 ret = stickerd_db_get_keyword_list(builder);
1016 if (ret != STICKERD_SERVER_ERROR_NONE) {
1017 LOGE("Failed to get sticker keyword list");
1018 g_variant_builder_unref(builder);
1019 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1022 *reply_body = g_variant_new("(a(s))", builder);
1023 g_variant_builder_unref(builder);
1025 if (*reply_body == NULL) {
1026 LOGE("Failed to create reply_body");
1027 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1033 int stickerd_get_sticker_count(GVariant *parameters, GVariant **reply_body)
1037 char *app_id = NULL;
1039 g_variant_get(parameters, "(&s)", &app_id);
1041 ret = stickerd_db_get_sticker_count(&count, app_id);
1042 if (ret != STICKERD_SERVER_ERROR_NONE) {
1043 LOGE("Failed to get sticker count");
1044 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1047 *reply_body = g_variant_new("(i)", count);
1048 if (*reply_body == NULL) {
1049 LOGE("Failed to create reply_body");
1050 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1057 // Send the sticker information by asynchronous communication.
1058 static int send_sticker_info_async(int record_id, sticker_info_db_type type, const char *sender)
1063 sticker_info_db *sticker_info = (sticker_info_db *)calloc(1, sizeof(sticker_info_db));
1066 return STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
1068 ret = stickerd_db_get_sticker_info_by_record_id(record_id, sticker_info);
1069 if (ret != STICKERD_SERVER_ERROR_NONE) {
1070 LOGE("Failed to get sticker info");
1072 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1076 case STICKER_DB_STICKER_ALL:
1077 cmd = "send_all_sticker_info";
1079 case STICKER_DB_STICKER_APPID:
1080 cmd = "send_sticker_info_by_appid";
1082 case STICKER_DB_STICKER_TYPE:
1083 cmd = "send_sticker_info_by_type";
1085 case STICKER_DB_STICKER_GROUP:
1086 cmd = "send_sticker_info_by_group";
1088 case STICKER_DB_STICKER_KEYWORD:
1089 cmd = "send_sticker_info_by_keyword";
1096 GVariantBuilder *info_builder;
1097 GVariantBuilder *keyword_builder;
1099 info_builder = g_variant_builder_new(G_VARIANT_TYPE("a{iv}"));
1100 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_INFO_ID, g_variant_new_int32(record_id));
1101 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_APP_ID, g_variant_new_string((const gchar *)sticker_info->app_id));
1102 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_URI_TYPE, g_variant_new_int32(sticker_info->type));
1103 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_URI, g_variant_new_string((const gchar *)sticker_info->uri));
1104 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_THUMBNAIL, g_variant_new_string((const gchar *)sticker_info->thumbnail));
1105 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DESCRIPTION, g_variant_new_string((const gchar *)sticker_info->description));
1106 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_GROUP, g_variant_new_string((const gchar *)sticker_info->group));
1107 g_variant_builder_add(info_builder, "{iv}", STICKER_DATA_TYPE_DATE, g_variant_new_string((const gchar *)sticker_info->date));
1109 keyword_builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
1110 g_list_foreach(sticker_info->keyword, (GFunc) _set_keyword_builder, keyword_builder);
1112 GVariant *body = g_variant_new("(a{iv}a(s))", info_builder, keyword_builder);
1113 g_variant_builder_unref(info_builder);
1114 g_variant_builder_unref(keyword_builder);
1116 ret = stickerd_send_dbus_message(body, sender, cmd);
1117 if (ret != STICKERD_SERVER_ERROR_NONE) {
1118 LOGE("Failed to send sticker info to client");
1120 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1128 static void _set_id_builder(char *id, GVariantBuilder *id_builder)
1131 LOGE("id doesn't exist");
1135 g_variant_builder_add(id_builder, "(i)", atoi(id));
1138 int stickerd_get_all_sticker_info(GVariant *parameters, GVariant **reply_body)
1142 GList *id_list = NULL;
1143 GVariantBuilder *id_builder = NULL;
1145 g_variant_get(parameters, "(ii)", &offset, &count);
1147 ret = stickerd_db_get_record_id(STICKER_DB_STICKER_ALL, &id_list, NULL, offset, count);
1148 if (ret != STICKERD_SERVER_ERROR_NONE) {
1149 LOGE("Failed to get all sticker id");
1151 g_list_free_full(id_list, free);
1152 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1155 id_builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)"));
1156 g_list_foreach(id_list, (GFunc) _set_id_builder, id_builder);
1158 *reply_body = g_variant_new("(a(i))", id_builder);
1159 if (*reply_body == NULL) {
1160 LOGE("Failed to create reply_body");
1161 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
1165 g_list_free_full(id_list, free);
1168 g_variant_builder_unref(id_builder);
1173 int stickerd_get_sticker_info_by_app_id(GVariant *parameters, GVariant **reply_body)
1176 GList *id_list = NULL;
1177 char *app_id = NULL;
1179 GVariantBuilder *id_builder = NULL;
1181 g_variant_get(parameters, "(&sii)", &app_id, &offset, &count);
1183 ret = stickerd_db_get_record_id(STICKER_DB_STICKER_APPID, &id_list, (void *)app_id, offset, count);
1184 if (ret != STICKERD_SERVER_ERROR_NONE) {
1185 LOGE("Failed to get all sticker id");
1187 g_list_free_full(id_list, free);
1188 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1191 id_builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)"));
1192 g_list_foreach(id_list, (GFunc) _set_id_builder, id_builder);
1194 *reply_body = g_variant_new("(a(i))", id_builder);
1195 if (*reply_body == NULL) {
1196 LOGE("Failed to create reply_body");
1197 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
1201 g_list_free_full(id_list, free);
1204 g_variant_builder_unref(id_builder);
1209 int stickerd_get_sticker_info_by_type(GVariant *parameters, GVariant **reply_body)
1212 GList *id_list = NULL;
1213 int type, offset, count;
1214 GVariantBuilder *id_builder = NULL;
1216 g_variant_get(parameters, "(iii)", &type, &offset, &count);
1218 ret = stickerd_db_get_record_id(STICKER_DB_STICKER_TYPE, &id_list, &type, offset, count);
1219 if (ret != STICKERD_SERVER_ERROR_NONE) {
1220 LOGE("Failed to get all sticker id");
1222 g_list_free_full(id_list, free);
1223 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1226 id_builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)"));
1227 g_list_foreach(id_list, (GFunc) _set_id_builder, id_builder);
1229 *reply_body = g_variant_new("(a(i))", id_builder);
1230 if (*reply_body == NULL) {
1231 LOGE("Failed to create reply_body");
1232 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
1236 g_list_free_full(id_list, free);
1239 g_variant_builder_unref(id_builder);
1244 int stickerd_get_sticker_info_by_group(GVariant *parameters, GVariant **reply_body)
1247 GList *id_list = NULL;
1250 GVariantBuilder *id_builder = NULL;
1252 g_variant_get(parameters, "(&sii)", &group, &offset, &count);
1254 ret = stickerd_db_get_record_id(STICKER_DB_STICKER_GROUP, &id_list, (void *)group, offset, count);
1255 if (ret != STICKERD_SERVER_ERROR_NONE) {
1256 LOGE("Failed to get all sticker id");
1258 g_list_free_full(id_list, free);
1259 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1262 id_builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)"));
1263 g_list_foreach(id_list, (GFunc) _set_id_builder, id_builder);
1265 *reply_body = g_variant_new("(a(i))", id_builder);
1266 if (*reply_body == NULL) {
1267 LOGE("Failed to create reply_body");
1268 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
1272 g_list_free_full(id_list, free);
1275 g_variant_builder_unref(id_builder);
1280 int stickerd_get_sticker_info_by_keyword(GVariant *parameters, GVariant **reply_body)
1283 GList *id_list = NULL;
1284 char *keyword = NULL;
1286 GVariantBuilder *id_builder = NULL;
1288 g_variant_get(parameters, "(&sii)", &keyword, &offset, &count);
1290 ret = stickerd_db_get_record_id(STICKER_DB_STICKER_KEYWORD, &id_list, (void *)keyword, offset, count);
1291 if (ret != STICKERD_SERVER_ERROR_NONE) {
1292 LOGE("Failed to get all sticker id");
1294 g_list_free_full(id_list, free);
1295 return STICKERD_SERVER_ERROR_OPERATION_FAILED;
1298 id_builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)"));
1299 g_list_foreach(id_list, (GFunc) _set_id_builder, id_builder);
1301 *reply_body = g_variant_new("(a(i))", id_builder);
1302 if (*reply_body == NULL) {
1303 LOGE("Failed to create reply_body");
1304 ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
1308 g_list_free_full(id_list, free);
1311 g_variant_builder_unref(id_builder);