4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
7 * Sooyoung Ha <yoosah.ha@samsung.com>
8 * Sungmin Ha <sungmin82.ha@samsung.com>
9 * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
11 * This library is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU Lesser General Public License as published by the
13 * Free Software Foundation; either version 2.1 of the License, or (at your option)
16 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
17 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19 * License for more details.
21 * You should have received a copy of the GNU Lesser General Public License
22 * along with this library; if not, write to the Free Software Foundation, Inc., 51
23 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 #include <sys/types.h>
31 #include <sys/socket.h>
33 #include <arpa/inet.h>
34 #include <netinet/in.h>
38 #include "phoneserver.h"
40 //#include "data_conn_mgr.h"
42 #include "state.h" //define ENTER()
45 #define MAX_LISTEN_COUNT 32
46 //#define DEF_DOMAIN_SOCKET_NAME "/tmp/.phone_socket"
47 #define DEF_DOMAIN_SOCKET_NAME "/tmp/.vgsm_socket"
49 int vgsm_server_port=0;
52 extern GSM_StateMachine GlobalS;
54 static void server_save_message(PhoneServer * ps, LXT_ID_CLIENT klass, LXT_MESSAGE * packet)
58 Server * server = &ps->ServerSocket;
59 if (server->mmsg.current >= MAX_MISSED_MESSAGE)
61 TRACE(MSGL_WARN, "Warning!!! overrun max missed call\n");
62 server->mmsg.current = 0;
66 ii = server->mmsg.current;
67 TRACE(MSGL_VGSM_INFO, "Add current missed cast index: %d (client id: 0x%x)\n", ii, klass);
68 TRACE(MSGL_VGSM_INFO, "packet->group: 0x%x packet->action: 0x%x\n", packet->group, packet->action);
71 if (server->mmsg.mmsg_info[ii].klass != LXT_STATE_RELEASED) {
72 TRACE(MSGL_VGSM_ERR, "CRITICAL!!! overwrite data that not yet sent message to client\n");
73 TRACE(MSGL_VGSM_ERR, "group:0x%x, action: 0x%x\n", server->mmsg.mmsg_info[ii].group, server->mmsg.mmsg_info[ii].action);
77 server->mmsg.mmsg_info[ii].klass = klass;
80 TAPIMessageFree(&(server->mmsg.mmsg_info[ii].mmsg));
83 server->mmsg.mmsg_info[ii].mmsg.length = packet->length;
84 server->mmsg.mmsg_info[ii].mmsg.group = packet->group;
85 server->mmsg.mmsg_info[ii].mmsg.action = packet->action;
87 if (packet->length > 0)
89 server->mmsg.mmsg_info[ii].mmsg.data =
90 (unsigned char *)PacketDataMalloc(packet->length);
91 memcpy(server->mmsg.mmsg_info[ii].mmsg.data, packet->data, packet->length);
94 server->mmsg.current ++;
97 static int server_send_to_client(int handle, LXT_MESSAGE * packet)
102 TRACE(MSGL_VGSM_INFO, "server_send_to_client : fd = %d, total size = 4+%d ... \n", handle, packet->length);
103 // save size (length of packet is only datasize)
104 datasize = packet->length;
106 rc = WriteBytes(handle, packet, 4);
108 TRACE(MSGL_VGSM_ERR, "server_send_to_client1 : write error : rc = %d\n", rc);
110 // FIXME : Broken PIPE ¿À·ù ¼öÁ¤ÇÒ°Í.
113 rc = WriteBytes(handle, packet->data, datasize);
115 TRACE(MSGL_VGSM_ERR, "server_send_to_client2 : write error : rc = %d\n", rc);
120 static TClientInfo * server_get_client(PhoneServer * ps, int clientid)
122 Server * server = &ps->ServerSocket;
124 TClientInfo * ci = server->current_ci;
126 TRACE(MSGL_VGSM_INFO, "server get client is not null\n");
130 //if (ci->klass == clientid)
131 if (ci->klass == LXT_ID_CLIENT_EVENT_INJECTOR || ci->klass == clientid)
139 static void get_domain_socket_name(char * result)
141 strcpy(result, DEF_DOMAIN_SOCKET_NAME);
142 strcat(result, (const char*)"-");
143 strcat(result, getenv("USER"));
148 static void server_initialize(PhoneServer * ps)
150 Server * server = &ps->ServerSocket;
153 TRACE(MSGL_VGSM_INFO, "\n");
156 server->inet_fd = -1;
157 server->current_ci = NULL;
159 // Ŭ¶óÀ̾ðÆ® Á¢¼ÓÀüÀÇ ¸Þ¼¼Áö¸¦ ´ã¾ÆµÎ±â À§ÇØ ÇÊ¿äÇÔ.
160 for (ii = 0; ii < MAX_MISSED_MESSAGE; ii ++)
162 server->mmsg.mmsg_info[ii].klass = LXT_ID_CLIENT_RESERVED;
163 TAPIMessageInit( &(server->mmsg.mmsg_info[ii].mmsg) );
167 static int server_open(PhoneServer * ps)
169 Server * server = &ps->ServerSocket;
173 struct sockaddr_un serverAddr;
174 char socket_name[64] = {0, };
176 TRACE(MSGL_VGSM_INFO, "\n");
179 //get_domain_socket_name(socket_name);
181 server->fd = socket(AF_UNIX, SOCK_STREAM, 0);
183 log_msg(MSGL_VGSM_INFO, "fd =%d \n", server->fd);
187 TRACE(MSGL_VGSM_ERR, "socket() failed\n");
193 memset(&serverAddr, 0, sizeof(serverAddr));
194 serverAddr.sun_family = AF_UNIX;
195 strcpy(serverAddr.sun_path, socket_name);
196 len = sizeof(serverAddr.sun_family) + strlen(socket_name);
198 rc = bind(server->fd, (struct sockaddr *)&serverAddr, len);
202 TRACE(MSGL_VGSM_ERR, "bind() failed\n");
207 rc = listen(server->fd, MAX_LISTEN_COUNT);
211 TRACE(MSGL_VGSM_ERR, "listen() failed\n");
220 static int server_callback(PhoneServer * ps, int fd, EloopCondition cond, void * data)
222 log_msg(MSGL_VGSM_INFO, "fd = %d \n",fd);
223 Server * server = &ps->ServerSocket;
225 struct sockaddr_in addr;
226 int len = sizeof(addr);
227 memset(&addr, 0, len);
229 int client_fd = accept(server->fd, (struct sockaddr *)&addr, (socklen_t *)&len);
231 TRACE(MSGL_VGSM_INFO, "Client fd %d server fd %d\n", client_fd, server->fd);
235 server->ci = malloc(sizeof (TClientInfo));
236 server->ci->Functions = NULL;
237 server->ci->Functions = &ClientHandle;
238 server->ci->fd = client_fd;
239 server->ci->klass = -1;
240 server->ci->next = server->current_ci;
241 server->current_ci = server->ci;
242 TAPIMessageInit(&(server->ci->request));
243 TAPIMessageInit(&(server->ci->notification));
244 int tag = eloop_add_input(ps, server->ci->fd, ELOOP_READ,
245 server->ci->Functions->CallBack, server->ci);
246 server->ci->tag = tag;
247 TRACE(MSGL_VGSM_INFO, "Server inet callback is registerd at [%d]\n", tag);
258 static int server_inet_open(PhoneServer * ps)
260 Server * server = &ps->ServerSocket;
261 struct sockaddr_in server_addr;
264 memset(&server_addr, 0, sizeof server_addr);
265 server_addr.sin_family = AF_INET;
266 server_addr.sin_port = htons(3578);
267 server_addr.sin_addr.s_addr = INADDR_ANY;
269 TRACE(MSGL_VGSM_INFO, "listening to port %d\n", server_addr.sin_port);
271 if((server->inet_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
273 perror("socket() failed");
278 setsockopt(server->inet_fd, SOL_SOCKET, SO_REUSEADDR
279 , (const char *)&val, sizeof(val));
281 if(bind(server->inet_fd, (struct sockaddr *)&server_addr, sizeof server_addr) == -1)
283 perror("bind() failed");
284 close(server->inet_fd);
288 if(listen(server->inet_fd, MAX_LISTEN_COUNT) == -1)
290 perror("listen() failed");
291 close(server->inet_fd);
300 static int server_inet_callback(PhoneServer * ps, int fd, EloopCondition cond, void * data)
302 Server * server = &ps->ServerSocket;
304 struct sockaddr_in addr;
305 int len = sizeof(addr);
306 memset(&addr, 0, len);
308 int client_fd = accept(server->inet_fd, (struct sockaddr *)&addr, (socklen_t *)&len);
310 TRACE(MSGL_VGSM_INFO, "\n\n\ninet socket accept!!!\n\n\n");
311 TRACE(MSGL_VGSM_INFO, "Client fd %d server fd %d\n",
312 client_fd, server->inet_fd);
316 DPRAM * dpram = &GlobalPS.Dpram;
319 // ++ Data.DPRAM is union. So, DPRAM is not clear whether it is fake or DPRAM.
320 // ++ It should be sure what is.
322 GSM_Device_DPRAMData *d = &GlobalS.Device.Data.DPRAM;
325 d->hPhone = client_fd;
330 iotag = eloop_add_input(ps, dpram->fd, ELOOP_READ,
331 dpram->Functions->CallBack, 0); // dpram_callback
332 TRACE(MSGL_VGSM_INFO, "Server inet callback is registerd at [%d]\n", iotag);
343 server->ci = malloc(sizeof (TClientInfo));
344 server->ci->Functions = NULL;
345 server->ci->Functions = &ClientHandle;
346 server->ci->fd = client_fd;
347 server->ci->klass = -1;
348 server->ci->next = server->current_ci;
349 server->current_ci = server->ci;
350 TAPIMessageInit(&(server->ci->request));
351 TAPIMessageInit(&(server->ci->notification));
352 int tag = eloop_add_input(ps, server->ci->fd, ELOOP_READ,
353 server->ci->Functions->CallBack, server->ci);
354 server->ci->tag = tag;
355 TRACE(MSGL_VGSM_INFO, "Server inet callback is registerd at [%d]\n", tag);
366 static int server_inet_callback(PhoneServer * ps, int fd, EloopCondition cond, void * data)
368 log_msg(MSGL_VGSM_INFO, "fd = %d \n",fd);
369 Server * server = &ps->ServerSocket;
371 struct sockaddr_in addr;
372 int len = sizeof(addr);
373 memset(&addr, 0, len);
375 int client_fd = accept(server->fd, (struct sockaddr *)&addr, (socklen_t *)&len);
377 TRACE(MSGL_VGSM_INFO, "Client fd %d server fd %d\n", client_fd, server->fd);
381 server->ci = g_new(TClientInfo, 1);
382 server->ci->Functions = NULL;
383 server->ci->Functions = &ClientHandle;
384 server->ci->fd = client_fd;
385 server->ci->klass = -1;
386 server->ci->next = server->current_ci;
387 server->current_ci = server->ci;
388 TAPIMessageInit(&(server->ci->request));
389 TAPIMessageInit(&(server->ci->notification));
390 int tag = eloop_add_input(ps, server->ci->fd, ELOOP_READ,
391 server->ci->Functions->CallBack, server->ci);
392 server->ci->tag = tag;
393 TRACE(MSGL_VGSM_INFO, "Server inet callback is registerd at [%d]\n", tag);
404 const char *str_main_cmd[] = {
405 "GSM_COMMON", // 0x00
407 "GSM_NETWORK",// 0x02
411 "GSM_DISPLAY", // 0x06
417 "GSM_SERVICEMODE",// 0x0C
418 "GSM_EMULATOR ",// 0x0D
424 static void server_cast(PhoneServer * ps, int clientid, LXT_MESSAGE * packet)
427 Server * server = &ps->ServerSocket;
429 TRACE(MSGL_VGSM_INFO, "clientid(%d) \n", clientid);
432 TRACE(MSGL_VGSM_INFO, "server cast server is null\n");
436 ci = server_get_client(ps, clientid);
441 TRACE(MSGL_VGSM_INFO, "server cast client is null\n");
445 TRACE(MSGL_VGSM_INFO, "CAST MESSAGE TO [0x%x], MAIN[%s], SUB[0x%x] : ci fd [%d]\n", ci->klass, str_main_cmd[packet->group], packet->action, clientfd);
447 server_send_to_client(clientfd, packet);
451 server_save_message(ps, (LXT_ID_CLIENT)clientid, packet);
455 static void server_broadcast(PhoneServer * ps, LXT_MESSAGE * packet)
458 Server * server = &ps->ServerSocket;
460 TRACE(MSGL_VGSM_INFO, "\n");
462 TClientInfo * ci = server->current_ci;
466 TRACE(MSGL_VGSM_INFO, "server get client is not null\n");
472 if (ci->klass == 0x10)
478 WriteBytes(ci->fd, packet, 4);
479 if (packet->length > 0)
480 WriteBytes(ci->fd, packet->data, packet->length);
486 // nsclass : Especially, cast internal message to phone indicator, because, phone applet broadcast
487 // phone state to other client.(save missed message)
488 // 1. LXT_ID_CLIENT_INDICATOR
489 ci = server_get_client(ps, LXT_ID_CLIENT_INDICATOR);
494 server_save_message(ps, LXT_ID_CLIENT_INDICATOR, packet);
496 // 2. LXT_ID_CLIENT_DATASERVICE
498 ci = server_get_client(ps, LXT_ID_CLIENT_DATASERVICE);
503 server_save_message(ps, LXT_ID_CLIENT_DATASERVICE, packet);
505 // 3. LXT_ID_CLIENT_CARD_MANAGER
507 ci = server_get_client(ps, LXT_ID_CLIENT_CARD_MANAGER);
512 server_save_message(ps, LXT_ID_CLIENT_CARD_MANAGER, packet);
517 static void clear_client_related_data(int client_id)
519 TRACE(MSGL_VGSM_INFO, "\n");
521 // 1. Multiple PDP related
522 //GetDataConnectMgr()->m_pFunc->ClearClient((unsigned char)client_id);
524 // 2. RequestResponse related
527 static void server_remove_client(PhoneServer * ps, TClientInfo *me)
529 Server * server = &ps->ServerSocket;
530 TClientInfo *curr = server->current_ci, *prev = 0;
532 TRACE(MSGL_VGSM_INFO, "\n");
540 prev->next = curr->next;
544 server->current_ci = curr->next;
546 TAPIMessageFree( &(curr->notification) );
547 TAPIMessageFree( &(curr->request) );
550 clear_client_related_data(curr->klass);
552 PacketDataFree(curr);
560 //void server_cast_missed_message(PhoneServer * ps, LXT_ID_CLIENT klass,
561 static void server_cast_missed_message(PhoneServer * ps, int klass, int clientfd)
563 Server * server = &ps->ServerSocket;
564 //TClientInfo *curr = server->current_ci, *prev = 0;
569 TRACE(MSGL_VGSM_INFO, "\n");
571 for (ii = 0; ii < MAX_MISSED_MESSAGE; ii ++)
573 if (server->mmsg.mmsg_info[ii].klass == klass)
575 rc = WriteBytes( clientfd, &(server->mmsg.mmsg_info[ii].mmsg), 4);
576 if (server->mmsg.mmsg_info[ii].mmsg.length > 0)
579 rc = WriteBytes( clientfd,
580 server->mmsg.mmsg_info[ii].mmsg.data,
581 server->mmsg.mmsg_info[ii].mmsg.length);
584 server->mmsg.mmsg_info[ii].klass = LXT_ID_CLIENT_RESERVED;
585 TRACE(MSGL_VGSM_INFO, "removed missed cast index: %d by client(0x%x)\n", ii, klass);
588 TAPIMessageFree(&(server->mmsg.mmsg_info[ii].mmsg));
593 FunctionsServer ServerHandle =
599 server_inet_callback,
602 server_remove_client,
603 server_cast_missed_message