#include "media-svc-noti.h"
#include "media-svc-util.h"
-static __thread media_svc_noti_item *g_inserted_noti_list = NULL;
+static __thread GSList *g_inserted_noti_list = NULL;
static __thread int g_noti_from_pid = -1;
-static int __media_svc_publish_noti_by_item(media_svc_noti_item *noti_item)
+static void __media_svc_publish_noti_by_item(gpointer data, gpointer user_data)
{
int ret = MS_MEDIA_ERR_NONE;
+ media_svc_noti_item *item = (media_svc_noti_item *)data;
- if (noti_item && noti_item->path) {
- ret = media_db_update_send_internal(noti_item->pid, noti_item->update_item, noti_item->update_type, noti_item->path, noti_item->media_uuid, noti_item->media_type, noti_item->mime_type);
+ if (item && item->path) {
+ ret = media_db_update_send_internal(item->pid, item->update_item, item->update_type, item->path, item->media_uuid, item->media_type, item->mime_type);
if (ret != MS_MEDIA_ERR_NONE) {
- media_svc_sec_error("media_db_update_send_internal failed : %d [%s]", ret, noti_item->path);
- ret = MS_MEDIA_ERR_INTERNAL;
+ media_svc_sec_error("media_db_update_send_internal failed : %d [%s]", ret, item->path);
} else {
media_svc_debug("media_db_update_send_internal success");
}
} else {
media_svc_debug("invalid path");
- ret = MS_MEDIA_ERR_INVALID_PARAMETER;
}
+}
- return ret;
+static void __media_svc_destroy_noti_item(gpointer data)
+{
+ media_svc_noti_item *item = (media_svc_noti_item *)data;
+
+ SAFE_FREE(item->media_uuid);
+ SAFE_FREE(item->path);
+ SAFE_FREE(item->mime_type);
+ SAFE_FREE(item);
}
int _media_svc_publish_noti(media_item_update_type_e update_type, const char *path, media_type_e media_type, const char *uuid, const char *mime_type)
g_noti_from_pid = pid;
}
-int _media_svc_create_noti_list(int count)
+void _media_svc_initialize_noti_list(void)
{
- SAFE_FREE(g_inserted_noti_list);
-
- g_inserted_noti_list = calloc(count, sizeof(media_svc_noti_item));
- if (g_inserted_noti_list == NULL) {
- media_svc_error("Failed to prepare noti items");
- return MS_MEDIA_ERR_OUT_OF_MEMORY;
- }
+ if (g_inserted_noti_list)
+ g_slist_free_full(g_inserted_noti_list, __media_svc_destroy_noti_item);
- return MS_MEDIA_ERR_NONE;
+ g_inserted_noti_list = NULL;
}
-int _media_svc_insert_item_to_noti_list(media_svc_content_info_s *content_info, int cnt)
+void _media_svc_insert_item_to_noti_list(media_svc_content_info_s *content_info)
{
- media_svc_noti_item *noti_list = g_inserted_noti_list;
-
- if (noti_list && content_info) {
- noti_list[cnt].pid = g_noti_from_pid;
- noti_list[cnt].update_item = MS_MEDIA_ITEM_INSERT; /* INSERT */
- noti_list[cnt].update_type = MS_MEDIA_ITEM_FILE;
- noti_list[cnt].media_type = content_info->media_type;
- if (content_info->media_uuid)
- noti_list[cnt].media_uuid = strdup(content_info->media_uuid);
- if (content_info->path)
- noti_list[cnt].path = strdup(content_info->path);
- if (content_info->mime_type)
- noti_list[cnt].mime_type = strdup(content_info->mime_type);
- }
-
- return MS_MEDIA_ERR_NONE;
-}
+ media_svc_noti_item *item = NULL;
-int _media_svc_destroy_noti_list(int all_cnt)
-{
- int i = 0;
- media_svc_noti_item *noti_list = g_inserted_noti_list;
-
- if (noti_list) {
- for (i = 0; i < all_cnt; i++) {
- SAFE_FREE(noti_list[i].media_uuid);
- SAFE_FREE(noti_list[i].path);
- SAFE_FREE(noti_list[i].mime_type);
- }
+ if (!content_info)
+ return;
- SAFE_FREE(g_inserted_noti_list);
- g_inserted_noti_list = NULL;
+ item = (media_svc_noti_item *) malloc(sizeof(media_svc_noti_item));
+ if (item) {
+ item->pid = g_noti_from_pid;
+ item->update_item = MS_MEDIA_ITEM_INSERT; /* INSERT */
+ item->update_type = MS_MEDIA_ITEM_FILE;
+ item->media_type = content_info->media_type;
+ item->media_uuid = g_strdup(content_info->media_uuid);
+ item->path = g_strdup(content_info->path);
+ item->mime_type = g_strdup(content_info->mime_type);
+
+ g_inserted_noti_list = g_slist_append(g_inserted_noti_list, (gpointer)item);
+ } else {
+ media_svc_error("Allocation failed");
}
-
- return MS_MEDIA_ERR_NONE;
}
-int _media_svc_publish_noti_list(int all_cnt)
+void _media_svc_publish_noti_list(void)
{
- int ret = MS_MEDIA_ERR_NONE;
- int idx = 0;
- media_svc_noti_item *noti_list = g_inserted_noti_list;
-
- if (noti_list) {
- for (idx = 0; idx < all_cnt; idx++)
- ret = __media_svc_publish_noti_by_item(&(noti_list[idx]));
- }
-
- return ret;
+ g_slist_foreach(g_inserted_noti_list, __media_svc_publish_noti_by_item, NULL);
}
int _media_svc_destroy_noti_item(media_svc_noti_item *item)
#include "media-svc-noti.h"
#include "media-svc-storage.h"
-static __thread int g_media_svc_item_validity_data_cnt = 1;
+static __thread int g_media_svc_item_validity_data_cnt = 0;
static __thread int g_media_svc_item_validity_cur_data_cnt = 0;
-static __thread int g_media_svc_insert_item_data_cnt = 1;
+static __thread int g_media_svc_insert_item_data_cnt = 0;
static __thread int g_media_svc_insert_item_cur_data_cnt = 0;
/* Flag for items to be published by notification */
/* Prepare for making noti item list */
if (with_noti) {
media_svc_debug("making noti list from pid[%d]", from_pid);
- if (_media_svc_create_noti_list(data_cnt) != MS_MEDIA_ERR_NONE)
- return MS_MEDIA_ERR_OUT_OF_MEMORY;
-
+ _media_svc_initialize_noti_list();
_media_svc_set_noti_from_pid(from_pid);
g_insert_with_noti = true;
}
media_svc_debug_fenter();
if (g_media_svc_insert_item_cur_data_cnt > 0) {
-
ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_INSERT_ITEM, uid);
if (g_insert_with_noti) {
media_svc_debug("sending noti list");
- _media_svc_publish_noti_list(g_media_svc_insert_item_cur_data_cnt);
- _media_svc_destroy_noti_list(g_media_svc_insert_item_cur_data_cnt);
+ _media_svc_publish_noti_list();
+ _media_svc_initialize_noti_list();
g_insert_with_noti = false;
_media_svc_set_noti_from_pid(-1);
}
}
- g_media_svc_insert_item_data_cnt = 1;
+ g_media_svc_insert_item_data_cnt = 0;
g_media_svc_insert_item_cur_data_cnt = 0;
return ret;
content_info.folder_uuid = g_strdup(folder_uuid);
media_svc_retv_del_if(content_info.folder_uuid == NULL, MS_MEDIA_ERR_INTERNAL, &content_info);
- if (g_media_svc_insert_item_data_cnt == 1) {
-
- ret = _media_svc_insert_item_with_data(true, &content_info, false, uid);
- media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
-
- if (g_insert_with_noti)
- _media_svc_insert_item_to_noti_list(&content_info, g_media_svc_insert_item_cur_data_cnt++);
-
- } else if (g_media_svc_insert_item_cur_data_cnt < (g_media_svc_insert_item_data_cnt - 1)) {
-
- ret = _media_svc_insert_item_with_data(true, &content_info, true, uid);
- media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
-
- if (g_insert_with_noti)
- _media_svc_insert_item_to_noti_list(&content_info, g_media_svc_insert_item_cur_data_cnt);
-
- g_media_svc_insert_item_cur_data_cnt++;
-
- } else if (g_media_svc_insert_item_cur_data_cnt == (g_media_svc_insert_item_data_cnt - 1)) {
-
- ret = _media_svc_insert_item_with_data(true, &content_info, true, uid);
- media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
+ ret = _media_svc_insert_item_with_data(true, &content_info, true, uid);
+ media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
- if (g_insert_with_noti)
- _media_svc_insert_item_to_noti_list(&content_info, g_media_svc_insert_item_cur_data_cnt);
+ if (g_insert_with_noti)
+ _media_svc_insert_item_to_noti_list(&content_info);
+ if (++g_media_svc_insert_item_cur_data_cnt == g_media_svc_insert_item_data_cnt) {
ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_INSERT_ITEM, uid);
media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
if (g_insert_with_noti) {
- _media_svc_publish_noti_list(g_media_svc_insert_item_cur_data_cnt + 1);
- _media_svc_destroy_noti_list(g_media_svc_insert_item_cur_data_cnt + 1);
-
- /* Recreate noti list */
- ret = _media_svc_create_noti_list(g_media_svc_insert_item_data_cnt);
- media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
+ _media_svc_publish_noti_list();
+ _media_svc_initialize_noti_list();
}
g_media_svc_insert_item_cur_data_cnt = 0;
-
- } else {
- media_svc_error("Error in media_svc_insert_item_bulk");
- _media_svc_destroy_content_info(&content_info);
- return MS_MEDIA_ERR_INTERNAL;
}
_media_svc_destroy_content_info(&content_info);
if (g_media_svc_item_validity_cur_data_cnt > 0)
ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_SET_ITEM_VALIDITY, uid);
- g_media_svc_item_validity_data_cnt = 1;
+ g_media_svc_item_validity_data_cnt = 0;
g_media_svc_item_validity_cur_data_cnt = 0;
return ret;
{
int ret = MS_MEDIA_ERR_NONE;
- if (g_media_svc_item_validity_data_cnt == 1) {
-
- return _media_svc_update_item_validity(path, validity, false, uid);
-
- } else if (g_media_svc_item_validity_cur_data_cnt < (g_media_svc_item_validity_data_cnt - 1)) {
-
- ret = _media_svc_update_item_validity(path, validity, true, uid);
- media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
-
- g_media_svc_item_validity_cur_data_cnt++;
-
- } else if (g_media_svc_item_validity_cur_data_cnt == (g_media_svc_item_validity_data_cnt - 1)) {
-
- ret = _media_svc_update_item_validity(path, validity, true, uid);
- media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
+ ret = _media_svc_update_item_validity(path, validity, true, uid);
+ media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
+ if (++g_media_svc_item_validity_cur_data_cnt == g_media_svc_item_validity_data_cnt) {
ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_SET_ITEM_VALIDITY, uid);
media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
g_media_svc_item_validity_cur_data_cnt = 0;
-
- } else {
-
- media_svc_error("Error in media_svc_set_item_validity");
- return MS_MEDIA_ERR_INTERNAL;
}
- return MS_MEDIA_ERR_NONE;
+ return ret;
}
int media_svc_delete_item_by_path(sqlite3 *handle, const char *storage_id, const char *path, uid_t uid)