4 * Copyright (c) 2014 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"
33 #include "TelNetwork.h"
42 extern char *g_cookie_name;
43 extern int g_cookie_size;
45 TelSatEventDownloadType_t g_event_list[TAPI_SAT_EVENT_LIST_MAX_COUNT] = {-1};
47 static void _process_sms_event(const gchar *sig, GVariant *param,
48 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
50 TAPI_RETURN_IF_FAIL(evt_cb_data);
52 if (!g_strcmp0(sig, "IncommingMsg")) {
53 struct tel_noti_sms_incomming_msg noti;
55 GVariant *sca = 0, *tpdu = 0;
57 GVariantIter *iter = 0;
58 GVariant *inner_gv = 0;
60 memset(¬i, 0, sizeof(struct tel_noti_sms_incomming_msg));
62 g_variant_get(param, "(@vi@v)", &sca, ¬i.MsgLength, &tpdu);
64 inner_gv = g_variant_get_variant( sca );
65 g_variant_get(inner_gv, "ay", &iter);
66 while( g_variant_iter_loop( iter, "y", ¬i.Sca[i] ) ) {
68 if( i >= TAPI_SIM_SMSP_ADDRESS_LEN )
73 inner_gv = g_variant_get_variant( tpdu );
74 g_variant_get(inner_gv, "ay", &iter);
75 while( g_variant_iter_loop( iter, "y", ¬i.szData[i] ) ) {
77 if( i >= TAPI_NETTEXT_SMDATA_SIZE_MAX + 1 )
80 g_variant_iter_free(iter);
81 g_variant_unref(inner_gv);
83 noti.format = TAPI_NETTEXT_NETTYPE_3GPP;
87 else if (!g_strcmp0(sig, "IncommingCbMsg")) {
88 struct tel_noti_sms_incomming_cb_msg noti;
90 GVariant *cbMsg = NULL;
92 GVariantIter *iter = 0;
93 GVariant *inner_gv = 0;
95 memset(¬i, 0, sizeof(struct tel_noti_sms_incomming_cb_msg));
96 g_variant_get(param, "(ii@v)", ¬i.CbMsgType, ¬i.Length, &cbMsg);
98 inner_gv = g_variant_get_variant( cbMsg );
99 g_variant_get(inner_gv, "ay", &iter);
100 while( g_variant_iter_loop( iter, "y", ¬i.szMsgData[i] ) ) {
102 if( i >= noti.Length + 1 )
105 g_variant_iter_free(iter);
106 g_variant_unref(inner_gv);
108 CALLBACK_CALL(¬i);
110 else if (!g_strcmp0(sig, "IncommingEtwsMsg")) {
111 struct tel_noti_sms_incomming_etws_msg noti;
113 GVariant *etwsMsg = NULL;
115 GVariantIter *iter = 0;
116 GVariant *inner_gv = 0;
119 memset(¬i, 0, sizeof(struct tel_noti_sms_incomming_etws_msg));
120 g_variant_get(param, "(ii@v)", ¬i.EtwsMsgType, ¬i.Length, &etwsMsg);
122 inner_gv = g_variant_get_variant( etwsMsg );
123 g_variant_get(inner_gv, "ay", &iter);
124 while( g_variant_iter_loop( iter, "y", ¬i.szMsgData[i] ) ) {
126 if( i >= TAPI_NETTEXT_ETWS_SIZE_MAX + 1 )
129 g_variant_iter_free(iter);
130 g_variant_unref(inner_gv);
132 CALLBACK_CALL(¬i);
134 else if (!g_strcmp0(sig, "MemoryStatus")) {
137 g_variant_get(param, "(i)", ¬i);
138 CALLBACK_CALL(¬i);
140 else if (!g_strcmp0(sig, "SmsReady")) {
143 g_variant_get(param, "(b)", ¬i);
144 CALLBACK_CALL(¬i);
147 dbg("not handled Sms noti[%s]", sig);
151 static void _process_call_event(const gchar *sig, GVariant *param,
152 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
154 TAPI_RETURN_IF_FAIL(evt_cb_data);
156 if (!g_strcmp0(sig, "VoiceCallStatusIdle") || !g_strcmp0(sig, "VideoCallStatusIdle") ) {
157 TelCallStatusIdleNoti_t data;
158 int start_time = 0, end_time = 0;
159 g_variant_get(param, "(iiii)", &data.id, &data.cause, &start_time, &end_time);
160 msg("[ check ] (%s) %s : call_id(%d), end_cause(0x%x)", handle->cp_name, "Status Idle noti", data.id, data.cause);
161 CALLBACK_CALL(&data);
163 else if (!g_strcmp0(sig, "VoiceCallStatusDialing") || !g_strcmp0(sig, "VideoCallStatusDialing")) {
164 TelCallStatusDialingNoti_t data;
165 g_variant_get(param, "(i)", &data.id);
166 msg("[ check ] (%s) %s : call_id(%d)", handle->cp_name, "Status Dialing noti", data.id);
167 CALLBACK_CALL(&data);
169 else if (!g_strcmp0(sig, "VoiceCallStatusAlert") || !g_strcmp0(sig, "VideoCallStatusAlert")) {
170 TelCallStatusAlertNoti_t data;
171 g_variant_get(param, "(i)", &data.id);
172 msg("[ check ] (%s) %s : call_id(%d)", handle->cp_name, "Status Alert noti", data.id);
173 CALLBACK_CALL(&data);
175 else if (!g_strcmp0(sig, "VoiceCallStatusActive") || !g_strcmp0(sig, "VideoCallStatusActive")) {
176 TelCallStatusActiveNoti_t data;
177 g_variant_get(param, "(i)", &data.id);
178 msg("[ check ] (%s) %s : call_id(%d)", handle->cp_name, "Status Active noti", data.id);
179 CALLBACK_CALL(&data);
181 else if (!g_strcmp0(sig, "VoiceCallStatusHeld") ) {
182 TelCallStatusHeldNoti_t data;
183 g_variant_get(param, "(i)", &data.id);
184 msg("[ check ] (%s) %s : call_id(%d)", handle->cp_name, "Status Held noti", data.id);
185 CALLBACK_CALL(&data);
187 else if (!g_strcmp0(sig, "VoiceCallStatusIncoming") || !g_strcmp0(sig, "VideoCallStatusIncoming")) {
188 TelCallStatusIncomingNoti_t data;
189 g_variant_get(param, "(i)", &data.id);
190 msg("[ check ] (%s) %s : call_id(%d)", handle->cp_name, "Status Incoming noti", data.id);
191 CALLBACK_CALL(&data);
193 else if (!g_strcmp0(sig, "Waiting")) {
194 TelCallInfoWaitingNoti_t data;
195 g_variant_get(param, "(i)", &data.id);
196 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Waiting noti", data.id);
197 CALLBACK_CALL(&data.id);
199 else if (!g_strcmp0(sig, "Forwarded")) {
200 TelCallInfoForwardedNoti_t data;
201 g_variant_get(param, "(i)", &data.id);
202 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Forwarded noti", data.id);
203 CALLBACK_CALL(&data.id);
205 else if (!g_strcmp0(sig, "ForwardedCall")) {
206 TelCallInfoForwardedCallNoti_t data;
207 g_variant_get(param, "(i)", &data.id);
208 dbg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Forwarded Call noti", data.id);
209 CALLBACK_CALL(&data.id);
211 else if (!g_strcmp0(sig, "BarredIncoming")) {
212 TelCallInfoBarredIncomingNoti_t data;
213 g_variant_get(param, "(i)", &data.id);
214 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Barred Incoming noti", data.id);
215 CALLBACK_CALL(&data.id);
217 else if (!g_strcmp0(sig, "BarredOutgoing")) {
218 TelCallInfoBarredOutgoingNoti_t data;
219 g_variant_get(param, "(i)", &data.id);
220 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Barred Outgoing noti", data.id);
221 CALLBACK_CALL(&data.id);
223 else if (!g_strcmp0(sig, "ForwardConditional")) {
224 TelCallInfoForwardConditionalNoti_t data;
225 g_variant_get(param, "(i)", &data.id);
226 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Forward Conditional noti", data.id);
227 CALLBACK_CALL(&data.id);
229 else if (!g_strcmp0(sig, "ForwardUnconditional")) {
230 TelCallInfoForwardUnconditionalNoti_t data;
231 g_variant_get(param, "(i)", &data.id);
232 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Forward Unconditional noti", data.id);
233 CALLBACK_CALL(&data.id);
235 else if (!g_strcmp0(sig, "CallActive")) {
236 TelCallInfoActiveNoti_t data;
237 g_variant_get(param, "(i)", &data.id);
238 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Call Active noti", data.id);
239 CALLBACK_CALL(&data.id);
241 else if (!g_strcmp0(sig, "CallHeld")) {
242 TelCallInfoHeldNoti_t data;
243 g_variant_get(param, "(i)", &data.id);
244 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Call Held noti", data.id);
245 CALLBACK_CALL(&data.id);
247 else if (!g_strcmp0(sig, "CallJoined")) {
248 TelCallInfoJoinedNoti_t data;
249 g_variant_get(param, "(i)", &data.id);
250 msg("[ check ] (%s) %s : data.id(%d)", handle->cp_name, "Call Info Call Joined noti", data.id);
251 CALLBACK_CALL(&data.id);
253 else if (!g_strcmp0(sig, "CallSoundPath")) {
254 TelCallSoundPathNoti_t data;
255 g_variant_get(param, "(i)", &data.path);
256 msg("[ check ] (%s) %s : path(%d)", handle->cp_name, "Call Sound Path noti", data.path);
257 CALLBACK_CALL(&data);
259 else if (!g_strcmp0(sig, "CallSoundRingbackTone")) {
260 TelCallSoundRingbackToneNoti_t status;
261 g_variant_get(param, "(i)", &status);
262 msg("[ check ] (%s) %s : status(%d)", handle->cp_name, "Call Sound Ringbacktone noti", status);
263 CALLBACK_CALL(&status);
265 else if (!g_strcmp0(sig, "CallSoundWbamr")) {
266 TelCallSoundWbamrNoti_t status;
267 g_variant_get(param, "(i)", &status);
268 msg("[ check ] (%s) %s : status(%d)", handle->cp_name, "Call Sound Wbamr noti", status);
269 CALLBACK_CALL(&status);
271 else if (!g_strcmp0(sig, "CallSoundNoiseReduction")) {
272 TelCallSoundNoiseReductionNoti_t data;
273 g_variant_get(param, "(i)", &data.status);
274 msg("[ check ] (%s) %s : status(%d)", handle->cp_name, "Call Sound Noise Reduction noti", data.status);
275 CALLBACK_CALL(&data);
277 else if (!g_strcmp0(sig, "CallSoundClockStatus")) {
279 g_variant_get(param, "(b)", &data);
280 msg("[ check ] (%s) %s : status(%d)", handle->cp_name, "Call Sound Clock Status noti", data);
281 CALLBACK_CALL(&data);
283 else if (!g_strcmp0(sig, "CallPreferredVoiceSubscription")) {
284 TelCallPreferredVoiceSubsNoti_t data;
285 g_variant_get(param, "(i)", &data.preferred_subs);
286 dbg("[ check ] %s : Voice preferred_subs(%d)", "Call Preferred Voice Subscription noti", data.preferred_subs);
287 CALLBACK_CALL(&data);
290 dbg("not handled Call noti[%s]", sig);
294 static void _process_sat_event(const gchar *sig, GVariant *param,
295 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
297 TAPI_RETURN_IF_FAIL(evt_cb_data);
299 if (!g_strcmp0(sig, "SetupMenu")) {
300 TelSatSetupMenuInfo_t setup_menu;
303 gint command_id, item_cnt;
304 gboolean b_present, b_helpinfo, b_updated;
305 GVariant *items = NULL;
307 #if defined(TIZEN_SUPPORT_SAT_ICON)
308 GVariant *icon_id = NULL;
309 GVariant *icon_list = NULL;
310 int sat_index = 0, icon_index = 0;
311 GVariantIter *iter, *iter2;
312 GVariant *unbox = NULL;
313 /* Used to get icon data */
315 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
316 gchar *icon_data = NULL;
317 /* Used to get icon list data */
318 GVariant *unbox_list, *unbox_list_info ;
319 GVariant *icon_list_info;
320 gboolean is_list_exist;
321 gint icon_list_quali, list_cnt, icon_list_identifier, list_width, list_height, list_ics, icon_list_data_len;
322 gchar *icon_list_data = NULL;
328 memset(&setup_menu, 0, sizeof(TelSatSetupMenuInfo_t));
330 #if defined(TIZEN_SUPPORT_SAT_ICON)
331 g_variant_get(param, "(ibs@vibb@v@v)", &command_id, &b_present, &title, &items, &item_cnt,
332 &b_helpinfo, &b_updated, &icon_id, &icon_list);
334 g_variant_get(param, "(ibs@vibb)", &command_id, &b_present, &title, &items, &item_cnt,
335 &b_helpinfo, &b_updated);
338 setup_menu.commandId = command_id;
339 setup_menu.bIsMainMenuPresent = (b_present ? 1 : 0);
340 memcpy(setup_menu.satMainTitle, title, TAPI_SAT_DEF_TITLE_LEN_MAX+1);
342 setup_menu.satMainMenuNum = item_cnt;
343 if(items && item_cnt > 0){
346 unbox = g_variant_get_variant(items);
347 dbg("items(%p) items type_format(%s)", items, g_variant_get_type_string(unbox));
349 g_variant_get(unbox, "a(si)", &iter);
350 while(g_variant_iter_loop(iter,"(si)",&item_str, &item_id)){
351 setup_menu.satMainMenuItem[sat_index].itemId = item_id;
352 memcpy(setup_menu.satMainMenuItem[sat_index].itemString, item_str, TAPI_SAT_DEF_ITEM_STR_LEN_MAX + 6);
353 dbg("item index(%d) id(%d) str(%s)",sat_index, setup_menu.satMainMenuItem[sat_index].itemId, setup_menu.satMainMenuItem[sat_index].itemString);
354 //dbg("item index(%d) id(%d) str(%s)",index, item_id, item_str);
357 g_variant_iter_free(iter);
359 setup_menu.bIsSatMainMenuHelpInfo = (b_helpinfo ? 1 : 0);
360 setup_menu.bIsUpdatedSatMainMenu = (b_updated ? 1 : 0);
362 #if defined(TIZEN_SUPPORT_SAT_ICON)
364 unbox = g_variant_get_variant(icon_id);
365 g_variant_get(unbox, "a(biiiiiis)", &iter);
367 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)){
370 setup_menu.iconId.bIsPresent = is_exist;
371 setup_menu.iconId.iconQualifier = icon_quali;
372 setup_menu.iconId.iconIdentifier = icon_identifier;
373 setup_menu.iconId.iconInfo.width = width;
374 setup_menu.iconId.iconInfo.height = height;
375 setup_menu.iconId.iconInfo.ics = ics;
376 if(icon_data_len > 0) {
377 setup_menu.iconId.iconInfo.iconDataLen = icon_data_len;
378 memcpy(setup_menu.iconId.iconInfo.iconFile, icon_data, icon_data_len);
380 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,
381 setup_menu.iconId.iconInfo.height, setup_menu.iconId.iconInfo.ics, setup_menu.iconId.iconInfo.iconDataLen);
383 g_variant_iter_free(iter);
387 unbox_list = g_variant_get_variant(icon_list);
388 g_variant_get(unbox_list, "a(biiv)", &iter);
390 while(g_variant_iter_loop(iter,"(biiv)", &is_list_exist, &icon_list_quali, &list_cnt, &icon_list_info)){
393 setup_menu.iconIdList.bIsPresent = is_list_exist;
394 setup_menu.iconIdList.iconListQualifier = icon_list_quali;
395 setup_menu.iconIdList.iconCount = list_cnt;
397 unbox_list_info = g_variant_get_variant(icon_list_info);
398 g_variant_get(unbox_list_info, "a(iiiiis)", &iter2);
400 while(g_variant_iter_loop(iter2,"(iiiiis)",&icon_list_identifier, &list_width, &list_height, &list_ics, &icon_list_data_len, &icon_list_data)){
401 setup_menu.iconIdList.iconIdentifierList[icon_index]= icon_identifier;
402 setup_menu.iconIdList.iconInfo[icon_index].width = list_width;
403 setup_menu.iconIdList.iconInfo[icon_index].height = list_height;
404 setup_menu.iconIdList.iconInfo[icon_index].ics = list_ics;
405 if(icon_list_data_len > 0) {
406 setup_menu.iconIdList.iconInfo[icon_index].iconDataLen = icon_list_data_len;
407 memcpy(setup_menu.iconIdList.iconInfo[icon_index].iconFile, icon_list_data, icon_list_data_len);
411 g_variant_iter_free(iter2);
413 g_variant_iter_free(iter);
416 dbg("command id (%d)", setup_menu.commandId);
417 dbg("menu present (%d)", setup_menu.bIsMainMenuPresent);
418 dbg("menu title (%s)", setup_menu.satMainTitle);
419 dbg("item cnt (%d)", setup_menu.satMainMenuNum);
420 dbg("menu help info (%d)", setup_menu.bIsSatMainMenuHelpInfo);
421 dbg("menu updated (%d)", setup_menu.bIsUpdatedSatMainMenu);
423 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,
424 setup_menu.iconId.iconInfo.height, setup_menu.iconId.iconInfo.ics, setup_menu.iconId.iconInfo.iconDataLen);
426 CALLBACK_CALL(&setup_menu);
428 else if (!g_strcmp0(sig, "DisplayText")) {
429 TelSatDisplayTextInd_t display_text;
431 gint command_id, text_len, duration;
432 gboolean high_priority, user_rsp_required, immediately_rsp;
434 #if defined(TIZEN_SUPPORT_SAT_ICON)
435 GVariant *unbox = NULL;
437 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
438 gchar *icon_data = NULL;
439 GVariant *icon_id = NULL;
442 memset(&display_text, 0, sizeof(TelSatDisplayTextInd_t));
444 #if defined(TIZEN_SUPPORT_SAT_ICON)
445 g_variant_get(param, "(isiibbb@v)", &command_id, &text, &text_len, &duration,
446 &high_priority, &user_rsp_required, &immediately_rsp, &icon_id);
448 g_variant_get(param, "(isiibbb)", &command_id, &text, &text_len, &duration,
449 &high_priority, &user_rsp_required, &immediately_rsp);
451 display_text.commandId = command_id;
452 memcpy(display_text.text.string, text, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
454 display_text.text.stringLen = text_len;
455 display_text.duration = duration;
456 display_text.bIsPriorityHigh = (high_priority ? 1 : 0);
457 display_text.bIsUserRespRequired = (user_rsp_required ? 1 : 0);
458 display_text.b_immediately_resp = (immediately_rsp ? 1 : 0);
460 #if defined(TIZEN_SUPPORT_SAT_ICON)
462 unbox = g_variant_get_variant(icon_id);
463 g_variant_get(unbox, "a(biiiiiis)", &iter);
465 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
468 display_text.iconId.bIsPresent = is_exist;
469 display_text.iconId.iconQualifier = icon_quali;
470 display_text.iconId.iconIdentifier = icon_identifier;
471 display_text.iconId.iconInfo.width = width;
472 display_text.iconId.iconInfo.height = height;
473 display_text.iconId.iconInfo.ics = ics;
474 if(icon_data_len > 0) {
475 display_text.iconId.iconInfo.iconDataLen = icon_data_len;
476 memcpy(display_text.iconId.iconInfo.iconFile, icon_data, icon_data_len);
478 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,
479 display_text.iconId.iconInfo.height, display_text.iconId.iconInfo.ics, display_text.iconId.iconInfo.iconDataLen);
481 g_variant_iter_free(iter);
484 dbg("command id (%d)", display_text.commandId);
485 dbg("display text (%s)", display_text.text.string);
486 dbg("string len(%d)", display_text.text.stringLen);
487 dbg("duration (%d)", display_text.duration);
488 dbg("high priority (%d)", display_text.bIsPriorityHigh);
489 dbg("user response required(%d)", display_text.bIsUserRespRequired);
490 dbg("immediately response (%d)", display_text.b_immediately_resp);
492 CALLBACK_CALL(&display_text);
494 else if (!g_strcmp0(sig, "SelectItem")) {
495 TelSatSelectItemInd_t select_item;
498 gchar *selected_text;
499 gint command_id, default_item_id, menu_cnt, text_len =0;
500 GVariant *menu_items;
501 #if defined(TIZEN_SUPPORT_SAT_ICON)
502 GVariantIter *iter, *iter2;
503 GVariant *unbox = NULL;
505 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
506 gchar *icon_data = NULL;
507 GVariant *icon_id = NULL;
508 GVariant *icon_list = NULL;
509 int select_item_index = 0, icon_index = 0;
510 /* Used to get icon list data */
511 GVariant *unbox_list, *unbox_list_info ;
512 GVariant *icon_list_info;
513 gboolean is_list_exist;
514 gint icon_list_quali, list_cnt, icon_list_identifier, list_width, list_height, list_ics, icon_list_data_len;
515 gchar *icon_list_data = NULL;
517 int select_item_index = 0;
521 memset(&select_item, 0, sizeof(TelSatSelectItemInd_t));
523 #if defined(TIZEN_SUPPORT_SAT_ICON)
524 g_variant_get(param, "(ibsiii@v@v@v)", &command_id, &help_info, &selected_text,
525 &text_len, &default_item_id, &menu_cnt, &menu_items, &icon_id, &icon_list);
527 g_variant_get(param, "(ibsiii@v)", &command_id, &help_info, &selected_text,
528 &text_len, &default_item_id, &menu_cnt, &menu_items);
530 select_item.commandId = command_id;
531 select_item.bIsHelpInfoAvailable = (help_info ? 1 : 0);
532 memcpy(select_item.text.string, selected_text, TAPI_SAT_DEF_TITLE_LEN_MAX+1);
533 g_free(selected_text);
534 select_item.text.stringLen = text_len;
535 select_item.defaultItemIndex = default_item_id;
536 select_item.menuItemCount = menu_cnt;
537 if(menu_items && menu_cnt > 0){
539 gint item_id, item_len;
540 unbox = g_variant_get_variant(menu_items);
541 dbg("items(%p) items type_format(%s)", menu_items, g_variant_get_type_string(unbox));
543 g_variant_get(unbox, "a(iis)", &iter);
544 while(g_variant_iter_loop(iter,"(iis)",&item_id, &item_len, &item_str)){
545 select_item.menuItem[select_item_index].itemId = item_id;
546 select_item.menuItem[select_item_index].textLen = item_len;
547 memcpy(select_item.menuItem[select_item_index].text, item_str, TAPI_SAT_ITEM_TEXT_LEN_MAX + 1);
548 dbg("item index(%d) id(%d) len(%d) str(%s)", select_item_index,
549 select_item.menuItem[select_item_index].itemId, select_item.menuItem[select_item_index].textLen, select_item.menuItem[select_item_index].text);
552 g_variant_iter_free(iter);
555 #if defined(TIZEN_SUPPORT_SAT_ICON)
557 unbox = g_variant_get_variant(icon_id);
558 g_variant_get(unbox, "a(biiiiiis)", &iter);
560 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
563 select_item.iconId.bIsPresent = is_exist;
564 select_item.iconId.iconQualifier = icon_quali;
565 select_item.iconId.iconIdentifier = icon_identifier;
566 select_item.iconId.iconInfo.width = width;
567 select_item.iconId.iconInfo.height = height;
568 select_item.iconId.iconInfo.ics = ics;
569 if(icon_data_len > 0) {
570 select_item.iconId.iconInfo.iconDataLen = icon_data_len;
571 memcpy(select_item.iconId.iconInfo.iconFile, icon_data, icon_data_len);
573 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,
574 select_item.iconId.iconInfo.height, select_item.iconId.iconInfo.ics, select_item.iconId.iconInfo.iconDataLen);
576 g_variant_iter_free(iter);
580 unbox_list = g_variant_get_variant(icon_list);
581 g_variant_get(unbox_list, "a(biiv)", &iter);
583 while(g_variant_iter_loop(iter,"(biiv)", &is_list_exist, &icon_list_quali, &list_cnt, &icon_list_info)) {
586 select_item.iconIdList.bIsPresent = is_list_exist;
587 select_item.iconIdList.iconListQualifier = icon_list_quali;
588 select_item.iconIdList.iconCount = list_cnt;
590 unbox_list_info = g_variant_get_variant(icon_list_info);
591 g_variant_get(unbox_list_info, "a(iiiiis)", &iter2);
593 while(g_variant_iter_loop(iter2,"(iiiiis)",&icon_list_identifier, &list_width, &list_height, &list_ics, &icon_list_data_len, &icon_list_data)){
594 select_item.iconIdList.iconIdentifierList[icon_index]= icon_identifier;
595 select_item.iconIdList.iconInfo[icon_index].width = list_width;
596 select_item.iconIdList.iconInfo[icon_index].height = list_height;
597 select_item.iconIdList.iconInfo[icon_index].ics = list_ics;
598 if(icon_list_data_len > 0) {
599 select_item.iconIdList.iconInfo[icon_index].iconDataLen = icon_list_data_len;
600 memcpy(select_item.iconIdList.iconInfo[icon_index].iconFile, icon_list_data, icon_list_data_len);
604 g_variant_iter_free(iter2);
606 g_variant_iter_free(iter);
609 dbg("command id (%d)", select_item.commandId);
610 dbg("help info(%d)", select_item.bIsHelpInfoAvailable);
611 dbg("selected item string(%s)", select_item.text.string);
612 dbg("string len(%d)", select_item.text.stringLen);
613 dbg("default item index(%d)", select_item.defaultItemIndex);
614 dbg("item count(%d)", select_item.menuItemCount);
616 CALLBACK_CALL(&select_item);
618 else if (!g_strcmp0(sig, "GetInkey")) {
619 TelSatGetInkeyInd_t get_inkey;
621 gint command_id, key_type, input_character_mode;
622 gint text_len, duration;
623 gboolean b_numeric, b_help_info;
625 #if defined(TIZEN_SUPPORT_SAT_ICON)
626 GVariant *unbox = NULL;
628 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
629 gchar *icon_data = NULL;
630 GVariant *icon_id = NULL;
633 memset(&get_inkey, 0, sizeof(TelSatGetInkeyInd_t));
635 #if defined(TIZEN_SUPPORT_SAT_ICON)
636 g_variant_get(param, "(iiibbsii@v)", &command_id, &key_type, &input_character_mode,
637 &b_numeric,&b_help_info, &text, &text_len, &duration, &icon_id);
639 g_variant_get(param, "(iiibbsii)", &command_id, &key_type, &input_character_mode,
640 &b_numeric,&b_help_info, &text, &text_len, &duration);
642 get_inkey.commandId = command_id;
643 get_inkey.keyType = key_type;
644 get_inkey.inputCharMode = input_character_mode;
645 get_inkey.bIsNumeric = (b_numeric ? 1 : 0);
646 get_inkey.bIsHelpInfoAvailable = (b_help_info ? 1 : 0);
647 memcpy(get_inkey.text.string, text, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
649 get_inkey.text.stringLen = text_len;
650 get_inkey.duration = duration;
652 #if defined(TIZEN_SUPPORT_SAT_ICON)
654 unbox = g_variant_get_variant(icon_id);
655 g_variant_get(unbox, "a(biiiiiis)", &iter);
657 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
660 get_inkey.iconId.bIsPresent = is_exist;
661 get_inkey.iconId.iconQualifier = icon_quali;
662 get_inkey.iconId.iconIdentifier = icon_identifier;
663 get_inkey.iconId.iconInfo.width = width;
664 get_inkey.iconId.iconInfo.height = height;
665 get_inkey.iconId.iconInfo.ics = ics;
666 if(icon_data_len > 0) {
667 get_inkey.iconId.iconInfo.iconDataLen = icon_data_len;
668 memcpy(get_inkey.iconId.iconInfo.iconFile, icon_data, icon_data_len);
670 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,
671 get_inkey.iconId.iconInfo.height, get_inkey.iconId.iconInfo.ics, get_inkey.iconId.iconInfo.iconDataLen);
673 g_variant_iter_free(iter);
676 dbg("command id(%d)", get_inkey.commandId);
677 dbg("key type(%d)", get_inkey.keyType);
678 dbg("input character mode(%d)", get_inkey.inputCharMode);
679 dbg("numeric(%d)", get_inkey.bIsNumeric);
680 dbg("help info available(%d)", get_inkey.bIsHelpInfoAvailable);
681 dbg("text (%s)", get_inkey.text.string);
682 dbg("text length", get_inkey.text.stringLen);
683 dbg("duration", get_inkey.duration);
685 CALLBACK_CALL(&get_inkey);
687 else if (!g_strcmp0(sig, "GetInput")) {
688 TelSatGetInputInd_t get_input;
690 gint command_id, input_character_mode;
691 gint text_len, def_text_len, rsp_len_min, rsp_len_max;
692 gboolean b_numeric, b_help_info, b_echo_input;
693 gchar *text = NULL, *def_text = NULL;
694 #if defined(TIZEN_SUPPORT_SAT_ICON)
695 GVariant *unbox = NULL;
697 gint icon_quali, icon_identifier, width, height, ics, icon_data_len;
698 gchar *icon_data = NULL;
699 GVariant *icon_id = NULL;
702 memset(&get_input, 0, sizeof(TelSatGetInputInd_t));
704 #if defined(TIZEN_SUPPORT_SAT_ICON)
705 g_variant_get(param, "(iibbbsiiisi@v)", &command_id, &input_character_mode, &b_numeric, &b_help_info, &b_echo_input,
706 &text, &text_len, &rsp_len_max, &rsp_len_min, &def_text, &def_text_len, &icon_id);
708 g_variant_get(param, "(iibbbsiiisi)", &command_id, &input_character_mode, &b_numeric, &b_help_info, &b_echo_input,
709 &text, &text_len, &rsp_len_max, &rsp_len_min, &def_text, &def_text_len);
711 get_input.commandId = command_id;
712 get_input.inputCharMode = input_character_mode;
713 get_input.bIsNumeric = (b_numeric ? 1 : 0);
714 get_input.bIsHelpInfoAvailable = (b_help_info ? 1 : 0);
715 get_input.bIsEchoInput = (b_echo_input ? 1 : 0);
716 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);
723 get_input.defaultText.stringLen = def_text_len;
725 #if defined(TIZEN_SUPPORT_SAT_ICON)
727 unbox = g_variant_get_variant(icon_id);
728 g_variant_get(unbox, "a(biiiiiis)", &iter);
730 while(g_variant_iter_loop(iter,"(biiiiiis)", &is_exist, &icon_quali, &icon_identifier, &width, &height, &ics, &icon_data_len, &icon_data)) {
733 get_input.iconId.bIsPresent = is_exist;
734 get_input.iconId.iconQualifier = icon_quali;
735 get_input.iconId.iconIdentifier = icon_identifier;
736 get_input.iconId.iconInfo.width = width;
737 get_input.iconId.iconInfo.height = height;
738 get_input.iconId.iconInfo.ics = ics;
739 if(icon_data_len > 0) {
740 get_input.iconId.iconInfo.iconDataLen = icon_data_len;
741 memcpy(get_input.iconId.iconInfo.iconFile, icon_data, icon_data_len);
743 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,
744 get_input.iconId.iconInfo.height, get_input.iconId.iconInfo.ics, get_input.iconId.iconInfo.iconDataLen);
746 g_variant_iter_free(iter);
749 dbg("command id(%d)", get_input.commandId);
750 dbg("input character mode(%d)", get_input.inputCharMode);
751 dbg("numeric(%d)", get_input.bIsNumeric);
752 dbg("help info avaiable(%d)", get_input.bIsHelpInfoAvailable);
753 dbg("echo input(%d)", get_input.bIsEchoInput);
754 dbg("text(%s)", get_input.text.string);
755 dbg("text length(%d)", get_input.text.stringLen);
756 dbg("response length max(%d)", get_input.respLen.max);
757 dbg("response length min(%d)", get_input.respLen.min);
758 dbg("default text(%s)", get_input.defaultText.string);
759 dbg("default text length(%d)", get_input.defaultText.stringLen);
761 CALLBACK_CALL(&get_input);
763 else if (!g_strcmp0(sig, "SendSMS")) {
764 TelSatSendSmsIndSmsData_t send_sms;
766 gint command_id, ton, npi, tpdu_type;
767 gboolean b_packing_required;
768 gint text_len, number_len, tpdu_data_len;
769 gchar* text = NULL, *dialling_number = NULL;
772 memset(&send_sms, 0, sizeof(TelSatSendSmsIndSmsData_t));
774 g_variant_get(param, "(isibiisii@vi)", &command_id, &text, &text_len, &b_packing_required, &ton, &npi,
775 &dialling_number, &number_len, &tpdu_type, &tpdu_data, &tpdu_data_len);
777 send_sms.commandId = command_id;
778 send_sms.bIsPackingRequired = (b_packing_required ? 1 : 0);
780 send_sms.address.ton = ton;
781 send_sms.address.npi = npi;
782 send_sms.address.diallingNumberLen = number_len;
783 memcpy(send_sms.address.diallingNumber, dialling_number, TAPI_SAT_DIALLING_NUMBER_LEN_MAX);
784 g_free(dialling_number);
787 send_sms.smsTpdu.tpduType = tpdu_type;
788 send_sms.smsTpdu.dataLen = tpdu_data_len;
791 int send_sms_index = 0;
793 GVariantIter *iter = NULL;
794 GVariant *inner_gv = NULL;
796 inner_gv = g_variant_get_variant(tpdu_data);
797 dbg("tpdu data exist type_format(%s)", g_variant_get_type_string(inner_gv));
799 g_variant_get(inner_gv, "ay", &iter);
800 while( g_variant_iter_loop (iter, "y", &data)){
801 dbg("index(%d) data(%c)", send_sms_index, data);
802 send_sms.smsTpdu.data[send_sms_index] = data;
805 g_variant_iter_free(iter);
806 g_variant_unref(inner_gv);
809 dbg("command id(%d)", send_sms.commandId);
810 dbg("packing required(%d)", send_sms.bIsPackingRequired);
811 dbg("address ton(%d)", send_sms.address.ton);
812 dbg("address npi(%d)", send_sms.address.npi);
813 dbg("address dialing number (%s)", send_sms.address.diallingNumber);
814 dbg("address number length (%d)", send_sms.address.diallingNumberLen);
815 dbg("tpdu type (%d)", send_sms.smsTpdu.tpduType);
816 dbg("tpdu length (%d)", send_sms.smsTpdu.dataLen);
818 CALLBACK_CALL(&send_sms);
820 else if (!g_strcmp0(sig, "SetupEventList")) {
824 TelSatEventListData_t event_list;
826 memset(&event_list, 0, sizeof(TelSatEventListData_t));
828 g_variant_get(param, "(i@v)", &event_cnt, &evt_list);
832 GVariantIter *iter = NULL;
833 GVariant *inner_gv = NULL;
835 inner_gv = g_variant_get_variant(evt_list);
836 dbg("event list exist type_format(%s)", g_variant_get_type_string(inner_gv));
838 g_variant_get(inner_gv, "ai", &iter);
839 while( g_variant_iter_loop (iter, "i", &data)){
840 dbg("g_index(%d) event(%d)", g_index, data);
841 g_event_list[g_index] = data;
843 if(data == TAPI_EVENT_SAT_DW_TYPE_IDLE_SCREEN_AVAILABLE){
844 event_list.bIsIdleScreenAvailable = 1;
846 else if(data == TAPI_EVENT_SAT_DW_TYPE_LANGUAGE_SELECTION){
847 event_list.bIsLanguageSelection = 1;
849 else if(data == TAPI_EVENT_SAT_DW_TYPE_BROWSER_TERMINATION){
850 event_list.bIsBrowserTermination = 1;
852 else if(data == TAPI_EVENT_SAT_DW_TYPE_DATA_AVAILABLE){
853 event_list.bIsDataAvailable = 1;
855 else if(data == TAPI_EVENT_SAT_DW_TYPE_CHANNEL_STATUS){
856 event_list.bIsChannelStatus = 1;
862 g_variant_iter_free(iter);
863 g_variant_unref(inner_gv);
866 dbg("event list cnt(%d)", event_cnt);
868 CALLBACK_CALL(&event_list);
870 else if (!g_strcmp0(sig, "Refresh")) {
871 TelSatRefreshInd_t refresh_info;
874 gint refresh_type =0;
876 GVariant *file_list = NULL;
878 memset(&refresh_info, 0, sizeof(TelSatRefreshInd_t));
880 g_variant_get(param, "(ii@v)", &command_id, &refresh_type, &file_list);
882 refresh_info.commandId = command_id;
883 refresh_info.refreshMode = refresh_type;
888 GVariantIter *iter = NULL;
889 GVariant *inner_gv = NULL;
891 inner_gv = g_variant_get_variant(file_list);
892 dbg("file list exist type_format(%s)", g_variant_get_type_string(inner_gv));
894 g_variant_get(inner_gv, "ai", &iter);
895 while( g_variant_iter_loop (iter, "i", &data)){
896 dbg("g_index(%d) file id(%d)", g_index, data);
897 refresh_info.fileId[g_index] = data;
903 g_variant_iter_free(iter);
904 g_variant_unref(inner_gv);
906 refresh_info.fileCount = file_cnt;
908 dbg("refresh event/file cnt(%d)", refresh_info.fileCount);
910 CALLBACK_CALL(&refresh_info);
912 else if (!g_strcmp0(sig, "SendDtmf")) {
913 TelSatSendDtmfIndDtmfData_t send_dtmf;
916 gint text_len = 0, dtmf_str_len = 0;
918 gchar *dtmf_str = NULL;
920 memset(&send_dtmf, 0, sizeof(TelSatSendDtmfIndDtmfData_t));
922 g_variant_get(param, "(isisi)", &command_id, &text, &text_len, &dtmf_str, &dtmf_str_len);
924 send_dtmf.commandId = command_id;
925 send_dtmf.bIsHiddenMode = 1;
927 send_dtmf.dtmfString.stringLen = dtmf_str_len;
928 memcpy(send_dtmf.dtmfString.string, dtmf_str, TAPI_SAT_DEF_TEXT_STRING_LEN_MAX+1);
932 dbg("dtmf event command id(%d)", send_dtmf.commandId);
933 dbg("dtmf event dtmf(%s)", send_dtmf.dtmfString.string);
935 CALLBACK_CALL(&send_dtmf);
937 else if (!g_strcmp0(sig, "EndProactiveSession")) {
938 int command_type = 0;
940 g_variant_get(param, "(i)", &command_type);
941 dbg("end session evt : command type(%d)", command_type);
942 CALLBACK_CALL(&command_type);
944 else if (!g_strcmp0(sig, "CallControlResult")) {
945 TelSatCallCtrlIndData_t call_ctrl_result_ind;
946 gint call_ctrl_result = 0, disp_len = 0;
947 gint bc_repeat_indicator = 0, ton = 0x0F, npi=0X0F;
948 gchar *text = NULL, *call_num = NULL, *ss_string = NULL, *sub_addr = NULL, *ccp1 = NULL, *ccp2 = NULL;
950 memset(&call_ctrl_result_ind, 0x00, sizeof(TelSatCallCtrlIndData_t));
952 g_variant_get(param, "(isiisssssi)", &call_ctrl_result, &text, &ton, &npi, &call_num,
953 &ss_string, &sub_addr, &ccp1, &ccp2, &bc_repeat_indicator);
955 call_ctrl_result_ind.callCtrlResult = call_ctrl_result;
956 disp_len = strlen(text); //alpha id
958 call_ctrl_result_ind.dispData.stringLen = disp_len;
959 memcpy(&call_ctrl_result_ind.dispData.string, text, disp_len);
960 call_ctrl_result_ind.bIsUserInfoDisplayEnabled = 1;
964 if(strlen(call_num) > 1 && (g_strcmp0(call_num,"") != 0) ){
965 call_ctrl_result_ind.callCtrlCnfType = TAPI_SAT_CALL_TYPE_MO_VOICE;
966 call_ctrl_result_ind.u.callCtrlCnfCallData.address.stringLen = strlen(call_num);
967 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.address.string, call_num, strlen(call_num));
968 call_ctrl_result_ind.u.callCtrlCnfCallData.subAddress.stringLen = strlen(sub_addr);
969 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.subAddress.string, sub_addr, strlen(sub_addr));
970 call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.stringLen = strlen(ccp1);
971 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.string, ccp1, strlen(ccp1));
972 call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.stringLen = strlen(ccp2);
973 memcpy(&call_ctrl_result_ind.u.callCtrlCnfCallData.ccp1.string, ccp2, strlen(ccp2));
974 call_ctrl_result_ind.u.callCtrlCnfCallData.bcRepeatIndicator = bc_repeat_indicator;
976 else if( strlen(ss_string) > 1 && (g_strcmp0(ss_string,"") != 0) ){
977 call_ctrl_result_ind.callCtrlCnfType = TAPI_SAT_CALL_TYPE_SS;
978 call_ctrl_result_ind.u.callCtrlCnfSsData.ssString.stringLen = strlen(ss_string);
979 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.ssString.string, ss_string, strlen(ss_string));
980 call_ctrl_result_ind.u.callCtrlCnfSsData.subAddress.stringLen = strlen(sub_addr);
981 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.subAddress.string, sub_addr, strlen(sub_addr));
982 call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.stringLen = strlen(ccp1);
983 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.string, ccp1, strlen(ccp1));
984 call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.stringLen = strlen(ccp2);
985 memcpy(&call_ctrl_result_ind.u.callCtrlCnfSsData.ccp1.string, ccp2, strlen(ccp2));
986 call_ctrl_result_ind.u.callCtrlCnfSsData.bcRepeatIndicator = bc_repeat_indicator;
989 dbg("not matched call control");
993 CALLBACK_CALL(&call_ctrl_result_ind);
1002 else if (!g_strcmp0(sig, "MoSmControlResult")) {
1003 TelSatMoSmCtrlIndData_t mo_sm_ctrl_result_ind;
1004 gint call_ctrl_result = 0 ,disp_len = 0;
1005 gint rp_dst_ton = 0x0F, rp_dst_npi = 0X0F, tp_dst_ton = 0x0F, tp_dst_npi = 0X0F;
1006 gchar *text = NULL, *rp_dst_call_num = NULL, *tp_dst_call_num = NULL;
1008 memset(&mo_sm_ctrl_result_ind, 0x00, sizeof(TelSatMoSmCtrlIndData_t));
1010 g_variant_get(param, "(isiisiis)", &call_ctrl_result, &text,
1011 &rp_dst_ton, &rp_dst_npi, &rp_dst_call_num, &tp_dst_ton, &tp_dst_npi, &tp_dst_call_num);
1013 mo_sm_ctrl_result_ind.moSmsCtrlResult= call_ctrl_result;
1014 disp_len = strlen(text); //alpha id
1016 mo_sm_ctrl_result_ind.dispData.stringLen = disp_len;
1017 memcpy(&mo_sm_ctrl_result_ind.dispData.string, text, disp_len);
1018 mo_sm_ctrl_result_ind.bIsUserInfoDisplayEnabled = 1;
1021 if(strlen(rp_dst_call_num) > 1 && (g_strcmp0(rp_dst_call_num,"") != 0) ){
1022 mo_sm_ctrl_result_ind.tpDestAddr.bIsDigitOnly = 1;
1023 mo_sm_ctrl_result_ind.rpDestAddr.stringLen = strlen(rp_dst_call_num);
1024 memcpy(&mo_sm_ctrl_result_ind.rpDestAddr.string, rp_dst_call_num, strlen(rp_dst_call_num));
1025 }// rp dst call number exist
1026 else if( strlen(tp_dst_call_num) > 1 && (g_strcmp0(tp_dst_call_num,"") != 0) ){
1027 mo_sm_ctrl_result_ind.tpDestAddr.bIsDigitOnly = 1;
1028 mo_sm_ctrl_result_ind.tpDestAddr.stringLen = strlen(tp_dst_call_num);
1029 memcpy(&mo_sm_ctrl_result_ind.tpDestAddr.string, tp_dst_call_num, strlen(tp_dst_call_num));
1030 }//tp dst call number exist
1032 dbg("Any destination address are not provided, use default one.");
1035 g_free(rp_dst_call_num);
1036 g_free(tp_dst_call_num);
1038 CALLBACK_CALL(&mo_sm_ctrl_result_ind);
1041 dbg("not handled Sat noti[%s]", sig);
1045 static void _process_sim_event(const gchar *sig, GVariant *param,
1046 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1048 TAPI_RETURN_IF_FAIL(evt_cb_data);
1050 if (!g_strcmp0(sig, "Status")) {
1052 g_variant_get(param, "(i)", &status);
1053 CALLBACK_CALL(&status);
1054 } else if (!g_strcmp0(sig, "Refreshed")) {
1056 g_variant_get(param, "(i)", &type);
1057 CALLBACK_CALL(&type);
1059 dbg("not handled SIM noti[%s]",sig );
1063 static void _process_pb_event(const gchar *sig, GVariant *param,
1064 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1066 TAPI_RETURN_IF_FAIL(evt_cb_data);
1068 if (!g_strcmp0(sig, "Status")) {
1069 TelSimPbStatus_t status;
1070 g_variant_get(param, "(ibbbbbb)",
1071 &status.init_completed,
1072 &status.pb_list.b_fdn,
1073 &status.pb_list.b_adn,
1074 &status.pb_list.b_sdn,
1075 &status.pb_list.b_3g,
1076 &status.pb_list.b_aas,
1077 &status.pb_list.b_gas);
1079 msg("(%s) init[%d] fdn[%d] adn[%d] sdn[%d] usim[%d] aas[%d] gas[%d]",
1080 handle->cp_name, 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);
1081 CALLBACK_CALL(&status);
1083 dbg("not handled Phonebook noti[%s]",sig );
1087 static void _process_sap_event(const gchar *sig, GVariant *param,
1088 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1090 TAPI_RETURN_IF_FAIL(evt_cb_data);
1092 if (!g_strcmp0(sig, "Status")) {
1094 g_variant_get(param, "(i)", ¬i);
1095 CALLBACK_CALL(¬i);
1096 } else if (!g_strcmp0(sig, "Disconnect")) {
1098 g_variant_get(param, "(i)", &disconnect);
1099 CALLBACK_CALL(&disconnect);
1101 dbg("not handled SAP noti[%s]",sig );
1105 static void _process_modem_event(const gchar *sig, GVariant *param,
1106 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1108 TAPI_RETURN_IF_FAIL(evt_cb_data);
1110 if (!g_strcmp0(sig, "Power")) {
1113 g_variant_get(param, "(i)", ¬i);
1115 CALLBACK_CALL(¬i);
1118 dbg("not handled Modem noti[%s]", sig);
1124 static void _process_ss_event(const gchar *sig, GVariant *param,
1125 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1127 GVariant *value = 0;
1128 GVariantIter *iter = 0;
1129 GVariantIter *iter_row = 0;
1130 const gchar *key = 0;
1133 TAPI_RETURN_IF_FAIL(evt_cb_data);
1135 if (!g_strcmp0(sig, "NotifyUSSD")) {
1136 TelSsUssdMsgInfo_t noti;
1138 memset(¬i, 0, sizeof(TelSsUssdMsgInfo_t));
1140 g_variant_get(param, "(iiis)", ¬i.Type, ¬i.Dcs, ¬i.Length, &str);
1143 g_strlcpy((char*)noti.szString, str, TAPI_SS_USSD_DATA_SIZE_MAX);
1147 CALLBACK_CALL(¬i);
1149 else if (!g_strcmp0(sig, "NotifySsInfo")) {
1151 memset(¬i, 0, sizeof(TelSsInfo_t));
1153 g_variant_get(param, "(ii)", ¬i.Cause, ¬i.SsType);
1155 CALLBACK_CALL(¬i);
1157 else if (!g_strcmp0(sig, "ReleaseComplete")) {
1158 TelSsRelCompMsgInfo_t noti;
1162 memset ( ¬i, 0, sizeof( TelSsRelCompMsgInfo_t ));
1164 g_variant_get(param, "(i@v)", &len, &msg);
1166 noti.RelCompMsgLen = (unsigned char)len;
1171 GVariantIter *msg_iter = NULL;
1172 GVariant *inner_gv = NULL;
1174 inner_gv = g_variant_get_variant(msg);
1175 msg("[ check ] data exist type_format(%s)", g_variant_get_type_string(inner_gv));
1177 g_variant_get(inner_gv, "ay", &msg_iter);
1178 while( g_variant_iter_loop (msg_iter, "y", &data)){
1179 msg("index(%d) data(%c)", count, data);
1180 noti.szRelCompMsg[count] = data;
1183 g_variant_iter_free(msg_iter);
1184 g_variant_unref(inner_gv);
1187 CALLBACK_CALL(¬i);
1189 } else if ( !g_strcmp0(sig, "NotifyForwarding") ) {
1191 TelSsForwardNoti_t noti;
1192 memset(¬i, 0, sizeof(TelSsForwardNoti_t));
1194 g_variant_get (param, "(aa{sv})", &iter);
1196 noti.record_num = g_variant_iter_n_children(iter);
1198 if (TAPI_SS_RECORD_NUM_MAX < noti.record_num) {
1199 noti.record_num = TAPI_SS_RECORD_NUM_MAX;
1202 while ( g_variant_iter_next(iter, "a{sv}", &iter_row ) && (i < noti.record_num)) {
1203 while ( g_variant_iter_loop( iter_row, "{sv}", &key, &value ) ) {
1205 if ( !g_strcmp0(key, "ss_class") ) {
1206 noti.record[i].Class = g_variant_get_int32(value);
1209 if ( !g_strcmp0(key, "ss_status") ) {
1210 noti.record[i].Status = g_variant_get_int32(value);
1213 if ( !g_strcmp0(key, "forwarding_mode") ) {
1214 noti.record[i].ForwardCondition = g_variant_get_int32(value);
1217 if ( !g_strcmp0(key, "number_present") ) {
1218 noti.record[i].bCallForwardingNumberPresent = g_variant_get_int32(value);
1221 if ( !g_strcmp0(key, "no_reply_time") ) {
1222 noti.record[i].NoReplyWaitTime = g_variant_get_int32(value);
1225 if ( !g_strcmp0(key, "type_of_number") ) {
1226 noti.record[i].Ton = g_variant_get_int32(value);
1229 if ( !g_strcmp0(key, "numbering_plan_identity") ) {
1230 noti.record[i].Npi = g_variant_get_int32(value);
1233 if ( !g_strcmp0(key, "forwarding_number") ) {
1234 strncpy((char *)noti.record[i].szCallForwardingNumber, g_variant_get_string(value, 0), TAPI_CALL_DIALDIGIT_LEN_MAX );
1239 g_variant_iter_free(iter_row);
1241 g_variant_iter_free(iter);
1243 CALLBACK_CALL(¬i);
1245 } else if ( !g_strcmp0(sig, "NotifyWaiting") ) {
1247 TelSsWaitingNoti_t noti;
1248 memset(¬i, '\0', sizeof(TelSsWaitingNoti_t));
1250 g_variant_get (param, "(aa{sv})", &iter);
1252 noti.record_num = g_variant_iter_n_children(iter);
1254 if (TAPI_SS_RECORD_NUM_MAX < noti.record_num) {
1255 noti.record_num = TAPI_SS_RECORD_NUM_MAX;
1258 while ( g_variant_iter_next(iter, "a{sv}", &iter_row ) && (i < noti.record_num)) {
1259 while ( g_variant_iter_loop( iter_row, "{sv}", &key, &value ) ) {
1261 if ( !g_strcmp0(key, "ss_class") ) {
1262 noti.record[i].Class = g_variant_get_int32(value);
1265 if ( !g_strcmp0(key, "ss_status") ) {
1266 noti.record[i].Status = g_variant_get_int32(value);
1270 g_variant_iter_free(iter_row);
1272 g_variant_iter_free(iter);
1274 CALLBACK_CALL(¬i);
1276 } else if ( !g_strcmp0(sig, "NotifyBarring") ) {
1278 TelSsBarringNoti_t noti;
1279 memset(¬i, '\0', sizeof(TelSsBarringNoti_t));
1281 g_variant_get (param, "(aa{sv})", &iter);
1283 noti.record_num = g_variant_iter_n_children(iter);
1285 if (TAPI_SS_RECORD_NUM_MAX < noti.record_num) {
1286 noti.record_num = TAPI_SS_RECORD_NUM_MAX;
1289 while ( g_variant_iter_next(iter, "a{sv}", &iter_row ) ) {
1290 while ( g_variant_iter_loop( iter_row, "{sv}", &key, &value ) && (i < noti.record_num)) {
1292 if ( !g_strcmp0(key, "ss_class") ) {
1293 noti.record[i].Class = g_variant_get_int32(value);
1296 if ( !g_strcmp0(key, "ss_status") ) {
1297 noti.record[i].Status = g_variant_get_int32(value);
1300 if ( !g_strcmp0(key, "barring_mode") ) {
1301 noti.record[i].Flavour = g_variant_get_int32(value);
1306 g_variant_iter_free(iter_row);
1308 g_variant_iter_free(iter);
1310 CALLBACK_CALL(¬i);
1313 dbg("not handled SS noti[%s]", sig);
1319 static void _process_gps_event(const gchar *sig, GVariant *param,
1320 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
1322 gboolean b_decode_data = FALSE;
1323 guchar *decoded_data = NULL;
1325 TAPI_RETURN_IF_FAIL(evt_cb_data);
1327 if (!g_strcmp0(sig, "AssistData")) {
1328 b_decode_data = TRUE;
1330 else if (!g_strcmp0(sig, "MeasurePosition")) {
1331 b_decode_data = TRUE;
1333 else if (!g_strcmp0(sig, "ResetAssistData")) {
1334 /* noting to decode */
1336 else if (!g_strcmp0(sig, "FrequencyAiding")) {
1337 b_decode_data = TRUE;
1340 dbg("not handled Gps noti[%s]", sig);
1347 dbg("[%s] decoding start", sig);
1349 g_variant_get(param, "(s)", &data);
1350 decoded_data = g_base64_decode((const gchar *)data, &length);
1352 CALLBACK_CALL(decoded_data);
1355 dbg("length=%d", length);
1359 g_free(decoded_data);
1362 static void on_prop_callback(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface,
1363 const gchar *sig, GVariant *param, gpointer user_data)
1365 TapiHandle *handle = user_data;
1366 struct tapi_evt_cb *evt_cb_data = NULL;
1367 const gchar *interface_name_for_signal;
1368 GVariant *changed_properties = NULL;
1369 gchar **invalidated_properties = NULL;
1377 TAPI_RETURN_IF_FAIL(handle);
1379 if (!g_variant_is_of_type (param, G_VARIANT_TYPE ("(sa{sv}as)"))) {
1380 err("PropertiesChanged parameter type mismatch ('%s')", g_variant_get_type_string(param));
1384 g_variant_get (param, "(&s@a{sv}^a&s)", &interface_name_for_signal,
1385 &changed_properties, &invalidated_properties);
1387 if (!changed_properties) {
1388 err("Cannot get changed_properties");
1392 g_variant_iter_init (&iter, changed_properties);
1393 while (g_variant_iter_next (&iter, "{sv}", &key, &value)) {
1395 memset(noti_id, 0, 256);
1396 snprintf (noti_id, 255, "%s:%s", interface_name_for_signal, key);
1398 evt_cb_data = g_hash_table_lookup (handle->evt_list, noti_id);
1400 g_variant_unref (value);
1401 g_free((gchar *)key);
1402 /* ignore un-registered property change callback */
1406 if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING )) {
1407 data = g_try_malloc0 (g_variant_get_size (value) + 3);
1409 warn ("g_try_malloc0 failed");
1410 g_variant_unref (value);
1411 g_free((gchar *)key);
1416 memcpy (data + 2, g_variant_get_data (value),
1417 g_variant_get_size (value));
1419 else if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN )) {
1420 data = g_strdup_printf ("b:%d",
1421 *(guchar *) g_variant_get_data (value));
1424 data = g_strdup_printf ("i:%d", *(int *) g_variant_get_data (value));
1427 prev_value = g_hash_table_lookup (handle->cache_property, noti_id);
1429 if (g_strcmp0 (data, prev_value) == 0) {
1431 g_variant_unref (value);
1432 g_free((gchar *)key);
1437 msg("[%s] save prop: [%s] - [%s]", handle->cp_name, noti_id, data);
1438 g_hash_table_replace (handle->cache_property, g_strdup(noti_id), data);
1442 if (data[0] == 's') {
1443 CALLBACK_CALL((void * ) (data + 2));
1446 param_i = atoi (data + 2);
1447 CALLBACK_CALL((void * )¶m_i);
1450 g_variant_unref (value);
1451 g_free((gchar *)key);
1454 if (changed_properties != NULL )
1455 g_variant_unref (changed_properties);
1458 if (invalidated_properties)
1459 g_free (invalidated_properties);
1462 static void on_signal_callback(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface,
1463 const gchar *sig, GVariant *param, gpointer user_data)
1465 TapiHandle *handle = user_data;
1466 struct tapi_evt_cb *evt_cb_data = NULL;
1469 TAPI_RETURN_IF_FAIL(handle);
1471 noti_id = g_strdup_printf("%s:%s", interface, sig);
1473 evt_cb_data = g_hash_table_lookup(handle->evt_list, noti_id);
1475 dbg("can't find noti_id(%s) callback info", noti_id);
1480 if (!g_strcmp0(interface, DBUS_TELEPHONY_SMS_INTERFACE)) {
1481 _process_sms_event(sig, param, handle, noti_id, evt_cb_data);
1483 else if (!g_strcmp0(interface, DBUS_TELEPHONY_CALL_INTERFACE)) {
1484 _process_call_event(sig, param, handle, noti_id, evt_cb_data);
1486 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SAT_INTERFACE)) {
1487 _process_sat_event(sig, param, handle, noti_id, evt_cb_data);
1489 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SIM_INTERFACE)) {
1490 _process_sim_event(sig, param, handle, noti_id, evt_cb_data);
1492 else if (!g_strcmp0(interface, DBUS_TELEPHONY_PB_INTERFACE)) {
1493 _process_pb_event(sig, param, handle, noti_id, evt_cb_data);
1495 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SAP_INTERFACE)) {
1496 _process_sap_event(sig, param, handle, noti_id, evt_cb_data);
1498 else if (!g_strcmp0(interface, DBUS_TELEPHONY_MODEM_INTERFACE)) {
1499 _process_modem_event(sig, param, handle, noti_id, evt_cb_data);
1501 else if (!g_strcmp0(interface, DBUS_TELEPHONY_SS_INTERFACE)) {
1502 _process_ss_event(sig, param, handle, noti_id, evt_cb_data);
1504 else if (!g_strcmp0(interface, DBUS_TELEPHONY_GPS_INTERFACE)) {
1505 _process_gps_event(sig, param, handle, noti_id, evt_cb_data);
1507 else if (!g_strcmp0(interface, DBUS_TELEPHONY_NETWORK_INTERFACE)) {
1508 _process_network_event(sig, param, handle, noti_id, evt_cb_data);
1515 EXPORT_API char** tel_get_cp_name_list(void)
1517 GDBusObjectManager *obj_manager = NULL;
1518 gpointer d_conn = NULL;
1519 GList *objects = NULL;
1520 unsigned int cp_count = 0;
1521 char **cp_list = NULL;
1523 unsigned int index = 0;
1524 GError *error = NULL;
1526 d_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1528 err("Error creating dbus connection: %s\n", error->message);
1529 g_error_free (error);
1533 obj_manager = g_dbus_object_manager_client_new_sync(d_conn,
1534 G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
1535 DBUS_TELEPHONY_SERVICE, /* "org.tizen.telephony" */
1536 DBUS_TELEPHONY_DEFAULT_PATH, /* "/org/tizen/telephony" */
1540 err("Error getting object manager client: %s", error->message);
1541 g_error_free (error);
1542 g_object_unref(d_conn);
1546 objects = g_dbus_object_manager_get_objects(obj_manager);
1547 cp_count = g_list_length(objects);
1549 if (cp_count == 0) {
1550 warn("cp count is 0");
1553 /* This will be freed by caller. +1 for NULL str at the end */
1554 cp_list = g_new0(char*, cp_count + 1);
1555 for (iter = objects, index = 0; iter != NULL; iter = iter->next, index++) {
1556 gpointer *object = iter->data;
1557 const gchar *object_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object));
1559 /* CP list Will be freed up caller */
1560 (cp_list)[index] = g_path_get_basename(object_path);
1561 dbg("CP Name[%d/%d]: [%s]", index, cp_count-1, cp_list[index]);
1566 g_object_unref(d_conn);
1567 g_list_free_full(objects, g_object_unref);
1568 g_object_unref (obj_manager);
1573 static char *get_property (TapiHandle *handle, const char *property,
1574 const GVariantType *type)
1577 GVariant *value = NULL;
1578 GVariant *value_container = NULL;
1579 GError *error = NULL;
1582 dbus_info = g_strsplit (property, ":", 2);
1584 dbg("invalid property");
1588 if (!dbus_info[0] || !dbus_info[1]) {
1589 dbg("invalid property");
1593 value_container = g_dbus_connection_call_sync (handle->dbus_connection,
1594 DBUS_TELEPHONY_SERVICE, handle->path,
1595 "org.freedesktop.DBus.Properties", "Get",
1596 g_variant_new ("(ss)", dbus_info[0], dbus_info[1]),
1597 G_VARIANT_TYPE ("(v)"), G_DBUS_CALL_FLAGS_NONE,
1598 TAPI_DEFAULT_TIMEOUT, handle->ca, &error);
1601 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
1602 warn("Access Denied");
1603 g_error_free(error);
1604 return g_strdup("No access rights");
1606 warn("dbus error = %d (%s)", error->code, error->message);
1607 g_error_free (error);
1611 if (!value_container)
1614 g_variant_get (value_container, "(v)", &value);
1615 g_variant_unref (value_container);
1617 if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING )) {
1618 data = g_try_malloc0 (g_variant_get_size (value));
1620 warn ("calloc failed");
1621 g_variant_unref (value);
1624 memcpy (data, g_variant_get_data (value), g_variant_get_size (value));
1626 else if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN )) {
1627 data = g_strdup_printf ("%d", *(guchar *) g_variant_get_data (value));
1630 data = g_strdup_printf ("%d", *(int *) g_variant_get_data (value));
1632 msg("prop:[%s][%s] - [%s]", handle->cp_name, dbus_info[1], data);
1634 g_variant_unref (value);
1637 g_strfreev (dbus_info);
1642 EXPORT_API int tel_get_property_int (TapiHandle *handle,
1643 const char *property, int *result)
1647 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1648 TAPI_RET_ERR_NUM_IF_FAIL(property, TAPI_API_INVALID_INPUT);
1649 TAPI_RET_ERR_NUM_IF_FAIL(result, TAPI_API_INVALID_INPUT);
1651 data = get_property (handle, property, G_VARIANT_TYPE_INT32);
1653 return TAPI_API_OPERATION_FAILED;
1654 } else if (!g_strcmp0(data, "No access rights")) {
1655 return TAPI_API_ACCESS_DENIED;
1658 *result = atoi(data);
1662 return TAPI_API_SUCCESS;
1665 EXPORT_API int tel_get_property_string(TapiHandle *handle, const char *property, char **result)
1669 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1670 TAPI_RET_ERR_NUM_IF_FAIL(property, TAPI_API_INVALID_INPUT);
1671 TAPI_RET_ERR_NUM_IF_FAIL(result, TAPI_API_INVALID_INPUT);
1673 data = get_property (handle, property, G_VARIANT_TYPE_STRING);
1675 return TAPI_API_OPERATION_FAILED;
1676 } else if (!g_strcmp0(data, "No access rights")) {
1677 return TAPI_API_ACCESS_DENIED;
1682 return TAPI_API_SUCCESS;
1685 EXPORT_API TapiHandle* tel_init(const char *cp_name)
1687 GError *error = NULL;
1688 struct tapi_handle *handle;
1690 #if !GLIB_CHECK_VERSION(2, 35, 0)
1694 handle = g_new0(struct tapi_handle, 1);
1699 handle->dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1700 if (!handle->dbus_connection) {
1701 err("Error creating dbus connection: %s\n", error->message);
1703 g_error_free (error);
1707 msg("tel_init: [%s]:[%s]:[%s]", g_dbus_connection_get_unique_name(
1708 handle->dbus_connection), program_invocation_name, cp_name?cp_name:"Null");
1710 handle->ca = g_cancellable_new();
1713 handle->cp_name = g_strdup(cp_name);
1719 list = tel_get_cp_name_list();
1721 g_cancellable_cancel(handle->ca);
1722 g_object_unref(handle->ca);
1723 g_object_unref(handle->dbus_connection);
1729 g_cancellable_cancel(handle->ca);
1730 g_object_unref(handle->ca);
1731 g_object_unref(handle->dbus_connection);
1737 handle->cp_name = g_strdup(list[0]);
1739 /* Free the list of CP names */
1740 while (list[i] != NULL) {
1747 handle->evt_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1748 handle->cache_property = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1750 handle->path = g_strdup_printf("%s/%s",
1751 DBUS_TELEPHONY_DEFAULT_PATH, handle->cp_name);
1756 static gboolean _unregister_noti(gpointer key, gpointer value, gpointer user_data)
1758 struct tapi_evt_cb *evt_cb_data = value;
1759 TapiHandle *handle = user_data;
1761 g_dbus_connection_signal_unsubscribe(handle->dbus_connection, evt_cb_data->evt_id);
1766 EXPORT_API int tel_deinit(TapiHandle* handle)
1768 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1770 if (handle->cp_name)
1771 g_free(handle->cp_name);
1774 g_free(handle->path);
1776 g_dbus_connection_signal_unsubscribe(handle->dbus_connection, handle->prop_callback_evt_id);
1777 g_hash_table_foreach_remove(handle->evt_list, _unregister_noti, handle);
1778 g_hash_table_destroy(handle->evt_list);
1779 g_hash_table_destroy(handle->cache_property);
1781 g_cancellable_cancel(handle->ca);
1782 g_object_unref(handle->ca);
1784 g_object_unref (handle->dbus_connection);
1786 memset(handle, 0, sizeof(struct tapi_handle));
1789 msg("tel_deinit done");
1791 return TAPI_API_SUCCESS;
1794 EXPORT_API int tel_register_noti_event (TapiHandle *handle, const char *noti_id,
1795 tapi_notification_cb callback, void *user_data)
1797 gchar **dbus_str = NULL;
1798 gpointer tmp = NULL;
1799 struct tapi_evt_cb *evt_cb_data = NULL;
1801 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1802 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_INPUT);
1803 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_INPUT);
1804 TAPI_RET_ERR_NUM_IF_FAIL(noti_id, TAPI_API_INVALID_INPUT);
1806 tmp = g_hash_table_lookup (handle->evt_list, noti_id);
1808 dbg("noti_id(%s) is already registered", noti_id);
1809 return TAPI_API_INVALID_INPUT;
1812 dbus_str = g_strsplit (noti_id, ":", 2);
1814 dbg("invalid noti_id");
1815 return TAPI_API_INVALID_INPUT;
1818 if (!dbus_str[0] || !dbus_str[1]) {
1819 g_strfreev (dbus_str);
1820 dbg("invalid noti_id");
1821 return TAPI_API_INVALID_INPUT;
1824 evt_cb_data = g_new0(struct tapi_evt_cb, 1);
1825 evt_cb_data->cb_fn = callback;
1826 evt_cb_data->user_data = user_data;
1828 dbg("[%s] signal (%s)", handle->cp_name, dbus_str[1]);
1830 if (dbus_str[1][0] >= 'a' && dbus_str[1][0] <= 'z') {
1831 /* Property change callback - only one time */
1832 if (handle->prop_callback_evt_id == 0) {
1833 handle->prop_callback_evt_id = g_dbus_connection_signal_subscribe (
1834 handle->dbus_connection, DBUS_TELEPHONY_SERVICE, /* Sender */
1835 "org.freedesktop.DBus.Properties", /* Interface */
1836 "PropertiesChanged", /* Member */
1837 handle->path, /* Object path */
1839 G_DBUS_SIGNAL_FLAGS_NONE, on_prop_callback, handle, NULL );
1843 /* Signal callback */
1844 evt_cb_data->evt_id = g_dbus_connection_signal_subscribe (
1845 handle->dbus_connection, DBUS_TELEPHONY_SERVICE, /* Sender */
1846 dbus_str[0], /* Interface */
1847 dbus_str[1], /* Member */
1848 handle->path, /* Object path */
1850 G_DBUS_SIGNAL_FLAGS_NONE, on_signal_callback, handle, NULL );
1854 g_hash_table_insert (handle->evt_list, g_strdup (noti_id), evt_cb_data);
1856 g_strfreev (dbus_str);
1858 return TAPI_API_SUCCESS;
1861 EXPORT_API int tel_deregister_noti_event (TapiHandle *handle,
1862 const char *noti_id)
1864 struct tapi_evt_cb *evt_cb_data = NULL;
1865 gboolean rv = FALSE;
1867 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_INPUT);
1868 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_INPUT);
1870 evt_cb_data = g_hash_table_lookup (handle->evt_list, noti_id);
1872 dbg("event does not registered");
1873 return TAPI_API_INVALID_INPUT;
1876 g_dbus_connection_signal_unsubscribe (handle->dbus_connection,
1877 evt_cb_data->evt_id);
1879 rv = g_hash_table_remove (handle->evt_list, noti_id);
1881 dbg("fail to deregister noti event(%s)", noti_id);
1882 return TAPI_API_OPERATION_FAILED;
1885 return TAPI_API_SUCCESS;