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;
41 ret = app_get_id(&app_id);
42 if (ret != APP_ERROR_NONE) {
43 LOGE("Failed to get app_id : %d", ret); //LCOV_EXCL_LINE
44 ret = STICKER_ERROR_OPERATION_FAILED;
48 ret = package_info_create(app_id, &package_info);
49 if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info == NULL) {
50 LOGE("failed to create package_info. ret: %d", ret); //LCOV_EXCL_LINE
51 ret = STICKER_ERROR_OPERATION_FAILED;
55 ret = package_info_get_root_path(package_info, &app_path);
56 if (ret != PACKAGE_MANAGER_ERROR_NONE || app_path == NULL) {
57 LOGE("failed to create package_info. ret: %d", ret); //LCOV_EXCL_LINE
58 ret = STICKER_ERROR_OPERATION_FAILED;
62 path_len = strlen(app_path) + strlen(relative_path) + 2;
63 file_path = (char *)calloc(path_len, sizeof(char));
65 LOGE("failed to alloc memory"); //LCOV_EXCL_LINE
66 ret = STICKER_ERROR_OPERATION_FAILED;
70 if (relative_path[0] == '/')
71 snprintf(file_path, path_len, "%s%s",app_path, relative_path);
73 snprintf(file_path, path_len, "%s%s%s",app_path, "/", relative_path); //LCOV_EXCL_LINE
75 if (access(file_path, F_OK) != 0) {
76 LOGE("%s does not exist", file_path);
77 ret = STICKER_ERROR_OPERATION_FAILED;
86 package_info_destroy(package_info);
91 if (ret == STICKER_ERROR_NONE)
97 EXPORT_API int sticker_data_create(sticker_data_h *data_handle)
99 CHECK_STICKER_FEATURE();
102 return STICKER_ERROR_INVALID_PARAMETER;
104 sticker_data_h data_struct = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s));
107 return STICKER_ERROR_OUT_OF_MEMORY;
110 int ret = app_get_id(&app_id);
111 if (ret != APP_ERROR_NONE) {
113 LOGE("Failed to get app_id : %d", ret);
115 ret = STICKER_ERROR_OPERATION_FAILED;
120 data_struct->app_id = strdup(app_id);
121 *data_handle = data_struct;
129 EXPORT_API int sticker_data_destroy(sticker_data_h data_handle)
131 CHECK_STICKER_FEATURE();
134 return STICKER_ERROR_INVALID_PARAMETER;
136 if (data_handle->app_id) {
137 free(data_handle->app_id);
138 data_handle->app_id = NULL;
141 if (data_handle->uri) {
142 free(data_handle->uri);
143 data_handle->uri = NULL;
146 if (data_handle->thumbnail) {
147 free(data_handle->thumbnail);
148 data_handle->thumbnail = NULL;
151 if (data_handle->keyword) {
152 g_list_free_full(data_handle->keyword, free);
153 data_handle->keyword = NULL;
156 if (data_handle->group) {
157 free(data_handle->group);
158 data_handle->group = NULL;
161 if (data_handle->description) {
162 free(data_handle->description);
163 data_handle->description = NULL;
166 if (data_handle->date) {
167 free(data_handle->date);
168 data_handle->date = NULL;
174 return STICKER_ERROR_NONE;
177 EXPORT_API int sticker_data_clone(sticker_data_h origin_handle, sticker_data_h *target_handle)
179 CHECK_STICKER_FEATURE();
181 sticker_data_h handle;
182 if (!origin_handle || !target_handle)
183 return STICKER_ERROR_INVALID_PARAMETER;
185 sticker_data_create(&handle);
187 return STICKER_ERROR_OUT_OF_MEMORY;
189 handle->sticker_info_id = origin_handle->sticker_info_id;
191 if (origin_handle->app_id)
192 handle->app_id = strdup(origin_handle->app_id);
194 handle->type = origin_handle->type;
196 if (origin_handle->uri)
197 handle->uri = strdup(origin_handle->uri);
199 if (origin_handle->thumbnail)
200 handle->thumbnail = strdup(origin_handle->thumbnail);
202 if (origin_handle->keyword)
203 handle->keyword = g_list_copy_deep(origin_handle->keyword, (GCopyFunc) g_strdup, NULL);
205 if (origin_handle->group)
206 handle->group = strdup(origin_handle->group);
208 if (origin_handle->description)
209 handle->description = strdup(origin_handle->description);
211 if (origin_handle->date)
212 handle->date = strdup(origin_handle->date);
214 handle->disp_type = origin_handle->disp_type;
216 *target_handle = handle;
218 return STICKER_ERROR_NONE;
221 EXPORT_API int sticker_data_get_handle(const char* uri, sticker_data_h *data_handle)
223 CHECK_STICKER_FEATURE();
226 GDBusConnection *gdbus_connection = NULL;
227 int server_watcher_id = 0;
229 int server_monitor_id = 0;
232 if (!uri || uri[0] == '\0' || !data_handle)
233 return STICKER_ERROR_INVALID_PARAMETER;
235 struct sticker_data_s *handle = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s));
237 return STICKER_ERROR_OUT_OF_MEMORY;
239 ret = sticker_dbus_init(&gdbus_connection, &server_watcher_id, &monitor_id, &server_monitor_id, STICKER_CLIENT_LIB_PROVIDER, NULL);
240 if (ret != STICKER_ERROR_NONE) {
241 LOGE("Failed to initialize dbus : %d", ret);
242 ret = STICKER_ERROR_OPERATION_FAILED;
246 ret = sticker_dbus_check_file_exists(gdbus_connection, uri, &is_exist);
247 if (ret != STICKER_ERROR_NONE) {
248 LOGE("Failed to check file exists : %d", ret);
249 ret = STICKER_ERROR_OPERATION_FAILED;
254 LOGE("Sticker does not exist. URI : %s", uri);
255 ret = STICKER_ERROR_NO_SUCH_FILE;
259 ret = sticker_dbus_get_sticker_info_by_uri(gdbus_connection, handle, uri);
260 if (ret != STICKER_ERROR_NONE) {
261 LOGE("Failed to get sticker information : %d", ret);
265 *data_handle = handle;
267 ret = sticker_dbus_shutdown(gdbus_connection, &server_watcher_id, &server_monitor_id, &monitor_id, STICKER_CLIENT_LIB_PROVIDER);
268 if (ret != STICKER_ERROR_NONE)
269 LOGE("Failed to finalize dbus : %d", ret);
271 g_object_unref(gdbus_connection);
273 return STICKER_ERROR_NONE;
277 sticker_data_destroy(handle);
279 if (gdbus_connection) {
280 int ret_err = sticker_dbus_shutdown(gdbus_connection, &server_watcher_id, &server_monitor_id, &monitor_id, STICKER_CLIENT_LIB_PROVIDER);
281 if (ret_err != STICKER_ERROR_NONE)
282 LOGE("Failed to finalize dbus : %d", ret_err);
284 g_object_unref(gdbus_connection);
290 EXPORT_API int sticker_data_get_app_id(sticker_data_h data_handle, char **app_id)
292 CHECK_STICKER_FEATURE();
294 if (!data_handle || !app_id)
295 return STICKER_ERROR_INVALID_PARAMETER;
297 if (!data_handle->app_id)
298 return STICKER_ERROR_NO_DATA;
300 *app_id = strdup(data_handle->app_id);
302 return STICKER_ERROR_NONE;
305 EXPORT_API int sticker_data_set_uri(sticker_data_h data_handle, sticker_data_uri_type_e type, const char *uri)
307 CHECK_STICKER_FEATURE();
309 char *file_path = NULL;
310 if (!data_handle || !type || !uri || uri[0] == '\0')
311 return STICKER_ERROR_INVALID_PARAMETER;
313 if (type == STICKER_DATA_URI_LOCAL_PATH) {
314 if (access(uri, F_OK) != 0) {
315 file_path = _make_absolute_path(uri);
316 if (file_path == NULL) {
317 return STICKER_ERROR_INVALID_PARAMETER;
320 file_path = strdup(uri);
323 if (data_handle->uri)
324 free(data_handle->uri);
326 data_handle->type = type;
327 if (type == STICKER_DATA_URI_LOCAL_PATH)
328 data_handle->uri = file_path;
330 data_handle->uri = strdup(uri);
332 return STICKER_ERROR_NONE;
335 EXPORT_API int sticker_data_get_uri(sticker_data_h data_handle, sticker_data_uri_type_e *type, char **uri)
337 CHECK_STICKER_FEATURE();
339 if (!data_handle || !type || !uri)
340 return STICKER_ERROR_INVALID_PARAMETER;
342 if (!data_handle->type || !data_handle->uri)
343 return STICKER_ERROR_NO_DATA;
345 *type = data_handle->type;
346 *uri = strdup(data_handle->uri);
348 return STICKER_ERROR_NONE;
351 EXPORT_API int sticker_data_foreach_keyword(sticker_data_h data_handle, sticker_data_keyword_foreach_cb callback, void *user_data)
353 CHECK_STICKER_FEATURE();
355 if (!data_handle || !callback)
356 return STICKER_ERROR_INVALID_PARAMETER;
358 if (!data_handle->keyword)
359 return STICKER_ERROR_NO_DATA;
362 for(list = g_list_first(data_handle->keyword); list != NULL; list=list->next) {
363 callback(list->data, user_data);
366 return STICKER_ERROR_NONE;
369 EXPORT_API int sticker_data_add_keyword(sticker_data_h data_handle, const char *keyword)
371 CHECK_STICKER_FEATURE();
374 if (!data_handle || !keyword)
375 return STICKER_ERROR_INVALID_PARAMETER;
377 node = g_list_find_custom(data_handle->keyword, keyword, (GCompareFunc) strcmp);
380 LOGE("keyword already exists");
381 return STICKER_ERROR_INVALID_PARAMETER;
383 data_handle->keyword = g_list_append(data_handle->keyword, strdup(keyword));
386 return STICKER_ERROR_NONE;
389 EXPORT_API int sticker_data_remove_keyword(sticker_data_h data_handle, const char *keyword)
391 CHECK_STICKER_FEATURE();
394 if (!data_handle || !keyword)
395 return STICKER_ERROR_INVALID_PARAMETER;
397 node = g_list_find_custom(data_handle->keyword, keyword, (GCompareFunc) strcmp);
400 data_handle->keyword = g_list_delete_link(data_handle->keyword, node);
402 LOGE("keyword does not exist");
403 return STICKER_ERROR_INVALID_PARAMETER;
406 return STICKER_ERROR_NONE;
409 EXPORT_API int sticker_data_set_group_name(sticker_data_h data_handle, const char *group)
411 CHECK_STICKER_FEATURE();
413 if (!data_handle || !group)
414 return STICKER_ERROR_INVALID_PARAMETER;
416 if (data_handle->group)
417 free(data_handle->group);
419 data_handle->group = strdup(group);
421 return STICKER_ERROR_NONE;
424 EXPORT_API int sticker_data_get_group_name(sticker_data_h data_handle, char **group)
426 CHECK_STICKER_FEATURE();
428 if (!data_handle || !group)
429 return STICKER_ERROR_INVALID_PARAMETER;
431 if (!data_handle->group)
432 return STICKER_ERROR_NO_DATA;
434 *group = strdup(data_handle->group);
436 return STICKER_ERROR_NONE;
439 EXPORT_API int sticker_data_set_thumbnail(sticker_data_h data_handle, const char *thumbnail)
441 CHECK_STICKER_FEATURE();
443 char *file_path = NULL;
444 if (!data_handle || !thumbnail || thumbnail[0] == '\0')
445 return STICKER_ERROR_INVALID_PARAMETER;
447 if (access(thumbnail, F_OK) != 0) {
448 file_path = _make_absolute_path(thumbnail);
449 if (file_path == NULL)
450 return STICKER_ERROR_INVALID_PARAMETER;
452 file_path = strdup(thumbnail);
454 if (data_handle->thumbnail)
455 free(data_handle->thumbnail);
457 data_handle->thumbnail = file_path;
459 return STICKER_ERROR_NONE;
462 EXPORT_API int sticker_data_get_thumbnail(sticker_data_h data_handle, char **thumbnail)
464 CHECK_STICKER_FEATURE();
466 if (!data_handle || !thumbnail)
467 return STICKER_ERROR_INVALID_PARAMETER;
469 if (!data_handle->thumbnail)
470 *thumbnail = strdup("");
472 *thumbnail = strdup(data_handle->thumbnail);
474 return STICKER_ERROR_NONE;
477 EXPORT_API int sticker_data_set_description(sticker_data_h data_handle, const char *description)
479 CHECK_STICKER_FEATURE();
481 if (!data_handle || !description)
482 return STICKER_ERROR_INVALID_PARAMETER;
484 if (data_handle->description)
485 free(data_handle->description);
487 data_handle->description = strdup(description);
489 return STICKER_ERROR_NONE;
492 EXPORT_API int sticker_data_get_description(sticker_data_h data_handle, char **description)
494 CHECK_STICKER_FEATURE();
496 if (!data_handle || !description)
497 return STICKER_ERROR_INVALID_PARAMETER;
499 if (!data_handle->description)
500 *description = strdup("");
502 *description = strdup(data_handle->description);
504 return STICKER_ERROR_NONE;
507 EXPORT_API int sticker_data_get_date(sticker_data_h data_handle, char **date)
509 CHECK_STICKER_FEATURE();
511 if (!data_handle || !date)
512 return STICKER_ERROR_INVALID_PARAMETER;
514 if (!data_handle->date)
515 return STICKER_ERROR_NO_DATA;
517 *date = strdup(data_handle->date);
519 return STICKER_ERROR_NONE;
522 EXPORT_API int sticker_data_set_display_type(sticker_data_h data_handle, sticker_data_display_type_e type)
524 CHECK_STICKER_FEATURE();
526 if (!data_handle || !type || type < STICKER_DATA_DISP_EMOJI || type > STICKER_DATA_DISP_WALLPAPER)
527 return STICKER_ERROR_INVALID_PARAMETER;
529 data_handle->disp_type = type;
531 return STICKER_ERROR_NONE;
534 EXPORT_API int sticker_data_get_display_type(sticker_data_h data_handle, sticker_data_display_type_e *type)
536 CHECK_STICKER_FEATURE();
538 if (!data_handle || !type)
539 return STICKER_ERROR_INVALID_PARAMETER;
541 *type = data_handle->disp_type;
543 return STICKER_ERROR_NONE;