4 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include <command_common.h>
20 #include <sensor_types.h>
21 #include <external_data_channel.h>
25 external_data_channel::external_data_channel()
26 : m_client_id(CLIENT_ID_INVALID)
27 , m_sensor_id(UNKNOWN_SENSOR)
31 external_data_channel::~external_data_channel()
36 bool external_data_channel::command_handler(cpacket *packet, void **return_payload)
41 if (!m_socket.is_valid()) {
42 _E("Socket(%d) is not valid for client %s", m_socket.get_socket_fd(), get_client_name());
46 if (!packet->size()) {
47 _E("Packet is not valid for client %s", get_client_name());
51 if (m_socket.send(packet->packet(), packet->size()) <= 0) {
53 _E("Failed to send command in client %s", get_client_name());
57 if (m_socket.recv(&header, sizeof(header)) <= 0) {
59 _E("Failed to receive header for command packet in client %s", get_client_name());
63 buffer = new(std::nothrow) char[header.size];
64 retvm_if(!buffer, false, "Failed to allocate memory");
66 if (m_socket.recv(buffer, header.size) <= 0) {
68 _E("Failed to receive command packet in client %s", get_client_name());
73 *return_payload = buffer;
78 bool external_data_channel::create_channel(void)
80 const int client_type = CLIENT_TYPE_EXTERNAL_SOURCE;
82 if (!m_socket.create(SOCK_STREAM)) {
83 _E("Failed to create external data channel for client %s", get_client_name());
87 if (!m_socket.connect(COMMAND_CHANNEL_PATH)) {
88 _E("Failed to connect external data channel for client %s, command socket fd[%d]", get_client_name(), m_socket.get_socket_fd());
92 m_socket.set_connection_mode();
94 if (m_socket.send(&client_type, sizeof(client_type)) <= 0) {
95 _E("Failed to send client type in client %s, command socket fd[%d]", get_client_name(), m_socket.get_socket_fd());
102 void external_data_channel::set_client_id(int client_id)
104 m_client_id = client_id;
107 bool external_data_channel::cmd_get_id(int &client_id)
110 cmd_ext_get_id_t *cmd_ext_get_id;
111 cmd_ext_get_id_done_t *cmd_ext_get_id_done;
113 packet = new(std::nothrow) cpacket(sizeof(cmd_ext_get_id_t));
114 retvm_if(!packet, false, "Failed to allocate memory");
116 packet->set_cmd(CMD_EXT_GET_ID);
118 cmd_ext_get_id = (cmd_ext_get_id_t *)packet->data();
120 get_proc_name(getpid(), cmd_ext_get_id->name);
122 _I("%s send cmd_get_id()", get_client_name());
124 if (!command_handler(packet, (void **)&cmd_ext_get_id_done)) {
125 _E("Client %s failed to send/receive command", get_client_name());
130 if (cmd_ext_get_id_done->client_id < 0) {
131 _E("Client %s failed to get client_id[%d] from server",
132 get_client_name(), cmd_ext_get_id_done->client_id);
133 delete[] (char *)cmd_ext_get_id_done;
138 client_id = cmd_ext_get_id_done->client_id;
140 delete[] (char *)cmd_ext_get_id_done;
146 bool external_data_channel::cmd_connect(const string &key, sensor_id_t &sensor_id)
149 cmd_ext_connect_t *cmd_ext_connect;
150 cmd_ext_connect_done_t *cmd_ext_connect_done;
152 int key_size = key.size();
154 if ((key_size == 0) || (key_size >= NAME_MAX)) {
155 _I("Key(%s) is not valid", key.c_str());
159 packet = new(std::nothrow) cpacket(sizeof(cmd_ext_connect_t));
160 retvm_if(!packet, false, "Failed to allocate memory");
162 packet->set_cmd(CMD_EXT_CONNECT);
164 cmd_ext_connect = (cmd_ext_connect_t *)packet->data();
165 cmd_ext_connect->client_id = m_client_id;
166 strncpy(cmd_ext_connect->key, key.c_str(), NAME_MAX-1);
168 _I("%s send cmd_get_connect(key = %s, client_id = %d)", get_client_name(), key.c_str(), m_client_id);
170 if (!command_handler(packet, (void **)&cmd_ext_connect_done)) {
171 _E("Client %s failed to send/receive command", get_client_name());
176 if (cmd_ext_connect_done->sensor_id == UNKNOWN_SENSOR) {
177 _E("Client %s failed to connect to external sensor", get_client_name());
178 delete[] (char *)cmd_ext_connect_done;
183 m_sensor_id = sensor_id = cmd_ext_connect_done->sensor_id;
185 delete[] (char *)cmd_ext_connect_done;
191 bool external_data_channel::cmd_disconnect(void)
194 cmd_ext_done_t *cmd_ext_done;
196 packet = new(std::nothrow) cpacket(sizeof(cmd_ext_disconnect_t));
197 retvm_if(!packet, false, "Failed to allocate memory");
199 packet->set_cmd(CMD_EXT_DISCONNECT);
201 _I("%s send cmd_disconnect(client_id=%d)", get_client_name(), m_client_id);
203 if (!command_handler(packet, (void **)&cmd_ext_done)) {
204 _E("Client %s failed to send/receive command with client_id [%d]",
205 get_client_name(), m_client_id);
210 if (cmd_ext_done->value < 0) {
211 _E("Client %s got error[%d] from server with client_id [%d]",
212 get_client_name(), cmd_ext_done->value, m_client_id);
214 delete[] (char *)cmd_ext_done;
219 delete[] (char *)cmd_ext_done;
223 m_client_id = CLIENT_ID_INVALID;
227 bool external_data_channel::cmd_post(unsigned long long timestamp, const float *data, int data_cnt)
230 cmd_ext_post_t *cmd_ext_post;
231 cmd_done_t *cmd_done;
233 packet = new(std::nothrow) cpacket(sizeof(cmd_ext_post_t) + sizeof(float) * data_cnt);
234 retvm_if(!packet, false, "Failed to allocate memory");
236 packet->set_cmd(CMD_EXT_POST);
238 cmd_ext_post = (cmd_ext_post_t*)packet->data();
239 cmd_ext_post->timestamp = timestamp;
240 cmd_ext_post->data_cnt = data_cnt;
241 memcpy(cmd_ext_post->data, data, sizeof(float) * data_cnt);
243 _I("%s send cmd_post(client_id=%d, data = %#x, data_cnt = %d)",
244 get_client_name(), m_client_id, data, data_cnt);
246 if (!command_handler(packet, (void **)&cmd_done)) {
247 _E("%s failed to send/receive command with client_id [%d]",
248 get_client_name(), m_client_id);
253 if (cmd_done->value < 0) {
254 _E("%s got error[%d] from server with client_id [%d]",
255 get_client_name(), cmd_done->value, m_client_id);
257 delete[] (char *)cmd_done;
262 delete[] (char *)cmd_done;