97d180e7a3756fb26aa660a6ec3d488ca98e12a4
[platform/core/multimedia/media-server.git] / src / scanner / media-scanner-socket.c
1 /*
2  *  Media Server
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Yong Yeon Kim <yy9875.kim@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <fcntl.h>
25 #include <malloc.h>
26
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"
35
36 gboolean msc_receive_request(GIOChannel *src, GIOCondition condition, gpointer data)
37 {
38         ms_comm_msg_s *recv_msg = NULL;
39         int sockfd = MS_SOCK_NOT_ALLOCATE;
40         int err = -1;
41
42         sockfd = g_io_channel_unix_get_fd(src);
43         MS_DBG_RETVM_IF(sockfd < 0, G_SOURCE_CONTINUE, "sock fd is invalid!");
44
45         recv_msg = g_new0(ms_comm_msg_s, 1);
46
47         /* read() is blocked until media scanner sends message */
48         err = read(sockfd, recv_msg, sizeof(ms_comm_msg_s));
49         if (err < 0) {
50                 MS_DBG_STRERROR("fifo read failed");
51                 g_free(recv_msg);
52                 return G_SOURCE_CONTINUE;
53         }
54
55         if (strlen(recv_msg->msg) == 0 || strlen(recv_msg->msg) >= MAX_MSG_SIZE) {
56                 MS_DBG_ERR("msg size is invalid");
57                 g_free(recv_msg);
58                 return G_SOURCE_CONTINUE;
59         }
60
61         if (strlen(recv_msg->storage_id) >= MS_UUID_SIZE) {
62                 MS_DBG_ERR("storage_id size is invalid");
63                 g_free(recv_msg);
64                 return G_SOURCE_CONTINUE;
65         }
66
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);
68
69         switch (recv_msg->msg_type) {
70         case MS_MSG_BULK_INSERT:
71                 msc_push_scan_request(MS_SCAN_REGISTER, recv_msg);
72                 break;
73         case MS_MSG_DIRECTORY_SCANNING:
74         case MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE:
75                 msc_push_scan_request(MS_SCAN_DIRECTORY, recv_msg);
76                 break;
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);
81                 break;
82         case MS_MSG_DIRECTORY_SCANNING_CANCEL:
83                 msc_remove_dir_scan_request(recv_msg);
84                 g_free(recv_msg);
85                 break;
86         case MS_MSG_STORAGE_META:
87                 msc_metadata_update_thread(recv_msg);
88                 break;
89         default:
90                 MS_DBG_ERR("THIS REQUEST IS INVALID %d", recv_msg->msg_type);
91                 g_free(recv_msg);
92                 break;
93         }
94
95         /*Active flush */
96         malloc_trim(0);
97
98         return G_SOURCE_CONTINUE;
99 }
100
101 int msc_send_ready(void)
102 {
103         int ret = MS_MEDIA_ERR_NONE;
104         ms_comm_msg_s send_msg;
105         int fd = -1;
106
107         fd = open(MS_SCANNER_FIFO_PATH_RES, O_WRONLY);
108         MS_DBG_RETVM_IF(fd < 0, MS_MEDIA_ERR_INTERNAL, "fifo open failed");
109
110         /* send ready message */
111         memset(&send_msg, 0, sizeof(send_msg));
112         send_msg.msg_type = MS_MSG_SCANNER_READY;
113
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;
118         }
119
120         close(fd);
121
122         return ret;
123 }
124
125 int msc_send_result(int result, ms_comm_msg_s *res_data)
126 {
127         int ret = MS_MEDIA_ERR_NONE;
128         ms_comm_msg_s send_msg;
129         int fd = -1;
130
131         fd = open(MS_SCANNER_FIFO_PATH_RES, O_WRONLY);
132         MS_DBG_RETVM_IF(fd < 0, MS_MEDIA_ERR_INTERNAL, "fifo open failed");
133
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));
141
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;
146         }
147
148         close(fd);
149
150         return ret;
151 }
152