Merge branch 'tizen_2.1_smack' into tizen_2.1
[apps/core/preloaded/ciss.git] / src / ciss-ussd.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-common.h"
18 #include "ciss-ussd.h"
19 #include "ciss-debug.h"
20 #include "ciss-string.h"
21 #include "ciss-respnd.h"
22 #include "ciss-widget.h"
23 #include "ciss-tapi-request.h"
24
25 static int __ciss_get_ussd_string(char *ss_result_string, int length, char *szString)
26 {
27         DBG("Enter");
28
29         char *ptr = NULL;
30         char *temp_ptr = NULL;
31
32         if (length > 0) {
33                 ptr = strtok_r(szString, "\n", &temp_ptr);
34                 snprintf(ss_result_string, CISS_MMI_MAX_USSD_RESP_STRING, "%s", ptr);
35
36                 while ((ptr = strtok_r(NULL, "\n", &temp_ptr))) {
37                         char temp_str[CISS_MMI_MAX_USSD_RESP_STRING];
38                         strncpy(temp_str, ss_result_string, CISS_MMI_MAX_USSD_RESP_STRING - 1);
39                         snprintf(ss_result_string, CISS_MMI_MAX_USSD_RESP_STRING, "%s<br>%s", temp_str, ptr);
40                 }
41         } else {
42                 strncpy(ss_result_string, "", CISS_MMI_MAX_USSD_RESP_STRING - 1);
43         }
44
45         return 0;
46 }
47
48 void _ciss_ussd_quit_cb(void *data, Evas_Object *obj, void *event_info)
49 {
50         DBG("Enter");
51
52         ciss_appdata_t *ad = (ciss_appdata_t *)data;
53         memset(ad->c_item, 0, sizeof(ad->c_item));
54
55         if (ad->ussd_action_require) {
56                 ciss_mmi_context_t mmi_ctx;
57                 memset(&mmi_ctx, 0x0, sizeof(ciss_mmi_context_t));
58                 mmi_ctx.opcode = processUnstructuredSS_Request;
59                 mmi_ctx.ussd_type = TAPI_SS_USSD_TYPE_USER_REL;
60
61                 _ciss_send_tapi_request(&mmi_ctx, ad);
62         }
63
64         elm_exit();
65 }
66
67 static void __ciss_respnd_cb(void *data, Evas_Object *obj, void *event_info)
68 {
69
70         DBG("Enter");
71
72         ciss_appdata_t *ad = (ciss_appdata_t *)data;
73         _ciss_create_respond_view(ad);
74 }
75
76 Evas_Object *_ciss_create_ussd_view(Evas_Object *parent, void *tapi_data, void *data)
77 {
78         DBG("Enter");
79         retv_if(parent == NULL, NULL);
80         retv_if(data == NULL, NULL);
81
82         ciss_appdata_t *ad = (ciss_appdata_t *)data;
83         ciss_ussd_record_t ussd_record;
84         char ussd_string[CISS_MMI_MAX_USSD_RESP_STRING] = { };
85
86         DBG("[CISS-USSD]ad->tapi_event.event_type = %d", ad->tapi_event.event_type);
87         if (ad->tapi_event.event_type == TAPI_EVENT_SS_USSD_IND) {
88                 TelSsUssdNoti_t ussd_noti_info;
89                 memset(&ussd_noti_info, 0, sizeof(TelSsUssdNoti_t));
90                 memcpy(&ussd_noti_info, tapi_data, sizeof(TelSsUssdNoti_t));
91
92                 ussd_record.ind_type = ussd_noti_info.Status;
93                 ussd_record.ussd_string_length = ussd_noti_info.Length;
94                 memcpy(&ussd_record.ussd_string, &ussd_noti_info.szString, CISS_USSD_DATA_SIZE_MAX);
95         } else {
96                 TelSsUssdResp_t ussd_resp_info;
97                 memset(&ussd_resp_info, 0, sizeof(TelSsUssdResp_t));
98                 memcpy(&ussd_resp_info, tapi_data, sizeof(TelSsUssdResp_t));
99
100                 ussd_record.ind_type = ussd_resp_info.Status;
101                 ussd_record.ussd_string_length = ussd_resp_info.Length;
102                 memcpy(&ussd_record.ussd_string, &ussd_resp_info.szString, CISS_USSD_DATA_SIZE_MAX);
103         }
104
105         __ciss_get_ussd_string(ussd_string, ussd_record.ussd_string_length, ussd_record.ussd_string);
106         DBG("[CISS-MMI] ussd_string = %s", ussd_string);
107
108         Evas_Object *nf;
109         Evas_Object *l_button;
110         Evas_Object *cbar = NULL;
111         Elm_Object_Item *navi_it = NULL;
112
113         nf = elm_naviframe_add(parent);
114         retv_if(nf == NULL, NULL);
115         ad->nf = nf;
116         ad->ussd_action_require = 0;
117
118         Evas_Object *genlist =
119                 _ciss_create_result_genlist(ussd_string, CISS_MMI_MAX_USSD_RESP_STRING, nf, ad);
120         retv_if(NULL == genlist, NULL);
121
122
123         l_button = elm_button_add(nf);
124         evas_object_smart_callback_add(l_button, "clicked",
125                                                                    _ciss_ussd_quit_cb, ad);
126
127         navi_it = elm_naviframe_item_push(nf, CISS_STR_INFORMATION,
128                                                                           l_button, NULL, genlist, NULL);
129         elm_object_style_set(l_button, "naviframe/back_btn/default");
130
131         if (ussd_record.ind_type == CISS_USSD_IND_ACTION_REQUIRE) {
132                 DBG("require action");
133                 cbar = _ciss_create_navi_control_bar(nf,
134                                                                                          CISS_STR_REPLY, __ciss_respnd_cb,
135                                                                                          NULL, NULL,
136                                                                                          ad, navi_it,
137                                                                                          ad->c_item);
138                 retv_if(cbar == NULL, NULL);
139                 ad->ussd_action_require = 1;
140         }
141
142         evas_object_show(nf);
143         DBG("Leave");
144
145         return nf;
146 }
147