Make TIZEN 2.0
[apps/home/call.git] / call-engine / core / vc-core-ecc.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.tizenopensource.org/license
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "vc-core-ecc.h"
18 #include "vc-core-util.h"
19
20 /**
21  * This function checks whether the given number is emergency number by verifying with no sim emergency numbers
22  *
23  * @return              TRUE if the number is emergency number, FALSE otherwise
24  * @param[in]           pNumber         number to be verified
25  */
26 static gboolean __vc_core_ecc_check_emergency_number_nosim(const char *pNumber);
27
28 static char *gcall_vc_ecc_numbers_default[] = {
29         "112",
30         "911"
31 };
32
33 /**
34  * This function checks whether the given number is emergency number by verifying with sim emergency numbers
35  *
36  * @return              TRUE if the number is emergency number, FALSE otherwise
37  * @param[in]           card_type       simcard type
38  * @param[in]           pNumber         number to be verified
39  */
40 gboolean _vc_core_ecc_check_emergency_number(TapiHandle *tapi_handle, TelSimCardType_t card_type, char *pNumber, gboolean b_is_no_sim, int *ecc_category)
41 {
42         int i = 0;
43         int ecc_count = 0;
44         char **p_ecc_numbers = NULL;
45         TapiResult_t tapi_err = TAPI_API_SUCCESS;
46         unsigned long mcc = 0;  /* for checking Emergency number for each country */
47         unsigned long mnc = 0;  /* for checking Emergency number for each operator */
48
49         VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL);
50         VOICECALL_RETURN_FALSE_IF_FAIL(ecc_category != NULL);
51
52         CALL_ENG_DEBUG(ENG_DEBUG, "pNumber = %s", pNumber);
53         *ecc_category = 0;
54
55         if (b_is_no_sim == TRUE) {
56                 return __vc_core_ecc_check_emergency_number_nosim(pNumber);
57         }
58
59         _vc_core_util_get_mcc(&mcc);
60         _vc_core_util_get_mnc(&mnc);
61
62         switch (card_type) {
63         case TAPI_SIM_CARD_TYPE_GSM:
64                 {
65                         TelSimEccList_t sim_ecc_list;   /* used to get data for the Ecc information for 2G and 3G. */
66
67                         CALL_ENG_DEBUG(ENG_DEBUG, "[SimCardType=SIM_CARD_TYPE_GSM]");
68                         memset(&sim_ecc_list, 0x00, sizeof(TelSimEccList_t));
69
70                         /*TAPI api Compliance */
71                         /*To get Emergency data of 2G */
72                         tapi_err = tel_get_sim_ecc(tapi_handle, &sim_ecc_list);
73
74                         if (TAPI_API_SUCCESS != tapi_err) {
75                                 CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_ecc_info failed, tapi_err=%d", tapi_err);
76                                 return FALSE;
77                         }
78
79                         if (sim_ecc_list.ecc_count > 0) {
80                                 CALL_ENG_DEBUG(ENG_DEBUG, "GSM pNumber ecc1(%s) ecc2(%s) ecc3(%s) ecc4(%s) ecc5(%s)",
81                                                sim_ecc_list.list[0].number, sim_ecc_list.list[1].number, sim_ecc_list.list[2].number, sim_ecc_list.list[3].number, sim_ecc_list.list[4].number);
82
83                                 if ((strcmp(pNumber, sim_ecc_list.list[0].number) == 0)
84                                         || (strcmp(pNumber, sim_ecc_list.list[1].number) == 0)
85                                         || (strcmp(pNumber, sim_ecc_list.list[2].number) == 0)
86                                         || (strcmp(pNumber, sim_ecc_list.list[3].number) == 0)
87                                         || (strcmp(pNumber, sim_ecc_list.list[4].number) == 0)) {
88                                         CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_check_emergency_number: return TRUE");
89                                         return TRUE;
90                                 }
91                         }
92                 }
93                 break;
94         case TAPI_SIM_CARD_TYPE_USIM:
95                 {
96                         TelSimEccList_t usim_ecc_list;                  /* used to get data for the Ecc information for both 2G and 3G */
97
98                         CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=SIM_CARD_TYPE_USIM");
99                         memset(&usim_ecc_list, 0x00, sizeof(TelSimEccList_t));
100
101                         /*Synchronous function used to get ECC data */
102                         tapi_err = tel_get_sim_ecc(tapi_handle, &usim_ecc_list);
103
104                         if (TAPI_API_SUCCESS != tapi_err) {
105                                 CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_usim_ecc_info failed, tapi_err=%d", tapi_err);
106                                 return FALSE;
107                         }
108
109                         if (usim_ecc_list.ecc_count > 0) {
110                                 for (i = 0; i < usim_ecc_list.ecc_count; i++) {
111                                         CALL_ENG_DEBUG(ENG_DEBUG, "[ecc=%s, category:[%d]]", usim_ecc_list.list[i].number, usim_ecc_list.list[i].category);
112                                         if (!strcmp(pNumber, usim_ecc_list.list[i].number)) {
113                                                 *ecc_category = usim_ecc_list.list[i].category;
114                                                 CALL_ENG_DEBUG(ENG_DEBUG, "uecc matched!!");
115                                                 return TRUE;
116                                         }
117                                 }
118                         }
119                 }
120                 break;
121         case TAPI_SIM_CARD_TYPE_RUIM:
122                 CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=TAPI_SIM_CARD_TYPE_RUIM");
123                 break;
124         case TAPI_SIM_CARD_TYPE_IMS:
125                 CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=TAPI_SIM_CARD_TYPE_IMS");
126                 break;
127         case TAPI_SIM_CARD_TYPE_UNKNOWN:
128                 CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=SIM_CARD_TYPE_UNKNOWN");
129                 break;
130         }
131
132         /* There is no ecc number in the SIM card. */
133         CALL_ENG_DEBUG(ENG_DEBUG, "mcc : %ld", mcc);
134
135         switch (mcc) {
136         default:
137                 ecc_count = CALL_ECC_MAX_COUNT_DEFAULT;
138                 p_ecc_numbers = gcall_vc_ecc_numbers_default;   /*112, 911 */
139                 break;
140         }
141
142         VOICECALL_RETURN_FALSE_IF_FAIL(ecc_count > 0);
143         VOICECALL_RETURN_FALSE_IF_FAIL(p_ecc_numbers != NULL);
144
145         for (i = 0; i < ecc_count; i++) {
146                 if (!strcmp(pNumber, p_ecc_numbers[i])) {
147                         CALL_ENG_DEBUG(ENG_DEBUG, "pNumber (%s), p_ecc_numbers[%d] (%s)", pNumber, i, p_ecc_numbers[i]);
148                         return TRUE;
149                 }
150         }
151
152         CALL_ENG_DEBUG(ENG_DEBUG, "No emegency number...");
153         return FALSE;
154 }
155
156 /* No SIM - Default*/
157 static char *gcall_vc_ecc_numbers_nosim_default[] = {
158         "000",
159         "112",
160         "110",
161         "118",
162         "119",
163         "911",
164         "999"
165 };
166
167 static gboolean __vc_core_ecc_check_emergency_number_nosim(const char *pNumber)
168 {
169         int i = 0;
170         int ecc_count = 0;
171         char **p_nosim_ecc_numbers = NULL;
172         unsigned long mcc = 0;  /* for checking Emergency number for each country */
173         unsigned long mnc = 0;  /* for checking Emergency number for each operator */
174
175         VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL);
176
177         if (strlen(pNumber) == 0) {
178                 CALL_ENG_DEBUG(ENG_DEBUG, "pNumber's length is ZERO so return FALSE");
179                 return FALSE;
180         }
181
182         _vc_core_util_get_mcc(&mcc);
183         _vc_core_util_get_mnc(&mnc);
184
185         CALL_ENG_DEBUG(ENG_DEBUG, "mcc : %ld", mcc);
186
187         switch (mcc) {
188         default:
189                 ecc_count = CALL_ECC_MAX_COUNT_DEFAULT_NO_SIM;
190                 p_nosim_ecc_numbers = gcall_vc_ecc_numbers_nosim_default;       /*3GPP SPecs = 000, 08, 112, 100, 118, 119, 911 */
191                 break;
192         }
193
194         VOICECALL_RETURN_FALSE_IF_FAIL(ecc_count > 0);
195         VOICECALL_RETURN_FALSE_IF_FAIL(p_nosim_ecc_numbers != NULL);
196
197         for (i = 0; i < ecc_count; i++) {
198                 if (!strcmp(pNumber, p_nosim_ecc_numbers[i])) {
199                         CALL_ENG_DEBUG(ENG_DEBUG, "pNumber (%s), p_nosim_ecc_numbers[%d] (%s)", pNumber, i, p_nosim_ecc_numbers[i]);
200                         return TRUE;
201                 }
202         }
203
204         CALL_ENG_DEBUG(ENG_DEBUG, "No emegency number...");
205
206         return FALSE;
207 }