From f6c6783235803d10ba25ba8ce8aec36d6135b8a7 Mon Sep 17 00:00:00 2001 From: Jiyong Min Date: Fri, 23 Jun 2017 16:41:35 +0900 Subject: [PATCH] Code refactoring C++ to native C - C code refactoring - Apply coding rule - Fix svace issue in local Change-Id: I57c294ce5b4522cb3f2e7ab7d5e53de2ab324cda Signed-off-by: Jiyong Min --- CMakeLists.txt | 12 +- include/DcmDbUtils.h | 53 -- include/dcm_svc_db.h | 74 ++ include/{DcmDebugUtils.h => dcm_svc_debug.h} | 0 .../{DcmFaceUtils.h => dcm_svc_detect_face.h} | 10 +- ...cmColorUtils.h => dcm_svc_extract_color.h} | 6 +- include/{DcmScanSvc.h => dcm_svc_internal.h} | 25 +- include/{DcmIpcUtils.h => dcm_svc_ipc.h} | 18 +- include/{DcmMainSvc.h => dcm_svc_main.h} | 36 +- include/{DcmTypes.h => dcm_svc_type.h} | 42 +- ...{dcm_image_codec.cpp => dcm_image_codec.c} | 33 +- libdcm-util/include/dcm_image_codec.h | 2 +- packaging/dcm-service.spec | 2 +- src/{DcmDbUtils.cpp => dcm_svc_db.c} | 151 ++-- ...DcmFaceUtils.cpp => dcm_svc_detect_face.c} | 140 ++-- ...ColorUtils.cpp => dcm_svc_extract_color.c} | 18 +- src/{DcmScanSvc.cpp => dcm_svc_internal.c} | 720 ++++++++---------- src/{DcmIpcUtils.cpp => dcm_svc_ipc.c} | 26 +- svc/{DcmMainSvc.cpp => dcm_svc_main.c} | 271 +++---- 19 files changed, 715 insertions(+), 924 deletions(-) delete mode 100755 include/DcmDbUtils.h create mode 100755 include/dcm_svc_db.h rename include/{DcmDebugUtils.h => dcm_svc_debug.h} (100%) rename include/{DcmFaceUtils.h => dcm_svc_detect_face.h} (81%) rename include/{DcmColorUtils.h => dcm_svc_extract_color.h} (84%) rename include/{DcmScanSvc.h => dcm_svc_internal.h} (61%) rename include/{DcmIpcUtils.h => dcm_svc_ipc.h} (57%) rename include/{DcmMainSvc.h => dcm_svc_main.h} (58%) rename include/{DcmTypes.h => dcm_svc_type.h} (79%) rename libdcm-util/{dcm_image_codec.cpp => dcm_image_codec.c} (94%) rename src/{DcmDbUtils.cpp => dcm_svc_db.c} (70%) rename src/{DcmFaceUtils.cpp => dcm_svc_detect_face.c} (80%) rename src/{DcmColorUtils.cpp => dcm_svc_extract_color.c} (82%) rename src/{DcmScanSvc.cpp => dcm_svc_internal.c} (52%) rename src/{DcmIpcUtils.cpp => dcm_svc_ipc.c} (92%) rename svc/{DcmMainSvc.cpp => dcm_svc_main.c} (50%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 580d781..ecd706d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,11 +7,11 @@ SET(DCMSVC-LIB "dcm-service") SET(DCMFACE-LIB "dcm-face") SET(DCMUTIL-LIB "dcm-util") SET(SRCS - src/DcmColorUtils.cpp - src/DcmDbUtils.cpp - src/DcmFaceUtils.cpp - src/DcmIpcUtils.cpp - src/DcmScanSvc.cpp + src/dcm_svc_extract_color.c + src/dcm_svc_db.c + src/dcm_svc_detect_face.c + src/dcm_svc_ipc.c + src/dcm_svc_internal.c ) SET(FACE_SRCS @@ -20,7 +20,7 @@ SET(FACE_SRCS ) SET(UTIL_SRCS - libdcm-util/dcm_image_codec.cpp + libdcm-util/dcm_image_codec.c ) SET(VENDOR "samsung") diff --git a/include/DcmDbUtils.h b/include/DcmDbUtils.h deleted file mode 100755 index f03db10..0000000 --- a/include/DcmDbUtils.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef _DCM_DB_UTILS_H_ -#define _DCM_DB_UTILS_H_ - -#include -#include -#include -#include -/*#include */ -#include -#include - -typedef bool (*dcm_svc_db_face_cb)(DcmFaceItem *face_item, void *user_data); - -class DcmDbUtils { -private: - DcmDbUtils(); - static DcmDbUtils *dcmDbUtils; - static MediaDBHandle *db_handle; - -public: - uid_t dcm_uid; - static DcmDbUtils *getInstance(void); - int _dcm_svc_db_connect(uid_t uid); - int _dcm_svc_db_disconnect(); - int _dcm_svc_db_get_scan_image_list_by_path(GList **image_list, bool mmc_mounted, const char *file_path); - int _dcm_svc_db_get_scan_image_list_from_db(GList **image_list, bool mmc_mounted); - int _dcm_svc_db_insert_category_to_db(void *item); - int _dcm_svc_db_generate_uuid(DcmFaceItem **face); - int _dcm_svc_db_insert_face_to_db(DcmFaceItem *face); - int _dcm_svc_db_update_color_to_db(const DcmColorItem color); - int _dcm_svc_db_insert_face_to_face_scan_list(DcmScanItem *scan_item); - int _dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, bool *media_scanned); -}; - -#endif /*_DCM_DB_UTILS_H_*/ - diff --git a/include/dcm_svc_db.h b/include/dcm_svc_db.h new file mode 100755 index 0000000..91e01bd --- /dev/null +++ b/include/dcm_svc_db.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _DCM_DB_UTILS_H_ +#define _DCM_DB_UTILS_H_ + +#include +#include +#include +#include +/*#include */ +#include +#include + +#define DCM_STRING_VALID(str) ((str != NULL && strlen(str) > 0) ? TRUE : FALSE) +#define DCM_SQLITE3_FINALIZE(x) { if (x != NULL) { sqlite3_finalize(x); x = NULL; } } +#define DCM_SQLITE3_FREE(x) { if (x != NULL) { sqlite3_free(x); x = NULL; } } + +#define DB_TABLE_FACE "face" +#define DB_TABLE_FACE_SCAN_LIST "face_scan_list" +#define DB_TABLE_MEDIA "media" +#define FACE_ITEM "face_uuid, media_uuid, face_rect_x , face_rect_y, face_rect_w , face_rect_h, orientation" + +#define SELECT_PATH_FROM_UNEXTRACTED_DCM_MEDIA "SELECT media_uuid, path, storage_uuid, width, height, orientation, mime_type FROM media WHERE media_uuid NOT IN (SELECT DISTINCT media_uuid FROM face_scan_list) AND validity=1 AND media_type=0 AND (storage_type = 0 OR storage_type = 1);" +#define SELECT_PATH_FROM_UNEXTRACTED_DCM_INTERNAL_MEDIA "SELECT media_uuid, path, storage_uuid, width, height, orientation, mime_type FROM media WHERE media_uuid NOT IN (SELECT DISTINCT media_uuid FROM face_scan_list) AND validity=1 AND media_type=0 AND storage_type=0;" + +#define SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB "SELECT media_uuid, storage_uuid, width, height, orientation, mime_type FROM media WHERE path = '%q';" +#define INSERT_FACE_ITEM_TO_DB "INSERT INTO " DB_TABLE_FACE" (" FACE_ITEM") VALUES ('%q', '%q', %d, %d, %d, %d, %d);" + +typedef struct { + char *face_uuid; + char *media_uuid; + unsigned int face_rect_x; + unsigned int face_rect_y; + unsigned int face_rect_w; + unsigned int face_rect_h; + int orientation; +} dcm_face_item_s; + +typedef struct { + char *media_uuid; + char *storage_uuid; + unsigned char rgb_r; + unsigned char rgb_g; + unsigned char rgb_b; +} dcm_color_item_s; + +int dcm_svc_db_connect(uid_t uid); +int dcm_svc_db_disconnect(); +int dcm_svc_db_get_scan_image_list_by_path(GList **image_list, gboolean mmc_mounted, const char *file_path); +int dcm_svc_db_get_scan_image_list_from_db(GList **image_list, gboolean mmc_mounted); +int dcm_svc_db_insert_category_to_db(void *item); +int dcm_svc_db_generate_uuid(dcm_face_item_s **face); +int dcm_svc_db_insert_face_to_db(dcm_face_item_s *face); +int dcm_svc_db_update_color_to_db(const dcm_color_item_s color); +int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item); +int dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, gboolean *media_scanned); + +#endif /*_DCM_DB_UTILS_H_*/ + diff --git a/include/DcmDebugUtils.h b/include/dcm_svc_debug.h similarity index 100% rename from include/DcmDebugUtils.h rename to include/dcm_svc_debug.h diff --git a/include/DcmFaceUtils.h b/include/dcm_svc_detect_face.h similarity index 81% rename from include/DcmFaceUtils.h rename to include/dcm_svc_detect_face.h index 8e64a28..841a138 100755 --- a/include/DcmFaceUtils.h +++ b/include/dcm_svc_detect_face.h @@ -18,13 +18,11 @@ #ifndef _DCM_SVC_FACE_H_ #define _DCM_SVC_FACE_H_ -#include +#include -namespace DcmFaceUtils { - int initialize(); - int finalize(); - int runFaceRecognizeProcess(DcmScanItem *scan_item, DcmImageInfo *image_info); -} +int face_detect_initialize(); +int face_detect_finalize(); +int face_detect_process(dcm_svc_item_s *scan_item, dcm_image_info_s *image_info); #endif /*_DCM_SVC_FACE_H_*/ diff --git a/include/DcmColorUtils.h b/include/dcm_svc_extract_color.h similarity index 84% rename from include/DcmColorUtils.h rename to include/dcm_svc_extract_color.h index 1ea7f69..e06aede 100755 --- a/include/DcmColorUtils.h +++ b/include/dcm_svc_extract_color.h @@ -18,11 +18,9 @@ #ifndef _DCM_SVC_COLOR_H_ #define _DCM_SVC_COLOR_H_ -#include +#include -namespace DcmColorUtils { - int runColorExtractProcess(DcmScanItem *scan_item, DcmImageInfo *image_info); -} +int color_extract_process(dcm_svc_item_s *scan_item, dcm_image_info_s *image_info); #endif /*_DCM_SVC_COLOR_H_*/ diff --git a/include/DcmScanSvc.h b/include/dcm_svc_internal.h similarity index 61% rename from include/DcmScanSvc.h rename to include/dcm_svc_internal.h index dfa096a..b9d89c5 100755 --- a/include/DcmScanSvc.h +++ b/include/dcm_svc_internal.h @@ -20,10 +20,27 @@ #include -namespace DcmScanMain { - gboolean runScanThread(void *data); - int ScanSingle(const char *file_path, uid_t uid, int *face_count); -} +typedef struct { + GMainLoop *main_loop; + GMainContext *main_context; + gboolean g_scan_cancel; + GSource *kill_timer_source; + + /* scan all images */ + GList *scan_all_item_list; + unsigned int scan_all_curr_index; + + /* scan single images */ + GList *scan_single_item_list; + unsigned int scan_single_curr_index; + + uid_t g_uid; +} dcm_scan_s; + +gboolean dcm_scan_thread(void *data); +int dcm_scan_single(const char *file_path, uid_t uid, int *face_count); + +void quit_scan_thread(); #endif /* _DCM_SCAN_SVC_H_ */ diff --git a/include/DcmIpcUtils.h b/include/dcm_svc_ipc.h similarity index 57% rename from include/DcmIpcUtils.h rename to include/dcm_svc_ipc.h index 46ca092..e8606bd 100755 --- a/include/DcmIpcUtils.h +++ b/include/dcm_svc_ipc.h @@ -18,20 +18,18 @@ #ifndef _DCM_SVC_IPC_H_ #define _DCM_SVC_IPC_H_ -#include +#include #include #define DCM_TIMEOUT_SEC_60 60 /**< Response to media server time out */ -namespace DcmIpcUtils { - int createSocket(int *socket_fd, DcmIpcPortType port); - int acceptSocket(int serv_sock, int *client_sock); - int receiveSocketMsg(int client_sock, dcmMsg *recv_msg); - int sendSocketMsg(ms_dcm_msg_type_e msg_type, uid_t uid, const char *msg, DcmIpcPortType port); - int sendCompleteMsg(ms_dcm_msg_type_e msg_type, const unsigned int count, const char *msg, DcmIpcPortType port); - int sendClientSocketMsg(int socket_fd, ms_dcm_msg_type_e msg_type, unsigned int result, const char *msg, DcmIpcPortType port); - int closeSocket(int socket_fd); -} +int dcm_ipc_create_socket(int *socket_fd, dcm_ipc_port_e port); +int dcm_ipc_accept_socket(int serv_sock, int *client_sock); +int dcm_ipc_receive_message(int client_sock, dcmMsg *recv_msg); +int dcm_ipc_send_message(ms_dcm_msg_type_e msg_type, uid_t uid, const char *msg, dcm_ipc_port_e port); +int dcm_ipc_send_complete(ms_dcm_msg_type_e msg_type, const unsigned int count, const char *msg, dcm_ipc_port_e port); +int dcm_ipc_send_client_message(int socket_fd, ms_dcm_msg_type_e msg_type, unsigned int result, const char *msg, dcm_ipc_port_e port); +int dcm_ipc_close_socket(int socket_fd); #endif /* _DCM_SVC_IPC_H_ */ diff --git a/include/DcmMainSvc.h b/include/dcm_svc_main.h similarity index 58% rename from include/DcmMainSvc.h rename to include/dcm_svc_main.h index b371a76..26aa670 100755 --- a/include/DcmMainSvc.h +++ b/include/dcm_svc_main.h @@ -19,40 +19,24 @@ #define _DCM_MAIN_SVC_H_ #include -#include -#include +#include +#include #ifndef EXPORT_API #define EXPORT_API __attribute__ ((visibility("default"))) #endif -class DcmMainSvc { - static DcmMainSvc *dcmMainSvc; +typedef struct { + // main thread + GMainLoop *main_loop; + GMainContext *main_context; + GSource *kill_timer_source; -public: - /* scan thread related */ - /* GMainLoop *g_dcm_svc_mainloop; */ - - /* scan thread related */ + // scan thread GThread *scan_thread; GAsyncQueue *scan_thread_ready; - - /* main thread related */ - GMainContext *main_loop_context; - GMainContext *main_thread_context; - GIOChannel *main_thread_recv_channel; - int main_thread_recv_socket; - GSource *main_thread_quit_timer; - bool scan_thread_working; - - static DcmMainSvc *getInstance(void); - void dcmServiceStartjobs(); - void dcmServiceFinishjobs(); - int waitScanThreadReady(); - int createScanThread(); - int createQuitTimerMainLoop(); - void quitDcmSvcMainLoop(); -}; + gboolean scan_thread_working; +} dcm_service_s; #endif /* _DCM_MAIN_SVC_H_ */ diff --git a/include/DcmTypes.h b/include/dcm_svc_type.h similarity index 79% rename from include/DcmTypes.h rename to include/dcm_svc_type.h index 4d44708..4189971 100755 --- a/include/DcmTypes.h +++ b/include/dcm_svc_type.h @@ -35,14 +35,20 @@ typedef enum { DCM_IPC_PORT_DCM_RECV, DCM_IPC_PORT_MS_RECV, DCM_IPC_PORT_MAX, -} DcmIpcPortType; +} dcm_ipc_port_e; typedef enum { DCM_SCAN_ITEM_TYPE_NONE, DCM_SCAN_ITEM_TYPE_SCAN_ALL, DCM_SCAN_ITEM_TYPE_SCAN_SINGLE, DCM_SCAN_ITEM_TYPE_MAX, -} DcmScanItemType; +} dcm_svc_type_e; + +typedef enum { + DCM_SVC_I420, + DCM_SVC_RGB, + DCM_SVC_RGBA, +} dcm_image_type_e; typedef struct { char *media_uuid; @@ -53,32 +59,8 @@ typedef struct { int image_orientation; char *mime_type; int face_count; - DcmScanItemType scan_item_type; -} DcmScanItem; - -typedef struct { - char *face_uuid; - char *media_uuid; - unsigned int face_rect_x; - unsigned int face_rect_y; - unsigned int face_rect_w; - unsigned int face_rect_h; - int orientation; -} DcmFaceItem; - -typedef struct { - char *media_uuid; - char *storage_uuid; - unsigned char rgb_r; - unsigned char rgb_g; - unsigned char rgb_b; -} DcmColorItem; - -typedef enum { - DCM_SVC_I420, - DCM_SVC_RGB, - DCM_SVC_RGBA, -} DcmImageDecodeType; + dcm_svc_type_e scan_item_type; +} dcm_svc_item_s; typedef struct { unsigned char *pixel; /* decoding results, must be freed after use */ @@ -88,8 +70,8 @@ typedef struct { unsigned int original_height; /* original image height */ unsigned int buffer_width; /* scaled image width used by decoder (width/height ratio should be the same as original) */ unsigned int buffer_height; /* scaled image height used by decoder (width/height ratio should be the same as original) */ - DcmImageDecodeType decode_type; /* decoding pre-condition */ -} DcmImageInfo; + dcm_image_type_e decode_type; /* decoding pre-condition */ +} dcm_image_info_s; #endif /* _DCM_TYPES_H_ */ diff --git a/libdcm-util/dcm_image_codec.cpp b/libdcm-util/dcm_image_codec.c similarity index 94% rename from libdcm-util/dcm_image_codec.cpp rename to libdcm-util/dcm_image_codec.c index c4eff59..804bf5c 100755 --- a/libdcm-util/dcm_image_codec.cpp +++ b/libdcm-util/dcm_image_codec.c @@ -21,9 +21,9 @@ #include #include #include -#include +#include #include -#include +#include #include #define MIME_TYPE_JPEG "image/jpeg" @@ -65,26 +65,24 @@ static int _dcm_rotate_image(const unsigned char *source, const dcm_image_format DCM_CHECK_VAL(source, MS_MEDIA_ERR_INVALID_PARAMETER); - if (format == DCM_IMAGE_FORMAT_I420) { + if (format == DCM_IMAGE_FORMAT_I420) colorspace = IMAGE_UTIL_COLORSPACE_I420; - } else if (format == DCM_IMAGE_FORMAT_RGB) { + else if (format == DCM_IMAGE_FORMAT_RGB) colorspace = IMAGE_UTIL_COLORSPACE_RGB888; - } else if (format == DCM_IMAGE_FORMAT_RGBA) { + else if (format == DCM_IMAGE_FORMAT_RGBA) colorspace = IMAGE_UTIL_COLORSPACE_RGBA8888; - } else { + else return MS_MEDIA_ERR_UNSUPPORTED_CONTENT; - } /* Get rotate angle enum */ - if (orientation == DEGREE_180) { + if (orientation == DEGREE_180) rotate = IMAGE_UTIL_ROTATION_180; - } else if (orientation == DEGREE_90) { + else if (orientation == DEGREE_90) rotate = IMAGE_UTIL_ROTATION_90; - } else if (orientation == DEGREE_270) { + else if (orientation == DEGREE_270) rotate = IMAGE_UTIL_ROTATION_270; - } else { + else rotate = IMAGE_UTIL_ROTATION_NONE; - } dcm_debug("orientation: %d, rotate: %d", orientation, rotate); @@ -169,12 +167,10 @@ int _dcm_rotate_rgb(unsigned char *source, const unsigned long long *size, int f height = *ori_height; /* rotate image to 90 degree clockwise */ - for (y = 0; y < height; y++) - { + for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { - for (i = 0; i < dpp; i++) { + for (i = 0; i < dpp; i++) temp_buf[(x * height + (height - y - 1)) * dpp + i] = source[(y * width + x) * dpp + i]; - } } } @@ -190,7 +186,7 @@ int _dcm_rotate_rgb(unsigned char *source, const unsigned long long *size, int f } int dcm_decode_image(const char *file_path, const dcm_image_format_e format, - const char* mimne_type, const int orientation, const bool resize, + const char* mimne_type, const int orientation, const gboolean resize, unsigned char **image_buffer, unsigned long long *size, unsigned int *buff_width, unsigned int *buff_height) { @@ -275,9 +271,8 @@ int dcm_decode_image(const char *file_path, const dcm_image_format_e format, } *size = buffer_size; resize_buffer = (unsigned char *)malloc(sizeof(unsigned char) * (buffer_size)); - if (resize_buffer != NULL) { + if (resize_buffer != NULL) mm_util_resize_image(decode_buffer, decode_width, decode_height, mm_format, resize_buffer, buff_width, buff_height); - } } else { resize_buffer = decode_buffer; } diff --git a/libdcm-util/include/dcm_image_codec.h b/libdcm-util/include/dcm_image_codec.h index 7a0a7e4..22d8129 100755 --- a/libdcm-util/include/dcm_image_codec.h +++ b/libdcm-util/include/dcm_image_codec.h @@ -45,7 +45,7 @@ typedef struct { int dcm_decode_image(const char *file_path, const dcm_image_format_e format, - const char* mimne_type, const int orientation, const bool resize, + const char* mimne_type, const int orientation, const gboolean resize, unsigned char **image_buffer, unsigned long long *size, unsigned int *buff_width, unsigned int *buff_height); diff --git a/packaging/dcm-service.spec b/packaging/dcm-service.spec index 60edb61..dfd3d68 100755 --- a/packaging/dcm-service.spec +++ b/packaging/dcm-service.spec @@ -1,6 +1,6 @@ Name: dcm-service Summary: A media DCM(Digital Contents Management) Service -Version: 0.0.18 +Version: 0.1.0 Release: 0 Group: Multimedia/Service License: Apache-2.0 diff --git a/src/DcmDbUtils.cpp b/src/dcm_svc_db.c similarity index 70% rename from src/DcmDbUtils.cpp rename to src/dcm_svc_db.c index 9929faf..5fcc4c3 100755 --- a/src/DcmDbUtils.cpp +++ b/src/dcm_svc_db.c @@ -20,59 +20,23 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include -#define DCM_STRING_VALID(str) ((str != NULL && strlen(str) > 0) ? TRUE : FALSE) -#define DCM_SQLITE3_FINALIZE(x) {if (x != NULL) {sqlite3_finalize(x);x=NULL;}} -#define DCM_SQLITE3_FREE(x) {if (x != NULL) {sqlite3_free(x);x=NULL;}} - -#define DB_TABLE_FACE "face" -#define DB_TABLE_FACE_SCAN_LIST "face_scan_list" -#define DB_TABLE_MEDIA "media" -#define FACE_ITEM "face_uuid, media_uuid, face_rect_x , face_rect_y, face_rect_w , face_rect_h, orientation" - -#define SELECT_PATH_FROM_UNEXTRACTED_DCM_MEDIA "SELECT media_uuid, path, storage_uuid, width, height, orientation, mime_type FROM media WHERE media_uuid NOT IN (SELECT DISTINCT media_uuid FROM face_scan_list) AND validity=1 AND media_type=0 AND (storage_type = 0 OR storage_type = 1);" -#define SELECT_PATH_FROM_UNEXTRACTED_DCM_INTERNAL_MEDIA "SELECT media_uuid, path, storage_uuid, width, height, orientation, mime_type FROM media WHERE media_uuid NOT IN (SELECT DISTINCT media_uuid FROM face_scan_list) AND validity=1 AND media_type=0 AND storage_type=0;" - -#define SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB "SELECT media_uuid, storage_uuid, width, height, orientation, mime_type FROM media WHERE path = '%q';" -#define INSERT_FACE_ITEM_TO_DB "INSERT INTO " DB_TABLE_FACE" (" FACE_ITEM") VALUES ('%q', '%q', %d, %d, %d, %d, %d);" +#include "dcm_svc_debug.h" static GMutex gMutexLock; +static MediaDBHandle *db_handle; +static uid_t dcm_uid; -namespace DcmDbUtilsInternal { -bool __dcm_svc_db_check_duplicated(MediaDBHandle *db_handle, DcmFaceItem *data); -bool __dcm_svc_db_check_duplicated_scan_list(MediaDBHandle *db_handle, const char *data); -static int __dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt); -static int __dcm_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt); -} - -DcmDbUtils* DcmDbUtils::getInstance(void) -{ - if (dcmDbUtils == NULL) { - g_mutex_trylock(&gMutexLock); - - if (dcmDbUtils == NULL) { - dcmDbUtils = new DcmDbUtils(); - } - - g_mutex_unlock(&gMutexLock); - } - - return dcmDbUtils; -} - -DcmDbUtils *DcmDbUtils::dcmDbUtils = NULL; -MediaDBHandle *DcmDbUtils::db_handle = NULL; - -DcmDbUtils::DcmDbUtils(void) -{ - -} +gboolean _dcm_svc_db_check_duplicated(MediaDBHandle *db_handle, dcm_face_item_s *data); +gboolean _dcm_svc_db_check_duplicated_scan_list(MediaDBHandle *db_handle, const char *data); +static int _dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt); +static int _dcm_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt); -bool DcmDbUtilsInternal::__dcm_svc_db_check_duplicated(MediaDBHandle *db_handle, DcmFaceItem *data) +gboolean _dcm_svc_db_check_duplicated(MediaDBHandle *db_handle, dcm_face_item_s *data) { int ret = MS_MEDIA_ERR_NONE; sqlite3 * handle = (sqlite3 *)db_handle; @@ -88,7 +52,7 @@ bool DcmDbUtilsInternal::__dcm_svc_db_check_duplicated(MediaDBHandle *db_handle, , DB_TABLE_FACE, data->media_uuid , data->face_rect_x, data->face_rect_y, data->face_rect_w, data->face_rect_h, data->orientation); - ret = __dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); + ret = _dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("error when __dcm_svc_sql_prepare_to_step. ret = [%d]", ret); @@ -107,7 +71,7 @@ bool DcmDbUtilsInternal::__dcm_svc_db_check_duplicated(MediaDBHandle *db_handle, return FALSE; } -bool DcmDbUtilsInternal::__dcm_svc_db_check_duplicated_scan_list(MediaDBHandle *db_handle, const char *data) +gboolean _dcm_svc_db_check_duplicated_scan_list(MediaDBHandle *db_handle, const char *data) { int ret = MS_MEDIA_ERR_NONE; sqlite3 * handle = (sqlite3 *)db_handle; @@ -119,7 +83,7 @@ bool DcmDbUtilsInternal::__dcm_svc_db_check_duplicated_scan_list(MediaDBHandle * query_string = sqlite3_mprintf("SELECT count(*) FROM %s WHERE media_uuid='%s'", DB_TABLE_FACE_SCAN_LIST, data); - ret = __dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); + ret = _dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("error when __dcm_svc_sql_prepare_to_step. ret = [%d]", ret); @@ -139,14 +103,13 @@ bool DcmDbUtilsInternal::__dcm_svc_db_check_duplicated_scan_list(MediaDBHandle * } -static int DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt) +static int _dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt) { int ret = MS_MEDIA_ERR_NONE; dcm_debug("[SQL query] : %s", sql_str); - if (!DCM_STRING_VALID(sql_str)) - { + if (!DCM_STRING_VALID(sql_str)) { dcm_error("invalid query"); return MS_MEDIA_ERR_INVALID_PARAMETER; } @@ -155,12 +118,11 @@ static int DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step(sqlite3 *handle, co sqlite3_free((char *)sql_str); if (ret != SQLITE_OK) { - dcm_error ("prepare error %d[%s]", ret, sqlite3_errmsg(handle)); - if (ret == SQLITE_CORRUPT) { + dcm_error("prepare error %d[%s]", ret, sqlite3_errmsg(handle)); + if (ret == SQLITE_CORRUPT) return MS_MEDIA_ERR_DB_CORRUPT; - } else if (ret == SQLITE_PERM) { + else if (ret == SQLITE_PERM) return MS_MEDIA_ERR_DB_PERMISSION; - } return MS_MEDIA_ERR_DB_INTERNAL; } @@ -175,14 +137,13 @@ static int DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step(sqlite3 *handle, co return MS_MEDIA_ERR_NONE; } -static int DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt) +static int _dcm_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt) { int ret = MS_MEDIA_ERR_NONE; dcm_debug("[SQL query] : %s", sql_str); - if (!DCM_STRING_VALID(sql_str)) - { + if (!DCM_STRING_VALID(sql_str)) { dcm_error("invalid query"); return MS_MEDIA_ERR_INVALID_PARAMETER; } @@ -191,20 +152,18 @@ static int DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step_simple(sqlite3 *han sqlite3_free((char *)sql_str); if (ret != SQLITE_OK) { - dcm_error ("prepare error %d[%s]", ret, sqlite3_errmsg(handle)); - if (ret == SQLITE_CORRUPT) { + dcm_error("prepare error %d[%s]", ret, sqlite3_errmsg(handle)); + if (ret == SQLITE_CORRUPT) return MS_MEDIA_ERR_DB_CORRUPT; - } else if (ret == SQLITE_PERM) { + else if (ret == SQLITE_PERM) return MS_MEDIA_ERR_DB_PERMISSION; - } - return MS_MEDIA_ERR_DB_INTERNAL; } return MS_MEDIA_ERR_NONE; } -int DcmDbUtils::_dcm_svc_db_connect(uid_t uid) +int dcm_svc_db_connect(uid_t uid) { int ret = MS_MEDIA_ERR_NONE; @@ -225,7 +184,7 @@ int DcmDbUtils::_dcm_svc_db_connect(uid_t uid) return MS_MEDIA_ERR_NONE; } -int DcmDbUtils::_dcm_svc_db_disconnect(void) +int dcm_svc_db_disconnect(void) { int ret = MS_MEDIA_ERR_NONE; @@ -248,7 +207,7 @@ int DcmDbUtils::_dcm_svc_db_disconnect(void) } -int DcmDbUtils::_dcm_svc_db_get_scan_image_list_by_path(GList **image_list, bool mmc_mounted, const char *file_path) +int dcm_svc_db_get_scan_image_list_by_path(GList **image_list, gboolean mmc_mounted, const char *file_path) { int ret = MS_MEDIA_ERR_NONE; char *query_string = NULL; @@ -260,25 +219,24 @@ int DcmDbUtils::_dcm_svc_db_get_scan_image_list_by_path(GList **image_list, bool DCM_CHECK_VAL(file_path, MS_MEDIA_ERR_INVALID_PARAMETER); /* Make query */ - if (mmc_mounted == true) { + if (mmc_mounted == true) query_string = sqlite3_mprintf(SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB, file_path); - } else { + else query_string = sqlite3_mprintf(SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB, file_path); - } if (query_string == NULL) { dcm_error("Failed to make query!"); return MS_MEDIA_ERR_OUT_OF_MEMORY; } - ret = DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step_simple((sqlite3 *)db_handle, query_string, &sql_stmt); + ret = _dcm_svc_sql_prepare_to_step_simple((sqlite3 *)db_handle, query_string, &sql_stmt); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("error when __dcm_svc_sql_prepare_to_step. ret = [%d]", ret); return TRUE; } - while(sqlite3_step(sql_stmt) == SQLITE_ROW) { - DcmScanItem *scan_item = (DcmScanItem *) g_malloc0(sizeof(DcmScanItem)); + while (sqlite3_step(sql_stmt) == SQLITE_ROW) { + dcm_svc_item_s *scan_item = (dcm_svc_item_s *) g_malloc0(sizeof(dcm_svc_item_s)); if (!scan_item) { dcm_error("Failed to allocate memory for scan_item!"); continue; @@ -313,7 +271,7 @@ int DcmDbUtils::_dcm_svc_db_get_scan_image_list_by_path(GList **image_list, bool return ret; } -int DcmDbUtils::_dcm_svc_db_get_scan_image_list_from_db(GList **image_list, bool mmc_mounted) +int dcm_svc_db_get_scan_image_list_from_db(GList **image_list, gboolean mmc_mounted) { int ret = MS_MEDIA_ERR_NONE; char * query_string = NULL; @@ -325,20 +283,19 @@ int DcmDbUtils::_dcm_svc_db_get_scan_image_list_from_db(GList **image_list, bool DCM_CHECK_VAL(image_list, MS_MEDIA_ERR_INVALID_PARAMETER); /* Make query */ - if (mmc_mounted == true) { + if (mmc_mounted == true) query_string = sqlite3_mprintf(SELECT_PATH_FROM_UNEXTRACTED_DCM_MEDIA); - } else { + else query_string = sqlite3_mprintf(SELECT_PATH_FROM_UNEXTRACTED_DCM_INTERNAL_MEDIA); - } - ret = DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step_simple((sqlite3 *)db_handle, query_string, &sql_stmt); + ret = _dcm_svc_sql_prepare_to_step_simple((sqlite3 *)db_handle, query_string, &sql_stmt); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("error when __dcm_svc_sql_prepare_to_step_simple. ret = [%d]", ret); return ret; } - while(sqlite3_step(sql_stmt) == SQLITE_ROW) { - DcmScanItem *scan_item = (DcmScanItem *) g_malloc0(sizeof(DcmScanItem)); + while (sqlite3_step(sql_stmt) == SQLITE_ROW) { + dcm_svc_item_s *scan_item = (dcm_svc_item_s *) g_malloc0(sizeof(dcm_svc_item_s)); if (!scan_item) { dcm_error("Failed to allocate memory for scan_item!"); continue; @@ -373,7 +330,7 @@ int DcmDbUtils::_dcm_svc_db_get_scan_image_list_from_db(GList **image_list, bool return MS_MEDIA_ERR_NONE; } -int DcmDbUtils::_dcm_svc_db_generate_uuid(DcmFaceItem **face) +int dcm_svc_db_generate_uuid(dcm_face_item_s **face) { int ret = MS_MEDIA_ERR_NONE; uuid_t uuid_value; @@ -387,18 +344,17 @@ int DcmDbUtils::_dcm_svc_db_generate_uuid(DcmFaceItem **face) (*face)->face_uuid = g_strdup(uuid_unparsed); - if ((*face)->face_uuid == NULL) { + if ((*face)->face_uuid == NULL) ret = MS_MEDIA_ERR_INTERNAL; - } else { + else dcm_debug("set face_uuid :%s", (*face)->face_uuid); - } dcm_debug_fleave(); return ret; } -int DcmDbUtils::_dcm_svc_db_insert_face_to_db(DcmFaceItem *face) +int dcm_svc_db_insert_face_to_db(dcm_face_item_s *face) { int ret = MS_MEDIA_ERR_NONE; char* query_string = NULL; @@ -409,7 +365,7 @@ int DcmDbUtils::_dcm_svc_db_insert_face_to_db(DcmFaceItem *face) DCM_CHECK_VAL(face, MS_MEDIA_ERR_INVALID_PARAMETER); DCM_CHECK_VAL(face->face_uuid, MS_MEDIA_ERR_INVALID_PARAMETER); - if (DcmDbUtilsInternal::__dcm_svc_db_check_duplicated(db_handle, face) == TRUE) { + if (_dcm_svc_db_check_duplicated(db_handle, face) == TRUE) { dcm_error("[__dcm_svc_db_check_duplicated] The data is duplicated!"); return MS_MEDIA_ERR_INTERNAL; } @@ -420,9 +376,9 @@ int DcmDbUtils::_dcm_svc_db_insert_face_to_db(DcmFaceItem *face) g_mutex_trylock(&gMutexLock); ret = media_db_request_update_db(query_string, dcm_uid); - if (ret != MS_MEDIA_ERR_NONE) { + if (ret != MS_MEDIA_ERR_NONE) dcm_error("media_db_request_update_db fail = %d, %s", ret, sqlite3_errmsg((sqlite3 *)db_handle)); - } + g_mutex_unlock(&gMutexLock); DCM_SQLITE3_FREE(query_string); @@ -432,7 +388,7 @@ int DcmDbUtils::_dcm_svc_db_insert_face_to_db(DcmFaceItem *face) return ret; } -int DcmDbUtils::_dcm_svc_db_insert_face_to_face_scan_list(DcmScanItem *scan_item) +int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item) { int ret = MS_MEDIA_ERR_NONE; char* query_string = NULL; @@ -443,7 +399,7 @@ int DcmDbUtils::_dcm_svc_db_insert_face_to_face_scan_list(DcmScanItem *scan_item DCM_CHECK_VAL(scan_item, MS_MEDIA_ERR_INVALID_PARAMETER); DCM_CHECK_VAL(scan_item->media_uuid, MS_MEDIA_ERR_INVALID_PARAMETER); - if (DcmDbUtilsInternal::__dcm_svc_db_check_duplicated_scan_list(db_handle, scan_item->media_uuid) == TRUE) { + if (_dcm_svc_db_check_duplicated_scan_list(db_handle, scan_item->media_uuid) == TRUE) { dcm_error("[_dcm_svc_db_insert_face_to_face_scan_list] The data is duplicated!"); return MS_MEDIA_ERR_INTERNAL; } @@ -454,9 +410,9 @@ int DcmDbUtils::_dcm_svc_db_insert_face_to_face_scan_list(DcmScanItem *scan_item g_mutex_trylock(&gMutexLock); ret = media_db_request_update_db(query_string, dcm_uid); - if (ret != MS_MEDIA_ERR_NONE) { + if (ret != MS_MEDIA_ERR_NONE) dcm_error("media_db_request_update_db is failed: %d, %s", ret, sqlite3_errmsg((sqlite3 *)db_handle)); - } + g_mutex_unlock(&gMutexLock); DCM_SQLITE3_FREE(query_string); @@ -466,7 +422,7 @@ int DcmDbUtils::_dcm_svc_db_insert_face_to_face_scan_list(DcmScanItem *scan_item return ret; } -int DcmDbUtils::_dcm_svc_db_update_color_to_db(DcmColorItem color) +int dcm_svc_db_update_color_to_db(dcm_color_item_s color) { int ret = MS_MEDIA_ERR_NONE; @@ -483,9 +439,8 @@ int DcmDbUtils::_dcm_svc_db_update_color_to_db(DcmColorItem color) g_mutex_trylock(&gMutexLock); ret = media_db_request_update_db(query_string, dcm_uid); - if (ret != MS_MEDIA_ERR_NONE) { + if (ret != MS_MEDIA_ERR_NONE) dcm_error("media_db_request_update_db fail = %d, %s", ret, sqlite3_errmsg((sqlite3 *)db_handle)); - } g_mutex_unlock(&gMutexLock); DCM_SQLITE3_FREE(query_string); @@ -495,7 +450,7 @@ int DcmDbUtils::_dcm_svc_db_update_color_to_db(DcmColorItem color) return ret; } -int DcmDbUtils::_dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, bool *media_scanned) +int dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, gboolean *media_scanned) { int ret = MS_MEDIA_ERR_NONE; char *query_string = NULL; @@ -510,7 +465,7 @@ int DcmDbUtils::_dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, query_string = sqlite3_mprintf("SELECT count(*) FROM %s WHERE (media_uuid='%q')", DB_TABLE_FACE_SCAN_LIST, media_uuid); DCM_CHECK_VAL(query_string, MS_MEDIA_ERR_OUT_OF_MEMORY); - ret = DcmDbUtilsInternal::__dcm_svc_sql_prepare_to_step((sqlite3 *)db_handle, query_string, &sql_stmt); + ret = _dcm_svc_sql_prepare_to_step((sqlite3 *)db_handle, query_string, &sql_stmt); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("error when __dcm_svc_sql_prepare_to_step. ret = [%d]", ret); return ret; diff --git a/src/DcmFaceUtils.cpp b/src/dcm_svc_detect_face.c similarity index 80% rename from src/DcmFaceUtils.cpp rename to src/dcm_svc_detect_face.c index 785bb07..4496cb9 100755 --- a/src/DcmFaceUtils.cpp +++ b/src/dcm_svc_detect_face.c @@ -26,21 +26,64 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include "dcm_svc_detect_face.h" +static dcm_face_h dcm_face_handle = NULL; + +double _calculate_scale_factor(dcm_image_info_s *image_info) +{ + double scale_factor = 0.0; + + DCM_CHECK_VAL(image_info, 0.0); + + if (image_info->original_width >= image_info->original_height) { + if (image_info->buffer_width >= image_info->buffer_height) + scale_factor = ((double) (image_info->original_width)) / ((double) (image_info->buffer_width)); + else + scale_factor = ((double) (image_info->original_width)) / ((double) (image_info->buffer_height)); + } else { + if (image_info->buffer_height >= image_info->buffer_width) + scale_factor = ((double) (image_info->original_height)) / ((double) (image_info->buffer_height)); + else + scale_factor = ((double) (image_info->original_height)) / ((double) (image_info->buffer_width)); + } -namespace DcmFaceApi { -int createFaceItem(DcmFaceItem **face); -double caculateScaleFactor(DcmImageInfo *image_info); -void freeDcmFaceItem(void *data); + dcm_debug("scale_factor: %lf", scale_factor); + + return scale_factor; } -static dcm_face_h dcm_face_handle = NULL; +int _create_face_item(dcm_face_item_s **face) +{ + DCM_CHECK_VAL(face, MS_MEDIA_ERR_INVALID_PARAMETER); + + *face = NULL; -int DcmFaceUtils::initialize() + dcm_face_item_s *_face = (dcm_face_item_s*)g_malloc0(sizeof(dcm_face_item_s)); + if (_face == NULL) + return MS_MEDIA_ERR_OUT_OF_MEMORY; + + *face = _face; + + return MS_MEDIA_ERR_NONE; +} + +void _destroy_face_item(void *data) +{ + dcm_face_item_s *_face = (dcm_face_item_s *)data; + DCM_CHECK(_face); + + DCM_SAFE_FREE(_face->face_uuid); + DCM_SAFE_FREE(_face->media_uuid); + DCM_SAFE_FREE(_face); + + return; +} + +int face_detect_initialize() { int ret = MS_MEDIA_ERR_NONE; @@ -53,7 +96,7 @@ int DcmFaceUtils::initialize() return ret; } -int DcmFaceUtils::finalize() +int face_detect_finalize() { int ret = MS_MEDIA_ERR_NONE; @@ -70,10 +113,9 @@ int DcmFaceUtils::finalize() return ret; } -int DcmFaceUtils::runFaceRecognizeProcess(DcmScanItem *scan_item, DcmImageInfo *image_info) +int face_detect_process(dcm_svc_item_s *scan_item, dcm_image_info_s *image_info) { - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); - DcmFaceItem *face = NULL; + dcm_face_item_s *face = NULL; int face_area = 0; int i = 0; double scale_factor = 0.0; @@ -115,17 +157,16 @@ int DcmFaceUtils::runFaceRecognizeProcess(DcmScanItem *scan_item, DcmImageInfo * scan_item->face_count = 0; goto DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED; } - scan_item->face_count = face_info->count; /* Compute scale factor between decode size and original size */ - scale_factor = DcmFaceApi::caculateScaleFactor(image_info); + scale_factor = _calculate_scale_factor(image_info); /* Insert every face rectangle into database */ for (i = 0; i < face_info->count; i++) { face = NULL; - ret = DcmFaceApi::createFaceItem(&face); + ret = _create_face_item(&face); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to create face items! ret: %d", ret); goto DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED; @@ -151,33 +192,32 @@ int DcmFaceUtils::runFaceRecognizeProcess(DcmScanItem *scan_item, DcmImageInfo * face->media_uuid = strdup(scan_item->media_uuid); /* Insert face rectangle into database */ - ret = dcmDbUtils->_dcm_svc_db_generate_uuid(&face); + ret = dcm_svc_db_generate_uuid(&face); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to set uuid! ret: %d", ret); goto DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED; } - ret = dcmDbUtils->_dcm_svc_db_insert_face_to_db(face); + ret = dcm_svc_db_insert_face_to_db(face); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to insert face item into db! ret: %d", ret); goto DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED; } /* Send db updated notification */ - DcmFaceApi::freeDcmFaceItem(face); + _destroy_face_item(face); face = NULL; } DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED: - err = dcmDbUtils->_dcm_svc_db_insert_face_to_face_scan_list(scan_item); - if (err != MS_MEDIA_ERR_NONE) { + err = dcm_svc_db_insert_face_to_face_scan_list(scan_item); + if (err != MS_MEDIA_ERR_NONE) dcm_error("Failed to insert face item into face_scan_list! err: %d", err); - } dcm_face_destroy_face_info(face_info); if (face != NULL) { - DcmFaceApi::freeDcmFaceItem(face); + _destroy_face_item(face); face = NULL; } @@ -185,55 +225,3 @@ DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED: return ret; } - -int DcmFaceApi::createFaceItem(DcmFaceItem **face) -{ - DCM_CHECK_VAL(face, MS_MEDIA_ERR_INVALID_PARAMETER); - - *face = NULL; - - DcmFaceItem *_face = (DcmFaceItem*)g_malloc0(sizeof(DcmFaceItem)); - if (_face == NULL) - return MS_MEDIA_ERR_OUT_OF_MEMORY; - - *face = _face; - - return MS_MEDIA_ERR_NONE; -} - -double DcmFaceApi::caculateScaleFactor(DcmImageInfo *image_info) -{ - double scale_factor = 0.0; - - DCM_CHECK_VAL(image_info, 0.0); - - if (image_info->original_width >= image_info->original_height) { - if (image_info->buffer_width >= image_info->buffer_height) { - scale_factor = ((double) (image_info->original_width)) / ((double) (image_info->buffer_width)); - } else { - scale_factor = ((double) (image_info->original_width)) / ((double) (image_info->buffer_height)); - } - } else { - if (image_info->buffer_height >= image_info->buffer_width) { - scale_factor = ((double) (image_info->original_height)) / ((double) (image_info->buffer_height)); - } else { - scale_factor = ((double) (image_info->original_height)) / ((double) (image_info->buffer_width)); - } - } - - dcm_debug("scale_factor: %lf", scale_factor); - - return scale_factor; -} - -void DcmFaceApi::freeDcmFaceItem(void *data) -{ - DcmFaceItem *_face = (DcmFaceItem *)data; - DCM_CHECK(_face); - - DCM_SAFE_FREE(_face->face_uuid); - DCM_SAFE_FREE(_face->media_uuid); - DCM_SAFE_FREE(_face); - - return; -} diff --git a/src/DcmColorUtils.cpp b/src/dcm_svc_extract_color.c similarity index 82% rename from src/DcmColorUtils.cpp rename to src/dcm_svc_extract_color.c index 44c67e1..31c17c6 100755 --- a/src/DcmColorUtils.cpp +++ b/src/dcm_svc_extract_color.c @@ -22,13 +22,12 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include "dcm_svc_debug.h" +#include "dcm_svc_extract_color.h" - -int DcmColorUtils::runColorExtractProcess(DcmScanItem *scan_item, DcmImageInfo *image_info) +int color_extract_process(dcm_svc_item_s *scan_item, dcm_image_info_s *image_info) { DCM_CHECK_VAL(scan_item, MS_MEDIA_ERR_INVALID_PARAMETER); DCM_CHECK_VAL(image_info, MS_MEDIA_ERR_INVALID_PARAMETER); @@ -36,10 +35,9 @@ int DcmColorUtils::runColorExtractProcess(DcmScanItem *scan_item, DcmImageInfo * dcm_debug_fenter(); #if 0 - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); int ret = IMAGE_UTIL_ERROR_NONE; - DcmColorItem colorItem = {0,}; - memset(&colorItem, 0, sizeof(DcmColorItem)); + dcm_color_item_s colorItem = {0,}; + memset(&colorItem, 0, sizeof(dcm_color_item_s)); // Extracting color supports only RGB888 format ret = image_util_extract_color_from_memory(image_info->pixel, image_info->buffer_width, image_info->buffer_height, &(colorItem.rgb_r), &(colorItem.rgb_g), &(colorItem.rgb_b)); @@ -52,7 +50,7 @@ int DcmColorUtils::runColorExtractProcess(DcmScanItem *scan_item, DcmImageInfo * colorItem.media_uuid = strdup(scan_item->media_uuid); colorItem.storage_uuid = strdup(scan_item->storage_uuid); - ret = dcmDbUtils->_dcm_svc_db_update_color_to_db(colorItem); + ret = dcm_svc_db_update_color_to_db(colorItem); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to update color item into db! err: %d", ret); return MS_MEDIA_ERR_DB_INTERNAL; diff --git a/src/DcmScanSvc.cpp b/src/dcm_svc_internal.c similarity index 52% rename from src/DcmScanSvc.cpp rename to src/dcm_svc_internal.c index 3159142..46fe605 100755 --- a/src/DcmScanSvc.cpp +++ b/src/dcm_svc_internal.c @@ -25,14 +25,15 @@ #include #include "../libdcm-util/include/dcm_image_codec.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include + +#include "dcm_svc_debug.h" +#include "dcm_svc_extract_color.h" +#include "dcm_svc_detect_face.h" #define MIME_TYPE_JPEG "image/jpeg" #define MIME_TYPE_PNG "image/png" @@ -40,56 +41,14 @@ #define DCM_SVC_SCAN_THREAD_TIMEOUT_SEC 1 -class DcmScanSvc { -public: - GMainLoop *g_scan_thread_mainloop; - GMainContext *scan_thread_main_context; - gboolean g_scan_cancel; - GSource *scan_thread_quit_timer; - DcmDbUtils *dcmDBUtils; - uid_t g_uid; - - /* scan all images */ - GList *scan_all_item_list; - unsigned int scan_all_curr_index; - - /* scan single images */ - GList *scan_single_item_list; - unsigned int scan_single_curr_index; - - void quitScanThread(); - int createQuitTimerScanThread(); - int getMmcState(void); - int prepareImageList(); - int prepareImageListByPath(const char *file_path); - int clearAllItemList(); - int clearSingleItemList(); - int initialize(); - int finalize(); - int sendCompletedMsg(const char *msg, const unsigned int count, DcmIpcPortType port); - int sendTerminatedMsg(); - int getScanStatus(DcmScanItem *scan_item, bool *media_scanned); - int runScanProcess(DcmScanItem *scan_item); - int ScanAllItems(); - int ScanSingleItem(const char *file_path); - int terminateScanOperations(); - int receiveMsg(dcmMsg *recv_msg); - -}; - -namespace DcmScanCallback { - gboolean quitTimerAtScanThread(gpointer data); - void freeScanItem(void *data); - gboolean readyScanThreadIdle(gpointer data); - gboolean runScanThreadIdle(gpointer data); - gboolean readMsg(GIOChannel *src, GIOCondition condition, gpointer data); -} +int _dcm_scan_create_timer(gpointer data); -void DcmScanSvc::quitScanThread() +void __dcm_scan_main_loop_quit(gpointer data) { - if (g_scan_thread_mainloop != NULL) { + dcm_scan_s *_data = (dcm_scan_s *)data; + if (_data->main_loop != NULL) { dcm_warn("Quit scan thread mainloop!"); - g_main_loop_quit(g_scan_thread_mainloop); + g_main_loop_quit(_data->main_loop); } else { dcm_warn("Scan thread mainloop is invalid!"); } @@ -97,26 +56,25 @@ void DcmScanSvc::quitScanThread() return; } -gboolean DcmScanCallback::quitTimerAtScanThread(gpointer data) +gboolean __dcm_scan_kill_scan_thread(gpointer data) { - DcmScanSvc *dcmScanSvc = (DcmScanSvc *) data; + dcm_scan_s *_data = (dcm_scan_s *)data; int ret; dcm_debug_fenter(); DCM_CHECK_FALSE(data); - ret = DcmIpcUtils::sendSocketMsg(DCM_MSG_SCAN_TERMINATED, 0, NULL, DCM_IPC_PORT_DCM_RECV); - if (ret != MS_MEDIA_ERR_NONE) { + ret = dcm_ipc_send_message(DCM_MSG_SCAN_TERMINATED, 0, NULL, DCM_IPC_PORT_DCM_RECV); + if (ret != MS_MEDIA_ERR_NONE) dcm_error("send to terminated messge to DCM Main"); - } - if (dcmScanSvc->scan_all_curr_index != 0 || dcmScanSvc->scan_single_curr_index != 0) { + if (_data->scan_all_curr_index != 0 || _data->scan_single_curr_index != 0) { dcm_warn("Scan thread is working! DO NOT quit main thread!"); - dcmScanSvc->createQuitTimerScanThread(); + _dcm_scan_create_timer(data); } else { dcm_warn("Quit dcm-svc main loop!"); - dcmScanSvc->quitScanThread(); + __dcm_scan_main_loop_quit(data); } dcm_debug_fleave(); @@ -124,65 +82,86 @@ gboolean DcmScanCallback::quitTimerAtScanThread(gpointer data) return FALSE; } -int DcmScanSvc::createQuitTimerScanThread() +int _dcm_scan_create_timer(gpointer data) { + dcm_scan_s *_data = (dcm_scan_s *)data; dcm_debug_fenter(); - if (scan_thread_quit_timer != NULL) { + if (_data->kill_timer_source != NULL) { dcm_debug("Delete old quit timer!"); - g_source_destroy(scan_thread_quit_timer); - scan_thread_quit_timer = NULL; + g_source_destroy(_data->kill_timer_source); + _data->kill_timer_source = NULL; } - scan_thread_quit_timer = g_timeout_source_new_seconds(DCM_SVC_SCAN_THREAD_TIMEOUT_SEC); - DCM_CHECK_VAL(scan_thread_quit_timer, MS_MEDIA_ERR_OUT_OF_MEMORY); + _data->kill_timer_source = g_timeout_source_new_seconds(DCM_SVC_SCAN_THREAD_TIMEOUT_SEC); + DCM_CHECK_VAL(_data->kill_timer_source, MS_MEDIA_ERR_OUT_OF_MEMORY); - g_source_set_callback(scan_thread_quit_timer, DcmScanCallback::quitTimerAtScanThread, (gpointer)this, NULL); - g_source_attach(scan_thread_quit_timer, scan_thread_main_context); + g_source_set_callback(_data->kill_timer_source, __dcm_scan_kill_scan_thread, (gpointer)data, NULL); + g_source_attach(_data->kill_timer_source, _data->main_context); dcm_debug_fleave(); return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::getMmcState(void) +void __destroy_scan_item(void *data) +{ + dcm_svc_item_s *scan_item = (dcm_svc_item_s *) data; + + dcm_debug_fenter(); + + DCM_CHECK(scan_item); + DCM_CHECK(scan_item->file_path); + DCM_CHECK(scan_item->media_uuid); + DCM_CHECK(scan_item->storage_uuid); + + dcm_sec_debug("Free scan item. path: [%s]", scan_item->file_path); + + DCM_SAFE_FREE(scan_item->file_path); + DCM_SAFE_FREE(scan_item->media_uuid); + DCM_SAFE_FREE(scan_item->storage_uuid); + DCM_SAFE_FREE(scan_item); + + dcm_debug_fleave(); + + return; +} + +int __dcm_scan_get_mmc_state(void) { int err = -1; int status = -1; err = vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &status); - if (err != 0) { + if (err != 0) dcm_error("vconf_get_int Unexpected error code: %d", err); - } return status; } -int DcmScanSvc::prepareImageList() +int __dcm_scan_get_item_list(dcm_scan_s *data) { int ret = MS_MEDIA_ERR_NONE; - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); - bool mmc_mounted = false; + gboolean mmc_mounted = false; - if (getMmcState() == VCONFKEY_SYSMAN_MMC_MOUNTED) { + if (__dcm_scan_get_mmc_state() == VCONFKEY_SYSMAN_MMC_MOUNTED) mmc_mounted = true; - } else { + else mmc_mounted = false; - } /* Get scan image list from db */ - ret = dcmDbUtils->_dcm_svc_db_get_scan_image_list_from_db(&(scan_all_item_list), mmc_mounted); + ret = dcm_svc_db_get_scan_image_list_from_db(&(data->scan_all_item_list), mmc_mounted); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to get image list from db! ret: %d", ret); return ret; } - if (scan_all_item_list == NULL) { + if (data->scan_all_item_list == NULL) { dcm_debug("No image list for scanning"); return MS_MEDIA_ERR_DB_NO_RECORD; } - if ((scan_all_item_list != NULL) && (g_list_length(scan_all_item_list) == 0)) { + if ((data->scan_all_item_list != NULL) && (g_list_length(data->scan_all_item_list) == 0)) { dcm_debug("No image list from db!"); return MS_MEDIA_ERR_DB_NO_RECORD; } @@ -190,31 +169,29 @@ int DcmScanSvc::prepareImageList() return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::prepareImageListByPath(const char *file_path) +int __dcm_scan_get_item_list_by_path(const char *file_path, dcm_scan_s *data) { int ret = MS_MEDIA_ERR_NONE; - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); - bool mmc_mounted = false; + gboolean mmc_mounted = false; - if (getMmcState() == VCONFKEY_SYSMAN_MMC_MOUNTED) { + if (__dcm_scan_get_mmc_state() == VCONFKEY_SYSMAN_MMC_MOUNTED) mmc_mounted = true; - } else { + else mmc_mounted = false; - } /* Get scan image list from db */ - ret = dcmDbUtils->_dcm_svc_db_get_scan_image_list_by_path(&(scan_single_item_list), mmc_mounted, file_path); + ret = dcm_svc_db_get_scan_image_list_by_path(&(data->scan_single_item_list), mmc_mounted, file_path); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to get image list from db! ret: %d", ret); return ret; } - if (scan_single_item_list == NULL) { + if (data->scan_single_item_list == NULL) { dcm_debug("No image list for scanning"); return MS_MEDIA_ERR_DB_NO_RECORD; } - if ((scan_single_item_list != NULL) && (g_list_length(scan_single_item_list) == 0)) { + if ((data->scan_single_item_list != NULL) && (g_list_length(data->scan_single_item_list) == 0)) { dcm_debug("No image list from db!"); return MS_MEDIA_ERR_DB_NO_RECORD; } @@ -222,69 +199,30 @@ int DcmScanSvc::prepareImageListByPath(const char *file_path) return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::clearAllItemList() -{ - dcm_debug_fenter(); - - if (scan_all_item_list != NULL) { - g_list_free_full(scan_all_item_list, DcmScanCallback::freeScanItem); - scan_all_item_list = NULL; - } - - scan_all_curr_index = 0; - - return MS_MEDIA_ERR_NONE; -} - -int DcmScanSvc::clearSingleItemList() +int __dcm_scan_get_scan_status(dcm_svc_item_s *scan_item, gboolean *media_scanned) { - dcm_debug_fenter(); - - if (scan_single_item_list) { - g_list_free_full(scan_single_item_list, DcmScanCallback::freeScanItem); - scan_single_item_list = NULL; - } - - scan_single_curr_index = 0; - - return MS_MEDIA_ERR_NONE; -} - -int DcmScanSvc::initialize() -{ - scan_all_item_list = NULL; - scan_all_curr_index = 0; - scan_single_item_list = NULL; - scan_single_curr_index = 0; - g_scan_cancel = FALSE; - scan_thread_quit_timer = NULL; - - DcmFaceUtils::initialize(); - dcmDBUtils = DcmDbUtils::getInstance(); - - return MS_MEDIA_ERR_NONE; -} + int ret = MS_MEDIA_ERR_NONE; -int DcmScanSvc::finalize() -{ - /* Only scan item lists are freed here, scan idles should be freed before this function */ - clearAllItemList(); - clearSingleItemList(); - DcmFaceUtils::finalize(); + DCM_CHECK_VAL(scan_item, MS_MEDIA_ERR_INVALID_PARAMETER); + DCM_CHECK_VAL(scan_item->media_uuid, MS_MEDIA_ERR_INVALID_PARAMETER); - return MS_MEDIA_ERR_NONE; + /* Check if this media is scanned or not */ + ret = dcm_svc_db_check_scanned_by_media_uuid(scan_item->media_uuid, media_scanned); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to check if this media item is scanned or not!"); + return ret; } -int DcmScanSvc::sendCompletedMsg(const char *msg, const unsigned int count, DcmIpcPortType port) +int __dcm_scan_send_result(dcm_scan_s *data, const char *msg, const unsigned int count, dcm_ipc_port_e port) { - if ((scan_all_item_list == NULL) && (scan_single_item_list == NULL)) { + if ((data->scan_all_item_list == NULL) && (data->scan_single_item_list == NULL)) { dcm_debug("Send completed message"); - DcmIpcUtils::sendCompleteMsg(DCM_MSG_SCAN_COMPLETED, count, msg, port); + dcm_ipc_send_complete(DCM_MSG_SCAN_COMPLETED, count, msg, port); } else { - if (scan_all_item_list) + if (data->scan_all_item_list) dcm_warn("scan_all_item_list"); - if (scan_single_item_list) + if (data->scan_single_item_list) dcm_warn("scan_single_item_list"); dcm_warn("Scan operation is not finished yet. Keep scanning..."); @@ -293,41 +231,49 @@ int DcmScanSvc::sendCompletedMsg(const char *msg, const unsigned int count, DcmI return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::sendTerminatedMsg() +int _dcm_scan_clear_all_items(gpointer data) { - dcm_debug("Terminated message is sent to DCM main..."); + dcm_scan_s *_data = (dcm_scan_s *)data; + + dcm_debug_fenter(); + + if (_data->scan_all_item_list != NULL) { + g_list_free_full(_data->scan_all_item_list, __destroy_scan_item); + _data->scan_all_item_list = NULL; + } + + _data->scan_all_curr_index = 0; return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::getScanStatus(DcmScanItem *scan_item, bool *media_scanned) +int _dcm_scan_clear_single_item(gpointer data) { - int ret = MS_MEDIA_ERR_NONE; - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); + dcm_scan_s *_data = (dcm_scan_s *)data; - DCM_CHECK_VAL(scan_item, MS_MEDIA_ERR_INVALID_PARAMETER); - DCM_CHECK_VAL(scan_item->media_uuid, MS_MEDIA_ERR_INVALID_PARAMETER); + dcm_debug_fenter(); - /* Check if this media is scanned or not */ - ret = dcmDbUtils->_dcm_svc_db_check_scanned_by_media_uuid(scan_item->media_uuid, media_scanned); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to check if this media item is scanned or not!"); + if (_data->scan_single_item_list) { + g_list_free_full(_data->scan_single_item_list, __destroy_scan_item); + _data->scan_single_item_list = NULL; } - return ret; + _data->scan_single_curr_index = 0; + + return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::runScanProcess(DcmScanItem *scan_item) +int _dcm_scan_process(dcm_svc_item_s *scan_item) { - bool media_scanned = false; + gboolean media_scanned = false; int ret = MS_MEDIA_ERR_NONE; dcm_debug_fenter(); DCM_CHECK_VAL(scan_item, MS_MEDIA_ERR_INVALID_PARAMETER); DCM_CHECK_VAL(scan_item->file_path, MS_MEDIA_ERR_INVALID_PARAMETER); - DcmImageInfo image_info = {0, }; - memset(&image_info, 0, sizeof(DcmImageInfo)); + dcm_image_info_s image_info = {0, }; + memset(&image_info, 0, sizeof(dcm_image_info_s)); dcm_image_format_e image_format = DCM_IMAGE_FORMAT_I420; /* Process scan operation if the file exists */ @@ -335,7 +281,7 @@ int DcmScanSvc::runScanProcess(DcmScanItem *scan_item) /* Get necessary information from db again. * Media information will be inserted after face is detected. * If media uuid does not exist, retry is needed */ - ret = getScanStatus(scan_item, &media_scanned); + ret = __dcm_scan_get_scan_status(scan_item, &media_scanned); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to get scan item info from db! err: %d", ret); return ret; @@ -390,22 +336,21 @@ int DcmScanSvc::runScanProcess(DcmScanItem *scan_item) return ret; } - image_info.decode_type = (DcmImageDecodeType)image_format; + image_info.decode_type = (dcm_image_type_e)image_format; dcm_debug("Image info width: %d, height: %d, buf_width: %d, buf_height: %d", image_info.original_width, image_info.original_height, image_info.buffer_width, image_info.buffer_height); /* Process face scan */ - ret = DcmFaceUtils::runFaceRecognizeProcess(scan_item, &image_info); + ret = face_detect_process(scan_item, &image_info); if (ret != MS_MEDIA_ERR_NONE) dcm_error("Failed to process face detection! err: %d", ret); #if 0 /* Process color extract */ - ret = DcmColorUtils::runColorExtractProcess(scan_item, &image_info); - if (ret != MS_MEDIA_ERR_NONE) { + ret = color_extract_process(scan_item, &image_info); + if (ret != MS_MEDIA_ERR_NONE) dcm_error("Failed to process color extraction! err: %d", ret); - } #endif /* Free image buffer */ @@ -419,218 +364,186 @@ int DcmScanSvc::runScanProcess(DcmScanItem *scan_item) return ret; } -int DcmScanSvc::ScanAllItems() +gboolean _dcm_scan_idle_process(gpointer data) { int ret = MS_MEDIA_ERR_NONE; + dcm_scan_s *_data = (dcm_scan_s *)data; + dcm_svc_item_s *scan_item = NULL; dcm_debug_fenter(); - clearAllItemList(); + DCM_CHECK_FALSE(_data); - ret = prepareImageList(); - if (ret == MS_MEDIA_ERR_DB_NO_RECORD) { - dcm_debug("No items to Scan. Scan operation completed!!!"); - clearAllItemList(); - /* Send scan complete message to main thread (if all scan operations are finished) */ - sendCompletedMsg( NULL, 0, DCM_IPC_PORT_DCM_RECV); - ret = dcmDBUtils->_dcm_svc_db_disconnect(); + ret = dcm_svc_db_connect(_data->g_uid); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to disconnect db! err: %d", ret); + /* DCM scan started */ + unsigned int list_len = g_list_length(_data->scan_all_item_list); + if ((_data->scan_all_curr_index < list_len) && !_data->g_scan_cancel) { + scan_item = (dcm_svc_item_s *)g_list_nth_data(_data->scan_all_item_list, _data->scan_all_curr_index); + dcm_sec_debug("current index: %d, path: %s state: %s", _data->scan_all_curr_index, scan_item->file_path, (_data->g_scan_cancel) ? "cancel" : "go"); + + ret = _dcm_scan_process(scan_item); if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to disconnect db! err: %d", ret); - } - return MS_MEDIA_ERR_NONE; - } + dcm_error("Failed to process scan job! err: %d", ret); - /* DCM scan started */ - g_idle_add(DcmScanCallback::runScanThreadIdle, (gpointer)this); + /* If the scan item is not scanned, insert media uuid into face_scan_list */ + if (ret != MS_MEDIA_ERROR_ALREADY_SCANNED) + dcm_svc_db_insert_face_to_face_scan_list(scan_item); + } + (_data->scan_all_curr_index)++; + } else { + dcm_warn("All images are scanned. Scan operation completed"); + _dcm_scan_clear_all_items(data); + ret = dcm_svc_db_disconnect(); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to disconnect db! err: %d", ret); + _dcm_scan_clear_all_items(data); + /* Send scan complete message to main thread (if all scan operations are finished) */ + __dcm_scan_send_result(data, NULL, 0, DCM_IPC_PORT_DCM_RECV); + dcm_debug_fleave(); + return FALSE; + } + ret = dcm_svc_db_disconnect(); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to disconnect db! err: %d", ret); dcm_debug_fleave(); - return MS_MEDIA_ERR_NONE; + return TRUE; } -int DcmScanSvc::ScanSingleItem(const char *file_path) +int _dcm_scan_all_items(gpointer data) { + dcm_scan_s *_data = (dcm_scan_s *)data; int ret = MS_MEDIA_ERR_NONE; - DcmScanItem *scan_item = NULL; - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); - int face_count = 0; - - DCM_CHECK_VAL(file_path, MS_MEDIA_ERR_INVALID_PARAMETER); dcm_debug_fenter(); - clearSingleItemList(); + _dcm_scan_clear_all_items(data); - ret = prepareImageListByPath(file_path); + ret = __dcm_scan_get_item_list(_data); if (ret == MS_MEDIA_ERR_DB_NO_RECORD) { dcm_debug("No items to Scan. Scan operation completed!!!"); - clearSingleItemList(); + _dcm_scan_clear_all_items(data); /* Send scan complete message to main thread (if all scan operations are finished) */ - sendCompletedMsg( file_path/*ret*/, 0, DCM_IPC_PORT_DCM_RECV); + __dcm_scan_send_result(data, NULL, 0, DCM_IPC_PORT_DCM_RECV); + ret = dcm_svc_db_disconnect(); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to disconnect db! err: %d", ret); return MS_MEDIA_ERR_NONE; } - dcm_debug("append scan item to scan item list"); - /* DCM scan started */ - unsigned int list_len = g_list_length(scan_single_item_list); - if (scan_single_curr_index < list_len) { - scan_item = (DcmScanItem *)g_list_nth_data(scan_single_item_list, scan_single_curr_index); - dcm_sec_debug("current index: %d, path: %s, scan type: %d", scan_single_curr_index, scan_item->file_path, scan_item->scan_item_type); - - ret = runScanProcess(scan_item); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to process scan job! err: %d", ret); - - /* If the scan item is not scanned, insert media uuid into face_scan_list */ - if (ret != MS_MEDIA_ERROR_ALREADY_SCANNED) { - dcmDbUtils->_dcm_svc_db_insert_face_to_face_scan_list(scan_item); - } - } - - (scan_single_curr_index)++; - } - - if (scan_item != NULL) - face_count = scan_item->face_count; - else - face_count = 0; - - sendCompletedMsg( file_path/*ret*/, face_count, DCM_IPC_PORT_DCM_RECV); - - clearSingleItemList(); + g_idle_add(_dcm_scan_idle_process, (gpointer)data); dcm_debug_fleave(); return MS_MEDIA_ERR_NONE; } -int DcmScanMain::ScanSingle(const char *file_path, uid_t uid, int *face_count) +int _dcm_scan_kill_scanner(gpointer data) { - int ret = MS_MEDIA_ERR_NONE; - DcmScanSvc dcmScanSvc; - DcmScanItem *scan_item = NULL; - unsigned int list_len = 0; + dcm_scan_s *_data = (dcm_scan_s *) data; + dcm_debug("Terminate scanning operations, and quit scan thread main loop"); - DCM_CHECK_VAL(file_path, MS_MEDIA_ERR_INVALID_PARAMETER); - DCM_CHECK_VAL(face_count, MS_MEDIA_ERR_INVALID_PARAMETER); + _data->g_scan_cancel = TRUE; - dcm_debug_fenter(); + return _dcm_scan_create_timer(data); +} - /* Init global variables */ - ret = dcmScanSvc.initialize(); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to initialize scan thread global variable! err: %d", ret); - goto DCM_SVC_SCAN_SINGLE_FAILED; - } - dcmScanSvc.clearSingleItemList(); +int _dcm_scan_receive_message(dcmMsg *recv_msg, gpointer data) +{ + dcm_scan_s *_data = (dcm_scan_s *) data; + int ret = MS_MEDIA_ERR_NONE; - ret = dcmScanSvc.dcmDBUtils->_dcm_svc_db_connect(uid); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to connect db! err: %d", ret); - } + _data->g_uid = recv_msg->uid; + DCM_CHECK_VAL(recv_msg, MS_MEDIA_ERR_INVALID_PARAMETER); - ret = dcmScanSvc.prepareImageListByPath(file_path); - if (ret == MS_MEDIA_ERR_DB_NO_RECORD) { - dcm_debug("No items to Scan. Scan operation completed!!!"); - dcmScanSvc.clearSingleItemList(); - goto DCM_SVC_SCAN_SINGLE_FAILED; - } + dcm_debug("msg_type: %d", recv_msg->msg_type); - dcm_debug("append scan item to scan item list"); + if (recv_msg->msg_type == DCM_MSG_REQUEST_KILL_SERVER) { + /* Destroy scan idles, and quit scan thread main loop */ + ret = _dcm_scan_kill_scanner(data); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to terminate DCM scan service! err: %d", ret); + return ret; + } else if (recv_msg->msg_type == DCM_MSG_REQUEST_ALL_MEDIA) { + /* Use timer to scan all unscanned images */ + ret = dcm_svc_db_connect(recv_msg->uid); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to disconnect db! err: %d", ret); + _dcm_scan_all_items(data); + ret = dcm_svc_db_disconnect(); + } else { + dcm_error("Invalid message type(%d)!", recv_msg->msg_type); + ret = MS_MEDIA_ERR_INVALID_IPC_MESSAGE; + } - /* DCM scan started */ - list_len = (unsigned int)g_list_length(dcmScanSvc.scan_single_item_list); - if (dcmScanSvc.scan_single_curr_index < list_len) { - scan_item = (DcmScanItem *)g_list_nth_data(dcmScanSvc.scan_single_item_list, dcmScanSvc.scan_single_curr_index); - dcm_sec_debug("current index: %d, path: %s, scan type: %d", dcmScanSvc.scan_single_curr_index, scan_item->file_path, scan_item->scan_item_type); + return ret; +} - ret = dcmScanSvc.runScanProcess(scan_item); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to process scan job! err: %d", ret); +int dcm_scan_init(gpointer data) +{ + dcm_scan_s *_data = (dcm_scan_s *)data; - /* If the scan item is not scanned, insert media uuid into face_scan_list */ - if (ret != MS_MEDIA_ERROR_ALREADY_SCANNED) { - dcmScanSvc.dcmDBUtils->_dcm_svc_db_insert_face_to_face_scan_list(scan_item); - } - } + _data->scan_all_item_list = NULL; + _data->scan_all_curr_index = 0; + _data->scan_single_item_list = NULL; + _data->scan_single_curr_index = 0; + _data->g_scan_cancel = FALSE; + _data->kill_timer_source = NULL; - (dcmScanSvc.scan_single_curr_index)++; - } + face_detect_initialize(); -DCM_SVC_SCAN_SINGLE_FAILED: - ret = dcmScanSvc.dcmDBUtils->_dcm_svc_db_disconnect(); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to disconnect db! err: %d", ret); - } + return MS_MEDIA_ERR_NONE; +} - if (scan_item != NULL) - *face_count = scan_item->face_count; - else - *face_count = 0; +int dcm_scan_finalize(gpointer data) +{ + /* Only scan item lists are freed here, scan idles should be freed before this function */ + dcm_scan_s *_data = (dcm_scan_s *)data; - dcm_debug("*face_count is %d", *face_count); - dcmScanSvc.clearSingleItemList(); + _dcm_scan_clear_all_items(data); + _dcm_scan_clear_single_item(data); + face_detect_finalize(); - ret = dcmScanSvc.finalize(); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to de-initialize scan thread global variable! err: %d", ret); - } - dcm_debug_fleave(); + if (_data != NULL) + free(_data); return MS_MEDIA_ERR_NONE; } -int DcmScanSvc::terminateScanOperations() +gboolean dcm_scan_reply_for_ready(gpointer data) { - dcm_debug("Terminate scanning operations, and quit scan thread main loop"); + dcm_service_s *_data = (dcm_service_s *) data; + dcmMsg *async_queue_msg = NULL; - g_scan_cancel = TRUE; + dcm_debug_fenter(); - return createQuitTimerScanThread(); -} + DCM_CHECK_FALSE(data); + DCM_CHECK_FALSE(_data->scan_thread_ready); -int DcmScanSvc::receiveMsg(dcmMsg *recv_msg) -{ - int ret = MS_MEDIA_ERR_NONE; + async_queue_msg = (dcmMsg*) g_malloc0(sizeof(dcmMsg)); + if (async_queue_msg == NULL) { + dcm_error("memory allocation failed"); + return FALSE; + } - dcmDBUtils = DcmDbUtils::getInstance(); - g_uid = recv_msg->uid; - DCM_CHECK_VAL(recv_msg, MS_MEDIA_ERR_INVALID_PARAMETER); + async_queue_msg->msg_type = DCM_MSG_SCAN_READY; - dcm_debug("msg_type: %d", recv_msg->msg_type); + dcm_debug("scan thread ready : %p", _data->scan_thread_ready); + dcm_debug("async_queue_msg : %d", async_queue_msg->msg_type); - if (recv_msg->msg_type == DCM_MSG_REQUEST_KILL_SERVER) - { - /* Destroy scan idles, and quit scan thread main loop */ - ret = terminateScanOperations(); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to terminate DCM scan service! err: %d", ret); - } + g_async_queue_push(_data->scan_thread_ready, (gpointer) async_queue_msg); - return ret; - } - else if (recv_msg->msg_type == DCM_MSG_REQUEST_ALL_MEDIA) - { - /* Use timer to scan all unscanned images */ - ret = dcmDBUtils->_dcm_svc_db_connect(recv_msg->uid); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to disconnect db! err: %d", ret); - } - ScanAllItems(); - ret = dcmDBUtils->_dcm_svc_db_disconnect(); - } - else { - dcm_error("Invalid message type(%d)!", recv_msg->msg_type); - ret = MS_MEDIA_ERR_INVALID_IPC_MESSAGE; - } + dcm_debug_fleave(); - return ret; + return FALSE; } -gboolean DcmScanCallback::readMsg(GIOChannel *src, GIOCondition condition, gpointer data) +gboolean dcm_scan_read_request(GIOChannel *src, GIOCondition condition, gpointer data) { - DcmScanSvc *dcmScanSvc = (DcmScanSvc *) data; int sock = -1; int client_sock = -1; dcmMsg recv_msg; @@ -646,157 +559,133 @@ gboolean DcmScanCallback::readMsg(GIOChannel *src, GIOCondition condition, gpoin } /* Accept tcp client socket */ - err = DcmIpcUtils::acceptSocket(sock, &client_sock); + err = dcm_ipc_accept_socket(sock, &client_sock); if (err != MS_MEDIA_ERR_NONE) { dcm_error("Failed to accept tcp socket! err: %d", err); return TRUE; } /* Receive message from tcp socket */ - err = DcmIpcUtils::receiveSocketMsg(client_sock, &recv_msg); + err = dcm_ipc_receive_message(client_sock, &recv_msg); if (err != MS_MEDIA_ERR_NONE) { dcm_error("Failed to receive tcp msg! err: %d", err); goto DCM_SVC_SCAN_READ_THREAD_RECV_SOCKET_FAILED; } /* Process received message */ - err = dcmScanSvc->receiveMsg(&recv_msg); + err = _dcm_scan_receive_message(&recv_msg, data); if (err != MS_MEDIA_ERR_NONE) { dcm_error("Error ocurred when process received message: %d", err); goto DCM_SVC_SCAN_READ_THREAD_RECV_SOCKET_FAILED; } DCM_SVC_SCAN_READ_THREAD_RECV_SOCKET_FAILED: - - if (close(client_sock) < 0) { + if (close(client_sock) < 0) dcm_stderror("close failed"); - } return TRUE; } -gboolean DcmScanCallback::readyScanThreadIdle(gpointer data) +int dcm_scan_single(const char *file_path, uid_t uid, int *face_count) { - DcmMainSvc *ad = (DcmMainSvc *) data; - dcmMsg *async_queue_msg = NULL; + int ret = MS_MEDIA_ERR_NONE; + dcm_svc_item_s *scan_item = NULL; + unsigned int list_len = 0; + dcm_scan_s *dcm_scan_data = NULL; - dcm_debug_fenter(); + DCM_CHECK_VAL(file_path, MS_MEDIA_ERR_INVALID_PARAMETER); + DCM_CHECK_VAL(face_count, MS_MEDIA_ERR_INVALID_PARAMETER); - DCM_CHECK_FALSE(data); - DCM_CHECK_FALSE(ad->scan_thread_ready); + dcm_debug_fenter(); - async_queue_msg = (dcmMsg*) g_malloc0(sizeof(dcmMsg)); - if (async_queue_msg == NULL) { - dcm_error("memory allocation failed"); - return FALSE; + /* Init global variables */ + dcm_scan_data = (dcm_scan_s *)calloc(1, sizeof(dcm_scan_s)); + if (dcm_scan_data == NULL) { + dcm_error("Failed to create DCM scan data!"); + return -1; } - async_queue_msg->msg_type = DCM_MSG_SCAN_READY; - - dcm_debug("scan thread ready : %p", ad->scan_thread_ready); - dcm_debug("async_queue_msg : %d", async_queue_msg->msg_type); - - g_async_queue_push(ad->scan_thread_ready, (gpointer) async_queue_msg); - - dcm_debug_fleave(); + ret = dcm_scan_init(dcm_scan_data); + if (ret != MS_MEDIA_ERR_NONE) { + dcm_error("Failed to initialize scan thread global variable! err: %d", ret); + goto DCM_SVC_SCAN_SINGLE_FAILED; + } - return FALSE; -} + _dcm_scan_clear_single_item(dcm_scan_data); -gboolean DcmScanCallback::runScanThreadIdle(gpointer data) -{ - int ret = MS_MEDIA_ERR_NONE; - DcmScanSvc *scanSvc = (DcmScanSvc *)data; - DcmScanItem *scan_item = NULL; - DcmDbUtils *dcmDbUtils = DcmDbUtils::getInstance(); + ret = dcm_svc_db_connect(uid); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to connect db! err: %d", ret); - dcm_debug_fenter(); + ret = __dcm_scan_get_item_list_by_path(file_path, dcm_scan_data); + if (ret == MS_MEDIA_ERR_DB_NO_RECORD) { + dcm_debug("No items to Scan. Scan operation completed!!!"); + _dcm_scan_clear_single_item(dcm_scan_data); + goto DCM_SVC_SCAN_SINGLE_FAILED; + } - DCM_CHECK_FALSE(scanSvc); - DCM_CHECK_FALSE(dcmDbUtils); + dcm_debug("append scan item to scan item list"); - ret = scanSvc->dcmDBUtils->_dcm_svc_db_connect(scanSvc->g_uid); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to disconnect db! err: %d", ret); - } /* DCM scan started */ - unsigned int list_len = g_list_length(scanSvc->scan_all_item_list); - if ((scanSvc->scan_all_curr_index < list_len) && !scanSvc->g_scan_cancel) { - scan_item = (DcmScanItem *)g_list_nth_data(scanSvc->scan_all_item_list, scanSvc->scan_all_curr_index); - dcm_sec_debug("current index: %d, path: %s state: %s", scanSvc->scan_all_curr_index, scan_item->file_path, (scanSvc->g_scan_cancel)?"cancel":"go"); + list_len = (unsigned int)g_list_length(dcm_scan_data->scan_single_item_list); + if (dcm_scan_data->scan_single_curr_index < list_len) { + scan_item = (dcm_svc_item_s *)g_list_nth_data(dcm_scan_data->scan_single_item_list, dcm_scan_data->scan_single_curr_index); + dcm_sec_debug("current index: %d, path: %s, scan type: %d", dcm_scan_data->scan_single_curr_index, scan_item->file_path, scan_item->scan_item_type); - ret = scanSvc->runScanProcess(scan_item); + ret = _dcm_scan_process(scan_item); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to process scan job! err: %d", ret); /* If the scan item is not scanned, insert media uuid into face_scan_list */ - if (ret != MS_MEDIA_ERROR_ALREADY_SCANNED) { - dcmDbUtils->_dcm_svc_db_insert_face_to_face_scan_list(scan_item); - } + if (ret != MS_MEDIA_ERROR_ALREADY_SCANNED) + dcm_svc_db_insert_face_to_face_scan_list(scan_item); } - (scanSvc->scan_all_curr_index)++; - } else { - dcm_warn("All images are scanned. Scan operation completed"); - scanSvc->clearAllItemList(); - ret = scanSvc->dcmDBUtils->_dcm_svc_db_disconnect(); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to disconnect db! err: %d", ret); - } - scanSvc->clearAllItemList(); - /* Send scan complete message to main thread (if all scan operations are finished) */ - scanSvc->sendCompletedMsg( NULL, 0, DCM_IPC_PORT_DCM_RECV); - dcm_debug_fleave(); - return FALSE; - } - ret = scanSvc->dcmDBUtils->_dcm_svc_db_disconnect(); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to disconnect db! err: %d", ret); + (dcm_scan_data->scan_single_curr_index)++; } - dcm_debug_fleave(); - - return TRUE; -} - -void DcmScanCallback::freeScanItem(void *data) -{ - DcmScanItem *scan_item = (DcmScanItem *) data; - - dcm_debug_fenter(); +DCM_SVC_SCAN_SINGLE_FAILED: + ret = dcm_svc_db_disconnect(); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to disconnect db! err: %d", ret); - DCM_CHECK(scan_item); - DCM_CHECK(scan_item->file_path); - DCM_CHECK(scan_item->media_uuid); - DCM_CHECK(scan_item->storage_uuid); + if (scan_item != NULL) + *face_count = scan_item->face_count; + else + *face_count = 0; - dcm_sec_debug("Free scan item. path: [%s]", scan_item->file_path); + dcm_debug("*face_count is %d", *face_count); + _dcm_scan_clear_single_item(dcm_scan_data); - DCM_SAFE_FREE(scan_item->file_path); - DCM_SAFE_FREE(scan_item->media_uuid); - DCM_SAFE_FREE(scan_item->storage_uuid); - DCM_SAFE_FREE(scan_item); + ret = dcm_scan_finalize(dcm_scan_data); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to de-initialize scan thread global variable! err: %d", ret); dcm_debug_fleave(); - return; + return MS_MEDIA_ERR_NONE; } -gboolean DcmScanMain::runScanThread(void *data) +gboolean dcm_scan_thread(void *data) { - DcmMainSvc *dcmManSvc = (DcmMainSvc*) data; - DcmScanSvc dcmScanSvc; int socket_fd = -1; GSource *source = NULL; GIOChannel *channel = NULL; GMainContext *context = NULL; GSource *scan_thread_ready_idle = NULL; + dcm_scan_s *dcm_scan_data = NULL; int err = 0; - DCM_CHECK_VAL(data, MS_MEDIA_ERR_INVALID_PARAMETER); + DCM_CHECK_FALSE(data); + + dcm_scan_data = (dcm_scan_s *)calloc(1, sizeof(dcm_scan_s)); + if (dcm_scan_data == NULL) { + dcm_error("Failed to create DCM scan data!"); + return -1; + } /* Create TCP Socket to receive message from main thread */ - err = DcmIpcUtils::createSocket(&socket_fd, DCM_IPC_PORT_SCAN_RECV); + err = dcm_ipc_create_socket(&socket_fd, DCM_IPC_PORT_SCAN_RECV); if (err != MS_MEDIA_ERR_NONE) { dcm_error("Failed to create socket! err: %d", err); goto DCM_SVC_SCAN_CREATE_SCAN_THREAD_FAILED; @@ -804,7 +693,7 @@ gboolean DcmScanMain::runScanThread(void *data) dcm_sec_warn("scan thread recv socket: %d", socket_fd); /* Init global variables */ - err = dcmScanSvc.initialize(); + err = dcm_scan_init(dcm_scan_data); if (err != MS_MEDIA_ERR_NONE) { dcm_error("Failed to initialize scan thread global variable! err: %d", err); goto DCM_SVC_SCAN_CREATE_SCAN_THREAD_FAILED; @@ -812,22 +701,22 @@ gboolean DcmScanMain::runScanThread(void *data) /* Create a new main context for scan thread */ context = g_main_context_new(); - dcmScanSvc.scan_thread_main_context = context; + dcm_scan_data->main_context = context; /* Create a new main event loop */ - dcmScanSvc.g_scan_thread_mainloop = g_main_loop_new(context, FALSE); + dcm_scan_data->main_loop = g_main_loop_new(context, FALSE); /* Create a new channel to watch TCP socket */ channel = g_io_channel_unix_new(socket_fd); source = g_io_create_watch(channel, G_IO_IN); /* Attach channel to main context in scan thread */ - g_source_set_callback(source, (GSourceFunc) DcmScanCallback::readMsg, (gpointer) &dcmScanSvc, NULL); + g_source_set_callback(source, (GSourceFunc) dcm_scan_read_request, (gpointer) dcm_scan_data, NULL); g_source_attach(source, context); /* Create a idle after scan thread is ready */ scan_thread_ready_idle = g_idle_source_new(); - g_source_set_callback(scan_thread_ready_idle, DcmScanCallback::readyScanThreadIdle, (gpointer) dcmManSvc, NULL); + g_source_set_callback(scan_thread_ready_idle, dcm_scan_reply_for_ready, (gpointer) data, NULL); g_source_attach(scan_thread_ready_idle, context); /* Push main context to scan thread */ @@ -838,7 +727,7 @@ gboolean DcmScanMain::runScanThread(void *data) dcm_debug("********************************************"); /* Start to run main event loop for scan thread */ - g_main_loop_run(dcmScanSvc.g_scan_thread_mainloop); + g_main_loop_run(dcm_scan_data->main_loop); dcm_debug("*** DCM Service scan thread will be closed ***"); @@ -850,15 +739,14 @@ gboolean DcmScanMain::runScanThread(void *data) close(socket_fd); /* Descrease the reference count of main loop of scan thread */ - g_main_loop_unref(dcmScanSvc.g_scan_thread_mainloop); - dcmScanSvc.g_scan_thread_mainloop = NULL; + g_main_loop_unref(dcm_scan_data->main_loop); + dcm_scan_data->main_loop = NULL; DCM_SVC_SCAN_CREATE_SCAN_THREAD_FAILED: - err = dcmScanSvc.finalize(); - if (err != MS_MEDIA_ERR_NONE) { + err = dcm_scan_finalize(dcm_scan_data); + if (err != MS_MEDIA_ERR_NONE) dcm_error("Failed to de-initialize scan thread global variable! err: %d", err); - } return FALSE; } diff --git a/src/DcmIpcUtils.cpp b/src/dcm_svc_ipc.c similarity index 92% rename from src/DcmIpcUtils.cpp rename to src/dcm_svc_ipc.c index a81e764..8bfd26f 100755 --- a/src/DcmIpcUtils.cpp +++ b/src/dcm_svc_ipc.c @@ -15,8 +15,6 @@ * */ - - #include #include #include @@ -29,9 +27,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include static char DCM_IPC_PATH[][100] = { @@ -40,7 +38,7 @@ static char DCM_IPC_PATH[][100] = { {"/var/run/media-server/media_ipc_dcmcomm.socket"}, }; -int DcmIpcUtils::receiveSocketMsg(int client_sock, dcmMsg *recv_msg) +int dcm_ipc_receive_message(int client_sock, dcmMsg *recv_msg) { int recv_msg_size = 0; @@ -53,7 +51,7 @@ int DcmIpcUtils::receiveSocketMsg(int client_sock, dcmMsg *recv_msg) return MS_MEDIA_ERR_SOCKET_RECEIVE; } } - dcm_sec_debug("[receive msg] type: %d, pid: %d, uid: %d, msg: %s, msg_size: %d", recv_msg->msg_type, recv_msg->pid, recv_msg->uid, (recv_msg->msg)?recv_msg->msg:"NULL", recv_msg->msg_size); + dcm_sec_debug("[receive msg] type: %d, pid: %d, uid: %d, msg: %s, msg_size: %d", recv_msg->msg_type, recv_msg->pid, recv_msg->uid, (recv_msg->msg) ? recv_msg->msg : "NULL", recv_msg->msg_size); if (!(recv_msg->msg_type >= 0 && recv_msg->msg_type < DCM_MSG_MAX)) { dcm_error("IPC message is wrong!"); @@ -63,7 +61,7 @@ int DcmIpcUtils::receiveSocketMsg(int client_sock, dcmMsg *recv_msg) return MS_MEDIA_ERR_NONE; } -int DcmIpcUtils::acceptSocket(int serv_sock, int* client_sock) +int dcm_ipc_accept_socket(int serv_sock, int* client_sock) { DCM_CHECK_VAL(client_sock, MS_MEDIA_ERR_INVALID_PARAMETER); int sockfd = -1; @@ -81,12 +79,12 @@ int DcmIpcUtils::acceptSocket(int serv_sock, int* client_sock) return MS_MEDIA_ERR_NONE; } -int DcmIpcUtils::createSocket(int *socket_fd, DcmIpcPortType port) +int dcm_ipc_create_socket(int *socket_fd, dcm_ipc_port_e port) { DCM_CHECK_VAL(socket_fd, MS_MEDIA_ERR_INVALID_PARAMETER); int sock = -1; struct sockaddr_un serv_addr; - bool bind_success = false; + gboolean bind_success = false; int i = 0; /* Create a new TCP socket */ @@ -135,7 +133,7 @@ int DcmIpcUtils::createSocket(int *socket_fd, DcmIpcPortType port) return MS_MEDIA_ERR_NONE; } -int DcmIpcUtils::sendClientSocketMsg(int socket_fd, ms_dcm_msg_type_e msg_type, unsigned int result, const char *msg, DcmIpcPortType port) +int dcm_ipc_send_client_message(int socket_fd, ms_dcm_msg_type_e msg_type, unsigned int result, const char *msg, dcm_ipc_port_e port) { if (port < 0 || port >= DCM_IPC_PORT_MAX) { dcm_error("Invalid port! Stop sending message..."); @@ -205,7 +203,7 @@ int DcmIpcUtils::sendClientSocketMsg(int socket_fd, ms_dcm_msg_type_e msg_type, return MS_MEDIA_ERR_NONE; } -int DcmIpcUtils::sendSocketMsg(ms_dcm_msg_type_e msg_type, uid_t uid, const char *msg, DcmIpcPortType port) +int dcm_ipc_send_message(ms_dcm_msg_type_e msg_type, uid_t uid, const char *msg, dcm_ipc_port_e port) { if (port < 0 || port >= DCM_IPC_PORT_MAX) { dcm_error("Invalid port! Stop sending message..."); @@ -267,7 +265,7 @@ int DcmIpcUtils::sendSocketMsg(ms_dcm_msg_type_e msg_type, uid_t uid, const char return MS_MEDIA_ERR_NONE; } -int DcmIpcUtils::sendCompleteMsg(ms_dcm_msg_type_e msg_type, const unsigned int count, const char *msg, DcmIpcPortType port) +int dcm_ipc_send_complete(ms_dcm_msg_type_e msg_type, const unsigned int count, const char *msg, dcm_ipc_port_e port) { if (port < 0 || port >= DCM_IPC_PORT_MAX) { dcm_error("Invalid port! Stop sending message..."); @@ -330,7 +328,7 @@ int DcmIpcUtils::sendCompleteMsg(ms_dcm_msg_type_e msg_type, const unsigned int } -int DcmIpcUtils::closeSocket(int socket_fd) +int dcm_ipc_close_socket(int socket_fd) { close(socket_fd); diff --git a/svc/DcmMainSvc.cpp b/svc/dcm_svc_main.c similarity index 50% rename from svc/DcmMainSvc.cpp rename to svc/dcm_svc_main.c index 256472d..b6e15f0 100755 --- a/svc/DcmMainSvc.cpp +++ b/svc/dcm_svc_main.c @@ -22,65 +22,84 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #define DCM_SVC_MAIN_THREAD_TIMEOUT_SEC 1 -namespace DcmMainSvcCallBack { -gboolean readMsg(GIOChannel *src, GIOCondition condition, gpointer data); -gboolean quitTimerAtMainLoop(gpointer data); -} +int _dcm_svc_create_timer(gpointer data); +void __dcm_svc_main_loop_quit(gpointer data) +{ + dcm_service_s *_data = (dcm_service_s *) data; -DcmMainSvc *DcmMainSvc::dcmMainSvc = NULL; -GMainLoop *g_dcm_svc_mainloop; -static GMutex gMutexLock; + if (_data->main_loop != NULL) { + dcm_debug("Quit DCM thread main loop!"); + g_main_loop_quit(_data->main_loop); + } else { + dcm_error("Invalid DCM thread main loop!"); + } +} -DcmMainSvc* DcmMainSvc::getInstance(void) +gboolean __dcm_svc_kill_service(gpointer data) { - if (dcmMainSvc == NULL) { - g_mutex_trylock(&gMutexLock); + dcm_service_s *_data = (dcm_service_s *) data; - if (dcmMainSvc == NULL) { - dcmMainSvc = new DcmMainSvc(); - } + dcm_debug_fenter(); + + DCM_CHECK_FALSE(data); - g_mutex_unlock(&gMutexLock); + if (_data->scan_thread_working == true) { + dcm_warn("Scan thread is working! DO NOT quit main thread!"); + return TRUE; + } else { + dcm_warn("Quit dcm-svc main loop!"); + __dcm_svc_main_loop_quit(data); } - return dcmMainSvc; + dcm_debug_fleave(); + + return FALSE; } -void DcmMainSvc::dcmServiceStartjobs(void) +int _dcm_svc_create_timer(gpointer data) { - if (createScanThread() != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to create scan thread! Exit main thread..."); - } + dcm_service_s *_data = (dcm_service_s *) data; + GSource *quit_timer = NULL; - /* Send ready response to dcm launcher */ - if (DcmIpcUtils::sendSocketMsg(DCM_MSG_SERVER_READY, 0, NULL, DCM_IPC_PORT_MS_RECV) != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to send ready message"); + dcm_debug_fenter(); + + if (_data->kill_timer_source != NULL) { + dcm_debug("Delete old quit timer!"); + g_source_destroy(_data->kill_timer_source); + _data->kill_timer_source = NULL; } -} -void DcmMainSvc::dcmServiceFinishjobs(void) -{ - /* TODO: free resources for dcm-service */ + quit_timer = g_timeout_source_new_seconds(DCM_SVC_MAIN_THREAD_TIMEOUT_SEC); + DCM_CHECK_VAL(quit_timer, MS_MEDIA_ERR_OUT_OF_MEMORY); + + g_source_set_callback(quit_timer, __dcm_svc_kill_service, (gpointer) data, NULL); + g_source_attach(quit_timer, _data->main_context); + _data->kill_timer_source = quit_timer; + + dcm_debug_fleave(); + + return MS_MEDIA_ERR_NONE; } -int DcmMainSvc::waitScanThreadReady() +int _dcm_svc_wait_scan_thread(gpointer data) { + dcm_service_s *_data = (dcm_service_s *)data; int ret = MS_MEDIA_ERR_NONE; dcmMsg *async_queue_msg = NULL; /* Wait until the scan thread is ready (timeout: 5 sec) */ - async_queue_msg = (dcmMsg *)g_async_queue_timeout_pop(scan_thread_ready, 5000000); + async_queue_msg = (dcmMsg *)g_async_queue_timeout_pop(_data->scan_thread_ready, 5000000); if (async_queue_msg == NULL) { dcm_error("Async queue timeout!"); return MS_MEDIA_ERR_INTERNAL; @@ -89,8 +108,8 @@ int DcmMainSvc::waitScanThreadReady() /* Check if scan thread is created */ if (async_queue_msg->msg_type == DCM_MSG_SCAN_READY) { dcm_warn("DCM scan thread is ready!"); - g_async_queue_unref(scan_thread_ready); - scan_thread_ready = NULL; + g_async_queue_unref(_data->scan_thread_ready); + _data->scan_thread_ready = NULL; } else { dcm_error("Invalid async queue message!"); ret = MS_MEDIA_ERR_INTERNAL; @@ -102,27 +121,28 @@ int DcmMainSvc::waitScanThreadReady() return ret; } -int DcmMainSvc::createScanThread() +static int _dcm_svc_create_scan_thread(gpointer data) { + dcm_service_s *_data = (dcm_service_s *)data; int ret = MS_MEDIA_ERR_NONE; dcm_debug_fenter(); /* Create a new async queue to wait util scan thread is created */ - scan_thread_ready = g_async_queue_new(); - if (scan_thread_ready == NULL) { + _data->scan_thread_ready = g_async_queue_new(); + if (_data->scan_thread_ready == NULL) { dcm_error("Failed to create async queue!"); return MS_MEDIA_ERR_INTERNAL; } /* Create the scan thread */ - scan_thread = g_thread_new("dcm_scan_thread", (GThreadFunc) DcmScanMain::runScanThread, (gpointer) this); - if (scan_thread == NULL) { + _data->scan_thread = g_thread_new("dcm_scan_thread", (GThreadFunc) dcm_scan_thread, (gpointer) data); + if (_data->scan_thread == NULL) { dcm_error("Failed to create scan thread!"); return MS_MEDIA_ERR_INTERNAL; } - ret = waitScanThreadReady(); + ret = _dcm_svc_wait_scan_thread(data); /* Wait until scan thread is ready */ if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to wait for scan thread to be ready! err: %d", ret); @@ -134,15 +154,31 @@ int DcmMainSvc::createScanThread() return MS_MEDIA_ERR_NONE; } -gboolean DcmMainSvcCallBack::readMsg(GIOChannel *src, GIOCondition condition, gpointer data) +static void dcm_service_start(gpointer data) +{ + if (_dcm_svc_create_scan_thread(data) != MS_MEDIA_ERR_NONE) + dcm_error("Failed to create scan thread! Exit main thread..."); + + /* Send ready response to dcm launcher */ + if (dcm_ipc_send_message(DCM_MSG_SERVER_READY, 0, NULL, DCM_IPC_PORT_MS_RECV) != MS_MEDIA_ERR_NONE) + dcm_error("Failed to send ready message"); +} + +static void dcm_service_finish(gpointer data) +{ + dcm_service_s *_data = (dcm_service_s *)data; + if (_data != NULL) + free(_data); +} + +gboolean dcm_service_recieve_request(GIOChannel *src, GIOCondition condition, gpointer data) { dcmMsg recv_msg; int sock = -1; int client_sock = -1; int ret = 0; int face_count; - - DcmMainSvc *dcmSvc = DcmMainSvc::getInstance(); + dcm_service_s *_data = (dcm_service_s *)data; memset((void *)&recv_msg, 0, sizeof(recv_msg)); @@ -153,173 +189,108 @@ gboolean DcmMainSvcCallBack::readMsg(GIOChannel *src, GIOCondition condition, gp } /* Accept tcp client socket */ - ret = DcmIpcUtils::acceptSocket(sock, &client_sock); + ret = dcm_ipc_accept_socket(sock, &client_sock); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to accept tcp socket! err: %d", ret); return TRUE; } - if (DcmIpcUtils::receiveSocketMsg(client_sock, &recv_msg) < 0) { + if (dcm_ipc_receive_message(client_sock, &recv_msg) != MS_MEDIA_ERR_NONE) { dcm_error("getRecvMsg failed"); - DcmIpcUtils::closeSocket(client_sock); + dcm_ipc_close_socket(client_sock); return TRUE; } dcm_debug("Received msg_type : [%d]", recv_msg.msg_type); - if (dcmSvc->scan_thread == NULL) { - dcm_debug("scan thread is not started yet!"); - /* Create scan thread before main loop is started */ - if (dcmSvc->createScanThread() != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to create scan thread! Exit main thread..."); - DcmIpcUtils::closeSocket(client_sock); - return TRUE; - } - - dcmSvc->scan_thread_working = true; - } else { - dcm_debug("scan thread is already running!"); - } - if (recv_msg.msg_type == DCM_MSG_SCAN_TERMINATED) { dcm_debug("Scan terminated!"); - dcmSvc->scan_thread_working = false; - dcmSvc->createQuitTimerMainLoop(); + _data->scan_thread_working = false; + _dcm_svc_create_timer(data); } else if (recv_msg.msg_type == DCM_MSG_SCAN_COMPLETED) { dcm_debug("Scan completed!"); - ret = DcmIpcUtils::sendClientSocketMsg(-1, DCM_MSG_EXTRACT_ALL_DONE, recv_msg.result, recv_msg.msg, DCM_IPC_PORT_MS_RECV); + ret = dcm_ipc_send_client_message(-1, DCM_MSG_EXTRACT_ALL_DONE, recv_msg.result, recv_msg.msg, DCM_IPC_PORT_MS_RECV); } else if (recv_msg.msg_type == DCM_MSG_REQUEST_KILL_SERVER) { dcm_warn("Quit dcm-svc main loop!"); - ret = DcmIpcUtils::sendSocketMsg(DCM_MSG_REQUEST_KILL_SERVER, recv_msg.uid, recv_msg.msg, DCM_IPC_PORT_SCAN_RECV); + ret = dcm_ipc_send_message(DCM_MSG_REQUEST_KILL_SERVER, recv_msg.uid, recv_msg.msg, DCM_IPC_PORT_SCAN_RECV); } else if (recv_msg.msg_type == DCM_MSG_REQUEST_ALL_MEDIA) { - ret = DcmIpcUtils::sendSocketMsg(DCM_MSG_REQUEST_ALL_MEDIA, recv_msg.uid, NULL, DCM_IPC_PORT_SCAN_RECV); - if (ret == MS_MEDIA_ERR_NONE) { - ret = DcmIpcUtils::sendClientSocketMsg(client_sock, DCM_MSG_REQUEST_ALL_MEDIA, recv_msg.uid, NULL, DCM_IPC_PORT_DCM_RECV); - } + ret = dcm_ipc_send_message(DCM_MSG_REQUEST_ALL_MEDIA, recv_msg.uid, NULL, DCM_IPC_PORT_SCAN_RECV); + if (ret == MS_MEDIA_ERR_NONE) + ret = dcm_ipc_send_client_message(client_sock, DCM_MSG_REQUEST_ALL_MEDIA, recv_msg.uid, NULL, DCM_IPC_PORT_DCM_RECV); } else if (recv_msg.msg_type == DCM_MSG_REQUEST_MEDIA) { dcm_debug("Scan single"); - ret = DcmScanMain::ScanSingle(recv_msg.msg, recv_msg.uid, &face_count); + ret = dcm_scan_single(recv_msg.msg, recv_msg.uid, &face_count); dcm_debug("Scan single result: ret : [%d] face_count : [%d])", ret, face_count); if (ret == MS_MEDIA_ERR_NONE) { - ret = DcmIpcUtils::sendClientSocketMsg(client_sock, DCM_MSG_REQUEST_MEDIA, face_count, recv_msg.msg, DCM_IPC_PORT_MS_RECV); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to sendClientSocketMsg! err: %d", ret); - } + ret = dcm_ipc_send_client_message(client_sock, DCM_MSG_REQUEST_MEDIA, face_count, recv_msg.msg, DCM_IPC_PORT_MS_RECV); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to dcm_ipc_send_client_message! err: %d", ret); } else { - ret = DcmIpcUtils::sendClientSocketMsg(client_sock, DCM_MSG_REQUEST_MEDIA, ret, recv_msg.msg, DCM_IPC_PORT_MS_RECV); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("Failed to sendClientSocketMsg! err: %d", ret); - } + ret = dcm_ipc_send_client_message(client_sock, DCM_MSG_REQUEST_MEDIA, ret, recv_msg.msg, DCM_IPC_PORT_MS_RECV); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("Failed to dcm_ipc_send_client_message! err: %d", ret); } + _dcm_svc_create_timer(data); } else { dcm_debug("createDcmSvcReadSocket, invalid message(%d).", recv_msg.msg_type); } - if (DcmIpcUtils::closeSocket(client_sock) < 0) { + if (dcm_ipc_close_socket(client_sock) < 0) dcm_stderror("close failed"); - } return TRUE; } -gboolean DcmMainSvcCallBack::quitTimerAtMainLoop(gpointer data) -{ - DcmMainSvc *dcmSvcApp = (DcmMainSvc *) data; - - dcm_debug_fenter(); - - DCM_CHECK_FALSE(data); - - if (dcmSvcApp->scan_thread_working == true) { - dcm_warn("Scan thread is working! DO NOT quit main thread!"); - return TRUE; - } else { - dcm_warn("Quit dcm-svc main loop!"); - dcmSvcApp->quitDcmSvcMainLoop(); - } - - dcm_debug_fleave(); - - return FALSE; -} - -int DcmMainSvc::createQuitTimerMainLoop() -{ - GSource *quit_timer = NULL; - - dcm_debug_fenter(); - - if (main_thread_quit_timer != NULL) { - dcm_debug("Delete old quit timer!"); - g_source_destroy(main_thread_quit_timer); - main_thread_quit_timer = NULL; - } - - quit_timer = g_timeout_source_new_seconds(DCM_SVC_MAIN_THREAD_TIMEOUT_SEC); - DCM_CHECK_VAL(quit_timer, MS_MEDIA_ERR_OUT_OF_MEMORY); - - g_source_set_callback(quit_timer, DcmMainSvcCallBack::quitTimerAtMainLoop, (gpointer) this, NULL); - g_source_attach(quit_timer, main_loop_context); - main_thread_quit_timer = quit_timer; - - dcm_debug_fleave(); - - return MS_MEDIA_ERR_NONE; -} - -void DcmMainSvc::quitDcmSvcMainLoop() -{ - if (g_dcm_svc_mainloop != NULL) { - dcm_debug("Quit DCM thread main loop!"); - g_main_loop_quit(g_dcm_svc_mainloop); - } else { - dcm_error("Invalid DCM thread main loop!"); - } -} - EXPORT_API int main(int argc, char *argv[]) { - DcmMainSvc *dcmSvc = DcmMainSvc::getInstance(); int sockfd = -1; - GSource *source = NULL; GIOChannel *channel = NULL; GMainContext *context = NULL; + /* threads related */ + dcm_service_s *dcm_svc_data = NULL; + + dcm_svc_data = (dcm_service_s *)calloc(1, sizeof(dcm_service_s)); + if (dcm_svc_data == NULL) { + dcm_error("Failed to create DCM Service data!"); + return -1; + } - /* Create and bind new socket to mainloop */ - if (DcmIpcUtils::createSocket(&sockfd, DCM_IPC_PORT_DCM_RECV) != MS_MEDIA_ERR_NONE) { + /* Create and bind new socket to main_loop */ + if (dcm_ipc_create_socket(&sockfd, DCM_IPC_PORT_DCM_RECV) != MS_MEDIA_ERR_NONE) { dcm_error("Failed to create socket"); + dcm_service_finish(dcm_svc_data); return -1; } - g_dcm_svc_mainloop = g_main_loop_new(context, FALSE); - context = g_main_loop_get_context(g_dcm_svc_mainloop); + dcm_svc_data->main_loop = g_main_loop_new(context, FALSE); + context = g_main_loop_get_context(dcm_svc_data->main_loop); + dcm_svc_data->main_context = context; - /* Create new channel to watch new socket for mainloop */ + /* Create new channel to watch new socket for main_loop */ channel = g_io_channel_unix_new(sockfd); source = g_io_create_watch(channel, G_IO_IN); /* Set callback to be called when socket is readable */ - g_source_set_callback(source, (GSourceFunc)DcmMainSvcCallBack::readMsg, NULL, NULL); + g_source_set_callback(source, (GSourceFunc)dcm_service_recieve_request, NULL, (gpointer) dcm_svc_data); g_source_attach(source, context); - dcmSvc->main_loop_context = context; - - dcmSvc->dcmServiceStartjobs(); + dcm_service_start(dcm_svc_data); dcm_debug("********************************************"); dcm_debug("****** DCM Service is running ******"); dcm_debug("********************************************"); - g_main_loop_run(g_dcm_svc_mainloop); - - dcmSvc->dcmServiceFinishjobs(); + g_main_loop_run(dcm_svc_data->main_loop); dcm_debug("DCM Service is shutting down..."); + g_io_channel_shutdown(channel, FALSE, NULL); g_io_channel_unref(channel); close(sockfd); - g_main_loop_unref(g_dcm_svc_mainloop); + g_main_loop_unref(dcm_svc_data->main_loop); + + dcm_service_finish(dcm_svc_data); return 0; } -- 2.34.1