X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=client%2Fsticker_dbus.c;h=412a143ba9184dbe9f3479ae6f6125693ec86864;hb=f31d31c3cb45b89edf4d743026b0e0c24fb52777;hp=7bf48bfed426459a923292ca2ef1176768ee968a;hpb=050335661a4f1c10681d66c895b8219817057699;p=platform%2Fcore%2Fuifw%2Fcapi-ui-sticker.git diff --git a/client/sticker_dbus.c b/client/sticker_dbus.c index 7bf48bf..412a143 100644 --- a/client/sticker_dbus.c +++ b/client/sticker_dbus.c @@ -23,7 +23,10 @@ #endif #define LOG_TAG "STICKER_DBUS" +#define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data") + static int is_server_started = 0; +static CLIENT_LIB last_req_lib = STICKER_CLIENT_LIB_NONE; static void _server_appeared_cb(GDBusConnection *connection, const gchar *name, const gchar *name_owner, gpointer user_data) { @@ -72,18 +75,14 @@ static int _dbus_init(GDBusConnection **gdbus_connection) return STICKER_CLIENT_ERROR_NONE; } -static void _get_sticker_info_from_gvariant(GVariant *body, sticker_data_h sticker_data) +static void _get_sticker_info_from_gvariant(GVariantIter *info_iter, GVariantIter *keyword_iter, sticker_data_h sticker_data) { STICKER_DAT_TYPE key; GVariant *value = NULL; - GVariantIter *info_iter = NULL; - GVariantIter *keyword_iter = NULL; char *keyword = NULL; - g_variant_get(body, "(a{iv}a(s))", &info_iter, &keyword_iter); - if (!info_iter || !keyword_iter) { - LOGD("failed to get iter"); + LOGW("failed to get iter"); return; } @@ -204,6 +203,29 @@ static void _handle_sticker_consumer_cb(GDBusConnection *connection, return; } + if (g_strcmp0(signal_name, "send_sticker_changed_event") == 0) { + if (consumer_handle->event_cb != NULL) { + sticker_data_h sticker_data = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s)); + if (sticker_data) { + int event_type; + GVariantIter *info_iter = NULL; + GVariantIter *keyword_iter = NULL; + + g_variant_get(parameters, "(ia{iv}a(s))", &event_type, &info_iter, &keyword_iter); + _get_sticker_info_from_gvariant(info_iter, keyword_iter, sticker_data); + consumer_handle->event_cb((sticker_consumer_event_type_e)event_type, sticker_data, consumer_handle->event_cb_user_data); + + if (info_iter) + g_variant_iter_free(info_iter); + + if (keyword_iter) + g_variant_iter_free(keyword_iter); + + _free_sticker_data(sticker_data); + } + } + } + #if 0 // Receive the sticker information by asynchronous communication. if (g_strcmp0(signal_name, "send_group_list") == 0) { if (consumer_handle->group_foreach_cb != NULL) @@ -444,14 +466,13 @@ static int _send_async_message(GDBusConnection *gdbus_connection, GVariant *body return ret; } -static int _monitor_register(GDBusConnection *gdbus_connection, int *server_watcher_id) +static int _monitor_register(GDBusConnection *gdbus_connection, int *server_watcher_id, CLIENT_LIB lib) { int ret; GDBusMessage *reply = NULL; GVariant *reply_body = NULL; - ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "sticker_service_register"); - + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", (int)lib), &reply, "sticker_service_register"); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_send_sync_message() failed : %d", ret); return ret; @@ -474,7 +495,7 @@ static void _on_name_appeared(GDBusConnection *connection, { if (is_server_started == 0) { int *watcher_id = (int *)user_data; - _monitor_register(connection, watcher_id); + _monitor_register(connection, watcher_id, last_req_lib); } } @@ -491,6 +512,7 @@ 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; + last_req_lib = lib; ret = _dbus_init(gdbus_connection); if (ret != STICKER_CLIENT_ERROR_NONE) { @@ -504,7 +526,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, server_watcher_id, lib); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("_monitor_register() failed : %d", ret); return ret; @@ -530,12 +552,12 @@ 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_watcher_id, int *server_monitor_id, int *monitor_id, CLIENT_LIB lib) { int ret; if (server_watcher_id) { - ret = _send_async_message(gdbus_connection, g_variant_new("(i)", *server_watcher_id), "sticker_service_unregister"); + ret = _send_async_message(gdbus_connection, g_variant_new("(ii)", (int)lib, *server_watcher_id), "sticker_service_unregister"); if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("Failed to unregister sticker service"); return ret; @@ -643,9 +665,25 @@ int sticker_dbus_delete_sticker_info(GDBusConnection *gdbus_connection, int reco return ret; } +int sticker_dbus_delete_sticker_info_by_uri(GDBusConnection *gdbus_connection, const char *uri) +{ + int ret; + GDBusMessage *reply = NULL; + + ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", uri), &reply, "delete_sticker_info_by_uri"); + if (ret != STICKER_CLIENT_ERROR_NONE) + LOGE("failed to delete sticker info"); + + if (reply) + g_object_unref(reply); + + return ret; +} + int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_data_h sticker_data) { int ret; + bool is_updated = false; GDBusMessage *reply = NULL; GVariant *reply_body = NULL; sticker_data_h origin_data = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s)); @@ -658,7 +696,17 @@ int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_ 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); + GVariantIter *info_iter = NULL; + GVariantIter *keyword_iter = NULL; + + g_variant_get(reply_body, "(a{iv}a(s))", &info_iter, &keyword_iter); + _get_sticker_info_from_gvariant(info_iter, keyword_iter, origin_data); + + if (info_iter) + g_variant_iter_free(info_iter); + + if (keyword_iter) + g_variant_iter_free(keyword_iter); } else { LOGW("failed to get sticker info"); free(origin_data); @@ -667,39 +715,107 @@ int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_ return ret; } + if (sticker_data->uri) { + int len; + char *conv_path = NULL; + if (sticker_data->type == STICKER_DATA_URI_LOCAL_PATH) { + len = strlen(STICKER_DIRECTORY) + strlen(sticker_data->app_id) + strlen(sticker_data->uri) + 2; + conv_path = (char *)calloc(len, sizeof(char)); + if (conv_path) + snprintf(conv_path, len, "%s/%s%s", STICKER_DIRECTORY, sticker_data->app_id, sticker_data->uri); + } else + conv_path = strdup(sticker_data->uri); + + if (conv_path && (strcmp(conv_path, origin_data->uri) != 0)) { + LOGD("origin_uri : %s, new_uri : %s", origin_data->uri, conv_path); + int is_exist = 0; + ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", sticker_data->uri), &reply, "check_file_exists"); + if (ret == STICKER_CLIENT_ERROR_NONE) { + reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(i)", &is_exist); + + if (is_exist) { + LOGE("file already exists"); + ret = STICKER_CLIENT_ERROR_FILE_EXISTS; + free(conv_path); + goto cleanup; + } + } else { + LOGE("failed to check file exists"); + free(conv_path); + goto cleanup; + } + + 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"); + free(conv_path); + goto cleanup; + } + is_updated = true; + } + free(conv_path); + } + if (sticker_data->type != 0 && sticker_data->type != origin_data->type) { LOGD("origin_type : %d, new_type : %d", origin_data->type, sticker_data->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) + if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("failed to update sticker type"); + goto cleanup; + } + is_updated = true; } - 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); - 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); - 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->thumbnail) { + int len = strlen(STICKER_DIRECTORY) + strlen(sticker_data->app_id) + strlen(sticker_data->thumbnail) + 2; + char *conv_path = (char *)calloc(len, sizeof(char)); + if (conv_path) { + snprintf(conv_path, len, "%s/%s%s", STICKER_DIRECTORY, sticker_data->app_id, sticker_data->thumbnail); + if (strcmp(conv_path, origin_data->thumbnail) != 0) + { + LOGD("origin_thumbnail : %s, new_thumbnail : %s", origin_data->thumbnail, conv_path); + ret = _send_sync_message(gdbus_connection, g_variant_new("(iss)", sticker_data->sticker_info_id, sticker_data->app_id, sticker_data->thumbnail), &reply, "update_sticker_thumbnail"); + if (ret != STICKER_CLIENT_ERROR_NONE) + { + LOGE("failed to update sticker thumbnail"); + free(conv_path); + goto cleanup; + } + is_updated = true; + } + free(conv_path); + } } 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); 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) + if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("failed to update sticker description"); + goto cleanup; + } + is_updated = true; } 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); 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) + if (ret != STICKER_CLIENT_ERROR_NONE) { LOGE("failed to update sticker group"); + goto cleanup; + } + is_updated = true; + } + + if (sticker_data->disp_type != 0 && sticker_data->disp_type != origin_data->disp_type) { + LOGD("origin_disp_type : %d, new_disp_type : %d", origin_data->disp_type, sticker_data->disp_type); + ret = _send_sync_message(gdbus_connection, g_variant_new("(ii)", sticker_data->sticker_info_id, sticker_data->disp_type), &reply, "update_sticker_disp_type"); + if (ret != STICKER_CLIENT_ERROR_NONE) { + LOGE("failed to update sticker display type"); + goto cleanup; + } + is_updated = true; } if (sticker_data->keyword) { @@ -709,9 +825,15 @@ int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_ 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"); + else + is_updated = true; g_variant_builder_unref(keyword_builder); } + if (is_updated) + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", sticker_data->sticker_info_id), &reply, "send_update_event"); + +cleanup: _free_sticker_data(origin_data); if (reply_body) @@ -728,15 +850,25 @@ int sticker_dbus_get_sticker_info_by_record_id(GDBusConnection *gdbus_connection int ret; GDBusMessage *reply = NULL; GVariant *reply_body = NULL; + GVariantIter *info_iter = NULL; + GVariantIter *keyword_iter = NULL; 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; - _get_sticker_info_from_gvariant(reply_body, sticker_data); + + g_variant_get(reply_body, "(a{iv}a(s))", &info_iter, &keyword_iter); + _get_sticker_info_from_gvariant(info_iter, keyword_iter, sticker_data); if (reply_body) g_variant_unref(reply_body); + + if (info_iter) + g_variant_iter_free(info_iter); + + if (keyword_iter) + g_variant_iter_free(keyword_iter); } if (reply) @@ -853,7 +985,7 @@ int sticker_dbus_get_all_sticker_info(GDBusConnection *gdbus_connection, const c ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", app_id, 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)); + g_variant_get(reply_body, "(a(i))", id_iter); } if (reply_body) @@ -874,7 +1006,7 @@ int sticker_dbus_get_sticker_info_by_appid(GDBusConnection *gdbus_connection, co 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)); + g_variant_get(reply_body, "(a(i))", id_iter); } if (reply_body) @@ -895,7 +1027,7 @@ int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, con ret = _send_sync_message(gdbus_connection, g_variant_new("(siii)", app_id, (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)); + g_variant_get(reply_body, "(a(i))", id_iter); } if (reply_body) @@ -916,7 +1048,7 @@ int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, co ret = _send_sync_message(gdbus_connection, g_variant_new("(ssii)", app_id, 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)); + g_variant_get(reply_body, "(a(i))", id_iter); } if (reply_body) @@ -937,7 +1069,124 @@ int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, ret = _send_sync_message(gdbus_connection, g_variant_new("(ssii)", app_id, 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)); + g_variant_get(reply_body, "(a(i))", id_iter); + } + + if (reply_body) + g_variant_unref(reply_body); + + if (reply) + g_object_unref(reply); + + return ret; +} + +int sticker_dbus_get_sticker_info_by_display_type(GDBusConnection *gdbus_connection, const char *app_id, sticker_data_display_type_e type, int offset, int count, GVariantIter **id_iter) +{ + int ret; + GDBusMessage *reply = NULL; + GVariant *reply_body = NULL; + + ret = _send_sync_message(gdbus_connection, g_variant_new("(siii)", app_id, (int)type, offset, count), &reply, "get_sticker_info_by_disp_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 (reply_body) + g_variant_unref(reply_body); + + if (reply) + g_object_unref(reply); + + return ret; +} + +int sticker_dbus_get_group_list_by_display_type(GDBusConnection *gdbus_connection, const char *app_id, sticker_data_display_type_e type, GList **group_list) +{ + int ret; + GDBusMessage *reply = NULL; + GVariantIter *iter = NULL; + GVariant *reply_body = NULL; + char *group = NULL; + + if (group_list == NULL) { + LOGE("group_list is invalid"); + return STICKER_CLIENT_ERROR_INVALID_PARAMETER; + } + + ret = _send_sync_message(gdbus_connection, g_variant_new("(si)", app_id, (int)type), &reply, "get_group_list_by_disp_type"); + if (ret == STICKER_CLIENT_ERROR_NONE) { + reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(a(s))", &iter); + + if (!iter) { + LOGD("failed to get iter"); + return STICKER_CLIENT_ERROR_OPERATION_FAILED; + } + + while (g_variant_iter_loop (iter, "(s)", &group)) { + *group_list = g_list_append(*group_list, strdup((const char *)group)); + } + + g_variant_iter_free(iter); + } + + if (reply_body) + g_variant_unref(reply_body); + + if (reply) + g_object_unref(reply); + + return ret; +} + +int sticker_dbus_check_file_exists(GDBusConnection *gdbus_connection, const char *uri, int *result) +{ + int ret; + GDBusMessage *reply = NULL; + GVariant *reply_body = NULL; + + ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", uri), &reply, "check_file_exists"); + if (ret == STICKER_CLIENT_ERROR_NONE) { + reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(i)", result); + } + + if (reply_body) + g_variant_unref(reply_body); + + if (reply) + g_object_unref(reply); + + return ret; +} + +int sticker_dbus_insert_recent_sticker_info(GDBusConnection *gdbus_connection, int record_id) +{ + int ret; + GDBusMessage *reply = NULL; + + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", record_id), &reply, "insert_recent_sticker_info"); + if (ret != STICKER_CLIENT_ERROR_NONE) + LOGE("failed to insert recent sticker info"); + + if (reply) + g_object_unref(reply); + + return ret; +} + +int sticker_dbus_get_recent_sticker_list(GDBusConnection *gdbus_connection, int count, GVariantIter **id_iter) +{ + int ret; + GDBusMessage *reply = NULL; + GVariant *reply_body = NULL; + + ret = _send_sync_message(gdbus_connection, g_variant_new("(i)", count), &reply, "get_recent_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 (reply_body)