2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
18 #include <appcore-efl.h>
20 #include <glib-2.0/glib.h>
23 #include <app_service.h>
25 #include "ciss-common.h"
26 #include "ciss-util.h"
27 #include "ciss-ussd.h"
28 #include "ciss-resp.h"
29 #include "ciss-tapi-request.h"
30 #include "ciss-parser.h"
31 #include "ciss-widget.h"
33 static ciss_appdata_t application_data;
35 static Eina_Bool __ciss_app_create(void *data);
36 static void __ciss_app_terminate(void *data);
37 static void __ciss_app_pause(void *data);
38 static void __ciss_app_resume(void *data);
39 static void __ciss_app_service(service_h service, void *data);
40 static int __ciss_relaunch_handler(void *data);
42 static Eina_Bool __ciss_app_create(void *data)
46 ciss_appdata_t *ad = (ciss_appdata_t *)data;
47 _ciss_tapi_event_setup(ad);
49 ad->layout_main = NULL;
52 ad->end_key_event_handler = NULL;
53 ad->is_sat_request = EINA_FALSE;
54 ad->service_handle = NULL;
55 memset(&(ad->tapi_event), 0, sizeof(ciss_tapi_event_t));
56 memset(&(ad->sat_terminal_response), 0, sizeof(ciss_sat_terminal_response_t));
57 _ciss_geinlist_item_class_new(ad);
62 static void __ciss_app_terminate(void *data)
66 ciss_appdata_t *ad = data;
68 _ciss_geinlist_item_class_free(ad);
70 evas_object_del(ad->win_main);
71 if (ad->end_key_event_handler)
72 ecore_event_handler_del(ad->end_key_event_handler);
76 evas_object_del(ad->bg);
80 _ciss_deregister_tel_event(ad);
84 static void __ciss_app_pause(void *data)
90 static void __ciss_app_resume(void *data)
95 static void __ciss_app_service(service_h service, void *data)
99 ciss_appdata_t *ad = data;
100 int err = SERVICE_ERROR_NONE;
107 err = service_clone(&(ad->service_handle), service);
108 if (err != SERVICE_ERROR_NONE) {
109 ERR("service_clone error - (%d)\n", err);
111 if (ad->service_handle) {
112 service_destroy(ad->service_handle);
114 ad->service_handle = NULL;
120 elm_win_activate(ad->win_main);
122 __ciss_relaunch_handler(data);
124 if (ad->service_handle) {
125 service_destroy(ad->service_handle);
126 ad->service_handle = NULL;
132 static int __ciss_relaunch_handler(void *data)
138 #ifdef _CISS_USE_PARAM
139 int event_status = 0;
140 int encoded_data_length;
142 int err = SERVICE_ERROR_NONE;
144 ciss_appdata_t *ad = (ciss_appdata_t *)data;
146 char *launching_mode = NULL;
147 char *req_string = NULL;
148 char *key_event_type = NULL;
149 char *key_status = NULL;
150 char *key_encoded_data_length = NULL;
151 char *key_encoded_data = NULL;
153 err = service_get_extra_data(ad->service_handle, "CISS_LAUNCHING_MODE", &launching_mode);
154 if (err != SERVICE_ERROR_NONE) {
155 DBG("service_get_extra_data for CISS_LAUNCHING_MODE failed - (%d)\n", err);
159 if (strcmp(launching_mode, "REQ") == 0) {
160 err = service_get_extra_data(ad->service_handle, "CISS_REQ_STRING", &req_string);
161 if (err != SERVICE_ERROR_NONE) {
162 DBG("service_get_extra_data for CISS_LAUNCHING_MODE failed - (%d)\n", err);
164 retv_if(req_string == NULL, -1);
165 DBG("CISS_REQ_STRING=%s", req_string);
166 strncpy(ad->req_string, req_string, REQ_STRING_MAX_LEN - 1);
167 ciss_err_t ciss_err_code;
169 if (ad->win_main == NULL) {
171 win = _ciss_create_win(PACKAGE);
172 retv_if(win == NULL, -1);
174 evas_object_show(win);
175 ad->end_key_event_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ciss_on_end_key_down, NULL);
178 if (ad->popup != NULL) {
179 evas_object_del(ad->popup);
183 DBG("scale = %f", elm_config_scale_get());
185 popup = _ciss_create_noti_popup(ad->win_main, CISS_STR_REQUESTING, NULL, POPUP_DISPLAY_DURATION, ad);
187 ciss_mmi_context_t mmi_ctx;
189 ciss_err_code = _ciss_parse_req_string(req_string, &mmi_ctx);
191 if (ciss_err_code != CISS_ERR_NONE) {
192 _ciss_create_error_popup(ad->win_main, ciss_err_code, 2.0, ad);
194 ciss_err_code = _ciss_send_tapi_request(&mmi_ctx, ad);
195 DBG("ciss_err_code(_ciss_send_tapi_request) = %d", ciss_err_code);
196 if (ciss_err_code != CISS_ERR_NONE) {
197 _ciss_create_error_popup(ad->win_main, ciss_err_code, 2.0, ad);
200 } else if (strcmp(launching_mode, "RESP")== 0) {
201 err = service_get_extra_data(ad->service_handle, "KEY_EVENT_TYPE", &key_event_type);
202 if (err != SERVICE_ERROR_NONE) {
203 DBG("service_get_extra_data for KEY_EVENT_TYPE failed - (%d)\n", err);
205 event_type = atoi(key_event_type);
206 ad->tapi_event.event_type = event_type;
207 #ifdef _CISS_USE_PARAM
208 err = service_get_extra_data(ad->service_handle, "KEY_STATUS", &key_status);
209 if (err != SERVICE_ERROR_NONE) {
210 DBG("service_get_extra_data for KEY_STATUS failed - (%d)\n", err);
212 event_status = atoi(key_status);
213 ad->tapi_event.status = event_status;
215 err = service_get_extra_data(ad->service_handle, "KEY_ENCODED_DATA_LENGTH", &key_encoded_data_length);
216 if (err != SERVICE_ERROR_NONE) {
217 DBG("service_get_extra_data for KEY_ENCODED_DATA_LENGTH failed - (%d)\n", err);
219 encoded_data_length = atoi(key_encoded_data_length);
221 err = service_get_extra_data(ad->service_handle, "KEY_ENCODED_DATA", &key_encoded_data);
222 if (err != SERVICE_ERROR_NONE) {
223 DBG("service_get_extra_data for KEY_ENCODED_DATA failed - (%d)\n", err);
226 gsize decoded_data_length;
228 decoded_data = (gchar *)g_base64_decode((gchar *)key_encoded_data, &decoded_data_length);
230 ad->tapi_event.data_length = decoded_data_length;
231 ad->tapi_event.p_data = decoded_data;
233 DBG("Received Event=0x%x", event_type);
235 switch (event_type) {
236 case TAPI_EVENT_SS_USSD_IND:
237 _ciss_tapi_ussd_resp_handle(0, ad->tapi_event.p_data, ad);
239 case TAPI_SAT_CMD_TYPE_SEND_USSD:
240 _ciss_on_tapi_sat_ussd_event(ad->tapi_event.p_data, ad);
242 case TAPI_SAT_CMD_TYPE_SEND_SS:
243 _ciss_on_tapi_sat_ss_event(ad->tapi_event.p_data, ad);
250 ERR("wrong exec type");
254 if (launching_mode) {
255 free(launching_mode);
256 launching_mode = NULL;
262 if (key_event_type) {
263 free(key_event_type);
264 key_event_type = NULL;
270 if (key_encoded_data_length) {
271 free(key_encoded_data_length);
272 key_encoded_data_length = NULL;
274 if (key_encoded_data) {
275 free(key_encoded_data);
276 key_encoded_data = NULL;
283 int main(int argc, char *argv[])
287 app_event_callback_s event_callback = {0,};
289 event_callback.create = __ciss_app_create;
290 event_callback.terminate = __ciss_app_terminate;
291 event_callback.pause = __ciss_app_pause;
292 event_callback.resume = __ciss_app_resume;
293 event_callback.service = __ciss_app_service;
295 event_callback.low_memory = NULL;
296 event_callback.low_battery = NULL;
297 event_callback.device_orientation = NULL;
298 event_callback.language_changed = NULL;
299 event_callback.region_format_changed = NULL;
301 int ret = APP_ERROR_NONE;
303 memset(&application_data, 0x0, sizeof(ciss_appdata_t));
305 ret = app_efl_main(&argc, &argv, &event_callback, &application_data);
306 if (ret != APP_ERROR_NONE) {
307 DBG("app_efl_main() is failed (%d)\n", ret);