#include <media_info_private.h>
+#define MAX_SIZE 16
+
static int __media_face_check_media_id(const char *media_id)
{
int ret = MEDIA_CONTENT_ERROR_NONE;
media_content_retvm_if(!STRING_VALID(media_id), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media_id");
- query_str = sqlite3_mprintf(SELECT_MEDIA_COUNT_FROM_MEDIA_BY_ID, media_id);
- ret = _content_query_prepare(&stmt, query_str, NULL, NULL);
+ /* Get image count */
+ query_str = sqlite3_mprintf(SELECT_IMAGE_COUNT_FROM_MEDIA_BY_ID, media_id);
+ ret = _content_get_result(query_str, &stmt);
SQLITE3_SAFE_FREE(query_str);
media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
- while (sqlite3_step(stmt) == SQLITE_ROW)
+ if (sqlite3_step(stmt) == SQLITE_ROW)
item_count = (int)sqlite3_column_int(stmt, 0);
SQLITE3_FINALIZE(stmt);
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
- SAFE_FREE(_face->face_id);
SAFE_FREE(_face->media_id);
SAFE_FREE(_face->face_tag);
SAFE_FREE(_face);
media_face_s *_dst = (media_face_s *)calloc(1, sizeof(media_face_s));
media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
- if (STRING_VALID(_src->face_id)) {
- _dst->face_id = strdup(_src->face_id);
- if (_dst->face_id == NULL) {
- media_face_destroy((media_face_h)_dst);
- media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
- return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
- }
- }
-
if (STRING_VALID(_src->media_id)) {
_dst->media_id = strdup(_src->media_id);
if (_dst->media_id == NULL) {
}
}
+ _dst->face_id = _src->face_id;
_dst->face_rect_x = _src->face_rect_x;
_dst->face_rect_y = _src->face_rect_y;
_dst->face_rect_w = _src->face_rect_w;
return MEDIA_CONTENT_ERROR_NONE;
}
+static void __media_face_convert_itoa(int face_id, char **face_strid)
+{
+ char buf[MAX_SIZE] = {0, };
+
+ snprintf(buf, MAX_SIZE, "%d", face_id);
+ *face_strid = strndup(buf, strlen(buf));
+}
+
int media_face_get_face_id(media_face_h face, char **face_id)
{
media_face_s* _face = (media_face_s*)face;
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
- if (STRING_VALID(_face->face_id)) {
- *face_id = strdup(_face->face_id);
+ if (_face->face_id > 0) {
+ __media_face_convert_itoa(_face->face_id, face_id);
media_content_retvm_if(*face_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "Out of memory");
} else {
*face_id = NULL;
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
ret = __media_face_check_media_id(media_id);
- media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Not exist media_id");
+ media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "media_id does not exist or is not an image");
media_face_s* _face = calloc(1, sizeof(media_face_s));
media_content_retvm_if(_face == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "Out of memory");
{
int ret = MEDIA_CONTENT_ERROR_NONE;
char *query_str = NULL;
- char *face_uuid = NULL;
+ sqlite3_stmt *stmt = NULL;
media_face_s* _face = (media_face_s*)face;
media_content_retvm_if(_face->face_rect_w == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_w");
media_content_retvm_if(_face->face_rect_h == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_h");
- ret = media_svc_generate_uuid(&face_uuid);
- media_content_retvm_if(ret != MS_MEDIA_ERR_NONE, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "Fail to generate face_id");
-
- SAFE_FREE(_face->face_id);
- _face->face_id = strdup(face_uuid);
- SAFE_FREE(face_uuid);
-
- query_str = sqlite3_mprintf(INSERT_FACE_TO_FACE, _face->face_id, _face->media_id, _face->face_rect_x, _face->face_rect_y, _face->face_rect_w, _face->face_rect_h, _face->orientation, _face->face_tag);
+ query_str = sqlite3_mprintf(INSERT_FACE_TO_FACE, _face->media_id, _face->face_rect_x, _face->face_rect_y, _face->face_rect_w, _face->face_rect_h, _face->orientation, _face->face_tag);
ret = _content_query_sql(query_str);
SQLITE3_SAFE_FREE(query_str);
+ query_str = sqlite3_mprintf(SELECT_FACE_ID, _face->media_id, _face->face_rect_x, _face->face_rect_y, _face->face_rect_w, _face->face_rect_h, _face->orientation);
+ ret = _content_get_result(query_str, &stmt);
+ SQLITE3_SAFE_FREE(query_str);
+ media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+ if (sqlite3_step(stmt) == SQLITE_ROW)
+ _face->face_id = (int)sqlite3_column_int(stmt, 0);
+
+ SQLITE3_FINALIZE(stmt);
+
+
return ret;
}
media_face_s* _face = (media_face_s*)face;
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
- media_content_retvm_if(_face->face_id == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid face_id");
+ media_content_retvm_if(_face->face_id == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid face_id");
media_content_retvm_if(_face->media_id == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_id");
media_content_retvm_if(_face->face_rect_w == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_w");
media_content_retvm_if(_face->face_rect_h == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_h");
return ret;
}
+static int __media_face_safe_atoi(const char *buffer, int *si)
+{
+ char *end = NULL;
+ errno = 0;
+ media_content_retvm_if(buffer == NULL || si == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid parameter");
+
+ const long sl = strtol(buffer, &end, 10);
+
+ media_content_retvm_if(end == buffer, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "not a decimal number");
+ media_content_retvm_if('\0' != *end, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "extra characters at end of input: %s", end);
+ media_content_retvm_if((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errno), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "out of range of type long");
+ media_content_retvm_if(sl > INT_MAX, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "greater than INT_MAX");
+ media_content_retvm_if(sl < INT_MIN, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "less than INT_MIN");
+
+ *si = (int)sl;
+
+ return MEDIA_CONTENT_ERROR_NONE;
+}
+
int media_face_delete_from_db(const char *face_id)
{
int ret = MEDIA_CONTENT_ERROR_NONE;
char *query_str = NULL;
- char *media_id = NULL;
- sqlite3_stmt *stmt = NULL;
+ int query_face_id = 0;
media_content_retvm_if(!STRING_VALID(face_id), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid face_id");
- /*To refresh face information(User try to start_face_detection again for the already scanned item),
- mark media modified_time to '0' if user delete system extracted face info. */
+ ret = __media_face_safe_atoi(face_id, &query_face_id);
+ media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid face_id");
- query_str = sqlite3_mprintf(SELECT_MEDIA_FROM_FACE, face_id);
- ret = _content_query_prepare(&stmt, query_str, NULL, NULL);
+ /*Update modified_time to 0.. It will restore the deleted face when media_info_start_face_detection() is called */
+ query_str = sqlite3_mprintf(UPDATE_MEDIA_INFO_IN_FACE_SCAN_LIST, query_face_id);
+ ret = _content_query_sql(query_str);
SQLITE3_SAFE_FREE(query_str);
media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
- while (sqlite3_step(stmt) == SQLITE_ROW)
- media_id = g_strdup((const char *)sqlite3_column_text(stmt, 0));
- SQLITE3_FINALIZE(stmt);
-
- if (STRING_VALID(media_id)) {
- query_str = sqlite3_mprintf(UPDATE_MEDIA_INFO_IN_FACE_SCAN_LIST, media_id);
- ret = _content_query_sql(query_str);
- SQLITE3_SAFE_FREE(query_str);
- }
- SAFE_FREE(media_id);
-
- query_str = sqlite3_mprintf(DELETE_FACE_FROM_FACE, face_id);
-
+ query_str = sqlite3_mprintf(DELETE_FACE_FROM_FACE, query_face_id);
ret = _content_query_sql(query_str);
SQLITE3_SAFE_FREE(query_str);