4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Yong Yeon Kim <yy9875.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include <sys/types.h>
27 #include "media-util.h"
28 #include "media-server-ipc.h"
29 #include "media-common-types.h"
30 #include "media-common-utils.h"
31 #include "media-common-db-svc.h"
32 #include "media-scanner-dbg.h"
33 #include "media-scanner-socket.h"
34 #include "media-scanner-scan.h"
36 gboolean msc_receive_request(GIOChannel *src, GIOCondition condition, gpointer data)
38 ms_comm_msg_s *recv_msg = NULL;
39 int sockfd = MS_SOCK_NOT_ALLOCATE;
42 sockfd = g_io_channel_unix_get_fd(src);
43 MS_DBG_RETVM_IF(sockfd < 0, G_SOURCE_CONTINUE, "sock fd is invalid!");
45 recv_msg = g_new0(ms_comm_msg_s, 1);
47 /* read() is blocked until media scanner sends message */
48 err = read(sockfd, recv_msg, sizeof(ms_comm_msg_s));
50 MS_DBG_STRERROR("fifo read failed");
52 return G_SOURCE_CONTINUE;
55 if (strlen(recv_msg->msg) == 0 || strlen(recv_msg->msg) >= MAX_MSG_SIZE) {
56 MS_DBG_ERR("msg size is invalid");
58 return G_SOURCE_CONTINUE;
61 if (strlen(recv_msg->storage_id) >= MS_UUID_SIZE) {
62 MS_DBG_ERR("storage_id size is invalid");
64 return G_SOURCE_CONTINUE;
67 MS_DBG_SLOG("receive msg from [%d][%d] M[%.*s] S[%.*s]", recv_msg->pid, recv_msg->msg_type, MAX_MSG_SIZE, recv_msg->msg, MS_UUID_SIZE, recv_msg->storage_id);
69 switch (recv_msg->msg_type) {
70 case MS_MSG_BULK_INSERT:
71 msc_push_scan_request(MS_SCAN_REGISTER, recv_msg);
73 case MS_MSG_DIRECTORY_SCANNING:
74 case MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE:
75 msc_push_scan_request(MS_SCAN_DIRECTORY, recv_msg);
77 case MS_MSG_STORAGE_ALL:
78 case MS_MSG_STORAGE_PARTIAL:
79 case MS_MSG_STORAGE_INVALID:
80 msc_push_scan_request(MS_SCAN_STORAGE, recv_msg);
82 case MS_MSG_DIRECTORY_SCANNING_CANCEL:
83 msc_remove_dir_scan_request(recv_msg);
86 case MS_MSG_STORAGE_META:
87 msc_metadata_update_thread(recv_msg);
90 MS_DBG_ERR("THIS REQUEST IS INVALID %d", recv_msg->msg_type);
98 return G_SOURCE_CONTINUE;
101 int msc_send_ready(void)
103 int ret = MS_MEDIA_ERR_NONE;
104 ms_comm_msg_s send_msg;
107 fd = open(MS_SCANNER_FIFO_PATH_RES, O_WRONLY);
108 MS_DBG_RETVM_IF(fd < 0, MS_MEDIA_ERR_INTERNAL, "fifo open failed");
110 /* send ready message */
111 memset(&send_msg, 0, sizeof(send_msg));
112 send_msg.msg_type = MS_MSG_SCANNER_READY;
114 /* send ready message */
115 if (write(fd, &send_msg, sizeof(send_msg)) < 0) {
116 MS_DBG_STRERROR("fifo write failed");
117 ret = MS_MEDIA_ERR_INTERNAL;
125 int msc_send_result(int result, ms_comm_msg_s *res_data)
127 int ret = MS_MEDIA_ERR_NONE;
128 ms_comm_msg_s send_msg;
131 fd = open(MS_SCANNER_FIFO_PATH_RES, O_WRONLY);
132 MS_DBG_RETVM_IF(fd < 0, MS_MEDIA_ERR_INTERNAL, "fifo open failed");
134 /* send result message */
135 memset(&send_msg, 0x0, sizeof(ms_comm_msg_s));
136 send_msg.msg_type = MS_MSG_SCANNER_BULK_RESULT;
137 send_msg.pid = res_data->pid;
138 send_msg.result = result;
139 send_msg.uid = res_data->uid;
140 SAFE_STRLCPY(send_msg.msg, res_data->msg, sizeof(send_msg.msg));
142 /* send ready message */
143 if (write(fd, &send_msg, sizeof(send_msg)) < 0) {
144 MS_DBG_STRERROR("fifo write failed");
145 ret = MS_MEDIA_ERR_INTERNAL;