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