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;
}
\ No newline at end of file
int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, const char *app_id, sticker_data_uri_type_e type, int offset, int count, GVariantIter **id_iter);
int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, const char *app_id, const char *group, int offset, int count, GVariantIter **id_iter);
int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, const char *app_id, const char *keyword, int offset, int count, GVariantIter **id_iter);
+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);
#ifdef __cplusplus
}
ret = sticker_dbus_get_sticker_info_by_type(consumer_handle->gdbus_connection, consumer_handle->app_id, type, offset, count, &id_iter);
if (ret != STICKER_ERROR_NONE) {
- LOGE("Failed to get sticker information by group : %d", ret);
+ LOGE("Failed to get sticker information by uri type : %d", ret);
ret = STICKER_ERROR_OPERATION_FAILED;
goto cleanup;
}
return ret;
}
+
+EXPORT_API int sticker_consumer_data_foreach_by_display_type(sticker_consumer_h consumer_handle, int offset, int count, int *result, sticker_data_display_type_e type, sticker_consumer_data_foreach_cb callback, void *user_data)
+{
+ CHECK_STICKER_FEATURE();
+
+ int ret;
+ int info_id;
+ int sticker_count = 0;
+ GVariantIter *id_iter = NULL;
+
+ if (!consumer_handle || (offset < 0) || (count <= 0) || !result || (type < 1) || !callback)
+ return STICKER_ERROR_INVALID_PARAMETER;
+
+ ret = sticker_dbus_get_sticker_info_by_display_type(consumer_handle->gdbus_connection, consumer_handle->app_id, type, offset, count, &id_iter);
+ if (ret != STICKER_ERROR_NONE) {
+ LOGE("Failed to get sticker information by display type : %d", ret);
+ ret = STICKER_ERROR_OPERATION_FAILED;
+ goto cleanup;
+ }
+
+ if (id_iter) {
+ while (g_variant_iter_loop (id_iter, "(i)", &info_id)) {
+ sticker_data_h sticker_data = (sticker_data_h)calloc(1, sizeof(struct sticker_data_s));
+ if (!sticker_data) {
+ ret = STICKER_ERROR_OUT_OF_MEMORY;
+ goto cleanup;
+ }
+
+ ret = sticker_dbus_get_sticker_info_by_record_id(consumer_handle->gdbus_connection, sticker_data, info_id);
+ if (ret == STICKER_ERROR_NONE) {
+ sticker_count++;
+ callback(sticker_data, user_data);
+ _free_sticker_data(sticker_data);
+ } else {
+ _free_sticker_data(sticker_data);
+ goto cleanup;
+ }
+ }
+ }
+
+ *result = sticker_count;
+
+cleanup:
+ if (id_iter)
+ g_variant_iter_free(id_iter);
+
+ return ret;
+}
\ No newline at end of file
int sticker_consumer_keyword_list_foreach_all(sticker_consumer_h consumer_handle, sticker_consumer_keyword_list_foreach_cb callback, void *user_data);
/**
+ * @brief Retrieves all sticker data in the sticker database using display type.
+ * @details If you set the @a offset as @c 10 and @a count as @c 10, then only retrieved data from @c 10 to @c 19 will be invoked.
+ * @since_tizen 5.5
+ * @remarks It is not an error if @a result is smaller than @a count.
+ * @param[in] consumer_handle The sticker consumer handle
+ * @param[in] offset The start position (Starting from zero)
+ * @param[in] count The number of stickers to be retrieved with respect to the offset
+ * @param[out] result The number of stickers retrieved (zero indicates that no data was found)
+ * @param[in] type The display type of the sticker for getting sticker data
+ * @param[in] callback The callback function to invoke
+ * @param[in] user_data The user data to be passed to the callback function
+ * @return 0 on success, otherwise a negative error value
+ * @retval #STICKER_ERROR_NONE Successful
+ * @retval #STICKER_ERROR_NOT_SUPPORTED Not supported
+ * @retval #STICKER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #STICKER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #STICKER_ERROR_OPERATION_FAILED Operation failed
+ * @post This function invokes sticker_consumer_data_foreach_cb() repeatedly for getting data.
+ * @see sticker_consumer_data_foreach_cb()
+ */
+int sticker_consumer_data_foreach_by_display_type(sticker_consumer_h consumer_handle, int offset, int count, int *result, sticker_data_display_type_e type, sticker_consumer_data_foreach_cb callback, void *user_data);
+
+/**
* @}
*/
ret = stickerd_get_sticker_info_by_group(parameters, &reply_body);
} else if (g_strcmp0(method_name, "get_sticker_info_by_keyword") == 0) {
ret = stickerd_get_sticker_info_by_keyword(parameters, &reply_body);
+ } else if (g_strcmp0(method_name, "get_sticker_info_by_disp_type") == 0) {
+ ret = stickerd_get_sticker_info_by_display_type(parameters, &reply_body);
}
if (ret == STICKERD_SERVER_ERROR_NONE) {
" <arg type='i' name='count' direction='in'/>"
" <arg type='a(i)' name='id_list' direction='out'/>"
" </method>"
+
+ " <method name='get_sticker_info_by_disp_type'>"
+ " <arg type='s' name='app_id' direction='in'/>"
+ " <arg type='i' name='type' direction='in'/>"
+ " <arg type='i' name='offset' direction='in'/>"
+ " <arg type='i' name='count' direction='in'/>"
+ " <arg type='a(i)' name='id_list' direction='out'/>"
+ " </method>"
" </interface>"
" </node>";
return ret;
}
+
+int stickerd_get_sticker_info_by_display_type(GVariant *parameters, GVariant **reply_body)
+{
+ int ret;
+ GList *id_list = NULL;
+ char *app_id = NULL;
+ int type, offset, count;
+ GVariantBuilder *id_builder = NULL;
+
+ g_variant_get(parameters, "(&siii)", &app_id, &type, &offset, &count);
+
+ ret = stickerd_db_get_record_id(STICKER_DB_STICKER_DISP_TYPE, &id_list, &type, app_id, offset, count);
+ if (ret != STICKERD_SERVER_ERROR_NONE) {
+ LOGE("Failed to get all sticker id");
+ if(id_list)
+ g_list_free_full(id_list, free);
+ return STICKERD_SERVER_ERROR_OPERATION_FAILED;
+ }
+
+ id_builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)"));
+ g_list_foreach(id_list, (GFunc) _set_id_builder, id_builder);
+
+ *reply_body = g_variant_new("(a(i))", id_builder);
+ if (*reply_body == NULL) {
+ LOGE("Failed to create reply_body");
+ ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
+ }
+
+ if (id_list)
+ g_list_free_full(id_list, free);
+
+ if (id_builder)
+ g_variant_builder_unref(id_builder);
+
+ return ret;
+}
\ No newline at end of file
int stickerd_get_sticker_info_by_type(GVariant *parameters, GVariant **reply_body);
int stickerd_get_sticker_info_by_group(GVariant *parameters, GVariant **reply_body);
int stickerd_get_sticker_info_by_keyword(GVariant *parameters, GVariant **reply_body);
+int stickerd_get_sticker_info_by_display_type(GVariant *parameters, GVariant **reply_body);
#ifdef __cplusplus
}
#define STICKER_DB_GET_RECORD_ID_BY_TYPE "SELECT sticker_info_id FROM sticker_info WHERE type = ? AND app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
#define STICKER_DB_GET_RECORD_ID_BY_GROUP "SELECT sticker_info_id from sticker_info WHERE group_name = ? AND app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
#define STICKER_DB_GET_RECORD_ID_BY_KEYWORD "SELECT sticker_info_id FROM sticker_keyword_info WHERE keyword = ? INTERSECT SELECT sticker_info_id from sticker_info WHERE app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
+#define STICKER_DB_GET_RECORD_ID_BY_DISP_TYPE "SELECT sticker_info_id FROM sticker_info WHERE display_type = ? AND app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
typedef enum
{
case STICKER_DB_STICKER_KEYWORD:
query = STICKER_DB_GET_RECORD_ID_BY_KEYWORD;
break;
+ case STICKER_DB_STICKER_DISP_TYPE:
+ query = STICKER_DB_GET_RECORD_ID_BY_DISP_TYPE;
+ break;
default :
query = "";
break;
sqlite3_bind_int(stmt, 2, offset);
sqlite3_bind_int(stmt, 3, count);
} else {
- if (type == STICKER_DB_STICKER_TYPE)
+ if (type == STICKER_DB_STICKER_TYPE || type == STICKER_DB_STICKER_DISP_TYPE)
sqlite3_bind_int(stmt, 1, *(int *)data);
else
sqlite3_bind_text(stmt, 1, (char *)data, -1, SQLITE_TRANSIENT);
STICKER_DB_STICKER_DESCRIPTION,
STICKER_DB_STICKER_GROUP,
STICKER_DB_STICKER_KEYWORD,
+ STICKER_DB_STICKER_DISP_TYPE,
} sticker_info_db_type;
typedef struct {