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
35 #include "phoneprotocol4gsm.h"
36 #include "vgsm_phone.h"
38 // #include <mzgsmsat.h>
39 // #include <mzgsmsound.h>
41 #include "vgsm_gprs.h"
45 #include "phoneserver.h"
46 #include "at_tx_func.h"
47 #include "at_rx_func.h"
50 #include "at_tx_sms.h"
53 //#include "db_phonebook.h"
54 #include "server_common_security.h"
55 #include "server_common_network.h"
57 #include "server_tx_security.h"
58 #include "server_tx_phonebook.h"
59 #include "db_security.h"
60 #include "db_phonebook.h"
63 #include "sat_values.h"
64 #include "server_tx_sms.h"
65 #include "server_tx_data.h"
66 #include "server_tx_gprs.h"
70 #include "server_tx_call.h"
71 #include "server_common_call.h"
72 #include "server_common_ss.h"
73 #include "server_tx_ss.h"
74 #include "server_tx_network.h"
75 #include "server_tx_display.h"
76 #include "server_tx_power.h"
77 #include "server_client.h"
78 /* for temporary power code. so it will be removed */
80 #include "vgsm_phone.h"
82 #include <vconf/vconf.h>
83 #include <vconf/vconf-keys.h>
85 #define MAX_RESULT_LENGTH 1024
87 GSM_Device_Functions * Device;
88 int smsSentStatus = 0;
90 extern GSM_StateMachine GlobalS;
92 #define MMI_SC_LENGTH2 14
93 #define MMI_SC_LENGTH3 10
96 static char * mmi_sc2[] =
101 "62", // CF Not Reachable
102 "43", // Call Waiting
107 "33", // CB, all outgoing
108 "35", // CB, all incoming"
109 "03", // CB, change of password
114 static char * mmi_sc3[] =
116 "331",// CB, outgoing int'l
117 "332",// CB, outgoing int'l except HOME
118 "351",// CB, incoming Roaming
119 "330",// CB, all calls
120 "333",// CB, all outgoing
121 "353",// CB, all incoming
123 "004",// All Conditional CF
128 static bool isUSSD(char * data)
130 // ** : register and activate
134 // ## : de-register (and de-activate)
139 if (data[0] == '*' && data[1] == '*') // register and activate
142 if (data[0] == '*' && (data[1] != '*' && data[1] != '#') ) // activate
145 if (data[0] == '*' && data[1] == '#') // interrogate
148 if (data[0] == '#' && (data[1] != '#' && data[1] != '*')) // deactivate
151 if (data[0] == '#' && data[1] == '#') // de-register (and deactivate)
154 TRACE(MSGL_WARN, "Warning : Bad MMI code <%s>\n", data);
156 for (ii = 0; ii < MMI_SC_LENGTH2; ii ++)
158 if (strncmp( (const char *)&data[start], mmi_sc2[ii], 2) == 0) // Normal SS SC
162 for (ii = 0; ii < MMI_SC_LENGTH3; ii ++)
164 if (strncmp( (const char *)&data[start], mmi_sc3[ii], 3) == 0) // Normal SS SC
173 void do_ext(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
175 int action = packet->action;
176 int length = packet->length;
177 int klass = ci->klass;
179 char * p = (char *)(packet->data);
182 case GSM_EXT_SET_INTERNAL_STATE_REQ :
184 LXT_PHONE_STATE state = (LXT_PHONE_STATE)p[0];
185 TRACE(MSGL_VGSM_INFO, "## GSM_EXT_SET_INTERNAL_STATE_REQ %d\n",
187 FuncPhoneServer->BroadcastInternalStatus( &GlobalPS,
192 case GSM_EXT_SET_AUDIO_PATH_REQ :
194 case GSM_EXT_SET_VOICE_VOL_REQ :
196 case GSM_EXT_SET_IMEI_REQ :
198 case GSM_EXT_SET_BTMAC_REQ :
200 case GSM_EXT_GET_BTMAC_REQ :
208 // 090326 // restore data in EI
209 static void do_restore_ei(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
211 unsigned char data[MAX_GSM_DIALED_DIGITS_NUMBER+4];
213 log_msg(MSGL_VGSM_INFO,"do_restore_EI\n");
217 server_sim_db_init();
219 gsm_call_list_t * callList = malloc(sizeof(gsm_call_list_t));
220 LXT_MESSAGE MOpacket;
221 TAPIMessageInit(&MOpacket);
224 get_call_list(callList);
226 for( i=0; i<MAX_CALL_COUNT; ++i )
228 if(callList->CallInfo[i].stat == GSM_CALL_STATUS_DIALING || callList->CallInfo[i].stat == GSM_CALL_STATUS_ALERT)
230 data[0] = callList->CallInfo[i].idx;
231 data[1] = callList->CallInfo[i].call_type;
232 data[2] = callList->CallInfo[i].num_len;
233 data[3] = callList->CallInfo[i].stat;
235 memset(&data[4], 0, MAX_GSM_DIALED_DIGITS_NUMBER);
236 memcpy(&data[4], callList->CallInfo[i].number, callList->CallInfo[i].num_len);
237 MOpacket.data = data;
238 MOpacket.group = GSM_CALL;
239 MOpacket.action = GSM_CALL_MAKE_REQ;
240 MOpacket.length = callList->CallInfo[i].num_len + 4;
242 FuncServer->Cast(&GlobalPS, LXT_ID_CLIENT_EVENT_INJECTOR, &MOpacket);
249 log_msg(MSGL_VGSM_INFO,"do_restore_EI\n");
252 static void do_sat(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
255 int action = packet->action;
256 // char * p = (char *)(packet->data);
259 GET_INKEY *get_inkey;
260 GET_INPUT *get_input;
262 TRACE(MSGL_VGSM_INFO, "%x\n", action);
265 case GSM_SAT_PROACTIVE_DISPLAY_TEXT :
267 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_DISPLAY_TEXT\n");
269 dp_text = (DP_TEXT *)(packet->data);
270 Display_Text(dp_text);
274 case GSM_SAT_PROACTIVE_GET_INKEY:
276 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_GET_INKEY\n");
277 get_inkey = (GET_INKEY *)(packet->data);
278 Get_Inkey(get_inkey);
282 case GSM_SAT_PROACTIVE_GET_INPUT:
284 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_GET_INPUT\n");
285 get_input = (GET_INPUT *)(packet->data);
286 Get_Input(get_input);
290 case GSM_SAT_PROACTIVE_SET_MENU:
292 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_SET_MENU\n");
293 Set_Menu(packet->data);
297 case GSM_SAT_PROACTIVE_SELECT_ITEM:
299 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_SELECT_ITEM\n");
300 Select_Item(packet->data);
303 case GSM_SAT_PROACTIVE_SEND_SMS:
305 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_SEND_SMS\n");
306 Send_SMS(packet->data);
309 case GSM_SAT_PROACTIVE_SET_UP_CALL:
311 log_msg(MSGL_VGSM_INFO,"Client - GSM_SAT_PROACTIVE_SET_UP_CALL\n");
312 Set_Up_Call(packet->data);
317 case GSM_SAT_ENVELOPE_COMMAND_REQ:
319 GSM_SatEnvelopeCmd cmd;
323 TxSAT_ExecEnvelopeCommand(&cmd);
326 case GSM_SAT_PROFILE_DOWNLOAD_SET:
328 GSM_SatProfileDown cmd;
330 cmd.result_code = length;
331 memcpy(cmd.usat_profile, p, 20);
332 TxSAT_SetProfileDownload(&cmd);
335 case GSM_SAT_TERMINATE_SESSION_SET:
337 TxSAT_SetTerminateUSATSession(p);
340 case GSM_SAT_PROVIDE_LOCAL_INFOMATION_GET:
342 unsigned char infoType;
344 TxSAT_GetProvideLocalInfo(infoType);
347 case GSM_SAT_POLLING_GET:
349 GSM_SatPollingGetType cmd;
350 cmd.pollReqType = *p++;
354 TxSAT_GetPolling(&cmd);
357 case GSM_SAT_REFRESH_GET:
359 GSM_SatRefreshGetType cmd;
360 cmd.refreshMode = *p++;
361 cmd.numOfFile = *p++;
362 cmd.filePathLength = *p++;
363 memcpy(cmd.fullFilePath, p, 256);
365 cmd.aidPresent = *p++;
366 memcpy(cmd.aid, p, 16);
367 TxSAT_GetRefresh(&cmd);
370 case GSM_SAT_SETUP_EVENT_LIST_GET:
372 GSM_SatEventListGetType cmd;
374 memcpy(cmd.eventList, p, 17);
375 TxSAT_GetSetupEventList(&cmd);
385 static void do_data(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
387 TRACE(MSGL_VGSM_INFO, "\n");
391 int action = packet->action;
392 //int length = packet->length;
393 //int client_id = ci->klass;
395 //char * p = (char *)(packet->data);
396 TRACE(MSGL_VGSM_INFO, "%x\n", action);
399 case GSM_DATA_STATUS :
400 server_tx_data_CallStatus(packet);
406 static void preprocess_do_gprs(LXT_MESSAGE * packet)
412 // preprocess gprs data from evt injector
413 char *p = (char *)(packet->data);
414 TRACE(MSGL_VGSM_CALL, "\n");
416 if (g_gprs_conflist.num > 0) {
418 for (i = 0; i < g_gprs_conflist.num; i++) {
419 GprsDbEntry rm_entry;
421 strcpy(rm_entry.apn, g_gprs_conflist.pentry[i].apn);
423 vgsm_gprs_database_remove(&rm_entry);
428 if(num < 0 || num > (254 * sizeof(int)) ) {
429 TRACE(MSGL_VGSM_INFO, "ERROR!! Invalid value of packet.data.\n");
433 pos = p + sizeof(int);
435 for (i = 0; i < num; i++ ) {
436 strcpy(entry.apn, (char *)pos);
437 strcpy(entry.intf, (char *)(pos + 255));
439 entry.ipconf.cid = pos[265];
441 memcpy((char *)(&(entry.ipconf.fieldflag)), pos + 266, 2);
442 memcpy((char *)(entry.ipconf.ip_addr), pos + 268, 4);
443 memcpy((char *)(entry.ipconf.primary_dns), pos + 272, 4);
444 memcpy((char *)(entry.ipconf.secondary_dns), pos + 276, 4);
445 memcpy((char *)(entry.ipconf.default_gateway), pos + 280, 4);
446 memcpy((char *)(entry.ipconf.subnet_mask), pos + 284, 4);
449 vgsm_gprs_database_add(&entry);
451 pos += 255 + 10 + 23;
457 static void do_gprs(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
460 int action = packet->action;
462 TRACE(MSGL_VGSM_CALL, "%x\n", action);
464 case GSM_GPRS_IP_CONFIGURATION:
465 // process VGSM specific job
466 preprocess_do_gprs(packet);
467 server_tx_gprs_IPConfigurationNotify(packet);
473 static void do_display_indicator(const LXT_MESSAGE * packet)
475 const unsigned char *p;
477 assert(packet->data);
478 assert(packet->length >= 4);
482 server_tx_display_icon_info_noti(p[0], p[1], p[2], p[3], GSM_NET_REG_STAT_REG_HOME);
485 static void do_display(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
487 TRACE(MSGL_VGSM_INFO, "\n");
491 int action = packet->action;
492 //int length = packet->length;
493 //int client_id = ci->klass;
495 //char * p = (char *)(packet->data);
496 TRACE(MSGL_VGSM_CALL, "do_display %x\n", action);
499 case GSM_DISPLAY_INDICATOR_NOTI :
500 do_display_indicator(packet);
505 static void do_power_battery_status(LXT_MESSAGE * packet)
507 unsigned char *p = packet->data;
510 assert(packet->length >= 1);
512 server_tx_battery_status_noti(level);
514 /* there seems to be two different messages that notify similar information - send both? */
516 server_tx_display_icon_info_noti(0x02, 0, level, 0, 0); /* only notify the battery level */
520 static void do_power(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
522 TRACE(MSGL_VGSM_INFO, "\n");
524 int action = packet->action;
526 TRACE(MSGL_VGSM_INFO, "do_power %x\n", action);
531 case GSM_POWER_MODEM_ON_REQ:
532 oem_rx_power_up_exec();
534 case GSM_POWER_BATTERY_STATUS_NOTI:
535 do_power_battery_status(packet);
542 static void do_network(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
544 int action = packet->action;
545 TRACE(MSGL_VGSM_INFO, "do_network %x\n", action);
549 case GSM_NETWORK_REG_NOTI:
550 server_tx_net_reg_noti(packet);
553 case GSM_NETWORK_PLMN_LIST:
554 server_tx_net_plmn_list_noti(packet);
557 case GSM_NETWORK_CURRENT_PLMN_NOTI:
558 server_tx_net_current_plmn_noti(packet);
560 case GSM_NETWORK_CURRENT_NITZ_INFO:
561 server_tx_net_current_nitz_noti(packet);
567 static void do_sim(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
569 log_msg(MSGL_VGSM_ERR,"\n");
571 int action = packet->action;
572 int length = packet->length;
575 char * p = (char *)(packet->data);
577 gsm_sec_lock_e_type type;
578 gsm_sec_status_type status;
579 gsm_sec_lock_mode_e_type flag;
581 char *password = NULL;
586 get_current_state_machine( ¤t );
587 TRACE(MSGL_VGSM_INFO, "do_sim %x\n", action);
588 TRACE(MSGL_VGSM_INFO, "current_state=[%x]\n\n", STATE_TYPE(current) );
593 /************************************************************************************/
597 /************************************************************************************/
598 case GSM_SIM_INIT_REQ:
599 server_sim_db_init();
603 case GSM_SIM_REINIT_REQ:
606 db_sim_info_add(i,NULL);
607 db_sim_data_add(i,NULL);
612 case GSM_SIM_STATUS_SET:
616 log_msg(MSGL_VGSM_ERR,"status=[%x]\n",status);
620 case GSM_SEC_STATUS_PIN_READY:
621 server_sec_set_sec_status(GSM_SIM_READY);
622 server_sec_reset_remain_cnt(GSM_SIM_READY);
623 server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_UNLOCK);
624 //server_tx_sim_sec_disable_facility();
627 case GSM_SEC_STATUS_PIN_REQ:
628 server_sec_set_sec_status(GSM_SIM_PIN_REQ_STATE);
629 server_sec_reset_remain_cnt(GSM_SIM_PIN_REQ_STATE);
630 server_sec_reset_remain_cnt(GSM_SIM_PUK_REQ);
631 server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_LOCK);
634 case GSM_SEC_STATUS_PUK_REQ:
635 server_sec_set_sec_status(GSM_SIM_PUK_REQ);
636 server_sec_set_cnt_zero(GSM_SIM_PIN_REQ_STATE);
637 server_sec_reset_remain_cnt(GSM_SIM_PUK_REQ);
638 server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_LOCK);
641 case GSM_SEC_STATUS_PIN2_REQ:
642 server_sec_set_sec2_status(GSM_SIM_PIN2_REQ);
643 server_sec_reset_remain_cnt(GSM_SIM_PIN2_REQ);
644 server_sec_reset_remain_cnt(GSM_SIM_PUK2_REQ);
645 //server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_LOCK);
648 case GSM_SEC_STATUS_PUK2_REQ:
649 server_sec_set_sec2_status(GSM_SIM_PUK2_REQ);
650 server_sec_set_cnt_zero(GSM_SIM_PIN2_REQ);
651 server_sec_reset_remain_cnt(GSM_SIM_PUK2_REQ);
652 //server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_LOCK);
655 case GSM_SEC_STATUS_PERM_BLOCKED:
656 server_sec_set_sec_status(GSM_SIM_FRIZEN);
657 server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_LOCK);
660 case GSM_SEC_STATUS_NO_SIM:
661 server_sec_set_sec_status(GSM_SIM_NO_SIM);
662 server_sec_set_facility(GSM_SIM_FACILITY_PIN, GSM_SEC_LOCK_MODE_LOCK);
665 case GSM_SEC_STATUS_PIN2_READY:
666 server_sec_set_sec2_status(GSM_SIM_PIN2_OK);
667 server_sec_reset_remain_cnt(GSM_SIM_PIN2_OK);
671 log_msg(MSGL_VGSM_ERR,"ERROR -Not handled status =[%d] in sim status set \n", status);
677 case GSM_SIM_CHANGE_PASS_SET :
680 password = malloc(length-1);
683 memcpy(password,&p[1],length-1);
687 case GSM_SEC_LOCK_TYPE_SC:
688 server_sec_change_password(password,GSM_SIM_PIN_REQ_STATE,length-1);
691 case GSM_SEC_LOCK_TYPE_SC2:
692 server_sec_change_password(password,GSM_SIM_PIN2_REQ,length-1);
695 case GSM_SEC_LOCL_TYPE_PUK:
696 server_sec_change_password(password,GSM_SIM_PUKSET_REQ,length-1);
698 case GSM_SEC_LOCL_TYPE_PUK2:
699 server_sec_change_password(password,GSM_SIM_PUK2SET_REQ,length-1);
704 log_msg(MSGL_VGSM_ERR,"ERROR -Not handled type =[%d] in change pw \n", type);
710 case GSM_SIM_FACILITY_SET:
715 log_msg(MSGL_VGSM_ERR,"GSM_SIM_FACILITY_SET - type, flag = [%d],[%d]\n", type, flag);
717 if(type == GSM_SEC_LOCK_TYPE_SC)
719 server_sec_set_facility(GSM_SIM_FACILITY_PIN,flag);
721 else if( type == GSM_SEC_LOCK_TYPE_FD)
723 server_sec_set_facility(GSM_SIM_FACILITY_FDN,flag);
727 log_msg(MSGL_VGSM_ERR,"ERROR - Not handled type =[%d] in facility set \n", type);
732 case GSM_SIM_GET_SIM_DB_REQ:
734 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_GET_SIM_DB_REQ\n");
735 db_sim_sec_restore(VGSM_SIMTypeget);
739 case GSM_SIMINFO_REQ:
744 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIMINFO_REQ\n");
745 list = (int*)packet->data;
746 log_msg(MSGL_VGSM_ERR,"list : %d\n",*list);
751 strcpy(table, "Tusim_li");
754 strcpy(table, "Tecc");
757 strcpy(table, "Tsst");
760 strcpy(table, "Test");
763 strcpy(table, "Tcphs");
766 strcpy(table, "Tspn");
769 strcpy(table, "Timsi");
772 db_sim_info_restore(table);
776 case GSM_SIMDATA_REQ:
781 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIMDATA_REQ\n");
782 list = (int*)packet->data;
783 log_msg(MSGL_VGSM_ERR,"list : %d\n",*list);
788 strcpy(table, "Ticcid");
791 strcpy(table, "Tusim_li");
794 strcpy(table, "Tecc");
797 strcpy(table, "Tsst");
800 strcpy(table, "Test");
803 strcpy(table, "Tspn");
806 strcpy(table, "Timsi");
809 db_sim_data_restore(table);
813 case GSM_SIMSAVE_REQ:
817 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIMDATA_REQ\n");
819 simd_t = (_SIMD_t*)packet->data;
821 log_msg(MSGL_VGSM_ERR,"1. type1 : %d, type2 : %d, size : %d\n",simd_t->type1, simd_t->type2, simd_t->size);
822 log_msg(MSGL_VGSM_ERR,"2. data : %x, %x, %x\n",simd_t->tmp[0], simd_t->tmp[1], simd_t->tmp[2]);
824 if(simd_t->type1 == 0)
825 db_sim_info_add(simd_t->type2, simd_t);
826 else if(simd_t->type1 == 1)
827 db_sim_data_add(simd_t->type2, simd_t);
829 log_msg(MSGL_VGSM_ERR,"ERROR, type1 : %d, type2 : %d\n", simd_t->type1, simd_t->type2);
834 /************************************************************************************/
838 /************************************************************************************/
840 case GSM_SIM_MAKE_PB_DB_REQ:
842 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_MAKE_PB_DB_REQ\n");
847 case GSM_SIM_ADD_PB_DB_REQ:
849 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_ADD_PB_DB_REQ\n");
851 pb = (PB *)(packet->data);
852 db_sim_pb_set_mgr(pb->db_st_type,1);
854 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_ADD_PB_DB_REQ : %d , %s ,%s, %s\n",pb->db_st_type,pb->name,pb->number,pb->address);
857 db_sim_pb_restore(pb);
862 case GSM_SIM_GET_PB_DB_REQ:
864 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_GET_PB_DB_REQ\n");
866 pb = (PB *)(packet->data);
868 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_GET_PB_DB_REQ : %d , %s \n",pb->db_st_type,pb->name);
871 db_sim_pb_restore(pb);
875 case GSM_SIM_DELETE_PB_DB_REQ:
877 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_DELETE_PB_DB_REQ\n");
879 pb = (PB *)(packet->data);
880 db_sim_pb_set_mgr(pb->db_st_type,1);
882 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_DELETE_PB_DB_REQ : %d , %s \n",pb->db_st_type,pb->name);
884 db_sim_pb_remove(pb);
885 db_sim_pb_restore(pb);
889 case GSM_SIM_GET_ALL_PB_DB_REQ:
891 log_msg(MSGL_VGSM_ERR,"action ->GSM_SIM_GET_ALL_PB_DB_REQ\n");
893 pb = (PB *)(packet->data);
894 //db_sim_pb_set_mgr(pb->db_st_type,1);
896 db_sim_pb_restore(pb);
901 log_msg(MSGL_VGSM_ERR,"ERROR - Not handled action =[%x] \n", action);
909 static void do_sups(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
911 int action = packet->action;
912 TRACE(MSGL_VGSM_INFO, "do_sups %x\n", action);
916 case GSM_SUPS_CONFERENCE:
917 server_tx_ss_state( SS_STATE_CONFERENCE );
920 server_tx_ss_state( SS_STATE_HOLD );
922 case GSM_SUPS_UNHOLD:
923 server_tx_ss_state( SS_STATE_UNHOLD );
926 case GSM_SUPS_SET_CW_REQ :
927 server_tx_ss_cw_set_req( packet);
930 case GSM_SUPS_SET_CCFC_REQ:
931 server_tx_ss_ccfc_set_req(packet);
934 case GSM_SUPS_SET_CB_REQ:
935 server_tx_ss_cb_set_req(packet);
938 case GSM_SUPS_AOC_GET:
939 server_tx_ss_aoc_get_req(packet);
941 case GSM_SUPS_AOC_SET:
942 server_tx_ss_aoc_set_req(packet);
945 // 090330 090406 //////////////////////////////////////////////
946 case GSM_SUPS_CW_SET:
947 server_tx_ss_cw_set_req(packet);
951 case GSM_SUPS_CW_GET:
952 server_tx_ss_cw_get_req(packet);
956 case GSM_SUPS_CF_SET:
957 server_tx_ss_cf_set_req(packet);
961 case GSM_SUPS_CF_GET:
962 server_tx_ss_cf_get_req(packet);
966 case GSM_SUPS_CB_SET:
967 server_tx_ss_cb_set_req(packet);
971 case GSM_SUPS_CB_GET:
972 server_tx_ss_cb_get_req(packet);
976 //090406//////////////////////////////////////////////////////////
978 case GSM_SUPS_USSD_SET :
979 server_tx_ss_ussd_set_req(packet);
982 case GSM_SUPS_USSD_GET :
983 server_tx_ss_ussd_get_req(packet);
987 TRACE(MSGL_VGSM_INFO, "do_sups no handle = %x\n", action);
991 static void do_emulator(PhoneServer * ps,
992 TClientInfo * ci, LXT_MESSAGE * packet)
994 int action = packet->action;
996 TRACE(MSGL_VGSM_INFO, "do_emulator %x\n", action);
999 case GSM_EMULATOR_HDLC_REQ:
1000 ATTxEmulator_HDLC_Req(packet);
1002 case GSM_EMULATOR_HDLC_MODE:
1003 ATTxEmulator_HDLC_Mode(packet);
1005 case GSM_EMULATOR_HDLC_CLEAR:
1006 ATTxEmulator_HDLC_Clear();
1008 case GSM_EMULATOR_SET_CALL_GENERAL_RESPONSE_ERROR:
1009 ATTxEmulator_Set_General_Response_Error(packet);
1011 case GSM_EMULATOR_SET_SS_GENERAL_RESPONSE_ERROR:
1012 ATTxEmulator_Set_SS_General_Response_Error(packet);
1014 case GSM_EMULATOR_SET_CALL_STATUS_ERROR:
1015 ATTxEmulator_Set_Call_Status_Error(packet);
1017 case GSM_EMULATOR_SET_SCA:
1018 ATTxEmulator_Set_SCA(packet);
1020 // ss error cause set
1021 case GSM_EMULATOR_SET_SS_HOLD_RESPONSE_ERROR:
1022 case GSM_EMULATOR_SET_SS_RETRIEVE_RESPONSE_ERROR:
1023 case GSM_EMULATOR_SET_SS_JOIN_RESPONSE_ERROR:
1024 case GSM_EMULATOR_SET_SS_SPLIT_RESPONSE_ERROR:
1025 case GSM_EMULATOR_SET_SS_TRANSFER_RESPONSE_ERROR:
1026 ATTxEmulator_Set_SS_Response_Error(packet, action);
1031 static void do_client(PhoneServer * ps,
1032 TClientInfo * ci, LXT_MESSAGE * packet)
1034 int action = packet->action;
1036 TRACE(MSGL_VGSM_INFO, "do_client %x\n", action);
1039 case GSM_CLIENT_RELEASE_NOTI:
1040 server_client_release_noti();
1046 static void do_sms(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
1049 int action = packet->action;
1052 TRACE(MSGL_VGSM_INFO, "do_sms %x\n", action);
1055 case GSM_SMS_SEND_MSG_REQ:
1056 server_tx_sms_notiIncomingMsg(packet);
1058 case GSM_SMS_SEND_ACK_REQ:
1059 p = (unsigned char *)packet->data;
1060 smsSentStatus = (int)p[0];
1061 if(smsSentStatus == 10 || smsSentStatus == 11){
1062 sprintf(vconf_cmd, "vconftool set -t int memory/telephony/mms_sent_status %d -i -f", (smsSentStatus - 10));
1063 TRACE(MSGL_VGSM_INFO, "system : %s\n", vconf_cmd);
1067 server_tx_sms_ReceiveAckMsg(packet);
1069 case GSM_SMS_INCOMING_CB_MSG_REQ:
1070 server_tx_sms_NotiIncomingCBMsg(packet);
1073 case GSM_SMS_SEND_MSG_REQ:
1074 TxSMS_ExecSendMsg(packet);
1076 case GSM_SMS_READ_MSG_REQ:
1077 TxSMS_GetReadMsg(packet);
1079 case GSM_SMS_SAVE_MSG_REQ:
1080 TxSMS_ExecSaveMsg(packet); // by luxmea
1082 case GSM_SMS_DEL_MSG_REQ:
1083 TxSMS_ExecDeleteMsg(packet);
1085 case GSM_SMS_SEND_ACK_REQ:
1086 TxSMS_SetSendAck(packet);
1088 case GSM_SMS_GET_SEL_MEM_REQ:
1089 TxSMS_GetSelectMem(packet);
1091 case GSM_SMS_SET_SEL_MEM_REQ:
1092 TxSMS_SetSelectMem(packet);
1094 case GSM_SMS_STORED_MSG_CNT_REQ:
1095 TxSMS_GetStoredMsgCount(packet);
1097 case GSM_SMS_GET_MSG_CONFIG_REQ:
1098 TxSMS_GetMsgConfig(packet);
1100 case GSM_SMS_SET_MSG_CONFIG_REQ:
1101 TxSMS_SetMsgConfig(packet);
1103 case GSM_SMS_GET_SVC_OPTION_REQ:
1104 TxSMS_GetSvcOption(packet);
1106 case GSM_SMS_SET_SVC_OPTION_REQ:
1107 TxSMS_SetSvcOption(packet);
1109 case GSM_SMS_MEM_FULL_REQ:
1110 TxSMS_SetMemFull(packet);
1112 case GSM_SMS_GET_CB_CONFIG_REQ:
1113 TxSMS_GetCBConfig(packet);
1115 case GSM_SMS_SET_CB_CONFIG_REQ:
1116 TxSMS_SetCBConfig(packet);
1118 case GSM_SMS_SET_MSG_STATUS_REQ:
1119 TxSMS_SetMsgStatus(packet);
1121 case GSM_SMS_SET_BLK_LIST_REQ:
1122 TxSMS_SetBlkList(packet);
1125 TxSMS_DefaultSms(0, 0);
1131 char AT_Result[MAX_RESULT_LENGTH] = {0, };
1133 memcpy(buffer, p, length);
1135 error = SMSFunc->SendMessage(&GlobalS, buffer, AT_Result);
1137 if (error == ERR_TIMEOUT)
1138 TRACE(MSGL_VGSM_INFO, "MS TIMEOUT Error\n");
1141 FuncResponse->ResponseSMS(klass, AT_Result);
1147 static int IsFligthMode()
1151 fd = open("/setting/flightmode.conf\n", O_RDONLY);
1161 static void do_internal(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
1163 int klass = ci->klass;
1164 int clientfd = ci->fd;
1165 int action = packet->action;
1166 int length = packet->length;
1168 TRACE(MSGL_VGSM_INFO, "do_internal %x\n", action);
1170 char * p = (char *)(packet->data);
1174 case LXT_PDA_INTERNAL_ID_REQUEST :
1178 clientid = (int)packed_S32((unsigned char *)p);
1180 TRACE(MSGL_VGSM_INFO, "ERROR!! Invalid value of clientid.\n");
1181 ci->klass = clientid;
1182 TRACE(MSGL_VGSM_INFO, "LXT_PDA_INTERNAL_ID_REQUEST [0x%x]: %s\n", clientid, clientName[clientid]);
1184 // nsclass : when user change language setting.
1186 if (LXT_ID_CLIENT_INDICATOR == clientid) {
1187 if (!IsFligthMode()) {
1188 if (LXT_STATE_OFF == FuncPhoneServer->GetInternalState(&GlobalPS)) {
1189 GSM_PhonePowerOn(0);
1194 /******************/
1198 case LXT_PDA_INTERNAL_MISSED_MESSAGE_REQUEST :
1200 Server * server = &ps->ServerSocket;
1201 TRACE(MSGL_VGSM_INFO, "LXT_PDA_INTERNAL_MISSED_MESSAGE_REQUEST \n");
1204 server->Functions->CastMissedMessage(ps, klass, clientfd);
1209 case LXT_PDA_INTERNAL_STATE_REQUEST :
1211 TRACE(MSGL_VGSM_INFO, "LXT_PDA_INTERNAL_MISSED_MESSAGE_REQUEST ..WARNING: it's not implemented\n");
1212 // nsclass : when user change language setting. phone power off sound
1214 if (LXT_ID_CLIENT_INDICATOR == klass) {
1215 if (!IsFligthMode())
1218 FuncPhoneServer->CastCurrentInternalStatus(&GlobalPS, klass);
1220 /******************/
1224 case LXT_PDA_INTERNAL_LAUNCH_SAT_APP_REQUEST:
1227 TAPIMessageInit(&packet);
1228 TRACE(MSGL_VGSM_INFO, "LXT_PDA_INTERNAL_LAUNCH_SAT_APP_REQUEST\n");
1229 packet.group = LXT_GRP_INTERNAL;
1230 packet.action = LXT_PDA_INTERNAL_LAUNCH_SAT_APP_RESPONSE;
1231 FuncServer->Cast(&GlobalPS, LXT_ID_CLIENT_CARD_MANAGER, &packet);
1234 case LXT_PDA_INTERNAL_SETUP_SAT_APP_REQUEST:
1237 TAPIMessageInit(&packet);
1238 TRACE(MSGL_VGSM_INFO, "LXT_PDA_INTERNAL_SETUP_SAT_APP_REQUEST\n");
1239 packet.group = LXT_GRP_INTERNAL;
1240 packet.action = LXT_PDA_INTERNAL_SETUP_SAT_APP_RESPONSE;
1241 packet.length = length;
1242 packet.data = (void *)p;
1243 FuncServer->Cast(&GlobalPS, LXT_ID_CLIENT_CARD_MANAGER, &packet);
1247 case LXT_PDA_INTERNAL_PHONE_BATTERY_REQUEST:
1249 TRACE(MSGL_VGSM_INFO, "Request phone battery\n");
1250 log_msg(MSGL_VGSM_INFO,"WARNING: it's not implemented \n");
1259 void do_power(PhoneServer* ps, TClientInfo * ci, LXT_MESSAGE * packet)
1263 int action = packet->action;
1264 int length = packet->length;
1266 char * p = (char *)(packet->data);
1270 case LXT_PDA_POWER_ON_REQUEST :
1272 * Interanl state\B4\C2 \BD\C7\C1\A6 dpram event\BF\A1\BC\AD active\B8\A6 Ȯ\C0\CE\C7\D1 \C8Ŀ\A1 ó\B8\AE
1274 Device->PowerOnDevice(&GlobalS, 0);
1277 case LXT_PDA_POWER_OFF_REQUEST :
1281 // FuncPhoneServer->BroadcastInternalStatus(&GlobalPS, LXT_STATE_OFF);
1282 // error = MiscFunc->PowerOff(&GlobalS);
1283 // Device->PowerOffDevice(&GlobalS);
1285 /* Phone doesn't seem to respond correctly to the Power-Off request.
1286 After Power-Off request, we got Phone-Active signals repeatedly. civily, 2005.09.26 [
1287 TxPWR_ExecPhonePowerOff();
1288 */ // civily, 2005.09.26 ]
1289 TxPWR_ExecPhonePowerOff();
1290 FuncPhoneServer->BroadcastInternalStatus(&GlobalPS, LXT_STATE_OFF);
1294 TRACE(MSGL_VGSM_INFO, "nexpected request cmd from clients 0x%02x\n", action);
1300 static void do_call(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
1302 TRACE(MSGL_VGSM_INFO, "\n");
1304 int action = packet->action;
1307 TRACE(MSGL_VGSM_INFO, "do_call %x\n", action);
1311 case GSM_CALL_MAKE_REQ :
1312 log_msg(MSGL_VGSM_INFO,"GSM_CALL_MAKE_REQ\n");
1313 server_tx_call_incoming_noti(packet);
1316 case GSM_CALL_HANGUP_REQ :
1317 log_msg(MSGL_VGSM_INFO,"GSM_CALL_HANGUP_REQ\n");
1318 server_tx_call_release_exec(packet);
1321 case GSM_CALL_ANSWER_REQ :
1322 log_msg(MSGL_VGSM_INFO,"GSM_CALL_ANSWER_REQ\n");
1324 int active = get_active_call_count();
1325 int hold = get_hold_call_count();
1327 if(active >=1 && hold >= 1)
1329 log_msg(MSGL_VGSM_INFO,"======== 1 active + 1held call ========\n");
1334 log_msg(MSGL_VGSM_INFO,"======== 1 active call ========\n");
1336 server_tx_call_list_noti();
1340 log_msg(MSGL_VGSM_INFO,"======== no established call! ========\n");
1341 server_tx_call_answer_exec();
1345 case GSM_CALL_ALERT_IND:
1346 log_msg(MSGL_VGSM_INFO,"GSM_CALL_ALERT_IND\n");
1347 server_tx_call_alert_ind(packet->data, packet->length);
1351 case GSM_EMULATOR_SET_SS_GENERAL_RESPONSE_ERROR:
1352 log_msg(MSGL_VGSM_INFO,"GSM_EMULATOR_SET_SS_GENERAL_RESPONSE_ERROR\n");
1353 ATTxEmulator_Set_General_Response_Error(packet);
1354 error = get_general_response_error();
1355 log_msg(MSGL_VGSM_INFO,"======== Disconnect! error set %x ========\n", error);
1364 void do_sound(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
1366 TRACE(MSGL_VGSM_INFO, "\n" );
1370 int klass = ci->klass;
1371 int action = packet->action;
1372 int length = packet->length;
1374 char * ptr = (char *)(packet->data);
1378 case GSM_SND_AUDIO_PATH_CTRL_REQ:
1380 GSM_SoundAudioPathType type;
1382 TxSND_SetAudioPathCtrl(type);
1386 case GSM_SND_SET_SPKR_VOLUME_CTRL_REQ:
1388 TxSND_SetVolumeCtrl(ptr[0], ptr[1]);
1392 case GSM_SND_NOTI_TONE_REQ:
1394 GSM_SndNotiToneSet tone;
1397 tone.volume = ptr[0];
1398 tone.count = ptr[0];
1399 tone.tone_type = ptr[0];
1401 TxSND_SetNotiTone(&tone);
1405 case GSM_SND_GET_GAIN_CTRL_REQ:
1406 TxSND_GetGainCtrl(ptr);
1409 case GSM_SND_SET_GAIN_CTRL_REQ:
1410 TxSND_ExecGainCtrl(ptr);
1413 case GSM_SND_SET_MIC_MUTE_CTRL_REQ:
1415 GSM_SoundMuteStatusType mute;
1418 TxSND_SetMICMuteCtrl(mute);
1427 void do_svcmode(PhoneServer * ps, TClientInfo * ci, LXT_MESSAGE * packet)
1429 TRACE(MSGL_VGSM_INFO, "\n" );
1431 char *ptr = (char *) packet->data;
1433 switch (packet->action)
1435 case GSM_SVCMODE_ENTER_REQ:
1436 TxSVCMode_SetEnterServiceMode(ptr);
1439 case GSM_SVCMODE_END_REQ:
1440 TxSVCMode_SetEndServiceMode(ptr[0]);
1443 case GSM_SVCMODE_PROCESS_KEY_REQ:
1444 TxSVCMode_SetProcessKeyCode(ptr[0]);
1450 static int client_callback(PhoneServer * ps, int fd, EloopCondition cond, void * data)
1452 log_msg(MSGL_VGSM_INFO," client_callback fd=%d \n",fd);
1453 TClientInfo * ci = data;
1460 //int klass = ci->klass;
1461 int clientfd = ci->fd;
1464 //unsigned char * p = 0;
1466 TAPIMessageInit(&packet);
1468 rc = ReadPacketBytes4(clientfd, &packet);
1472 Server * server = &ps->ServerSocket;
1475 TRACE(MSGL_VGSM_INFO, "Client was disconnected\n");
1476 server->Functions->RemoveClient(ps, ci);
1481 if (packet.length > 0)
1483 packet.data = (unsigned char *) PacketDataMalloc(packet.length + 1);
1484 rc = ReadBytes(clientfd, packet.data, packet.length);
1485 //p = (unsigned char *)packet.data;
1488 group = packet.group;
1489 action = packet.action;
1490 length = packet.length;
1492 TRACE(MSGL_VGSM_INFO, "in client_callback, group : %x\n", group);
1494 if(vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi)) {
1495 TRACE(MSGL_WARN, "vconf_get_int(%s) fail\n", VCONFKEY_TELEPHONY_RSSI);
1501 change_state_machine( GSM_CALL_CMD );
1502 if( is_flight_mode() ){
1503 TRACE(MSGL_VGSM_INFO, "Flight mode on \n");
1505 } else if(rssi == 0) {
1506 TRACE(MSGL_VGSM_INFO, "RSSI is zero \n");
1509 TRACE(MSGL_VGSM_INFO, "Call ok \n");
1510 do_call(ps, ci, &packet);
1514 do_network(ps, ci, &packet);
1517 do_sups(ps, ci, &packet);
1520 if( is_flight_mode() ){
1521 TRACE(MSGL_VGSM_INFO, "Flight mode on \n");
1522 sms_response_for_eventinjector();
1523 } else if(rssi == 0) {
1524 TRACE(MSGL_VGSM_INFO, "RSSI is zero \n");
1525 sms_response_for_eventinjector();
1527 TRACE(MSGL_VGSM_INFO, "SMS ok \n");
1528 do_sms(ps, ci, &packet);
1532 do_display(ps, ci, &packet);
1535 do_sim(ps, ci, &packet);
1538 do_data(ps, ci, &packet);
1541 do_sat(ps, ci, &packet);
1544 do_emulator(ps, ci, &packet);
1547 do_gprs(ps, ci, &packet);
1550 do_power(ps, ci, &packet);
1553 do_client(ps, ci, &packet);
1555 case LXT_GRP_INTERNAL :
1556 do_internal(ps, ci, &packet);
1559 case RESTORE_EI_DATA :
1560 do_restore_ei(ps, ci, &packet);
1564 case LXT_GRP_POWER :
1566 if (GlobalS.Phone.Data.RamDump == true)
1568 FuncResponse->ResponseRamDump(ci->klass);
1573 do_power(ps, ci, &packet);
1578 if (GlobalS.Phone.Data.PhonePower == false)
1581 do_call(ps, ci, &packet);
1586 if (GlobalS.Phone.Data.RamDump == true)
1588 if (action == GSM_MISC_RAMDUMP_REQ)
1589 do_misc(ps, ci, &packet);
1591 FuncResponse->ResponseRamDump(ci->klass);
1596 if (GlobalS.Phone.Data.PhonePower == false)
1598 do_misc(ps, ci, &packet);
1603 if (GlobalS.Phone.Data.RamDump == true)
1605 FuncResponse->ResponseRamDump(ci->klass);
1610 // if (GlobalS.Phone.Data.PhonePower == false)
1612 do_sms(ps, ci, &packet);
1617 if (GlobalS.Phone.Data.RamDump == true)
1619 FuncResponse->ResponseRamDump(ci->klass);
1624 if (GlobalS.Phone.Data.PhonePower == false)
1626 do_sups(ps, ci, &packet);
1631 if (GlobalS.Phone.Data.RamDump == true)
1633 FuncResponse->ResponseRamDump(ci->klass);
1638 if (GlobalS.Phone.Data.PhonePower == false)
1640 do_sim(ps, ci, &packet);
1645 if (GlobalS.Phone.Data.RamDump == true)
1647 FuncResponse->ResponseRamDump(ci->klass);
1651 if (GlobalS.Phone.Data.PhonePower == false)
1653 do_network(ps, ci, &packet);
1658 if (GlobalS.Phone.Data.RamDump == true)
1660 FuncResponse->ResponseRamDump(ci->klass);
1665 if (GlobalS.Phone.Data.PhonePower == false)
1667 do_data(ps, ci, &packet);
1671 if (GlobalS.Phone.Data.PhonePower == false)
1673 do_sound(ps, ci, &packet);
1678 if (GlobalS.Phone.Data.RamDump == true)
1680 FuncResponse->ResponseRamDump(ci->klass);
1685 if (GlobalS.Phone.Data.PhonePower == false)
1687 do_ext(ps, ci, &packet);
1690 case GSM_SERVICEMODE:
1691 if (GlobalS.Phone.Data.PhonePower == false)
1693 do_svcmode(ps, ci, &packet);
1698 if (GlobalS.Phone.Data.RamDump == true)
1700 FuncResponse->ResponseRamDump(ci->klass);
1705 if (GlobalS.Phone.Data.PhonePower == false)
1707 do_emulator(ps, ci, &packet);
1712 TAPIMessageFree(&packet);
1716 FunctionsClient ClientHandle =