4 * Copyright (c) 2013 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.
21 #include <command_channel.h>
22 #include <client_common.h>
23 #include <command_common.h>
24 #include <sensor_info.h>
25 #include <sensor_info_manager.h>
27 command_channel::command_channel()
28 : m_client_id(CLIENT_ID_INVALID)
29 , m_sensor_id(UNKNOWN_SENSOR)
33 command_channel::~command_channel()
35 if (m_command_socket.is_valid())
36 m_command_socket.close();
39 bool command_channel::command_handler(cpacket *packet, void **return_payload)
41 if (!m_command_socket.is_valid()) {
42 _E("Command socket(%d) is not valid for client %s", m_command_socket.get_socket_fd(), get_client_name());
46 if (packet->size() == 0) {
47 _E("Packet is not valid for client %s", get_client_name());
51 if (m_command_socket.send(packet->packet(), packet->size()) <= 0) {
52 m_command_socket.close();
53 _E("Failed to send command in client %s", get_client_name());
59 if (m_command_socket.recv(&header, sizeof(header)) <= 0) {
60 m_command_socket.close();
61 _E("Failed to receive header for command reply packet in client %s", get_client_name());
65 char *buffer = new(std::nothrow) char[header.size];
66 retvm_if(!buffer, false, "Failed to allocate memory");
68 if (m_command_socket.recv(buffer, header.size) <= 0) {
69 m_command_socket.close();
70 _E("Failed to receive command reply packet in client %s", get_client_name());
75 *return_payload = buffer;
80 bool command_channel::create_channel(void)
82 const int cllient_type = CLIENT_TYPE_SENSOR_CLIENT;
83 if (!m_command_socket.create(SOCK_STREAM))
86 if (!m_command_socket.connect(COMMAND_CHANNEL_PATH)) {
87 _E("Failed to connect command channel for client %s, command socket fd[%d]", get_client_name(), m_command_socket.get_socket_fd());
91 m_command_socket.set_connection_mode();
93 if (m_command_socket.send(&cllient_type, sizeof(cllient_type)) <= 0) {
94 _E("Failed to send client type in client %s, command socket fd[%d]", get_client_name(), m_command_socket.get_socket_fd());
101 void command_channel::set_client_id(int client_id)
103 m_client_id = client_id;
106 bool command_channel::cmd_get_id(int &client_id)
109 cmd_get_id_t *cmd_get_id;
110 cmd_get_id_done_t *cmd_get_id_done;
112 packet = new(std::nothrow) cpacket(sizeof(cmd_get_id_t));
113 retvm_if(!packet, false, "Failed to allocate memory");
115 packet->set_cmd(CMD_GET_ID);
117 cmd_get_id = (cmd_get_id_t *)packet->data();
119 get_proc_name(getpid(), cmd_get_id->name);
121 _I("%s send cmd_get_id()", get_client_name());
123 if (!command_handler(packet, (void **)&cmd_get_id_done)) {
124 _E("Client %s failed to send/receive command", get_client_name());
129 if (cmd_get_id_done->client_id < 0) {
130 _E("Client %s failed to get client_id[%d] from server",
131 get_client_name(), cmd_get_id_done->client_id);
132 delete[] (char *)cmd_get_id_done;
137 client_id = cmd_get_id_done->client_id;
139 delete[] (char *)cmd_get_id_done;
145 bool command_channel::cmd_get_sensor_list(void)
148 cmd_get_sensor_list_done_t *cmd_get_sensor_list_done;
150 packet.set_payload_size(sizeof(cmd_get_sensor_list_t));
151 packet.set_cmd(CMD_GET_SENSOR_LIST);
153 _I("%s send cmd_get_sensor_list", get_client_name());
155 if (!command_handler(&packet, (void **)&cmd_get_sensor_list_done)) {
156 _E("Client %s failed to send/receive command", get_client_name());
161 const size_t *size_field;
162 const char *raw_data_field;
164 sensor_cnt = cmd_get_sensor_list_done->sensor_cnt;
165 size_field = (const size_t *)cmd_get_sensor_list_done->data;
166 raw_data_field = (const char *)size_field + (sizeof(size_t) * sensor_cnt);
171 for (int i = 0; i < sensor_cnt; ++i) {
172 info = new(std::nothrow) sensor_info;
175 _E("Failed to allocate memory");
176 delete[] (char *)cmd_get_sensor_list_done;
180 info->set_raw_data(raw_data_field + idx, size_field[i]);
181 sensor_info_manager::get_instance().add_info(info);
182 idx += size_field[i];
185 delete[] (char *)cmd_get_sensor_list_done;
189 bool command_channel::cmd_hello(sensor_id_t sensor)
192 cmd_hello_t *cmd_hello;
193 cmd_done_t *cmd_done;
195 packet = new(std::nothrow) cpacket(sizeof(cmd_hello_t));
196 retvm_if(!packet, false, "Failed to allocate memory");
198 packet->set_cmd(CMD_HELLO);
200 cmd_hello = (cmd_hello_t*)packet->data();
201 cmd_hello->client_id = m_client_id;
202 cmd_hello->sensor = sensor;
204 _I("%s send cmd_hello(client_id=%d, %s)",
205 get_client_name(), m_client_id, get_sensor_name(sensor));
207 if (!command_handler(packet, (void **)&cmd_done)) {
208 _E("Client %s failed to send/receive command for sensor[%s]",
209 get_client_name(), get_sensor_name(sensor));
214 if (cmd_done->value < 0) {
215 _W("client %s got value[%d] from server with sensor [%s]",
216 get_client_name(), cmd_done->value, get_sensor_name(sensor));
218 delete[] (char *)cmd_done;
223 delete[] (char *)cmd_done;
226 m_sensor_id = sensor;
231 bool command_channel::cmd_byebye(void)
234 cmd_done_t *cmd_done;
236 packet = new(std::nothrow) cpacket(sizeof(cmd_byebye_t));
237 retvm_if(!packet, false, "Failed to allocate memory");
239 packet->set_cmd(CMD_BYEBYE);
241 _I("%s send cmd_byebye(client_id=%d, %s)",
242 get_client_name(), m_client_id, get_sensor_name(m_sensor_id));
244 if (!command_handler(packet, (void **)&cmd_done)) {
245 _E("Client %s failed to send/receive command for sensor[%s] with client_id [%d]",
246 get_client_name(), get_sensor_name(m_sensor_id), m_client_id);
251 if (cmd_done->value < 0) {
252 _E("Client %s got error[%d] from server for sensor[%s] with client_id [%d]",
253 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), m_client_id);
255 delete[] (char *)cmd_done;
260 delete[] (char *)cmd_done;
263 if (m_command_socket.is_valid())
264 m_command_socket.close();
266 m_client_id = CLIENT_ID_INVALID;
267 m_sensor_id = UNKNOWN_SENSOR;
272 bool command_channel::cmd_start(void)
275 cmd_done_t *cmd_done;
277 packet = new(std::nothrow) cpacket(sizeof(cmd_start_t));
278 retvm_if(!packet, false, "Failed to allocate memory");
280 packet->set_cmd(CMD_START);
282 _I("%s send cmd_start(client_id=%d, %s)",
283 get_client_name(), m_client_id, get_sensor_name(m_sensor_id));
285 if (!command_handler(packet, (void **)&cmd_done)) {
286 _E("Client %s failed to send/receive command for sensor[%s] with client_id [%d]",
287 get_client_name(), get_sensor_name(m_sensor_id), m_client_id);
292 if (cmd_done->value < 0) {
293 _E("Client %s got error[%d] from server for sensor[%s] with client_id [%d]",
294 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), m_client_id);
296 delete[] (char *)cmd_done;
301 delete[] (char *)cmd_done;
307 bool command_channel::cmd_stop(void)
310 cmd_done_t *cmd_done;
312 packet = new(std::nothrow) cpacket(sizeof(cmd_stop_t));
313 retvm_if(!packet, false, "Failed to allocate memory");
315 packet->set_cmd(CMD_STOP);
317 _I("%s send cmd_stop(client_id=%d, %s)",
318 get_client_name(), m_client_id, get_sensor_name(m_sensor_id));
320 if (!command_handler(packet, (void **)&cmd_done)) {
321 _E("Client %s failed to send/receive command for sensor[%s] with client_id [%d]",
322 get_client_name(), get_sensor_name(m_sensor_id), m_client_id);
327 if (cmd_done->value < 0) {
328 _E("Client %s got error[%d] from server for sensor[%s] with client_id [%d]",
329 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), m_client_id);
331 delete[] (char *)cmd_done;
336 delete[] (char *)cmd_done;
342 bool command_channel::cmd_set_pause_policy(int pause_policy)
345 cmd_set_pause_policy_t *cmd_set_pause_policy;
346 cmd_done_t *cmd_done;
348 packet = new(std::nothrow) cpacket(sizeof(cmd_set_pause_policy_t));
349 retvm_if(!packet, false, "Failed to allocate memory");
351 packet->set_cmd(CMD_SET_PAUSE_POLICY);
353 cmd_set_pause_policy = (cmd_set_pause_policy_t*)packet->data();
354 cmd_set_pause_policy->pause_policy = pause_policy;
356 _I("%s send cmd_set_pause_policy(client_id=%d, %s, pause_policy=%d)",
357 get_client_name(), m_client_id, get_sensor_name(m_sensor_id), pause_policy);
359 if (!command_handler(packet, (void **)&cmd_done)) {
360 _E("Client %s failed to send/receive command for sensor[%s] with client_id [%d], pause_policy[%d]",
361 get_client_name(), get_sensor_name(m_sensor_id), m_client_id, pause_policy);
366 if (cmd_done->value < 0) {
367 _E("Client %s got error[%d] from server for sensor[%s] with client_id [%d], pause_policy[%d]",
368 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), m_client_id, pause_policy);
370 delete[] (char *)cmd_done;
375 delete[] (char *)cmd_done;
381 bool command_channel::cmd_register_event(unsigned int event_type)
385 cmd_done_t *cmd_done;
387 packet = new(std::nothrow) cpacket(sizeof(cmd_reg_t));
388 retvm_if(!packet, false, "Failed to allocate memory");
390 packet->set_cmd(CMD_REG);
392 cmd_reg = (cmd_reg_t*)packet->data();
393 cmd_reg->event_type = event_type;
395 _I("%s send cmd_register_event(client_id=%d, %s)",
396 get_client_name(), m_client_id, get_event_name(event_type));
398 if (!command_handler(packet, (void **)&cmd_done)) {
399 _E("Client %s failed to send/receive command with client_id [%d], event_type[%s]",
400 get_client_name(), m_client_id, get_event_name(event_type));
405 if (cmd_done->value < 0) {
406 _E("Client %s got error[%d] from server with client_id [%d], event_type[%s]",
407 get_client_name(), cmd_done->value, m_client_id, get_event_name(event_type));
409 delete[] (char *)cmd_done;
414 delete[] (char *)cmd_done;
420 bool command_channel::cmd_register_events(event_type_vector &event_vec)
422 auto it_event = event_vec.begin();
424 while (it_event != event_vec.end()) {
425 if (!cmd_register_event(*it_event))
434 bool command_channel::cmd_unregister_event(unsigned int event_type)
437 cmd_unreg_t *cmd_unreg;
438 cmd_done_t *cmd_done;
440 packet = new(std::nothrow) cpacket(sizeof(cmd_unreg_t));
441 retvm_if(!packet, false, "Failed to allocate memory");
443 packet->set_cmd(CMD_UNREG);
445 cmd_unreg = (cmd_unreg_t*)packet->data();
446 cmd_unreg->event_type = event_type;
448 _I("%s send cmd_unregister_event(client_id=%d, %s)",
449 get_client_name(), m_client_id, get_event_name(event_type));
451 if (!command_handler(packet, (void **)&cmd_done)) {
452 _E("Client %s failed to send/receive command with client_id [%d], event_type[%s]",
453 get_client_name(), m_client_id, get_event_name(event_type));
458 if (cmd_done->value < 0) {
459 _E("Client %s got error[%d] from server with client_id [%d], event_type[%s]",
460 get_client_name(), cmd_done->value, m_client_id, get_event_name(event_type));
462 delete[] (char *)cmd_done;
467 delete[] (char *)cmd_done;
473 bool command_channel::cmd_unregister_events(event_type_vector &event_vec)
475 auto it_event = event_vec.begin();
477 while (it_event != event_vec.end()) {
478 if (!cmd_unregister_event(*it_event))
487 bool command_channel::cmd_set_batch(unsigned int interval, unsigned int latency)
490 cmd_set_batch_t *cmd_set_batch;
491 cmd_done_t *cmd_done;
493 packet = new(std::nothrow) cpacket(sizeof(cmd_set_batch_t));
494 retvm_if(!packet, false, "Failed to allocate memory");
496 packet->set_cmd(CMD_SET_BATCH);
498 cmd_set_batch = (cmd_set_batch_t*)packet->data();
499 cmd_set_batch->interval = interval;
500 cmd_set_batch->latency = latency;
502 _I("%s send cmd_set_batch(client_id=%d, %s, interval=%d, latency = %d)",
503 get_client_name(), m_client_id, get_sensor_name(m_sensor_id), interval, latency);
505 if (!command_handler(packet, (void **)&cmd_done)) {
506 _E("%s failed to send/receive command for sensor[%s] with client_id [%d], interval[%d], latency[%d]",
507 get_client_name(), get_sensor_name(m_sensor_id), m_client_id, interval, latency);
512 if (cmd_done->value < 0) {
513 _E("%s got error[%d] from server for sensor[%s] with client_id [%d], interval[%d], latency[%d]",
514 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), m_client_id, interval, latency);
516 delete[] (char *)cmd_done;
521 delete[] (char *)cmd_done;
527 bool command_channel::cmd_unset_batch(void)
530 cmd_done_t *cmd_done;
532 packet = new(std::nothrow) cpacket(sizeof(cmd_unset_batch_t));
533 retvm_if(!packet, false, "Failed to allocate memory");
535 packet->set_cmd(CMD_UNSET_BATCH);
537 _I("%s send cmd_unset_batch(client_id=%d, %s)",
538 get_client_name(), m_client_id, get_sensor_name(m_sensor_id));
540 if (!command_handler(packet, (void **)&cmd_done)) {
541 _E("Client %s failed to send/receive command for sensor[%s] with client_id [%d]",
542 get_client_name(), get_sensor_name(m_sensor_id), m_client_id);
547 if (cmd_done->value < 0) {
548 _E("Client %s got error[%d] from server for sensor[%s] with client_id [%d]",
549 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), m_client_id);
551 delete[] (char *)cmd_done;
556 delete[] (char *)cmd_done;
562 bool command_channel::cmd_get_data(unsigned int type, sensor_data_t* sensor_data)
565 cmd_get_data_t *cmd_get_data;
566 cmd_get_data_done_t *cmd_get_data_done;
568 packet = new(std::nothrow) cpacket(sizeof(cmd_get_data_done_t));
569 retvm_if(!packet, false, "Failed to allocate memory");
571 packet->set_cmd(CMD_GET_DATA);
573 cmd_get_data = (cmd_get_data_t*)packet->data();
574 cmd_get_data->type = type;
576 if (!command_handler(packet, (void **)&cmd_get_data_done)) {
577 _E("Client %s failed to send/receive command with client_id [%d]",
578 get_client_name(), m_client_id);
583 if (cmd_get_data_done->state < 0 ) {
584 _E("Client %s got error[%d] from server with client_id [%d]",
585 get_client_name(), cmd_get_data_done->state, m_client_id);
586 sensor_data->accuracy = SENSOR_ACCURACY_UNDEFINED;
587 sensor_data->timestamp = 0;
588 sensor_data->value_count = 0;
589 delete[] (char *)cmd_get_data_done;
594 memcpy(sensor_data, &cmd_get_data_done->base_data, sizeof(sensor_data_t));
596 delete[] (char *)cmd_get_data_done;
602 bool command_channel::cmd_set_attribute_int(int attribute, int value)
605 cmd_set_attribute_int_t *cmd_set_attribute_int;
606 cmd_done_t *cmd_done;
608 packet = new(std::nothrow) cpacket(sizeof(cmd_set_attribute_int_t));
609 retvm_if(!packet, false, "Failed to allocate memory");
611 packet->set_cmd(CMD_SET_ATTRIBUTE_INT);
613 cmd_set_attribute_int = (cmd_set_attribute_int_t*)packet->data();
614 cmd_set_attribute_int->attribute = attribute;
615 cmd_set_attribute_int->value = value;
617 _I("%s send cmd_set_attribute_int(client_id=%d, %s, %#x, %d)",
618 get_client_name(), m_client_id, get_sensor_name(m_sensor_id), attribute, value);
620 if (!command_handler(packet, (void **)&cmd_done)) {
621 _E("Client %s failed to send/receive command for sensor[%s] with client_id [%d], attribute[%#x], value[%d]",
622 get_client_name(), get_sensor_name(m_sensor_id), m_client_id, attribute, value);
627 if (cmd_done->value < 0) {
628 _E("Client %s got error[%d] from server for sensor[%s] with attribute[%#x], value[%d]",
629 get_client_name(), cmd_done->value, get_sensor_name(m_sensor_id), attribute, value);
631 delete[] (char *)cmd_done;
636 delete[] (char *)cmd_done;
642 bool command_channel::cmd_set_attribute_str(int attribute, const char* value, int len)
645 cmd_set_attribute_str_t *cmd_set_attribute_str;
646 cmd_done_t *cmd_done;
648 packet = new(std::nothrow) cpacket(sizeof(cmd_set_attribute_str_t) + len);
649 retvm_if(!packet, false, "Failed to allocate memory");
651 packet->set_cmd(CMD_SET_ATTRIBUTE_STR);
653 cmd_set_attribute_str = (cmd_set_attribute_str_t*)packet->data();
654 cmd_set_attribute_str->attribute = attribute;
655 cmd_set_attribute_str->len = len;
656 memcpy(cmd_set_attribute_str->value, value, len);
658 _I("%s send cmd_set_attribute_str(client_id=%d, attribute = %#x, value_len = %d, value = %#x)",
659 get_client_name(), m_client_id, attribute, len, value);
661 if (!command_handler(packet, (void **)&cmd_done)) {
662 _E("%s failed to send/receive command with client_id [%d]",
663 get_client_name(), m_client_id);
668 if (cmd_done->value < 0) {
669 _E("%s got error[%d] from server with client_id [%d]",
670 get_client_name(), cmd_done->value, m_client_id);
672 delete[] (char *)cmd_done;
677 delete[] (char *)cmd_done;
682 bool command_channel::cmd_flush(void)
685 cmd_done_t *cmd_done;
687 packet = new(std::nothrow) cpacket(sizeof(cmd_flush_t));
688 retvm_if(!packet, false, "Failed to allocate memory");
690 packet->set_cmd(CMD_FLUSH);
692 _I("%s send cmd_flush(client_id=%d)", get_client_name(), m_client_id);
694 if (!command_handler(packet, (void **)&cmd_done)) {
695 _E("%s failed to send flush with client_id [%d]",
696 get_client_name(), m_client_id);
701 if (cmd_done->value < 0) {
702 _E("%s got error[%d] from server with client_id [%d]",
703 get_client_name(), cmd_done->value, m_client_id);
705 delete [] (char *)cmd_done;
710 delete [] (char *)cmd_done;