Support thumbnail-util. 53/41053/3 accepted/tizen/mobile/20150616.010854 accepted/tizen/tv/20150616.010904 accepted/tizen/wearable/20150616.010911 submit/tizen/20150615.084116
authorMinje Ahn <minje.ahn@samsung.com>
Thu, 11 Jun 2015 05:15:52 +0000 (14:15 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Fri, 12 Jun 2015 04:31:51 +0000 (13:31 +0900)
Change-Id: I9748eb7d2d0944c7719740af0b1a295adf9563de
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
13 files changed:
lib/include/media-server-ipc.h
lib/include/media-util-ipc.h
lib/media-util-db.c
lib/media-util-ipc.c
lib/media-util-register.c
src/common/include/media-common-types.h
src/scanner/media-scanner-db-svc.c
src/scanner/media-scanner-scan.c
src/scanner/media-scanner-socket.c
src/server/include/media-server-thumb.h
src/server/media-server-scanner.c
src/server/media-server-socket.c
src/server/media-server-thumb.c

index b88e5a3..5fcbab5 100755 (executable)
@@ -46,7 +46,8 @@ typedef enum{
        MS_PORT_MAX,
 }ms_msg_port_type_e;
 
-#define MAX_MSG_SIZE                           4096
+#define MAX_MSG_SIZE                           4096*2
+#define MAX_FILEPATH_LEN                       4096
 
 typedef enum{
        MS_MSG_DB_UPDATE = 0,           /**< Media DB Update */
@@ -75,7 +76,7 @@ typedef struct
        uid_t uid;
        int result;
        size_t msg_size; /*this is size of message below and this does not include the terminationg null byte ('\0'). */
-       char msg[MAX_MSG_SIZE];
+       char msg[MAX_FILEPATH_LEN];
 }ms_comm_msg_s;
 
 typedef enum {
@@ -95,6 +96,7 @@ typedef struct {
 typedef struct _thumbMsg{
        int msg_type;
        int thumb_type;
+       int request_id;
        int status;
        int pid;
        uid_t uid;
@@ -105,9 +107,14 @@ typedef struct _thumbMsg{
        int origin_height;
        int origin_path_size;
        int dest_path_size;
-       char org_path[MAX_MSG_SIZE];
-       char dst_path[MAX_MSG_SIZE];
+       unsigned char *thumb_data;
+       char org_path[MAX_FILEPATH_LEN];
+       char dst_path[MAX_FILEPATH_LEN];
 } thumbMsg;
 
+typedef struct _thumbRawAddMsg{
+       int thumb_size;
+       unsigned char *thumb_data;
+} thumbRawAddMsg;
 
 #endif /*_MEDIA_SERVER_IPC_H_*/
index 34c57c8..82090bf 100755 (executable)
@@ -51,8 +51,9 @@ int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *so
 int ms_ipc_create_server_socket(ms_protocol_e protocol, int port, int *sock_fd);
 int ms_ipc_send_msg_to_server(int sockfd, int port, ms_comm_msg_s *send_msg, struct sockaddr_un *serv_addr);
 int ms_ipc_send_msg_to_client(int sockfd, ms_comm_msg_s *send_msg, struct sockaddr_un *client_addr);
-int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *client_addr, unsigned int *size, int *recv_socket);
-int ms_ipc_wait_message(int sockfd, void  *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *size, int connected);
+int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *client_addr, unsigned int *size);
+int ms_ipc_wait_message(int sockfd, void  *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *size);
+int ms_ipc_wait_block_message(int sockfd, void  *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *size);
 
 #ifdef __cplusplus
 }
index c4855e0..88ff720 100755 (executable)
@@ -356,8 +356,6 @@ static int __media_db_request_update(ms_msg_type_e msg_type, const char *request
        int sockfd = -1;
        int err = -1;
        struct sockaddr_un serv_addr;
-
-       unsigned int serv_addr_len = -1;
        int port = MS_DB_UPDATE_PORT;
 
        if(msg_type == MS_MSG_DB_UPDATE)
@@ -402,11 +400,10 @@ static int __media_db_request_update(ms_msg_type_e msg_type, const char *request
 
        /*Receive Response*/
        ms_comm_msg_s recv_msg;
-       serv_addr_len = sizeof(serv_addr);
        memset(&recv_msg, 0x0, sizeof(ms_comm_msg_s));
 
        /* connected socket*/
-       err = ms_ipc_wait_message(sockfd, &recv_msg, sizeof(recv_msg), &serv_addr, NULL,TRUE);
+       err = ms_ipc_wait_message(sockfd, &recv_msg, sizeof(recv_msg), &serv_addr, NULL);
        if (err != MS_MEDIA_ERR_NONE) {
                ret = err;
        } else {
@@ -511,7 +508,7 @@ static int __media_db_request_batch_update(ms_msg_type_e msg_type, const char *r
        /* Send request */
        if (send(sockfd, &send_msg, sizeof(send_msg), 0) != sizeof(send_msg)) {
                MSAPI_DBG_STRERROR("send failed");
-               __media_db_close_tcp_client_socket(sockfd);
+               __media_db_close_tcp_client_socket();
                return MS_MEDIA_ERR_SOCKET_SEND;
        }
 
@@ -520,7 +517,7 @@ static int __media_db_request_batch_update(ms_msg_type_e msg_type, const char *r
        int recv_msg = -1;
        if ((recv_msg_size = recv(sockfd, &recv_msg, sizeof(recv_msg), 0)) < 0) {
                MSAPI_DBG_ERR("recv failed : [%d]", sockfd);
-               __media_db_close_tcp_client_socket(sockfd);
+               __media_db_close_tcp_client_socket();
                if (errno == EWOULDBLOCK) {
                        MSAPI_DBG_ERR("Timeout. Can't try any more");
                        return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
index 3939259..90d96fd 100755 (executable)
@@ -40,6 +40,9 @@
 
 #include "media-util-dbg.h"
 #include "media-util.h"
+#include "media-util-internal.h"
+
+#define MS_SOCK_UDP_BLOCK_SIZE 512
 
 char MEDIA_IPC_PATH[][70] ={
        {"/var/run/media-server/media_ipc_dbbatchupdate.socket"},
@@ -280,10 +283,9 @@ int ms_ipc_send_msg_to_client(int sockfd, ms_comm_msg_s *send_msg, struct sockad
        return res;
 }
 
-int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size, int *recv_socket)
+int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size)
 {
        int recv_msg_size;
-       int client_socket = -1;
        struct sockaddr_un addr;
        socklen_t addr_len;
 
@@ -306,15 +308,11 @@ int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, st
        return MS_MEDIA_ERR_NONE;
 }
 
-int ms_ipc_wait_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size, int connected)
+int ms_ipc_wait_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size)
 {
        int recv_msg_size;
        socklen_t addr_len;
 
-       struct sockaddr_un client_addr;
-       unsigned int client_addr_len;
-       int client_socket = -1;
-       
        if (!recv_msg ||!recv_addr)
                return MS_MEDIA_ERR_INVALID_PARAMETER;
 
@@ -336,3 +334,45 @@ int ms_ipc_wait_message(int sockfd, void *recv_msg, unsigned int msg_size, struc
        return MS_MEDIA_ERR_NONE;
 }
 
+int ms_ipc_wait_block_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size)
+{
+       int recv_msg_size;
+       socklen_t addr_len;
+       unsigned char *block_buf;
+       int block_size = 0;
+       int recv_size = 0;
+       unsigned int remain_size = msg_size;
+
+       if (!recv_msg ||!recv_addr)
+               return MS_MEDIA_ERR_INVALID_PARAMETER;
+
+       addr_len = sizeof(struct sockaddr_un);
+       block_size = MS_SOCK_UDP_BLOCK_SIZE;
+       block_buf = malloc(block_size * sizeof(unsigned char));
+
+       while(remain_size > 0) {
+               if(remain_size < MS_SOCK_UDP_BLOCK_SIZE) {
+                       block_size = remain_size;
+               }
+               if ((recv_msg_size = recvfrom(sockfd, block_buf, block_size, 0, (struct sockaddr *)recv_addr, &addr_len)) < 0) {
+                       MSAPI_DBG_ERR("recvfrom failed [%s]", strerror(errno));
+                       if (errno == EWOULDBLOCK) {
+                               MSAPI_DBG_ERR("recvfrom Timeout.");
+                               return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
+                       } else {
+                               MSAPI_DBG_ERR("recvfrom error [%s]", strerror(errno));
+                               return MS_MEDIA_ERR_SOCKET_RECEIVE;
+                       }
+               }
+
+               memcpy(recv_msg+recv_size, block_buf, block_size);
+               recv_size += block_size;
+               remain_size -= block_size;
+       }
+       if (addr_size != NULL)
+               *addr_size  = addr_len;
+
+       MS_SAFE_FREE(block_buf);
+
+       return MS_MEDIA_ERR_NONE;
+}
\ No newline at end of file
index e078b3e..c66e470 100755 (executable)
@@ -169,9 +169,9 @@ gboolean _read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
        /* Socket is readable */
        struct sockaddr_in recv_add;
        
-       ret = ms_ipc_wait_message(sockfd, &recv_msg, sizeof(recv_msg), &recv_add, NULL, TRUE);
+       ret = ms_ipc_wait_message(sockfd, &recv_msg, sizeof(recv_msg), &recv_add, NULL);
        if (ret != MS_MEDIA_ERR_NONE) {
-               MSAPI_DBG("ms_ipc_receive_message failed");
+               MSAPI_DBG("ms_ipc_wait_message failed");
                return TRUE;
        }
 
@@ -255,9 +255,9 @@ static int __media_db_request_update_async(ms_msg_type_e msg_type, const char *r
        MSAPI_DBG("REQUEST DIRECTORY SCANNING");
 
        request_msg_size = strlen(request_msg);
-       if(request_msg_size >= MAX_MSG_SIZE)
+       if(request_msg_size >= MAX_FILEPATH_LEN)
        {
-               MSAPI_DBG_ERR("Query is Too long. [%d] query size limit is [%d]", request_msg_size, MAX_MSG_SIZE);
+               MSAPI_DBG_ERR("Query is Too long. [%d] query size limit is [%d]", request_msg_size, MAX_FILEPATH_LEN);
                return MS_MEDIA_ERR_INVALID_PARAMETER;
        }
 
index 0295d30..a46488b 100755 (executable)
@@ -57,7 +57,7 @@
 
 #define MS_SAFE_FREE(src)      { if(src) {free(src); src = NULL;} }
 #define MS_MALLOC(src, size)   { if (size > SIZE_MAX || size <= 0) {src = NULL;} \
-                                                       else { src = malloc(size); if(src) memset(src, 0x0, size);} }
+                                                       else { src = malloc(size); memset(src, 0x0, size);} }
 
 /*System default folder definition*/
 #define FAT_FILENAME_LEN_MAX          255      /* not inc null */
index eb5c64c..7d809f6 100755 (executable)
@@ -437,7 +437,7 @@ msc_insert_burst_item(void **handle, const char *path , uid_t uid)
 
        for (lib_index = 0; lib_index < lib_num; lib_index++) {
                if (!_msc_check_category(path, lib_index)) {
-                       ret = ((INSERT_BURST_ITEM)func_array[lib_index][eINSERT_BURST])(handle[lib_index], uid, path, storage_type, &err_msg); /*dlopen*/
+                       ret = ((INSERT_BURST_ITEM)func_array[lib_index][eINSERT_BURST])(handle[lib_index], path, storage_type, uid, &err_msg); /*dlopen*/
                        if (ret != 0) {
                                MSC_DBG_ERR("error : %s [%s]", g_array_index(so_array, char*, lib_index), err_msg);
                                MSC_DBG_ERR("[%s]", path);
index c9d15d5..0279738 100755 (executable)
@@ -628,7 +628,7 @@ gboolean msc_register_thread(void *data)
        int ret;
        void **handle = NULL;
        ms_msg_type_e current_msg = MS_MSG_MAX;
-       int (*insert_function)(void **, uid_t, const char*) = NULL;
+       int (*insert_function)(void **, const char*, uid_t) = NULL;
 
        /*create array for processing overlay data*/
        register_array = g_array_new (FALSE, FALSE, sizeof (ms_comm_msg_s *));
index e5505ed..5000fa3 100755 (executable)
@@ -68,7 +68,7 @@ gboolean msc_receive_request(GIOChannel *src, GIOCondition condition, gpointer d
        }
 
        /* Socket is readable */
-       ret = ms_ipc_receive_message(sockfd, recv_msg, sizeof(*recv_msg), NULL, NULL, NULL);
+       ret = ms_ipc_receive_message(sockfd, recv_msg, sizeof(*recv_msg), NULL, NULL);
        if (ret != MS_MEDIA_ERR_NONE) {
                MS_SAFE_FREE(recv_msg);
                return TRUE;
index 50cf12a..0477b61 100755 (executable)
@@ -52,7 +52,7 @@ gboolean
 _ms_thumb_agent_prepare_udp_socket();
 
 int
-_ms_thumb_recv_msg(int sock, int header_size, thumbMsg *msg);
+_ms_thumb_recv_msg(int sock, thumbMsg *msg);
 
 int
 _ms_thumb_recv_udp_msg(int sock, int header_size, thumbMsg *msg, struct sockaddr_un *from_addr, unsigned int *from_size);
index 2bcac97..2c50167 100755 (executable)
@@ -172,7 +172,7 @@ int ms_scanner_start(void)
                /*Receive Response*/
                serv_addr_len = sizeof(serv_addr);
 
-               err = ms_ipc_wait_message(sockfd, &recv_msg, sizeof(recv_msg), &serv_addr, NULL, FALSE);
+               err = ms_ipc_wait_message(sockfd, &recv_msg, sizeof(recv_msg), &serv_addr, NULL);
                if (err != MS_MEDIA_ERR_NONE) {
                        ret = err;
                        close(sockfd);
index 1bd8037..296606c 100755 (executable)
@@ -136,7 +136,7 @@ gboolean ms_read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
                return TRUE;
        }
        client_addr_len = sizeof(struct sockaddr_un);
-       ret = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(recv_msg), client_addr, NULL, &client_sock);
+       ret = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(recv_msg), client_addr, NULL);
        if (ret != MS_MEDIA_ERR_NONE) {
                MS_DBG_ERR("ms_ipc_receive_message failed");
                MS_SAFE_FREE(client_addr);
@@ -240,7 +240,7 @@ gboolean ms_receive_message_from_scanner(GIOChannel *src, GIOCondition condition
        }
 
        /* Socket is readable */
-       ret = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(recv_msg), &client_addr, NULL, NULL);
+       ret = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(recv_msg), &client_addr, NULL);
        if (ret != MS_MEDIA_ERR_NONE) {
                MS_DBG_ERR("ms_ipc_receive_message failed [%s]", strerror(errno));
                return TRUE;
@@ -391,7 +391,7 @@ gboolean ms_read_db_socket(GIOChannel *src, GIOCondition condition, gpointer dat
                return TRUE;
        }
 
-       ret = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(recv_msg), &client_addr, NULL, &client_sock);
+       ret = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(recv_msg), &client_addr, NULL);
        if (ret != MS_MEDIA_ERR_NONE) {
                return TRUE;
        }
index 84b671f..e7db58d 100755 (executable)
@@ -38,7 +38,7 @@
 #define LOG_TAG "MEDIA_SERVER_THUMB"
 
 #define THUMB_SERVER_NAME "media-thumbnail"
-
+#define MS_SOCK_BLOCK_SIZE 512
 #define THUMB_SERVER_PATH tzplatform_mkpath(TZ_SYS_BIN,"media-thumbnail-server")
 
 gboolean _ms_thumb_agent_timer();
@@ -47,6 +47,8 @@ static GMainLoop *g_thumb_agent_loop = NULL;
 static GIOChannel *g_udp_channel = NULL;
 static gboolean g_folk_thumb_server = FALSE;
 static gboolean g_thumb_server_extracting = FALSE;
+static gboolean g_shutdowning_thumb_server = FALSE;
+static gboolean g_thumb_server_queued_all_extracting_request = FALSE;
 static int g_communicate_sock = 0;
 static int g_timer_id = 0;
 static int g_server_pid = 0;
@@ -61,6 +63,8 @@ typedef struct {
 
 extern char MEDIA_IPC_PATH[][70];
 
+gboolean _ms_thumb_check_queued_request(gpointer data);
+
 gboolean _ms_thumb_agent_start_jobs(gpointer data)
 {
        MS_DBG("");
@@ -88,6 +92,7 @@ int ms_thumb_get_server_pid()
 void ms_thumb_reset_server_status()
 {
        g_folk_thumb_server = FALSE;
+       g_shutdowning_thumb_server = FALSE;
 
        if (g_timer_id > 0) {
                g_source_destroy(g_main_context_find_source_by_id(g_main_context_get_thread_default(), g_timer_id));
@@ -226,11 +231,12 @@ int _media_thumb_get_error()
 {
        if (errno == EWOULDBLOCK) {
                MS_DBG_ERR("Timeout. Can't try any more");
+#if 0
                if (!_ms_thumb_check_process()) {
                        MS_DBG_ERR("Thumbnail server is not running!. Reset info for thumb server to execute");
                        ms_thumb_reset_server_status();
                }
-
+#endif
                return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
        } else {
                MS_DBG_STRERROR("recvfrom failed");
@@ -238,12 +244,15 @@ int _media_thumb_get_error()
        }
 }
 
-int _ms_thumb_recv_msg(int sock, int header_size, thumbMsg *msg)
+int _ms_thumb_recv_msg(int sock, thumbMsg *msg)
 {
        int recv_msg_len = 0;
        unsigned char *buf = NULL;
+       int header_size = 0;
 
-       buf = (unsigned char*)malloc(header_size);
+       header_size = sizeof(thumbMsg) -(MAX_FILEPATH_LEN * 2) - sizeof(unsigned char *);
+
+       buf = malloc(header_size * sizeof(unsigned char));
 
        if ((recv_msg_len = recv(sock, buf, header_size, 0)) < 0) {
                MS_DBG_STRERROR("recv failed");
@@ -252,7 +261,7 @@ int _ms_thumb_recv_msg(int sock, int header_size, thumbMsg *msg)
        }
        memcpy(msg, buf, header_size);
 
-       //MS_DBG("origin_path_size : %d, dest_path_size : %d", msg->origin_path_size, msg->dest_path_size);
+       MS_DBG("origin_path_size : %d, dest_path_size : %d, thumb_size : %d", msg->origin_path_size, msg->dest_path_size, msg->thumb_size);
 
        MS_SAFE_FREE(buf);
 
@@ -262,9 +271,9 @@ int _ms_thumb_recv_msg(int sock, int header_size, thumbMsg *msg)
                return MS_MEDIA_ERR_DATA_TAINTED;
        }
 
-       buf = (unsigned char*)malloc(msg->origin_path_size);
+       buf = (unsigned char*)malloc(msg->origin_path_size + 1);
 
-       if ((recv_msg_len = recv(sock, buf, msg->origin_path_size, 0)) < 0) {
+       if ((recv_msg_len = recv(sock, buf, msg->origin_path_size + 1, 0)) < 0) {
                MS_DBG_STRERROR("recv failed");
                MS_SAFE_FREE(buf);
                return _media_thumb_get_error();
@@ -279,16 +288,28 @@ int _ms_thumb_recv_msg(int sock, int header_size, thumbMsg *msg)
                return MS_MEDIA_ERR_DATA_TAINTED;
        }
 
-       buf = (unsigned char*)malloc(msg->dest_path_size);
+       buf = (unsigned char*)malloc(msg->dest_path_size + 1);
 
-       if ((recv_msg_len = recv(sock, buf, msg->dest_path_size, 0)) < 0) {
+       if ((recv_msg_len = recv(sock, buf, msg->dest_path_size + 1, 0)) < 0) {
+               MS_DBG_ERR("recv failed : %s");
+               MS_SAFE_FREE(buf);
+               return _media_thumb_get_error();
+       }
+       strncpy(msg->dst_path, (char*)buf, msg->dest_path_size);
+
+       MS_SAFE_FREE(buf);
+
+       buf = malloc(msg->thumb_size * sizeof(unsigned char));
+
+       if ((recv_msg_len = recv(sock, buf, msg->thumb_size, 0)) < 0) {
                MS_DBG_ERR("recv failed : %s", strerror(errno));
                MS_SAFE_FREE(buf);
                return _media_thumb_get_error();
        }
 
-       strncpy(msg->dst_path, (char*)buf, msg->dest_path_size);
-       //MS_DBG("destination path : %s", msg->dst_path);
+       MS_SAFE_FREE(msg->thumb_data);
+       msg->thumb_data = malloc(msg->thumb_size * sizeof(unsigned char));
+       memcpy(msg->thumb_data, buf, msg->thumb_size);
 
        MS_SAFE_FREE(buf);
 
@@ -303,7 +324,7 @@ int _ms_thumb_recv_udp_msg(int sock, int header_size, thumbMsg *msg, struct sock
 
        buf = (unsigned char*)malloc(sizeof(thumbMsg));
 
-       recv_msg_len = ms_ipc_wait_message(sock, buf, sizeof(thumbMsg), from_addr, &from_addr_size, TRUE);
+       recv_msg_len = ms_ipc_wait_message(sock, buf, sizeof(thumbMsg), from_addr, &from_addr_size);
        if (recv_msg_len != MS_MEDIA_ERR_NONE) {
                MS_DBG_STRERROR("ms_ipc_wait_message failed");
                MS_SAFE_FREE(buf);
@@ -330,6 +351,45 @@ int _ms_thumb_recv_udp_msg(int sock, int header_size, thumbMsg *msg, struct sock
        strncpy(msg->dst_path, (char*)buf + header_size + msg->origin_path_size, msg->dest_path_size);
 
        MS_SAFE_FREE(buf);
+
+       //Additional data
+       if(msg->msg_type == 10) { //THUMB_RESPONSE_RAW_DATA
+               thumbRawAddMsg *thumbaddmsg = NULL;
+               thumbaddmsg = calloc(1, sizeof(thumbRawAddMsg));
+               buf = malloc(msg->thumb_size * sizeof(unsigned char));
+
+               recv_msg_len = ms_ipc_wait_block_message(sock, buf, msg->thumb_size, from_addr, &from_addr_size);
+               if (recv_msg_len != MS_MEDIA_ERR_NONE) {
+                       MS_DBG_ERR("ms_ipc_wait_message failed : %s", strerror(errno));
+                       MS_SAFE_FREE(buf);
+                       MS_SAFE_FREE(thumbaddmsg);
+                       return _media_thumb_get_error();
+               }
+               header_size = sizeof(thumbaddmsg);
+
+               memcpy(thumbaddmsg, buf, header_size);
+
+               msg->thumb_size = thumbaddmsg->thumb_size;
+
+               if (msg->thumb_size <= 0) {
+                       MS_SAFE_FREE(buf);
+                       MS_SAFE_FREE(thumbaddmsg);
+                       MS_DBG_ERR("msg->thumb_size is invalid %d", msg->thumb_size);
+                       return MS_MEDIA_ERR_DATA_TAINTED;
+               }
+
+               msg->thumb_data = malloc(msg->thumb_size * sizeof(unsigned char));
+               memset(msg->thumb_data, 0, msg->thumb_size * sizeof(unsigned char));
+               memcpy(msg->thumb_data, buf + header_size, msg->thumb_size);
+
+               MS_SAFE_FREE(thumbaddmsg->thumb_data);
+               MS_SAFE_FREE(thumbaddmsg);
+               MS_SAFE_FREE(buf);
+       }else {
+               msg->thumb_data = "\0";
+               msg->thumb_size = 1;
+       }
+
        *from_size = from_addr_size;
 
        return MS_MEDIA_ERR_NONE;
@@ -343,33 +403,29 @@ int _ms_thumb_set_buffer(thumbMsg *req_msg, unsigned char **buf, int *buf_size)
 
        int org_path_len = 0;
        int dst_path_len = 0;
+       int data_len = 0;
        int size = 0;
        int header_size = 0;
 
-       header_size = sizeof(thumbMsg) - MAX_MSG_SIZE*2;
+       header_size = sizeof(thumbMsg) -(MAX_FILEPATH_LEN * 2) - sizeof(unsigned char *);
        org_path_len = strlen(req_msg->org_path) + 1;
        dst_path_len = strlen(req_msg->dst_path) + 1;
+       data_len = req_msg->thumb_size;
 
-       //MS_DBG("Basic Size : %d, org_path : %s[%d], dst_path : %s[%d]", header_size, req_msg->org_path, org_path_len, req_msg->dst_path, dst_path_len);
+       MS_DBG_SLOG("Basic Size : %d, org_path : %s[%d], dst_path : %s[%d], thumb_data : %d", header_size, req_msg->org_path, org_path_len, req_msg->dst_path, dst_path_len, req_msg->thumb_size);
 
-       size = header_size + org_path_len + dst_path_len;
+       size = header_size + org_path_len + dst_path_len + data_len;
        *buf = malloc(size);
        memcpy(*buf, req_msg, header_size);
        memcpy((*buf)+header_size, req_msg->org_path, org_path_len);
        memcpy((*buf)+header_size + org_path_len, req_msg->dst_path, dst_path_len);
+       memcpy((*buf)+header_size + org_path_len + dst_path_len, req_msg->thumb_data, data_len);
 
        *buf_size = size;
 
        return 0;
 }
 
-/*
-void _ms_thumb_agent_child_handler(GPid pid, gint status, gpointer user_data)
-{
-       MS_DBG_WARN("media-thumbnail-server[%d] is shutdown : %d", pid, status);
-       g_folk_thumb_server = FALSE;
-}
-*/
 gboolean _ms_thumb_agent_child_handler(gpointer data)
 {
        int pid = GPOINTER_TO_INT(data);
@@ -386,7 +442,7 @@ gboolean _ms_thumb_agent_recv_msg_from_server()
        ms_thumb_server_msg recv_msg;
        int recv_msg_size = 0;
 
-       recv_msg_size = ms_ipc_receive_message(g_communicate_sock, & recv_msg, sizeof(ms_thumb_server_msg),  NULL, NULL, NULL);
+       recv_msg_size = ms_ipc_receive_message(g_communicate_sock, & recv_msg, sizeof(ms_thumb_server_msg),  NULL, NULL);
        if (recv_msg_size != MS_MEDIA_ERR_NONE) {
                MS_DBG_STRERROR("ms_ipc_receive_message failed");
                return FALSE;
@@ -404,6 +460,17 @@ gboolean _ms_thumb_agent_recv_thumb_done_from_server(GIOChannel *src, GIOConditi
 {
        int sockfd = -1;
 
+       /* Once all-thumb extraction is done, check if there is queued all-thumb request */
+       GSource *check_queued_all_thumb_request = NULL;
+       check_queued_all_thumb_request = g_idle_source_new ();
+       g_source_set_callback (check_queued_all_thumb_request, _ms_thumb_check_queued_request, NULL, NULL);
+       g_source_attach (check_queued_all_thumb_request, g_main_context_get_thread_default());
+
+       if (g_thumb_server_extracting == FALSE) {
+               MS_DBG_WARN("Recv thumb server extracting done already");
+               return FALSE;
+       }
+
        sockfd = g_io_channel_unix_get_fd(src);
        if (sockfd < 0) {
                MS_DBG_ERR("sock fd is invalid!");
@@ -413,7 +480,9 @@ gboolean _ms_thumb_agent_recv_thumb_done_from_server(GIOChannel *src, GIOConditi
        ms_thumb_server_msg recv_msg;
        int recv_msg_size = 0;
 
-       recv_msg_size = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(ms_thumb_server_msg), NULL, NULL, NULL);
+       MS_DBG_ERR("THUMB SERVER SOCKET %d", sockfd);
+
+       recv_msg_size = ms_ipc_receive_message(sockfd, &recv_msg, sizeof(ms_thumb_server_msg), NULL, NULL);
        if (recv_msg_size != MS_MEDIA_ERR_NONE) {
                MS_DBG_STRERROR("ms_ipc_receive_message failed");
                return FALSE;
@@ -461,8 +530,8 @@ gboolean _ms_thumb_agent_send_msg_to_thumb_server(thumbMsg *recv_msg, thumbMsg *
        struct sockaddr_un serv_addr;
        int send_str_len = strlen(recv_msg->org_path);
 
-       if (send_str_len > MAX_MSG_SIZE) {
-               MS_DBG_ERR("original path's length exceeds %d(max packet size)", MAX_MSG_SIZE);
+       if (send_str_len > MAX_FILEPATH_LEN) {
+               MS_DBG_ERR("original path's length exceeds %d(max packet size)", MAX_FILEPATH_LEN);
                return FALSE;
        }
 
@@ -494,7 +563,7 @@ gboolean _ms_thumb_agent_send_msg_to_thumb_server(thumbMsg *recv_msg, thumbMsg *
 
        struct sockaddr_un client_addr;
        unsigned int client_addr_len;
-       header_size = sizeof(thumbMsg) - MAX_MSG_SIZE*2;
+       header_size = sizeof(thumbMsg) - (MAX_FILEPATH_LEN * 2) - sizeof(unsigned char *);
 
        if (_ms_thumb_recv_udp_msg(sock, header_size, res_msg, &client_addr, &client_addr_len) < 0) {
                MS_DBG_ERR("_ms_thumb_recv_udp_msg failed");
@@ -522,6 +591,39 @@ gboolean _ms_thumb_agent_send_msg_to_thumb_server(thumbMsg *recv_msg, thumbMsg *
        return TRUE;
 }
 
+gboolean _ms_thumb_check_queued_request(gpointer data)
+{
+       if (g_thumb_server_queued_all_extracting_request) {
+               MS_DBG_WARN("There is queued request");
+
+               /* request all-thumb extraction to thumbnail server */
+               thumbMsg msg;
+               thumbMsg recv_msg;
+               memset((void *)&msg, 0, sizeof(msg));
+               memset((void *)&recv_msg, 0, sizeof(recv_msg));
+
+               msg.msg_type = 2; // THUMB_REQUEST_ALL_MEDIA
+               msg.org_path[0] = '\0';
+               msg.origin_path_size = 1;
+               msg.dst_path[0] = '\0';
+               msg.dest_path_size = 1;
+               msg.thumb_data = (unsigned char *)"\0";
+               msg.thumb_size = 1;
+
+               /* Command All-thumb extraction to thumbnail server */
+               if (!_ms_thumb_agent_send_msg_to_thumb_server(&msg, &recv_msg)) {
+                       MS_DBG_ERR("_ms_thumb_agent_send_msg_to_thumb_server is failed");
+               }
+
+               g_thumb_server_queued_all_extracting_request = FALSE;
+       } else {
+               MS_DBG("There is no queued request");
+               return FALSE;
+       }
+
+       return FALSE;
+}
+
 gboolean _ms_thumb_agent_timer()
 {
        if (g_thumb_server_extracting) {
@@ -546,13 +648,17 @@ gboolean _ms_thumb_agent_timer()
                msg.origin_path_size = 1;
                msg.dst_path[0] = '\0';
                msg.dest_path_size = 1;
+               msg.thumb_data = (unsigned char *)"\0";
+               msg.thumb_size = 1;
 
                /* Command Kill to thumbnail server */
+               g_shutdowning_thumb_server = TRUE;
                if (!_ms_thumb_agent_send_msg_to_thumb_server(&msg, &recv_msg)) {
                        MS_DBG_ERR("_ms_thumb_agent_send_msg_to_thumb_server is failed");
+                       g_shutdowning_thumb_server = FALSE;
                }
-
                usleep(200000);
+
        } else {
                MS_DBG_ERR("g_server_pid is %d. Maybe there's problem in thumbnail-server", g_server_pid);
        }
@@ -560,96 +666,70 @@ gboolean _ms_thumb_agent_timer()
        return FALSE;
 }
 
-#if 0
-gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
-                                                                       GIOCondition condition,
-                                                                       gpointer data)
+int _ms_thumb_cancel_media(const char *path, int pid)
 {
-       struct sockaddr_un client_addr;
-       unsigned int client_addr_len;
+       int ret = -1;
+       int i = 0;
+       int req_len = 0;
 
-       thumbMsg recv_msg;
-       thumbMsg res_msg;
-       int header_size = 0;
-       int sock = -1;
-       int client_sock = -1;
+       req_len = g_queue_get_length(g_request_queue);
 
-       sock = g_io_channel_unix_get_fd(src);
-       if (sock < 0) {
-               MS_DBG_ERR("sock fd is invalid!");
-               return TRUE;
-       }
+       MS_DBG("Queue length : %d", req_len);
 
-       memset((void *)&recv_msg, 0, sizeof(thumbMsg));
-       memset((void *)&res_msg, 0, sizeof(res_msg));
-       header_size = sizeof(thumbMsg) - MAX_MSG_SIZE*2;
+       for (i = 0; i < req_len; i++) {
+               thumbRequest *req = NULL;
+               req = (thumbRequest *)g_queue_peek_nth(g_request_queue, i);
+               if (req == NULL) continue;
 
-       if ((client_sock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_len)) < 0) {
-               MS_DBG_ERR("accept failed : %s", strerror(errno));
-               return TRUE;
-       }
+               if ((req->recv_msg->pid) == pid && (strncmp(path, req->recv_msg->org_path, strlen(path))) == 0 && req->recv_msg->request_id == 0) {
+                       MS_DBG("Remove %s from queue", req->recv_msg->org_path);
+                       g_queue_pop_nth(g_request_queue, i);
 
-       MS_DBG("Client[%d] is accepted", client_sock);
+                       close(req->client_sock);
+                       MS_SAFE_FREE(req->recv_msg);
+                       MS_SAFE_FREE(req);
+                       ret = 0;
 
-       if (_ms_thumb_recv_msg(client_sock, header_size, &recv_msg) < 0) {
-               MS_DBG_ERR("_ms_thumb_recv_msg failed ");
-               close(client_sock);
-               return TRUE;
+                       break;
+               }
        }
 
-       MS_DBG("Received [%d] %s(%d) from PID(%d) \n", recv_msg.msg_type, recv_msg.org_path, strlen(recv_msg.org_path), recv_msg.pid);
-
-       if (g_folk_thumb_server == FALSE && g_thumb_server_extracting == FALSE) {
-               if(_ms_thumb_check_process() == FALSE) { // This logic is temporary
-               MS_DBG_WARN("Thumb server is not running.. so start it");
-               if (!_ms_thumb_agent_execute_server()) {
-                       MS_DBG_ERR("_ms_thumb_agent_execute_server is failed");
-                       return TRUE;
-               } else {
+       return ret;
+}
 
-                       GSource *timer_src = g_timeout_source_new_seconds(MS_TIMEOUT_SEC_20);
-                       g_source_set_callback (timer_src, _ms_thumb_agent_timer, NULL, NULL);
-                       g_timer_id = g_source_attach (timer_src, g_main_context_get_thread_default());
-               }
-               }
-       } else {
-               if (g_timer_id > 0) {
-                       g_source_destroy(g_main_context_find_source_by_id(g_main_context_get_thread_default(), g_timer_id));
-                       //MS_DBG("Timer is recreated");
-                       GSource *timer_src = g_timeout_source_new_seconds(MS_TIMEOUT_SEC_20);
-                       g_source_set_callback (timer_src, _ms_thumb_agent_timer, NULL, NULL);
-                       g_timer_id = g_source_attach (timer_src, g_main_context_get_thread_default());
-               }
-       }
+int _ms_thumb_cancel_media_raw_data(int request_id, int pid)
+{
+       int ret = -1;
+       int i = 0;
+       int req_len = 0;
 
-       if (!_ms_thumb_agent_send_msg_to_thumb_server(&recv_msg, &res_msg)) {
-               MS_DBG_ERR("_ms_thumb_agent_send_msg_to_thumb_server is failed");
+       req_len = g_queue_get_length(g_request_queue);
 
-               return TRUE;
-       }
+       MS_DBG("Queue length : %d", req_len);
 
-       strncpy(res_msg.org_path, recv_msg.org_path, recv_msg.origin_path_size);
-       res_msg.origin_path_size = recv_msg.origin_path_size;
-       res_msg.dest_path_size = strlen(res_msg.dst_path) + 1;
+       for (i = 0; i < req_len; i++) {
+               thumbRequest *req = NULL;
+               req = (thumbRequest *)g_queue_peek_nth(g_request_queue, i);
+               if (req == NULL) continue;
 
-       int buf_size = 0;
-       unsigned char *buf = NULL;
-       _ms_thumb_set_buffer(&res_msg, &buf, &buf_size);
+               if ((req->recv_msg->pid) == pid && request_id == req->recv_msg->request_id) {
+                       MS_DBG("Remove %d from queue", req->recv_msg->request_id);
+                       g_queue_pop_nth(g_request_queue, i);
 
-       //MS_DBG("buffer size : %d", buf_size);
+                       close(req->client_sock);
+                       MS_SAFE_FREE(req->recv_msg);
+                       MS_SAFE_FREE(req);
+                       ret = 0;
 
-       if (send(client_sock, buf, buf_size, 0) != buf_size) {
-               MS_DBG_ERR("sendto failed : %s", strerror(errno));
-       } else {
-               MS_DBG("Sent %s(%d) \n", res_msg.dst_path, strlen(res_msg.dst_path));
+                       break;
+               }
        }
 
-       close(client_sock);
-       MS_SAFE_FREE(buf);
-       return TRUE;
+       return ret;
 }
-#else
-int _ms_thumb_cancel_media(const char *path, int pid)
+
+
+int _ms_thumb_cancel_all(int pid)
 {
        int ret = -1;
        int i = 0;
@@ -664,23 +744,23 @@ int _ms_thumb_cancel_media(const char *path, int pid)
                req = (thumbRequest *)g_queue_peek_nth(g_request_queue, i);
                if (req == NULL) continue;
 
-               if ((req->recv_msg->pid) == pid && (strncmp(path, req->recv_msg->org_path, strlen(path))) == 0) {
-                       MS_DBG("Remove %s from queue", req->recv_msg->org_path);
+               if (req->recv_msg->pid == pid && req->recv_msg->request_id == 0) {
+                       MS_DBG("Remove [%d] %s from queue", req->recv_msg->pid, req->recv_msg->org_path);
                        g_queue_pop_nth(g_request_queue, i);
+                       i--;
+                       req_len--;
 
                        close(req->client_sock);
                        MS_SAFE_FREE(req->recv_msg);
                        MS_SAFE_FREE(req);
                        ret = 0;
-
-                       break;
                }
        }
 
        return ret;
 }
 
-int _ms_thumb_cancel_all(int pid)
+int _ms_thumb_cancel_all_raw_data(int pid)
 {
        int ret = -1;
        int i = 0;
@@ -695,7 +775,7 @@ int _ms_thumb_cancel_all(int pid)
                req = (thumbRequest *)g_queue_peek_nth(g_request_queue, i);
                if (req == NULL) continue;
 
-               if (req->recv_msg->pid == pid) {
+               if (req->recv_msg->pid == pid && req->recv_msg->request_id != 0) {
                        MS_DBG("Remove [%d] %s from queue", req->recv_msg->pid, req->recv_msg->org_path);
                        g_queue_pop_nth(g_request_queue, i);
                        i--;
@@ -711,7 +791,7 @@ int _ms_thumb_cancel_all(int pid)
        return ret;
 }
 
-void _ms_thumb_cancle_request(thumbRequest *thumb_req)
+void _ms_thumb_cancel_request(thumbRequest *thumb_req)
 {
        MS_DBG("");
        int ret = -1;
@@ -728,8 +808,16 @@ void _ms_thumb_cancle_request(thumbRequest *thumb_req)
                ret = _ms_thumb_cancel_media(recv_msg->org_path, recv_msg->pid);
        else if (recv_msg->msg_type == 4)
                ret = _ms_thumb_cancel_all(recv_msg->pid);
+       else if (recv_msg->msg_type == 9)
+               ret = _ms_thumb_cancel_all_raw_data(recv_msg->pid);
+       else if (recv_msg->msg_type == 8)
+               ret = _ms_thumb_cancel_media_raw_data(recv_msg->request_id, recv_msg->pid);
 
-       recv_msg->status = ret;
+       if (ret == 0) {
+               recv_msg->status = 0;  // THUMB_SUCCESS
+       } else {
+               recv_msg->status = -1;  // THUMB_FAIL
+       }
 
        if (recv_msg->origin_path_size <= 0  || recv_msg->origin_path_size > MS_FILE_PATH_LEN_MAX) {
                MS_DBG_ERR("recv_msg->origin_path_size is invalid %d", recv_msg->origin_path_size );
@@ -738,19 +826,9 @@ void _ms_thumb_cancle_request(thumbRequest *thumb_req)
 
        recv_msg->dest_path_size = recv_msg->origin_path_size;
        strncpy(recv_msg->dst_path, recv_msg->org_path, recv_msg->dest_path_size);
-/*
-       int buf_size = 0;
-       unsigned char *buf = NULL;
-       _ms_thumb_set_buffer(recv_msg, &buf, &buf_size);
 
-       if (send(thumb_req->client_sock, buf, buf_size, 0) != buf_size) {
-               MS_DBG_ERR("sendto failed : %s", strerror(errno));
-       } else {
-               MS_DBG("Sent response");
-       }
-*/
        close(thumb_req->client_sock);
-       //MS_SAFE_FREE(buf);
+
        MS_SAFE_FREE(thumb_req->recv_msg);
        MS_SAFE_FREE(thumb_req);
 
@@ -771,8 +849,14 @@ gboolean _ms_thumb_request_to_server(gpointer data)
                return FALSE;
        }
 
+       if (g_shutdowning_thumb_server) {
+               MS_DBG_ERR("Thumb server is shutting down... wait for complete");
+               usleep(10000);
+               return TRUE;
+       }
+
        if (g_folk_thumb_server == FALSE && g_thumb_server_extracting == FALSE) {
-               if(_ms_thumb_check_process() == FALSE) { // This logic is temporary
+//             if(_ms_thumb_check_process() == FALSE) { // This logic is temporary
                        MS_DBG_WARN("Thumb server is not running.. so start it");
                        if (!_ms_thumb_agent_execute_server()) {
                                MS_DBG_ERR("_ms_thumb_agent_execute_server is failed");
@@ -781,7 +865,7 @@ gboolean _ms_thumb_request_to_server(gpointer data)
                        } else {
                                _ms_thumb_create_timer(g_timer_id);
                        }
-               }
+//             }
        } else {
                /* Timer is re-created*/
                _ms_thumb_create_timer(g_timer_id);
@@ -811,13 +895,42 @@ gboolean _ms_thumb_request_to_server(gpointer data)
        }
 
        if (recv_msg) {
-               if (!_ms_thumb_agent_send_msg_to_thumb_server(recv_msg, &res_msg)) {
-                       MS_DBG_ERR("_ms_thumb_agent_send_msg_to_thumb_server is failed");
-
-                       close(client_sock);
-                       MS_SAFE_FREE(req->recv_msg);
-                       MS_SAFE_FREE(req);
-                       return TRUE;
+               if (recv_msg->msg_type == 2 && g_thumb_server_extracting) { // THUMB_REQUEST_ALL_MEDIA
+                       MS_DBG_WARN("Thumbnail server is already extracting..This request is queued.");
+                       g_thumb_server_queued_all_extracting_request = TRUE;
+               } else {
+                       if (!_ms_thumb_agent_send_msg_to_thumb_server(recv_msg, &res_msg)) {
+                               MS_DBG_ERR("_ms_thumb_agent_send_msg_to_thumb_server is failed");
+
+                               thumbMsg res_msg;
+                               memset((void *)&res_msg, 0, sizeof(res_msg));
+
+                               res_msg.msg_type = 6; // THUMB_RESPONSE
+                               res_msg.status = 1; //THUMB_FAIL
+                               res_msg.origin_path_size = strlen(recv_msg->org_path);
+                               strncpy(res_msg.org_path, recv_msg->org_path, res_msg.origin_path_size);
+                               res_msg.dst_path[0] = '\0';
+                               res_msg.dest_path_size = 1;
+                               res_msg.thumb_data = (unsigned char *)"\0";
+                               res_msg.thumb_size = 1;
+
+                               int buf_size = 0;
+                               unsigned char *buf = NULL;
+                               _ms_thumb_set_buffer(&res_msg, &buf, &buf_size);
+
+                               if (send(client_sock, buf, buf_size, 0) != buf_size) {
+                                       MS_DBG_STRERROR("sendto failed");
+                               } else {
+                                       MS_DBG("Sent Refuse msg from %s", recv_msg->org_path);
+                               }
+
+                               close(client_sock);
+                               MS_SAFE_FREE(req->recv_msg);
+                               MS_SAFE_FREE(req);
+                               MS_SAFE_FREE(buf);
+
+                               return TRUE;
+                       }
                }
        } else {
                MS_DBG_ERR("recv_msg is NULL from queue request");
@@ -828,19 +941,34 @@ gboolean _ms_thumb_request_to_server(gpointer data)
        res_msg.dest_path_size = strlen(res_msg.dst_path) + 1;
 
        int buf_size = 0;
+       int sending_block = 0;
+       int block_size = sizeof(res_msg) - MAX_FILEPATH_LEN*2 - sizeof(unsigned char *);
        unsigned char *buf = NULL;
        _ms_thumb_set_buffer(&res_msg, &buf, &buf_size);
 
-       if (send(client_sock, buf, buf_size, 0) != buf_size) {
-               MS_DBG_ERR("sendto failed : %s", strerror(errno));
-       } else {
-               MS_DBG("Sent %s(%d) from %s \n", res_msg.dst_path, strlen(res_msg.dst_path), res_msg.org_path);
+       while(buf_size > 0) {
+               if(buf_size < MS_SOCK_BLOCK_SIZE) {
+                       block_size = buf_size;
+               }
+               if (send(client_sock, buf+sending_block, block_size, 0) != block_size) {
+                       MS_DBG_ERR("sendto failed : %s", strerror(errno));
+               }
+               sending_block += block_size;
+               buf_size -= block_size;
+               if(block_size < MS_SOCK_BLOCK_SIZE) {
+                       block_size = MS_SOCK_BLOCK_SIZE;
+               }
+       }
+       if(buf_size == 0) {
+               MS_DBG_SLOG("Sent data(%d) from %s", res_msg.thumb_size, res_msg.org_path);
        }
 
        close(client_sock);
        MS_SAFE_FREE(buf);
        MS_SAFE_FREE(req->recv_msg);
        MS_SAFE_FREE(req);
+       if(res_msg.thumb_size > 1)
+               MS_SAFE_FREE(res_msg.thumb_data);
 
        return TRUE;
 }
@@ -852,9 +980,11 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
        struct sockaddr_un client_addr;
        unsigned int client_addr_len;
        thumbMsg *recv_msg = NULL;
-       int header_size = 0;
        int sock = -1;
        int client_sock = -1;
+       unsigned char *buf = NULL;
+       int recv_msg_len = 0;
+
        struct ucred cr;
        int cl = sizeof(struct ucred);
        
@@ -864,7 +994,6 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
                return TRUE;
        }
 
-       header_size = sizeof(thumbMsg) - MAX_MSG_SIZE*2;
        client_addr_len = sizeof(client_addr);
 
        if ((client_sock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_len)) < 0) {
@@ -881,7 +1010,7 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
                return TRUE;
        }
 
-       if (_ms_thumb_recv_msg(client_sock, header_size, recv_msg) < 0) {
+       if (_ms_thumb_recv_msg(client_sock, recv_msg) < 0) {
                MS_DBG_ERR("_ms_thumb_recv_msg failed ");
                close(client_sock);
                MS_SAFE_FREE(recv_msg);
@@ -908,8 +1037,8 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
        thumb_req->client_sock = client_sock;
        thumb_req->recv_msg = recv_msg;
 
-       if (recv_msg->msg_type == 3 || recv_msg->msg_type == 4) { // THUMB_REQUEST_CANCEL_MEDIA || THUMB_REQUEST_CANCEL_ALL
-               _ms_thumb_cancle_request(thumb_req);
+       if (recv_msg->msg_type == 3 || recv_msg->msg_type == 4  || recv_msg->msg_type == 8  || recv_msg->msg_type == 9) { // THUMB_REQUEST_CANCEL_MEDIA || THUMB_REQUEST_CANCEL_ALL || THUMB_REQUEST_CANCEL_ALL_RAW_DATA
+               _ms_thumb_cancel_request(thumb_req);
                return TRUE;
        }
 
@@ -925,10 +1054,12 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
 
                res_msg.msg_type = 6; // THUMB_RESPONSE
                res_msg.status = 1; //THUMB_FAIL
-               res_msg.org_path[0] = '\0';
-               res_msg.origin_path_size = 0;
+               res_msg.origin_path_size = strlen(recv_msg->org_path);
+               strncpy(res_msg.org_path, recv_msg->org_path, res_msg.origin_path_size);
                res_msg.dst_path[0] = '\0';
-               res_msg.dest_path_size = 0;
+               res_msg.dest_path_size = 1;
+               res_msg.thumb_data = (unsigned char *)"\0";
+               res_msg.dest_path_size = 1;
 
                int buf_size = 0;
                unsigned char *buf = NULL;
@@ -962,7 +1093,6 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src,
 
        return TRUE;
 }
-#endif
 
 gboolean _ms_thumb_agent_prepare_tcp_socket(int *sock_fd)
 {