4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
30 #include "tapi_common.h"
31 #include "TapiUtility.h"
35 #include "TelNetwork.h"
46 extern char *g_cookie_name;
47 extern int g_cookie_size;
49 TelSatEventDownloadType_t g_event_list[TAPI_SAT_EVENT_LIST_MAX_COUNT] = {-1};
51 /*static void _cookie_deinit(void)
60 static void _process_sms_event(const gchar *sig, GVariant *param,
61 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
63 TAPI_RETURN_IF_FAIL(evt_cb_data);
65 if (!g_strcmp0(sig, "IncommingMsg")) {
66 struct tel_noti_sms_incomming_msg noti;
68 GVariant *sca = 0, *tpdu = 0;
70 GVariantIter *iter = 0;
71 GVariant *inner_gv = 0;
73 memset(¬i, 0, sizeof(struct tel_noti_sms_incomming_msg));
75 g_variant_get(param, "(@vi@v)", &sca, ¬i.MsgLength, &tpdu);
77 inner_gv = g_variant_get_variant( sca );
78 g_variant_get(inner_gv, "ay", &iter);
79 while( g_variant_iter_loop( iter, "y", ¬i.Sca[i] ) ) {
81 if( i >= TAPI_SIM_SMSP_ADDRESS_LEN )
86 inner_gv = g_variant_get_variant( tpdu );
87 g_variant_get(inner_gv, "ay", &iter);
88 while( g_variant_iter_loop( iter, "y", ¬i.szData[i] ) ) {
90 if( i >= TAPI_NETTEXT_SMDATA_SIZE_MAX + 1 )
93 g_variant_iter_free(iter);
94 g_variant_unref(inner_gv);
98 else if (!g_strcmp0(sig, "IncommingCbMsg")) {
99 struct tel_noti_sms_incomming_cb_msg noti;
101 GVariant *cbMsg = NULL;
103 GVariantIter *iter = 0;
104 GVariant *inner_gv = 0;
106 memset(¬i, 0, sizeof(struct tel_noti_sms_incomming_cb_msg));
107 g_variant_get(param, "(ii@v)", ¬i.CbMsgType, ¬i.Length, &cbMsg);
109 inner_gv = g_variant_get_variant( cbMsg );
110 g_variant_get(inner_gv, "ay", &iter);
111 while( g_variant_iter_loop( iter, "y", ¬i.szMsgData[i] ) ) {
113 if( i >= TAPI_NETTEXT_CB_SIZE_MAX + 1 )
116 g_variant_iter_free(iter);
117 g_variant_unref(inner_gv);
119 CALLBACK_CALL(¬i);
121 else if (!g_strcmp0(sig, "IncommingEtwsMsg")) {
122 struct tel_noti_sms_incomming_etws_msg noti;
124 GVariant *etwsMsg = NULL;
126 GVariantIter *iter = 0;
127 GVariant *inner_gv = 0;
130 memset(¬i, 0, sizeof(struct tel_noti_sms_incomming_etws_msg));
131 g_variant_get(param, "(ii@v)", ¬i.EtwsMsgType, ¬i.Length, &etwsMsg);
133 inner_gv = g_variant_get_variant( etwsMsg );
134 g_variant_get(inner_gv, "ay", &iter);
135 while( g_variant_iter_loop( iter, "y", ¬i.szMsgData[i] ) ) {
137 if( i >= TAPI_NETTEXT_ETWS_SIZE_MAX + 1 )
140 g_variant_iter_free(iter);
141 g_variant_unref(inner_gv);
143 CALLBACK_CALL(¬i);
145 else if (!g_strcmp0(sig, "MemoryStatus")) {
148 g_variant_get(param, "(i)", ¬i);
149 CALLBACK_CALL(¬i);
151 else if (!g_strcmp0(sig, "SmsReady")) {
154 g_variant_get(param, "(b)", ¬i);
155 CALLBACK_CALL(¬i);
158 dbg("not handled Sms noti[%s]", sig);
162 static void _process_call_event(const gchar *sig, GVariant *param,
163 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
165 TAPI_RETURN_IF_FAIL(evt_cb_data);
167 if (!g_strcmp0(sig, "VoiceCallStatusIdle") || !g_strcmp0(sig, "VideoCallStatusIdle") ) {
168 TelCallStatusIdleNoti_t data;
169 int start_time = 0, end_time = 0;
170 g_variant_get(param, "(iiii)", &data.id, &data.cause, &start_time, &end_time);
171 dbg("[ check ] %s : call_id(%d), end_cause(0x%x)", "Status Idle noti", data.id, data.cause);
172 CALLBACK_CALL(&data);
174 else if (!g_strcmp0(sig, "VoiceCallStatusDialing") || !g_strcmp0(sig, "VideoCallStatusDialing")) {
175 TelCallStatusDialingNoti_t data;
176 g_variant_get(param, "(i)", &data.id);
177 dbg("[ check ] %s : call_id(%d)", "Status Dialing noti", data.id);
178 CALLBACK_CALL(&data);
180 else if (!g_strcmp0(sig, "VoiceCallStatusAlert") || !g_strcmp0(sig, "VideoCallStatusAlert")) {
181 TelCallStatusAlertNoti_t data;
182 g_variant_get(param, "(i)", &data.id);
183 dbg("[ check ] %s : call_id(%d)", "Status Alert noti", data.id);
184 CALLBACK_CALL(&data);
186 else if (!g_strcmp0(sig, "VoiceCallStatusActive") || !g_strcmp0(sig, "VideoCallStatusActive")) {
187 TelCallStatusActiveNoti_t data;
188 g_variant_get(param, "(i)", &data.id);
189 dbg("[ check ] %s : call_id(%d)", "Status Active noti", data.id);
190 CALLBACK_CALL(&data);
192 else if (!g_strcmp0(sig, "VoiceCallStatusHeld") ) {
193 TelCallStatusHeldNoti_t data;
194 g_variant_get(param, "(i)", &data.id);
195 dbg("[ check ] %s : call_id(%d)", "Status Held noti", data.id);
196 CALLBACK_CALL(&data);
198 else if (!g_strcmp0(sig, "VoiceCallStatusIncoming") || !g_strcmp0(sig, "VideoCallStatusIncoming")) {
199 TelCallStatusIncomingNoti_t data;
200 g_variant_get(param, "(i)", &data.id);
201 dbg("[ check ] %s : call_id(%d)", "Status Incoming noti", data.id);
202 CALLBACK_CALL(&data);
204 else if (!g_strcmp0(sig, "Waiting")) {
205 TelCallInfoWaitingNoti_t data;
206 g_variant_get(param, "(i)", &data.id);
207 dbg("[ check ] %s : data.id(%d)", "Call Info Waiting noti", data.id);
208 CALLBACK_CALL(&data.id);
210 else if (!g_strcmp0(sig, "Forwarded")) {
211 TelCallInfoForwardedNoti_t data;
212 g_variant_get(param, "(i)", &data.id);
213 dbg("[ check ] %s : data.id(%d)", "Call Info Forwarded noti", data.id);
214 CALLBACK_CALL(&data.id);
216 else if (!g_strcmp0(sig, "BarredIncoming")) {
217 TelCallInfoBarredIncomingNoti_t data;
218 g_variant_get(param, "(i)", &data.id);
219 dbg("[ check ] %s : data.id(%d)", "Call Info Barred Incoming noti", data.id);
220 CALLBACK_CALL(&data.id);
222 else if (!g_strcmp0(sig, "BarredOutgoing")) {
223 TelCallInfoBarredOutgoingNoti_t data;
224 g_variant_get(param, "(i)", &data.id);
225 dbg("[ check ] %s : data.id(%d)", "Call Info Barred Outgoing noti", data.id);
226 CALLBACK_CALL(&data.id);
228 else if (!g_strcmp0(sig, "ForwardConditional")) {
229 TelCallInfoForwardConditionalNoti_t data;
230 g_variant_get(param, "(i)", &data.id);
231 dbg("[ check ] %s : data.id(%d)", "Call Info Forward Conditional noti", data.id);
232 CALLBACK_CALL(&data.id);
234 else if (!g_strcmp0(sig, "ForwardUnconditional")) {
235 TelCallInfoForwardUnconditionalNoti_t data;
236 g_variant_get(param, "(i)", &data.id);
237 dbg("[ check ] %s : data.id(%d)", "Call Info Forward Unconditional noti", data.id);
238 CALLBACK_CALL(&data.id);
240 else if (!g_strcmp0(sig, "CallActive")) {
241 TelCallInfoActiveNoti_t data;
242 g_variant_get(param, "(i)", &data.id);
243 dbg("[ check ] %s : data.id(%d)", "Call Info Call Active noti", data.id);
244 CALLBACK_CALL(&data.id);
246 else if (!g_strcmp0(sig, "CallHeld")) {
247 TelCallInfoHeldNoti_t data;
248 g_variant_get(param, "(i)", &data.id);
249 dbg("[ check ] %s : data.id(%d)", "Call Info Call Held noti", data.id);
250 CALLBACK_CALL(&data.id);
252 else if (!g_strcmp0(sig, "CallJoined")) {
253 TelCallInfoJoinedNoti_t data;
254 g_variant_get(param, "(i)", &data.id);
255 dbg("[ check ] %s : data.id(%d)", "Call Info Call Joined noti", data.id);
256 CALLBACK_CALL(&data.id);
258 else if (!g_strcmp0(sig, "CallSoundPath")) {
259 TelCallSoundPathNoti_t data;
260 g_variant_get(param, "(i)", &data.path);
261 dbg("[ check ] %s : path(%d)", "Call Sound Path noti", data.path);
262 CALLBACK_CALL(&data);
264 else if (!g_strcmp0(sig, "CallSoundRingbackTone")) {
265 TelCallSoundRingbackToneNoti_t status;
266 g_variant_get(param, "(i)", &status);
267 dbg("[ check ] %s : status(%d)", "Call Sound Ringbacktone noti", status);
268 CALLBACK_CALL(&status);
270 else if (!g_strcmp0(sig, "CallSoundWbamr")) {
271 TelCallSoundWbamrNoti_t status;
272 g_variant_get(param, "(i)", &status);
273 dbg("[ check ] %s : status(%d)", "Call Sound Wbamr noti", status);
274 CALLBACK_CALL(&status);
276 else if (!g_strcmp0(sig, "CallSoundEqualization")) {
277 TelCallSoundEqualizationNoti_t data;
278 g_variant_get(param, "(ii)", &data.mode, &data.direction);
279 dbg("[ check ] %s : mode(%d), direction(%d)", "Call Sound Equalization noti", data.mode, data.direction);
280 CALLBACK_CALL(&data);
282 else if (!g_strcmp0(sig, "CallSoundNoiseReduction")) {
283 TelCallSoundNoiseReductionNoti_t data;
284 g_variant_get(param, "(i)", &data.status);
285 dbg("[ check ] %s : status(%d)", "Call Sound Noise Reduction noti", data.status);
286 CALLBACK_CALL(&data);
288 else if (!g_strcmp0(sig, "CallSoundClockStatus")) {
290 g_variant_get(param, "(b)", &data);
291 dbg("[ check ] %s : status(%d)", "Call Sound Clock Status noti", data);
292 CALLBACK_CALL(&data);
295 dbg("not handled Call noti[%s]", sig);
299 static void _process_sat_event(const gchar *sig, GVariant *param,
300 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
302 TAPI_RETURN_IF_FAIL(evt_cb_data);
304 if (!g_strcmp0(sig, "SetupMenu")) {
305 TelSatSetupMenuInfo_t setup_menu;
308 gint command_id, item_cnt;
309 gboolean b_present, b_helpinfo, b_updated;
310 GVariant *items = NULL;
312 #if defined(TIZEN_SUPPORT_SAT_ICON)
313 GVariant *icon_id = NULL;
314 GVariant *icon_list = NULL;
315 int index = 0, icon_index = 0;
316 GVariantIter *iter, *iter2;
317 GVariant *unbox = NULL;
318 /* Used to get icon data */
320 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
321 gchar *icon_data = NULL;
322 /* Used to get icon list data */
323 GVariant *unbox_list, *unbox_list_info ;
324 GVariant *icon_list_info;
325 gboolean is_list_exist;
326 gint icon_list_quali, list_cnt, icon_list_identifier, list_width, list_height, list_ics, icon_list_data_len;
327 gchar *icon_list_data = NULL;
333 memset(&setup_menu, 0, sizeof(TelSatSetupMenuInfo_t));
335 #if defined(TIZEN_SUPPORT_SAT_ICON)
336 g_variant_get(param, "(ibs@vibb@v@v)", &command_id, &b_present, &title, &items, &item_cnt,
337 &b_helpinfo, &b_updated, &icon_id, &icon_list);
339 g_variant_get(param, "(ibs@vibb)", &command_id, &b_present, &title, &items, &item_cnt,
340 &b_helpinfo, &b_updated);
343 setup_menu.commandId = command_id;
344 setup_menu.bIsMainMenuPresent = (b_present ? 1 : 0);
345 memcpy(setup_menu.satMainTitle, title, TAPI_SAT_DEF_TITLE_LEN_MAX+1);
346 setup_menu.satMainMenuNum = item_cnt;
347 if(items && item_cnt > 0){
350 unbox = g_variant_get_variant(items);
351 dbg("items(%p) items type_format(%s)", items, g_variant_get_type_string(unbox));
353 g_variant_get(unbox, "a(si)", &iter);
354 while(g_variant_iter_loop(iter,"(si)",&item_str, &item_id)){
355 setup_menu.satMainMenuItem[index].itemId = item_id;
356 memcpy(setup_menu.satMainMenuItem[index].itemString, item_str, TAPI_SAT_DEF_ITEM_STR_LEN_MAX + 6);
357 dbg("item index(%d) id(%d) str(%s)",index, setup_menu.satMainMenuItem[index].itemId, setup_menu.satMainMenuItem[index].itemString);
358 //dbg("item index(%d) id(%d) str(%s)",index, item_id, item_str);
361 g_variant_iter_free(iter);
363 setup_menu.bIsSatMainMenuHelpInfo = (b_helpinfo ? 1 : 0);
364 setup_menu.bIsUpdatedSatMainMenu = (b_updated ? 1 : 0);
366 #if defined(TIZEN_SUPPORT_SAT_ICON)
368 unbox = g_variant_get_variant(icon_id);
369 g_variant_get(unbox, "a(biiiiiis)", &iter);
371 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)){
374 setup_menu.iconId.bIsPresent = is_exist;
375 setup_menu.iconId.iconQualifier = icon_quali;
376 setup_menu.iconId.iconIdentifier = icon_identifier;
377 setup_menu.iconId.iconInfo.width = width;
378 setup_menu.iconId.iconInfo.height = height;
379 setup_menu.iconId.iconInfo.ics = ics;
380 if(icon_data_len > 0) {
381 setup_menu.iconId.iconInfo.iconDataLen = icon_data_len;
382 memcpy(setup_menu.iconId.iconInfo.iconFile, icon_data, icon_data_len);
384 dbg("icon exist(%d), icon_quali: (%d), icon_id: (%d), width: (%d), height: (%d), ics: (%d), icon_data_len: (%d)", setup_menu.iconId.bIsPresent, setup_menu.iconId.iconQualifier, setup_menu.iconId.iconIdentifier, setup_menu.iconId.iconInfo.width,
385 setup_menu.iconId.iconInfo.height, setup_menu.iconId.iconInfo.ics, setup_menu.iconId.iconInfo.iconDataLen);
387 g_variant_iter_free(iter);
391 unbox_list = g_variant_get_variant(icon_list);
392 g_variant_get(unbox_list, "a(biiv)", &iter);
394 while(g_variant_iter_loop(iter,"(biiv)", &is_list_exist, &icon_list_quali, &list_cnt, &icon_list_info)){
397 setup_menu.iconIdList.bIsPresent = is_list_exist;
398 setup_menu.iconIdList.iconListQualifier = icon_list_quali;
399 setup_menu.iconIdList.iconCount = list_cnt;
401 unbox_list_info = g_variant_get_variant(icon_list_info);
402 g_variant_get(unbox_list_info, "a(iiiiis)", &iter2);
404 while(g_variant_iter_loop(iter2,"(iiiiis)",&icon_list_identifier, &list_width, &list_height, &list_ics, &icon_list_data_len, &icon_list_data)){
405 setup_menu.iconIdList.iconIdentifierList[icon_index]= icon_identifier;
406 setup_menu.iconIdList.iconInfo[icon_index].width = list_width;
407 setup_menu.iconIdList.iconInfo[icon_index].height = list_height;
408 setup_menu.iconIdList.iconInfo[icon_index].ics = list_ics;
409 if(icon_list_data_len > 0) {
410 setup_menu.iconIdList.iconInfo[icon_index].iconDataLen = icon_list_data_len;
411 memcpy(setup_menu.iconIdList.iconInfo[icon_index].iconFile, icon_list_data, icon_list_data_len);
415 g_variant_iter_free(iter2);
417 g_variant_iter_free(iter);
420 dbg("command id (%d)", setup_menu.commandId);
421 dbg("menu present (%d)", setup_menu.bIsMainMenuPresent);
422 dbg("menu title (%s)", setup_menu.satMainTitle);
423 dbg("item cnt (%d)", setup_menu.satMainMenuNum);
424 dbg("menu help info (%d)", setup_menu.bIsSatMainMenuHelpInfo);
425 dbg("menu updated (%d)", setup_menu.bIsUpdatedSatMainMenu);
427 dbg("icon exist(%d), icon_quali: (%d), icon_id: (%d), width: (%d), height: (%d), ics: (%d), icon_data_len: (%d)", setup_menu.iconId.bIsPresent, setup_menu.iconId.iconQualifier, setup_menu.iconId.iconIdentifier, setup_menu.iconId.iconInfo.width,
428 setup_menu.iconId.iconInfo.height, setup_menu.iconId.iconInfo.ics, setup_menu.iconId.iconInfo.iconDataLen);
430 CALLBACK_CALL(&setup_menu);
432 else if (!g_strcmp0(sig, "DisplayText")) {
433 TelSatDisplayTextInd_t display_text;
435 gint command_id, text_len, duration;
436 gboolean high_priority, user_rsp_required, immediately_rsp;
438 #if defined(TIZEN_SUPPORT_SAT_ICON)
439 GVariant *unbox = NULL;
441 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
442 gchar *icon_data = NULL;
443 GVariant *icon_id = NULL;
446 memset(&display_text, 0, sizeof(TelSatDisplayTextInd_t));
448 #if defined(TIZEN_SUPPORT_SAT_ICON)
449 g_variant_get(param, "(isiibbb@v)", &command_id, &text, &text_len, &duration,
450 &high_priority, &user_rsp_required, &immediately_rsp, &icon_id);
452 g_variant_get(param, "(isiibbb)", &command_id, &text, &text_len, &duration,
453 &high_priority, &user_rsp_required, &immediately_rsp);
455 display_text.commandId = command_id;
456 memcpy(display_text.text.string, text, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
457 display_text.text.stringLen = text_len;
458 display_text.duration = duration;
459 display_text.bIsPriorityHigh = (high_priority ? 1 : 0);
460 display_text.bIsUserRespRequired = (user_rsp_required ? 1 : 0);
461 display_text.b_immediately_resp = (immediately_rsp ? 1 : 0);
463 #if defined(TIZEN_SUPPORT_SAT_ICON)
465 unbox = g_variant_get_variant(icon_id);
466 g_variant_get(unbox, "a(biiiiiis)", &iter);
468 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
471 display_text.iconId.bIsPresent = is_exist;
472 display_text.iconId.iconQualifier = icon_quali;
473 display_text.iconId.iconIdentifier = icon_identifier;
474 display_text.iconId.iconInfo.width = width;
475 display_text.iconId.iconInfo.height = height;
476 display_text.iconId.iconInfo.ics = ics;
477 if(icon_data_len > 0) {
478 display_text.iconId.iconInfo.iconDataLen = icon_data_len;
479 memcpy(display_text.iconId.iconInfo.iconFile, icon_data, icon_data_len);
481 dbg("icon exist(%d), icon_quali: (%d), icon_id: (%d), width: (%d), height: (%d), ics: (%d), icon_data_len: (%d)", display_text.iconId.bIsPresent, display_text.iconId.iconQualifier, display_text.iconId.iconIdentifier, display_text.iconId.iconInfo.width,
482 display_text.iconId.iconInfo.height, display_text.iconId.iconInfo.ics, display_text.iconId.iconInfo.iconDataLen);
484 g_variant_iter_free(iter);
487 dbg("command id (%d)", display_text.commandId);
488 dbg("display text (%s)", display_text.text.string);
489 dbg("string len(%d)", display_text.text.stringLen);
490 dbg("duration (%d)", display_text.duration);
491 dbg("high priority (%d)", display_text.bIsPriorityHigh);
492 dbg("user response required(%d)", display_text.bIsUserRespRequired);
493 dbg("immediately response (%d)", display_text.b_immediately_resp);
495 CALLBACK_CALL(&display_text);
497 else if (!g_strcmp0(sig, "SelectItem")) {
498 TelSatSelectItemInd_t select_item;
501 gchar *selected_text;
502 gint command_id, default_item_id, menu_cnt, text_len =0;
503 GVariant *menu_items;
504 #if defined(TIZEN_SUPPORT_SAT_ICON)
505 GVariantIter *iter, *iter2;
506 GVariant *unbox = NULL;
508 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
509 gchar *icon_data = NULL;
510 GVariant *icon_id = NULL;
511 GVariant *icon_list = NULL;
512 int index = 0, icon_index = 0;
513 /* Used to get icon list data */
514 GVariant *unbox_list, *unbox_list_info ;
515 GVariant *icon_list_info;
516 gboolean is_list_exist;
517 gint icon_list_quali, list_cnt, icon_list_identifier, list_width, list_height, list_ics, icon_list_data_len;
518 gchar *icon_list_data = NULL;
524 memset(&select_item, 0, sizeof(TelSatSelectItemInd_t));
526 #if defined(TIZEN_SUPPORT_SAT_ICON)
527 g_variant_get(param, "(ibsiii@v@v@v)", &command_id, &help_info, &selected_text,
528 &text_len, &default_item_id, &menu_cnt, &menu_items, &icon_id, &icon_list);
530 g_variant_get(param, "(ibsiii@v)", &command_id, &help_info, &selected_text,
531 &text_len, &default_item_id, &menu_cnt, &menu_items);
533 select_item.commandId = command_id;
534 select_item.bIsHelpInfoAvailable = (help_info ? 1 : 0);
535 memcpy(select_item.text.string, selected_text, TAPI_SAT_DEF_TITLE_LEN_MAX+1);
536 select_item.text.stringLen = text_len;
537 select_item.defaultItemIndex = default_item_id;
538 select_item.menuItemCount = menu_cnt;
539 if(menu_items && menu_cnt > 0){
541 gint item_id, item_len;
542 unbox = g_variant_get_variant(menu_items);
543 dbg("items(%p) items type_format(%s)", menu_items, g_variant_get_type_string(unbox));
545 g_variant_get(unbox, "a(iis)", &iter);
546 while(g_variant_iter_loop(iter,"(iis)",&item_id, &item_len, &item_str)){
547 select_item.menuItem[index].itemId = item_id;
548 select_item.menuItem[index].textLen = item_len;
549 memcpy(select_item.menuItem[index].text, item_str, TAPI_SAT_ITEM_TEXT_LEN_MAX + 1);
550 dbg("item index(%d) id(%d) len(%d) str(%s)", index,
551 select_item.menuItem[index].itemId, select_item.menuItem[index].textLen, select_item.menuItem[index].text);
554 g_variant_iter_free(iter);
557 #if defined(TIZEN_SUPPORT_SAT_ICON)
559 unbox = g_variant_get_variant(icon_id);
560 g_variant_get(unbox, "a(biiiiiis)", &iter);
562 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
565 select_item.iconId.bIsPresent = is_exist;
566 select_item.iconId.iconQualifier = icon_quali;
567 select_item.iconId.iconIdentifier = icon_identifier;
568 select_item.iconId.iconInfo.width = width;
569 select_item.iconId.iconInfo.height = height;
570 select_item.iconId.iconInfo.ics = ics;
571 if(icon_data_len > 0) {
572 select_item.iconId.iconInfo.iconDataLen = icon_data_len;
573 memcpy(select_item.iconId.iconInfo.iconFile, icon_data, icon_data_len);
575 dbg("icon exist(%d), icon_quali: (%d), icon_id: (%d), width: (%d), height: (%d), ics: (%d), icon_data_len: (%d)", select_item.iconId.bIsPresent, select_item.iconId.iconQualifier, select_item.iconId.iconIdentifier, select_item.iconId.iconInfo.width,
576 select_item.iconId.iconInfo.height, select_item.iconId.iconInfo.ics, select_item.iconId.iconInfo.iconDataLen);
578 g_variant_iter_free(iter);
582 unbox_list = g_variant_get_variant(icon_list);
583 g_variant_get(unbox_list, "a(biiv)", &iter);
585 while(g_variant_iter_loop(iter,"(biiv)", &is_list_exist, &icon_list_quali, &list_cnt, &icon_list_info)) {
588 select_item.iconIdList.bIsPresent = is_list_exist;
589 select_item.iconIdList.iconListQualifier = icon_list_quali;
590 select_item.iconIdList.iconCount = list_cnt;
592 unbox_list_info = g_variant_get_variant(icon_list_info);
593 g_variant_get(unbox_list_info, "a(iiiiis)", &iter2);
595 while(g_variant_iter_loop(iter2,"(iiiiis)",&icon_list_identifier, &list_width, &list_height, &list_ics, &icon_list_data_len, &icon_list_data)){
596 select_item.iconIdList.iconIdentifierList[icon_index]= icon_identifier;
597 select_item.iconIdList.iconInfo[icon_index].width = list_width;
598 select_item.iconIdList.iconInfo[icon_index].height = list_height;
599 select_item.iconIdList.iconInfo[icon_index].ics = list_ics;
600 if(icon_list_data_len > 0) {
601 select_item.iconIdList.iconInfo[icon_index].iconDataLen = icon_list_data_len;
602 memcpy(select_item.iconIdList.iconInfo[icon_index].iconFile, icon_list_data, icon_list_data_len);
606 g_variant_iter_free(iter2);
608 g_variant_iter_free(iter);
611 dbg("command id (%d)", select_item.commandId);
612 dbg("help info(%d)", select_item.bIsHelpInfoAvailable);
613 dbg("selected item string(%s)", select_item.text.string);
614 dbg("string len(%d)", select_item.text.stringLen);
615 dbg("default item index(%d)", select_item.defaultItemIndex);
616 dbg("item count(%d)", select_item.menuItemCount);
618 CALLBACK_CALL(&select_item);
620 else if (!g_strcmp0(sig, "GetInkey")) {
621 TelSatGetInkeyInd_t get_inkey;
623 gint command_id, key_type, input_character_mode;
624 gint text_len, duration;
625 gboolean b_numeric, b_help_info;
627 #if defined(TIZEN_SUPPORT_SAT_ICON)
628 GVariant *unbox = NULL;
630 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
631 gchar *icon_data = NULL;
632 GVariant *icon_id = NULL;
635 memset(&get_inkey, 0, sizeof(TelSatGetInkeyInd_t));
637 #if defined(TIZEN_SUPPORT_SAT_ICON)
638 g_variant_get(param, "(iiibbsii@v)", &command_id, &key_type, &input_character_mode,
639 &b_numeric,&b_help_info, &text, &text_len, &duration, &icon_id);
641 g_variant_get(param, "(iiibbsii)", &command_id, &key_type, &input_character_mode,
642 &b_numeric,&b_help_info, &text, &text_len, &duration);
644 get_inkey.commandId = command_id;
645 get_inkey.keyType = key_type;
646 get_inkey.inputCharMode = input_character_mode;
647 get_inkey.bIsNumeric = (b_numeric ? 1 : 0);
648 get_inkey.bIsHelpInfoAvailable = (b_help_info ? 1 : 0);
649 memcpy(get_inkey.text.string, text, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
650 get_inkey.text.stringLen = text_len;
651 get_inkey.duration = duration;
653 #if defined(TIZEN_SUPPORT_SAT_ICON)
655 unbox = g_variant_get_variant(icon_id);
656 g_variant_get(unbox, "a(biiiiiis)", &iter);
658 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
661 get_inkey.iconId.bIsPresent = is_exist;
662 get_inkey.iconId.iconQualifier = icon_quali;
663 get_inkey.iconId.iconIdentifier = icon_identifier;
664 get_inkey.iconId.iconInfo.width = width;
665 get_inkey.iconId.iconInfo.height = height;
666 get_inkey.iconId.iconInfo.ics = ics;
667 if(icon_data_len > 0) {
668 get_inkey.iconId.iconInfo.iconDataLen = icon_data_len;
669 memcpy(get_inkey.iconId.iconInfo.iconFile, icon_data, icon_data_len);
671 dbg("icon exist(%d), icon_quali: (%d), icon_id: (%d), width: (%d), height: (%d), ics: (%d), icon_data_len: (%d)", get_inkey.iconId.bIsPresent, get_inkey.iconId.iconQualifier, get_inkey.iconId.iconIdentifier, get_inkey.iconId.iconInfo.width,
672 get_inkey.iconId.iconInfo.height, get_inkey.iconId.iconInfo.ics, get_inkey.iconId.iconInfo.iconDataLen);
674 g_variant_iter_free(iter);
677 dbg("command id(%d)", get_inkey.commandId);
678 dbg("key type(%d)", get_inkey.keyType);
679 dbg("input character mode(%d)", get_inkey.inputCharMode);
680 dbg("numeric(%d)", get_inkey.bIsNumeric);
681 dbg("help info available(%d)", get_inkey.bIsHelpInfoAvailable);
682 dbg("text (%s)", get_inkey.text.string);
683 dbg("text length", get_inkey.text.stringLen);
684 dbg("duration", get_inkey.duration);
686 CALLBACK_CALL(&get_inkey);
688 else if (!g_strcmp0(sig, "GetInput")) {
689 TelSatGetInputInd_t get_input;
691 gint command_id, input_character_mode;
692 gint text_len, def_text_len, rsp_len_min, rsp_len_max;
693 gboolean b_numeric, b_help_info, b_echo_input;
694 gchar *text, *def_text;
695 #if defined(TIZEN_SUPPORT_SAT_ICON)
696 GVariant *unbox = NULL;
698 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
699 gchar *icon_data = NULL;
700 GVariant *icon_id = NULL;
703 memset(&get_input, 0, sizeof(TelSatGetInputInd_t));
705 #if defined(TIZEN_SUPPORT_SAT_ICON)
706 g_variant_get(param, "(iibbbsiiisi@v)", &command_id, &input_character_mode, &b_numeric, &b_help_info, &b_echo_input,
707 &text, &text_len, &rsp_len_max, &rsp_len_min, &def_text, &def_text_len, &icon_id);
709 g_variant_get(param, "(iibbbsiiisi)", &command_id, &input_character_mode, &b_numeric, &b_help_info, &b_echo_input,
710 &text, &text_len, &rsp_len_max, &rsp_len_min, &def_text, &def_text_len);
712 get_input.commandId = command_id;
713 get_input.inputCharMode = input_character_mode;
714 get_input.bIsNumeric = (b_numeric ? 1 : 0);
715 get_input.bIsHelpInfoAvailable = (b_help_info ? 1 : 0);
716 get_input.bIsEchoInput = (b_echo_input ? 1 : 0);
717 memcpy(get_input.text.string, text, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
718 get_input.text.stringLen = text_len;
719 get_input.respLen.max = rsp_len_max;
720 get_input.respLen.min = rsp_len_min;
721 memcpy(get_input.defaultText.string, def_text, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
722 get_input.defaultText.stringLen = def_text_len;
724 #if defined(TIZEN_SUPPORT_SAT_ICON)
726 unbox = g_variant_get_variant(icon_id);
727 g_variant_get(unbox, "a(biiiiiis)", &iter);
729 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
732 get_input.iconId.bIsPresent = is_exist;
733 get_input.iconId.iconQualifier = icon_quali;
734 get_input.iconId.iconIdentifier = icon_identifier;
735 get_input.iconId.iconInfo.width = width;
736 get_input.iconId.iconInfo.height = height;
737 get_input.iconId.iconInfo.ics = ics;
738 if(icon_data_len > 0) {
739 get_input.iconId.iconInfo.iconDataLen = icon_data_len;
740 memcpy(get_input.iconId.iconInfo.iconFile, icon_data, icon_data_len);
742 dbg("icon exist(%d), icon_quali: (%d), icon_id: (%d), width: (%d), height: (%d), ics: (%d), icon_data_len: (%d)", get_input.iconId.bIsPresent, get_input.iconId.iconQualifier, get_input.iconId.iconIdentifier, get_input.iconId.iconInfo.width,
743 get_input.iconId.iconInfo.height, get_input.iconId.iconInfo.ics, get_input.iconId.iconInfo.iconDataLen);
745 g_variant_iter_free(iter);
748 dbg("command id(%d)", get_input.commandId);
749 dbg("input character mode(%d)", get_input.inputCharMode);
750 dbg("numeric(%d)", get_input.bIsNumeric);
751 dbg("help info avaiable(%d)", get_input.bIsHelpInfoAvailable);
752 dbg("echo input(%d)", get_input.bIsEchoInput);
753 dbg("text(%s)", get_input.text.string);
754 dbg("text length(%d)", get_input.text.stringLen);
755 dbg("response length max(%d)", get_input.respLen.max);
756 dbg("response length min(%d)", get_input.respLen.min);
757 dbg("default text(%s)", get_input.defaultText.string);
758 dbg("default text length(%d)", get_input.defaultText.stringLen);
760 CALLBACK_CALL(&get_input);
762 else if (!g_strcmp0(sig, "SendSMS")) {
763 TelSatSendSmsIndSmsData_t send_sms;
765 gint command_id, ton, npi, tpdu_type;
766 gboolean b_packing_required;
767 gint text_len, number_len, tpdu_data_len;
768 gchar* text, *dialling_number;
771 memset(&send_sms, 0, sizeof(TelSatSendSmsIndSmsData_t));
773 g_variant_get(param, "(isibiisii@vi)", &command_id, &text, &text_len, &b_packing_required, &ton, &npi,
774 &dialling_number, &number_len, &tpdu_type, &tpdu_data, &tpdu_data_len);
776 send_sms.commandId = command_id;
777 send_sms.bIsPackingRequired = (b_packing_required ? 1 : 0);
779 send_sms.address.ton = ton;
780 send_sms.address.npi = npi;
781 send_sms.address.diallingNumberLen = number_len;
782 memcpy(send_sms.address.diallingNumber, dialling_number, TAPI_SAT_DIALLING_NUMBER_LEN_MAX);
784 send_sms.smsTpdu.tpduType = tpdu_type;
785 send_sms.smsTpdu.dataLen = tpdu_data_len;
790 GVariantIter *iter = NULL;
791 GVariant *inner_gv = NULL;
793 inner_gv = g_variant_get_variant(tpdu_data);
794 dbg("tpdu data exist type_format(%s)", g_variant_get_type_string(inner_gv));
796 g_variant_get(inner_gv, "ay", &iter);
797 while( g_variant_iter_loop (iter, "y", &data)){
798 dbg("index(%d) data(%c)", index, data);
799 send_sms.smsTpdu.data[index] = data;
802 g_variant_iter_free(iter);
803 g_variant_unref(inner_gv);
806 dbg("command id(%d)", send_sms.commandId);
807 dbg("packing required(%d)", send_sms.bIsPackingRequired);
808 dbg("address ton(%d)", send_sms.address.ton);
809 dbg("address npi(%d)", send_sms.address.npi);
810 dbg("address dialing number (%s)", send_sms.address.diallingNumber);
811 dbg("address number length (%d)", send_sms.address.diallingNumberLen);
812 dbg("tpdu type (%d)", send_sms.smsTpdu.tpduType);
813 dbg("tpdu length (%d)", send_sms.smsTpdu.dataLen);
815 CALLBACK_CALL(&send_sms);
817 else if (!g_strcmp0(sig, "SetupEventList")) {
821 TelSatEventListData_t event_list;
823 memset(&event_list, 0, sizeof(TelSatEventListData_t));
825 g_variant_get(param, "(i@v)", &event_cnt, &evt_list);
829 GVariantIter *iter = NULL;
830 GVariant *inner_gv = NULL;
832 inner_gv = g_variant_get_variant(evt_list);
833 dbg("event list exist type_format(%s)", g_variant_get_type_string(inner_gv));
835 g_variant_get(inner_gv, "ai", &iter);
836 while( g_variant_iter_loop (iter, "i", &data)){
837 dbg("g_index(%d) event(%d)", g_index, data);
838 g_event_list[g_index] = data;
840 if(data == TAPI_EVENT_SAT_DW_TYPE_IDLE_SCREEN_AVAILABLE){
841 event_list.bIsIdleScreenAvailable = 1;
843 else if(data == TAPI_EVENT_SAT_DW_TYPE_LANGUAGE_SELECTION){
844 event_list.bIsLanguageSelection = 1;
846 else if(data == TAPI_EVENT_SAT_DW_TYPE_BROWSER_TERMINATION){
847 event_list.bIsBrowserTermination = 1;
849 else if(data == TAPI_EVENT_SAT_DW_TYPE_DATA_AVAILABLE){
850 event_list.bIsDataAvailable = 1;
852 else if(data == TAPI_EVENT_SAT_DW_TYPE_CHANNEL_STATUS){
853 event_list.bIsChannelStatus = 1;
859 g_variant_iter_free(iter);
860 g_variant_unref(inner_gv);
863 dbg("event list cnt(%d)", event_cnt);
865 CALLBACK_CALL(&event_list);
867 else if (!g_strcmp0(sig, "Refresh")) {
868 TelSatRefreshInd_t refresh_info;
871 gint refresh_type =0;
873 GVariant *file_list = NULL;
875 memset(&refresh_info, 0, sizeof(TelSatRefreshInd_t));
877 g_variant_get(param, "(ii@v)", &command_id, &refresh_type, &file_list);
879 refresh_info.commandId = command_id;
880 refresh_info.refreshMode = refresh_type;
885 GVariantIter *iter = NULL;
886 GVariant *inner_gv = NULL;
888 inner_gv = g_variant_get_variant(file_list);
889 dbg("file list exist type_format(%s)", g_variant_get_type_string(inner_gv));
891 g_variant_get(inner_gv, "ai", &iter);
892 while( g_variant_iter_loop (iter, "i", &data)){
893 dbg("g_index(%d) file id(%d)", g_index, data);
894 refresh_info.fileId[g_index] = data;
900 g_variant_iter_free(iter);
901 g_variant_unref(inner_gv);
903 refresh_info.fileCount = file_cnt;
905 dbg("refresh event/file cnt(%d)", refresh_info.fileCount);
907 CALLBACK_CALL(&refresh_info);
909 else if (!g_strcmp0(sig, "SendDtmf")) {
910 TelSatSendDtmfIndDtmfData_t send_dtmf;
913 gint text_len = 0, dtmf_str_len = 0;
915 gchar *dtmf_str = NULL;
917 memset(&send_dtmf, 0, sizeof(TelSatSendDtmfIndDtmfData_t));
919 g_variant_get(param, "(isisi)", &command_id, &text, &text_len, &dtmf_str, &dtmf_str_len);
921 send_dtmf.commandId = command_id;
922 send_dtmf.bIsHiddenMode = 1;
924 send_dtmf.dtmfString.stringLen = dtmf_str_len;
925 memcpy(send_dtmf.dtmfString.string, dtmf_str, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
927 dbg("dtmf event command id(%d)", send_dtmf.commandId);
928 dbg("dtmf event dtmf(%s)", send_dtmf.dtmfString.string);
930 CALLBACK_CALL(&send_dtmf);
932 else if (!g_strcmp0(sig, "EndProactiveSession")) {
933 int command_type = 0;
935 g_variant_get(param, "(i)", &command_type);
936 dbg("end session evt : command type(%d)", command_type);
937 CALLBACK_CALL(&command_type);
939 else if (!g_strcmp0(sig, "CallControlResult")) {
940 TelSatCallCtrlIndData_t call_ctrl_result_ind;
941 gint call_ctrl_result = 0, disp_len = 0;
942 gint bc_repeat_indicator = 0, ton = 0x0F, npi=0X0F;
943 gchar *text = NULL, *call_num = NULL, *ss_string = NULL, *sub_addr = NULL, *ccp1 = NULL, *ccp2 = NULL;
945 memset(&call_ctrl_result_ind, 0x00, sizeof(TelSatCallCtrlIndData_t));
947 g_variant_get(param, "(isiisssssi)", &call_ctrl_result, &text, &ton, &npi, &call_num,
948 &ss_string, &sub_addr, &ccp1, &ccp2, &bc_repeat_indicator);
950 call_ctrl_result_ind.callCtrlResult = call_ctrl_result;
951 disp_len = strlen(text); //alpha id
953 call_ctrl_result_ind.dispData.stringLen = disp_len;
954 memcpy(&call_ctrl_result_ind.dispData.string, text, disp_len);
955 call_ctrl_result_ind.bIsUserInfoDisplayEnabled = 1;
958 if(strlen(call_num) > 1 && (g_strcmp0(call_num,"") != 0) ){
959 call_ctrl_result_ind.callCtrlCnfType = TAPI_SAT_CALL_TYPE_MO_VOICE;
960 call_ctrl_result_ind.u.callCtrlCnfCallData.address.stringLen = strlen(call_num);
961 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.address.string, call_num, strlen(call_num));
962 call_ctrl_result_ind.u.callCtrlCnfCallData.subAddress.stringLen = strlen(sub_addr);
963 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.subAddress.string, sub_addr, strlen(sub_addr));
964 call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.stringLen = strlen(ccp1);
965 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.string, ccp1, strlen(ccp1));
966 call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.stringLen = strlen(ccp2);
967 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.string, ccp2, strlen(ccp2));
968 call_ctrl_result_ind.u.callCtrlCnfCallData.bcRepeatIndicator = bc_repeat_indicator;
970 else if( strlen(ss_string) > 1 && (g_strcmp0(ss_string,"") != 0) ){
971 call_ctrl_result_ind.callCtrlCnfType = TAPI_SAT_CALL_TYPE_SS;
972 call_ctrl_result_ind.u.callCtrlCnfSsData.ssString.stringLen = strlen(ss_string);
973 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.ssString.string, ss_string, strlen(ss_string));
974 call_ctrl_result_ind.u.callCtrlCnfSsData.subAddress.stringLen = strlen(sub_addr);
975 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.subAddress.string, sub_addr, strlen(sub_addr));
976 call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.stringLen = strlen(ccp1);
977 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.string, ccp1, strlen(ccp1));
978 call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.stringLen = strlen(ccp2);
979 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.string, ccp2, strlen(ccp2));
980 call_ctrl_result_ind.u.callCtrlCnfSsData.bcRepeatIndicator = bc_repeat_indicator;
983 dbg("not matched call control");
987 CALLBACK_CALL(&call_ctrl_result_ind);
989 else if (!g_strcmp0(sig, "MoSmControlResult")) {
990 TelSatMoSmCtrlIndData_t mo_sm_ctrl_result_ind;
991 gint call_ctrl_result = 0 ,disp_len = 0;
992 gint rp_dst_ton = 0x0F, rp_dst_npi = 0X0F, tp_dst_ton = 0x0F, tp_dst_npi = 0X0F;
993 gchar *text = NULL, *rp_dst_call_num = NULL, *tp_dst_call_num = NULL;
995 memset(&mo_sm_ctrl_result_ind, 0x00, sizeof(TelSatMoSmCtrlIndData_t));
997 g_variant_get(param, "(isiisiis)", &call_ctrl_result, &text,
998 &rp_dst_ton, &rp_dst_npi, &rp_dst_call_num, &tp_dst_ton, &tp_dst_npi, &tp_dst_call_num);
1000 mo_sm_ctrl_result_ind.moSmsCtrlResult= call_ctrl_result;
1001 disp_len = strlen(text); //alpha id
1003 mo_sm_ctrl_result_ind.dispData.stringLen = disp_len;
1004 memcpy(&mo_sm_ctrl_result_ind.dispData.string, text, disp_len);
1005 mo_sm_ctrl_result_ind.bIsUserInfoDisplayEnabled = 1;
1008 if(strlen(rp_dst_call_num) > 1 && (g_strcmp0(rp_dst_call_num,"") != 0) ){
1009 mo_sm_ctrl_result_ind.tpDestAddr.bIsDigitOnly = 1;
1010 mo_sm_ctrl_result_ind.rpDestAddr.stringLen = strlen(rp_dst_call_num);
1011 memcpy(&mo_sm_ctrl_result_ind.rpDestAddr.string, rp_dst_call_num, strlen(rp_dst_call_num));
1012 }// rp dst call number exist
1013 else if( strlen(tp_dst_call_num) > 1 && (g_strcmp0(tp_dst_call_num,"") != 0) ){
1014 mo_sm_ctrl_result_ind.tpDestAddr.bIsDigitOnly = 1;
1015 mo_sm_ctrl_result_ind.tpDestAddr.stringLen = strlen(tp_dst_call_num);
1016 memcpy(&mo_sm_ctrl_result_ind.tpDestAddr.string, tp_dst_call_num, strlen(tp_dst_call_num));
1017 }//tp dst call number exist
1019 dbg("Any destination address are not provided, use default one.");
1022 CALLBACK_CALL(&mo_sm_ctrl_result_ind);
1025 dbg("not handled Sat noti[%s]", sig);
1029 static void _process_sim_event(const gchar *sig, GVariant *param,
1030 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1032 TAPI_RETURN_IF_FAIL(evt_cb_data);
1034 if (!g_strcmp0(sig, "Status")) {
1036 g_variant_get(param, "(i)", &status);
1037 CALLBACK_CALL(&status);
1038 } else if (!g_strcmp0(sig, "Refreshed")) {
1040 g_variant_get(param, "(i)", &type);
1041 CALLBACK_CALL(&type);
1043 dbg("not handled SIM noti[%s]",sig );
1047 static void _process_pb_event(const gchar *sig, GVariant *param,
1048 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1050 TAPI_RETURN_IF_FAIL(evt_cb_data);
1052 if (!g_strcmp0(sig, "Status")) {
1053 TelSimPbStatus_t status;
1054 g_variant_get(param, "(ibbbbbb)",
1055 &status.init_completed,
1056 &status.pb_list.b_fdn,
1057 &status.pb_list.b_adn,
1058 &status.pb_list.b_sdn,
1059 &status.pb_list.b_3g,
1060 &status.pb_list.b_aas,
1061 &status.pb_list.b_gas);
1063 dbg("init[%d] fdn[%d] adn[%d] sdn[%d] usim[%d] aas[%d] gas[%d]",
1064 status.init_completed, status.pb_list.b_fdn,status.pb_list.b_adn,status.pb_list.b_sdn,status.pb_list.b_3g,status.pb_list.b_aas,status.pb_list.b_gas);
1065 CALLBACK_CALL(&status);
1067 dbg("not handled Phonebook noti[%s]",sig );
1071 static void _process_sap_event(const gchar *sig, GVariant *param,
1072 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1074 TAPI_RETURN_IF_FAIL(evt_cb_data);
1076 if (!g_strcmp0(sig, "Status")) {
1078 g_variant_get(param, "(i)", ¬i);
1079 CALLBACK_CALL(¬i);
1080 } else if (!g_strcmp0(sig, "Disconnect")) {
1082 g_variant_get(param, "(i)", &disconnect);
1083 CALLBACK_CALL(&disconnect);
1085 dbg("not handled SAP noti[%s]",sig );
1089 static void _process_modem_event(const gchar *sig, GVariant *param,
1090 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1092 TAPI_RETURN_IF_FAIL(evt_cb_data);
1094 if (!g_strcmp0(sig, "Power")) {
1097 g_variant_get(param, "(i)", ¬i);
1099 CALLBACK_CALL(¬i);
1101 else if (!g_strcmp0(sig, "DunPinCtrl")) {
1102 tapi_ps_btdun_pincontrol pin_ctrl;
1103 int signal = 0, status = 0;
1105 memset(&pin_ctrl, 0, sizeof(tapi_ps_btdun_pincontrol));
1106 g_variant_get(param, "(ib)", &signal, &status);
1107 pin_ctrl.signal = signal;
1108 pin_ctrl.status = status;
1110 CALLBACK_CALL(&pin_ctrl);
1112 else if (!g_strcmp0(sig, "DunExternalCall")) {
1113 gboolean external_call;
1115 g_variant_get(param, "(b)", &external_call);
1117 CALLBACK_CALL(&external_call);
1120 dbg("not handled Modem noti[%s]", sig);
1126 static void _process_ss_event(const gchar *sig, GVariant *param,
1127 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1129 GVariant *value = 0;
1130 GVariantIter *iter = 0;
1131 GVariantIter *iter_row = 0;
1132 const gchar *key = 0;
1135 TAPI_RETURN_IF_FAIL(evt_cb_data);
1137 if (!g_strcmp0(sig, "NotifyUSSD")) {
1138 TelSsUssdMsgInfo_t noti;
1140 memset(¬i, 0, sizeof(TelSsUssdMsgInfo_t));
1142 g_variant_get(param, "(iiis)", ¬i.Type, ¬i.Dcs, ¬i.Length, &str);
1145 g_strlcpy((char*)noti.szString, str, TAPI_SS_USSD_DATA_SIZE_MAX);
1149 CALLBACK_CALL(¬i);
1151 } else if (!g_strcmp0(sig, "NotifySsInfo")) {
1153 memset(¬i, 0, sizeof(TelSsInfo_t));
1155 g_variant_get(param, "(ii)", ¬i.Cause, ¬i.SsType);
1157 CALLBACK_CALL(¬i);
1160 else if (!g_strcmp0(sig, "ReleaseComplete")) {
1161 TelSsRelCompMsgInfo_t noti;
1165 memset ( ¬i, 0, sizeof( TelSsRelCompMsgInfo_t ));
1167 g_variant_get(param, "(i@v)", &len, &msg);
1169 noti.RelCompMsgLen = (unsigned char)len;
1174 GVariantIter *iter = NULL;
1175 GVariant *inner_gv = NULL;
1177 inner_gv = g_variant_get_variant(msg);
1178 dbg("[ check ] data exist type_format(%s)", g_variant_get_type_string(inner_gv));
1180 g_variant_get(inner_gv, "ay", &iter);
1181 while( g_variant_iter_loop (iter, "y", &data)){
1182 dbg("index(%d) data(%c)", index, data);
1183 noti.szRelCompMsg[i] = data;
1186 g_variant_iter_free(iter);
1187 g_variant_unref(inner_gv);
1190 CALLBACK_CALL(¬i);
1192 } else if ( !g_strcmp0(sig, "NotifyForwarding") ) {
1194 TelSsForwardNoti_t noti;
1195 memset(¬i, 0, sizeof(TelSsForwardNoti_t));
1197 g_variant_get (param, "(aa{sv})", &iter);
1199 noti.record_num = g_variant_iter_n_children(iter);
1201 while ( g_variant_iter_next(iter, "a{sv}", &iter_row ) ) {
1202 while ( g_variant_iter_loop( iter_row, "{sv}", &key, &value ) ) {
1204 if ( !g_strcmp0(key, "ss_class") ) {
1205 noti.record[i].Class = g_variant_get_int32(value);
1208 if ( !g_strcmp0(key, "ss_status") ) {
1209 noti.record[i].Status = g_variant_get_int32(value);
1212 if ( !g_strcmp0(key, "forwarding_mode") ) {
1213 noti.record[i].ForwardCondition = g_variant_get_int32(value);
1216 if ( !g_strcmp0(key, "number_present") ) {
1217 noti.record[i].bCallForwardingNumberPresent = g_variant_get_int32(value);
1220 if ( !g_strcmp0(key, "no_reply_time") ) {
1221 noti.record[i].NoReplyWaitTime = g_variant_get_int32(value);
1224 if ( !g_strcmp0(key, "type_of_number") ) {
1225 noti.record[i].Ton = g_variant_get_int32(value);
1228 if ( !g_strcmp0(key, "number_plan_identity") ) {
1229 noti.record[i].Npi = g_variant_get_int32(value);
1232 if ( !g_strcmp0(key, "forwarding_number") ) {
1233 strncpy((char *)noti.record[i].szCallForwardingNumber, g_variant_get_string(value, 0), TAPI_CALL_DIALDIGIT_LEN_MAX );
1238 g_variant_iter_free(iter_row);
1240 g_variant_iter_free(iter);
1242 CALLBACK_CALL(¬i);
1244 } else if ( !g_strcmp0(sig, "NotifyWaiting") ) {
1246 TelSsWaitingNoti_t noti;
1247 memset(¬i, '\0', sizeof(TelSsWaitingNoti_t));
1249 g_variant_get (param, "(aa{sv})", &iter);
1251 noti.record_num = g_variant_iter_n_children(iter);
1253 while ( g_variant_iter_next(iter, "a{sv}", &iter_row ) ) {
1254 while ( g_variant_iter_loop( iter_row, "{sv}", &key, &value ) ) {
1256 if ( !g_strcmp0(key, "ss_class") ) {
1257 noti.record[i].Class = g_variant_get_int32(value);
1260 if ( !g_strcmp0(key, "ss_status") ) {
1261 noti.record[i].Status = g_variant_get_int32(value);
1265 g_variant_iter_free(iter_row);
1267 g_variant_iter_free(iter);
1269 CALLBACK_CALL(¬i);
1271 } else if ( !g_strcmp0(sig, "NotifyBarring") ) {
1273 TelSsBarringNoti_t noti;
1274 memset(¬i, '\0', sizeof(TelSsBarringNoti_t));
1276 g_variant_get (param, "(aa{sv})", &iter);
1278 noti.record_num = g_variant_iter_n_children(iter);
1280 while ( g_variant_iter_next(iter, "a{sv}", &iter_row ) ) {
1281 while ( g_variant_iter_loop( iter_row, "{sv}", &key, &value ) ) {
1283 if ( !g_strcmp0(key, "ss_class") ) {
1284 noti.record[i].Class = g_variant_get_int32(value);
1287 if ( !g_strcmp0(key, "ss_status") ) {
1288 noti.record[i].Status = g_variant_get_int32(value);
1291 if ( !g_strcmp0(key, "barring_mode") ) {
1292 noti.record[i].Flavour = g_variant_get_int32(value);
1297 g_variant_iter_free(iter_row);
1299 g_variant_iter_free(iter);
1301 CALLBACK_CALL(¬i);
1304 dbg("not handled SS noti[%s]", sig);
1310 static void _process_gps_event(const gchar *sig, GVariant *param,
1311 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1313 gboolean b_decode_data = FALSE;
1314 guchar *decoded_data = NULL;
1316 TAPI_RETURN_IF_FAIL(evt_cb_data);
1318 if (!g_strcmp0(sig, "AssistData")) {
1319 b_decode_data = TRUE;
1321 else if (!g_strcmp0(sig, "MeasurePosition")) {
1322 b_decode_data = TRUE;
1324 else if (!g_strcmp0(sig, "ResetAssistData")) {
1325 /* noting to decode */
1327 else if (!g_strcmp0(sig, "FrequencyAiding")) {
1328 b_decode_data = TRUE;
1330 else if (!g_strcmp0(sig, "AreaStatus")) {
1331 struct tel_noti_smart_assistant_area_status noti;
1332 int area_status = 0, index = 0;
1334 memset(¬i, 0, sizeof(struct tel_noti_smart_assistant_area_status));
1335 g_variant_get(param, "(ii)", &area_status, &index);
1336 noti.area_status = area_status;
1339 CALLBACK_CALL(¬i);
1341 else if (!g_strcmp0(sig, "SyncStatus")) {
1342 struct tel_noti_smart_assistant_sync_status noti;
1343 int init_status = 0, init_fail_cause = 0;
1345 memset(¬i, 0, sizeof(struct tel_noti_smart_assistant_sync_status));
1346 g_variant_get(param, "(ii)", &init_status, &init_fail_cause);
1347 noti.init_status = init_status;
1348 noti.init_fail_cause = init_fail_cause;
1350 CALLBACK_CALL(¬i);
1353 dbg("not handled Gps noti[%s]", sig);
1360 dbg("[%s] decoding start", sig);
1362 g_variant_get(param, "(s)", &data);
1363 decoded_data = g_base64_decode((const gchar *)data, &length);
1365 CALLBACK_CALL(decoded_data);
1368 dbg("length=%d", length);
1372 g_free(decoded_data);
1376 static void on_prop_callback(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface,
1377 const gchar *sig, GVariant *param, gpointer user_data)
1379 TapiHandle *handle = user_data;
1380 struct tapi_evt_cb *evt_cb_data = NULL;
1381 const gchar *interface_name_for_signal;
1382 GVariant *changed_properties = NULL;
1383 gchar **invalidated_properties = NULL;
1391 TAPI_RETURN_IF_FAIL(handle);
1393 if (!g_variant_is_of_type (param, G_VARIANT_TYPE ("(sa{sv}as)"))) {
1394 err("PropertiesChanged parameter type mismatch ('%s')", g_variant_get_type_string(param));
1398 g_variant_get (param, "(&s@a{sv}^a&s)", &interface_name_for_signal,
1399 &changed_properties, &invalidated_properties);
1401 if (!changed_properties) {
1402 err("Cannot get changed_properties");
1406 g_variant_iter_init (&iter, changed_properties);
1407 while (g_variant_iter_next (&iter, "{sv}", &key, &value)) {
1408 if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING )) {
1409 data = g_try_malloc0 (g_variant_get_size (value) + 3);
1411 warn ("g_try_malloc0 failed");
1412 g_variant_unref (value);
1417 memcpy (data + 2, g_variant_get_data (value),
1418 g_variant_get_size (value));
1420 else if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN )) {
1421 data = g_strdup_printf ("b:%d",
1422 *(guchar *) g_variant_get_data (value));
1425 data = g_strdup_printf ("i:%d", *(int *) g_variant_get_data (value));
1428 g_variant_unref (value);
1430 memset(noti_id, 0, 256);
1431 snprintf (noti_id, 255, "%s:%s", interface_name_for_signal, key);
1433 evt_cb_data = g_hash_table_lookup (handle->evt_list, noti_id);
1435 /* ignore un-registered property change callback */
1439 prev_value = g_hash_table_lookup (handle->cache_property, noti_id);
1441 if (g_strcmp0 (data, prev_value) == 0) {
1447 dbg("save prop: [%s] - [%s]", noti_id, data);
1448 g_hash_table_replace (handle->cache_property, g_strdup(noti_id), data);
1452 if (data[0] == 's') {
1453 CALLBACK_CALL((void * ) (data + 2));
1456 param_i = atoi (data + 2);
1457 CALLBACK_CALL((void * )¶m_i);
1462 if (changed_properties != NULL )
1463 g_variant_unref (changed_properties);
1466 if (invalidated_properties)
1467 g_free (invalidated_properties);
1470 static void on_signal_callback(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface,
1471 const gchar *sig, GVariant *param, gpointer user_data)
1473 TapiHandle *handle = user_data;
1474 struct tapi_evt_cb *evt_cb_data = NULL;
1477 TAPI_RETURN_IF_FAIL(handle);
1479 noti_id = g_strdup_printf("%s:%s", interface, sig);
1481 evt_cb_data = g_hash_table_lookup(handle->evt_list, noti_id);
1483 dbg("can't find noti_id(%s) callback info", noti_id);
1488 if (!g_strcmp0(interface, DBUS_TELEPHONY_SMS_INTERFACE)) {
1489 _process_sms_event(sig, param, handle, noti_id, evt_cb_data);
1491 else if (!g_strcmp0(interface, DBUS_TELEPHONY_CALL_INTERFACE)) {
1492 _process_call_event(sig, param, handle, noti_id, evt_cb_data);
1494 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SAT_INTERFACE)) {
1495 _process_sat_event(sig, param, handle, noti_id, evt_cb_data);
1497 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SIM_INTERFACE)) {
1498 _process_sim_event(sig, param, handle, noti_id, evt_cb_data);
1500 else if (!g_strcmp0(interface, DBUS_TELEPHONY_PB_INTERFACE)) {
1501 _process_pb_event(sig, param, handle, noti_id, evt_cb_data);
1503 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SAP_INTERFACE)) {
1504 _process_sap_event(sig, param, handle, noti_id, evt_cb_data);
1506 else if (!g_strcmp0(interface, DBUS_TELEPHONY_MODEM_INTERFACE)) {
1507 _process_modem_event(sig, param, handle, noti_id, evt_cb_data);
1509 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SS_INTERFACE)) {
1510 _process_ss_event(sig, param, handle, noti_id, evt_cb_data);
1512 else if (!g_strcmp0(interface, DBUS_TELEPHONY_GPS_INTERFACE)) {
1513 _process_gps_event(sig, param, handle, noti_id, evt_cb_data);
1515 else if (!g_strcmp0(interface, DBUS_TELEPHONY_NETWORK_INTERFACE)) {
1516 _process_network_event(sig, param, handle, noti_id, evt_cb_data);
1523 EXPORT_API char** tel_get_cp_name_list(void)
1525 gpointer d_conn = NULL;
1526 GError *error = NULL;
1528 GVariantIter *iter = NULL;
1529 GVariant *rst = NULL;
1531 gchar *modem_path = NULL;
1532 GSList *list = NULL;
1535 int i = 0, element_cnt = 0;
1536 gchar **cp_list = NULL;
1538 d_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1540 err("Error creating dbus connection: %s\n", error->message);
1541 g_error_free (error);
1545 rst = g_dbus_connection_call_sync(d_conn, DBUS_TELEPHONY_SERVICE , "/org/tizen/telephony",
1546 "org.tizen.telephony.Manager", "GetModems", NULL, NULL,
1547 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, NULL, &error);
1550 dbg( "GetModems() failed. (%s)", error->message);
1551 g_error_free (error);
1555 g_variant_get (rst, "(as)", &iter);
1556 while (g_variant_iter_next(iter, "s", &modem_path)){
1557 list = g_slist_append(list, modem_path);
1559 g_variant_iter_free (iter);
1566 element_cnt = g_slist_length(list);
1567 cp_list = g_new0(char*, element_cnt + 1);
1572 for (l = list; l; l = l->next, i++) {
1573 cp_list[i] = g_strdup(l->data);
1576 dbg("cp name[%d] = %s", i, cp_list[i]);
1578 cp_list[element_cnt] = NULL;
1584 g_object_unref(d_conn);
1587 g_variant_unref(rst);
1592 static char *get_property (TapiHandle *handle, const char *property,
1593 const GVariantType *type)
1596 GVariant *value = NULL;
1597 GVariant *value_container = NULL;
1598 GError *error = NULL;
1601 dbus_info = g_strsplit (property, ":", 2);
1603 dbg("invalid property");
1607 if (!dbus_info[0] || !dbus_info[1]) {
1608 dbg("invalid property");
1612 value_container = g_dbus_connection_call_sync (handle->dbus_connection,
1613 DBUS_TELEPHONY_SERVICE, handle->path,
1614 "org.freedesktop.DBus.Properties", "Get",
1615 g_variant_new ("(ss)", dbus_info[0], dbus_info[1]),
1616 G_VARIANT_TYPE ("(v)"), G_DBUS_CALL_FLAGS_NONE,
1617 TAPI_DEFAULT_TIMEOUT, handle->ca, &error);
1620 warn("dbus error = %d (%s)", error->code, error->message);
1621 g_error_free (error);
1624 if (!value_container)
1627 dbg("%s - type:[%s]", property, g_variant_get_type_string(value_container));
1628 g_variant_get (value_container, "(v)", &value);
1629 g_variant_unref (value_container);
1631 if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING )) {
1632 data = g_try_malloc0 (g_variant_get_size (value));
1634 warn ("calloc failed");
1635 g_variant_unref (value);
1638 memcpy (data, g_variant_get_data (value), g_variant_get_size (value));
1640 else if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN )) {
1641 data = g_strdup_printf ("%d", *(guchar *) g_variant_get_data (value));
1644 data = g_strdup_printf ("%d", *(int *) g_variant_get_data (value));
1647 g_variant_unref (value);
1650 g_strfreev (dbus_info);
1655 EXPORT_API int tel_get_property_int (TapiHandle *handle,
1656 const char *property, int *result)
1660 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1661 TAPI_RET_ERR_NUM_IF_FAIL(property, TAPI_API_INVALID_INPUT);
1662 TAPI_RET_ERR_NUM_IF_FAIL(result, TAPI_API_INVALID_INPUT);
1664 data = get_property (handle, property, G_VARIANT_TYPE_INT32);
1666 return TAPI_API_OPERATION_FAILED;
1668 *result = atoi(data);
1672 return TAPI_API_SUCCESS;
1675 EXPORT_API int tel_get_property_string(TapiHandle *handle, const char *property, char **result)
1679 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1680 TAPI_RET_ERR_NUM_IF_FAIL(property, TAPI_API_INVALID_INPUT);
1681 TAPI_RET_ERR_NUM_IF_FAIL(result, TAPI_API_INVALID_INPUT);
1683 data = get_property (handle, property, G_VARIANT_TYPE_STRING);
1685 return TAPI_API_OPERATION_FAILED;
1689 return TAPI_API_SUCCESS;
1692 EXPORT_API TapiHandle* tel_init(const char *cp_name)
1694 GError *error = NULL;
1695 struct tapi_handle *handle;
1699 handle = g_new0(struct tapi_handle, 1);
1704 handle->dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1705 if (!handle->dbus_connection) {
1706 err("Error creating dbus connection: %s\n", error->message);
1708 g_error_free (error);
1712 dbg("unique_name:[%s] invocation:[%s]", g_dbus_connection_get_unique_name(
1713 handle->dbus_connection), program_invocation_name);
1715 handle->ca = g_cancellable_new();
1718 handle->cp_name = g_strdup(cp_name);
1724 list = tel_get_cp_name_list();
1726 g_cancellable_cancel(handle->ca);
1727 g_object_unref(handle->ca);
1734 g_cancellable_cancel(handle->ca);
1735 g_object_unref(handle->ca);
1742 handle->cp_name = g_strdup(list[0]);
1744 /* Free the list of CP names */
1745 while (list[i] != NULL) {
1752 handle->evt_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1753 handle->cache_property = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1755 handle->path = g_strdup_printf("%s/%s",
1756 DBUS_TELEPHONY_DEFAULT_PATH, handle->cp_name);
1761 static gboolean _unregister_noti(gpointer key, gpointer value, gpointer user_data)
1763 struct tapi_evt_cb *evt_cb_data = value;
1764 TapiHandle *handle = user_data;
1766 g_dbus_connection_signal_unsubscribe(handle->dbus_connection, evt_cb_data->evt_id);
1771 EXPORT_API int tel_deinit(TapiHandle* handle)
1773 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1775 if (handle->cp_name)
1776 g_free(handle->cp_name);
1779 g_free(handle->path);
1781 g_dbus_connection_signal_unsubscribe(handle->dbus_connection, handle->prop_callback_evt_id);
1782 g_hash_table_foreach_remove(handle->evt_list, _unregister_noti, handle);
1783 g_hash_table_destroy(handle->evt_list);
1784 g_hash_table_destroy(handle->cache_property);
1786 g_cancellable_cancel(handle->ca);
1787 g_object_unref(handle->ca);
1789 g_object_unref (handle->dbus_connection);
1791 memset(handle, 0, sizeof(struct tapi_handle));
1796 return TAPI_API_SUCCESS;
1799 EXPORT_API int tel_register_noti_event (TapiHandle *handle, const char *noti_id,
1800 tapi_notification_cb callback, void *user_data)
1802 gchar **dbus_str = NULL;
1803 gpointer tmp = NULL;
1804 struct tapi_evt_cb *evt_cb_data = NULL;
1806 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1807 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_INPUT);
1808 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_INPUT);
1809 TAPI_RET_ERR_NUM_IF_FAIL(noti_id, TAPI_API_INVALID_INPUT);
1811 tmp = g_hash_table_lookup (handle->evt_list, noti_id);
1813 dbg("noti_id(%s) is already registered", noti_id);
1814 return TAPI_API_INVALID_INPUT;
1817 dbus_str = g_strsplit (noti_id, ":", 2);
1819 dbg("invalid noti_id");
1820 return TAPI_API_INVALID_INPUT;
1823 if (!dbus_str[0] || !dbus_str[1]) {
1824 g_strfreev (dbus_str);
1825 dbg("invalid noti_id");
1826 return TAPI_API_INVALID_INPUT;
1829 evt_cb_data = g_new0(struct tapi_evt_cb, 1);
1830 evt_cb_data->cb_fn = callback;
1831 evt_cb_data->user_data = user_data;
1833 dbg("path(%s) interface (%s) signal (%s)", handle->path, dbus_str[0], dbus_str[1]);
1835 if (dbus_str[1][0] >= 'a' && dbus_str[1][0] <= 'z') {
1836 /* Property change callback - only one time */
1837 if (handle->prop_callback_evt_id == 0) {
1838 handle->prop_callback_evt_id = g_dbus_connection_signal_subscribe (
1839 handle->dbus_connection, DBUS_TELEPHONY_SERVICE, /* Sender */
1840 "org.freedesktop.DBus.Properties", /* Interface */
1841 "PropertiesChanged", /* Member */
1842 handle->path, /* Object path */
1844 G_DBUS_SIGNAL_FLAGS_NONE, on_prop_callback, handle, NULL );
1848 /* Signal callback */
1849 evt_cb_data->evt_id = g_dbus_connection_signal_subscribe (
1850 handle->dbus_connection, DBUS_TELEPHONY_SERVICE, /* Sender */
1851 dbus_str[0], /* Interface */
1852 dbus_str[1], /* Member */
1853 handle->path, /* Object path */
1855 G_DBUS_SIGNAL_FLAGS_NONE, on_signal_callback, handle, NULL );
1859 g_hash_table_insert (handle->evt_list, g_strdup (noti_id), evt_cb_data);
1861 g_strfreev (dbus_str);
1863 return TAPI_API_SUCCESS;
1866 EXPORT_API int tel_deregister_noti_event (TapiHandle *handle,
1867 const char *noti_id)
1869 struct tapi_evt_cb *evt_cb_data = NULL;
1870 gboolean rv = FALSE;
1872 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1873 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_INPUT);
1875 evt_cb_data = g_hash_table_lookup (handle->evt_list, noti_id);
1877 dbg("event does not registered");
1878 return TAPI_API_INVALID_INPUT;
1881 g_dbus_connection_signal_unsubscribe (handle->dbus_connection,
1882 evt_cb_data->evt_id);
1884 rv = g_hash_table_remove (handle->evt_list, noti_id);
1886 dbg("fail to deregister noti event(%s)", noti_id);
1887 return TAPI_API_OPERATION_FAILED;
1890 return TAPI_API_SUCCESS;