Home | History | Annotate | Download | only in src
      1 /* Copyright (c) 2012-2014, 2016, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 // System dependencies
     31 #include <errno.h>
     32 #include <sys/socket.h>
     33 #include <fcntl.h>
     34 
     35 // Camera dependencies
     36 #include "mm_qcamera_socket.h"
     37 #include "mm_qcamera_commands.h"
     38 #include "mm_qcamera_dbg.h"
     39 
     40 #define IP_ADDR                  "127.0.0.1"
     41 #define TUNING_CHROMATIX_PORT     55555
     42 #define TUNING_PREVIEW_PORT       55556
     43 
     44 #define CURRENT_COMMAND_ACK_SUCCESS 1
     45 #define CURRENT_COMMAND_ACK_FAILURE 2
     46 
     47 pthread_t eztune_thread_id;
     48 
     49 static ssize_t tuneserver_send_command_rsp(tuningserver_t *tsctrl,
     50   char *send_buf, uint32_t send_len)
     51 {
     52   ssize_t rc;
     53 
     54   /* send ack back to client upon req */
     55   if (send_len <= 0) {
     56     LOGE("Invalid send len \n");
     57     return -1;
     58   }
     59   if (send_buf == NULL) {
     60     LOGE("Invalid send buf \n");
     61     return -1;
     62   }
     63 
     64   rc = send(tsctrl->clientsocket_id, send_buf, send_len, 0);
     65   if (rc < 0) {
     66     LOGE("RSP send returns error %s\n",  strerror(errno));
     67   } else {
     68     rc = 0;
     69   }
     70 
     71   if (send_buf != NULL) {
     72     free(send_buf);
     73     send_buf = NULL;
     74   }
     75   return rc;
     76 }
     77 
     78 static void release_eztune_prevcmd_rsp(eztune_prevcmd_rsp *pHead)
     79 {
     80   if (pHead != NULL ) {
     81     release_eztune_prevcmd_rsp((eztune_prevcmd_rsp *)pHead->next);
     82     free(pHead);
     83   }
     84 }
     85 
     86 static ssize_t tuneserver_ack(uint16_t a, uint32_t b, tuningserver_t *tsctrl)
     87 {
     88   ssize_t rc;
     89   char ack_1[6];
     90   /*Ack the command here*/
     91   memcpy(ack_1, &a, 2);
     92   memcpy(ack_1+2, &b, 4);
     93   /* send echo back to client upon accept */
     94   rc = send(tsctrl->clientsocket_id, &ack_1, sizeof(ack_1), 0);
     95   if (rc < 0) {
     96     LOGE(" eztune_server_run: send returns error %s\n",
     97       strerror(errno));
     98     return rc;
     99   } else if (rc < (int32_t)sizeof(ack_1)) {
    100     /*Shouldn't hit this for packets <1K; need to re-send if we do*/
    101   }
    102   return 0;
    103 }
    104 
    105 static ssize_t tuneserver_send_command_ack( uint8_t ack,
    106     tuningserver_t *tsctrl)
    107 {
    108   ssize_t rc;
    109   /* send ack back to client upon req */
    110   rc = send(tsctrl->clientsocket_id, &ack, sizeof(ack), 0);
    111   if (rc < 0) {
    112     LOGE("ACK send returns error %s\n",  strerror(errno));
    113     return rc;
    114   }
    115   return 0;
    116 }
    117 
    118 /** tuneserver_process_command
    119  *    @tsctrl: the server control object
    120  *
    121  *  Processes the command that the client sent
    122  *
    123  *  Return: >=0 on success, -1 on failure.
    124  **/
    125 static int32_t tuneserver_process_command(tuningserver_t *tsctrl,
    126   char *send_buf, uint32_t send_len)
    127 {
    128   tuneserver_protocol_t *p = tsctrl->proto;
    129   int result = 0;
    130 
    131   LOGD(" Current command is %d\n",  p->current_cmd);
    132   switch (p->current_cmd) {
    133   case TUNESERVER_GET_LIST:
    134     if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
    135       LOGE(" Ack Failed for cmd %d\n",  p->current_cmd);
    136       return -1;
    137     }
    138     result = tuneserver_process_get_list_cmd(tsctrl, p->recv_buf,
    139       send_buf, send_len);
    140     if (result < 0) {
    141       LOGE(" RSP processing Failed for cmd %d\n",  p->current_cmd);
    142       return -1;
    143     }
    144     if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
    145       LOGE(" RSP Failed for cmd %d\n",  p->current_cmd);
    146       return -1;
    147     }
    148     break;
    149 
    150   case TUNESERVER_GET_PARMS:
    151     if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
    152       LOGE(" Ack Failed for cmd %d\n",  p->current_cmd);
    153       return -1;
    154     }
    155     result = tuneserver_process_get_params_cmd(tsctrl, p->recv_buf,
    156       send_buf, send_len);
    157     if (result < 0) {
    158       LOGE(" RSP processing Failed for cmd %d\n",  p->current_cmd);
    159       return -1;
    160     }
    161     if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
    162       LOGE(" RSP Failed for cmd %d\n",  p->current_cmd);
    163       return -1;
    164     }
    165     break;
    166 
    167   case TUNESERVER_SET_PARMS:
    168     if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
    169       LOGE(" Ack Failed for cmd %d\n",  p->current_cmd);
    170       return -1;
    171     }
    172     result = tuneserver_process_set_params_cmd(tsctrl, p->recv_buf,
    173       send_buf, send_len);
    174     if (result < 0) {
    175       LOGE(" RSP processing Failed for cmd %d\n",  p->current_cmd);
    176       return -1;
    177     }
    178     if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
    179       LOGE(" RSP Failed for cmd %d\n",  p->current_cmd);
    180       return -1;
    181     }
    182     break;
    183 
    184   case TUNESERVER_MISC_CMDS: {
    185     if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
    186       LOGE(" Ack Failed for cmd %d\n",  p->current_cmd);
    187       return -1;
    188     }
    189     result = tuneserver_process_misc_cmd(tsctrl, p->recv_buf,
    190       send_buf, send_len);
    191     if (result < 0) {
    192       LOGE(" RSP processing Failed for cmd %d\n",  p->current_cmd);
    193       return -1;
    194     }
    195     if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
    196       LOGE(" RSP Failed for cmd %d\n",  p->current_cmd);
    197       return -1;
    198     }
    199     break;
    200   }
    201 
    202   default:
    203     if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
    204       LOGE(" Ack Failed for cmd %d\n",  p->current_cmd);
    205       return -1;
    206     }
    207     LOGE(" p->current_cmd: default\n");
    208     result = -1;
    209     break;
    210   }
    211 
    212   return result;
    213 }
    214 
    215 /** tuneserver_process_client_message
    216  *    @recv_buffer: received message from the client
    217  *    @tsctrl: the server control object
    218  *
    219  *  Processes the message from client and prepares for next
    220  *  message.
    221  *
    222  *  Return: >=0 on success, -1 on failure.
    223  **/
    224 static int32_t tuneserver_process_client_message(void *recv_buffer,
    225   tuningserver_t *tsctrl)
    226 {
    227   int rc = 0;
    228   tuneserver_protocol_t *p = tsctrl->proto;
    229 
    230   switch (tsctrl->proto->next_recv_code) {
    231   case TUNESERVER_RECV_COMMAND:
    232     p->current_cmd = *(uint16_t *)recv_buffer;
    233     p->next_recv_code = TUNESERVER_RECV_PAYLOAD_SIZE;
    234     p->next_recv_len = sizeof(uint32_t);
    235     break;
    236 
    237   case TUNESERVER_RECV_PAYLOAD_SIZE:
    238     p->next_recv_code = TUNESERVER_RECV_PAYLOAD;
    239     p->next_recv_len = *(uint32_t *)recv_buffer;
    240     p->recv_len = p->next_recv_len;
    241     if (p->next_recv_len > TUNESERVER_MAX_RECV)
    242       return -1;
    243     if (p->next_recv_len == 0) {
    244       p->next_recv_code = TUNESERVER_RECV_RESPONSE;
    245       p->next_recv_len = sizeof(uint32_t);
    246     }
    247     break;
    248 
    249   case TUNESERVER_RECV_PAYLOAD:
    250     p->recv_buf = malloc(p->next_recv_len);
    251     if (!p->recv_buf) {
    252       LOGE("Error allocating memory for recv_buf %s\n",
    253         strerror(errno));
    254       return -1;
    255     }
    256     memcpy(p->recv_buf, recv_buffer, p->next_recv_len);
    257     p->next_recv_code = TUNESERVER_RECV_RESPONSE;
    258     p->next_recv_len = sizeof(uint32_t);
    259     /*Process current command at this point*/
    260     break;
    261 
    262   case TUNESERVER_RECV_RESPONSE:
    263     p->next_recv_code = TUNESERVER_RECV_COMMAND;
    264     p->next_recv_len = 2;
    265     p->send_len = *(uint32_t *)recv_buffer;
    266     p->send_buf =  (char *)calloc(p->send_len, sizeof(char *));
    267     if (!p->send_buf) {
    268       LOGE("Error allocating memory for send_buf %s\n",
    269         strerror(errno));
    270       return -1;
    271     }
    272     rc = tuneserver_process_command(tsctrl, p->send_buf, p->send_len);
    273     free(p->recv_buf);
    274     p->recv_buf = NULL;
    275     p->recv_len = 0;
    276     break;
    277 
    278   default:
    279     LOGE(" p->next_recv_code: default\n");
    280     rc = -1;
    281     break;
    282   }
    283 
    284   return rc;
    285 }
    286 
    287 /** tuneserver_ack_onaccept_initprotocol
    288  *    @tsctrl: the server control object
    289  *
    290  *  Acks a connection from the cient and sets up the
    291  *  protocol object to start receiving commands.
    292  *
    293  *  Return: >=0 on success, -1 on failure.
    294  **/
    295 static ssize_t tuneserver_ack_onaccept_initprotocol(tuningserver_t *tsctrl)
    296 {
    297   ssize_t rc = 0;
    298   uint32_t ack_status;
    299 
    300   LOGE("starts\n");
    301 /*
    302   if(tsctrl->camera_running) {
    303     ack_status = 1;
    304   } else {
    305     ack_status = 2;
    306   }
    307 */
    308   ack_status = 1;
    309 
    310   rc = tuneserver_ack(1, ack_status, tsctrl);
    311 
    312   tsctrl->proto = malloc(sizeof(tuneserver_protocol_t));
    313   if (!tsctrl->proto) {
    314     LOGE(" malloc returns NULL with error %s\n",  strerror(errno));
    315     return -1;
    316   }
    317 
    318   tsctrl->proto->current_cmd    = 0xFFFF;
    319   tsctrl->proto->next_recv_code = TUNESERVER_RECV_COMMAND;
    320   tsctrl->proto->next_recv_len  = 2;
    321   tsctrl->proto->recv_buf       = NULL;
    322   tsctrl->proto->send_buf       = NULL;
    323 
    324   LOGD("X\n");
    325 
    326   return rc;
    327 }
    328 
    329 /** tuneserver_check_status
    330  *    @tsctrl: the server control object
    331  *
    332  *  Checks if camera is running and stops it.
    333  *
    334  *  Return: >=0 on success, -1 on failure.
    335  **/
    336 #if 0
    337 static void tuneserver_check_status(tuningserver_t *tsctrl)
    338 {
    339   if (tsctrl->camera_running == 1) {
    340     /*TODO: Stop camera here*/
    341     tuneserver_stop_cam(&tsctrl->lib_handle);
    342   }
    343   tsctrl->camera_running = 0;
    344 
    345   tuneserver_close_cam(&tsctrl->lib_handle);
    346 }
    347 #endif
    348 
    349 static ssize_t prevserver_send_command_rsp(tuningserver_t *tsctrl,
    350   char *send_buf, uint32_t send_len)
    351 {
    352   ssize_t rc;
    353 
    354   /* send ack back to client upon req */
    355   if (send_len <= 0) {
    356     LOGE("Invalid send len \n");
    357     return -1;
    358   }
    359   if (send_buf == NULL) {
    360     LOGE("Invalid send buf \n");
    361     return -1;
    362   }
    363 
    364   rc = send(tsctrl->pr_clientsocket_id, send_buf, send_len, 0);
    365   if (rc < 0) {
    366     LOGE("RSP send returns error %s\n",  strerror(errno));
    367   } else {
    368     rc = 0;
    369   }
    370   if (send_buf != NULL) {
    371     free(send_buf);
    372     send_buf = NULL;
    373   }
    374   return rc;
    375 }
    376 
    377 static void prevserver_init_protocol(tuningserver_t *tsctrl)
    378 {
    379   tsctrl->pr_proto = malloc(sizeof(prserver_protocol_t));
    380   if (!tsctrl->pr_proto) {
    381     LOGE(" malloc returns NULL with error %s\n",
    382       strerror(errno));
    383     return;
    384   }
    385 
    386   tsctrl->pr_proto->current_cmd    = 0xFFFF;
    387   tsctrl->pr_proto->next_recv_code = TUNE_PREV_RECV_COMMAND;
    388   tsctrl->pr_proto->next_recv_len  = 2;
    389 }
    390 
    391 static int32_t prevserver_process_command(
    392   tuningserver_t *tsctrl, char **send_buf, uint32_t *send_len)
    393 {
    394   prserver_protocol_t *p = tsctrl->pr_proto;
    395   int result = 0;
    396   eztune_prevcmd_rsp *rsp_ptr=NULL, *rspn_ptr=NULL, *head_ptr=NULL;
    397 
    398   LOGD(" Current command is %d\n",  p->current_cmd);
    399   switch (p->current_cmd) {
    400   case TUNE_PREV_GET_INFO:
    401     result = tuneserver_preview_getinfo(tsctrl, send_buf, send_len);
    402     if (result < 0) {
    403       LOGE(" RSP processing Failed for cmd %d\n",
    404         p->current_cmd);
    405       return -1;
    406     }
    407     rsp_ptr = (eztune_prevcmd_rsp *)*send_buf;
    408     if ((!rsp_ptr) || (!rsp_ptr->send_buf)) {
    409       LOGE(" RSP ptr is NULL %d\n",  p->current_cmd);
    410       return -1;
    411     }
    412     if (prevserver_send_command_rsp(tsctrl,
    413       rsp_ptr->send_buf, rsp_ptr->send_len)) {
    414       LOGE(" RSP Failed for TUNE_PREV_GET_INFO ver cmd %d\n",
    415         p->current_cmd);
    416       return -1;
    417     }
    418     rspn_ptr = (eztune_prevcmd_rsp *)rsp_ptr->next;
    419     if ((!rspn_ptr) || (!rspn_ptr->send_buf)) {
    420       LOGE(" RSP1 ptr is NULL %d\n",  p->current_cmd);
    421       return -1;
    422     }
    423     if (prevserver_send_command_rsp(tsctrl,
    424         rspn_ptr->send_buf, rspn_ptr->send_len)) {
    425       LOGE(" RSP Failed for TUNE_PREV_GET_INFO caps cmd %d\n",
    426         p->current_cmd);
    427       return -1;
    428     }
    429     free(rspn_ptr);
    430     free(rsp_ptr);
    431     break;
    432 
    433   case TUNE_PREV_CH_CNK_SIZE:
    434     result = tuneserver_preview_getchunksize(tsctrl, send_buf, send_len);
    435     if (result < 0) {
    436       LOGE(" RSP processing Failed for cmd %d\n",  p->current_cmd);
    437       return -1;
    438     }
    439     if (prevserver_send_command_rsp(tsctrl, *send_buf, *send_len)) {
    440       LOGE(" RSP Failed for TUNE_PREV_CH_CNK_SIZE cmd %d\n",
    441         p->current_cmd);
    442       return -1;
    443     }
    444     break;
    445 
    446   case TUNE_PREV_GET_PREV_FRAME:
    447     result = tuneserver_preview_getframe(tsctrl, send_buf, send_len);
    448     if (result < 0) {
    449       LOGE(" RSP processing Failed for cmd %d\n",  p->current_cmd);
    450       return -1;
    451     }
    452     rsp_ptr = (eztune_prevcmd_rsp *)*send_buf;
    453     if ((!rsp_ptr) || (!rsp_ptr->send_buf)) {
    454       LOGE(" RSP ptr is NULL %d\n",  p->current_cmd);
    455       return -1;
    456     }
    457     head_ptr = rsp_ptr;
    458 
    459     while (rsp_ptr != NULL) {
    460       if ((!rsp_ptr) || (!rsp_ptr->send_buf)) {
    461         LOGE(" RSP ptr is NULL %d\n",  p->current_cmd);
    462         return -1;
    463       }
    464       if (prevserver_send_command_rsp(tsctrl,
    465         rsp_ptr->send_buf, rsp_ptr->send_len)) {
    466         LOGE(" RSP Failed for TUNE_PREV_GET_INFO ver cmd %d\n",
    467           p->current_cmd);
    468         return -1;
    469       }
    470       rsp_ptr = (eztune_prevcmd_rsp *)rsp_ptr->next;
    471     }
    472     release_eztune_prevcmd_rsp(head_ptr);
    473     break;
    474 
    475   case TUNE_PREV_GET_JPG_SNAP:
    476   case TUNE_PREV_GET_RAW_SNAP:
    477   case TUNE_PREV_GET_RAW_PREV:
    478     result = tuneserver_preview_unsupported(tsctrl, send_buf, send_len);
    479     if (result < 0) {
    480        LOGE("RSP processing Failed for cmd %d\n",  p->current_cmd);
    481       return -1;
    482     }
    483     if (prevserver_send_command_rsp(tsctrl, *send_buf, *send_len)) {
    484       LOGE("RSP Failed for UNSUPPORTED cmd %d\n",  p->current_cmd);
    485       return -1;
    486     }
    487     break;
    488 
    489   default:
    490     LOGE(" p->current_cmd: default\n");
    491     result = -1;
    492     break;
    493   }
    494 
    495   return result;
    496 }
    497 
    498 /** previewserver_process_client_message
    499  *    @recv_buffer: received message from the client
    500  *    @tsctrl: the server control object
    501  *
    502  *  Processes the message from client and prepares for next
    503  *  message.
    504  *
    505  *  Return: >=0 on success, -1 on failure.
    506  **/
    507 static int32_t prevserver_process_client_message(void *recv_buffer,
    508   tuningserver_t *tsctrl)
    509 {
    510   int rc = 0;
    511   prserver_protocol_t *p = tsctrl->pr_proto;
    512 
    513   LOGD("command = %d", p->next_recv_code);
    514 
    515   switch (p->next_recv_code) {
    516   case TUNE_PREV_RECV_COMMAND:
    517     p->current_cmd = *(uint16_t *)recv_buffer;
    518     if(p->current_cmd != TUNE_PREV_CH_CNK_SIZE) {
    519       rc = prevserver_process_command(tsctrl,
    520         &p->send_buf, (uint32_t *)&p->send_len);
    521       break;
    522     }
    523     p->next_recv_code = TUNE_PREV_RECV_NEWCNKSIZE;
    524     p->next_recv_len = sizeof(uint32_t);
    525     LOGD("TUNE_PREV_COMMAND X\n");
    526     break;
    527   case TUNE_PREV_RECV_NEWCNKSIZE:
    528     p->new_cnk_size = *(uint32_t *)recv_buffer;
    529     p->next_recv_code = TUNE_PREV_RECV_COMMAND;
    530     p->next_recv_len  = 2;
    531     rc = prevserver_process_command(tsctrl,
    532       &p->send_buf, (uint32_t *)&p->send_len);
    533     break;
    534   default:
    535     LOGE("prev_proc->next_recv_code: default\n");
    536     rc = -1;
    537     break;
    538   }
    539 
    540   return rc;
    541 }
    542 
    543 /** tunning_server_socket_listen
    544  *    @ip_addr: the ip addr to listen
    545  *    @port: the port to listen
    546  *
    547  *  Setup a listen socket for eztune.
    548  *
    549  *  Return: >0 on success, <=0 on failure.
    550  **/
    551 int tunning_server_socket_listen(const char* ip_addr, uint16_t port)
    552 {
    553   int sock_fd = -1;
    554   mm_qcamera_sock_addr_t server_addr;
    555   int result;
    556   int option;
    557   int socket_flag;
    558 
    559   memset(&server_addr, 0, sizeof(server_addr));
    560   server_addr.addr_in.sin_family = AF_INET;
    561   server_addr.addr_in.sin_port = (__be16) htons(port);
    562   server_addr.addr_in.sin_addr.s_addr = inet_addr(ip_addr);
    563 
    564   if (server_addr.addr_in.sin_addr.s_addr == INADDR_NONE) {
    565     LOGE(" invalid address.\n");
    566     return -1;
    567   }
    568 
    569   /* Create an AF_INET stream socket to receive incoming connection ON */
    570   sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    571   if (sock_fd < 0) {
    572     LOGE(" socket failed\n");
    573     return sock_fd;
    574   }
    575 
    576   // set listen socket to non-block, but why??
    577   socket_flag = fcntl(sock_fd, F_GETFL, 0);
    578   fcntl(sock_fd, F_SETFL, socket_flag | O_NONBLOCK);
    579 
    580   /* reuse in case it is in timeout */
    581   option = 1;
    582   result = setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,
    583     &option, sizeof(option));
    584 
    585   if (result < 0) {
    586     LOGE("eztune setsockopt failed");
    587     close(sock_fd);
    588     sock_fd = -1;
    589     return sock_fd;
    590   }
    591 
    592   result = bind(sock_fd, &server_addr.addr, sizeof(server_addr.addr_in));
    593   if (result < 0) {
    594     LOGE("eztune socket bind failed");
    595     close(sock_fd);
    596     sock_fd = -1;
    597     return sock_fd;
    598   }
    599 
    600   result = listen(sock_fd, 1);
    601   if (result < 0) {
    602     LOGE("eztune socket listen failed");
    603     close(sock_fd);
    604     sock_fd = -1;
    605     return sock_fd;
    606   }
    607 
    608   LOGH("sock_fd: %d, listen at port: %d\n",  sock_fd, port);
    609 
    610   return sock_fd;
    611 }
    612 
    613 /** main
    614  *
    615  *  Creates the server, and starts waiting for
    616  *  connections/messages from a prospective
    617  *  client
    618  *
    619  **/
    620 void *eztune_proc(void *data)
    621 {
    622   int server_socket = -1, client_socket = -1;
    623   int prev_server_socket = -1, prev_client_socket = -1;
    624 
    625   mm_qcamera_sock_addr_t addr_client_inet;
    626   socklen_t addr_client_len = sizeof(addr_client_inet.addr_in);
    627   int result;
    628   fd_set tsfds;
    629   int num_fds = 0;
    630   ssize_t recv_bytes;
    631   char buf[TUNESERVER_MAX_RECV];
    632 
    633   mm_camera_lib_handle *lib_handle = (mm_camera_lib_handle *)data;
    634 
    635   LOGE(">>> Starting tune server <<< \n");
    636 
    637   // for eztune chromatix params
    638   server_socket = tunning_server_socket_listen(IP_ADDR, TUNING_CHROMATIX_PORT);
    639   if (server_socket <= 0) {
    640     LOGE("[ERR] fail to setup listen socket for eztune chromatix parms...");
    641     return NULL;
    642   }
    643   prev_server_socket = tunning_server_socket_listen(IP_ADDR, TUNING_PREVIEW_PORT);
    644   if (prev_server_socket <= 0) {
    645     LOGE("[ERR] fail to setup listen socket for eztune preview...\n");
    646     return NULL;
    647   }
    648   num_fds = TUNESERVER_MAX(server_socket, prev_server_socket);
    649   LOGH("num_fds = %d\n", num_fds);
    650 
    651   do {
    652     FD_ZERO(&tsfds);
    653     FD_SET(server_socket, &tsfds);
    654     FD_SET(prev_server_socket, &tsfds);
    655     if (client_socket > 0) {
    656       FD_SET(client_socket, &tsfds);
    657     }
    658     if (prev_client_socket > 0) {
    659       FD_SET( prev_client_socket, &tsfds);
    660     }
    661 
    662     /* no timeout */
    663     result = select(num_fds + 1, &tsfds, NULL, NULL, NULL);
    664     if (result < 0) {
    665       LOGE("select failed: %s\n", strerror(errno));
    666       continue;
    667     }
    668 
    669     /*
    670      ** (1) CHROMATIX SERVER
    671      */
    672     if (FD_ISSET(server_socket, &tsfds)) {
    673       LOGD("Receiving New client connection\n");
    674 
    675       client_socket = accept(server_socket,
    676         &addr_client_inet.addr, &addr_client_len);
    677       if (client_socket == -1) {
    678         LOGE("accept failed %s", strerror(errno));
    679         continue;
    680       }
    681 
    682       if (client_socket >= FD_SETSIZE) {
    683         LOGE("client_socket is out of range. client_socket=%d",client_socket);
    684         continue;
    685       }
    686 
    687       LOGE("accept a new connect on 55555, sd(%d)\n", client_socket);
    688       num_fds = TUNESERVER_MAX(num_fds, client_socket);
    689 
    690       // open camera and get handle - this is needed to
    691       // be able to set parameters without starting
    692       // preview stream
    693       /*if (!tsctrl.camera_running) {
    694         result = tuneserver_open_cam(&tsctrl.lib_handle, &tsctrl);
    695         if(result) {
    696           printf("\n Camera Open Fail !!! \n");
    697           close(server_socket);
    698           return EXIT_FAILURE;
    699         }
    700       }*/
    701       result = tuneserver_open_cam(lib_handle);
    702       if(result) {
    703         LOGE("\n Tuning Library open failed!!!\n");
    704         close(server_socket);
    705         return NULL;
    706       }
    707       lib_handle->tsctrl.clientsocket_id = client_socket;
    708       if (tuneserver_ack_onaccept_initprotocol(&lib_handle->tsctrl) < 0) {
    709         LOGE(" Error while acking\n");
    710         close(client_socket);
    711         continue;
    712       }
    713       tuneserver_initialize_tuningp(lib_handle, client_socket,
    714         lib_handle->tsctrl.proto->send_buf, lib_handle->tsctrl.proto->send_len);
    715     }
    716 
    717     if ((client_socket < FD_SETSIZE) && (FD_ISSET(client_socket, &tsfds))) {
    718       if (lib_handle->tsctrl.proto == NULL) {
    719         LOGE(" Cannot receive msg without connect\n");
    720         continue;
    721       }
    722 
    723       /*Receive message and process it*/
    724       recv_bytes = recv(client_socket, (void *)buf,
    725         lib_handle->tsctrl.proto->next_recv_len, 0);
    726       LOGD("Receive %lld bytes \n", (long long int) recv_bytes);
    727 
    728       if (recv_bytes == -1) {
    729         LOGE(" Receive failed with error %s\n",  strerror(errno));
    730         //tuneserver_check_status(&tsctrl);
    731         continue;
    732       } else if (recv_bytes == 0) {
    733         LOGE("connection has been terminated\n");
    734 
    735         tuneserver_deinitialize_tuningp(&lib_handle->tsctrl, client_socket,
    736           lib_handle->tsctrl.proto->send_buf,
    737           lib_handle->tsctrl.proto->send_len);
    738         free(lib_handle->tsctrl.proto);
    739         lib_handle->tsctrl.proto = NULL;
    740 
    741         close(client_socket);
    742         client_socket = -1;
    743         //tuneserver_check_status(&tsctrl);
    744       } else {
    745         LOGD(" Processing socket command\n");
    746 
    747         result = tuneserver_process_client_message(buf, &lib_handle->tsctrl);
    748 
    749         if (result < 0) {
    750           LOGE("Protocol violated\n");
    751 
    752           free(lib_handle->tsctrl.proto);
    753           lib_handle->tsctrl.proto = NULL;
    754 
    755           close(client_socket);
    756           client_socket = -1;
    757           //tuneserver_check_status(&tsctrl);
    758           continue;
    759         }
    760       }
    761     }
    762 
    763     /*
    764      ** (2) PREVIEW SERVER
    765      */
    766     if (FD_ISSET(prev_server_socket, &tsfds)) {
    767       LOGD("Receiving New Preview client connection\n");
    768 
    769       prev_client_socket = accept(prev_server_socket,
    770         &addr_client_inet.addr, &addr_client_len);
    771       if (prev_client_socket == -1) {
    772         LOGE("accept failed %s", strerror(errno));
    773         continue;
    774       }
    775       if (prev_client_socket >= FD_SETSIZE) {
    776         LOGE("prev_client_socket is out of range. prev_client_socket=%d",prev_client_socket);
    777         continue;
    778       }
    779 
    780       lib_handle->tsctrl.pr_clientsocket_id = prev_client_socket;
    781 
    782       LOGD("Accepted a new connection, fd(%d)\n", prev_client_socket);
    783       num_fds = TUNESERVER_MAX(num_fds, prev_client_socket);
    784 
    785       // start camera
    786       /*if (!tsctrl.camera_running) {
    787         result = 0;
    788         result = tuneserver_open_cam(&tsctrl.lib_handle, &tsctrl);
    789         if(result) {
    790           printf("\n Camera Open Fail !!! \n");
    791           return EXIT_FAILURE;
    792         }
    793       }*/
    794       cam_dimension_t dim;
    795       //dim.width = lib_handle->test_obj.buffer_width;
    796       //dim.height = lib_handle->test_obj.buffer_height;
    797       dim.width = DEFAULT_PREVIEW_WIDTH;
    798       dim.height = DEFAULT_PREVIEW_HEIGHT;
    799 
    800       LOGD("preview dimension info: w(%d), h(%d)\n", dim.width, dim.height);
    801       // we have to make sure that camera is running, before init connection,
    802       // because we need to know the frame size for allocating the memory.
    803       prevserver_init_protocol(&lib_handle->tsctrl);
    804 
    805       result = tuneserver_initialize_prevtuningp(lib_handle, prev_client_socket,
    806         dim, (char **)&lib_handle->tsctrl.proto->send_buf,
    807         &lib_handle->tsctrl.proto->send_len);
    808       if (result < 0) {
    809         LOGE("tuneserver_initialize_prevtuningp error!");
    810         close(prev_client_socket);
    811         prev_client_socket = -1;
    812       }
    813     }
    814 
    815     if ((prev_client_socket < FD_SETSIZE) && (FD_ISSET(prev_client_socket, &tsfds))) {
    816       recv_bytes = recv(prev_client_socket, (void *)buf,
    817         lib_handle->tsctrl.pr_proto->next_recv_len, 0);
    818 
    819       LOGD("prev_client_socket=%d\n",  prev_client_socket);
    820       LOGD("next_recv_len=%d\n",  buf[0]+buf[1]*256);
    821 
    822       if (recv_bytes <= 0) {
    823         if (recv_bytes == 0) {
    824           LOGE("client close the connection.\n");
    825         } else {
    826           LOGE("receive error: %s\n", strerror(errno));
    827         }
    828 
    829         //tuneserver_check_status(&tsctrl);
    830         // if recv error, we should close the connection, free the proto data,
    831         // AND wait for a new connecton..
    832         // close_connection();
    833         // stop_camera()
    834         // cleanup_proto_data();
    835         tuneserver_deinitialize_prevtuningp(&lib_handle->tsctrl,
    836           (char **)&lib_handle->tsctrl.proto->send_buf,
    837           &lib_handle->tsctrl.proto->send_len);
    838         close(prev_client_socket);
    839         prev_client_socket = -1;
    840       } else {
    841         result = prevserver_process_client_message((void *)buf,
    842           &lib_handle->tsctrl);
    843         if (result < 0) {
    844           LOGE("Protocol violated\n");
    845 
    846           //free(tsctrl->preivew_proto);
    847           //free(tsctrl);
    848           //max_fd = ezt_parms_listen_sd + 1;
    849           tuneserver_deinitialize_prevtuningp(&lib_handle->tsctrl,
    850             (char **)&lib_handle->tsctrl.proto->send_buf,
    851             &lib_handle->tsctrl.proto->send_len);
    852           close(prev_client_socket);
    853           prev_client_socket = -1;
    854           //tuneserver_check_status(&tsctrl);
    855         }
    856         //sleep(1);
    857       }
    858     }
    859   } while (1);
    860 
    861   if (server_socket >= 0) {
    862     close(server_socket);
    863   }
    864   if (client_socket >= 0) {
    865     close(client_socket);
    866   }
    867   if (prev_server_socket >= 0) {
    868     close(prev_server_socket);
    869   }
    870   if (prev_client_socket >= 0) {
    871     close(prev_client_socket);
    872   }
    873 
    874   return EXIT_SUCCESS;
    875 }
    876 
    877 int eztune_server_start (void *lib_handle)
    878 {
    879   return pthread_create(&eztune_thread_id, NULL,  eztune_proc, lib_handle);
    880 }
    881 
    882