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.
21 #include <app_common.h>
22 #include <package_manager.h>
24 #include "sticker_data.h"
25 #include "sticker_dbus.h"
30 #define LOG_TAG "STICKER_DATA"
32 static char* _make_absolute_path(const char *relative_path)
34 int ret = STICKER_ERROR_NONE;
36 package_info_h package_info = NULL;
37 char *app_path = NULL;
38 char *file_path = NULL;
40 ret = app_get_id(&app_id);
41 if (ret != APP_ERROR_NONE) {
42 LOGE("Failed to get app_id : %d", ret); //LCOV_EXCL_LINE
43 ret = STICKER_ERROR_OPERATION_FAILED;
47 ret = package_info_create(app_id, &package_info);
48 if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info == NULL) {
49 LOGE("failed to create package_info. ret: %d", ret); //LCOV_EXCL_LINE
50 ret = STICKER_ERROR_OPERATION_FAILED;
54 ret = package_info_get_root_path(package_info, &app_path);
55 if (ret != PACKAGE_MANAGER_ERROR_NONE || app_path == NULL) {
56 LOGE("failed to create package_info. ret: %d", ret); //LCOV_EXCL_LINE
57 ret = STICKER_ERROR_OPERATION_FAILED;
61 int path_len = strlen(app_path) + strlen(relative_path) + 2;
62 file_path = (char *)calloc(path_len, sizeof(char));
64 LOGE("failed to alloc memory"); //LCOV_EXCL_LINE
65 ret = STICKER_ERROR_OPERATION_FAILED;
69 if(relative_path[0] == '/')
70 snprintf(file_path, path_len, "%s%s",app_path, relative_path);
72 snprintf(file_path, path_len, "%s%s%s",app_path, "/", relative_path); //LCOV_EXCL_LINE
74 if (access(file_path, F_OK) != 0) {
75 LOGE("%s does not exist", file_path);
76 ret = STICKER_ERROR_OPERATION_FAILED;
85 package_info_destroy(package_info);
90 if (ret == STICKER_ERROR_NONE)
96 static void _free_sticker_data(sticker_data_h sticker_data)
101 if (sticker_data->app_id) {
102 free(sticker_data->app_id);
103 sticker_data->app_id = NULL;
106 if (sticker_data->uri) {
107 free(sticker_data->uri);
108 sticker_data->uri = NULL;
111 if (sticker_data->thumbnail) {
112 free(sticker_data->thumbnail);
113 sticker_data->thumbnail = NULL;
116 if (sticker_data->keyword) {
117 g_list_free_full(sticker_data->keyword, free);
118 sticker_data->keyword = NULL;
121 if (sticker_data->group) {
122 free(sticker_data->group);
123 sticker_data->group = NULL;
126 if (sticker_data->description) {
127 free(sticker_data->description);
128 sticker_data->description = NULL;
131 if (sticker_data->date) {
132 free(sticker_data->date);
133 sticker_data->date = NULL;
140 EXPORT_API int sticker_data_create(sticker_data_h *data_handle)
142 CHECK_STICKER_FEATURE();
145 return STICKER_ERROR_INVALID_PARAMETER;
147 sticker_data_h data_struct = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s));
150 return STICKER_ERROR_OUT_OF_MEMORY;
153 int ret = app_get_id(&app_id);
154 if (ret != APP_ERROR_NONE) {
156 LOGE("Failed to get app_id : %d", ret);
158 ret = STICKER_ERROR_OPERATION_FAILED;
163 data_struct->app_id = strdup(app_id);
164 *data_handle = data_struct;
172 EXPORT_API int sticker_data_destroy(sticker_data_h data_handle)
174 CHECK_STICKER_FEATURE();
177 return STICKER_ERROR_INVALID_PARAMETER;
179 if (data_handle->app_id) {
180 free(data_handle->app_id);
181 data_handle->app_id = NULL;
184 if (data_handle->uri) {
185 free(data_handle->uri);
186 data_handle->uri = NULL;
189 if (data_handle->thumbnail) {
190 free(data_handle->thumbnail);
191 data_handle->thumbnail = NULL;
194 if (data_handle->keyword) {
195 g_list_free_full(data_handle->keyword, free);
196 data_handle->keyword = NULL;
199 if (data_handle->group) {
200 free(data_handle->group);
201 data_handle->group = NULL;
204 if (data_handle->description) {
205 free(data_handle->description);
206 data_handle->description = NULL;
209 if (data_handle->date) {
210 free(data_handle->date);
211 data_handle->date = NULL;
217 return STICKER_ERROR_NONE;
220 EXPORT_API int sticker_data_clone(sticker_data_h origin_handle, sticker_data_h *target_handle)
222 CHECK_STICKER_FEATURE();
224 sticker_data_h handle;
225 if (!origin_handle || !target_handle)
226 return STICKER_ERROR_INVALID_PARAMETER;
228 sticker_data_create(&handle);
230 return STICKER_ERROR_OUT_OF_MEMORY;
232 handle->sticker_info_id = origin_handle->sticker_info_id;
234 if (origin_handle->app_id)
235 handle->app_id = strdup(origin_handle->app_id);
237 handle->type = origin_handle->type;
239 if (origin_handle->uri)
240 handle->uri = strdup(origin_handle->uri);
242 if (origin_handle->thumbnail)
243 handle->thumbnail = strdup(origin_handle->thumbnail);
245 if (origin_handle->keyword)
246 handle->keyword = g_list_copy_deep(origin_handle->keyword, (GCopyFunc) g_strdup, NULL);
248 if (origin_handle->group)
249 handle->group = strdup(origin_handle->group);
251 if (origin_handle->description)
252 handle->description = strdup(origin_handle->description);
254 if (origin_handle->date)
255 handle->date = strdup(origin_handle->date);
257 handle->disp_type = origin_handle->disp_type;
259 *target_handle = handle;
261 return STICKER_ERROR_NONE;
264 EXPORT_API int sticker_data_get_handle(const char* uri, sticker_data_h *data_handle)
266 CHECK_STICKER_FEATURE();
269 GDBusConnection *gdbus_connection = NULL;
270 int server_watcher_id = 0;
272 int server_monitor_id = 0;
275 if (!uri || uri[0] == '\0' || !data_handle)
276 return STICKER_ERROR_INVALID_PARAMETER;
278 struct sticker_data_s *handle = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s));
280 return STICKER_ERROR_OUT_OF_MEMORY;
282 ret = sticker_dbus_init(&gdbus_connection, &server_watcher_id, &monitor_id, &server_monitor_id, STICKER_CLIENT_LIB_PROVIDER, NULL);
283 if (ret != STICKER_ERROR_NONE) {
284 LOGE("Failed to initialize dbus : %d", ret);
285 ret = STICKER_ERROR_OPERATION_FAILED;
289 ret = sticker_dbus_check_file_exists(gdbus_connection, uri, &is_exist);
290 if (ret != STICKER_ERROR_NONE) {
291 LOGE("Failed to check file exists : %d", ret);
292 ret = STICKER_ERROR_OPERATION_FAILED;
297 LOGE("Sticker does not exist. URI : %s", uri);
298 ret = STICKER_ERROR_NO_SUCH_FILE;
302 ret = sticker_dbus_get_sticker_info_by_uri(gdbus_connection, handle, uri);
303 if (ret != STICKER_ERROR_NONE) {
304 LOGE("Failed to get sticker information : %d", ret);
308 *data_handle = handle;
310 ret = sticker_dbus_shutdown(gdbus_connection, &server_watcher_id, &server_monitor_id, &monitor_id, STICKER_CLIENT_LIB_PROVIDER);
311 if (ret != STICKER_ERROR_NONE)
312 LOGE("Failed to finalize dbus : %d", ret);
314 g_object_unref(gdbus_connection);
316 return STICKER_ERROR_NONE;
320 _free_sticker_data(handle);
322 if (gdbus_connection) {
323 int ret_err = sticker_dbus_shutdown(gdbus_connection, &server_watcher_id, &server_monitor_id, &monitor_id, STICKER_CLIENT_LIB_PROVIDER);
324 if (ret_err != STICKER_ERROR_NONE)
325 LOGE("Failed to finalize dbus : %d", ret_err);
327 g_object_unref(gdbus_connection);
333 EXPORT_API int sticker_data_get_app_id(sticker_data_h data_handle, char **app_id)
335 CHECK_STICKER_FEATURE();
337 if (!data_handle || !app_id)
338 return STICKER_ERROR_INVALID_PARAMETER;
340 if (!data_handle->app_id)
341 return STICKER_ERROR_NO_DATA;
343 *app_id = strdup(data_handle->app_id);
345 return STICKER_ERROR_NONE;
348 EXPORT_API int sticker_data_set_uri(sticker_data_h data_handle, sticker_data_uri_type_e type, const char *uri)
350 CHECK_STICKER_FEATURE();
352 char *file_path = NULL;
353 if (!data_handle || !type || !uri || uri[0] == '\0')
354 return STICKER_ERROR_INVALID_PARAMETER;
356 if (type == STICKER_DATA_URI_LOCAL_PATH) {
357 if (access(uri, F_OK) != 0) {
358 file_path = _make_absolute_path(uri);
359 if (file_path == NULL) {
360 return STICKER_ERROR_INVALID_PARAMETER;
363 file_path = strdup(uri);
366 if (data_handle->uri)
367 free(data_handle->uri);
369 data_handle->type = type;
370 if (type == STICKER_DATA_URI_LOCAL_PATH)
371 data_handle->uri = file_path;
373 data_handle->uri = strdup(uri);
375 return STICKER_ERROR_NONE;
378 EXPORT_API int sticker_data_get_uri(sticker_data_h data_handle, sticker_data_uri_type_e *type, char **uri)
380 CHECK_STICKER_FEATURE();
382 if (!data_handle || !type || !uri)
383 return STICKER_ERROR_INVALID_PARAMETER;
385 if (!data_handle->type || !data_handle->uri)
386 return STICKER_ERROR_NO_DATA;
388 *type = data_handle->type;
389 *uri = strdup(data_handle->uri);
391 return STICKER_ERROR_NONE;
394 EXPORT_API int sticker_data_foreach_keyword(sticker_data_h data_handle, sticker_data_keyword_foreach_cb callback, void *user_data)
396 CHECK_STICKER_FEATURE();
398 if (!data_handle || !callback)
399 return STICKER_ERROR_INVALID_PARAMETER;
401 if (!data_handle->keyword)
402 return STICKER_ERROR_NO_DATA;
405 for(list = g_list_first(data_handle->keyword); list != NULL; list=list->next) {
406 callback(list->data, user_data);
409 return STICKER_ERROR_NONE;
412 EXPORT_API int sticker_data_add_keyword(sticker_data_h data_handle, const char *keyword)
414 CHECK_STICKER_FEATURE();
417 if (!data_handle || !keyword)
418 return STICKER_ERROR_INVALID_PARAMETER;
420 node = g_list_find_custom(data_handle->keyword, keyword, (GCompareFunc) strcmp);
423 LOGE("keyword already exists");
424 return STICKER_ERROR_INVALID_PARAMETER;
426 data_handle->keyword = g_list_append(data_handle->keyword, strdup(keyword));
429 return STICKER_ERROR_NONE;
432 EXPORT_API int sticker_data_remove_keyword(sticker_data_h data_handle, const char *keyword)
434 CHECK_STICKER_FEATURE();
437 if (!data_handle || !keyword)
438 return STICKER_ERROR_INVALID_PARAMETER;
440 node = g_list_find_custom(data_handle->keyword, keyword, (GCompareFunc) strcmp);
443 data_handle->keyword = g_list_delete_link(data_handle->keyword, node);
445 LOGE("keyword does not exist");
446 return STICKER_ERROR_INVALID_PARAMETER;
449 return STICKER_ERROR_NONE;
452 EXPORT_API int sticker_data_set_group_name(sticker_data_h data_handle, const char *group)
454 CHECK_STICKER_FEATURE();
456 if (!data_handle || !group)
457 return STICKER_ERROR_INVALID_PARAMETER;
459 if (data_handle->group)
460 free(data_handle->group);
462 data_handle->group = strdup(group);
464 return STICKER_ERROR_NONE;
467 EXPORT_API int sticker_data_get_group_name(sticker_data_h data_handle, char **group)
469 CHECK_STICKER_FEATURE();
471 if (!data_handle || !group)
472 return STICKER_ERROR_INVALID_PARAMETER;
474 if (!data_handle->group)
475 return STICKER_ERROR_NO_DATA;
477 *group = strdup(data_handle->group);
479 return STICKER_ERROR_NONE;
482 EXPORT_API int sticker_data_set_thumbnail(sticker_data_h data_handle, const char *thumbnail)
484 CHECK_STICKER_FEATURE();
486 char *file_path = NULL;
487 if (!data_handle || !thumbnail || thumbnail[0] == '\0')
488 return STICKER_ERROR_INVALID_PARAMETER;
490 if (access(thumbnail, F_OK) != 0) {
491 file_path = _make_absolute_path(thumbnail);
492 if (file_path == NULL)
493 return STICKER_ERROR_INVALID_PARAMETER;
495 file_path = strdup(thumbnail);
497 if (data_handle->thumbnail)
498 free(data_handle->thumbnail);
500 data_handle->thumbnail = file_path;
502 return STICKER_ERROR_NONE;
505 EXPORT_API int sticker_data_get_thumbnail(sticker_data_h data_handle, char **thumbnail)
507 CHECK_STICKER_FEATURE();
509 if (!data_handle || !thumbnail)
510 return STICKER_ERROR_INVALID_PARAMETER;
512 if (!data_handle->thumbnail)
513 *thumbnail = strdup("");
515 *thumbnail = strdup(data_handle->thumbnail);
517 return STICKER_ERROR_NONE;
520 EXPORT_API int sticker_data_set_description(sticker_data_h data_handle, const char *description)
522 CHECK_STICKER_FEATURE();
524 if (!data_handle || !description)
525 return STICKER_ERROR_INVALID_PARAMETER;
527 if (data_handle->description)
528 free(data_handle->description);
530 data_handle->description = strdup(description);
532 return STICKER_ERROR_NONE;
535 EXPORT_API int sticker_data_get_description(sticker_data_h data_handle, char **description)
537 CHECK_STICKER_FEATURE();
539 if (!data_handle || !description)
540 return STICKER_ERROR_INVALID_PARAMETER;
542 if (!data_handle->description)
543 *description = strdup("");
545 *description = strdup(data_handle->description);
547 return STICKER_ERROR_NONE;
550 EXPORT_API int sticker_data_get_date(sticker_data_h data_handle, char **date)
552 CHECK_STICKER_FEATURE();
554 if (!data_handle || !date)
555 return STICKER_ERROR_INVALID_PARAMETER;
557 if (!data_handle->date)
558 return STICKER_ERROR_NO_DATA;
560 *date = strdup(data_handle->date);
562 return STICKER_ERROR_NONE;
565 EXPORT_API int sticker_data_set_display_type(sticker_data_h data_handle, sticker_data_display_type_e type)
567 CHECK_STICKER_FEATURE();
569 if (!data_handle || !type || type < STICKER_DATA_DISP_EMOJI || type > STICKER_DATA_DISP_WALLPAPER)
570 return STICKER_ERROR_INVALID_PARAMETER;
572 data_handle->disp_type = type;
574 return STICKER_ERROR_NONE;
577 EXPORT_API int sticker_data_get_display_type(sticker_data_h data_handle, sticker_data_display_type_e *type)
579 CHECK_STICKER_FEATURE();
581 if (!data_handle || !type)
582 return STICKER_ERROR_INVALID_PARAMETER;
584 *type = data_handle->disp_type;
586 return STICKER_ERROR_NONE;