add new files to open just into INTEL.
[apps/core/preloaded/ciss.git] / src / ciss-tapi-request.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 "ciss-tapi-request.h"
18 #include "ciss-parser.h"
19 #include "ciss-util.h"
20 #include "vconf.h"
21 #include "ciss-debug.h"
22 #include "ciss-string.h"
23 #include "ciss-widget.h"
24 #include "ciss-ussd.h"
25 #include "ciss-resp.h"
26 #include "ciss-converter.h"
27
28 static void __ciss_tapi_ss_rel_complete_cb(TapiHandle *tapi_handle, const char *noti_id, void *data, void *user_data);
29 static void __ciss_ss_forward_resp_cb(TapiHandle *handle, int result, void *data, void *user_data);
30 static void __ciss_ss_barring_resp_cb(TapiHandle *handle, int result, void *data, void *user_data);
31 static void __ciss_ss_waiting_resp_cb(TapiHandle *handle, int result, void *data, void *user_data);
32 static void __ciss_ss_cli_resp_cb(TapiHandle *handle, int result, void *data, void *user_data);
33 static void __ciss_change_ss_barring_pw_resp_cb(TapiHandle *handle, int result, void *data, void *user_data);
34 static void __ciss_ss_ussd_resp_cb(TapiHandle *handle, int result, void *data, void *user_data);
35
36 EventHandler event_list[] = {
37         {TAPI_NOTIFY_SS_REL_COMP_MSG, 0, __ciss_tapi_ss_rel_complete_cb},
38 };
39
40 int _ciss_tapi_event_setup(ciss_appdata_t *ad)
41 {
42         DBG("Enter");
43         int i = 0;
44         int len = 0;
45         int api_err = -1;
46
47         len = sizeof(event_list) / sizeof(EventHandler);
48
49         ad->tapi_handle = tel_init(NULL);
50         if (ad->tapi_handle) {
51                 for (i = 0; i < len; i++) {
52                         api_err = tel_register_noti_event(ad->tapi_handle, event_list[i].event_type, event_list[i].func, (void *) ad);
53                         if (api_err != TAPI_API_SUCCESS) {
54                                 DBG("tapi_register_noti_event() ret : %d", api_err);
55                                 break;
56                         }
57                 }
58         } else {
59                 DBG("tapi_init() failed.");
60         }
61
62         DBG("Leave");
63         return 0;
64 }
65
66 void _ciss_deregister_tel_event(void *data)
67 {
68         DBG("Enter");
69         ret_if(data == NULL);
70
71         ciss_appdata_t *ad = (ciss_appdata_t *)data;
72         int ret = TAPI_API_SUCCESS;
73
74         ret = tel_deinit(ad->tapi_handle);
75         if (ret != TAPI_API_SUCCESS)
76                 DBG("tapi_deinit() ret : %d", ret);
77 }
78
79 ciss_err_t _ciss_send_tapi_request(ciss_mmi_context_t *mmi_ctx, void *data)
80 {
81         DBG("Enter");
82
83         retv_if(data == NULL, CISS_ERR_UNKNOWN);
84
85         ciss_appdata_t *ad = (ciss_appdata_t *)data;
86         TelSsUssdMsgInfo_t stUssdRecord;
87         TelSsForwardInfo_t stCfActReq;
88         TelSsBarringInfo_t stCbReq;
89         TelSsWaitingInfo_t stCwReq;
90         int err = TAPI_API_SUCCESS;
91         TelSsCliType_t cliType;
92         ciss_err_t error_code = CISS_ERR_NONE;
93
94         if (mmi_ctx->ss_type == CISS_SERVICE_FORWARDING) {
95                 memset(&stCfActReq, 0, sizeof(TelSsForwardInfo_t));
96                 stCfActReq.Condition = (TelSsForwardWhen_t) mmi_ctx->ss_flavor;
97                 DBG("\n [CISS-ENGINE] ss_flavor= %d,%d", stCfActReq.Condition, mmi_ctx->ss_flavor);
98
99                 stCfActReq.Class = mmi_ctx->tapi_bsg;
100                 stCfActReq.NoReplyConditionTimer = mmi_ctx->nr_timer;
101                 strncpy((char *)stCfActReq.szPhoneNumber, mmi_ctx->forward_number, CISS_NUMBER_LEN_MAX);
102                 stCfActReq.szPhoneNumber[CISS_NUMBER_LEN_MAX] = '\0';
103         } else if (mmi_ctx->ss_type == CISS_SERVICE_BARRING) {
104                 memset(&stCbReq, 0, sizeof(TelSsBarringInfo_t));
105                 stCbReq.Type = (TelSsBarringType_t) mmi_ctx->ss_flavor;
106                 DBG("\n [CISS-ENGINE] ss_flavor= %d,%d", stCbReq.Type, mmi_ctx->ss_flavor);
107                 stCbReq.Class = mmi_ctx->tapi_bsg;
108                 memcpy(&stCbReq.szPassword, mmi_ctx->ss_password, CISS_MAX_PASSWORD_LEN);
109         } else if (mmi_ctx->ss_type == CISS_SERVICE_WAITING) {
110                 memset(&stCwReq, 0, sizeof(TelSsWaitingInfo_t));
111                 stCwReq.Class = mmi_ctx->tapi_bsg;
112         }
113         switch (mmi_ctx->opcode) {
114         case registerSS:
115                 DBG("registerSS");
116                 if (mmi_ctx->ss_type == CISS_SERVICE_FORWARDING) {
117                         stCfActReq.Mode = TAPI_SS_CF_MODE_REGISTRATION_EV;
118
119                         err = tel_set_ss_forward(ad->tapi_handle, &stCfActReq, __ciss_ss_forward_resp_cb, ad);
120                         if (err != TAPI_API_SUCCESS) {
121                                 DBG("\n [CISS-ENGINE] tel_set_ss_forward : REGISTRATION call fails g_err_code = %x", err);
122                                 _ciss_get_error_from_tapi_error(&error_code, err);
123                                 return error_code;
124                         }
125                 }
126                 break;
127         case eraseSS:
128                 DBG("eraseSS");
129                 if (mmi_ctx->ss_type == CISS_SERVICE_FORWARDING) {
130                         stCfActReq.Mode = TAPI_SS_CF_MODE_ERASURE_EV;
131
132                         err = tel_set_ss_forward(ad->tapi_handle, &stCfActReq, __ciss_ss_forward_resp_cb, ad);
133                         if (err != TAPI_API_SUCCESS) {
134                                 DBG("\n [CISS-ENGINE] tel_set_ss_forward : DE-REGISTRATION call fails g_err_code = %x", err);
135                                 _ciss_get_error_from_tapi_error(&error_code, err);
136                         }
137                 }
138                 break;
139         case activateSS:
140                 DBG("activateSS");
141                 switch(mmi_ctx->ss_type){
142                 case CISS_SERVICE_FORWARDING:
143                         stCfActReq.Mode = TAPI_SS_CF_MODE_ENABLE_EV;
144
145                         err = tel_set_ss_forward(ad->tapi_handle, &stCfActReq, __ciss_ss_forward_resp_cb, ad);
146                         if (err != TAPI_API_SUCCESS) {
147                                 DBG("\n [CISS-ENGINE] tel_set_ss_forward : ACTIVATE call fails g_err_code = %x", err);
148                                 _ciss_get_error_from_tapi_error(&error_code, err);
149                         }
150                         break;
151                 case CISS_SERVICE_BARRING:
152                         stCbReq.Mode = TAPI_SS_CB_MODE_ACTIVATE;
153
154                         err = tel_set_ss_barring(ad->tapi_handle, &stCbReq, __ciss_ss_barring_resp_cb, ad);
155                         if (err != TAPI_API_SUCCESS) {
156                                 DBG("\n [CISS-ENGINE] tel_set_ss_barring : ACTIVATE call fails g_err_code = %x", err);
157                                 _ciss_get_error_from_tapi_error(&error_code, err);
158                         }
159                         break;
160                 case CISS_SERVICE_WAITING:
161                         stCwReq.Mode = TAPI_SS_CW_MODE_ACTIVATE;
162
163                         err = tel_set_ss_waiting(ad->tapi_handle, &stCwReq, __ciss_ss_waiting_resp_cb, ad);
164                         if (err != TAPI_API_SUCCESS) {
165                                 DBG("\n [CISS-ENGINE] tel_set_ss_waiting : ACTIVATION call fails g_err_code = %x", err);
166                                 _ciss_get_error_from_tapi_error(&error_code, err);
167                         }
168                         break;
169                 case CISS_SERVICE_IDENTIFICATION:
170                         DBG("\n [CISS-ENGINE] Don't activated CLI option");
171                         error_code = CISS_ERR_ILLEGAL_SS_OPER;
172                         break;
173                 }
174                 break;
175         case deactivateSS:
176                 DBG("deactivateSS");
177                 switch(mmi_ctx->ss_type){
178                 case CISS_SERVICE_FORWARDING:
179                         stCfActReq.Mode = TAPI_SS_CF_MODE_DISABLE_EV;
180                         err = tel_set_ss_forward(ad->tapi_handle, &stCfActReq, __ciss_ss_forward_resp_cb, ad);
181                         if (err != TAPI_API_SUCCESS) {
182                                 DBG("\n [CISS-ENGINE] tel_set_ss_forward : DEACTIVATE call fails g_err_code = %x", err);
183                                 _ciss_get_error_from_tapi_error(&error_code, err);
184                         }
185                         break;
186                 case CISS_SERVICE_BARRING:
187                         stCbReq.Mode = TAPI_SS_CB_MODE_DEACTIVATE;
188                         err = tel_set_ss_barring(ad->tapi_handle, &stCbReq, __ciss_ss_barring_resp_cb, ad);
189                         if (err != TAPI_API_SUCCESS) {
190                                 DBG("\n [CISS-ENGINE] tel_set_ss_barring : DEACTIVATE call fails g_err_code = %x", err);
191                                 _ciss_get_error_from_tapi_error(&error_code, err);
192                         }
193                         break;
194                 case CISS_SERVICE_WAITING:
195                         stCwReq.Mode = TAPI_SS_CW_MODE_DEACTIVATE;
196                         err = tel_set_ss_waiting(ad->tapi_handle, &stCwReq, __ciss_ss_waiting_resp_cb, ad);
197                         if (err != TAPI_API_SUCCESS) {
198                                 DBG("\n [CISS-ENGINE] tel_set_ss_waiting : ACTIVATION call fails g_err_code = %x", err);
199                                 _ciss_get_error_from_tapi_error(&error_code, err);
200                         }
201                         break;
202                 }
203                 break;
204         case interrogateSS:
205                 DBG("interrogateSS");
206                 switch(mmi_ctx->ss_type){
207                 case CISS_SERVICE_FORWARDING:
208                         err = tel_get_ss_forward_status(ad->tapi_handle, stCfActReq.Class, stCfActReq.Condition,
209                                                                         __ciss_ss_forward_resp_cb, ad);
210                         if (err != TAPI_API_SUCCESS) {
211                                 DBG("\n [CISS-ENGINE] tel_get_ss_forward_status call fails g_err_code = %x", err);
212                                 _ciss_get_error_from_tapi_error(&error_code, err);
213                         }
214                         break;
215                 case CISS_SERVICE_BARRING:
216                         err = tel_get_ss_barring_status(ad->tapi_handle, stCbReq.Class, stCbReq.Type,
217                                                                         __ciss_ss_barring_resp_cb, ad);
218                         if (err != TAPI_API_SUCCESS) {
219                                 DBG("\n [CISS-ENGINE] tel_get_ss_barring_status call fails g_err_code = %x", err);
220                                 _ciss_get_error_from_tapi_error(&error_code, err);
221                         }
222                         break;
223                 case CISS_SERVICE_WAITING:
224                         err = tel_get_ss_waiting_status(ad->tapi_handle, stCbReq.Class,
225                                                                         __ciss_ss_waiting_resp_cb, ad);
226                         if (err != TAPI_API_SUCCESS) {
227                                 DBG("\n [CISS-ENGINE] tel_get_ss_waiting_status call fails g_err_code = %x", err);
228                                 _ciss_get_error_from_tapi_error(&error_code, err);
229                         }
230                         break;
231                 case CISS_SERVICE_IDENTIFICATION:
232                         cliType = (TelSsCliType_t)mmi_ctx->ss_flavor;
233                         err = tel_get_ss_cli_status(ad->tapi_handle, cliType,
234                                                                         __ciss_ss_cli_resp_cb, ad);
235                         if (err != TAPI_API_SUCCESS) {
236                                 DBG("\n [CISS-ENGINE] tel_get_ss_cli_status call fails g_err_code = %x", err);
237                                 _ciss_get_error_from_tapi_error(&error_code, err);
238                         }
239                         break;
240                 }
241                 break;
242         case registerPassword:
243                 DBG("registerPassword");
244                 /* password registration request */
245                 /* check for too short password and mismatch password */
246                 if (CISS_MAX_PASSWORD_LEN > strlen(mmi_ctx->ss_password) ||
247                     CISS_MAX_PASSWORD_LEN > strlen(mmi_ctx->ss_new_password) ||
248                     CISS_MAX_PASSWORD_LEN > strlen(mmi_ctx->ss_new_password2)) {
249                         /* too short password */
250                         DBG("\n [CISS-ENGINE] Too short password");
251                         error_code = CISS_ERR_CB_PWD_TOO_SORT;
252                 }
253
254                 err = tel_change_ss_barring_password(ad->tapi_handle,
255                                         mmi_ctx->ss_password,
256                                         mmi_ctx->ss_new_password,
257                                         mmi_ctx->ss_new_password2,
258                                         __ciss_change_ss_barring_pw_resp_cb, ad);
259
260                 if (err != TAPI_API_SUCCESS) {
261                         DBG("\n [CISS-ENGINE] tel_change_ss_barring_password call fails g_err_code = %x", err);
262                         _ciss_get_error_from_tapi_error(&error_code, err);
263                 }
264                 break;
265         case processUnstructuredSS_Request:
266                 DBG("processUnstructuredSS_Request");
267                 memset(&stUssdRecord, 0, sizeof(TelSsUssdMsgInfo_t));
268                 stUssdRecord.Length = mmi_ctx->user_string_length;
269                 stUssdRecord.Type = mmi_ctx->ussd_type;
270
271                 _ciss_strcpy(stUssdRecord.szString, sizeof(stUssdRecord.szString), (char *)mmi_ctx->user_string);
272
273                 DBG("\n [CISS-ENGINE] stUssdRecord.Length = %d, stUssdRecord.ussd_string = %s", stUssdRecord.Length, stUssdRecord.szString);
274
275                 err = tel_send_ss_ussd_request(ad->tapi_handle,
276                                 &stUssdRecord,
277                                 __ciss_ss_ussd_resp_cb, ad);
278                 if (err != TAPI_API_SUCCESS) {
279                         DBG("\n [CISS-ENGINE] tel_send_ss_ussd_request call fails g_err_code = %x", err);
280                         _ciss_get_error_from_tapi_error(&error_code, err);
281                 }
282                 break;
283         case unstructuredSS_Request:
284                 DBG("unstructuredSS_Request");
285                 memset(&stUssdRecord, 0, sizeof(TelSsUssdMsgInfo_t));
286                 stUssdRecord.Length = mmi_ctx->user_string_length;
287                 stUssdRecord.Type = mmi_ctx->ussd_type;
288
289                 _ciss_strcpy(stUssdRecord.szString, sizeof(stUssdRecord.szString), (char *)mmi_ctx->user_string);
290
291                 DBG("\n [CISS-ENGINE] stUssdRecord.Length = %d, stUssdRecord.ussd_string = %s", stUssdRecord.Length, stUssdRecord.szString);
292
293                 err = tel_send_ss_ussd_request(ad->tapi_handle,
294                                 &stUssdRecord,
295                                 __ciss_ss_ussd_resp_cb, ad);
296                 if (err != TAPI_API_SUCCESS) {
297                         DBG("\n [CISS-ENGINE] tel_send_ss_ussd_request call fails g_err_code = %x", err);
298                         _ciss_get_error_from_tapi_error(&error_code, err);
299                 }
300                 break;
301         default:
302                 error_code = CISS_ERR_UNKNOWN;
303                 DBG("\n [CISS-ENGINE] Invalid Parsed opcode = %d", mmi_ctx->opcode);
304                 break;
305         }
306
307         DBG("Leave");
308         return error_code;
309 }
310
311 int _ciss_on_tapi_sat_ss_event(void *tapi_data, void *data)
312 {
313         DBG("Enter");
314         retv_if(data == NULL, -1);
315
316         int ret = -1;
317
318         ciss_appdata_t *ad = (ciss_appdata_t *)data;
319         TelSatSendSsIndSsData_t send_ss_info;
320         memset(&send_ss_info, 0, sizeof(TelSatSendSsIndSsData_t));
321         memcpy(&send_ss_info, tapi_data, sizeof(TelSatSendSsIndSsData_t));
322
323         DBG("ad->is_sat_request = %d", ad->is_sat_request);
324
325         if (ad->popup) {
326                 evas_object_del(ad->popup);
327                 ad->popup = NULL;
328         }
329
330         if (send_ss_info.ssStringLen > 0) {
331                 ciss_err_t ciss_err_code;
332                 ad->is_sat_request = EINA_TRUE;
333                 ad->sat_terminal_response.sat_command_id = send_ss_info.commandId;
334
335                 ciss_mmi_context_t mmi_ctx;
336                 ciss_err_code = _ciss_parse_req_string((char *)send_ss_info.ssString, &mmi_ctx);
337
338                 if (ciss_err_code == CISS_ERR_NONE) {
339                         ciss_err_code = _ciss_send_tapi_request(&mmi_ctx, ad);
340                         ret = 0;
341                 } else {
342                         TelSatAppsRetInfo_t app_ret_info;
343                         memset(&app_ret_info, 0, sizeof(TelSatAppsRetInfo_t));
344                         
345                         app_ret_info.commandType = TAPI_SAT_CMD_TYPE_SEND_SS;
346                         app_ret_info.commandId = ad->sat_terminal_response.sat_command_id;
347                         app_ret_info.appsRet.sendSs.resp = TAPI_SAT_R_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME;
348                         app_ret_info.appsRet.sendSs.ssCause = TAPI_SS_UNKNOWNERROR;
349                         app_ret_info.appsRet.sendSs.meProblem = TAPI_SAT_ME_PROBLEM_INVALID;
350                         app_ret_info.appsRet.sendSs.ssString.stringLen = 0;
351                         ret = tel_send_sat_app_exec_result(ad->tapi_handle, &app_ret_info);
352                         elm_exit();
353                 }
354         }
355         DBG("Leave");
356
357         return ret;
358 }
359
360 int _ciss_on_tapi_sat_ussd_event(void *tapi_data, void *data)
361 {
362         DBG("Enter");
363         retv_if(tapi_data == NULL, -1);
364         retv_if(data == NULL, -1);
365
366         int ret = -1;
367
368         ciss_appdata_t *ad = (ciss_appdata_t *)data;
369         TelSatSendUssdIndUssdData_t send_ussd_info;
370         memset(&send_ussd_info, 0, sizeof(TelSatSendUssdIndUssdData_t));
371         memcpy(&send_ussd_info, tapi_data, sizeof(TelSatSendUssdIndUssdData_t));
372
373         DBG("ad->is_sat_request = %d", ad->is_sat_request);
374
375         if (ad->popup) {
376                 evas_object_del(ad->popup);
377                 ad->popup = NULL;
378         }
379
380         if (send_ussd_info.ussdStringLen > 0) {
381                 ad->is_sat_request = EINA_TRUE;
382                 ad->sat_terminal_response.sat_command_id = send_ussd_info.commandId;
383
384                 TelSsUssdMsgInfo_t ussd_info;
385                 ussd_info.Type = TAPI_SS_USSD_TYPE_USER_INIT;
386                 ussd_info.Length = (int)(send_ussd_info.ussdStringLen);
387                 if (ussd_info.Length >0)
388                         memcpy(&ussd_info.szString, send_ussd_info.ussdString, ussd_info.Length);
389
390                 ret = tel_send_ss_ussd_request(ad->tapi_handle, &ussd_info,
391                                                                                         __ciss_ss_ussd_resp_cb, ad);
392         } else {
393                 TelSatAppsRetInfo_t app_ret_info;
394                 memset(&app_ret_info, 0, sizeof(TelSatAppsRetInfo_t));
395                 
396                 app_ret_info.commandType = TAPI_SAT_CMD_TYPE_SEND_USSD;
397                 app_ret_info.commandId = ad->sat_terminal_response.sat_command_id;
398
399                 app_ret_info.appsRet.sendUssd.resp = TAPI_SAT_R_COMMAND_DATA_NOT_UNDERSTOOD_BY_ME;
400                 app_ret_info.appsRet.sendUssd.ssCause = TAPI_SS_UNKNOWNERROR;
401                 app_ret_info.appsRet.sendUssd.meProblem = TAPI_SAT_ME_PROBLEM_INVALID;
402                 app_ret_info.appsRet.sendUssd.ussdString.stringLen = 0;
403                 ret = tel_send_sat_app_exec_result(ad->tapi_handle, &app_ret_info);
404                 elm_exit();
405         }
406         DBG("Leave, return=%d", ret);
407
408         return ret;
409 }
410
411 static void __ciss_tapi_ss_rel_complete_cb(TapiHandle *tapi_handle, const char *noti_id, void *data, void *user_data)
412 {
413         DBG("Enter");
414         ret_if(data == NULL);
415         ret_if(user_data == NULL);
416
417         char * msg_length_temp;
418
419         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
420         TelSsRelCompMsgInfo_t rel_comp_info;
421
422         DBG("event type=%s, is_sat_request=%d", noti_id, ad->is_sat_request);
423         ad->sat_terminal_response.rel_comp_msg_length = 0;
424
425         if (ad->is_sat_request == EINA_TRUE) {
426                 memcpy(&rel_comp_info, data, sizeof(TelSsRelCompMsgInfo_t));
427                 msg_length_temp = (char *)(&(rel_comp_info.RelCompMsgLen));
428                 ad->sat_terminal_response.rel_comp_msg_length = (unsigned short)(atoi(msg_length_temp));
429                 
430                 if (ad->sat_terminal_response.rel_comp_msg_length > 0) {
431                         memcpy(ad->sat_terminal_response.rel_comp_msg_string, rel_comp_info.szRelCompMsg, rel_comp_info.RelCompMsgLen);
432                 }
433         }
434
435         DBG("rel_comp_info.RelCompMsgLen = %s", rel_comp_info.RelCompMsgLen); 
436         DBG("rel_comp_info.szRelCompMsg = %s", rel_comp_info.szRelCompMsg);
437         DBG("ad->sat_terminal_response.rel_comp_msg_length = %d", ad->sat_terminal_response.rel_comp_msg_length); 
438         DBG("ad->sat_terminal_response.rel_comp_msg_string = %s", ad->sat_terminal_response.rel_comp_msg_string);
439
440         return ;
441 }
442
443 static void __ciss_tapi_ss_resp_handle(int result, void *tapi_data, void *data)
444 {
445         DBG("Enter");
446         ret_if(data == NULL);
447
448         int ret = -1;
449         ciss_appdata_t *ad = (ciss_appdata_t *)data;
450
451         DBG("result=0x%x ad->is_sat_request=%d", result, ad->is_sat_request);
452
453         if (ad->popup) {
454                 evas_object_del(ad->popup);
455                 ad->popup = NULL;
456         }
457
458         if (ad->is_sat_request == EINA_TRUE) {
459                 TelSatAppsRetInfo_t app_ret_info;
460                 app_ret_info.commandType = TAPI_SAT_CMD_TYPE_SEND_SS;
461                 app_ret_info.commandId = ad->sat_terminal_response.sat_command_id;
462
463                 if (result == TAPI_SS_SUCCESS) {
464                         app_ret_info.appsRet.sendSs.resp = TAPI_SAT_R_SUCCESS;
465                         app_ret_info.appsRet.sendSs.ssCause = TAPI_SS_SUCCESS;
466                         app_ret_info.appsRet.sendSs.meProblem = TAPI_SAT_ME_PROBLEM_NO_SPECIFIC_CAUSE;
467                         if (ad->sat_terminal_response.rel_comp_msg_length >0) {
468                                 app_ret_info.appsRet.sendSs.ssString.stringLen = ad->sat_terminal_response.rel_comp_msg_length;
469                                 memcpy(app_ret_info.appsRet.sendSs.ssString.string,
470                                         ad->sat_terminal_response.rel_comp_msg_string, ad->sat_terminal_response.rel_comp_msg_length);
471                         } else {
472                                 app_ret_info.appsRet.sendSs.ssString.stringLen = 0;
473                         }
474                 } else {
475                         app_ret_info.appsRet.sendSs.resp = TAPI_SAT_R_SS_RETURN_ERROR;
476                         app_ret_info.appsRet.sendSs.ssCause = result;
477                 }
478                 ret = tel_send_sat_app_exec_result(ad->tapi_handle, &app_ret_info);
479                 elm_exit();
480         } else {
481                 /* create window */
482                 Evas_Object *content;
483
484                 DBG("win=0x%p main=0x%p",ad->win_main, ad->layout_main);
485
486                 if (ad->win_main == NULL) {
487                         Evas_Object *win;
488                         win = _ciss_create_win(PACKAGE);
489                         ad->win_main = win;
490                         ret_if(ad->win_main == NULL);
491                         ad->end_key_event_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ciss_on_end_key_down, NULL);
492                         evas_object_show(win);
493                 }
494
495                 DBG("win=0x%p main=0x%p", ad->win_main, ad->layout_main);
496
497                 if (result == TAPI_SS_SUCCESS) {
498                         if (ad->bg == NULL) {
499                                 ad->bg = _ciss_create_bg(ad->win_main);
500                                 ret_if(ad->bg == NULL);
501                         }
502
503                         if (ad->layout_main == NULL) {
504                                 ad->layout_main = _ciss_create_layout_main(ad->win_main);
505                                 ret_if(ad->layout_main== NULL);
506                         }
507                         DBG("win=0x%p main=0x%p", ad->win_main, ad->layout_main);
508
509                         content = (Evas_Object *)_ciss_create_ss_resp_view(ad->layout_main, tapi_data, ad);
510                         ret_if(content == NULL);
511                         elm_object_part_content_set(ad->layout_main, "elm.swallow.content", content);
512                 } else {
513                         ciss_err_t ciss_err;
514                         _ciss_get_error_from_tapi_error(&ciss_err, result);
515                         _ciss_create_error_popup(ad->win_main, ciss_err, 2.0, ad);
516                 }
517
518         }
519
520         DBG("Leave");
521 }
522
523 int _ciss_tapi_ussd_resp_handle(int result, void *tapi_data, void *data)
524 {
525         DBG("Enter");
526         retv_if(data == NULL, -1);
527
528         ciss_appdata_t *ad = (ciss_appdata_t *)data;
529
530         int ret = -1;
531
532         if (ad->popup) {
533                 evas_object_del(ad->popup);
534                 ad->popup = NULL;
535         }
536
537         DBG("result=0x%x ad->is_sat_request=%d", result, ad->is_sat_request);
538         if (ad->is_sat_request == EINA_TRUE) {
539                 TelSatAppsRetInfo_t app_ret_info;
540                 TelSsUssdResp_t ussd_info;
541                 memset(&ussd_info, 0, sizeof(TelSsUssdResp_t));
542                 memcpy(&ussd_info, tapi_data, sizeof(TelSsUssdResp_t));
543
544                 app_ret_info.commandType = TAPI_SAT_CMD_TYPE_SEND_USSD;
545                 app_ret_info.commandId = ad->sat_terminal_response.sat_command_id;
546
547                 if (result == TAPI_SS_SUCCESS) {
548                         app_ret_info.appsRet.sendUssd.resp = TAPI_SAT_R_SUCCESS;
549                         app_ret_info.appsRet.sendUssd.ssCause = TAPI_SS_SUCCESS;
550                         app_ret_info.appsRet.sendUssd.meProblem = TAPI_SAT_ME_PROBLEM_NO_SPECIFIC_CAUSE;
551                         app_ret_info.appsRet.sendUssd.ussdString.stringLen = ussd_info.Length;
552                         if (ad->sat_terminal_response.rel_comp_msg_length >0) {
553                                 app_ret_info.appsRet.sendUssd.ussdString.stringLen = ad->sat_terminal_response.rel_comp_msg_length;
554                                 memcpy(app_ret_info.appsRet.sendUssd.ussdString.string,
555                                         ad->sat_terminal_response.rel_comp_msg_string, ad->sat_terminal_response.rel_comp_msg_length);
556                         } else {
557                                 app_ret_info.appsRet.sendUssd.ussdString.stringLen = 0;
558                         }
559                 } else {
560                         app_ret_info.appsRet.sendUssd.resp = TAPI_SAT_R_USSD_RETURN_ERROR;
561                         app_ret_info.appsRet.sendUssd.ssCause = result;
562                 }
563
564                 ret = tel_send_sat_app_exec_result(ad->tapi_handle, &app_ret_info);
565                 ad->is_sat_request = EINA_FALSE;
566         }
567
568         /* create window */
569         Evas_Object *content;
570
571         if (ad->win_main == NULL) {
572                 Evas_Object *win;
573                 win = _ciss_create_win(PACKAGE);
574                 retv_if(win == NULL, -1);
575                 ad->win_main = win;
576                 evas_object_show(win);
577                 ad->end_key_event_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ciss_on_end_key_down, NULL);
578         }
579
580         if (result == TAPI_SS_SUCCESS) {
581                 if (ad->bg == NULL) {
582                         ad->bg = _ciss_create_bg(ad->win_main);
583                         retv_if(ad->bg == NULL, -1);
584                 }
585
586                 if (ad->layout_main == NULL) {
587                         ad->layout_main = _ciss_create_layout_main(ad->win_main);
588                         retv_if(ad->layout_main== NULL, -1);
589                 }
590                 DBG("win=0x%p main=0x%p", ad->win_main, ad->layout_main);
591
592                 content = (Evas_Object *)_ciss_create_ussd_view(ad->layout_main, tapi_data, ad);
593                 retv_if(data == NULL, -1);
594                 elm_object_part_content_set(ad->layout_main, "elm.swallow.content", content);
595         } else {
596                 ciss_err_t ciss_err;
597                 _ciss_get_error_from_tapi_error(&ciss_err, result);
598                 _ciss_create_error_popup(ad->win_main, ciss_err, 2.0, ad);
599         }
600         ret = 0;
601
602         DBG("Leave");
603         return ret;
604 }
605
606 static void __ciss_ss_forward_resp_cb(TapiHandle *handle, int result, void *data, void *user_data)
607 {
608         DBG("Enter");
609         ret_if(data == NULL);
610         ret_if(user_data == NULL);
611
612         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
613
614         ad->resp_ss_type = CISS_SERVICE_FORWARDING;
615         __ciss_tapi_ss_resp_handle(result, data, user_data);
616         return;
617 }
618
619 static void __ciss_ss_barring_resp_cb(TapiHandle *handle, int result, void *data, void *user_data)
620 {
621         DBG("Enter");
622         ret_if(data == NULL);
623         ret_if(user_data == NULL);
624
625         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
626
627         ad->resp_ss_type = CISS_SERVICE_BARRING;
628         __ciss_tapi_ss_resp_handle(result, data, user_data);
629         return;
630 }
631
632 static void __ciss_ss_waiting_resp_cb(TapiHandle *handle, int result, void *data, void *user_data)
633 {
634         DBG("Enter");
635         ret_if(data == NULL);
636         ret_if(user_data == NULL);
637
638         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
639
640         ad->resp_ss_type = CISS_SERVICE_WAITING;
641         __ciss_tapi_ss_resp_handle(result, data, user_data);
642         return;
643 }
644
645 static void __ciss_ss_cli_resp_cb(TapiHandle *handle, int result, void *data, void *user_data)
646 {
647         DBG("Enter");
648         ret_if(data == NULL);
649         ret_if(user_data == NULL);
650
651         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
652
653         ad->resp_ss_type = CISS_SERVICE_IDENTIFICATION;
654         __ciss_tapi_ss_resp_handle(result, data, user_data);
655         return;
656 }
657
658 static void __ciss_change_ss_barring_pw_resp_cb(TapiHandle *handle, int result, void *data, void *user_data)
659 {
660         DBG("Enter");
661         ret_if(data == NULL);
662         ret_if(user_data == NULL);
663
664         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
665
666         ad->resp_ss_type = CISS_SERVICE_CHANGE_BARRING_PASSWD;
667         __ciss_tapi_ss_resp_handle(result, data, user_data);
668         return;
669 }
670
671 static void __ciss_ss_ussd_resp_cb(TapiHandle *handle, int result, void *data, void *user_data)
672 {
673         DBG("Enter");
674         ret_if(data == NULL);
675         ret_if(user_data == NULL);
676
677         ciss_appdata_t *ad = (ciss_appdata_t *)user_data;
678
679         ad->resp_ss_type = CISS_SERVICE_USSD;
680         _ciss_tapi_ussd_resp_handle(result, data, user_data);
681         return;
682 }