From 3867788a0b0448acf5236838ac54f2b971e4ccfa Mon Sep 17 00:00:00 2001 From: HyungKyu Song Date: Sat, 16 Feb 2013 00:00:05 +0900 Subject: [PATCH] Tizen 2.0 Release --- CMakeLists.txt | 25 + LICENSE | 75 + call-engine/core/include/vc-core-callagent.h | 241 ++ .../core/include/vc-core-callmanager.h | 633 +++ call-engine/core/include/vc-core-ccbs.h | 58 + call-engine/core/include/vc-core-ecc.h | 45 + .../core/include/vc-core-engine-group.h | 79 + .../core/include/vc-core-engine-status.h | 252 ++ .../core/include/vc-core-engine-types.h | 592 +++ call-engine/core/include/vc-core-engine.h | 412 ++ call-engine/core/include/vc-core-error.h | 89 + call-engine/core/include/vc-core-svcall.h | 50 + call-engine/core/include/vc-core-tapi-evnt.h | 162 + call-engine/core/include/vc-core-tapi-rqst.h | 194 + call-engine/core/include/vc-core-util.h | 320 ++ call-engine/core/vc-core-callagent.c | 590 +++ call-engine/core/vc-core-callmanager.c | 1912 +++++++++ call-engine/core/vc-core-ccbs.c | 111 + call-engine/core/vc-core-ecc.c | 211 + call-engine/core/vc-core-engine-group.c | 145 + call-engine/core/vc-core-engine-status.c | 730 ++++ call-engine/core/vc-core-engine.c | 3192 ++++++++++++++ call-engine/core/vc-core-svcall.c | 279 ++ call-engine/core/vc-core-tapi-evnt.c | 1331 ++++++ call-engine/core/vc-core-tapi-rqst.c | 1182 ++++++ call-engine/core/vc-core-util.c | 761 ++++ call-engine/etc/rc.d/init.d/voice-calld | 7 + call-engine/etc/rc.d/rc3.d/S60voice-calld | 7 + call-engine/include/voice-call-bt.h | 189 + call-engine/include/voice-call-core.h | 653 +++ call-engine/include/voice-call-device.h | 54 + call-engine/include/voice-call-engine-msg.h | 424 ++ call-engine/include/voice-call-engine.h | 509 +++ call-engine/include/voice-call-service.h | 106 + call-engine/include/voice-call-sound.h | 367 ++ call-engine/sounds/01_Minimal_tone.mp3 | Bin 0 -> 34688 bytes call-engine/sounds/03_Call_connect.wav | Bin 0 -> 47944 bytes call-engine/sounds/04_Call_disconnect.wav | Bin 0 -> 17004 bytes call-engine/sounds/Call_BusyTone.wav | Bin 0 -> 160132 bytes call-engine/sounds/Call_ErrorTone.wav | Bin 0 -> 127492 bytes call-engine/sounds/Call_NwCongestionTone.wav | Bin 0 -> 153752 bytes call-engine/sounds/Call_RecordStart.wav | Bin 0 -> 22768 bytes call-engine/sounds/Call_WaitingTone.wav | Bin 0 -> 78244 bytes call-engine/voice-call-bt.c | 1203 ++++++ call-engine/voice-call-core.c | 3766 +++++++++++++++++ call-engine/voice-call-device.c | 189 + call-engine/voice-call-engine.c | 990 +++++ call-engine/voice-call-service.c | 427 ++ call-engine/voice-call-sound.c | 1504 +++++++ org.tizen.call.manifest | 29 + packaging/org.tizen.call.spec | 85 + ui/CMakeLists.txt | 179 + ui/call_edc/call.edc | 72 + ui/call_edc/vcui-view-button-layout.edc | 98 + ui/call_edc/vcui-view-caller-id.edc | 176 + ui/call_edc/vcui-view-caller-info.edc | 273 ++ ui/call_edc/vcui-view-dialing.edc | 227 + ui/call_edc/vcui-view-end-conf-call.edc | 159 + ui/call_edc/vcui-view-end-single-call.edc | 134 + ui/call_edc/vcui-view-incoming-lock.edc | 356 ++ ui/call_edc/vcui-view-keypad.edc | 367 ++ .../vcui-view-landscape-quick-pannel.edc | 122 + ui/call_edc/vcui-view-multi-call-conf.edc | 341 ++ ui/call_edc/vcui-view-multi-call-list.edc | 92 + ui/call_edc/vcui-view-multi-call-split.edc | 348 ++ ui/call_edc/vcui-view-naviframe.edc | 42 + ui/call_edc/vcui-view-popup.edc | 215 + ui/call_edc/vcui-view-quick-pannel.edc | 133 + ui/call_edc/vcui-view-reject.edc | 72 + ui/call_edc/vcui-view-single-call.edc | 355 ++ ui/call_edc/vcui-view-ug-effect.edc | 99 + ui/default.conf | 3 + ui/images/PUT_IMAGES_HERE | 0 ui/images/hd/ani/vc_income_01.png | Bin 0 -> 31089 bytes ui/images/hd/ani/vc_income_02.png | Bin 0 -> 35239 bytes ui/images/hd/ani/vc_income_03.png | Bin 0 -> 42134 bytes ui/images/hd/ani/vc_income_04.png | Bin 0 -> 51461 bytes ui/images/hd/ani/vc_income_05.png | Bin 0 -> 61037 bytes ui/images/hd/ani/vc_income_06.png | Bin 0 -> 51461 bytes ui/images/hd/ani/vc_income_07.png | Bin 0 -> 42134 bytes ui/images/hd/ani/vc_income_08.png | Bin 0 -> 35239 bytes ui/images/hd/ani/vc_outgoing_01.png | Bin 0 -> 31089 bytes ui/images/hd/ani/vc_outgoing_02.png | Bin 0 -> 36470 bytes ui/images/hd/ani/vc_outgoing_03.png | Bin 0 -> 43499 bytes ui/images/hd/ani/vc_outgoing_04.png | Bin 0 -> 51429 bytes ui/images/hd/ani/vc_outgoing_05.png | Bin 0 -> 60566 bytes ui/images/hd/ani/vc_outgoing_06.png | Bin 0 -> 51429 bytes ui/images/hd/ani/vc_outgoing_07.png | Bin 0 -> 43499 bytes ui/images/hd/ani/vc_outgoing_08.png | Bin 0 -> 36470 bytes ui/images/hd/icon/vc_caller_ID_split.png | Bin 0 -> 16603 bytes .../hd/icon/vc_caller_ID_split_group.png | Bin 0 -> 19547 bytes ui/images/hd/icon/vc_caller_info_icon.png | Bin 0 -> 6004 bytes ui/images/hd/icon/vc_conference_private.png | Bin 0 -> 1621 bytes ui/images/hd/icon/vc_icon_conf_call_end.png | Bin 0 -> 1408 bytes ui/images/hd/icon/vc_icon_hold_call.png | Bin 0 -> 2860 bytes ui/images/hd/icon/vc_icon_swap_call.png | Bin 0 -> 2918 bytes ui/images/hd/icon/vc_icon_unhold_call.png | Bin 0 -> 3319 bytes ui/images/hd/icon/vc_more_add_call.png | Bin 0 -> 3008 bytes ui/images/hd/icon/vc_more_contacts.png | Bin 0 -> 3371 bytes ui/images/hd/icon/vc_more_join.png | Bin 0 -> 3415 bytes ui/images/hd/icon/vc_more_manage_conf.png | Bin 0 -> 836 bytes ui/images/hd/icon/vc_normal_caller_ID.png | Bin 0 -> 47503 bytes .../hd/icon/vc_normal_caller_ID_group.png | Bin 0 -> 11808 bytes ui/images/hd/icon/vc_notify_missed_call.png | Bin 0 -> 4343 bytes .../hd/icon/vc_notify_sub_missed_call.png | Bin 0 -> 4642 bytes ui/images/hd/icon/vc_qp_caller_ID.png | Bin 0 -> 5874 bytes ui/images/hd/icon/vc_qp_caller_ID_group.png | Bin 0 -> 7290 bytes ui/images/hd/icon/vc_qp_mute_on.png | Bin 0 -> 3710 bytes ui/images/hd/icon/vc_reject_create_icon.png | Bin 0 -> 3064 bytes ui/images/hd/icon/vc_volume_icon.png | Bin 0 -> 3584 bytes ui/images/hd/icon/vc_volume_mute_icon.png | Bin 0 -> 3379 bytes ui/images/hd/vc_alerts_arrow_01.png | Bin 0 -> 3435 bytes ui/images/hd/vc_alerts_arrow_02.png | Bin 0 -> 3662 bytes ui/images/hd/vc_call_ID_thumbnail_bg.png | Bin 0 -> 4421 bytes ui/images/hd/vc_call_button_bg.png | Bin 0 -> 25547 bytes ui/images/hd/vc_caller_info_bg.png | Bin 0 -> 3823 bytes ui/images/hd/vc_caller_info_end_bg.png | Bin 0 -> 3657 bytes ui/images/hd/vc_calling_cid_BG.png | Bin 0 -> 4163 bytes ui/images/hd/vc_calling_no_cid_bg.png | Bin 0 -> 9104 bytes ui/images/hd/vc_default_caller_ID_720x720.png | Bin 0 -> 34577 bytes ui/images/hd/vc_keypad_btn_icon.png | Bin 0 -> 3631 bytes ui/images/hd/vc_keypad_btn_normal.png | Bin 0 -> 16343 bytes ui/images/hd/vc_keypad_btn_press.png | Bin 0 -> 4578 bytes .../hd/vc_lock_reject_message_arrow_close.png | Bin 0 -> 3715 bytes .../hd/vc_lock_reject_message_arrow_open.png | Bin 0 -> 3536 bytes ui/images/hd/vc_lock_reject_message_bg.png | Bin 0 -> 3453 bytes ui/images/hd/vc_no_caller_ID.png | Bin 0 -> 69772 bytes ui/images/hd/vc_reject_msg_icon.png | Bin 0 -> 6355 bytes ui/org.tizen.call.png | Bin 0 -> 8071 bytes ui/org.tizen.call.xml | 66 + ui/po/CMakeLists.txt | 28 + ui/po/ar.po | 402 ++ ui/po/az.po | 402 ++ ui/po/bg.po | 402 ++ ui/po/ca.po | 402 ++ ui/po/cs.po | 402 ++ ui/po/da.po | 402 ++ ui/po/de_DE.po | 402 ++ ui/po/el_GR.po | 402 ++ ui/po/en.po | 402 ++ ui/po/en_PH.po | 402 ++ ui/po/en_US.po | 402 ++ ui/po/es_ES.po | 402 ++ ui/po/es_MX.po | 408 ++ ui/po/et.po | 402 ++ ui/po/eu.po | 402 ++ ui/po/fi.po | 402 ++ ui/po/fr_CA.po | 402 ++ ui/po/fr_FR.po | 402 ++ ui/po/ga.po | 402 ++ ui/po/gl.po | 402 ++ ui/po/hi.po | 402 ++ ui/po/hr.po | 402 ++ ui/po/hu.po | 402 ++ ui/po/hy.po | 402 ++ ui/po/is.po | 402 ++ ui/po/it_IT.po | 402 ++ ui/po/ja_JP.po | 402 ++ ui/po/ka.po | 402 ++ ui/po/kk.po | 402 ++ ui/po/ko_KR.po | 402 ++ ui/po/lt.po | 402 ++ ui/po/lv.po | 402 ++ ui/po/mk.po | 402 ++ ui/po/nb.po | 402 ++ ui/po/nl_NL.po | 402 ++ ui/po/pl.po | 402 ++ ui/po/pt_BR.po | 402 ++ ui/po/pt_PT.po | 402 ++ ui/po/ro.po | 402 ++ ui/po/ru_RU.po | 402 ++ ui/po/sk.po | 402 ++ ui/po/sl.po | 402 ++ ui/po/sr.po | 402 ++ ui/po/sv.po | 402 ++ ui/po/tr_TR.po | 402 ++ ui/po/uk.po | 402 ++ ui/po/uz.po | 402 ++ ui/po/zh_CN.po | 402 ++ ui/po/zh_HK.po | 402 ++ ui/po/zh_SG.po | 402 ++ ui/po/zh_TW.po | 402 ++ ui/src/include/vcui-app-data.h | 235 + ui/src/include/vcui-app-window.h | 27 + ui/src/include/vcui-application.h | 349 ++ ui/src/include/vcui-doc-launch.h | 58 + ui/src/include/vcui-document.h | 457 ++ ui/src/include/vcui-view-callend.h | 29 + ui/src/include/vcui-view-choice.h | 28 + ui/src/include/vcui-view-common.h | 72 + ui/src/include/vcui-view-dialing.h | 30 + ui/src/include/vcui-view-elements.h | 74 + ui/src/include/vcui-view-incoming-lock.h | 27 + ui/src/include/vcui-view-keypad.h | 42 + ui/src/include/vcui-view-layout-hd.h | 1780 ++++++++ ui/src/include/vcui-view-multi-call-conf.h | 33 + ui/src/include/vcui-view-multi-call-list.h | 28 + ui/src/include/vcui-view-multi-call-split.h | 32 + ui/src/include/vcui-view-popup.h | 55 + ui/src/include/vcui-view-quickpanel.h | 27 + ui/src/include/vcui-view-single-call.h | 31 + ui/src/vcui-app-window.c | 372 ++ ui/src/vcui-application.c | 2651 ++++++++++++ ui/src/vcui-doc-launch.c | 553 +++ ui/src/vcui-document.c | 948 +++++ ui/src/vcui-view-callend.c | 400 ++ ui/src/vcui-view-choice.c | 224 + ui/src/vcui-view-common.c | 427 ++ ui/src/vcui-view-dialing.c | 378 ++ ui/src/vcui-view-elements.c | 1624 +++++++ ui/src/vcui-view-incoming-lock.c | 1188 ++++++ ui/src/vcui-view-keypad.c | 344 ++ ui/src/vcui-view-multi-call-conf.c | 426 ++ ui/src/vcui-view-multi-call-list.c | 515 +++ ui/src/vcui-view-multi-call-split.c | 445 ++ ui/src/vcui-view-popup.c | 1466 +++++++ ui/src/vcui-view-quickpanel.c | 469 ++ ui/src/vcui-view-single-call.c | 451 ++ ui/themes/bg/vc_button_callend_press.png | Bin 0 -> 2959 bytes .../bg/vc_button_conflist_hold_normal.png | Bin 0 -> 3447 bytes .../bg/vc_button_conflist_hold_press.png | Bin 0 -> 3764 bytes ui/themes/bg/vc_button_end_press.png | Bin 0 -> 3657 bytes ui/themes/bg/vc_button_hold_swap_normal.png | Bin 0 -> 1176 bytes ui/themes/bg/vc_button_hold_swap_press.png | Bin 0 -> 1331 bytes ui/themes/bg/vc_button_qp_end_normal.png | Bin 0 -> 3191 bytes ui/themes/bg/vc_button_qp_end_press.png | Bin 0 -> 3176 bytes ui/themes/bg/vc_button_qp_normal.png | Bin 0 -> 3092 bytes ui/themes/bg/vc_button_qp_press.png | Bin 0 -> 3150 bytes ui/themes/bg/vc_conf_button_bigend_call.png | Bin 0 -> 2853 bytes .../bg/vc_conf_button_bigend_call_press.png | Bin 0 -> 1105 bytes ui/themes/bg/vc_conf_end_normal.png | Bin 0 -> 1246 bytes ui/themes/bg/vc_conf_end_press.png | Bin 0 -> 1276 bytes ui/themes/bg/vc_conf_split_normal.png | Bin 0 -> 1143 bytes ui/themes/bg/vc_conf_split_press.png | Bin 0 -> 1277 bytes ui/themes/bg/vc_contact_btn.png | Bin 0 -> 3823 bytes ui/themes/bg/vc_contact_btn_press.png | Bin 0 -> 3105 bytes ui/themes/bg/vc_more_button_normal.png | Bin 0 -> 3106 bytes ui/themes/bg/vc_more_button_press.png | Bin 0 -> 3102 bytes ui/themes/bg/vc_six_button_press.png | Bin 0 -> 3944 bytes ui/themes/call_theme.edc | 3745 ++++++++++++++++ ui/themes/icon/vc_add_icon.png | Bin 0 -> 3104 bytes ui/themes/icon/vc_add_icon_dim.png | Bin 0 -> 3115 bytes ui/themes/icon/vc_add_icon_press.png | Bin 0 -> 3006 bytes ui/themes/icon/vc_contacts_icon.png | Bin 0 -> 3992 bytes ui/themes/icon/vc_contacts_icon_dim.png | Bin 0 -> 3957 bytes ui/themes/icon/vc_contacts_icon_press.png | Bin 0 -> 3390 bytes ui/themes/icon/vc_end_call_icon.png | Bin 0 -> 24171 bytes ui/themes/icon/vc_end_call_icon_dim.png | Bin 0 -> 3702 bytes ui/themes/icon/vc_end_call_icon_press.png | Bin 0 -> 22858 bytes ui/themes/icon/vc_hide_icon.png | Bin 0 -> 5257 bytes ui/themes/icon/vc_hide_icon_dim.png | Bin 0 -> 5206 bytes ui/themes/icon/vc_hide_icon_press.png | Bin 0 -> 4220 bytes ui/themes/icon/vc_join_icon.png | Bin 0 -> 4348 bytes ui/themes/icon/vc_join_icon_dim.png | Bin 0 -> 4350 bytes ui/themes/icon/vc_join_icon_press.png | Bin 0 -> 3598 bytes ui/themes/icon/vc_keypad_icon.png | Bin 0 -> 5212 bytes ui/themes/icon/vc_keypad_icon_dim.png | Bin 0 -> 5121 bytes ui/themes/icon/vc_keypad_icon_press.png | Bin 0 -> 4048 bytes ui/themes/icon/vc_live_video_icon.png | Bin 0 -> 3865 bytes ui/themes/icon/vc_live_video_icon_dim.png | Bin 0 -> 3814 bytes ui/themes/icon/vc_live_video_icon_press.png | Bin 0 -> 3481 bytes ui/themes/icon/vc_msg_icon.png | Bin 0 -> 6355 bytes ui/themes/icon/vc_msg_icon_press.png | Bin 0 -> 3649 bytes ui/themes/icon/vc_mute_icon.png | Bin 0 -> 4795 bytes ui/themes/icon/vc_mute_icon_dim.png | Bin 0 -> 4828 bytes ui/themes/icon/vc_mute_icon_press.png | Bin 0 -> 4838 bytes ui/themes/icon/vc_mute_on_icon.png | Bin 0 -> 6131 bytes ui/themes/icon/vc_mute_on_icon_dim.png | Bin 0 -> 3690 bytes ui/themes/icon/vc_mute_on_icon_press.png | Bin 0 -> 3977 bytes ui/themes/icon/vc_popup_arrow.png | Bin 0 -> 1430 bytes ui/themes/icon/vc_popup_bg.png | Bin 0 -> 1012 bytes ui/themes/icon/vc_rcs_share_icon.png | Bin 0 -> 3580 bytes ui/themes/icon/vc_rcs_share_icon_dim.png | Bin 0 -> 3648 bytes ui/themes/icon/vc_speaker_icon.png | Bin 0 -> 4061 bytes ui/themes/icon/vc_speaker_icon_dim.png | Bin 0 -> 4047 bytes ui/themes/icon/vc_speaker_icon_press.png | Bin 0 -> 4036 bytes ui/themes/icon/vc_speaker_on_icon.png | Bin 0 -> 5619 bytes ui/themes/icon/vc_speaker_on_icon_dim.png | Bin 0 -> 3216 bytes ui/themes/icon/vc_speaker_on_icon_press.png | Bin 0 -> 3468 bytes ui/themes/icon/vc_video_call_icon.png | Bin 0 -> 7381 bytes ui/themes/icon/vc_video_call_icon_press.png | Bin 0 -> 4149 bytes ui/themes/icon/vc_view_contact_icon.png | Bin 0 -> 3270 bytes ui/themes/icon/vc_view_contact_icon_press.png | Bin 0 -> 3839 bytes ui/themes/icon/vc_voice_call_icon.png | Bin 0 -> 5331 bytes ui/themes/icon/vc_voice_call_icon_press.png | Bin 0 -> 5084 bytes 285 files changed, 68685 insertions(+) create mode 100755 CMakeLists.txt create mode 100755 LICENSE create mode 100755 call-engine/core/include/vc-core-callagent.h create mode 100644 call-engine/core/include/vc-core-callmanager.h create mode 100755 call-engine/core/include/vc-core-ccbs.h create mode 100755 call-engine/core/include/vc-core-ecc.h create mode 100644 call-engine/core/include/vc-core-engine-group.h create mode 100644 call-engine/core/include/vc-core-engine-status.h create mode 100755 call-engine/core/include/vc-core-engine-types.h create mode 100755 call-engine/core/include/vc-core-engine.h create mode 100755 call-engine/core/include/vc-core-error.h create mode 100755 call-engine/core/include/vc-core-svcall.h create mode 100755 call-engine/core/include/vc-core-tapi-evnt.h create mode 100755 call-engine/core/include/vc-core-tapi-rqst.h create mode 100755 call-engine/core/include/vc-core-util.h create mode 100755 call-engine/core/vc-core-callagent.c create mode 100644 call-engine/core/vc-core-callmanager.c create mode 100755 call-engine/core/vc-core-ccbs.c create mode 100755 call-engine/core/vc-core-ecc.c create mode 100755 call-engine/core/vc-core-engine-group.c create mode 100755 call-engine/core/vc-core-engine-status.c create mode 100755 call-engine/core/vc-core-engine.c create mode 100755 call-engine/core/vc-core-svcall.c create mode 100755 call-engine/core/vc-core-tapi-evnt.c create mode 100755 call-engine/core/vc-core-tapi-rqst.c create mode 100755 call-engine/core/vc-core-util.c create mode 100755 call-engine/etc/rc.d/init.d/voice-calld create mode 100755 call-engine/etc/rc.d/rc3.d/S60voice-calld create mode 100755 call-engine/include/voice-call-bt.h create mode 100755 call-engine/include/voice-call-core.h create mode 100755 call-engine/include/voice-call-device.h create mode 100755 call-engine/include/voice-call-engine-msg.h create mode 100755 call-engine/include/voice-call-engine.h create mode 100755 call-engine/include/voice-call-service.h create mode 100755 call-engine/include/voice-call-sound.h create mode 100755 call-engine/sounds/01_Minimal_tone.mp3 create mode 100755 call-engine/sounds/03_Call_connect.wav create mode 100755 call-engine/sounds/04_Call_disconnect.wav create mode 100755 call-engine/sounds/Call_BusyTone.wav create mode 100755 call-engine/sounds/Call_ErrorTone.wav create mode 100755 call-engine/sounds/Call_NwCongestionTone.wav create mode 100755 call-engine/sounds/Call_RecordStart.wav create mode 100755 call-engine/sounds/Call_WaitingTone.wav create mode 100755 call-engine/voice-call-bt.c create mode 100755 call-engine/voice-call-core.c create mode 100755 call-engine/voice-call-device.c create mode 100755 call-engine/voice-call-engine.c create mode 100755 call-engine/voice-call-service.c create mode 100755 call-engine/voice-call-sound.c create mode 100755 org.tizen.call.manifest create mode 100755 packaging/org.tizen.call.spec create mode 100755 ui/CMakeLists.txt create mode 100644 ui/call_edc/call.edc create mode 100755 ui/call_edc/vcui-view-button-layout.edc create mode 100644 ui/call_edc/vcui-view-caller-id.edc create mode 100755 ui/call_edc/vcui-view-caller-info.edc create mode 100644 ui/call_edc/vcui-view-dialing.edc create mode 100644 ui/call_edc/vcui-view-end-conf-call.edc create mode 100644 ui/call_edc/vcui-view-end-single-call.edc create mode 100644 ui/call_edc/vcui-view-incoming-lock.edc create mode 100644 ui/call_edc/vcui-view-keypad.edc create mode 100644 ui/call_edc/vcui-view-landscape-quick-pannel.edc create mode 100644 ui/call_edc/vcui-view-multi-call-conf.edc create mode 100644 ui/call_edc/vcui-view-multi-call-list.edc create mode 100644 ui/call_edc/vcui-view-multi-call-split.edc create mode 100755 ui/call_edc/vcui-view-naviframe.edc create mode 100644 ui/call_edc/vcui-view-popup.edc create mode 100644 ui/call_edc/vcui-view-quick-pannel.edc create mode 100755 ui/call_edc/vcui-view-reject.edc create mode 100644 ui/call_edc/vcui-view-single-call.edc create mode 100755 ui/call_edc/vcui-view-ug-effect.edc create mode 100755 ui/default.conf create mode 100755 ui/images/PUT_IMAGES_HERE create mode 100755 ui/images/hd/ani/vc_income_01.png create mode 100755 ui/images/hd/ani/vc_income_02.png create mode 100755 ui/images/hd/ani/vc_income_03.png create mode 100755 ui/images/hd/ani/vc_income_04.png create mode 100755 ui/images/hd/ani/vc_income_05.png create mode 100755 ui/images/hd/ani/vc_income_06.png create mode 100755 ui/images/hd/ani/vc_income_07.png create mode 100755 ui/images/hd/ani/vc_income_08.png create mode 100755 ui/images/hd/ani/vc_outgoing_01.png create mode 100755 ui/images/hd/ani/vc_outgoing_02.png create mode 100755 ui/images/hd/ani/vc_outgoing_03.png create mode 100755 ui/images/hd/ani/vc_outgoing_04.png create mode 100755 ui/images/hd/ani/vc_outgoing_05.png create mode 100755 ui/images/hd/ani/vc_outgoing_06.png create mode 100755 ui/images/hd/ani/vc_outgoing_07.png create mode 100755 ui/images/hd/ani/vc_outgoing_08.png create mode 100644 ui/images/hd/icon/vc_caller_ID_split.png create mode 100644 ui/images/hd/icon/vc_caller_ID_split_group.png create mode 100644 ui/images/hd/icon/vc_caller_info_icon.png create mode 100644 ui/images/hd/icon/vc_conference_private.png create mode 100644 ui/images/hd/icon/vc_icon_conf_call_end.png create mode 100644 ui/images/hd/icon/vc_icon_hold_call.png create mode 100644 ui/images/hd/icon/vc_icon_swap_call.png create mode 100644 ui/images/hd/icon/vc_icon_unhold_call.png create mode 100755 ui/images/hd/icon/vc_more_add_call.png create mode 100755 ui/images/hd/icon/vc_more_contacts.png create mode 100755 ui/images/hd/icon/vc_more_join.png create mode 100755 ui/images/hd/icon/vc_more_manage_conf.png create mode 100755 ui/images/hd/icon/vc_normal_caller_ID.png create mode 100755 ui/images/hd/icon/vc_normal_caller_ID_group.png create mode 100755 ui/images/hd/icon/vc_notify_missed_call.png create mode 100755 ui/images/hd/icon/vc_notify_sub_missed_call.png create mode 100755 ui/images/hd/icon/vc_qp_caller_ID.png create mode 100755 ui/images/hd/icon/vc_qp_caller_ID_group.png create mode 100755 ui/images/hd/icon/vc_qp_mute_on.png create mode 100644 ui/images/hd/icon/vc_reject_create_icon.png create mode 100755 ui/images/hd/icon/vc_volume_icon.png create mode 100755 ui/images/hd/icon/vc_volume_mute_icon.png create mode 100644 ui/images/hd/vc_alerts_arrow_01.png create mode 100644 ui/images/hd/vc_alerts_arrow_02.png create mode 100644 ui/images/hd/vc_call_ID_thumbnail_bg.png create mode 100755 ui/images/hd/vc_call_button_bg.png create mode 100755 ui/images/hd/vc_caller_info_bg.png create mode 100755 ui/images/hd/vc_caller_info_end_bg.png create mode 100644 ui/images/hd/vc_calling_cid_BG.png create mode 100644 ui/images/hd/vc_calling_no_cid_bg.png create mode 100644 ui/images/hd/vc_default_caller_ID_720x720.png create mode 100644 ui/images/hd/vc_keypad_btn_icon.png create mode 100755 ui/images/hd/vc_keypad_btn_normal.png create mode 100755 ui/images/hd/vc_keypad_btn_press.png create mode 100755 ui/images/hd/vc_lock_reject_message_arrow_close.png create mode 100755 ui/images/hd/vc_lock_reject_message_arrow_open.png create mode 100755 ui/images/hd/vc_lock_reject_message_bg.png create mode 100644 ui/images/hd/vc_no_caller_ID.png create mode 100755 ui/images/hd/vc_reject_msg_icon.png create mode 100755 ui/org.tizen.call.png create mode 100755 ui/org.tizen.call.xml create mode 100755 ui/po/CMakeLists.txt create mode 100755 ui/po/ar.po create mode 100755 ui/po/az.po create mode 100755 ui/po/bg.po create mode 100755 ui/po/ca.po create mode 100755 ui/po/cs.po create mode 100755 ui/po/da.po create mode 100755 ui/po/de_DE.po create mode 100755 ui/po/el_GR.po create mode 100755 ui/po/en.po create mode 100755 ui/po/en_PH.po create mode 100755 ui/po/en_US.po create mode 100755 ui/po/es_ES.po create mode 100755 ui/po/es_MX.po create mode 100755 ui/po/et.po create mode 100755 ui/po/eu.po create mode 100755 ui/po/fi.po create mode 100755 ui/po/fr_CA.po create mode 100755 ui/po/fr_FR.po create mode 100755 ui/po/ga.po create mode 100755 ui/po/gl.po create mode 100755 ui/po/hi.po create mode 100755 ui/po/hr.po create mode 100755 ui/po/hu.po create mode 100755 ui/po/hy.po create mode 100755 ui/po/is.po create mode 100755 ui/po/it_IT.po create mode 100755 ui/po/ja_JP.po create mode 100755 ui/po/ka.po create mode 100755 ui/po/kk.po create mode 100755 ui/po/ko_KR.po create mode 100755 ui/po/lt.po create mode 100755 ui/po/lv.po create mode 100755 ui/po/mk.po create mode 100755 ui/po/nb.po create mode 100755 ui/po/nl_NL.po create mode 100755 ui/po/pl.po create mode 100755 ui/po/pt_BR.po create mode 100755 ui/po/pt_PT.po create mode 100755 ui/po/ro.po create mode 100755 ui/po/ru_RU.po create mode 100755 ui/po/sk.po create mode 100755 ui/po/sl.po create mode 100755 ui/po/sr.po create mode 100755 ui/po/sv.po create mode 100755 ui/po/tr_TR.po create mode 100755 ui/po/uk.po create mode 100755 ui/po/uz.po create mode 100755 ui/po/zh_CN.po create mode 100755 ui/po/zh_HK.po create mode 100755 ui/po/zh_SG.po create mode 100755 ui/po/zh_TW.po create mode 100755 ui/src/include/vcui-app-data.h create mode 100755 ui/src/include/vcui-app-window.h create mode 100755 ui/src/include/vcui-application.h create mode 100755 ui/src/include/vcui-doc-launch.h create mode 100755 ui/src/include/vcui-document.h create mode 100755 ui/src/include/vcui-view-callend.h create mode 100755 ui/src/include/vcui-view-choice.h create mode 100755 ui/src/include/vcui-view-common.h create mode 100755 ui/src/include/vcui-view-dialing.h create mode 100755 ui/src/include/vcui-view-elements.h create mode 100755 ui/src/include/vcui-view-incoming-lock.h create mode 100755 ui/src/include/vcui-view-keypad.h create mode 100755 ui/src/include/vcui-view-layout-hd.h create mode 100755 ui/src/include/vcui-view-multi-call-conf.h create mode 100755 ui/src/include/vcui-view-multi-call-list.h create mode 100755 ui/src/include/vcui-view-multi-call-split.h create mode 100755 ui/src/include/vcui-view-popup.h create mode 100755 ui/src/include/vcui-view-quickpanel.h create mode 100755 ui/src/include/vcui-view-single-call.h create mode 100755 ui/src/vcui-app-window.c create mode 100755 ui/src/vcui-application.c create mode 100755 ui/src/vcui-doc-launch.c create mode 100755 ui/src/vcui-document.c create mode 100755 ui/src/vcui-view-callend.c create mode 100755 ui/src/vcui-view-choice.c create mode 100755 ui/src/vcui-view-common.c create mode 100755 ui/src/vcui-view-dialing.c create mode 100755 ui/src/vcui-view-elements.c create mode 100755 ui/src/vcui-view-incoming-lock.c create mode 100755 ui/src/vcui-view-keypad.c create mode 100755 ui/src/vcui-view-multi-call-conf.c create mode 100755 ui/src/vcui-view-multi-call-list.c create mode 100755 ui/src/vcui-view-multi-call-split.c create mode 100755 ui/src/vcui-view-popup.c create mode 100755 ui/src/vcui-view-quickpanel.c create mode 100755 ui/src/vcui-view-single-call.c create mode 100644 ui/themes/bg/vc_button_callend_press.png create mode 100644 ui/themes/bg/vc_button_conflist_hold_normal.png create mode 100644 ui/themes/bg/vc_button_conflist_hold_press.png create mode 100755 ui/themes/bg/vc_button_end_press.png create mode 100644 ui/themes/bg/vc_button_hold_swap_normal.png create mode 100644 ui/themes/bg/vc_button_hold_swap_press.png create mode 100644 ui/themes/bg/vc_button_qp_end_normal.png create mode 100644 ui/themes/bg/vc_button_qp_end_press.png create mode 100644 ui/themes/bg/vc_button_qp_normal.png create mode 100644 ui/themes/bg/vc_button_qp_press.png create mode 100755 ui/themes/bg/vc_conf_button_bigend_call.png create mode 100644 ui/themes/bg/vc_conf_button_bigend_call_press.png create mode 100644 ui/themes/bg/vc_conf_end_normal.png create mode 100644 ui/themes/bg/vc_conf_end_press.png create mode 100644 ui/themes/bg/vc_conf_split_normal.png create mode 100644 ui/themes/bg/vc_conf_split_press.png create mode 100755 ui/themes/bg/vc_contact_btn.png create mode 100755 ui/themes/bg/vc_contact_btn_press.png create mode 100644 ui/themes/bg/vc_more_button_normal.png create mode 100644 ui/themes/bg/vc_more_button_press.png create mode 100644 ui/themes/bg/vc_six_button_press.png create mode 100644 ui/themes/call_theme.edc create mode 100644 ui/themes/icon/vc_add_icon.png create mode 100644 ui/themes/icon/vc_add_icon_dim.png create mode 100644 ui/themes/icon/vc_add_icon_press.png create mode 100644 ui/themes/icon/vc_contacts_icon.png create mode 100644 ui/themes/icon/vc_contacts_icon_dim.png create mode 100644 ui/themes/icon/vc_contacts_icon_press.png create mode 100755 ui/themes/icon/vc_end_call_icon.png create mode 100644 ui/themes/icon/vc_end_call_icon_dim.png create mode 100755 ui/themes/icon/vc_end_call_icon_press.png create mode 100644 ui/themes/icon/vc_hide_icon.png create mode 100644 ui/themes/icon/vc_hide_icon_dim.png create mode 100644 ui/themes/icon/vc_hide_icon_press.png create mode 100644 ui/themes/icon/vc_join_icon.png create mode 100644 ui/themes/icon/vc_join_icon_dim.png create mode 100644 ui/themes/icon/vc_join_icon_press.png create mode 100644 ui/themes/icon/vc_keypad_icon.png create mode 100644 ui/themes/icon/vc_keypad_icon_dim.png create mode 100644 ui/themes/icon/vc_keypad_icon_press.png create mode 100755 ui/themes/icon/vc_live_video_icon.png create mode 100755 ui/themes/icon/vc_live_video_icon_dim.png create mode 100755 ui/themes/icon/vc_live_video_icon_press.png create mode 100755 ui/themes/icon/vc_msg_icon.png create mode 100755 ui/themes/icon/vc_msg_icon_press.png create mode 100644 ui/themes/icon/vc_mute_icon.png create mode 100644 ui/themes/icon/vc_mute_icon_dim.png create mode 100644 ui/themes/icon/vc_mute_icon_press.png create mode 100644 ui/themes/icon/vc_mute_on_icon.png create mode 100644 ui/themes/icon/vc_mute_on_icon_dim.png create mode 100644 ui/themes/icon/vc_mute_on_icon_press.png create mode 100644 ui/themes/icon/vc_popup_arrow.png create mode 100644 ui/themes/icon/vc_popup_bg.png create mode 100644 ui/themes/icon/vc_rcs_share_icon.png create mode 100644 ui/themes/icon/vc_rcs_share_icon_dim.png create mode 100644 ui/themes/icon/vc_speaker_icon.png create mode 100644 ui/themes/icon/vc_speaker_icon_dim.png create mode 100644 ui/themes/icon/vc_speaker_icon_press.png create mode 100644 ui/themes/icon/vc_speaker_on_icon.png create mode 100644 ui/themes/icon/vc_speaker_on_icon_dim.png create mode 100644 ui/themes/icon/vc_speaker_on_icon_press.png create mode 100755 ui/themes/icon/vc_video_call_icon.png create mode 100755 ui/themes/icon/vc_video_call_icon_press.png create mode 100755 ui/themes/icon/vc_view_contact_icon.png create mode 100755 ui/themes/icon/vc_view_contact_icon_press.png create mode 100755 ui/themes/icon/vc_voice_call_icon.png create mode 100755 ui/themes/icon/vc_voice_call_icon_press.png diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..3b5be10 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(call C) + +# Architecture +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-D_CALL_ARCH_ARM_") +ENDIF() + +#INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +#ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +#ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{PREFIX}\"") +#ADD_DEFINITIONS("-DDATAFS=\"$ENV{DATADIR}\"") +#ADD_DEFINITIONS(${SHARED_FLAGS}) + + +ADD_DEFINITIONS("-DCALL_DEBUG_ON_DLOG") +#ADD_DEFINITIONS("-DCALL_DEBUG_ON_SCREEN") + +SET(COMMON_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") + +ADD_SUBDIRECTORY(ui) + diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..cc8727b --- /dev/null +++ b/LICENSE @@ -0,0 +1,75 @@ +Flora License + +Version 1.0, May, 2012 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies with the standards set forth in the Compatibility Definition Document and passes the Compatibility Test Suite as defined from time to time by the Tizen Technical Steering Group and certified by the Tizen Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work solely as incorporated into a Tizen Certified Platform, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work solely as incorporated into a Tizen Certified Platform to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof pursuant to the copyright license above, in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/call-engine/core/include/vc-core-callagent.h b/call-engine/core/include/vc-core-callagent.h new file mode 100755 index 0000000..8d9417b --- /dev/null +++ b/call-engine/core/include/vc-core-callagent.h @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VC_CORE_CALL_AGENT_H_ +#define __VC_CORE_CALL_AGENT_H_ + +#include +#include "vc-core-callmanager.h" +#ifdef _CPHS_DEFINED_ +#include "status-interface.h" +#endif + +/**< Maximum Telephony Event */ +#define CALL_VC_TAPI_CALL_EVENT_MAX_NUM 33 +#define CALL_VC_SIMATK_EVENT_MAX_NUM 3 /**< Maximum SIM ATK Event */ +#define CALL_VC_TAPI_READY_EVENT_NUM 1 /**< Tapi Service Ready Event */ +#define CALL_VC_TAPI_FACTORY_EVENT_NUM 1 /**< Tapi Service FACTORY Event */ +#define CALL_VC_TAPI_SUBSCRIPTION_MAX (CALL_VC_TAPI_CALL_EVENT_MAX_NUM+CALL_VC_TAPI_READY_EVENT_NUM+CALL_VC_SIMATK_EVENT_MAX_NUM+CALL_VC_TAPI_FACTORY_EVENT_NUM) + +/** + * This enumeration provides CA STATEs + */ +typedef enum { + CALL_VC_CA_STATE_NORMAL, /**< Normal state */ + CALL_VC_CA_STATE_SPLIT_CALLBOX, /**< Call split state */ + CALL_VC_CA_STATE_WAIT_SPLIT, /**< Waiting for call split state */ + CALL_VC_CA_STATE_DROP_CALLBOX, /**< Call drop state */ + CALL_VC_CA_STATE_WAIT_DROP, /**< Waiting for drop state */ + CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE, /**< Wait for swapping activce/hold call state */ + CALL_VC_CA_STATE_WAIT_SWAP_HOLD, /**< Wait for swapping held call state */ + CALL_VC_CA_STATE_WAIT_SWAP_ACTIVE, /**< Wait for swapping active call state */ + CALL_VC_CA_STATE_WAIT_SWAP, /**< Wait for swap state */ + CALL_VC_CA_STATE_WAIT_HOLD, /**< Wait for hold state */ + CALL_VC_CA_STATE_WAIT_UNHOLD, /**< Wait for unhold state */ + CALL_VC_CA_STATE_WAIT_JOIN, /**< Wait for join state */ + CALL_VC_CA_STATE_WAIT_TRANSFER_CNF, /**< Wait for transfer confirmation state */ + CALL_VC_CA_STATE_WAIT_TRANSFER_CALLEND, /**< Wait for transfer callend state */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL, /**< Wait for release all active call state */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL, /**< Wait for release all held call state */ + CALL_VC_CA_STATE_SENDMSG_CALLBOX, /**< Message send callbox active state */ + CALL_VC_CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX, /**< Contact detail view state */ + CALL_VC_CA_STATE_SAVE_TO_CONTACT_CALLBOX, /**< Save to contact state */ + CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL, /**< Wait for release all active calls */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS, /**< Wait for release all calls */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP, /**< Wait for release all calls to setup */ + CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL,/**< Wait for release all calls to setup videocall */ + CALL_VC_CA_STATE_MAX_NUM /**< Max value for the state */ +} call_vc_ca_state_t; + +/** + * This structure defines voicecall agent data + */ +typedef struct _voicecall_engine_t { + TapiHandle *tapi_handle; + call_vc_ca_state_t callagent_state; /**< Call Agent State */ + voicecall_inout_state_t io_state; /**< Voicecall Engine IO State */ + call_vc_manager_t call_manager; /**< Handle for the Call Manager */ + TelSimCardType_t card_type; /**< SIM Card Type */ + + gboolean bdtmf_ring; /**< dtmf ring? */ + + gboolean bis_no_sim; /**< SIM not available , if TRUE */ + gboolean bdownload_call; /**< Automated call test after binary download , if TRUE */ + + /*No structure in TAPI 14Mar08 */ + /*tapi_call_ccbs_info_t ccbs_info[CALL_VC_CCBS_NUMBER_MAX]; < call control for busy subscriber info */ + int ccbs_index; /**< Index for ccbs_info*/ + + int barring_ind_type; /* barring ind type */ + /*AOC*/ + float aoc_ppm; /**< Price per unit value of currency meter */ + + /*CPHS Info*/ +#ifdef _CPHS_DEFINED_ + status_class_cphs_type cphs_status; /**< stores the cphs status information*/ + gboolean bcphs_read_success; /**< Flag for CPHS read status*/ +#endif + + /*Subscription Information */ + unsigned int subscription_id[CALL_VC_TAPI_SUBSCRIPTION_MAX]; + int curr_tapi_path; + + /*Client Information */ + voicecall_cb client_callback; /** +#include +#include +#include "vc-core-util.h" + +#ifdef CALL_DEBUG_ON_DLOG +#include +#endif + +#ifdef _VC_OPERATOR_TMOUSA +#define CALL_ECC_MAX_COUNT_DEFAULT_NO_SIM 7 +#else +#define CALL_ECC_MAX_COUNT_DEFAULT_NO_SIM 8 +#endif +#define CALL_ECC_MAX_COUNT_DEFAULT 2 +#define CALL_ECC_MAX_COUNT_3 3 +#define CALL_ECC_MAX_COUNT_4 4 +#define CALL_ECC_MAX_COUNT_5 5 +#define CALL_ECC_MAX_COUNT_6 6 +#define CALL_ECC_MAX_COUNT_7 7 +#define CALL_ECC_MAX_COUNT_8 8 +#define CALL_ECC_MAX_COUNT_9 9 +#define CALL_ECC_MAX_COUNT_10 10 + +gboolean _vc_core_ecc_check_emergency_number(TapiHandle *tapi_handle, TelSimCardType_t card_type, char *pNumber, gboolean b_is_no_sim, int *ecc_category); +#endif /* __VC_CORE_ECC_H_ */ diff --git a/call-engine/core/include/vc-core-engine-group.h b/call-engine/core/include/vc-core-engine-group.h new file mode 100644 index 0000000..a494e1c --- /dev/null +++ b/call-engine/core/include/vc-core-engine-group.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_ENGINE_GROUP_H_ +#define __VC_CORE_ENGINE_GROUP_H_ + +#include "vc-core-engine-types.h" +#include "vc-core-error.h" + +/** +* This function retrieves the number of connected call members in the given group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[out] pmember_num Pointer to the retrieved number of connected members +* @remarks pvoicecall_agent and pmember_num cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_connected_member_count(voicecall_engine_t *pvoicecall_agent, int group_index, int *pmember_num); + +/** +* This function retrives the number of groups in which atleast one call member is available +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pnum_enabled_group Pointer to the number of enabled groups +* @remarks pvoicecall_agent and pnum_enabled_group cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_enabled_group_count(voicecall_engine_t *pvoicecall_agent, int *pnum_enabled_group); + +/** +* This function retrieves the group indices of active and held calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pact_grp_index Set to the group index of active calls +* @param[out] pheld_grp_index Set to the group index of held calls +* @remarks pvoicecall_agent, pact_grp_index and pheld_grp_index cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_group_indices(voicecall_engine_t *pvoicecall_agent, int *pact_grp_index, int *pheld_grp_index); + +/** +* This function retrieves the call handle of the call member given its groupe index and position in the group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[in] pos Position of the call in the group +* @param[out] pcall_handle Pointer to the call handle to be retrieved +* @remarks pvoicecall_agent and pcall_handle cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_call_handle_byposition(voicecall_engine_t *pvoicecall_agent, int group_index, int pos, int *pcall_handle); + +/** +* This function checks if connected call exists in a given group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[out] bcall_exists Contains TRUE if call exists in the given group, FALSE otherwise +* @remarks pvoicecall_agent and bcall_exists cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_isexists_connected_call_ingroup(voicecall_engine_t *pvoicecall_agent, int group_index, gboolean *bcall_exists); + +#endif /*__VC_CORE_ENGINE_GROUP_H_*/ diff --git a/call-engine/core/include/vc-core-engine-status.h b/call-engine/core/include/vc-core-engine-status.h new file mode 100644 index 0000000..fbc9a53 --- /dev/null +++ b/call-engine/core/include/vc-core-engine-status.h @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_ENGINE_STATUS_H_ +#define __VC_CORE_ENGINE_STATUS_H_ + +#include "vc-core-engine-types.h" +#include "vc-core-error.h" + +/** +* This function checks whether the given incoming call is a restricted call or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be checked +* @param[out] pbrestricted Pointer to the restricted name mode +* @remarks pvoicecall_agent and prestricted cannot be NULL. +* This API shall only be used with the incoming call handle before it is connected +*/ +voicecall_error_t _vc_core_engine_status_isrestricted_call(voicecall_engine_t *pvoicecall_agent, int call_handle, gboolean *pbrestricted); + +/** +* This function retrieves the call object belongs to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call for which the call object is retrieved +* @param[out] pcall_object Pointer to the retrived call object info +* @remarks pvoicecall_agent and pcall_object cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_status_get_call_object(voicecall_engine_t *pvoicecall_agent, int call_handle, call_vc_call_objectinfo_t *pcall_object); + +/** +* This function retrieves the inout state of the engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pio_state Contains the Engine InOut state on return +* @remarks pvoicecall_agent and pio_state cannot be NULL. +* @see _vc_core_engine_change_engine_iostate +*/ +voicecall_error_t _vc_core_engine_status_get_engine_iostate(voicecall_engine_t *pvoicecall_agent, int *pio_state); + +/** +* This function checks whether connected call exists or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[out] bcall_exists TRUE - if call exists of given given type, FALSE otherwise +* @remarks pvoicecall_agent and bcall_exists cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_status_isexists_call_bytype(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, gboolean *bcall_exists); + +/** +* This function retrieves the total number of call members available with the engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] ptotal_call_member Contains the total call member availalbe in engine on return +* @remarks pvoicecall_agent and ptotal_call_member cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_member_count(voicecall_engine_t *pvoicecall_agent, int *ptotal_call_member); + +/** +* This function retrieves the total number of call members with the given connected call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] connected_call_type connected call type +* @param[out] pmember_num Contains the number of call members available with the given connected call type on return +* @remarks pvoicecall_agent and pmember_num cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_member_info(voicecall_engine_t *pvoicecall_agent, voicecall_connected_call_type_t connected_call_type, int *pmember_num); + +/** +* This function retrieves the call handle according to the given call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[out] pcall_handle Contains the call handle on success +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* In case of multiple connected calls available, it will retreive the first connected call +*/ +voicecall_error_t _vc_core_engine_status_get_call_handle_bytype(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int *pcall_handle); + +/** +* This function checks if active calls and/or held call exists or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pactive_calls Set to TRUE if active calls exist +* @param[out] pheld_calls Set to TRUE if held calls exist +* @remarks pvoicecall_agent,pactive_calls and pheld_calls cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isexists_any_call(voicecall_engine_t *pvoicecall_agent, gboolean *pactive_calls, gboolean *pheld_calls); + +/** +* This function retreives the cphs csp status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] csp_service csp name +* @param[out] pbcsp_status Contains TRUE if given csp service is enabled,FALSE otherwise +* @remarks pvoicecall_agent and pbcsp_status cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_cphs_csp_status(voicecall_engine_t *pvoicecall_agent, voicecall_cphs_csp_service csp_service, gboolean *pbcsp_status); + +/** +* This function checks if the call is emergency call for the given outgoing call index +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] mo_call_index Index of the outgoing call +* @param[out] pbemergency_call Contains TRUE if the call is emergency call,FALSE otherwise +* @remarks pvoicecall_agent and pbemergency_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_check_emergency_byindex(voicecall_engine_t *pvoicecall_agent, int mo_call_index, gboolean *pbemergency_call); + +/** +* This function checks and returns the FDN status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pcall_agent Handle to Voicecall Engine +* @param[out] bfdn_enabled TRUE - if FDN is enabled, FALSE otherwise +* @remarks pvoicecall_agent and bfdn_anabled cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isenabled_fdn(voicecall_engine_t *pcall_agent, gboolean *bfdn_enabled); + +/** +* This function checks the possiblity of transfering calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] pbtransfer_calls Contains TRUE if call transfer is possible, FALSE otherwise +* @remarks pvoicecall_agent and pbtransfer_calls cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_transfer_call_possible(voicecall_engine_t *pvoicecall_agent, gboolean *pbtransfer_calls); + +/** +* This function checks the possiblity of making conference calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] pbconf_call Contains TRUE if conference call is possible , FALSE otherwise +* @remarks pvoicecall_agent and pbconf_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_conf_call_possible(voicecall_engine_t *pvoicecall_agent, gboolean *pbconf_call); + +/** +* This function retreives the call state of the given call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of particular call +* @param[out] pcall_state Contains the call state of the given call handle +* @remarks pvoicecall_agent and pcall_state cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_state_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle, voicecall_call_state_t *pcall_state); + +/** +* This function checks if any call is ending and retrieves its call number if it is ending +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] bcall_ending TRUE if any call is being ended, FALSE otherwise +* @remarks pvoicecall_agent and bcall_ending cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_any_call_ending(voicecall_engine_t *pvoicecall_agent, gboolean *bcall_ending); + +/** +* This function checks whther engine is busy in processing any events or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] bbusy TRUE - if engine is not busy in processing any events, FALSE - otherwise +* @remarks pvoicecall_agent and bbusy cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_engine_busy(voicecall_engine_t *pvoicecall_agent, gboolean *bbusy); + +/** +* This function sets the given flag to engine for processing during call end +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_flag End Flag to be set +* @remarks pvoicecall_agent and bsscode cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_set_end_flag(voicecall_engine_t *pvoicecall_agent, voicecall_end_flag_t end_flag); + +/** +* This function checks whether the given string is MMI string or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pinput_number Input string to be verified +* @param[out] bsscode TRUE - if the given string is a valid ss code, FALSE otherwise +* @remarks pvoicecall_agent and bsscode cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isvalid_ss_code(voicecall_engine_t *pvoicecall_agent, const char *pinput_number, gboolean *bsscode); + +/** +* This function checks the if it is in zuhause area or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] psat_icon_data Pointer carrying the zuhause status +* @remarks pvoicecall_agent and psat_icon_data cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_zuhause_area(voicecall_engine_t *pvoicecall_agent, gboolean *bzuhause); + +/** +* This function checks whether the given incoming call is a restricted call or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be checked +* @param[out] pbrestricted Pointer to the restricted name mode +* @remarks pvoicecall_agent and prestricted cannot be NULL. +* This API shall only be used with the incoming call handle before it is connected +*/ +voicecall_error_t _vc_core_engine_status_get_calling_namemode(voicecall_engine_t *pvoicecall_agent, int call_handle, gboolean *bcalling_namemode); + +voicecall_error_t _vc_core_engine_status_dump_call_details(voicecall_engine_t *pvoicecall_agent); + +/** +* This function checks the possiblity of making private calls +* +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] b_download_call Contains TRUE if zuhause area, FALSE otherwise +* @remarks pvoicecall_agent and pbprivate_call cannot be NULL +*/ +void _vc_core_engine_status_set_download_call(voicecall_engine_t *pvoicecall_agent, gboolean b_download_call); + +gboolean _vc_core_engine_status_get_download_call(voicecall_engine_t *pvoicecall_agent); + +#endif /* __VC_CORE_ENGINE_STATUS_H_ */ diff --git a/call-engine/core/include/vc-core-engine-types.h b/call-engine/core/include/vc-core-engine-types.h new file mode 100755 index 0000000..5f7ca17 --- /dev/null +++ b/call-engine/core/include/vc-core-engine-types.h @@ -0,0 +1,592 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_ENGINE_TYPES_H_ +#define __VC_CORE_ENGINE_TYPES_H_ + +#include +#include + +/**< This is the prototype of the client callback function */ +typedef gboolean(*voicecall_cb) (int event, int param1, int param2, void *param3, void *puser_data); + +/** + * This opaque structure is the interface for the client application to communicate to the engine + */ +typedef struct _voicecall_engine_t voicecall_engine_t; + +/**< General Macro Definitions */ +#define TAG_CALL "CALL" +#define TAG_CALL_LAUNCH "VCKPI" +#define VC_DISPLAY_NAME_LENGTH_MAX (255+1) /**< Voiecall Display Name Max Length */ +#define VC_IMAGE_PATH_LENGTH_MAX (255+1) /**< Max File length for image */ +#define VC_RINGTONE_PATH_LENGTH_MAX (255+1) /**< Max File length for Ringtone */ +#define VC_DATA_LENGTH_MAX (255+1) /**< Max data length for misc */ +#define VC_PHONE_NUMBER_LENGTH_MAX (82+1) /**< Maximum length of a phone number */ +#define VC_PHONE_NAME_LENGTH_MAX (80+1) /**< Maximum length of a calling name */ +#define VC_PHONE_SUBADDRESS_LENGTH_MAX (40+1) /**< Maximum length of a SUB address */ +#define VC_MAX_CALL_GROUP_MEMBER 5 /**< Maximum number of members in a group */ +#define VC_MAX_CALL_MEMBER 8 /**< This is the maximum number of members possible */ +#define VC_INVALID_CALL_ID 0 /**< This is the invalid entry for call ID */ +#define VC_MAX_CALL_ID 7 /**< Maximum Allowed Call IDS (1 -7) (5 Conf Calls, 1 Other Connected Call and 1 Outgoing/Incoming Call)*/ + +#define VC_AOC_CURRENCY_CODE_LEN_MAX 3 /**< Max Length of the AOC Currency Code */ + +#define VC_INVALID_CALL_INDEX -1 +#define VC_INVALID_CALL_COST -1 +#define VC_INVALID_PPM -1 + +#define VC_TAPI_INVALID_CALLHANDLE -1 +#define VC_TAPI_DUMMY_CALLHANDLE 9999 /* Using between Setup and dailing noti. Because valid call handle can be used after dailing noti*/ +#define VC_RQSTID_DEFAULT -1 /**< To collect request ID of Async TAPI request*/ + +#define VC_ED_HANDLE 0 +#define VC_SAT_ICON_SIZE (64*64) + +#define VC_EMERGENCY_NUM_MAX 8 + +#define VC_RECORD_FULL_FILE_PATH_LENGTH (4095+1) +#ifndef VC_NO_ERROR +#define VC_NO_ERROR 0 +#endif + +#ifndef VC_ERROR +#define VC_ERROR -1 +#endif + +#ifndef VC_INVALID_VOLUME +#define VC_INVALID_VOLUME -1 +#endif +/**< General Macro Definitions */ + +#ifndef EXPORT_API +#define EXPORT_API __attribute__((visibility("default"))) +#endif + +/** + * This enumeration defines the call states + */ +typedef enum { + VC_CALL_ACCEPT_1, + VC_CALL_ACCEPT_2 +} voicecall_accept_choice_t; + +/** + * This enumeration defines the call states + */ +typedef enum { + VC_CALL_STATE_NONE, /**< No call state */ + VC_CALL_STATE_INCOME, /**< Incoming state */ + VC_CALL_STATE_REJECTED, /**< Rejected state */ + VC_CALL_STATE_PREPARE_OUTGOING, /**< Prepare for outgoing */ + VC_CALL_STATE_OUTGOING, /**< Outgoing state */ + VC_CALL_STATE_OUTGOING_ORIG, /**< Outgoing originatged state */ + VC_CALL_STATE_OUTGOING_ALERT, /**< Outgoing alert state */ + VC_CALL_STATE_CANCELLED, /**< Cancelled state */ + VC_CALL_STATE_CONNECTED, /**< Connected state */ + VC_CALL_STATE_RELEASE_WAIT, /**< Release wait state */ + VC_CALL_STATE_ENDED, /**< Call ended state */ + VC_CALL_STATE_REDIAL, /**< Redial state */ + VC_CALL_STATE_ENDED_FINISH, /**< Call ended finish state */ + VC_CALL_STATE_MAX_NUM /**< Max value */ +} voicecall_call_state_t; + +/** + * This enumeration defines the call setup parties + */ +typedef enum { + VC_CALL_SETUP_BY_NORMAL, /**< Normal Call setup */ + VC_CALL_SETUP_BY_SAT, /**< Call setup by SAT */ + VC_CALL_SETUP_BY_MAILBOX /**< Call setup by Mail box */ +} voicecall_call_type_bysetup_t; + +/** + * This enumeration defines the call end cause types + */ +typedef enum { + VC_ENDCAUSE_CALL_ENDED, /**< Call ended */ + + VC_ENDCAUSE_CALL_DISCONNECTED, /**< Call disconnected */ + VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED, /**< Service not allowed */ + VC_ENDCAUSE_CALL_BARRED, /**< Call barred */ + VC_ENDCAUSE_NO_SERVICE, /**< No Service */ + VC_ENDCAUSE_NW_BUSY, /**< Network busy */ + + VC_ENDCAUSE_NW_FAILED, /**< Network failed */ + VC_ENDCAUSE_NO_ANSWER, /**< No anwer from other party */ + VC_ENDCAUSE_NO_CREDIT, /**< No credit available */ + VC_ENDCAUSE_REJECTED, /**< Call rejected */ + VC_ENDCAUSE_USER_BUSY, /**< user busy */ + + VC_ENDCAUSE_WRONG_GROUP, /**< Wrong group */ + VC_ENDCAUSE_CALL_NOT_ALLOWED, /**< Call not allowed */ + VC_ENDCAUSE_TAPI_ERROR, /**< Tapi error */ + VC_ENDCAUSE_CALL_FAILED, /**< Call Failed */ + VC_ENDCAUSE_NO_USER_RESPONDING, /**< User not responding */ + + VC_ENDCAUSE_USER_ALERTING_NO_ANSWER, /**< User Alerting No Answer */ + VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE, /**< Circuit Channel Unavailable,Network is out of Order,Switching equipment congestion,Temporary Failure */ + VC_ENDCAUSE_USER_UNAVAILABLE, /**< Called Party Rejects the Call */ + VC_ENDCAUSE_INVALID_NUMBER_FORMAT, /**< Entered number is invalid or incomplete */ + VC_ENDCAUSE_NUMBER_CHANGED, /**< Entered number has been changed */ + + VC_ENDCAUSE_UNASSIGNED_NUMBER, /**< Unassigned/Unallocated number*/ + VC_ENDCAUSE_USER_DOESNOT_RESPOND, /**< Called Party does not respond*/ + VC_ENDCAUSE_IMEI_REJECTED, /**< Called Party does not respond*/ + VC_ENDCAUSE_FIXED_DIALING_NUMBER_ONLY, /**< FDN Number only */ +} voice_call_end_cause_type_t; + +/** +* This enumeration defines the call types used to end the calls in end call API +*/ +typedef enum { + VC_END_OUTGOING_CALL, /**< To end only mobile originated outgoing call*/ + VC_END_INCOMING_CALL, /**< To end only mobile terminated incoming call*/ + VC_END_ACTIVE_OR_HELD_CALLS, /**< To end first active call if available or to end end held call*/ + VC_END_ALL_ACTIVE_CALLS, /**< To end all available active calls*/ + VC_END_ALL_HELD_CALLS, /**< To end all available held calls*/ + VC_END_ALL_CALLS /**< To end all available calls(active,held,incoming/outgoing*/ +} _vc_core_engine_end_call_type_t; + +/** +* This enumeration defines flags to be used with _vc_core_engine_status_set_end_flag +*/ +typedef enum { + VC_RETREIVE_CALL_ON_MOCALL_END /**< To be used before ending the mo call to retrieve the held call on mo call end if held call is available*/ +} voicecall_end_flag_t; + +/** + * This enum defines the different call types by source of origination of call + */ +typedef enum { + VC_CALL_ORIG_TYPE_NORMAL, /**< Normal Call */ + VC_CALL_ORIG_TYPE_EMERGENCY, /**< Emergency Call*/ + VC_CALL_ORIG_TYPE_VOICEMAIL, /**< Voiece Mail Call*/ + VC_CALL_ORIG_TYPE_SAT, /**< SAT Requested Call*/ + VC_CALL_ORIG_TYPE_NOSIM, /**< Emergency Call with out SIM*/ + VC_CALL_ORIG_TYPE_PINLOCK /**< Emergency Call with Pin Lock*/ +} voicecall_call_orig_type_t; + +/** + * This enum defines the different call types to be used with the assiociated APIs + */ +typedef enum { + VC_INCOMING_CALL, /**< Mobile Terminated Call*/ + VC_OUTGOING_CALL, /**< Mobile Originated Call*/ + VC_CONNECTED_CALL /**< Connected Call (Both Parties Connected)*/ +} voicecall_call_type_t; + +/** +* This enum defines the type of calls being termed once the calls are connected +*/ +typedef enum { + VC_ACTIVE_CALL, /**< Connected calls in active state*/ + VC_HELD_CALL /**< Connected calls in held state*/ +} voicecall_connected_call_type_t; + +/** + * This enum defines alternate line service types + */ +typedef enum { + VC_CALL_CPHS_ALS_NONE, /**< No ALS */ + VC_CALL_CPHS_ALS_LINE1, /**< Line 1*/ + VC_CALL_CPHS_ALS_LINE2 /**< Line 2 */ +} voice_call_cphs_alsline_t; + +/** + * This enum defines the call group states + */ +typedef enum { + CALL_VC_GROUP_STATE_NONE, /**< Group State Not Exist */ + CALL_VC_GROUP_STATE_ACTIVE, /**< Active group state */ + CALL_VC_GROUP_STATE_HOLD /**< Hold group state */ +} call_vc_groupstate_t; + +/** + * This enum defines the mobile originated call states + */ +typedef enum { + VC_MOCALL_STATE_NONE, /**< MO State Not Exist */ + VC_MOCALL_STATE_END, /**< MO State End */ + VC_MOCALL_STATE_CANCEL, /**< MO State Cancel */ + VC_MOCALL_STATE_DESTROY /**< MO State Destroy */ +} voice_call_mocall_state_t; + +#ifdef _CALL_LONG_DTMF +/** + * This enum defines dtmf buffer states + */ +typedef enum { + CALL_VC_DTMF_BUF_NONE, /**< Buffer state Not Exist */ + CALL_VC_DTMF_BUF_START, /**< Buffer start */ + CALL_VC_DTMF_BUF_RECEIVED_START_ACK, /**< Reveived start acknowledgement */ + CALL_VC_DTMF_BUF_WAIT_STOP_ACK /**< Wait stop acknowledgement */ +} call_vc_dtmf_bufferstate_t; +#endif + +/** +* This enum defines vc engine sat mo call ctrl response type +*/ +typedef enum __voicecall_engine_sat_mo_call_ctrl_res { + CALL_ALLOWED_NO_MOD, /**< Call Allowed without any modification in the caller details */ + CALL_NOT_ALLOWED, /**< Call Not Allowed - (User should be notified) */ + CALL_ALLOWED_WITH_MOD, /**< Call Allowed with modification in the caller details- (UI should be updated) */ + CALL_CHANGED_TO_SS /**< Call number modified to SS String */ +} voicecall_engine_sat_mo_call_ctrl_res; + +/** + * This enum defines sat request response types + */ +typedef enum __voicecall_engine_sat_rqst_resp_type { + SAT_RQST_SETUP_CALL, /**< Sat setup call request */ + SAT_RQST_SEND_DTMF, /**< Sat send dtmf request */ + SAT_RESP_SETUP_CALL /**< Sat setup call response */ +} voicecall_engine_sat_rqst_resp_type; + +/** + * This enum defines voicecall engine callback event types + */ +typedef enum _voicecall_engine_event_t { + /* Tapi Call Related Event Types */ + VC_CALL_INCOM, /**< Incoming call */ + VC_CALL_OUTGOING, /**< Outgoing call. This event will be sent, when outgoing deferred and made after some time */ + VC_CALL_OUTGOING_ORIG, /**< Outgoing call originated */ + VC_CALL_OUTGOING_CLOCK_NOTI, /**< Outgoing clock notification */ + VC_CALL_OUTGOING_ALERT, /**< Outgoing alert call */ + VC_CALL_CONNECTED, /**< Call connected */ + VC_CALL_NORMAL_END, /**< Normal end */ + VC_CALL_INCOM_END, /**< Incoming call end */ + VC_CALL_INCOM_DROPPED, /**< Incoming call ended before it is being precessed by the engine */ + VC_CALL_REJECTED_END, /**< Rejected call end */ + VC_CALL_OUTGOING_END, /**< Outgoing call end */ + VC_CALL_OUTGOING_ABORTED, /**< Outgoing call ended before making the call to the NW */ + VC_CALL_DTMF_ACK, /**< DTMF Acknowledgement */ + VC_CALL_AUTO_REDIAL_CHECK, /**< Auto Redial Check */ + VC_CALL_ANSWER_CNF, /**< Answer confirm */ + + /*Tapi Call Dependent SS related events */ + VC_CALL_SS_HELD, /**< SS Held */ + VC_CALL_SS_RETREIVED, /**< SS Retriebved */ + VC_CALL_SS_SWAP, /**< SS call swap */ + VC_CALL_SS_SETUP_CONF, /**< SS setup conference */ + VC_CALL_SS_SPLIT_CONF, /**< SS Split conference */ + VC_CALL_SS_TRANSFERRED, /**< SS call transferred */ + VC_CALL_SS_CONNECT_LINE_IND, /**< SS connectect line indication */ + + /*Tapi Call SS Indication Related Events */ + VC_CALL_IND_FORWARD, /**< Call forward */ + VC_CALL_IND_ACTIVATE, /**< Activate call */ + VC_CALL_IND_HOLD, /**< Hold call */ + VC_CALL_IND_TRANSFER, /**< Call transfer */ + VC_CALL_IND_SETUPCONFERENCE, /**< Setup conference */ + VC_CALL_IND_BARRING, /**< Call barring */ + VC_CALL_IND_WAITING, /**< Call waiting */ + VC_CALL_IND_CUGINFO, /**< Closed User Group information */ + VC_CALL_IND_SSNOTIFY, /**< SS nofify */ + VC_CALL_IND_CALLINGNAMEINFO, /**< Caller name information */ + VC_CALL_IND_REDIRECT_CNF, /**< Redirect confirmation */ + VC_CALL_IND_ACTIVATECCBS_CNF, /**< Activate CCBS confirmation */ + VC_CALL_IND_ACTIVATECCBS_USERINFO, /**< Activate CCBS user information */ + VC_CALL_IND_AOC, /**< AOC indication */ + + /*Tapi Response Error Related Events */ + VC_ERROR_OCCURED, /**< Error */ + + /* Voicecall Engine triggered Event Type */ + VC_ACTION_INCOM_FORCE, /**< If any outgoing data needs to be destroyed or cleaned up in the client during an incoming call, this event will be sent */ + VC_ACTION_SAT_REQUEST, /**< SAT Request. This event will be sent to client , when SAT Engine requests any service from voicecall. Voicecall Engine holds the SAT engine related information, clients can get the information from the engine when it is required */ + VC_ACTION_SAT_RESPONSE, /**< SAT Response */ + VC_ACTION_CALL_END_HELD_RETREIVED, /**< If a held call is being retreived on end of an active call, this event will be emitted */ + VC_ACTION_NO_ACTIVE_TASK, /**< This event will be published when engine becomes idle after executing/aborting a request from other apps - eg) if SAT request is not processed*/ + + VC_CALL_GET_VOLUME_RESP, /**< Response data from tapi for get tapi sound volume*/ + + VC_CALL_NOTI_WBAMR, /**< Notification Wideband amr */ + VC_CALL_FLIGHT_MODE_DISABLED, /**< Notification that Flight mode is disabled*/ + VC_CALL_FLIGHT_MODE_ERROR, /**< Notification that Flight mode request ERR*/ + VC_ENGINE_EVENT_MAX +} voicecall_engine_event_t; + +/** + * This enum defines call forwarding indication types + */ +typedef enum _voicecall_forward_ind_type_t { + VC_FRWD_IND_INCOM_IS_FRWD, /**< Is incoming call a forwarded call? */ + VC_FRWD_IND_INCOM_FRWD, /**< Incoming call Forwarded */ + VC_FRWD_IND_OUTGOING_FRWD /**< Outgoing call Forwarded */ +} voicecall_forward_ind_type_t; + +/** + * This enum defines call barring indication types + */ +typedef enum _voicecall_barr_ind_type_t { + VC_BARR_IND_NONE, /**< No call barring indication */ + VC_BARR_IND_ALL, /**< Barring all outgoing and incoming calls */ + VC_BARR_IND_BAOC, /**< Bar All Outgoing Calls indication */ + VC_BARR_IND_BOIC, /**< Bar Outgoing International Calls indication */ + VC_BARR_IND_BOIC_EXHC, /**< Bar Outgoing International Calls EXcept Home Calls indication */ + VC_BARR_IND_BAIC, /**< Bar All Incoming Calls indication */ + VC_BARR_IND_BICROAM /**< Bar Incoming Calls when ROAMing indication */ +} voicecall_barr_ind_type_t; + +/** + * This enum defines supplementary services notificatoin indication types + */ +typedef enum _voicecall_ssnotify_ind_type_t { + VC_SSNOTIFY_IND_CFU, /**< SS CFU indication */ + VC_SSNOTIFY_IND_CFB, /**< SS CFB indication */ + VC_SSNOTIFY_IND_CFNRY, /**< SS CFNRY indication */ + VC_SSNOTIFY_IND_CFNRC, /**< SS CFNRC indication */ + VC_SSNOTIFY_IND_CLIR, /**< SS CLIR indication */ + VC_SSNOTIFY_IND_ALL_COND_FORWARDING, /**< SS all condtional call forwarding indication */ + VC_SSNOTIFY_IND_BARRING_OF_OUTGOING /**< SS Outging call baring indication */ +} voicecall_ssnotify_ind_type_t; + +/** + * This enum defines engine/ Input Output sate of call agent + */ +typedef enum { + VC_INOUT_STATE_NONE, /**< I/O state none */ + VC_INOUT_STATE_OUTGOING_START, /**< Outgoing enum value start */ + VC_INOUT_STATE_OUTGOING_WAIT_HOLD, /**< Outgoing wait for hold */ + VC_INOUT_STATE_OUTGOING_WAIT_ORIG, /**< Outgoing wait for Origination event */ + VC_INOUT_STATE_OUTGOING_WAIT_ALERT, /**< Outgoing wait alert */ + VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED, /**< Outgoing wait connected */ + VC_INOUT_STATE_OUTGOING_WAIT_RELEASE, /**< Outgoing wait release */ + VC_INOUT_STATE_OUTGOING_ABORTED, /**< Outgoing call aborted */ + VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE, /**< Outgoing show redial cause */ + VC_INOUT_STATE_OUTGOING_WAIT_REDIAL, /**< Outgoing wait redial */ + VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX, /**< Outgoing showing retry call box : not used*/ + VC_INOUT_STATE_OUTGOING_END, /**< Outgoing enum value end */ + + VC_INOUT_STATE_INCOME_SELFEVET_WAIT, /**< Incoming waiting for self event : not used*/ + VC_INOUT_STATE_INCOME_START, /**< Incoming enumvalue start */ + VC_INOUT_STATE_INCOME_BOX, /**< Incoming box */ + VC_INOUT_STATE_INCOME_WAIT_REDIRECTCNF, /**< Incoming wait for redirect confirmation : not used*/ + VC_INOUT_STATE_INCOME_WAIT_REDIRECT_END, /**< Incoming wait for redirect end : not used*/ + VC_INOUT_STATE_INCOME_WAIT_CONNECTED, /**< Incoming wait connected */ + VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED, /**< Incoming wait for hold and then connected event */ + VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED, /**< Incoming wait for release and then connected event */ + VC_INOUT_STATE_INCOME_WAIT_HOLD, /**< Incoming wait hold : not used*/ + VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVECALL, /**< Incoming wait release active call */ + VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL, /**< Incoming wait release hold call */ +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE, /**< Incoming wait release hold call in case of release all and accept */ +#endif + VC_INOUT_STATE_INCOME_WAIT_RELEASE, /**< Incoming wait release call */ + VC_INOUT_STATE_INCOME_END, /**< Incoming enum value end */ + VC_INOUT_STATE_MAX_NUM /**< Max value */ +} voicecall_inout_state_t; + +/** + * This enum defines call answer types + */ +typedef enum _voicecall_answer_type_t { + VC_ANSWER_NORMAL, /**< Accepts the call in normal scenario(Only CONNECTED will be sent to the client) */ + VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT, /**< Puts the active call on hold and accepts the call (Only CONNECTED will be sent to client) */ + VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to Client) */ + VC_ANSWER_RELEASE_HOLD_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to client) */ +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + VC_ANSWER_RELEASE_ALL_AND_ACCEPT /**< Releases the all calls and accept the call (END and CONNECTED will be sent to client) */ +#endif +} voicecall_answer_type_t; + +/** + * This enum defines the cphs csp status names + */ +typedef enum _voicecall_cphs_csp_service { + /**< CPHS Teleservice*/ + VC_CPHS_CSP_ALS, /** +#include + +/*Voicecall Engine Exposed API's */ + +void _vc_core_engine_handle_sat_events_cb(void *sat_setup_call_data, void *userdata); + +void _vc_core_engine_handle_incoming_tapi_events(void *mt_data, void *userdata); + +/** + * This function initializes the voicecall engine + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[out] pcall_agent_out Pointer to the address of call agent +* @param[in] pcallback_func Call back function + * @param[in] puser_data Data set by user +* @remarks pcall_agent_out and pcallback_func cannot be NULL. + */ +voicecall_error_t _vc_core_engine_init(voicecall_engine_t **pcall_agent_out, voicecall_cb pcallback_func, void *puser_data); + +/** +* This function prepares the call setup info structure for making call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] psetup_call_info Pointer to the call setup info structure. +* @remarks pvoicecall_agent and psetup_call_info cannot be NULL +* Only on successfull completion of this API, _vc_core_engine_make_call can be made +* @see See following API's also +* -_vc_core_engine_make_call +* -voicecall_clear_prepared_call + */ +voicecall_error_t _vc_core_engine_prepare_call(voicecall_engine_t *pvoicecall_agent, voicecall_setup_info_t *psetup_call_info); + +/** +* This function establishes an outgoing call with the details prepared using _vc_core_engine_prepare_call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] mo_call_index Index of the prepare mo call +* @param[out] pcall_handle Handle of the MO Call Made +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_end_call + */ +voicecall_error_t _vc_core_engine_make_call(voicecall_engine_t *pvoicecall_agent, int mo_call_index, int *pcall_handle); + +/** +* This function answers a call according to the given answer type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] answer_type The answer type to be used +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_reject_call + */ +voicecall_error_t _vc_core_engine_answer_call(voicecall_engine_t *pvoicecall_agent, voicecall_answer_type_t answer_type); + +/** +* This function rejects the incoming call if any +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] budub User Determined User Busy - TRUE, Else - FALSE +* @exception In case of exceptions return value contains appropriate error code. +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_answer_call +*/ +voicecall_error_t _vc_core_engine_reject_call(voicecall_engine_t *pvoicecall_agent, gboolean budub); + +/** +* This function ends the call according to the given end call type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_call_type End Call Type +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call_byhandle +* - _vc_core_engine_end_call_bycallId +* . + */ +voicecall_error_t _vc_core_engine_end_call(voicecall_engine_t *pvoicecall_agent, _vc_core_engine_end_call_type_t end_call_type); + +/** +* This function ends only the connected call corresponding to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_bycallId + */ +voicecall_error_t _vc_core_engine_end_call_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle); + +/** +* This function ends a call corresponding to the given call ID + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id call id of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_byhandle + */ +voicecall_error_t _vc_core_engine_end_call_bycallId(voicecall_engine_t *pvoicecall_agent, int call_id); + +/** +* This function puts the active call if any on hold + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see voicecall_retreive_call + */ +voicecall_error_t _vc_core_engine_hold_call(voicecall_engine_t *pvoicecall_agent); + +/** +* This function retrieves/activates the held call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_hold_call + */ +voicecall_error_t _vc_core_engine_retrieve_call(voicecall_engine_t *pvoicecall_agent); + +/** +* This function swaps the active and held calls if any available + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_hold_call +* - _vc_core_engine_retrieve_call +* . + */ +voicecall_error_t _vc_core_engine_swap_calls(voicecall_engine_t *pvoicecall_agent); + +/** +* This function does the explicit call transfer + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_transfer_calls(voicecall_engine_t *pvoicecall_agent); + +/** +* This function sets up a conference beween the currently available active and held calls + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_private_call +* - _vc_core_engine_private_call_by_callid +* . + */ +voicecall_error_t _vc_core_engine_setup_conference(voicecall_engine_t *pvoicecall_agent); + +/** +* This function makes a private call to the given call member from the currently available active conference call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle call handle of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call_by_callid +* . + */ +voicecall_error_t _vc_core_engine_private_call(voicecall_engine_t *pvoicecall_agent, int call_handle); + +/** +* This function makes a private call to the call member corressponding to the given call id. + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id Call ID of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call +* . + */ +voicecall_error_t _vc_core_engine_private_call_by_callid(voicecall_engine_t *pvoicecall_agent, int call_id); + +/** +* This function sends the given dtmf digits + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pdtmf_string dtmf digits to be sent +* @remarks pvoicecall_agent and pdtmf_string cannot be NULL + */ +voicecall_error_t _vc_core_engine_send_dtmf(voicecall_engine_t *pvoicecall_agent, char *pdtmf_string); + +/** +* This function clears the data of the given call type. + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[in] call_handle Call handle of the connected call to be cleared +* @remarks This will clear the call data only when the call data are currently not being used +* i,e) the data will be cleared only if the corresponding call is ended or the call data is not used at all. +* call_handle argument is required only in case of connected call, Engine ignores call_handle for other +* call types. + */ +voicecall_error_t _vc_core_engine_finalize_call(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int call_handle); + +/** +* This function changes the inout state of the engine to the given state + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] io_state Inout state to be set +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_status_get_engine_iostate + */ +voicecall_error_t _vc_core_engine_change_engine_iostate(voicecall_engine_t *pvoicecall_agent, int io_state); + +/** + * This function extracts the call number from the given number + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] source_tel_number source number + * @param[out] phone_number target number + * @param[in] buf_size target number buffer size + */ +voicecall_error_t _vc_core_engine_extract_phone_number(const char *source_tel_number, char *phone_number, const int buf_size); + +/** +* This function finalizes the voiecall engine and removes all allocated resources + * +* @return nothing + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks pvoicecall_agent cannot be NULL + */ +void _vc_core_engine_engine_finish(voicecall_engine_t *pvoicecall_agent); + +/** +* This function changes the voice audio path + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[in] audio_path audio path to be changed + * @param[in] bextra_volume TRUE - extra volume on, FALSE - extra volume off + * @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_change_audio_path(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path, gboolean bextra_volume); + +/** +* This function sets the voice call audio volume for the given audio path type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be set +* @param[in] vol_level volume level +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_set_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type, voicecall_audio_volume_t vol_level); + +/** +* This function sets the modem mute status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] bmute_audio TRUE - mure audio, FALSE - unmute audio +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_set_audio_mute(voicecall_engine_t *pvoicecall_agent, gboolean bmute_audio); + +/** +* This function retreives the voice call audio volume for the given audio path type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be retreived +* @remarks pvoicecall_agent cannot be NULL + */ +voicecall_error_t _vc_core_engine_get_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type); + + +#ifdef _SAT_MENU_ +/** + * This function requests SAT Engine to setup SIM services Menu + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks Voicecall Engine only requests the SAT engine to display the menu. + */ +voicecall_error_t voicecall_request_sat_menu(voicecall_engine_t *pvoicecall_agent); + +/** +* This function retreives the SIM Menu Title from the SAT Engine + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] title contains the sat menu title on sucess + */ +voicecall_error_t voicecall_request_sat_menu_title(voicecall_engine_t *pvoicecall_agent, char *title); +#endif + +/** +* This function prepares the engine for the redial call. It preserves the previsouly made call object to be used for the next make call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[in] call_handle call handle +* @remarks If this API is used, _vc_core_engine_prepare_call is not reqired for making the call again. The last prepared call details will +* be used for the redialling. Application has to just use _vc_core_engine_make_call API to redial the call + */ +voicecall_error_t _vc_core_engine_prepare_redial(voicecall_engine_t *pvoicecall_agent, int call_handle); + +#ifdef _OLD_SAT_ +/** + * This function checks whether SAT redial duration is valid + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[out] bredial_duration Contains TRUE if SAT redial duration is enabled, FALSE otherwise + * @remarks pvoicecall_agent and bredial_duration cannot be NULL + */ +voicecall_error_t voicecall_get_sat_redial_duration_status(voicecall_engine_t *pvoicecall_agent, gboolean *bredial_duration); + +/** + * This function sets the current duration and retireives the modified remaining SAT redial duration + * + * @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure + * @param[in] pvoicecall_agent Handle to Voicecall Engine + * @param[out] remaining_duration remaining sat duration + * @remarks pvoicecall_agent and remaining_duration cannot be NULL + */ +voicecall_error_t voicecall_get_set_sat_remaining_duration(voicecall_engine_t *pvoicecall_agent, long *remaining_duration); +#endif + +voicecall_error_t _vc_core_engine_get_sat_dtmf_hidden_mode(voicecall_engine_t *pvoicecall_agent, gboolean *bhidden_mode); + +/** +* This function sends response to sat based on the given sat response type + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] sat_rqst_resp_type sat rqst/response type sent by client +* @param[in] sat_response_type sat response type to be sent to SAT + */ +voicecall_error_t _vc_core_engine_send_sat_response(voicecall_engine_t *pvoicecall_agent, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type); +voicecall_error_t _vc_core_engine_set_to_default_values(voicecall_engine_t *pvoicecall_agent); +voicecall_error_t _vc_core_engine_check_incoming_handle(voicecall_engine_t *pvoicecall_agent, int call_id); + +/** +* This function off sound clock status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +*/ +voicecall_error_t _vc_core_engine_off_sound_clock_status(voicecall_engine_t *pvoicecall_agent); + +/* Tapi response call back */ +void _vc_core_engine_dial_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_answer_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_end_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_hold_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_active_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_swap_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_join_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_split_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_transfer_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_dtmf_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_set_volume_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_get_volume_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_set_sound_path_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_set_mute_status_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +void _vc_core_engine_get_aoc_info_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +/* Tapi response call back end */ +void _vc_core_engine_set_sound_clock_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data); +gboolean _vc_core_engine_disable_flight_mode(voicecall_engine_t *pvoicecall_agent); +#endif /* __VC_CORE_ENGINE_H_ */ + diff --git a/call-engine/core/include/vc-core-error.h b/call-engine/core/include/vc-core-error.h new file mode 100755 index 0000000..1ab5225 --- /dev/null +++ b/call-engine/core/include/vc-core-error.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_ERROR_H_ +#define __VC_CORE_ERROR_H_ + +/** + * Voicecall Engine Error Codes + */ + +typedef enum __voicecall_api_error_t { + ERROR_VOICECALL_NONE, /*0 */ + ERROR_VOICECALL_INVALID_CALL_TYPE, + ERROR_VOICECALL_INVALID_TELEPHONE_NUMBER, + ERROR_VOICECALL_MEMALLOC_FAILURE, + ERROR_VOICECALL_DBUS_FAILURE, + ERROR_VOICECALL_INVALID_MO_REF_HANDLE, + ERROR_VOICECALL_INVALID_CALL_HANDLE, + ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE, + ERROR_VOICECALL_CALL_NOT_ALLOWED, + ERROR_VOICECALL_NOT_SUPPORTED, + ERROR_VOICECALL_INVALID_ACTION_TYPE, /*10 */ + ERROR_VOICECALL_TAPI_ERROR, + ERROR_VOICECALL_FDN_ONLY, + ERROR_VOICECALL_EMERGENCY_CALLS_ONLY, + ERROR_VOICECALL_OUTGOING_ABORTED, + ERROR_VOICECALL_ENGINE_STATE_NOT_NONE, + ERROR_VOICECALL_EMPTY_SPEED_DIAL, + ERROR_VOICECALL_CONTACT_READ_FAILED, + ERROR_VOICECALL_MO_CALL_NOT_AVAILABLE, + ERROR_VOICECALL_NO_NW_SERVICE, + ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED, /*20 */ + ERROR_VOICECALL_NO_INCOMING_CALL_EXIST, + ERROR_VOICECALL_ENGINE_STATE_NONE, + ERROR_VOICECALL_BOTH_ACTIVE_HELD_CALLS_EXIST, + ERROR_VOICECALL_OFFLINE_MODE, + ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM, + ERROR_VOICECALL_PHONE_NOT_INITIALIZED, + ERROR_VOICECALL_HOLD_REJECTED, + ERROR_VOICECALL_ACTIVATE_REJECTED, + ERROR_VOICECALL_SWAP_REJECTED, + ERROR_VOICECALL_HOLD_FAILED, /*30 */ + ERROR_VOICECALL_RETREIVE_FAILED, + ERROR_VOICECALL_SETUP_CONF_FAILED, + ERROR_VOICECALL_SPLIT_CONF_FAILED, + ERROR_VOICECALL_SWAP_FAILED, + ERROR_VOICECALL_TRANSFER_FAILED, + ERROR_VOICECALL_INCOMPLETE, + ERROR_VOICECALL_UNAVAILABLE, + ERROR_VOICECALL_HOLD_NOT_SUPPORTED, + ERROR_VOICECALL_RETREIVE_NOT_SUPPORTED, + ERROR_VOICECALL_SETUP_CONF_NOT_SUPPORTED, /*40 */ + ERROR_VOICECALL_SPLIT_CONF_NOT_SUPPORTED, + ERROR_VOICECALL_SWAP_NOT_SUPPORTED, + ERROR_VOICECALL_TRANSFER_NOT_SUPPORTED, + ERROR_VOICECALL_DTMF_FAILED, + ERROR_VOICECALL_ANSWER_FAILED, + ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS, + ERROR_VOICECALL_INSUFFICIENT_BUFFER, + ERROR_VOICECALL_INVALID_ARGUMENTS, + ERROR_VOICECALL_NOTI_FAILED, + ERROR_VOICECALL_OPERATION_NOT_ALLOWED, /*50 */ + ERROR_VOICECALL_REQUEST_FAILED, + ERROR__vc_core_engine_private_call_NOT_POSSIBLE, + ERROR_VOICECALL_TRANSFER_CALL_NOT_POSSIBLE, + ERROR_VOICECALL_CONF_NOT_POSSIBLE, + ERROR_VOICECALL_INVALID_CALLID, + ERROR_VOICECALL_CALL_IS_IN_PROGRESS, + ERROR__vc_core_engine_private_call_FAILED, + ERROR_VOICECALL_INVALID_DTMF_CHAR, + ERROR_VOICE_SERVICE_BLOCKED, /*59 */ + ERROR_VOICECALL_MAX +} voicecall_error_t; + +#endif /*__VC_CORE_ERROR_H_*/ diff --git a/call-engine/core/include/vc-core-svcall.h b/call-engine/core/include/vc-core-svcall.h new file mode 100755 index 0000000..1e708fb --- /dev/null +++ b/call-engine/core/include/vc-core-svcall.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_SVCALL_H_ +#define __VC_CORE_SVCALL_H_ +#include "vc-core-callagent.h" + +#ifdef _CPHS_DEFINED_ + +/** + * This function retrieves cphs information from the Telephony and stores with the engine + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to Voicecall Call Agent + */ +gboolean _vc_core_svcall_init_cphs_info(call_vc_callagent_state_t *pcall_agent); + +/** + * This function retrieves status of the given csp service type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to Voicecall Call Agent + * @param[in] csp_service csp service whose status to be retreived + */ +gboolean _vc_core_svcall_cphs_csp_get_status(call_vc_callagent_state_t *pcall_agent, voicecall_cphs_csp_service csp_service); + +/** + * This function retrieves cuurent active line in ALS + * + * @return Returns #voice_call_cphs_alsline_t + * @param[in] pcall_agent Handle to Voicecall Call Agent + */ +voice_call_cphs_alsline_t _vc_core_svcall_get_cphs_als_active_line(call_vc_callagent_state_t *pcall_agent); +#endif + +#endif /*__VC_CORE_SVCALL_H_*/ diff --git a/call-engine/core/include/vc-core-tapi-evnt.h b/call-engine/core/include/vc-core-tapi-evnt.h new file mode 100755 index 0000000..cd21328 --- /dev/null +++ b/call-engine/core/include/vc-core-tapi-evnt.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_TAPI_EVENT_H_ +#define __VC_CORE_TAPI_EVENT_H_ + +#include "vc-core-util.h" +#include "vc-core-callagent.h" +#include "vc-core-engine.h" + +/** + * This function handles the tapi connected line indication handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Tapi Call Handle associtated with connected line indication + */ +gboolean _vc_core_tapi_event_connected_line_ind_handle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallConnectedNumberInfo_t *connected_number_info); + +/** + * This function handles the AOC Event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Pointet to SAT engine return call structure + * @param[in] ptapi_aoc_info AOC info associated with the AOC Event + */ +gboolean _vc_core_tapi_event_handle_aoc(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallAocInfo_t *pTapiAocInfo); + +/** + * This function retreives the voicecall engine specific end cause type for the given tapi end cause type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] noti_id tapi event type + * @param[in] cause tapi call end cause + * @param[out] end_cause_type voicecall engine end cause + */ +void _vc_core_tapi_event_get_end_cause_type(call_vc_callagent_state_t *pcall_agent, const char *noti_id, TelTapiEndCause_t cause, voice_call_end_cause_type_t *end_cause_type); + +/** +* This function Copies Telephony incoming call data to voice call incoming call data +* +* @return void +* @param[in] pcall_agent Handle to voicecall agent +* @param[in] callInfo Telephony Incoming Call Data +* @param[out] pcallobject_info Voicecall Engine Incoming Call Dta +*/ +void _vc_core_tapi_event_copy_incoming_call_data(call_vc_callagent_state_t *pcall_agent, TelCallIncomingCallInfo_t *callInfo, call_vc_call_objectinfo_t *pcallobject_info); + +/** + * This function handles the incoming event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Incoming call handle + * @param[in] callInfo Incoming call info associated with the incoming call + */ +gboolean _vc_core_tapi_event_handle_incoming_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallIncomingCallInfo_t *callInfo); + +/** + * This function handles tapi origination event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_originated_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function handles tapi alert event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_alert_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function handles the call end event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] type Tapi Event Type + * @param[in] handle Call Handle of the call being ended + * @param[in] cause Tapi End Cause + */ +gboolean _vc_core_tapi_event_handle_call_end_event(call_vc_callagent_state_t *pcall_agent, const char * noti_id, call_vc_handle handle, TelTapiEndCause_t cause); + +/** + * This function handles the tapi call connect event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being connected + */ +gboolean _vc_core_tapi_event_handle_call_connect_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function handles call hold event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_held_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles tapi call activate/retreive event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_retrieve_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles call join/conference event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_join_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles call split/private call event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_split_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status); + +/** + * This function handles the call transfer event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] status tapi cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_transfer_event(call_vc_callagent_state_t *pcall_agent, TelCallCause_t status); + +#endif /* __VC_CORE_TAPI_EVENT_H_ */ diff --git a/call-engine/core/include/vc-core-tapi-rqst.h b/call-engine/core/include/vc-core-tapi-rqst.h new file mode 100755 index 0000000..a364736 --- /dev/null +++ b/call-engine/core/include/vc-core-tapi-rqst.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_TAPI_RQST_H_ +#define __VC_CORE_TAPI_RQST_H_ + +#include "vc-core-util.h" +#include "vc-core-callagent.h" + + /** + * This function prepares for a call setup + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_prepare_setup_call(call_vc_callagent_state_t *pcall_agent); + + /** + * This function sets up an outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_setup_call(call_vc_callagent_state_t *pcall_agent); + +/* + * Function to answer/release calls, + */ + /** + * This function answers the call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] answer_type call answer type #voicecall_answer_type_t + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_answer_call(call_vc_callagent_state_t *pcall_agent, voicecall_answer_type_t answer_type, int *error_code); + +/** + * This function checks and prepares to accept a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_response_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function rejects a mobile terminated call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] budub TRUE - User Determined User Busy, FALSE - otherwise + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_reject_mt_call(call_vc_callagent_state_t *pcall_agent, gboolean budub, int *error_code); + +/** + * This function ends a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_end_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_active_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases held calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_held_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_incoming_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_outgoing_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases all calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_all_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function releases the call associate with the given call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle handle of the call to be ended + */ +gboolean _vc_core_tapi_rqst_end_call_by_callhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function holds a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_hold_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function retrieves a call from hold + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_retrieve_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function swaps held and active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_swap_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function joins two calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_join_calls(call_vc_callagent_state_t *pcall_agent); + +/** + * This function splits the members of a call given its call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] call_handle Call handle for a call the members of which has to be split + */ +gboolean _vc_core_tapi_rqst_private_call(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + +/** + * This function transfers call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_transfer_call(call_vc_callagent_state_t *pcall_agent); + +/** + * This function sends the given string as dtmf + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] dtmf_string dtmf string + */ +gboolean _vc_core_tapi_rqst_start_dtmf(call_vc_callagent_state_t *pcall_agent, char *dtmf_string); + +/** + * This function get aoc ppm value + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent); + +#endif /* __VC_CORE_TAPI_RQST_H_ */ diff --git a/call-engine/core/include/vc-core-util.h b/call-engine/core/include/vc-core-util.h new file mode 100755 index 0000000..e7003ab --- /dev/null +++ b/call-engine/core/include/vc-core-util.h @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VC_CORE_UTIL_H_ +#define __VC_CORE_UTIL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "vc-core-error.h" +#include "vc-core-engine-types.h" + +#ifdef DRM_USED +#include "drm-service-types.h" +#include "drm-service.h" +#endif + +#include +#include +#include +#include +#include + +#include "vconf.h" +#include "vconf-keys.h" +#ifdef CALL_DEBUG_ON_DLOG +#include +#endif + +/* Mcc */ +#define CALL_NETWORK_MCC_UK 234 /*UK = 234*/ +#define CALL_NETWORK_MCC_IRELAND 272 /*Ireland = 272*/ +#define CALL_NETWORK_MCC_UAE 424 /*UAE = 424*/ +#define CALL_NETWORK_MCC_GHANA 620 /*Ghana = 620*/ +#define CALL_NETWORK_MCC_ISRAEL 425 /*Israel = 425*/ +#define CALL_NETWORK_MCC_CROATIA 219 /*Croatia = 219*/ +#define CALL_NETWORK_MCC_SERBIA 220 /*Serbia = 220*/ +#define CALL_NETWORK_MCC_RUSSIA 250 /*Russia = 250*/ + +#define CALL_NETWORK_MCC_TAIWAN 466 /*Taiwan = 466*/ +#define CALL_NETWORK_MCC_HONGKONG 454 /*Hongkong = 454*/ +#define CALL_NETWORK_MCC_MALAYSIA 502 /*MALAYSIA = 502*/ +#define CALL_NETWORK_MCC_AUSTRALIA 505 /*Australia = 505*/ +#define CALL_NETWORK_MCC_NEWZEALAND 530 /*NewZealand = 530*/ + +#define CALL_NETWORK_MCC_USA 310 /*USA = 310*/ +#define CALL_NETWORK_MCC_CANADA 302 /*Canada = 302*/ +#define CALL_NETWORK_MCC_BRASIL 724 /*Brasil = 724*/ +#define CALL_NETWORK_MCC_MEXICO 334 /*Mexico = 334*/ +#define CALL_NETWORK_MCC_URGUAY 748 /*Urguay = 748*/ +#define CALL_NETWORK_MCC_COLOMBIA 732 /*Colombia = 732*/ +#define CALL_NETWORK_MCC_CHILE 730 /*Chile = 730*/ +#define CALL_NETWORK_MCC_PERU 716 /*Peru = 716*/ +#define CALL_NETWORK_MCC_VENEZUELA 734 /*Venezuela = 734*/ +#define CALL_NETWORK_MCC_GUATEMALA 704 /*Guatemala = 704*/ +#define CALL_NETWORK_MCC_ELSALVADOR 706 /*El Salvador = 706*/ +#define CALL_NETWORK_MCC_NICARAGUA 710 /*Nicaragua = 710*/ +#define CALL_NETWORK_MCC_PANAMA 714 /*Panama = 714*/ + +#define CALL_NETWORK_MCC_JAPAN 440 /*Japan = 440*/ +#define CALL_NETWORK_MCC_KOREA 450 /*Korae = 450*/ +#define CALL_NETWORK_MCC_CHINA 460 /*China = 460*/ + +#define CALL_NETWORK_MCC_FRANCE 208 /*France = 208*/ +#define CALL_NETWORK_MCC_PORTUGAL 268 /*Protugal = 268*/ +#define CALL_NETWORK_MCC_ROMANIA 226 /*Romania = 226*/ +#define CALL_NETWORK_MCC_DE 262 /*DE = 262(0x106)*/ + +#define CALL_NETWORK_MCC_TEST_USA 0x001 /*Test MMC*/ + +/* MNC */ +#define CALL_NETWORK_MNC_00 0 /*MNC 00*/ +#define CALL_NETWORK_MNC_01 1 /*MNC 01*/ +#define CALL_NETWORK_MNC_02 2 /*MNC 02*/ +#define CALL_NETWORK_MNC_03 3 /*MNC 03*/ +#define CALL_NETWORK_MNC_04 4 /*MNC 04*/ +#define CALL_NETWORK_MNC_05 5 /*MNC 05*/ +#define CALL_NETWORK_MNC_06 6 /*MNC 06*/ +#define CALL_NETWORK_MNC_07 7 /*MNC 07*/ +#define CALL_NETWORK_MNC_11 11 /*MNC 11 for +Movil in Panama*/ +#define CALL_NETWORK_MNC_20 20 /*MNC 20 for TELCEL in Mexico*/ +#define CALL_NETWORK_MNC_123 123 /*MNC 123 for Movistar in Colombia*/ +#define CALL_NETWORK_MNC_103 103 /*MNC 103 for TIGO in Colombia*/ +#define CALL_NETWORK_MNC_111 111 /*MNC 111 for TIGO in Colombia*/ +#define CALL_NETWORK_MNC_30 30 /*MNC 30 for Movistar in Nicaragua*/ +#define CALL_NETWORK_MNC_300 300 /*MNC 30 for Movistar in Nicaragua*/ +#define CALL_NETWORK_MNC_TEST_USA 0x01 /*Test MNC*/ + +#define IS_DIGIT(value) ((value) >= '0' && (value) <= '9') + +#ifdef CALL_DEBUG_ON_DLOG +#define ENG_ERR LOG_ERROR +#define ENG_WARN LOG_WARN +#define ENG_DEBUG LOG_DEBUG +#else +#define ENG_ERR +#define ENG_WARN +#define ENG_DEBUG +#endif + +#ifdef CALL_DEBUG_ON_DLOG +#define CALL_ENG_DEBUG(level, frmt, args...) \ + do {LOG(level, TAG_CALL, "[VC_ENGINE] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#define CALL_ENG_KPI(frmt, args...) \ + do {LOG(LOG_DEBUG, TAG_CALL_LAUNCH, "[VC_KPI] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#else +#define CALL_ENG_DEBUG(level, fmt, args...) +#endif + +#define VOICECALL_RETURN_IF_FAIL(check_condition) \ + if (!(check_condition)) return; + +#define VOICECALL_RETURN_FALSE_IF_FAIL(check_condition) \ + if (!(check_condition)) return FALSE; + +#define VOICECALL_RETURN_VALUE_IF_FAIL(check_condition, value) \ + if (!(check_condition)) return value; + +#define VOICECALL_RETURN_NULL_IF_FAIL(check_condition) \ + if (!(check_condition)) return NULL; + +#define VOICECALL_RETURN_ZERO_IF_FAIL(check_condition) \ + if (!(check_condition)) return 0; + +#define VOICECALL_RETURN_INVALID_IF_FAIL(check_condition) \ + if (!(check_condition)) return -1; + +#define VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(value, min_value, max_value, ret_val) \ + if ((value < min_value) || (value > max_value)) return ret_val; + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif /*#ifndef min*/ + +typedef unsigned int call_vc_handle; + +/** + * This enumeration defines SS's SI vaild types + */ +typedef enum { + SS_SI_FORMAT_INVALID = -1, /**< SI format is invalid */ + SS_SI_FORMAT_VALID /**< SI format is valid */ +} call_vc_ss_si_format; + +/** + * This enumeration defines the publish types + */ +typedef enum { + CALL_VC_SAT_RESPONSE /**< SAT response publish type */ +} call_vc_publish_type_t; + +/** + * This enum defines the type of power mode. + */ +typedef enum { + CALL_VC_POWER_NONE = 0, + CALL_VC_POWER_GRANT_DIMMING, + CALL_VC_POWER_GRANT_LCDOFF, + CALL_VC_POWER_GRANT_SLEEP, + CALL_VC_POWER_PROHIBIT_DIMMING, + CALL_VC_POWER_PROHIBIT_LCDOFF, + CALL_VC_POWER_PROHIBIT_SLEEP, + CALL_VC_POWER_NORMAL_STATUS +} call_vc_power_mode_t; + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] src Telehone number from which call number needd to be parsed + * @param[out] dst Pointer to the buffer to store the parsed number + */ +gboolean _vc_core_util_remove_invalid_chars(const char *src, char *dst); + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pszTelNumber Telehone number from which call number nned to be extracted + * @param[out] pBuffer Pointer to the buffer to store the extracted number + * @param[in] nBufSize Size of input buffer + */ +gboolean _vc_core_util_extract_call_number(const char *pszTelNumber, char *pBuffer, const int nBufSize); +gboolean _vc_core_util_extract_call_number_without_cli(const char *pszTelNumber, char *pBuffer, const int nBufSize); + +#ifdef TIMER_CHECK /*unused*/ +void call_vc_print_elapsed_time(char *string, gulong * tim_out); +void call_vc_print_diff_time(time_t time1, time_t time2); +#endif + +/** + * This function checks whether the given number is SS string or not + * + * @return TRUE if the number is SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_ss_string(const char *pNumber); + +/** + * This function checks whether the given number is SS string or not + * + * @return TRUE if the number is in call SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_incall_ss_string(const char *number); + +/** +* This function extracts the dtmf number from the given telephone number +* +* @param[in] tel_number source telephone number +* @param[out] dtmf_number extracted dtmf number +* @param[out] dtmf_buf_len size of dtmf number buffer +*/ +gboolean _vc_core_util_extract_dtmf_number(const char *tel_number, char *dtmf_number, const int dtmf_buf_len); + +/** + * This function checks whether the given number ia a valid dtmf number or not + * + * @return TRUE if the number can be used for sending dtmf , FALSE otherwise + * @param[in] pnumber number to be verified + */ +gboolean _vc_core_util_isvalid_dtmf_number(char *pnumber); + +/** +* This function checks whether the entire dtmf string is valid or not +* +* @return TRUE if the number can be used for sending dtmf , FALSE otherwise +* @param[in] pnumber number to be verified +*/ +gboolean _vc_core_util_isvalid_full_dtmf_number(char *pnumber); + +/** +* This function checks the validity of the given string for SS string +* +* @return Returns SS_SI_FORMAT_INVALID - if the string is invalid ss string, SS_SI_FORMAT_VALID - if valid +* @param[in] pinput_string string to be verified +*/ +call_vc_ss_si_format _vc_core_util_check_si_format(const char *pinput_string); + +/** +* This function checks the validity of the given telephone number +* +* @return TRUE if the given number is valid telephone number, FALSE otherwise +* @param[in] ptel_number telephone number to be verified +*/ +gboolean _vc_core_util_isvalid_telephone_number(char *ptel_number); + +/** +* This function checks the if it is GCF mode or not +* +* @return TRUE if it is GCF mode, FALSE otherwise +*/ +gboolean _vc_core_util_check_gcf_status(void); + +/** +* This function checks the if it is in zuhause area or not +* +* @return TRUE if it is in zuhause area, FALSE otherwise +*/ +gboolean _vc_core_util_check_zuhause_status(void); + +/** +* This function retreive mcc information from the telephony +* +* @internal +* @return TRUE on success, FALSE - otherwise +* @param[out] mcc mcc information to be retreived +*/ +gboolean _vc_core_util_get_mcc(unsigned long *mcc); + +/** +* This function retreive mnc information from the telephony +* +* @internal +* @return TRUE on success, FALSE - otherwise +* @param[out] mnc mnc information to be retreived +*/ +gboolean _vc_core_util_get_mnc(unsigned long *mnc); + + +gboolean _vc_core_util_set_call_status(int call_status); +gboolean _vc_core_util_check_video_call_status(void); +gboolean _vc_core_util_get_SAP_status(); +void _vc_core_util_get_cug_info(voicecall_setup_info_t *psetupcall_info); +void _vc_core_util_get_identity_mode(voicecall_setup_info_t *psetupcall_info); +gboolean _vc_core_util_is_pwlock(void); +gboolean _vc_core_util_get_nw_status(int *network_status); +gboolean _vc_core_util_strcpy(char *pbuffer, int buf_count, const char *pstring); + +/** + * This function check phone lock status + * + * @return Returns whether phone is locked or not. + * @param[in] void + */ +gboolean _vc_core_util_phonelock_status(void); + +void _vc_core_util_download_test_call(char *result); + +gboolean _vc_core_util_set_call_volume(int vol_level); +int _vc_core_util_get_call_volume(void); +#endif /* __VC_CORE_UTIL_H_ */ diff --git a/call-engine/core/vc-core-callagent.c b/call-engine/core/vc-core-callagent.c new file mode 100755 index 0000000..7a61b99 --- /dev/null +++ b/call-engine/core/vc-core-callagent.c @@ -0,0 +1,590 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "vc-core-callagent.h" +#include "vc-core-engine.h" +#include "vc-core-ccbs.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-svcall.h" +#include + +/* For Debug Information, Inout state name string constant */ +char *gszcall_vc_inout_state[VC_INOUT_STATE_MAX_NUM] = { + "NONE", + "OUTGOING_START", + "OUTGOING_WAIT_HOLD", + "OUTGOING_WAIT_ORIG", + "OUTGOING_WAIT_ALERT", + "OUTGOING_WAIT_CONNECTED", + "OUTGOING_WAIT_RELEASE", + "OUTGOING_ABORTED", + "OUTGOING_SHOW_REDIALCAUSE", + "OUTGOING_WAIT_REDIAL", + "OUTGOING_SHOW_RETRY_CALLBOX", + "OUTGOING_END", + "INCOME_SELFEVENT_WAIT", + "INCOME_START", + "INCOME_BOX", + "INCOME_WAIT_REDIRECTCNF", + "INCOME_WAIT_REDIRECT_END", + "INCOME_WAIT_CONNECTED", + "INCOME_WAIT_HOLD_CONNECTED", + "INCOME_WAIT_RELEASE_ACTIVE_CONNECTED", + "INCOME_WAIT_HOLD", + "INCOME_WAIT_RELEASE_ACTIVECALL", + "INCOME_WAIT_RELEASE_HOLDCALL", + "INCOME_WAIT_RELEASE", + "INCOME_END" +}; + +/* For Debug Information, Call Agent State name string constant */ +char *gszcall_vc_ca_state[CALL_VC_CA_STATE_MAX_NUM] = { + "CA_STATE_NORMAL", + "CA_STATE_SPLIT_CALLBOX", + "CA_STATE_WAIT_SPLIT", + "CA_STATE_DROP_CALLBOX", + "CA_STATE_WAIT_DROP", + "CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE", + "CA_STATE_WAIT_SWAP_HOLD", + "CA_STATE_WAIT_SWAP_ACTIVATE", + "CA_STATE_WAIT_SWAP", + "CA_STATE_WAIT_HOLD", + "CA_STATE_WAIT_UNHOLD", + "CA_STATE_WAIT_JOIN", + "CA_STATE_WAIT_TRANSFER_CNF", + "CA_STATE_WAIT_TRANSFER_CALLEND", + "CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL", + "CA_STATE_WAIT_RELEASE_ALL_HOLDCALL", + "CA_STATE_SENDMSG_CALLBOX", + "CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX", + "CA_STATE_SAVE_TO_CONTACT_CALLBOX", + "CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL", + "CA_STATE_WAIT_RELEASE_ALL_CALLS", + "CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP", + "CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL" +}; + +/** + * This function intializes the call agent + * + * @return Pointer to call agent state. + */ +call_vc_callagent_state_t *_vc_core_ca_init_agent() +{ + call_vc_callagent_state_t *pcall_agent = NULL; + pcall_agent = (call_vc_callagent_state_t *)calloc(1, sizeof(call_vc_callagent_state_t)); + if (NULL == pcall_agent) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Engine Initialization Failed: MEM ALLOC Failure"); + return NULL; + } + + /*Initialize Call Manager */ + _vc_core_call_manager_init(&pcall_agent->call_manager); + + /* Initialize Call Agent Flags */ + _vc_core_ca_init_data(pcall_agent); + +#ifdef _CCBS_DEFINED_ + /* Init CCBS Info */ + _vc_core_init_ccbs_info(pcall_agent); +#endif + + /* Init CPHS Info */ +#ifdef _CPHS_DEFINED_ + _vc_core_svcall_init_cphs_info(pcall_agent); +#endif + return pcall_agent; +} + +/** + * This function intializes the callagent data + * + * @return void + * @param[in] pagent Pointer to the call agent structure + */ +void _vc_core_ca_init_data(call_vc_callagent_state_t *pagent) +{ + VOICECALL_RETURN_IF_FAIL(pagent != NULL); + pagent->callagent_state = CALL_VC_CA_STATE_NORMAL; + pagent->io_state = VC_INOUT_STATE_NONE; + pagent->bis_no_sim = FALSE; + pagent->aoc_ppm = VC_INVALID_PPM; +} + +/** + * This function finalizes the call agent + * + * @return Returns void + * @param[in] pcall_agent Pointer to the call agent structure + */ +void _vc_core_ca_finish_agent(call_vc_callagent_state_t *pcall_agent) +{ + if (NULL != pcall_agent) { + free(pcall_agent); + pcall_agent = NULL; + } +} + +/** + * This function changes the in out state of the call agent + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pagent Pointer to the call agent structure + * @param[in] new_state The new i/o state that should be set + * @see _vc_core_ca_change_agent_state + */ +gboolean _vc_core_ca_change_inout_state(call_vc_callagent_state_t *pagent, voicecall_inout_state_t new_state) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + + CALL_ENG_DEBUG(ENG_ERR, "%s(%d) --> %s(%d)", gszcall_vc_inout_state[pagent->io_state], pagent->io_state, gszcall_vc_inout_state[new_state], new_state); + pagent->io_state = new_state; + return TRUE; +} + +/** + * This function changes the in call agent state + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pAgent Pointer to the call agent structure + * @param[in] new_state The new call agent state that should be set + * @see _vc_core_ca_change_inout_state + */ +gboolean _vc_core_ca_change_agent_state(call_vc_callagent_state_t *pAgent, call_vc_ca_state_t new_state) +{ + VOICECALL_RETURN_FALSE_IF_FAIL((new_state >= CALL_VC_CA_STATE_NORMAL && new_state < CALL_VC_CA_STATE_MAX_NUM)); + CALL_ENG_DEBUG(ENG_DEBUG, "%s(%d) --> %s(%d)", gszcall_vc_ca_state[pAgent->callagent_state], pAgent->callagent_state, gszcall_vc_ca_state[new_state], new_state); + pAgent->callagent_state = new_state; + return TRUE; +} + +/** + * This function checks if all the call members have terminated or not + * + * @return Returns TRUE if no call members exist, FALSE otherwise + * @param[in] pAgent Pointer to the call agent structure + */ +gboolean _vc_core_ca_check_end(call_vc_callagent_state_t *pAgent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pAgent != NULL); + if ((_vc_core_cm_get_call_member_count(&pAgent->call_manager) == 0) && (pAgent->io_state == VC_INOUT_STATE_NONE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "TRUE"); + result = TRUE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "FALSE"); + result = FALSE; + } + return result; +} + + +/** + * This function sends the response to the SAT engine + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pagent Pointer to the call agent structure + * @param[in] sat_rqst_resp_type sat rquest/response type used by the client + * @param[in] sat_response_type response to be sent to sat + */ +gboolean _vc_core_ca_send_sat_response(call_vc_callagent_state_t *pagent, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type) +{ + call_vc_satsetup_info_t *pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + TelSatAppsRetInfo_t call_vc_sat_response = {0,}; + TapiResult_t error_code; + CALL_ENG_DEBUG(ENG_DEBUG, "sat_rqst_resp_type: %d, sat_response_type: %d", sat_rqst_resp_type, sat_response_type); + switch (sat_rqst_resp_type) { + case SAT_RQST_SETUP_CALL: + { + TelSatCallRetInfo_t sat_engine_ret_call = {0,}; + switch (sat_response_type) { + case CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_call.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_ME_BUSY_ON_CALL; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_call.resp = TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND; + sat_engine_ret_call.bIsTapiCauseExist = TRUE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_BUSY; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_NO_SERVICE; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND_WITHOUT_CAUSE: + sat_engine_ret_call.resp = TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_NO_SPECIFIC_CAUSE; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_ME_CONTROL_PERMANENT_PROBLEM: + sat_engine_ret_call.resp = TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_ACCESS_CONTROL_CLASS_BAR; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_ACTION_NOT_ALLOWED; + break; + case CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN: + sat_engine_ret_call.resp = TAPI_SAT_R_USER_CLEAR_DOWN_CALL_BEFORE_CONN; + sat_engine_ret_call.bIsTapiCauseExist = FALSE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_UNKNOWN; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_ME_BUSY_ON_CALL; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + case CALL_VC_ME_RET_SUCCESS: + sat_engine_ret_call.resp = TAPI_SAT_R_SUCCESS; + sat_engine_ret_call.bIsTapiCauseExist = TRUE; + sat_engine_ret_call.tapiCause = TAPI_CAUSE_SUCCESS; + sat_engine_ret_call.meProblem = TAPI_SAT_ME_PROBLEM_NO_SPECIFIC_CAUSE; + sat_engine_ret_call.bIsOtherInfoExist = FALSE; + sat_engine_ret_call.permanentCallCtrlProblem = TAPI_SAT_CC_PROBLEM_NO_SPECIFIC_CAUSE; + break; + default: + return FALSE; + break; + } + call_vc_sat_response.commandType = TAPI_SAT_CMD_TYPE_SETUP_CALL; + call_vc_sat_response.commandId = pcall_vc_satcall_info->satengine_setupcall_data.commandId; + memset(&(call_vc_sat_response.appsRet.setupCall), 0, sizeof(call_vc_sat_response.appsRet.setupCall)); + memcpy(&(call_vc_sat_response.appsRet.setupCall), &sat_engine_ret_call, sizeof(call_vc_sat_response.appsRet.setupCall)); + } + break; + case SAT_RQST_SEND_DTMF: + { + TelSatDtmfRetInfo_t sat_engine_ret_dtmf; + switch (sat_response_type) { + case CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + break; + case CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND; + break; + case CALL_VC_ME_CONTROL_PERMANENT_PROBLEM: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM; + break; + case CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_USER_CLEAR_DOWN_CALL_BEFORE_CONN; + break; + case CALL_VC_ME_RET_SUCCESS: + sat_engine_ret_dtmf.resp = TAPI_SAT_R_SUCCESS; + break; + default: + return FALSE; + break; + } + call_vc_sat_response.commandType = TAPI_SAT_CMD_TYPE_SEND_DTMF; + call_vc_sat_response.commandId = pcall_vc_satcall_info->satengine_dtmf_data.commandId; + memset(&(call_vc_sat_response.appsRet.sendDtmf), 0, sizeof(call_vc_sat_response.appsRet.sendDtmf)); + memcpy(&(call_vc_sat_response.appsRet.sendDtmf), &sat_engine_ret_dtmf, sizeof(call_vc_sat_response.appsRet.sendDtmf)); + + /*Reset SAT DATA after sending response */ + pcall_vc_satcall_info->satengine_dtmf_data.bIsHiddenMode = FALSE; + CALL_ENG_DEBUG(ENG_ERR, "SAT Hidden mode has been reset"); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid SAT Rquest Response Type"); + break; + } + + error_code = tel_send_sat_app_exec_result(pagent->tapi_handle, &call_vc_sat_response); + if (error_code != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "Error tel_send_sat_app_exec_result():%#X", error_code); + return FALSE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_send_sat_app_exec_result: Success"); + } + + return TRUE; +} + +/** + * This function checks whether outgoing call is possible + * + * @return This function returns TRUE if outgoing call is possible or else FALSE + * @param[in] pagent Pointer to the call agent structure + * @param[in] bemergency_number TRUE - if outgoing call being made is emergency call or else FALSE + */ +gboolean _vc_core_ca_is_mocall_possible(call_vc_callagent_state_t *pagent, gboolean bemergency_number) +{ + gboolean bactive_call = FALSE; + gboolean bheld_call = FALSE; + int member_num = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + bactive_call = _vc_core_cm_isexists_active_call(&pagent->call_manager); + bheld_call = _vc_core_cm_isexists_held_call(&pagent->call_manager); + if (pagent->io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "io_state=%d with FALSE ..", pagent->io_state); + return FALSE; + } + + /* If it is emergency number, the call can be made by disconnecting all calls */ + if (bemergency_number) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency number with TRUE.."); + return TRUE; + } + + /* Mo is impossile when both active and hold call exist */ + if (bactive_call && bheld_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "ended with FALSE .."); + return FALSE; + } + + else { + member_num = _vc_core_cm_get_call_member_count(&pagent->call_manager); + +#ifdef _CPHS_DEFINED_ + if (bactive_call && _vc_core_svcall_cphs_csp_get_status(VC_CPHS_CSP_HOLD) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_svcall_cphs_csp_get_status : Hold is not possible"); + return FALSE; + } +#endif /* */ + /* Mo is impossile when member is more than max */ + if (member_num >= (VC_MAX_CALL_GROUP_MEMBER + 1)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_ca_is_mocall_possible: ended with FALSE .."); + return FALSE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_ca_is_mocall_possible: ended with TRUE .."); + return TRUE; + } + } + return FALSE; +} + +/** + * This function ends all the active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pagent Handle to voicecall engine + */ +gboolean _vc_core_ca_end_active_calls(call_vc_callagent_state_t *pagent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + if (TRUE == _vc_core_cm_isexists_active_call(&pagent->call_manager)) { + result = _vc_core_tapi_rqst_release_active_calls(pagent); + if (TRUE == result) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL); + } + } + return result; +} + +/** + * This function ends all the calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pagent Handle to voicecall engine + */ +gboolean _vc_core_ca_end_all_calls(call_vc_callagent_state_t *pagent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + result = _vc_core_tapi_rqst_release_all_calls(pagent); + if (TRUE == result) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS); + } + return result; +} + +/** + * This function ends all the held calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pagent Handle to voicecall engine + */ +gboolean _vc_core_ca_end_held_calls(call_vc_callagent_state_t *pagent) +{ + gboolean result = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + if (TRUE == _vc_core_cm_isexists_held_call(&pagent->call_manager)) { + result = _vc_core_tapi_rqst_release_held_calls(pagent); + if (TRUE == result) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + } + return result; +} + +/** + * This function checks whether private call is possible or not + * + * @return This function returns TRUE if private is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_ca_is_private_call_possible(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_calls = FALSE, held_calls = FALSE; + int active_call_member = 0; + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + active_call_member = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager); + if (TRUE == active_calls && FALSE == held_calls) { + if (active_call_member > 1) { + return TRUE; + } + } + return FALSE; +} + +/** + * This function checks whether call transfer is possible + * + * @return This function returns TRUE if transfer is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_ca_is_transfer_call_possible(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + int total_call_member = 0; + +#ifdef _CPHS_DEFINED_ + if (FALSE == _vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_CT)) { + return FALSE; + } +#endif /* */ + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + total_call_member = _vc_core_cm_get_call_member_count(&pcall_agent->call_manager); + + /* The Explicit Call Transfer (ECT) function should be invoked in association with two existing calls which 1) one is answered and in the held state and 2) the other is answered and active or alerting. */ + if (3 == total_call_member) { + if ((TRUE == active_calls) && (TRUE == held_calls) && (VC_INVALID_CALL_INDEX != pcall_agent->call_manager.mtcall_index)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer possible..1 active, 1 held, 1 waiting.."); + return TRUE; + } + } + + else if (2 == total_call_member) { + if ((TRUE == active_calls) && (TRUE == held_calls) && (VC_INVALID_CALL_INDEX == pcall_agent->call_manager.mtcall_index)) { + return TRUE; + } + + else if ((FALSE == active_calls) && (TRUE == held_calls) && (VC_INVALID_CALL_INDEX != pcall_agent->call_manager.mtcall_index)) { + return TRUE; + } + + else if ((FALSE == active_calls) && (TRUE == held_calls) && (-1 != pcall_agent->call_manager.setupcall_info.mocall_index) /*Outgoing call exists */ + && (VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pcall_agent->io_state)) { + return TRUE; + } + } + return FALSE; +} + +/** + * This function checks whether conference call is possible + * + * @return This function returns TRUE if transfer is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_ca_is_conf_call_possible(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + int total_call_member = 0; + +#ifdef _CPHS_DEFINED_ + if (FALSE == _vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_MPTY)) { + return FALSE; + } +#endif /* */ + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + total_call_member = _vc_core_cm_get_call_member_count(&pcall_agent->call_manager); + + /* Joining call is impossile when active or hold call doesn't exist */ + if ((FALSE == active_calls) || (FALSE == held_calls)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Join Impossible..."); + return FALSE; + } + + else { + + /*Joining call is impossile when member is more than max + * if ( total_call_member >= (CALL_VC_CALL_GROUP_MEMBER_MAX + 1)) : Max Number in Group + Another Call*/ + if (total_call_member > VC_MAX_CALL_GROUP_MEMBER) { /*Logic Changed from above line for same condition */ + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with FALSE..."); + return FALSE; + } + + else { + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with TRUE..."); + return TRUE; + } + } + return FALSE; +} + +/** + * This function clears the data of a connected call givenits call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to voicecall engine + * @param[in] call_handle Call handle of the connected call to be cleared + */ +gboolean _vc_core_ca_clear_connected_call(call_vc_callagent_state_t *pcall_agent, int call_handle) +{ + call_vc_call_objectinfo_t call_object; + gboolean remove = FALSE; + int group_index = -1; + int grp_mem_num = 0; + int i = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle >= 0); + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &call_object); + group_index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, (call_vc_handle) call_handle); + if (group_index == -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR: Not exist"); + return FALSE; + } + grp_mem_num = _vc_core_cm_get_member_count_ingroup(&pcall_agent->call_manager, group_index); + for (i = 0; i < grp_mem_num; i++) { + if ((_vc_core_cm_get_call_state_ingroup_byposition(&pcall_agent->call_manager, group_index, i) != VC_CALL_STATE_ENDED) && (_vc_core_cm_get_call_state_ingroup_byposition(&pcall_agent->call_manager, group_index, i) != VC_CALL_STATE_ENDED_FINISH)) { + remove = TRUE; + } + } + if (remove) { + _vc_core_cm_remove_call_object(&pcall_agent->call_manager, call_handle); + } + + else { + gboolean clear_end_call = TRUE; + _vc_core_cm_change_call_state(&call_object, VC_CALL_STATE_ENDED_FINISH); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &call_object); + for (i = 0; i < grp_mem_num; i++) { + if (_vc_core_cm_get_call_state_ingroup_byposition(&pcall_agent->call_manager, group_index, i) != VC_CALL_STATE_ENDED_FINISH) + clear_end_call = FALSE; + } + if (clear_end_call) { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + } + } + return TRUE; +} diff --git a/call-engine/core/vc-core-callmanager.c b/call-engine/core/vc-core-callmanager.c new file mode 100644 index 0000000..071e924 --- /dev/null +++ b/call-engine/core/vc-core-callmanager.c @@ -0,0 +1,1912 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include "vc-core-util.h" +#include "vc-core-callmanager.h" +#include "vc-core-callagent.h" + +char *gaszCallStateName[VC_CALL_STATE_MAX_NUM] = { + "CALL_NONE", + "CALL_INCOME", + "CALL_REJECTED", + "CALL_PREPARE_OUTGOING", + "CALL_OUTGOING", + "CALL_OUTGOING_ORIG", + "CALL_OUTGOING_ALERT", + "CALL_CANCELLED", + "CALL_CONNECTED", + "CALL_RELEASE_WAIT", + "CALL_ENDED", + "CALL_REDIAL", + "CALL_ENDED_FINISH", +}; + +/*Local Function Declarations*/ +/** +* This function handles sat engine notification +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] callStatusInfo Handle to call manager +* @param[in] call_handle telephony call handle +* @param[out] pGroup group to which the call_handle belongs +* @param[in] pPos positoin in the pGroup in which the call details of call handle is maintained +*/ +static gboolean __call_vc_cm_gp_get_groupcall_pos(call_vc_manager_t *callStatusInfo, call_vc_handle call_handle, int *pGroup, int *pPos); + +/** + * This function removes a call member to a group + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle The call handle to be removed + * @see _vc_core_cm_add_call_member_togroup + */ +static gboolean __vc_core_cm_remove_call_member_fromgroup(call_vc_manager_t *pMng, call_vc_handle call_handle); + +/*Function Definitions*/ +/** + * This function initializes the call manager + * + * @return void + * @param[out] pMng Pointer to the call manager structure + */ +void _vc_core_call_manager_init(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_IF_FAIL(pMng != NULL); + int index = 0; + + memset(pMng, 0, sizeof(call_vc_manager_t)); + + /* init call handle */ + for (index = 0; index < VC_MAX_CALL_MEMBER; index++) { + /*CALL_ENG_DEBUG(ENG_DEBUG, "%d",index);*/ + pMng->callobject_info[index].call_handle = VC_TAPI_INVALID_CALLHANDLE; + pMng->callobject_info[index].aoc_ccm = VC_INVALID_CALL_COST; + pMng->callobject_info[index].call_id = VC_INVALID_CALL_ID; + pMng->callobject_info[index].call_type = VC_CALL_ORIG_TYPE_NORMAL; + } + + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.call_control_type = CALL_VC_SAT_CC_NONE; + pMng->mtcall_index = VC_INVALID_CALL_INDEX; + + CALL_ENG_DEBUG(ENG_DEBUG, "[pMng->callobject_info initialized]"); + +} + +/** + * This function clears the information of a given call state + * + * @return void + * @param[in] pcall_object Pointer to the call object which has to be cleared + */ +void _vc_core_cm_clear_call_object(call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_IF_FAIL(pcall_object != NULL); + memset(pcall_object, 0, sizeof(call_vc_call_objectinfo_t)); + + pcall_object->state = VC_CALL_STATE_NONE; + pcall_object->call_handle = VC_TAPI_INVALID_CALLHANDLE; + pcall_object->aoc_ccm = VC_INVALID_CALL_COST; + pcall_object->call_id = VC_INVALID_CALL_ID; + pcall_object->call_type = VC_CALL_ORIG_TYPE_NORMAL; + +#ifdef _CPHS_DEFINED_ + pcall_object->alsLine = VC_CALL_CPHS_ALS_NONE; +#endif + + pcall_object->bccbs_call = FALSE; + +} + +/** +* This function clears the information of the callobject available in the given index + * +* @return TRUE, if the object cleared, otherwise FALSE +* @param[in] pMng Pointer to the call manager structure +* @param[in] index Index of the call object to be cleared + */ +gboolean _vc_core_cm_clear_call_object_byindex(call_vc_manager_t *pMng, int index) +{ + call_vc_call_objectinfo_t call_object; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(index >= 0 && index <= 7); + + if (TRUE == _vc_core_cm_get_call_object_byindex(pMng, index, &call_object)) { + _vc_core_cm_clear_call_object(&call_object); + return TRUE; + } + + return FALSE; +} + +/** + * This function adds the given call object info to a free slot. + * + * @return This function returns the call object index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure that need to be added + * @see _vc_core_cm_set_call_object, _vc_core_cm_remove_call_object + */ +int _vc_core_cm_add_call_object(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + int index = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pcall_object != NULL); + + for (index = 0; index < VC_MAX_CALL_MEMBER; index++) { + if (pMng->callobject_info[index].state == VC_CALL_STATE_NONE) { + memcpy(&pMng->callobject_info[index], pcall_object, sizeof(call_vc_call_objectinfo_t)); + return index; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Insufficient buffer i = %d..", index); + + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function removes the specified call object info of a given call handle + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Handle of the call object to be removed + * @see _vc_core_cm_add_call_object, _vc_core_cm_set_call_object + */ +gboolean _vc_core_cm_remove_call_object(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int groupIndex = -1; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + CALL_ENG_DEBUG(ENG_DEBUG, "[Call Handle = %d]", call_handle); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == call_handle) { + if (pMng->setupcall_info.mocall_index == i) { + CALL_ENG_DEBUG(ENG_DEBUG, "Removing MO Call Info >> i=%d", i); + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.no_service_state = FALSE; + } else if (pMng->mtcall_index == i) { + CALL_ENG_DEBUG(ENG_DEBUG, "Removing MT Call Info >> i=%d", i); + pMng->mtcall_index = VC_INVALID_CALL_INDEX; + } else { + groupIndex = _vc_core_cm_get_group_index(pMng, call_handle); + __vc_core_cm_remove_call_member_fromgroup(pMng, call_handle); + } + _vc_core_cm_clear_call_object(&(pMng->callobject_info[i])); + break; + } + + } + + return TRUE; +} + +/** + * This function retrieves the given call object info + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Call handle of the object info to be retrieved + * @param[out] pcall_object Pointer to the call object info structure that should be retrieved + * @see _vc_core_cm_add_call_object, _vc_core_cm_remove_call_object, _vc_core_cm_set_call_object + */ +gboolean _vc_core_cm_get_call_object(call_vc_manager_t *pMng, call_vc_handle call_handle, call_vc_call_objectinfo_t *pcall_object) +{ + int i = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == call_handle) { + memcpy(pcall_object, &pMng->callobject_info[i], sizeof(call_vc_call_objectinfo_t)); + return TRUE; + } + } + + return FALSE; +} + +/** + * This function retrieves the given call object info + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] index index of the object info to be retrieved + * @param[out] pcall_object Pointer to the call object info structure that should be retrieved + * @see _vc_core_cm_add_call_object, _vc_core_cm_remove_call_object, _vc_core_cm_set_call_object + */ +gboolean _vc_core_cm_get_call_object_byindex(call_vc_manager_t *pMng, int index, call_vc_call_objectinfo_t *pcall_object) +{ + int i = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(index >= 0 && index <= 7); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (i == index) { + memcpy(pcall_object, &pMng->callobject_info[i], sizeof(call_vc_call_objectinfo_t)); + return TRUE; + } + } + + return FALSE; +} + +/** + * This function retrieves the call state of a given call handle + * + * @return This function returns the call state + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Call handle for which the state has to be retrieved + */ +voicecall_call_state_t _vc_core_cm_get_call_state(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, VC_CALL_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE, VC_CALL_STATE_NONE); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == call_handle) { + return pMng->callobject_info[i].state; + } + } + + return VC_CALL_STATE_NONE; +} + + /** + * This function retrieves the number of call members in various states of a call + * + * @return Number of call members available + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_call_member_count(call_vc_manager_t *pMng) +{ + int i = 0; + int nCount = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].state != VC_CALL_STATE_NONE) + nCount++; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "%d", nCount); + + return nCount; +} + +/** + * This function sets the given call object info to the given slot + * + * @return This function returns the call object index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure that need to be modified + * @see _vc_core_cm_add_call_object, _vc_core_cm_remove_call_object, _vc_core_cm_get_call_object + */ +int _vc_core_cm_set_call_object(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + int i = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pcall_object != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_handle == pcall_object->call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Call Handle = %d]", pcall_object->call_handle); + memcpy(&pMng->callobject_info[i], pcall_object, sizeof(call_vc_call_objectinfo_t)); + return i; + } + } + + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function returns the number of calls in a given call state + * + * @return This function returns the number of calls in the given state + * @param[in] pMng Pointer to the call manager structure + * @param[in] state The call state the number of which has to be retrieved + */ +int _vc_core_cm_get_call_state_num(call_vc_manager_t *pMng, voicecall_call_state_t state) +{ + int i = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].state == state) { + count++; + } + } + return count; +} + +static gboolean __call_vc_cm_gp_get_groupcall_pos(call_vc_manager_t *callStatusInfo, call_vc_handle call_handle, int *pGroup, int *pPos) +{ + int group = 0; + int pos = 0; + gboolean bFound = FALSE; + call_vc_groupinfo_t *pcall_group_info = NULL; + call_vc_call_objectinfo_t *pcall_object_info = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(callStatusInfo != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_FALSE_IF_FAIL(pGroup != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pPos != NULL); + + /*Optimization: Avoiding Long dereferencing inside loops */ + pcall_group_info = callStatusInfo->callgroup_info; + pcall_object_info = callStatusInfo->callobject_info; + for (group = 0; group < CALL_VC_CALL_GROUP_MAX; group++) { + CALL_ENG_DEBUG(ENG_DEBUG, "callStatusInfo->callgroup_info[%d].num:%d", group, callStatusInfo->callgroup_info[group].num); + for (pos = 0; pos < pcall_group_info[group].num; pos++) { + int v = pcall_group_info[group].callobject_index[pos]; + if (pcall_object_info[v].call_handle == call_handle) { + bFound = TRUE; + break; + } + } + if (bFound) + break; + } + + if (bFound == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail to get"); + return FALSE; + } + + *pGroup = group; + *pPos = pos; + + return TRUE; + +} + +/** + * This function adds a call member to a group + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] callobject_index The object index of the call object to be added + * @see __vc_core_cm_remove_call_member_fromgroup + */ +gboolean _vc_core_cm_add_call_member_togroup(call_vc_manager_t *pMng, int callobject_index) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state == CALL_VC_GROUP_STATE_NONE); + + CALL_ENG_DEBUG(ENG_DEBUG, "member index=%d", callobject_index); + + /* Every Member should be added to a new group when added for the first time. First check whether Group 0 has any members. + If Group 0 has any previous members then move all members in the Group 0 to Group 1 and Group 0 must be in held state + as the current call is going to be active in the new group. Then add this new call to the Group 0 and Group 0 becomes active group */ + if (pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state != CALL_VC_GROUP_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Copying Group 0 data to Group 1"); + VOICECALL_RETURN_FALSE_IF_FAIL(pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state == CALL_VC_GROUP_STATE_HOLD); + memcpy(&(pMng->callgroup_info[CALL_VC_CALL_GROUP_1]), &(pMng->callgroup_info[CALL_VC_CALL_GROUP_0]), sizeof(call_vc_groupinfo_t)); + } + + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num = 1; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[0] = callobject_index; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_ACTIVE; + + /*If the currently added call is Incoming or Outgoing call then make the Incoming/Outgoing status + invalid since the call has been connected and added to call group */ + if (callobject_index == pMng->setupcall_info.mocall_index) { + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.no_service_state = FALSE; + } else if (callobject_index == pMng->mtcall_index) { + pMng->mtcall_index = VC_INVALID_CALL_INDEX; + } else { + return FALSE; + } + + return TRUE; + +} + +/** + * This function removes a call member to a group + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle The call handle to be removed + * @see _vc_core_cm_add_call_member_togroup + */ +gboolean __vc_core_cm_remove_call_member_fromgroup(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int group = 0; + int pos = 0; + int i = 0; + call_vc_groupinfo_t *pcall_group_info = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + /*Findout the Index Group number and the index posistion in the group for the given call handle */ + if (__call_vc_cm_gp_get_groupcall_pos(pMng, call_handle, &group, &pos) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail to remove"); + return FALSE; + } + + /*Optimization: Avoiding Long dereferencing inside loops */ + pcall_group_info = pMng->callgroup_info; + for (i = pos + 1; i < pMng->callgroup_info[group].num; i++) { + pcall_group_info[group].callobject_index[i - 1] = pcall_group_info[group].callobject_index[i]; + } + + pcall_group_info[group].num--; + + /*If the number of members in the group become 0, then make the group status to none */ + if (pcall_group_info[group].num == 0) { + pcall_group_info[group].state = CALL_VC_GROUP_STATE_NONE; + + /*If Group 0 becomes none and Group 1 has any members , then move the Group 1 members to Group 0 + Always the Group 0 is prefered group by default, this logic is to simplify all other search mehods. */ + if ((group == 0) && (pcall_group_info[CALL_VC_CALL_GROUP_1].num > 0)) { + memcpy(&(pcall_group_info[0]), &(pcall_group_info[1]), sizeof(call_vc_groupinfo_t)); + memset(&(pcall_group_info[1]), 0, sizeof(call_vc_groupinfo_t)); + } + } + + return TRUE; + +} + +/** + * This function clears the call object information of the ended and finished calls + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + */ +gboolean _vc_core_cm_clear_endcall_member(call_vc_manager_t *pMng) +{ + int i = 0; + call_vc_call_objectinfo_t *pcall_object_info = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + + /*Optimization: Avoiding Long dereferencing inside loops */ + pcall_object_info = pMng->callobject_info; + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if ((pcall_object_info[i].state == VC_CALL_STATE_ENDED) || (pcall_object_info[i].state == VC_CALL_STATE_ENDED_FINISH)) { + __vc_core_cm_remove_call_member_fromgroup(pMng, pcall_object_info[i].call_handle); + + _vc_core_cm_clear_call_object(&pcall_object_info[i]); + } + } + return TRUE; +} + +/** + * This function sets the state of a given group + * + * @return void + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup The call group for which the state needs to be changed + * @param[in] state The state to be set + * @see _vc_core_cm_swap_group_state, _vc_core_cm_get_call_pos_ingroup + */ +void _vc_core_cm_set_group_state(call_vc_manager_t *pMng, int nGroup, call_vc_groupstate_t state) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "group=%d, state=%d", nGroup, state); + + VOICECALL_RETURN_IF_FAIL(pMng != NULL); + /*Only Group 0 and Group 1 are possible */ + VOICECALL_RETURN_IF_FAIL((nGroup >= CALL_VC_CALL_GROUP_0 && nGroup < CALL_VC_CALL_GROUP_MAX)); + + pMng->callgroup_info[nGroup].state = state; +} + +/** + * This function retrieves the index of the group given the call handle + * + * @return Returns group index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle The for which the group index has to be retrieved + * @see _vc_core_cm_set_group_state, _vc_core_cm_get_call_pos_ingroup + */ +int _vc_core_cm_get_group_index(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int group = 0; + int index = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + if (__call_vc_cm_gp_get_groupcall_pos(pMng, call_handle, &group, &index) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail"); + return VC_TAPI_INVALID_CALLHANDLE; + } + + return group; +} + +/** + * This function retrieves the index/position of the call info in the object info table for a given call handle + * + * @return Returns index on success and -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group ID + * @param[in] call_handle The call handle for which the call index has to be retrieved + * @see _vc_core_cm_get_group_index + */ +int _vc_core_cm_get_call_pos_ingroup(call_vc_manager_t *pMng, int nGroup, call_vc_handle call_handle) +{ + int i = 0; + int idx = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL((nGroup >= CALL_VC_CALL_GROUP_0 && nGroup < CALL_VC_CALL_GROUP_MAX)); + VOICECALL_RETURN_INVALID_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + for (i = 0; i < pMng->callgroup_info[nGroup].num; i++) { + idx = pMng->callgroup_info[nGroup].callobject_index[i]; + if (pMng->callobject_info[idx].call_handle == call_handle) + return i; + } + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function swaps the state of the groups + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_set_group_state + */ +gboolean _vc_core_cm_swap_group_state(call_vc_manager_t *pMng) +{ + int i = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + pMng->callgroup_info[i].state = CALL_VC_GROUP_STATE_ACTIVE; + else if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + pMng->callgroup_info[i].state = CALL_VC_GROUP_STATE_HOLD; + } + return TRUE; +} + +/** + * This function joins the groups + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_split_group + */ +gboolean _vc_core_cm_join_group(call_vc_manager_t *pMng) +{ + int callIndex[VC_MAX_CALL_MEMBER]; + int i = 0; + int j = 0; + int nCount = 0; + int totalMember = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + totalMember = _vc_core_cm_get_total_members_ingroup(pMng); + + CALL_ENG_DEBUG(ENG_DEBUG, "Total Members: %d", totalMember); + + for (i = CALL_VC_CALL_GROUP_MAX - 1; i >= 0; i--) { + for (j = 0; j < pMng->callgroup_info[i].num; j++) { + callIndex[nCount] = pMng->callgroup_info[i].callobject_index[j]; + nCount++; + } + } + + VOICECALL_RETURN_FALSE_IF_FAIL(nCount <= VC_MAX_CALL_GROUP_MEMBER); + + for (i = 0; i < nCount; i++) { + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[i] = callIndex[i]; + } + + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num = nCount; + if (nCount == 0) + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_NONE; + else + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_ACTIVE; + + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num = 0; + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state = CALL_VC_GROUP_STATE_NONE; + + return TRUE; + +} + +/** + * This function splits the group given a call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] call_handle Call handle + * @see _vc_core_cm_join_group + */ +gboolean _vc_core_cm_split_group(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int group = 0; + int pos = 0; + int i = 0; + int count = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + if (__call_vc_cm_gp_get_groupcall_pos(pMng, call_handle, &group, &pos) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "fail"); + return FALSE; + } + + VOICECALL_RETURN_FALSE_IF_FAIL(group == 0); + VOICECALL_RETURN_FALSE_IF_FAIL(pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state == CALL_VC_GROUP_STATE_NONE); + + CALL_ENG_DEBUG(ENG_DEBUG, "group=%d, pos=%d, Call Handle = %d, title=%s", group, pos, call_handle, pMng->callobject_info[pMng->callgroup_info[group].callobject_index[pos]].tel_number); + + for (i = 0; i < pMng->callgroup_info[0].num; i++) { + if (i != pos) { + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].callobject_index[count] = pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[i]; + count++; + } + } + + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num = count; + + if (count == 0) + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state = CALL_VC_GROUP_STATE_NONE; + else + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].state = CALL_VC_GROUP_STATE_HOLD; + + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num = 1; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].state = CALL_VC_GROUP_STATE_ACTIVE; + pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[0] = pMng->callgroup_info[CALL_VC_CALL_GROUP_0].callobject_index[pos]; + + return TRUE; + +} + +/** + * This function retreives the group state for the given group index + * + * @return This function returns the group state + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup group index + */ +call_vc_groupstate_t _vc_core_cm_get_group_state(call_vc_manager_t *pMng, int nGroup) +{ + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, CALL_VC_GROUP_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, CALL_VC_GROUP_STATE_NONE); + + return pMng->callgroup_info[nGroup].state; +} + +/** + * This function retrieves the number of members in a group + * + * @return Returns number of members in the group + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + */ +int _vc_core_cm_get_member_count_ingroup(call_vc_manager_t *pMng, int nGroup) +{ + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, CALL_VC_GROUP_STATE_NONE); + + return pMng->callgroup_info[nGroup].num; +} + +/** + * This function retrieves the total number of members in all the groups + * + * @return Returns the total number of members + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_total_members_ingroup(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Members in Group 0: %d, Members in Group 1: %d", pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num, pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num); + return (pMng->callgroup_info[CALL_VC_CALL_GROUP_0].num + pMng->callgroup_info[CALL_VC_CALL_GROUP_1].num); +} + +/** + * This function retrieves the number of connected members in a group + * + * @return Returns number of connected members in the group + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + */ +int _vc_core_cm_get_connected_member_count_ingroup(call_vc_manager_t *pMng, int nGroup) +{ + int i = 0; + int callIndex = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, CALL_VC_GROUP_STATE_NONE); + + for (i = 0; i < pMng->callgroup_info[nGroup].num; i++) { + callIndex = pMng->callgroup_info[nGroup].callobject_index[i]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + count++; + } + } + return count; + +} + +/** + * This function retrieves the total number of groups + * + * @return Returns the total number of groups + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_group_count(call_vc_manager_t *pMng) +{ + int num = 0; + int i = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + CALL_ENG_DEBUG(ENG_DEBUG, "pMng->callgroup_info[%d].num = %d", i, pMng->callgroup_info[i].num); + + if (pMng->callgroup_info[i].num != 0) + num++; + } + return num; +} + +/** + * This function retrieves the call state of a given group and object position + * + * @return Returns call state of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + * @param[in] nPos Call object index + */ +voicecall_call_state_t _vc_core_cm_get_call_state_ingroup_byposition(call_vc_manager_t *pMng, int nGroup, int nPos) +{ + int memIndex = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, VC_CALL_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, VC_CALL_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, VC_CALL_STATE_NONE); + + if (pMng->callgroup_info[nGroup].state == CALL_VC_GROUP_STATE_NONE) { + return VC_CALL_STATE_NONE; + } + + if (nPos >= pMng->callgroup_info[nGroup].num) { + return VC_CALL_STATE_NONE; + } + + memIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + + return pMng->callobject_info[memIndex].state; +} + +/** + * This function retrieves the call object info of a given group and object position + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + * @param[in] nPos Call object index + * @param[out] pcall_object Pointer to the call object info structure + */ +gboolean _vc_core_cm_get_call_info_ingroup_byposition(call_vc_manager_t *pMng, int nGroup, int nPos, call_vc_call_objectinfo_t *pcall_object) +{ + int memIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, FALSE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, FALSE); + + if (pMng->callgroup_info[nGroup].state == CALL_VC_GROUP_STATE_NONE) + return FALSE; + if (nPos >= pMng->callgroup_info[nGroup].num) + return FALSE; + + memIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + + memcpy(pcall_object, &pMng->callobject_info[memIndex], sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function checks if connected call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexits_outgoing_call, _vc_core_cm_isexists_incoming_call + */ +gboolean _vc_core_cm_isexists_connected_call(call_vc_manager_t *pMng) +{ + int i = 0; + int group = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (group = 0; group < CALL_VC_CALL_GROUP_MAX; group++) { + for (i = 0; i < pMng->callgroup_info[group].num; i++) { + callIndex = pMng->callgroup_info[group].callobject_index[i]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + return TRUE; + } + } + } + return FALSE; + +} + +/** + * This function retrieves the group state for a given call ID of an + * + * @return This function returns the group state + * @param[in] pMng Pointer to the call manager structure + * @param[in] callID The call ID of the object + */ +call_vc_groupstate_t _vc_core_cm_get_group_state_callid(call_vc_manager_t *pMng, int callID) +{ + int i = 0; + int nGroup = 0; + int callIndex = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, CALL_VC_GROUP_STATE_NONE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(callID, 1, 7, FALSE); + + for (nGroup = 0; nGroup < CALL_VC_CALL_GROUP_MAX; nGroup++) { + if (pMng->callgroup_info[nGroup].state == CALL_VC_GROUP_STATE_NONE) + continue; + + for (i = 0; i < pMng->callgroup_info[nGroup].num; i++) { + callIndex = pMng->callgroup_info[nGroup].callobject_index[i]; + if (pMng->callobject_info[callIndex].call_id == callID) { + return pMng->callgroup_info[nGroup].state; + } + } + } + + return CALL_VC_GROUP_STATE_NONE; + +} + +/** + * This function clears the outgoing call information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_set_outgoing_call + */ +gboolean _vc_core_cm_clear_outgoing_call(call_vc_manager_t *pMng) +{ + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index != VC_INVALID_CALL_INDEX) { + _vc_core_cm_clear_call_object(&(pMng->callobject_info[pMng->setupcall_info.mocall_index])); + pMng->setupcall_info.mocall_index = VC_INVALID_CALL_INDEX; + pMng->setupcall_info.no_service_state = FALSE; + pMng->setupcall_info.call_control_type = CALL_VC_SAT_CC_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "remove outgoing call info"); + return TRUE; + } + return FALSE; +} + +/** + * This function sets the out going call index + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] callIndex Call index that needs to be set + * @see _vc_core_cm_clear_outgoing_call + */ +gboolean _vc_core_cm_set_outgoing_call(call_vc_manager_t *pMng, int callIndex) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index != VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_DEBUG, "previous mo call not cleard!"); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "index=%d", callIndex); + + pMng->setupcall_info.mocall_index = callIndex; + + return TRUE; +} + +/** + * This function retrieves the outgoing call handle + * + * @return Returns out going call handle on success and TAPI_INVALID_CALLHANDLE on failure + * @param[in] pMng Pointer to the call manager structure + */ +call_vc_handle _vc_core_cm_get_outgoing_call_handle(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) { + return VC_TAPI_INVALID_CALLHANDLE; + } + + return pMng->callobject_info[pMng->setupcall_info.mocall_index].call_handle; +} + +/** + * This function retrieves the outgoing call information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[out] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_set_outgoing_call_info + */ +gboolean _vc_core_cm_get_outgoing_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) + return FALSE; + memcpy(pcall_object, &pMng->callobject_info[pMng->setupcall_info.mocall_index], sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function sets the given outgoing call information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_get_outgoing_call_info + */ +gboolean _vc_core_cm_set_outgoing_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) + return FALSE; + memcpy(&pMng->callobject_info[pMng->setupcall_info.mocall_index], pcall_object, sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function checks if outgoing call exists + * + * @return Returns TRUE if outgoing call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexists_incoming_call, _vc_core_cm_isexists_connected_call + */ +gboolean _vc_core_cm_isexits_outgoing_call(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) + return FALSE; + else + return TRUE; +} + +/** + * This function sets the incoming call index + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] callIndex Call index of the incoming call + */ +gboolean _vc_core_cm_set_incoming_call(call_vc_manager_t *pMng, int callIndex) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (pMng->mtcall_index != VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_DEBUG, "previous mo call not cleard!"); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "index=%d", callIndex); + pMng->mtcall_index = callIndex; + + return TRUE; +} + +/** +* This function retrieves the call handle of the incoming call +* +* @return Returns the call handle if success, TAPI_INVALID_CALLHANDLE on failure +* @param[in] pMng Pointer to the call manager structure +* @see _vc_core_cm_get_incoming_call_info +*/ +call_vc_handle _vc_core_cm_get_incoming_call_handle(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + if (pMng->mtcall_index == VC_INVALID_CALL_INDEX) { + return VC_TAPI_INVALID_CALLHANDLE; + } + + return pMng->callobject_info[pMng->mtcall_index].call_handle; +} + +/** + * This function retrieves the call information of the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[out] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_get_incoming_call_info, __vc_core_cm_set_incoming_call_info + */ +gboolean _vc_core_cm_get_incoming_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + call_handle = _vc_core_cm_get_incoming_call_handle(pMng); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + return FALSE; + } + return _vc_core_cm_get_call_object(pMng, call_handle, pcall_object); +} + +/** + * This function sets the call information of the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pcall_object Pointer to the call object info structure + * @see _vc_core_cm_get_incoming_call_info + */ +gboolean __vc_core_cm_set_incoming_call_info(call_vc_manager_t *pMng, call_vc_call_objectinfo_t *pcall_object) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_object != NULL); + + if (VC_INVALID_CALL_INDEX == pMng->mtcall_index) { + return FALSE; + } + memcpy(&pMng->callobject_info[pMng->mtcall_index], pcall_object, sizeof(call_vc_call_objectinfo_t)); + + return TRUE; +} + +/** + * This function checks if incoming call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexits_outgoing_call, _vc_core_cm_isexists_connected_call + */ +gboolean _vc_core_cm_isexists_incoming_call(call_vc_manager_t *pMng) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "[pMng=0x%x]", pMng); + + CALL_ENG_DEBUG(ENG_DEBUG, "[pMng->mtcall_index=%d]", pMng->mtcall_index); + + if (pMng->mtcall_index == VC_INVALID_CALL_INDEX) + return FALSE; + else + return TRUE; +} + +/** + * This function retrieves the call handle of a given group and object position + * + * @return Returns call handle of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] nGroup Group index + * @param[in] nPos Call object index + */ +call_vc_handle _vc_core_cm_get_call_handle_ingroup_byposition(call_vc_manager_t *pMng, int nGroup, int nPos) +{ + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nGroup, 0, 1, VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, VC_TAPI_INVALID_CALLHANDLE); + VOICECALL_RETURN_INVALID_IF_FAIL(pMng->callgroup_info[nGroup].state != CALL_VC_GROUP_STATE_NONE); + VOICECALL_RETURN_INVALID_IF_FAIL(nPos <= pMng->callgroup_info[nGroup].num); + + callIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + + return pMng->callobject_info[callIndex].call_handle; +} + +/** + * This function retrieves the call handle of a given call ID + * + * @return Returns call handle of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] callID Call ID for a given call object + */ +call_vc_handle _vc_core_cm_get_call_handle_ingroup_bycallId(call_vc_manager_t *pMng, int callID) +{ + int i = 0; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(callID, 1, 7, VC_TAPI_INVALID_CALLHANDLE); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (pMng->callobject_info[i].call_id == callID) { + return pMng->callobject_info[i].call_handle; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "return VC_TAPI_INVALID_CALLHANDLE"); + + return call_handle; + +} + +/** + * This function retrieves the call handle of a given telephone number + * + * @return Returns call handle of the object + * @param[in] pMng Pointer to the call manager structure + * @param[in] tel_number Telephone number of a call object + */ +call_vc_handle __vc_core_cm_get_call_handle_ingroup_bynumber(call_vc_manager_t *pMng, char *tel_number) +{ + int group = 0; + int i = 0; + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(tel_number != NULL); + + if (strlen(tel_number) == 0) { + return VC_TAPI_INVALID_CALLHANDLE; + } + + for (group = 0; group < CALL_VC_CALL_GROUP_MAX; group++) { + for (i = 0; i < pMng->callgroup_info[group].num; i++) { + callIndex = pMng->callgroup_info[group].callobject_index[i]; + if (strcmp(pMng->callobject_info[callIndex].tel_number, tel_number) == 0) { + return pMng->callobject_info[callIndex].call_handle; + } + } + } + + return VC_TAPI_INVALID_CALLHANDLE; + +} + +/** + * This function retrieves the call handle of the first active call + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @see _vc_core_cm_get_next_active_call_handle + */ +int _vc_core_cm_get_first_active_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + if (_vc_core_cm_get_total_members_ingroup(pMng) == 0 && _vc_core_cm_isexits_outgoing_call(pMng)) { + *pCall = _vc_core_cm_get_outgoing_call_handle(pMng); + return VC_TAPI_INVALID_CALLHANDLE; + + } + + return _vc_core_cm_get_next_active_call_handle(pMng, pCall, 0); +} + +/** + * This function retrieves the call handle of the first held call + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @see _vc_core_cm_get_next_held_call_handle + */ +int _vc_core_cm_get_first_held_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall) +{ + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + return _vc_core_cm_get_next_held_call_handle(pMng, pCall, 0); +} + +/** + * This function retrieves the next active call handle + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @param[in] nPos Current position of the call object index + * @see _vc_core_cm_get_first_active_call_handle + */ +int _vc_core_cm_get_next_active_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall, int nPos) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + *pCall = VC_TAPI_INVALID_CALLHANDLE; + return VC_TAPI_INVALID_CALLHANDLE; + } + + for (k = nPos; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + *pCall = pMng->callobject_info[callIndex].call_handle; + return k + 1; + } + } + + *pCall = VC_TAPI_INVALID_CALLHANDLE; + + return VC_TAPI_INVALID_CALLHANDLE; + +} + +/** + * This function retrieves the next held call handle + * + * @return Returns the call handle on sucess, -1 on failure + * @param[in] pMng Pointer to the call manager structure + * @param[in] pCall Pointer to the call handle where the retrieved call handle need to be stored + * @param[in] nPos Current position of the call object index + * @see _vc_core_cm_get_first_held_call_handle + */ +int _vc_core_cm_get_next_held_call_handle(call_vc_manager_t *pMng, call_vc_handle *pCall, int nPos) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_INVALID_IF_FAIL(pCall != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + *pCall = VC_TAPI_INVALID_CALLHANDLE; + return VC_TAPI_INVALID_CALLHANDLE; + } + + for (k = nPos; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + *pCall = pMng->callobject_info[callIndex].call_handle; + return k + 1; + } + } + + *pCall = VC_TAPI_INVALID_CALLHANDLE; + + return VC_TAPI_INVALID_CALLHANDLE; + +} + +/** + * This function checks if active call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexists_held_call + */ +gboolean _vc_core_cm_isexists_active_call(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + CALL_ENG_DEBUG(ENG_DEBUG, "returns TRUE"); + return TRUE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "returns FALSE"); + + return FALSE; + +} + +/** + * This function checks if held call exists + * + * @return Returns TRUE if call exist FALSE otherwise + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_isexists_active_call + */ +gboolean _vc_core_cm_isexists_held_call(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + CALL_ENG_DEBUG(ENG_DEBUG, "returns TRUE"); + + return TRUE; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "returns FALSE"); + return FALSE; +} + +/** + * This function retrieves the number of active calls + * + * @return Returns number of active calls + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_held_call_count + */ +int _vc_core_cm_get_active_call_count(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return 0; + } + + count = 0; + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + count++; + } + } + return count; +} + +/** + * This function retrieves the number of held calls + * + * @return Returns number of held calls + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_held_call_count + */ +int _vc_core_cm_get_held_call_count(call_vc_manager_t *pMng) +{ + int i = 0; + int k = 0; + int callIndex = 0; + int count = 0; + + VOICECALL_RETURN_ZERO_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return 0; + } + + count = 0; + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + count++; + } + } + return count; +} + +/** + * This function retrieves the group index of active calls + * + * @return Returns the group index + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_held_group_index + */ +int _vc_core_cm_get_active_group_index(call_vc_manager_t *pMng) +{ + int i = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (_vc_core_cm_get_group_state(pMng, i) == CALL_VC_GROUP_STATE_ACTIVE) + return i; + } + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function retrieves the group index of held calls + * + * @return Returns the group index + * @param[in] pMng Pointer to the call manager structure + * @see _vc_core_cm_get_active_group_index + */ +int _vc_core_cm_get_held_group_index(call_vc_manager_t *pMng) +{ + int i = 0; + + VOICECALL_RETURN_INVALID_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (_vc_core_cm_get_group_state(pMng, i) == CALL_VC_GROUP_STATE_HOLD) + return i; + } + return VC_TAPI_INVALID_CALLHANDLE; + +} + + /** + * This function changes the state of the given onject info + * + * @return void + * @param[in] info Pointer to the call object into structure for which the state has to be changed + * @param[in] callState State that needs to be set + */ +void inline _vc_core_cm_change_call_state(call_vc_call_objectinfo_t *info, voicecall_call_state_t callState) +{ + VOICECALL_RETURN_IF_FAIL(info != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d..%s(%d)-->%s(%d))", info->call_handle, gaszCallStateName[info->state], info->state, gaszCallStateName[callState], callState); + info->state = callState; +} + +/** + * This function dumps the complete information in the call manager + * + * @return void + * @param[in] info Pointer to the call manager structure + */ +void _vc_core_cm_test_dump(call_vc_manager_t *info) +{ + int i = 0; + int j = 0; + int count = 0; + char szBuffer[320]; + + VOICECALL_RETURN_IF_FAIL(info != NULL); + CALL_ENG_DEBUG(ENG_ERR, "************START*****************CALL_DETAILS_DUMP************START*****************"); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + char szTemp[10]; + memset(szTemp, 0, sizeof(szTemp)); + if (info->callgroup_info[i].state == CALL_VC_GROUP_STATE_NONE) { + snprintf(szTemp, 5, "%s", "NONE"); + } else if (info->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) { + snprintf(szTemp, 7, "%s", "ACTIVE"); + } else if (info->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) { + snprintf(szTemp, 5, "%s", "HOLD"); + } + + snprintf(szBuffer, (27 + sizeof(i) + sizeof(int) + sizeof(szTemp)), "__________ group=%d(num=%d) %s", i, info->callgroup_info[i].num, szTemp); + CALL_ENG_DEBUG(ENG_ERR, "%s", szBuffer); + for (j = 0; j < info->callgroup_info[i].num; j++) { + snprintf(szBuffer, (50 + sizeof(j) + sizeof(int) + sizeof(int) + VC_PHONE_NUMBER_LENGTH_MAX), + " __pos=%d, bufindex=%d, Call Handle = %d, [%s], state:[%d]", + j, info->callgroup_info[i].callobject_index[j], + info->callobject_info[info->callgroup_info[i].callobject_index[j]].call_handle, + info->callobject_info[info->callgroup_info[i].callobject_index[j]].tel_number, info->callobject_info[info->callgroup_info[i].callobject_index[j]].state); + CALL_ENG_DEBUG(ENG_ERR, "%s", szBuffer); + } + } + if (info->setupcall_info.mocall_index == VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_ERR, "_______ MO call not exist"); + } else { + CALL_ENG_DEBUG(ENG_ERR, "_______ MO callIndex=%d, Call Handle = %d, %s", + info->setupcall_info.mocall_index, info->callobject_info[info->setupcall_info.mocall_index].call_handle, info->callobject_info[info->setupcall_info.mocall_index].tel_number); + } + if (info->mtcall_index == VC_INVALID_CALL_INDEX) { + CALL_ENG_DEBUG(ENG_ERR, "_______ MT call not exist"); + } else { + CALL_ENG_DEBUG(ENG_ERR, "_______ MT callIndex=%d, Call Handle = %d, [%s], state:[%d]", + info->mtcall_index, info->callobject_info[info->mtcall_index].call_handle, info->callobject_info[info->mtcall_index].tel_number, info->callobject_info[info->mtcall_index].state); + } + count = 0; + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if (info->callobject_info[i].call_handle != VC_TAPI_INVALID_CALLHANDLE) { + count++; + } + } + CALL_ENG_DEBUG(ENG_ERR, "____Call Handle Num=%d", count); + CALL_ENG_DEBUG(ENG_ERR, "**************END*****************CALL_DETAILS_DUMP**************END*****************"); +} + +#ifdef UNUSED_APIS +unsigned long call_vc_cm_search_oldcall(call_vc_manager_t *pMng, gboolean activegroup) +{ + int index = 0; + int totalmember = 0; + int k = 0; + int min = 0; + unsigned long mintmconnected = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, 0); + if (activegroup == TRUE) { + index = _vc_core_cm_get_active_group_index(pMng); + } else if (activegroup == FALSE) { + index = _vc_core_cm_get_held_group_index(pMng); + } + + totalmember = pMng->callgroup_info[index].num; + + if (totalmember > 1) { + for (k = 1; k < totalmember; k++) { + if (pMng->callobject_info[pMng->callgroup_info[index].callobject_index[k]].connected_time < pMng->callobject_info[pMng->callgroup_info[index].callobject_index[min]].connected_time) { + min = k; + } + } + mintmconnected = pMng->callobject_info[pMng->callgroup_info[index].callobject_index[min]].connected_time; + } else if (totalmember == 1) + mintmconnected = pMng->callobject_info[pMng->callgroup_info[index].callobject_index[0]].connected_time; + + CALL_ENG_DEBUG(ENG_DEBUG, "index = %d", index); + CALL_ENG_DEBUG(ENG_DEBUG, "totalmember = %d", totalmember); + CALL_ENG_DEBUG(ENG_DEBUG, "min = %d", min); + CALL_ENG_DEBUG(ENG_DEBUG, "min tmconnected = %d", mintmconnected); + + return mintmconnected; + +} + +unsigned long call_vc_cm_search_next_oldcall(call_vc_manager_t *pMng, gboolean activegroup, call_vc_handle call_handle) +{ + int index = 0; + int totalmember = 0; + int i = 0; + int k = 0; + int min = 0; + int j = 0; + int searchinfonum = 0; + unsigned long mintmconnected = 0xFFFF; + unsigned long searchInfo[VC_MAX_CALL_GROUP_MEMBER]; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, 0); + CALL_ENG_DEBUG(ENG_DEBUG, "ended call_handle = %d", call_handle); + + if (activegroup == TRUE) { + index = _vc_core_cm_get_active_group_index(pMng); + } else if (activegroup == FALSE) { + index = _vc_core_cm_get_held_group_index(pMng); + } + + totalmember = pMng->callgroup_info[index].num; + + CALL_ENG_DEBUG(ENG_DEBUG, "totalmember = %d", totalmember); + + for (i = 0; i < totalmember; i++) { + if (pMng->callobject_info[pMng->callgroup_info[index].callobject_index[i]].call_handle != call_handle) { + searchInfo[j] = pMng->callobject_info[pMng->callgroup_info[index].callobject_index[i]].connected_time; + CALL_ENG_DEBUG(ENG_DEBUG, "searchInfo[%d] = %d", j, searchInfo[j]); + j = j + 1; + } + } + + searchinfonum = j; + + CALL_ENG_DEBUG(ENG_DEBUG, "searchinfonum = %d", searchinfonum); + + if (searchinfonum > 1) { + for (k = 1; k < searchinfonum; k++) { + if (searchInfo[k] < searchInfo[min]) { + min = k; + } + } + mintmconnected = searchInfo[min]; + } else if (searchinfonum == 1) + mintmconnected = searchInfo[0]; + + CALL_ENG_DEBUG(ENG_DEBUG, "index = %d", index); + CALL_ENG_DEBUG(ENG_DEBUG, "min = %d", min); + CALL_ENG_DEBUG(ENG_DEBUG, "min tmconnected = %d", mintmconnected); + + return mintmconnected; + +} + +unsigned long call_vc_cm_gp_get_calltm_connected(call_vc_manager_t *pMng, int nGroup, int nPos) +{ + int callIndex = 0; + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, 0); + VOICECALL_RETURN_VALUE_IF_FAIL((nGroup >= CALL_VC_CALL_GROUP_0 && nGroup < CALL_VC_CALL_GROUP_MAX), 0); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(nPos, 0, 4, 0); + + callIndex = pMng->callgroup_info[nGroup].callobject_index[nPos]; + return pMng->callobject_info[callIndex].connected_time; +} + +gboolean call_vc_cm_search_activecall(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + if (call_handle == pMng->callobject_info[callIndex].call_handle) + return TRUE; + } + } + return FALSE; + +} + +gboolean call_vc_cm_search_activecall_ctinfo(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0; + int callIndex = 0; + gboolean bctinfo_found = FALSE; + gboolean bctinfo_atleast_one_found = FALSE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_ACTIVE) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + bctinfo_found = pMng->callobject_info[callIndex].bctinfo_found; + CALL_ENG_DEBUG(ENG_DEBUG, "pMng->callobject_info[%d].bctinfo_found (%d).", callIndex, pMng->callobject_info[callIndex].bctinfo_found); + } + + bctinfo_atleast_one_found = bctinfo_found || bctinfo_atleast_one_found; + + } + + return bctinfo_atleast_one_found; + +} + +gboolean call_vc_cm_search_holdcall(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0; + int callIndex = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + if (call_handle == pMng->callobject_info[callIndex].call_handle) + return TRUE; + } + } + return FALSE; +} + +gboolean call_vc_cm_search_holdcall_ctinfo(call_vc_manager_t *pMng, call_vc_handle call_handle) +{ + int i = 0; + int k = 0 callIndex; + gboolean bctinfo_found = FALSE; + gboolean bCtInfoAtLeastOnde = FALSE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < CALL_VC_CALL_GROUP_MAX; i++) { + if (pMng->callgroup_info[i].state == CALL_VC_GROUP_STATE_HOLD) + break; + } + if (i == CALL_VC_CALL_GROUP_MAX) { + return FALSE; + } + for (k = 0; k < pMng->callgroup_info[i].num; k++) { + callIndex = pMng->callgroup_info[i].callobject_index[k]; + if ((pMng->callobject_info[callIndex].call_handle != VC_TAPI_INVALID_CALLHANDLE) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[callIndex].state != VC_CALL_STATE_ENDED_FINISH)) { + bctinfo_found = pMng->callobject_info[callIndex].bctinfo_found; + CALL_ENG_DEBUG(ENG_DEBUG, "pMng->callobject_info[%d].bctinfo_found (%d).", callIndex, pMng->callobject_info[callIndex].bctinfo_found); + } + + bCtInfoAtLeastOnde = bctinfo_found || bCtInfoAtLeastOnde; + } + return bCtInfoAtLeastOnde; +} +#endif + +/** + * This function retrieves an available call ID + * + * @return Call ID on success, -1 on failure + * @param[in] pMng Pointer to the call manager structure + */ +int _vc_core_cm_get_new_callId(call_vc_manager_t *pMng) +{ + gboolean bCheck[VC_MAX_CALL_ID] = {0,}; + int i = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pMng != NULL, VC_TAPI_INVALID_CALLHANDLE); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if ((pMng->callobject_info[i].state != VC_CALL_STATE_ENDED) && (pMng->callobject_info[i].state != VC_CALL_STATE_ENDED_FINISH)) { + VOICECALL_RETURN_INVALID_IF_FAIL(((pMng->callobject_info[i].call_id >= 0) && (pMng->callobject_info[i].call_id <= VC_MAX_CALL_ID))); + if (pMng->callobject_info[i].call_id != 0) { + bCheck[pMng->callobject_info[i].call_id - 1] = TRUE; + } + } + } + + for (i = 0; i < VC_MAX_CALL_ID; i++) { + if (bCheck[i] == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "CallID=%d", i + 1); + return i + 1; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "fail to get id!"); + return VC_TAPI_INVALID_CALLHANDLE; +} + +/** + * This function checks if active/ held exists + * + * @return Returns TRUE if success else FALSE + * @param[in] pMng Pointer to the call manager structure + * @param[out] active_calls TRUE if active call exists, FALSE if held call exists + * @param[out] held_calls TRUE if held call exists, FALSE if held call exists + * @see _vc_core_cm_isexits_outgoing_call, _vc_core_cm_isexists_connected_call + */ +gboolean _vc_core_cm_isexists_call_ingroup(call_vc_manager_t *pMng, int *active_calls, int *held_calls) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(active_calls != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(held_calls != NULL); + + *active_calls = _vc_core_cm_isexists_active_call(pMng); + *held_calls = _vc_core_cm_isexists_held_call(pMng); + + CALL_ENG_DEBUG(ENG_DEBUG, "act_calls :%d", *active_calls); + CALL_ENG_DEBUG(ENG_DEBUG, "hld_calls :%d", *held_calls); + + return TRUE; +} + +/** + * This function changes the call state of the call object corresponds to the given call handle + * + * @return Returns TRUE if success else FALSE + * @param[in] pMng Pointer to the call manager structure + * @param[out] call_handle Call Handle of the Callobject to be modified + * @param[out] callState New call state to be set + */ +gboolean _vc_core_cm_change_call_object_state(call_vc_manager_t *pMng, call_vc_handle call_handle, voicecall_call_state_t callState) +{ + call_vc_call_objectinfo_t callobject_info; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) + return FALSE; + + _vc_core_cm_clear_call_object(&callobject_info); + + if (!_vc_core_cm_get_call_object(pMng, call_handle, &callobject_info)) + return FALSE; + + _vc_core_cm_change_call_state(&callobject_info, callState); + + _vc_core_cm_set_call_object(pMng, &callobject_info); + + return TRUE; + +} + +gboolean _vc_core_cm_get_ending_call_info(call_vc_manager_t *pMng) +{ + int i = 0; + gboolean bcall_ending = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(pMng != NULL); + + for (i = 0; i < VC_MAX_CALL_MEMBER; i++) { + if ((pMng->callobject_info[i].state == VC_CALL_STATE_ENDED) || (pMng->callobject_info[i].state == VC_CALL_STATE_ENDED_FINISH)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Tel(%s) is ending!!", pMng->callobject_info[i].tel_number); + bcall_ending = TRUE; + break; + } + } + return bcall_ending; +} diff --git a/call-engine/core/vc-core-ccbs.c b/call-engine/core/vc-core-ccbs.c new file mode 100755 index 0000000..cb65187 --- /dev/null +++ b/call-engine/core/vc-core-ccbs.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifdef _CCBS_DEFINED_ + +#include +#include + +#include "vc-core-ccbs.h" +#include "vc-core-util.h" +#include "vc-core-callagent.h" + +/** + * This function initializes the CCBS info + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the voicecall agent + */ +gboolean call_vc_init_ccbs_info(call_vc_callagent_state_t *pcall_agent) +{ + pcall_agent->ccbs_index = 0; + memset(&pcall_agent->ccbs_info, 0, sizeof(tapi_call_ccbs_info_t)*CALL_VC_CCBS_NUMBER_MAX); + return TRUE; +} + +/** + * This function checks if CCBS info is possible or not + * + * @return Returns TRUE if possible and FALSE if not possible + * @param[in] pcall_agent Handle to the voicecall agent + */ +gboolean call_vc_ccbs_info_possible(call_vc_callagent_state_t *pcall_agent) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (pcall_agent->ccbs_index < 0 || pcall_agent->ccbs_index >= CALL_VC_CCBS_NUMBER_MAX) { + return FALSE; + } + return TRUE; +} + +/** + * This function adds one CCBS information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the voicecall agent + * @param[in] pCcbsInfo Pointer to the CCBS info structure + * @see call_vc_delete_oneccbs_info + */ +gboolean call_vc_add_oneccbs_info(call_vc_callagent_state_t *pcall_agent, tapi_call_ccbs_info_t *pCcbsInfo) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pCcbsInfo != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (!(pcall_agent->ccbs_index >= 0 && pcall_agent->ccbs_index < CALL_VC_CCBS_NUMBER_MAX)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Free Index to add ccbs_index = %d", pcall_agent->ccbs_index); + return FALSE; + } + memcpy(&pcall_agent->ccbs_info[pcall_agent->ccbs_index++], pCcbsInfo, sizeof(tapi_call_ccbs_info_t)); + + return TRUE; +} + +/** + * This function deletes one CCBS information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the voicecall agent + * @param[in] ccbsIndex Index of the CCBS info to be deleted + * @see call_vc_add_oneccbs_info + */ +gboolean call_vc_delete_oneccbs_info(call_vc_callagent_state_t *pcall_agent, int ccbsIndex) +{ + int i = 0; + int j = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + for (i = 0; i < pcall_agent->ccbs_index; i++) { + if (ccbsIndex == pcall_agent->ccbs_info[i].ccbs_info.index) { + for (j = i; j < pcall_agent->ccbs_index - 1; j++) { + memcpy(&pcall_agent->ccbs_info[j], &pcall_agent->ccbs_info[j + 1], sizeof(tapi_call_ccbs_info_t)); + } + + /*Remove the Last Index data*/ + memset(&pcall_agent->ccbs_info[j], 0, sizeof(tapi_call_ccbs_info_t)); + pcall_agent->ccbs_index--; + break; + } + } + if (i == pcall_agent->ccbs_index) + return FALSE; + + return TRUE; +} +#endif diff --git a/call-engine/core/vc-core-ecc.c b/call-engine/core/vc-core-ecc.c new file mode 100755 index 0000000..fc0dce6 --- /dev/null +++ b/call-engine/core/vc-core-ecc.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "vc-core-ecc.h" +#include "vc-core-util.h" + +/** + * This function checks whether the given number is emergency number by verifying with no sim emergency numbers + * + * @return TRUE if the number is emergency number, FALSE otherwise + * @param[in] pNumber number to be verified + */ +static gboolean __vc_core_ecc_check_emergency_number_nosim(const char *pNumber); + +static char *gcall_vc_ecc_numbers_default[] = { + "112", + "911" +}; + +/** + * This function checks whether the given number is emergency number by verifying with sim emergency numbers + * + * @return TRUE if the number is emergency number, FALSE otherwise + * @param[in] card_type simcard type + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_ecc_check_emergency_number(TapiHandle *tapi_handle, TelSimCardType_t card_type, char *pNumber, gboolean b_is_no_sim, int *ecc_category) +{ + int i = 0; + int ecc_count = 0; + char **p_ecc_numbers = NULL; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + unsigned long mcc = 0; /* for checking Emergency number for each country */ + unsigned long mnc = 0; /* for checking Emergency number for each operator */ + + VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(ecc_category != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber = %s", pNumber); + *ecc_category = 0; + + if (b_is_no_sim == TRUE) { + return __vc_core_ecc_check_emergency_number_nosim(pNumber); + } + + _vc_core_util_get_mcc(&mcc); + _vc_core_util_get_mnc(&mnc); + + switch (card_type) { + case TAPI_SIM_CARD_TYPE_GSM: + { + TelSimEccList_t sim_ecc_list; /* used to get data for the Ecc information for 2G and 3G. */ + + CALL_ENG_DEBUG(ENG_DEBUG, "[SimCardType=SIM_CARD_TYPE_GSM]"); + memset(&sim_ecc_list, 0x00, sizeof(TelSimEccList_t)); + + /*TAPI api Compliance */ + /*To get Emergency data of 2G */ + tapi_err = tel_get_sim_ecc(tapi_handle, &sim_ecc_list); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_ecc_info failed, tapi_err=%d", tapi_err); + return FALSE; + } + + if (sim_ecc_list.ecc_count > 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "GSM pNumber ecc1(%s) ecc2(%s) ecc3(%s) ecc4(%s) ecc5(%s)", + sim_ecc_list.list[0].number, sim_ecc_list.list[1].number, sim_ecc_list.list[2].number, sim_ecc_list.list[3].number, sim_ecc_list.list[4].number); + + if ((strcmp(pNumber, sim_ecc_list.list[0].number) == 0) + || (strcmp(pNumber, sim_ecc_list.list[1].number) == 0) + || (strcmp(pNumber, sim_ecc_list.list[2].number) == 0) + || (strcmp(pNumber, sim_ecc_list.list[3].number) == 0) + || (strcmp(pNumber, sim_ecc_list.list[4].number) == 0)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_check_emergency_number: return TRUE"); + return TRUE; + } + } + } + break; + case TAPI_SIM_CARD_TYPE_USIM: + { + TelSimEccList_t usim_ecc_list; /* used to get data for the Ecc information for both 2G and 3G */ + + CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=SIM_CARD_TYPE_USIM"); + memset(&usim_ecc_list, 0x00, sizeof(TelSimEccList_t)); + + /*Synchronous function used to get ECC data */ + tapi_err = tel_get_sim_ecc(tapi_handle, &usim_ecc_list); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_sim_get_usim_ecc_info failed, tapi_err=%d", tapi_err); + return FALSE; + } + + if (usim_ecc_list.ecc_count > 0) { + for (i = 0; i < usim_ecc_list.ecc_count; i++) { + CALL_ENG_DEBUG(ENG_DEBUG, "[ecc=%s, category:[%d]]", usim_ecc_list.list[i].number, usim_ecc_list.list[i].category); + if (!strcmp(pNumber, usim_ecc_list.list[i].number)) { + *ecc_category = usim_ecc_list.list[i].category; + CALL_ENG_DEBUG(ENG_DEBUG, "uecc matched!!"); + return TRUE; + } + } + } + } + break; + case TAPI_SIM_CARD_TYPE_RUIM: + CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=TAPI_SIM_CARD_TYPE_RUIM"); + break; + case TAPI_SIM_CARD_TYPE_IMS: + CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=TAPI_SIM_CARD_TYPE_IMS"); + break; + case TAPI_SIM_CARD_TYPE_UNKNOWN: + CALL_ENG_DEBUG(ENG_DEBUG, "SimCardType=SIM_CARD_TYPE_UNKNOWN"); + break; + } + + /* There is no ecc number in the SIM card. */ + CALL_ENG_DEBUG(ENG_DEBUG, "mcc : %ld", mcc); + + switch (mcc) { + default: + ecc_count = CALL_ECC_MAX_COUNT_DEFAULT; + p_ecc_numbers = gcall_vc_ecc_numbers_default; /*112, 911 */ + break; + } + + VOICECALL_RETURN_FALSE_IF_FAIL(ecc_count > 0); + VOICECALL_RETURN_FALSE_IF_FAIL(p_ecc_numbers != NULL); + + for (i = 0; i < ecc_count; i++) { + if (!strcmp(pNumber, p_ecc_numbers[i])) { + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber (%s), p_ecc_numbers[%d] (%s)", pNumber, i, p_ecc_numbers[i]); + return TRUE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "No emegency number..."); + return FALSE; +} + +/* No SIM - Default*/ +static char *gcall_vc_ecc_numbers_nosim_default[] = { + "000", +#ifdef _VC_OPERATOR_TMOUSA +#else + "08", +#endif + "112", + "110", + "118", + "119", + "911", + "999" +}; + +static gboolean __vc_core_ecc_check_emergency_number_nosim(const char *pNumber) +{ + int i = 0; + int ecc_count = 0; + char **p_nosim_ecc_numbers = NULL; + unsigned long mcc = 0; /* for checking Emergency number for each country */ + unsigned long mnc = 0; /* for checking Emergency number for each operator */ + + VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL); + + if (strlen(pNumber) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber's length is ZERO so return FALSE"); + return FALSE; + } + + _vc_core_util_get_mcc(&mcc); + _vc_core_util_get_mnc(&mnc); + + CALL_ENG_DEBUG(ENG_DEBUG, "mcc : %ld", mcc); + + switch (mcc) { + default: + ecc_count = CALL_ECC_MAX_COUNT_DEFAULT_NO_SIM; + p_nosim_ecc_numbers = gcall_vc_ecc_numbers_nosim_default; /*3GPP SPecs = 000, 08, 112, 100, 118, 119, 911, 999 */ + break; + } + + VOICECALL_RETURN_FALSE_IF_FAIL(ecc_count > 0); + VOICECALL_RETURN_FALSE_IF_FAIL(p_nosim_ecc_numbers != NULL); + + for (i = 0; i < ecc_count; i++) { + if (!strcmp(pNumber, p_nosim_ecc_numbers[i])) { + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber (%s), p_nosim_ecc_numbers[%d] (%s)", pNumber, i, p_nosim_ecc_numbers[i]); + return TRUE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "No emegency number..."); + + return FALSE; +} diff --git a/call-engine/core/vc-core-engine-group.c b/call-engine/core/vc-core-engine-group.c new file mode 100755 index 0000000..cfdcbdd --- /dev/null +++ b/call-engine/core/vc-core-engine-group.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vc-core-engine-group.h" +#include "vc-core-callagent.h" +#include "vc-core-engine.h" +#include "vc-core-ccbs.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-svcall.h" + +/** +* This function retrieves the number of connected call members in the given group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[out] pmember_num Pointer to the retrieved number of connected members +* @remarks pvoicecall_agent and pmember_num cannot be NULL. +* group_index shall only take 0 or 1 as input values +*/ +voicecall_error_t _vc_core_engine_group_get_connected_member_count(voicecall_engine_t *pvoicecall_agent, int group_index, int *pmember_num) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pmember_num != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pmember_num = _vc_core_cm_get_connected_member_count_ingroup(&pagent->call_manager, group_index); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrives the number of groups in which atleast one call member is available +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pnum_enabled_group Pointer to the number of enabled groups +* @remarks pvoicecall_agent and pnum_enabled_group cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_enabled_group_count(voicecall_engine_t *pvoicecall_agent, int *pnum_enabled_group) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pnum_enabled_group != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pnum_enabled_group = _vc_core_cm_get_group_count(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the group indices of active and held calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pact_grp_index Set to the group index of active calls +* @param[out] pheld_grp_index Set to the group index of held calls +* @remarks pvoicecall_agent, pact_grp_index and pheld_grp_index cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_group_indices(voicecall_engine_t *pvoicecall_agent, int *pact_grp_index, int *pheld_grp_index) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pact_grp_index != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pheld_grp_index != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pact_grp_index = _vc_core_cm_get_active_group_index(&pagent->call_manager); + *pheld_grp_index = _vc_core_cm_get_held_group_index(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the call handle of the call member given its groupe index and position in the group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[in] pos Position of the call in the group +* @param[out] pcall_handle Pointer to the call handle to be retrieved +* @remarks pvoicecall_agent and pcall_handle cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_group_get_call_handle_byposition(voicecall_engine_t *pvoicecall_agent, int group_index, int pos, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + int callhandle = -1; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(group_index, 0, 1, ERROR_VOICECALL_INVALID_ARGUMENTS) + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(pos, 0, 4, ERROR_VOICECALL_INVALID_ARGUMENTS) + + callhandle = _vc_core_cm_get_call_handle_ingroup_byposition(&pagent->call_manager, group_index, pos);; + + if (callhandle != -1) { + *pcall_handle = callhandle; + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function checks if connected call exists in a given group +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] group_index Group index of the group +* @param[out] bcall_exists TRUE - if call exists, FALSE otherwise +* @remarks pvoicecall_agent and bcall_exists cannot be NULL. +* group_index shall only take 0 or 1 as input values +*/ +voicecall_error_t _vc_core_engine_group_isexists_connected_call_ingroup(voicecall_engine_t *pvoicecall_agent, int group_index, gboolean *bcall_exists) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcall_exists != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(group_index, 0, 1, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_GROUP_STATE_NONE == _vc_core_cm_get_group_state(&pagent->call_manager, group_index)) { + *bcall_exists = FALSE; + } + + if (0 == _vc_core_cm_get_connected_member_count_ingroup(&pagent->call_manager, group_index)) { + *bcall_exists = FALSE; + } else { + *bcall_exists = TRUE; + } + + return ERROR_VOICECALL_NONE; +} diff --git a/call-engine/core/vc-core-engine-status.c b/call-engine/core/vc-core-engine-status.c new file mode 100755 index 0000000..329cec4 --- /dev/null +++ b/call-engine/core/vc-core-engine-status.c @@ -0,0 +1,730 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/* Call Module File Includes */ +#include "vc-core-engine.h" +#include "vc-core-callagent.h" +#include "vc-core-callmanager.h" +#include "vc-core-util.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-svcall.h" +#include "vc-core-engine-status.h" + +/** +* This function checks whether the given incoming call is a restricted call or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be checked +* @param[out] pbrestricted Pointer to the restricted name mode +* @remarks pvoicecall_agent and prestricted cannot be NULL. +* This API shall only be used with the incoming call handle before it is connected +*/ +voicecall_error_t _vc_core_engine_status_isrestricted_call(voicecall_engine_t *pvoicecall_agent, int call_handle, gboolean *pbrestricted) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbrestricted != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + _vc_core_cm_clear_call_object(&call_object); + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + *pbrestricted = call_object.brestricted_namemode; + return ERROR_VOICECALL_NONE; + } + + *pbrestricted = FALSE; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function checks whether the given incoming call is a restricted call or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be checked +* @param[out] pbrestricted Pointer to the restricted name mode +* @remarks pvoicecall_agent and prestricted cannot be NULL. +* This API shall only be used with the incoming call handle before it is connected +*/ +voicecall_error_t _vc_core_engine_status_get_calling_namemode(voicecall_engine_t *pvoicecall_agent, int call_handle, gboolean *bcalling_namemode) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcalling_namemode != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + _vc_core_cm_clear_call_object(&call_object); + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + if (call_object.bcalling_namemode == CALL_VC_CALLING_NAME_MODE_AVAILABLE) { + *bcalling_namemode = TRUE; + } else { + *bcalling_namemode = FALSE; + } + return ERROR_VOICECALL_NONE; + } + + *bcalling_namemode = FALSE; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function retrieves the call object belongs to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call for which the call object is retrieved +* @param[out] pcall_object Pointer to the retrived call object info +* @remarks pvoicecall_agent and pcall_object cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_status_get_call_object(voicecall_engine_t *pvoicecall_agent, int call_handle, call_vc_call_objectinfo_t *pcall_object) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_object != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Clear the call object */ + _vc_core_cm_clear_call_object(pcall_object); + + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, pcall_object)) { + return ERROR_VOICECALL_NONE; + } + + pcall_object = NULL; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function retrieves the inout state of the engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pio_state Contains the Engine InOut state on return +* @remarks pvoicecall_agent and pio_state cannot be NULL. +* @see _vc_core_engine_change_engine_iostate +*/ +voicecall_error_t _vc_core_engine_status_get_engine_iostate(voicecall_engine_t *pvoicecall_agent, int *pio_state) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pio_state != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pio_state = pagent->io_state; + CALL_ENG_DEBUG(ENG_DEBUG, "io_state = [%d]", pagent->io_state); + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks whether connected call exists or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[out] bcall_exists TRUE - if call exists of given given type, FALSE otherwise +* @remarks pvoicecall_agent and bcall_exists cannot be NULL. +*/ +voicecall_error_t _vc_core_engine_status_isexists_call_bytype(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, gboolean *bcall_exists) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcall_exists != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*CALL_ENG_DEBUG(ENG_DEBUG,"call_type = %d", call_type);*/ + *bcall_exists = FALSE; + switch (call_type) { + case VC_INCOMING_CALL: + { + if (VC_INVALID_CALL_INDEX != pagent->call_manager.mtcall_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "incoming call exits..."); + + *bcall_exists = TRUE; + return ERROR_VOICECALL_NONE; + } + } + break; + case VC_OUTGOING_CALL: + { + if (VC_INVALID_CALL_INDEX != pagent->call_manager.setupcall_info.mocall_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "outgoing call exits..."); + + *bcall_exists = TRUE; + return ERROR_VOICECALL_NONE; + } + } + break; + case VC_CONNECTED_CALL: + { + *bcall_exists = _vc_core_cm_isexists_connected_call(&pagent->call_manager); + if (*bcall_exists == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "connected call exits..."); + } + return ERROR_VOICECALL_NONE; + } + break; + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid call type.."); + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function retrieves the total number of call members currently available with the engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] ptotal_call_member Contains the total call member availalbe in engine on return +* @remarks pvoicecall_agent and ptotal_call_member cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_member_count(voicecall_engine_t *pvoicecall_agent, int *ptotal_call_member) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(ptotal_call_member != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *ptotal_call_member = _vc_core_cm_get_call_member_count(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the total number of call members with the given connected call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] connected_call_type connected call type +* @param[out] pmember_num Contains the number of call members available with the given connected call type on return +* @remarks pvoicecall_agent and pmember_num cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_member_info(voicecall_engine_t *pvoicecall_agent, voicecall_connected_call_type_t connected_call_type, int *pmember_num) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pmember_num != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + switch (connected_call_type) { + case VC_ACTIVE_CALL: + { + *pmember_num = _vc_core_cm_get_active_call_count(&pagent->call_manager); + } + break; + case VC_HELD_CALL: + { + *pmember_num = _vc_core_cm_get_held_call_count(&pagent->call_manager); + } + break; + default: + *pmember_num = 0; + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retrieves the call handle according to the given call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[out] pcall_handle Contains the call handle on success +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* In case of multiple connected calls available, it will retreive the first connected call +*/ +voicecall_error_t _vc_core_engine_status_get_call_handle_bytype(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_manager_t *pcall_manager = NULL; + call_vc_handle call_handle = -1; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_manager = (call_vc_manager_t *) &pagent->call_manager; + + switch (call_type) { + case VC_INCOMING_CALL: + { + call_handle = _vc_core_cm_get_incoming_call_handle(pcall_manager); + } + break; + case VC_OUTGOING_CALL: + { + call_handle = _vc_core_cm_get_outgoing_call_handle(pcall_manager); + } + break; + case VC_CONNECTED_CALL: + { + _vc_core_cm_get_first_active_call_handle(pcall_manager, &call_handle); + if (-1 == call_handle) { + _vc_core_cm_get_first_held_call_handle(pcall_manager, &call_handle); + } + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + if (-1 == call_handle) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + *pcall_handle = call_handle; + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks if active calls and/or held call exists or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] pactive_calls Set to TRUE if active calls exist +* @param[out] pheld_calls Set to TRUE if held calls exist +* @remarks pvoicecall_agent,pactive_calls and pheld_calls cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isexists_any_call(voicecall_engine_t *pvoicecall_agent, gboolean *pactive_calls, gboolean *pheld_calls) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_manager_t *pcall_manager = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pactive_calls != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pheld_calls != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_manager = &pagent->call_manager; + + *pactive_calls = _vc_core_cm_isexists_active_call(pcall_manager); + *pheld_calls = _vc_core_cm_isexists_held_call(pcall_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retreives the cphs csp status +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] csp_service csp name +* @param[out] pbcsp_status Contains TRUE if given csp service is enabled,FALSE otherwise +* @remarks pvoicecall_agent and pbcsp_status cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_cphs_csp_status(voicecall_engine_t *pvoicecall_agent, voicecall_cphs_csp_service csp_service, gboolean *pbcsp_status) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbcsp_status != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); +#ifdef _CPHS_DEFINED_ + *pbcsp_status = _vc_core_svcall_cphs_csp_get_status(pcall_agent, csp_service); +#else + *pbcsp_status = (VC_CPHS_CSP_ALS == csp_service) ? FALSE : TRUE; +#endif + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks if the call is emergency call for the given outgoing call index +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] mo_call_index Index of the outgoing call +* @param[out] pbemergency_call Contains TRUE if the call is emergency call,FALSE otherwise +* @remarks pvoicecall_agent and pbemergency_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_check_emergency_byindex(voicecall_engine_t *pvoicecall_agent, int mo_call_index, gboolean *pbemergency_call) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_manager_t *pcall_manager = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbemergency_call != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(mo_call_index, 0, 7, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Assign Default Value */ + *pbemergency_call = FALSE; + + pcall_manager = (call_vc_manager_t *) &pagent->call_manager; + + CALL_VC_DUMP_CALLDETAILS(pcall_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "call_index = %d, bemergency_number = %d", mo_call_index, pcall_manager->callobject_info[mo_call_index].bemergency_number); + + *pbemergency_call = pcall_manager->callobject_info[mo_call_index].bemergency_number; + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of transfering calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] pbtransfer_calls Contains TRUE if call transfer is possible, FALSE otherwise +* @remarks pvoicecall_agent and pbtransfer_calls cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_transfer_call_possible(voicecall_engine_t *pvoicecall_agent, gboolean *pbtransfer_calls) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbtransfer_calls != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *pbtransfer_calls = _vc_core_ca_is_transfer_call_possible(pcall_agent); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of making conference calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] pbconf_call Contains TRUE if conference call is possible , FALSE otherwise +* @remarks pvoicecall_agent and pbconf_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_conf_call_possible(voicecall_engine_t *pvoicecall_agent, gboolean *pbconf_call) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + int total_call_member = 0; + gboolean bconf = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pbconf_call != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + +#ifdef _CPHS_DEFINED_ + if (_vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_MPTY)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_svcall_cphs_csp_get_status returned TRUE"); + *pbconf_call = TRUE; + } else { + *pbconf_call = FALSE; + return ERROR_VOICECALL_NONE; + } +#endif + + _vc_core_cm_isexists_call_ingroup(&pcall_agent->call_manager, &active_calls, &held_calls); + total_call_member = _vc_core_cm_get_call_member_count(&pcall_agent->call_manager); + + /* Joining call is impossile when !active or !hold call exist */ + if (!active_calls || !held_calls) { + CALL_ENG_DEBUG(ENG_DEBUG, "Join Impossible..."); + bconf = FALSE; + } else { + /* Joining call is impossile when member is more than max + Max Number in Group + Another Call*/ + if (total_call_member >= (VC_MAX_CALL_GROUP_MEMBER + 1)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with FALSE..."); + bconf = FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Ended with TRUE..."); + bconf = TRUE; + } + } + + *pbconf_call = bconf; + return ERROR_VOICECALL_NONE; + +} + +/** +* This function retreives the call state of the given call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of particular call +* @param[out] pcall_state Contains the call state of the given call handle +* @remarks pvoicecall_agent and pcall_state cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_get_call_state_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle, voicecall_call_state_t *pcall_state) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object = { 0 }; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_state != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_CALL_HANDLE); + + _vc_core_cm_clear_call_object(&call_object); + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + *pcall_state = call_object.state; + return ERROR_VOICECALL_NONE; + } + + *pcall_state = VC_CALL_STATE_NONE; + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +#if 0 /*unused*/ +/** +* This function retrieves call handle of the any one of the calls of given type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] connected_call_type Connected call type +* @param[out] pcall_handle Contains the Call handle on return +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +*/ +voicecall_error_t voicecall_get_any_call_handle(voicecall_engine_t *pvoicecall_agent, voicecall_connected_call_type_t connected_call_type, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_handle callhandle = -1; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + switch (connected_call_type) { + case VC_ACTIVE_CALL: + { + _vc_core_cm_get_first_active_call_handle(&pagent->call_manager, &callhandle); + } + break; + case VC_HELD_CALL: + { + _vc_core_cm_get_first_held_call_handle(&pagent->call_manager, &callhandle); + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + if (-1 != callhandle) { + *pcall_handle = (int)callhandle; + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} +#endif + +/** +* This function checks if any call is ending and retrieves its call number if it is ending +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] bcall_ending TRUE if any call is being ended, FALSE otherwise +* @remarks pvoicecall_agent and bcall_ending cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_any_call_ending(voicecall_engine_t *pvoicecall_agent, gboolean *bcall_ending) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bcall_ending != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *bcall_ending = FALSE; + *bcall_ending = _vc_core_cm_get_ending_call_info(&pagent->call_manager); + + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks whther engine is busy in processing any events or waiting for any events to process +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[out] bbusy TRUE - if engine is busy in processing any events or waiting for any events, FALSE - otherwise +* @remarks pvoicecall_agent and bbusy cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_engine_busy(voicecall_engine_t *pvoicecall_agent, gboolean *bbusy) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bbusy != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Call Agent State:%d", pagent->callagent_state); + if (CALL_VC_CA_STATE_NORMAL == pagent->callagent_state) { + *bbusy = FALSE; + } else { + *bbusy = TRUE; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function sets the given flag to engine for processing during call end. +* This function has to be used after calling the end call API +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_flag End Flag to be set +* @remarks pvoicecall_agent and bsscode cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_set_end_flag(voicecall_engine_t *pvoicecall_agent, voicecall_end_flag_t end_flag) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + switch (end_flag) { + case VC_RETREIVE_CALL_ON_MOCALL_END: + { + pagent->callagent_state = CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL; + } + break; + default: + return ERROR_VOICECALL_INVALID_ARGUMENTS; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks whether the given string is MMI string or not +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pinput_number Input string to be verified +* @param[out] bsscode TRUE - if the given string is a valid ss code, FALSE otherwise +* @remarks pvoicecall_agent and bsscode cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_isvalid_ss_code(voicecall_engine_t *pvoicecall_agent, const char *pinput_number, gboolean *bsscode) +{ + int strLen = 0; + call_vc_ss_si_format si_format = SS_SI_FORMAT_INVALID; + + VOICECALL_RETURN_VALUE_IF_FAIL(pvoicecall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pinput_number != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bsscode != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + si_format = SS_SI_FORMAT_VALID; + strLen = strlen(pinput_number); + + CALL_ENG_DEBUG(ENG_DEBUG, "strLen = %d", strLen); + + if (strLen > 2) { + /* Deactivate : "#...#" */ + /* Erase : "##...#" */ + if (((pinput_number[0] == '#') && (pinput_number[strLen - 1] == '#')) || ((pinput_number[0] == '+') && (pinput_number[1] == '#') && (pinput_number[strLen - 1] == '#'))) { + si_format = _vc_core_util_check_si_format(pinput_number); + *bsscode = TRUE; + return ERROR_VOICECALL_NONE; + } + + /* Activate : "*...#" */ + /* Interrogate : "*#...#" */ + /* Register : "**...#" */ + if ((('*' == pinput_number[0]) && ('#' == pinput_number[strLen - 1])) || (('+' == pinput_number[0]) && ('*' == pinput_number[1]) && ('#' == pinput_number[strLen - 1]))) { + si_format = _vc_core_util_check_si_format(pinput_number); + *bsscode = TRUE; + return ERROR_VOICECALL_NONE; + } + } else if (2 == strLen) { +/*This will be covered, once the operator requirements are clear*/ +#ifdef MCC_USA_SS_CODE + unsigned long mcc = 0; + tapi_network_info_t networkInfo; + + memset(&networkInfo, 0x00, sizeof(tapi_network_info_t)); + + tapi_get_network_info(&networkInfo); + + networkInfo.sysid.sysid = (networkInfo.sysid.sysid >> 16); + mcc = (networkInfo.sysid.sysid & 0x0000ffff); + CALL_ENG_DEBUG(ENG_DEBUG, "mcc (%d)!!", mcc); + + /*CALL_NETWORK_MCC_USA */ + if (mcc == 0x136) { + if (strncmp(pinput_number, "08", 2) == 0 || strncmp(pinput_number, "00", 2) == 0) + *bsscode = FALSE; + } +#endif + /*08 is not a ss string.*/ + if (strncmp(pinput_number, "08", 2) == 0) { + *bsscode = FALSE; + } else { + /*All two digit number should be handled as ss string during call.*/ + CALL_ENG_DEBUG(ENG_DEBUG, "two digit number... returns TRUE"); + *bsscode = TRUE; + } + + return ERROR_VOICECALL_NONE; + } else if (1 == strLen) { + if (('#' == pinput_number[0]) || ('+' == pinput_number[0]) || ('*' == pinput_number[0]) || ('7' == pinput_number[0])) { + *bsscode = TRUE; + return ERROR_VOICECALL_NONE; + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "invalid sscode... returns FALSE"); + *bsscode = FALSE; + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_status_dump_call_details(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + CALL_ENG_DEBUG(ENG_DEBUG, ""); + _vc_core_cm_test_dump(&pagent->call_manager); + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of making private calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] bzuhause Contains TRUE if zuhause area, FALSE otherwise +* @remarks pvoicecall_agent and pbprivate_call cannot be NULL +*/ +voicecall_error_t _vc_core_engine_status_is_zuhause_area(voicecall_engine_t *pvoicecall_agent, gboolean *bzuhause) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bzuhause != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + *bzuhause = _vc_core_util_check_zuhause_status(); + return ERROR_VOICECALL_NONE; +} + +/** +* This function checks the possiblity of making private calls +* +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] b_download_call Contains TRUE if zuhause area, FALSE otherwise +* @remarks pvoicecall_agent and pbprivate_call cannot be NULL +*/ +void _vc_core_engine_status_set_download_call(voicecall_engine_t *pvoicecall_agent, gboolean b_download_call) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + if (pagent == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "pagent is NULL! [PROBLEM] !!!"); + return; + } + + pagent->bdownload_call = b_download_call; + +} + +gboolean _vc_core_engine_status_get_download_call(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + return pcall_agent->bdownload_call; +} diff --git a/call-engine/core/vc-core-engine.c b/call-engine/core/vc-core-engine.c new file mode 100755 index 0000000..c7bbd08 --- /dev/null +++ b/call-engine/core/vc-core-engine.c @@ -0,0 +1,3192 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include + +/* Call Module File Includes */ +#include "vc-core-engine.h" +#include "vc-core-callagent.h" +#include "vc-core-callmanager.h" +#include "vc-core-util.h" +#include "vc-core-tapi-evnt.h" +#include "vc-core-tapi-rqst.h" +#include "vc-core-svcall.h" +#include "vc-core-engine-status.h" +#include "vc-core-ecc.h" + +/*Global Variable Declerations */ +/*Incoming Call Details used for Self Event*/ +static call_vc_handle gincoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; +static TelCallIncomingCallInfo_t gincoming_call_info; + +/*Initialization Global Variables*/ +static gboolean gphone_init_finished = FALSE; +static call_vc_handle gphone_rejected_call = VC_TAPI_INVALID_CALLHANDLE; + +static call_vc_callagent_state_t *gpcall_agent_for_callback = NULL; /*jspark event subscribe & callback function*/ + +/* SAT call detail used for self event */ +static int gsat_event_type = 0; +static void *gpresult = NULL; +static TelSatSetupCallIndCallData_t gSatSetupCallInfo; +static TelSatSendDtmfIndDtmfData_t gSatSendDtmfInfo; + + +/*Local Function Declarations*/ +/** + * This function handles the end event for outgoing call + * + * @internal + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the call agent + * @param[in] call_handle call handle of the outgoing call + * @param[in] type type of the tapi event + * @param[in] tapi_cause tapi cause + */ +static gboolean __call_vc_outgoingcall_endhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, const char *type, TelTapiEndCause_t tapi_cause); +/** + * This function handles the end event for incoming call + * + * @internal + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to the call agent + * @param[in] call_handle call handle of the outgoing call + */ +static gboolean __call_vc_incomingcall_endhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); +/** + * This function checks whether the call agent is in any of the wait state + * + * @internal + * @return Returns TRUE on if call agent is in wait state or FALSE + * @param[in] pcall_agent Handle to the call agent + */ +static gboolean __call_vc_is_callagent_waitstate(call_vc_callagent_state_t *pcall_agent); +/** + * This function creates call details for outgoign call with the given setup info + * + * @internal + * @return Returns TRUE on if call agent is in wait state or FALSE + * @param[in] pagent Handle to the call agent + * @param[in] psetup_call_info Setup info + * @param[out] pcall_object Call object containing call details + * @param[out] error_code Error Code + */ +static gboolean __call_vc_create_outgoing_callinfo(call_vc_callagent_state_t *pagent, voicecall_setup_info_t *psetup_call_info, call_vc_call_objectinfo_t *pcall_object, int *error_code); + +/** + * This function handles all telephony events + * + * @internal + * @return void +* @param[in] tapi_handle tapi handle +* @param[in] noti_id event type +* @param[in] data tapi event data +* @param[in] userdata user callback data + */ + +static void __call_vc_handle_tapi_events(TapiHandle *handle, const char *noti_id, void *data, void *user_data); + +/** +* This function handles sat engine notification +* +* @internal +* @return void +* @param[in] tapi_handle tapi handle +* @param[in] noti_id event type +* @param[in] data tapi event data +* @param[in] userdata user callback data +*/ +static void __call_vc_handle_sat_engine_events_cb(TapiHandle *handle, const char *noti_id, void *data, void *user_data); + +/** +* This function subscribes for all notifications required for voicecall engine +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static gboolean __call_vc_subscribe_call_events(call_vc_callagent_state_t *pcall_agent); + +/** +* This function handles telephony initialized notifications +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] tapi_handle tapi handle +* @param[in] noti_id event type +* @param[in] data tapi event data +* @param[in] userdata user callback data +*/ +static void __call_vc_tapi_initialized_cb(TapiHandle *handle, const char *noti_id, void *data, void *user_data); + +/** +* This function subscribes for telephony call notifications +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static gboolean __call_vc_subscribe_tapi_event(call_vc_callagent_state_t *pcall_agent); + +/** +* This function request the engine to setup a sat call +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pagent handle to voicecall agent structure +* @param[in] mo_call_index call index of the mo call prepared for sat call +* @param[in] ret_code Error code +* @exception ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED +*/ +static gboolean __call_vc_request_sat_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code); + +/** +* This function hadles the events from the sat engine +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent handle to voicecall agent structure +* @param[in] sat_event event type (sat request / sat response) +* @param[in] sat_event_type sat event sub type +* @param[in] result data received from sat +*/ +static gboolean __call_vc_handle_sat_engine_events(call_vc_callagent_state_t *pcall_agent, int sat_event, int sat_event_type, void *result); + +/** +* This function request the engine to setup a normal voice call +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pagent handle to voicecall agent structure +* @param[in] mo_call_index call index of the mo call prepared for sat call +* @param[in] ret_code Error code +* @exception ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED +*/ +static gboolean __call_vc_request_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code); + +/** +* This function serves as the callback function for the incoming call idle add function +* +* @return Returns TRUE - if the callback has to be called again, FALSE otherwise +* @param[in] puser_data data set by the user +*/ +static gboolean __call_vc_incoming_idle_cb(gpointer puser_data); +static gboolean __call_vc_incoming_call_end_idle_cb(gpointer puser_data); +static gboolean __call_vc_reject_call_idle_cb(gpointer puser_data); +static gboolean __call_vc_reject_call_full_idle_cb(gpointer puser_data); + +/** +* This function serves as the callback function for the SAT idle add function +* +* @return Returns TRUE - if the callback has to be called again, FALSE otherwise +* @param[in] puser_data data set by the user +*/ +static gboolean __call_vc_sat_idle_cb(gpointer puser_data); + +/** + * This function checks the voicecall engine's idle status and send VC_ACTION_NO_ACTIVE_TASK to client if engine is idle + * + * @return void + * @param[in] pcall_agent Pointer to the call agent structure + */ +static void __vc_core_check_engine_active_task(call_vc_callagent_state_t *pcall_agent); + +/** + * This function checks whether dtmf is possible + * + * @return This function returns TRUE if dtmf is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +static gboolean __vc_core_is_dtmf_possible(call_vc_callagent_state_t *pcall_agent); + +/** +* This function initializes the voicecall engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[out] pcall_agent_out Pointer to the address of call agent +* @param[in] pcallback_func Call back function +* @param[in] puser_data Data set by user +* @remarks pcall_agent_out and pcallback_func cannot be NULL. +* Output Parameter pcall_agent_out should be initialized to NULL +*/ +voicecall_error_t _vc_core_engine_init(voicecall_engine_t **pcall_agent_out, voicecall_cb pcallback_func, void *puser_data) +{ + call_vc_callagent_state_t *pcall_agent = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Engine"); + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent_out != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(*pcall_agent_out == NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Initialize Call Agent*/ + pcall_agent = _vc_core_ca_init_agent(); + if (NULL == pcall_agent) { + return ERROR_VOICECALL_MEMALLOC_FAILURE; + } + + if (FALSE == __call_vc_subscribe_call_events(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Event Subscrition Failed"); + _vc_core_ca_finish_agent(pcall_agent); + return ERROR_VOICECALL_NOTI_FAILED; + } + /*Store the Callback Pointer*/ + pcall_agent->client_callback = pcallback_func; + pcall_agent->puser_data = puser_data; + + /*Calls to Tapi Should not be made in the application initialization, because this code will be executed if application is launched during + an incoming call also. so DBus Lock up can happen.*/ + gphone_init_finished = TRUE; + + /*Init Success, Assign Output Parameters*/ + *pcall_agent_out = (voicecall_engine_t *)pcall_agent; + + return ERROR_VOICECALL_NONE; +} + +void _vc_core_engine_handle_sat_events_cb(void *sat_setup_call_data, void *userdata) +{ + char *data = sat_setup_call_data; + + call_vc_callagent_state_t *pcall_agent = gpcall_agent_for_callback; + + CALL_ENG_DEBUG(ENG_DEBUG, "sat event callback."); + + memset(&gSatSetupCallInfo, 0, sizeof(TelSatSetupCallIndCallData_t)); + memcpy(&gSatSetupCallInfo, data, sizeof(TelSatSetupCallIndCallData_t)); + + gsat_event_type = SAT_RQST_SETUP_CALL; + gpresult = &gSatSetupCallInfo; + g_idle_add(__call_vc_sat_idle_cb, pcall_agent); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call back Ends and returning.."); +} + +static void __call_vc_handle_sat_engine_events_cb(TapiHandle *handle, const char *noti_id, void *data, void *user_data) +{ + call_vc_callagent_state_t *pcall_agent = gpcall_agent_for_callback; + + CALL_ENG_DEBUG(ENG_DEBUG, "sat event callback."); + + if (strcmp(noti_id, TAPI_NOTI_SAT_SEND_DTMF) == 0) { + /* async for SAT sync noti */ + memset(&gSatSendDtmfInfo, 0, sizeof(TelSatSendDtmfIndDtmfData_t)); + memcpy(&gSatSendDtmfInfo, data, sizeof(TelSatSendDtmfIndDtmfData_t)); + + gsat_event_type = SAT_RQST_SEND_DTMF; + gpresult = &gSatSendDtmfInfo; + + g_idle_add(__call_vc_sat_idle_cb, pcall_agent); + + CALL_ENG_DEBUG(ENG_DEBUG, "Do not check an active task here"); + } +#if 0 /* It needs to implement*/ + else if (strcmp(noti_id, TAPI_EVENT_SAT_CALL_CONTROL_IND) == 0) { + __call_vc_handle_sat_engine_events(pcall_agent, VC_ACTION_SAT_RESPONSE, SAT_RESP_SETUP_CALL, event_type, data); + + /*Send Process Termintate Event to the Client */ + __vc_core_check_engine_active_task(pcall_agent); + } +#endif + + CALL_ENG_DEBUG(ENG_DEBUG, "Call back Ends and returning.."); +} + +/*Subscribe Noti Events*/ +static gboolean __call_vc_subscribe_call_events(call_vc_callagent_state_t *pcall_agent) +{ + CALL_ENG_KPI("__call_vc_subscribe_tapi_event start"); + /* Subscribe Tapi Events */ + if (FALSE == __call_vc_subscribe_tapi_event(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Noti subscribe to Tapi Events failed"); + return FALSE; + + } + CALL_ENG_KPI("__call_vc_subscribe_tapi_event done"); + + CALL_ENG_DEBUG(ENG_DEBUG, "Noti Subscription Sucess"); + return TRUE; +} + +/** + * This function sends response event to the registered client + * + * @return This function returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] event response event type + * @param[in] param1 param 1 to be passed to the client + * @param[in] param2 param 2 to be passed to the client + * @param[in] param3 param 3 to be passed to the client + */ +gboolean _vc_core_ca_send_event_to_client(call_vc_callagent_state_t *pcall_agent, int event, int param1, int param2, void *param3) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Sending Event to Client"); + if (pcall_agent->client_callback != NULL) { + return pcall_agent->client_callback(event, param1, param2, param3, pcall_agent->puser_data); + } + return FALSE; +} + +static void __call_vc_tapi_initialized_cb(TapiHandle *handle, const char *noti_id, void *data, void *user_data) +{ + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + TelSimCardStatus_t sim_status = 0; + TelSimCardType_t card_type = 0; + int sim_changed = 0; + + VOICECALL_RETURN_IF_FAIL(data != NULL); + tapi_power_phone_power_status_t power; + + memset(&power, 0, sizeof(tapi_power_phone_power_status_t)); + memcpy(&power, data, sizeof(tapi_power_phone_power_status_t)); + + if (power != TAPI_PHONE_POWER_STATUS_ON) { + CALL_ENG_DEBUG(ENG_DEBUG, "Modem is not available"); + return; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "gphone_init_finished %d", gphone_init_finished); + + if (gphone_init_finished != TRUE) { + gphone_init_finished = TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Query Card Status .."); + + memset(&sim_status, 0, sizeof(sim_status)); + tapi_err = tel_get_sim_init_info(pagent->tapi_handle, &sim_status, &sim_changed); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_get_sim_init_info failed.. tapi_err = %d", tapi_err); + pagent->bis_no_sim = TRUE; + } else { + + tapi_err = tel_get_sim_type(pagent->tapi_handle, &card_type); + if (TAPI_API_SUCCESS == tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_get_sim_type failed.. tapi_err = %d", tapi_err); + } + + pagent->card_type = card_type; + + CALL_ENG_DEBUG(ENG_DEBUG, "card_status = %d, card_type = %d", sim_status, pagent->card_type); + /*Telephony team's reqeust..*/ + switch (sim_status) { + case TAPI_SIM_STATUS_CARD_NOT_PRESENT: /* = 0x01, < Card not present */ + case TAPI_SIM_STATUS_CARD_REMOVED: /* =0x0b, < Card removed **/ + pagent->bis_no_sim = TRUE; + break; + case TAPI_SIM_STATUS_CARD_ERROR: /* = 0x00, < Bad card / On the fly SIM gone bad **/ + case TAPI_SIM_STATUS_SIM_INITIALIZING: /* = 0x02, < Sim is Initializing state **/ + case TAPI_SIM_STATUS_SIM_INIT_COMPLETED: /* = 0x03, < Sim Initialization ok **/ + case TAPI_SIM_STATUS_SIM_PIN_REQUIRED: /* = 0x04, < PIN required state **/ + case TAPI_SIM_STATUS_SIM_PUK_REQUIRED: /* = 0x05, < PUK required state **/ + case TAPI_SIM_STATUS_CARD_BLOCKED: /* = 0x06, < PIN/PUK blocked(permanently blocked- All the attempts for PIN/PUK failed) **/ + case TAPI_SIM_STATUS_SIM_NCK_REQUIRED: /* = 0x07, < Network Control Key required state **/ + case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED: /* = 0x08, < Network Subset Control Key required state **/ + case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED: /* = 0x09, < Service Provider Control Key required state **/ + case TAPI_SIM_STATUS_SIM_CCK_REQUIRED: /* = 0x0a, < Corporate Control Key required state **/ + case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED: + pagent->bis_no_sim = FALSE; + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Unknown Card_status = %d", sim_status); + pagent->bis_no_sim = TRUE; + break; + } + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "gphone_init_finished is TRUE."); + } + + /*As a Backup, whenever this event is arrived, just update this variable*/ + gphone_init_finished = TRUE; +} + +static gboolean __call_vc_subscribe_tapi_event(call_vc_callagent_state_t *pcall_agent) +{ + int index = 0; + + TapiResult_t api_err = TAPI_API_SUCCESS; + int num_event = 0; + + pcall_agent->tapi_handle = tel_init(NULL); + if (pcall_agent->tapi_handle != NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_init() success."); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_init() failed."); + return FALSE; + } + + const char *call_event_list[] = { + TAPI_NOTI_VOICE_CALL_STATUS_IDLE, + TAPI_NOTI_VOICE_CALL_STATUS_ACTIVE, + TAPI_NOTI_VOICE_CALL_STATUS_DIALING, + TAPI_NOTI_VOICE_CALL_STATUS_ALERT, + TAPI_NOTI_VOICE_CALL_STATUS_INCOMING, + TAPI_NOTI_VOICE_CALL_STATUS_WAITING, + TAPI_NOTI_CALL_INFO_CALL_CONNECTED_LINE, + TAPI_NOTI_CALL_INFO_WAITING, + TAPI_NOTI_CALL_INFO_CUG, + TAPI_NOTI_CALL_INFO_FORWARDED, + TAPI_NOTI_CALL_INFO_BARRED_INCOMING, + TAPI_NOTI_CALL_INFO_BARRED_OUTGOING, + TAPI_NOTI_CALL_INFO_DEFLECTED, + TAPI_NOTI_CALL_INFO_CLIR_SUPPRESSION_REJECT, + TAPI_NOTI_CALL_INFO_FORWARD_UNCONDITIONAL, + TAPI_NOTI_CALL_INFO_FORWARD_CONDITIONAL, + TAPI_NOTI_CALL_INFO_CALL_LINE_IDENTITY, + TAPI_NOTI_CALL_INFO_CALL_NAME_INFORMATION, + TAPI_NOTI_CALL_INFO_FORWARDED_CALL, + TAPI_NOTI_CALL_INFO_CUG_CALL, + TAPI_NOTI_CALL_INFO_DEFLECTED_CALL, + TAPI_NOTI_CALL_INFO_TRANSFERED_CALL, + TAPI_NOTI_CALL_INFO_HELD, + TAPI_NOTI_CALL_INFO_ACTIVE, + TAPI_NOTI_CALL_INFO_JOINED, + TAPI_NOTI_CALL_INFO_RELEASED_ON_HOLD, + TAPI_NOTI_CALL_INFO_TRANSFER_ALERT, + TAPI_NOTI_CALL_INFO_TRANSFERED, + TAPI_NOTI_CALL_SOUND_WBAMR, + TAPI_NOTI_CALL_SOUND_CLOCK_STATUS, + }; + num_event = sizeof(call_event_list) / sizeof(char *); + for (index = 0; index < num_event; index++) { + api_err = tel_register_noti_event(pcall_agent->tapi_handle, call_event_list[index], __call_vc_handle_tapi_events, NULL); + if (api_err != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_noti_event() failed.. event id:[%s], api_err:[%d]", call_event_list[index], api_err); + return FALSE; + } + } + + const char *ready_event_list[] = { + TAPI_NOTI_MODEM_POWER, + }; + num_event = sizeof(ready_event_list) / sizeof(char *); + for (index = 0; index < num_event; index++) { + api_err = tel_register_noti_event(pcall_agent->tapi_handle, ready_event_list[index], __call_vc_tapi_initialized_cb, NULL); + if (api_err != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_noti_event() failed.. event id:[%s], api_err:[%d]", ready_event_list[index], api_err); + return FALSE; + } + } + + const char *sat_event_list[] = { + TAPI_NOTI_SAT_SEND_DTMF, + }; + + num_event = sizeof(sat_event_list) / sizeof(char *); + for (index = 0; index < num_event; index++) { + api_err = tel_register_noti_event(pcall_agent->tapi_handle, sat_event_list[index], __call_vc_handle_sat_engine_events_cb, NULL); + if (api_err != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_register_noti_event() failed.. event id:[%s], api_err:[%d]", sat_event_list[index], api_err); + return FALSE; + } + } + + gpcall_agent_for_callback = pcall_agent; + + CALL_ENG_DEBUG(ENG_DEBUG, "Subscribe to TAPI Success"); + + return TRUE; + +} + +static gboolean __call_vc_create_outgoing_callinfo(call_vc_callagent_state_t *pagent, voicecall_setup_info_t *psetup_call_info, call_vc_call_objectinfo_t *pcall_object, int *error_code) +{ + char call_number[VC_PHONE_NUMBER_LENGTH_MAX] = { 0, }; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_type=%d", psetup_call_info->call_type); + + _vc_core_cm_clear_call_object(pcall_object); + + /*Update CallObjects state to Prepare Outgoing*/ + pcall_object->state = VC_CALL_STATE_PREPARE_OUTGOING; + + /*Update Call|Objects Call Type*/ + pcall_object->call_type = psetup_call_info->call_type; + + /*Update Call Objects Identity*/ + pcall_object->identity_mode = psetup_call_info->identity_mode; + + /*Differentiate the call by its source of origination*/ + switch (pcall_object->call_type) { + case VC_CALL_ORIG_TYPE_EMERGENCY: + { + pcall_object->bemergency_number = TRUE; + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + return TRUE; + } + break; + case VC_CALL_ORIG_TYPE_PINLOCK: + { + CALL_ENG_DEBUG(ENG_DEBUG, "PIN LOCK!!!!"); + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + case VC_CALL_ORIG_TYPE_NOSIM: /*no sim (pagent->bis_no_sim == TRUE)*/ + { + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + case VC_CALL_ORIG_TYPE_NORMAL: + case VC_CALL_ORIG_TYPE_SAT: + { + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + case VC_CALL_ORIG_TYPE_VOICEMAIL: + { + _vc_core_util_strcpy(pcall_object->source_tel_number, sizeof(pcall_object->source_tel_number), psetup_call_info->source_tel_number); + _vc_core_util_strcpy(pcall_object->tel_number, sizeof(pcall_object->tel_number), psetup_call_info->tel_number); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalide Call Type: %d", pcall_object->call_type); + *error_code = ERROR_VOICECALL_INVALID_CALL_TYPE; + return FALSE; + } + + /*Copy CUG Details */ + memcpy(&pcall_object->cug_info, &psetup_call_info->cug_info, sizeof(voicecall_cug_info_t)); + + /*Check for Emergency Number */ + _vc_core_util_extract_call_number(pcall_object->tel_number, call_number, sizeof(call_number)); + pcall_object->bemergency_number = _vc_core_ecc_check_emergency_number(pagent->tapi_handle, pagent->card_type, call_number, pagent->bis_no_sim, &pcall_object->ecc_category); + + CALL_ENG_DEBUG(ENG_DEBUG, "no_sim=%d, emergency_number=%d", pagent->bis_no_sim, pcall_object->bemergency_number); + + if (VC_CALL_ORIG_TYPE_PINLOCK == pcall_object->call_type && pcall_object->bemergency_number == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "PIN/PUK Lock and number is no emergency number, call cannot be made"); + *error_code = ERROR_VOICECALL_EMERGENCY_CALLS_ONLY; + return FALSE; + } + + if (pagent->bis_no_sim == TRUE && pcall_object->bemergency_number == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sim Not available and number is no emergency number, call cannot be made"); + *error_code = ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM; + return FALSE; + } + + if (TRUE == pcall_object->bemergency_number) { + CALL_ENG_DEBUG(ENG_DEBUG, "Number is Emergency Number, Change call type to emergency"); + psetup_call_info->call_type = pcall_object->call_type = VC_CALL_ORIG_TYPE_EMERGENCY; + psetup_call_info->ecc_category = pcall_object->ecc_category; + } + + return TRUE; +} + +static gboolean __call_vc_request_sat_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code) +{ + call_vc_call_objectinfo_t callInfo; + TelSatCmdQualiSetupCall_t sat_request_type = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "mo_call_index = %d", mo_call_index); + + VOICECALL_RETURN_FALSE_IF_FAIL(pagent->call_manager.setupcall_info.mocall_index == mo_call_index); + + if (FALSE == _vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &callInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + *ret_code = ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + return FALSE; + } + + sat_request_type = pagent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype; + + CALL_ENG_DEBUG(ENG_DEBUG, " SAT_CALL sat_request_type=%d", sat_request_type); + + switch (sat_request_type) { + case TAPI_SAT_SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY_WITH_REDIAL: + { + pagent->call_manager.setupcall_info.satcall_setup_info.redial = TRUE; + } + case TAPI_SAT_SETUP_CALL_IF_ANOTHER_CALL_NOT_BUSY: /*Fall Through*/ + { + /* one is the call set up by SAT, so more than 1 means another call exists */ + if (_vc_core_cm_get_call_member_count(&pagent->call_manager) > 1) { + /* voice call agent is busy */ + CALL_ENG_DEBUG(ENG_DEBUG, "Call Exists, SAT call connot be continued"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + *ret_code = ERROR_VOICECALL_CALL_NOT_ALLOWED; + return FALSE; + } + + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &callInfo); + + if (_vc_core_tapi_rqst_prepare_setup_call(pagent) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Prepare Setup Call Success"); + } + } + break; + case TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL: + { + pagent->call_manager.setupcall_info.satcall_setup_info.redial = TRUE; + } + case TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD: /*Fall Through */ + { + if (_vc_core_cm_isexists_active_call(&pagent->call_manager) && _vc_core_cm_isexists_held_call(&pagent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Both Activee & Hld call exists, SAT Call cannot be continued"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + *ret_code = ERROR_VOICECALL_CALL_NOT_ALLOWED; + return FALSE; + } + if (_vc_core_cm_isexists_connected_call(&pagent->call_manager)) { + if (FALSE == _vc_core_tapi_rqst_prepare_setup_call(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL hold fail"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } + } else { + /*If no other calls to hold, setup the call directly */ + if (FALSE == _vc_core_tapi_rqst_setup_call(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } + } + } + break; + case TAPI_SAT_SETUP_CALL_DISCONN_ALL_OTHER_CALLS_WITH_REDIAL: + { + pagent->call_manager.setupcall_info.satcall_setup_info.redial = TRUE; + } + case TAPI_SAT_SETUP_CALL_DISCONN_ALL_OTHER_CALLS: /*Fall Through */ + { + if (_vc_core_cm_isexists_active_call(&pagent->call_manager) || _vc_core_cm_isexists_held_call(&pagent->call_manager)) { + /*Disconnect all calls and setup call */ + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP); + _vc_core_tapi_rqst_release_all_calls(pagent); + } else { + if (FALSE == _vc_core_tapi_rqst_prepare_setup_call(pagent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + return FALSE; + } + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this SAT Request Type"); + return FALSE; + } + + return TRUE; +} + +static gboolean __call_vc_request_call(call_vc_callagent_state_t *pagent, int mo_call_index, int *ret_code) +{ + call_vc_call_objectinfo_t callInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + VOICECALL_RETURN_FALSE_IF_FAIL(pagent->call_manager.setupcall_info.mocall_index == mo_call_index); + + _vc_core_cm_clear_call_object(&callInfo); + if (_vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &callInfo) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + *ret_code = ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + return FALSE; + } + /*Switch according to the CallType requested*/ + switch (callInfo.call_type) { + case VC_CALL_ORIG_TYPE_NORMAL: + case VC_CALL_ORIG_TYPE_EMERGENCY: + case VC_CALL_ORIG_TYPE_NOSIM: + case VC_CALL_ORIG_TYPE_SAT: + case VC_CALL_ORIG_TYPE_PINLOCK: + + /*Set the updated Object Info to the Call Manager*/ + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &callInfo); + + if (_vc_core_tapi_rqst_prepare_setup_call(pagent) == FALSE) { + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + *ret_code = ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED; + CALL_ENG_DEBUG(ENG_DEBUG, "Prepare Setup Call Failed"); + + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Prepare Setup Call Success"); + } + + break; + default: + *ret_code = ERROR_VOICECALL_INVALID_CALL_TYPE; + CALL_ENG_DEBUG(ENG_DEBUG, "Not defined call type=%d", pagent->call_manager.setupcall_info.call_type); + return FALSE; + break; + } + + return TRUE; +} + +/** +* This function prepares the call setup info structure for making call + * +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] psetup_call_info Pointer to the call setup info structure. +* @remarks pvoicecall_agent and psetup_call_info cannot be NULL +* Only on successfull completion of this API, _vc_core_engine_make_call can be made +* @see See following API's also +* -_vc_core_engine_make_call +* -voicecall_clear_prepared_call +* + */ +voicecall_error_t _vc_core_engine_prepare_call(voicecall_engine_t *pvoicecall_agent, voicecall_setup_info_t *psetup_call_info) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t callobject_info; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + TelSimCardStatus_t sim_status; + TelSimCardType_t card_type = 0; + int sim_changed = 0; + int status = 0; + int nIndex = 0; + int error_code = 0; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(psetup_call_info != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (FALSE == _vc_core_util_isvalid_telephone_number(psetup_call_info->tel_number)) { + return ERROR_VOICECALL_INVALID_TELEPHONE_NUMBER; + } + + CALL_ENG_KPI("tel_check_modem_power_status start"); + tapi_err = tel_check_modem_power_status(pagent->tapi_handle, &status); + CALL_ENG_KPI("tel_check_modem_power_status done"); + if (TAPI_API_SUCCESS != tapi_err || 1 /* offline */ == status || 2 /* Error */== status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi not initialized"); + return ERROR_VOICECALL_PHONE_NOT_INITIALIZED; + } + /*Check the Call Engines IO State*/ + if (pagent->io_state != VC_INOUT_STATE_NONE && pagent->io_state != VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX) { + CALL_ENG_DEBUG(ENG_DEBUG, "pagent->io_state != VC_INOUT_STATE_NONE..io_state=%d", pagent->io_state); + return ERROR_VOICECALL_ENGINE_STATE_NOT_NONE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Checking for SIM Availablity"); + + /*memset(&sim_status, 0, sizeof(sim_status));*/ + CALL_ENG_KPI("tel_get_sim_init_info start"); + tapi_err = tel_get_sim_init_info(pagent->tapi_handle, &sim_status, &sim_changed); + CALL_ENG_KPI("tel_get_sim_init_info done"); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_get_sim_init_info failed.. tapi_err = %d", tapi_err); + + pagent->bis_no_sim = TRUE; + psetup_call_info->call_type = VC_CALL_ORIG_TYPE_NOSIM; + } else { + CALL_ENG_KPI("tel_get_sim_type start"); + tapi_err = tel_get_sim_type(pagent->tapi_handle, &card_type); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_get_sim_type failed.. tapi_err = %d", tapi_err); + } + CALL_ENG_KPI("tel_get_sim_type done"); + pagent->card_type = card_type; + + CALL_ENG_DEBUG(ENG_DEBUG, "card_status = %d, card_type = %d", sim_status, pagent->card_type); + switch (sim_status) { + case TAPI_SIM_STATUS_CARD_NOT_PRESENT: /* = 0x01, < Card not present **/ + case TAPI_SIM_STATUS_CARD_REMOVED: /* =0x0b, < Card removed **/ + pagent->bis_no_sim = TRUE; + break; + case TAPI_SIM_STATUS_CARD_ERROR: /* = 0x00, < Bad card / On the fly SIM gone bad **/ + case TAPI_SIM_STATUS_SIM_INITIALIZING: /* = 0x02, < Sim is Initializing state **/ + case TAPI_SIM_STATUS_SIM_INIT_COMPLETED: /* = 0x03, < Sim Initialization ok **/ + case TAPI_SIM_STATUS_SIM_PIN_REQUIRED: /* = 0x04, < PIN required state **/ + case TAPI_SIM_STATUS_SIM_PUK_REQUIRED: /* = 0x05, < PUK required state **/ + case TAPI_SIM_STATUS_CARD_BLOCKED: /* = 0x06, < PIN/PUK blocked(permanently blocked- All the attempts for PIN/PUK failed) **/ + case TAPI_SIM_STATUS_SIM_NCK_REQUIRED: /* = 0x07, < Network Control Key required state **/ + case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED: /* = 0x08, < Network Subset Control Key required state **/ + case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED: /* = 0x09, < Service Provider Control Key required state **/ + case TAPI_SIM_STATUS_SIM_CCK_REQUIRED: /* = 0x0a, < Corporate Control Key required state **/ + case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED: + pagent->bis_no_sim = FALSE; + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Unknown Card_status = %d", sim_status); + pagent->bis_no_sim = TRUE; + break; + } + } + + /*Prepare Outgoing Call Info*/ + _vc_core_cm_clear_call_object(&callobject_info); + if (__call_vc_create_outgoing_callinfo(pagent, psetup_call_info, &callobject_info, &error_code) == FALSE) { + return error_code; + } + + /* Check for MO Call Possiblity */ + if (_vc_core_ca_is_mocall_possible(pagent, callobject_info.bemergency_number) == FALSE) { + return ERROR_VOICECALL_CALL_NOT_ALLOWED; + } + + /* Add the prepared call object to the CallManager */ + nIndex = _vc_core_cm_add_call_object(&pagent->call_manager, &callobject_info); + if (nIndex != -1) { + /*If there is a previously made MO Call, clear that before setting the new mo call */ + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_cm_set_outgoing_call(&pagent->call_manager, nIndex); + psetup_call_info->mo_call_index = nIndex; + } else { + return ERROR_VOICECALL_CALL_NOT_ALLOWED; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function clears the data of the given call type. +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_type call type +* @param[in] call_handle Call handle of the connected call to be cleared +* @remarks This will clear the call data only when the call data are currently not being used +* i,e) the data will be cleared only if the corresponding call is ended or the call data is not used at all. +* call_handle argument is required only in case of connected call, Engine ignores call_handle for other +* call types. +*/ +voicecall_error_t _vc_core_engine_finalize_call(voicecall_engine_t *pvoicecall_agent, voicecall_call_type_t call_type, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean bret_val = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, "call_type = %d", call_type); + + switch (call_type) { + case VC_OUTGOING_CALL: + { + if ((VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pagent->io_state) || (VC_INOUT_STATE_OUTGOING_WAIT_ORIG == pagent->io_state) || (VC_INOUT_STATE_OUTGOING_WAIT_ALERT == pagent->io_state)) { + return ERROR_VOICECALL_CALL_IS_IN_PROGRESS; + } + + bret_val = _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + } + break; + case VC_CONNECTED_CALL: + { + call_vc_call_objectinfo_t call_object; + + if (TRUE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + if (VC_CALL_STATE_ENDED == call_object.state) { + bret_val = _vc_core_ca_clear_connected_call(pagent, call_handle); + } else { + return ERROR_VOICECALL_CALL_IS_IN_PROGRESS; + } + } + } + break; + case VC_INCOMING_CALL: + { + return ERROR_VOICECALL_NOT_SUPPORTED; + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + return (TRUE == bret_val) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function establishes an outgoing call with the details prepared using _vc_core_engine_prepare_call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] mo_call_index Index of the prepare mo call +* @param[out] pcall_handle Handle of the MO Call Made +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_end_call +*/ +voicecall_error_t _vc_core_engine_make_call(voicecall_engine_t *pvoicecall_agent, int mo_call_index, int *pcall_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean ret_val = FALSE; + call_vc_call_objectinfo_t call_object; + int error_code = ERROR_VOICECALL_NONE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(mo_call_index >= 0 && mo_call_index <= 7, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_handle != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + + _vc_core_cm_clear_call_object(&call_object); + if (_vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &call_object) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + if (VC_CALL_ORIG_TYPE_SAT == call_object.call_type) { + ret_val = __call_vc_request_sat_call(pagent, mo_call_index, &error_code); + } else { + ret_val = __call_vc_request_call(pagent, mo_call_index, &error_code); + } + + if ((TRUE == ret_val) && (pagent->io_state == VC_INOUT_STATE_OUTGOING_WAIT_ALERT || pagent->io_state == VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED || pagent->io_state == VC_INOUT_STATE_OUTGOING_WAIT_ORIG)) { + *pcall_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call Handle: %d", *pcall_handle); + + } + + return (TRUE == ret_val) ? ERROR_VOICECALL_NONE : error_code; +} + +static gboolean __call_vc_handle_sat_engine_events(call_vc_callagent_state_t *pcall_agent, int sat_event, int sat_event_type, void *result) +{ + call_vc_callagent_state_t *pagent = pcall_agent; + call_vc_satsetup_info_t *psatsetup_info = NULL; + voicecall_sat_callinfo_t call_vc_sat_callinfo; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "sat_event: %d, sat_event_type: %d", sat_event, sat_event_type); + + psatsetup_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + switch (sat_event) { + case VC_ACTION_SAT_REQUEST: + { + switch (sat_event_type) { + case SAT_RQST_SETUP_CALL: + { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_RQST_SETUP_CALL SAT Event is recieved..."); + + if ((pagent->io_state != VC_INOUT_STATE_NONE) || (pagent->callagent_state != CALL_VC_CA_STATE_NORMAL)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL unable to process command!"); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + return FALSE; + } + + /*Initialize Call Setup Data */ + psatsetup_info->psat_rgb_data = NULL; + memset(&(psatsetup_info->satengine_setupcall_data), 0, sizeof(TelSatSetupCallIndCallData_t)); + memcpy(&(psatsetup_info->satengine_setupcall_data), result, sizeof(TelSatSetupCallIndCallData_t)); + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + + _vc_core_util_strcpy(call_vc_sat_callinfo.call_number, sizeof(call_vc_sat_callinfo.call_number), (char *)psatsetup_info->satengine_setupcall_data.callNumber.string); + _vc_core_util_strcpy(call_vc_sat_callinfo.disp_text, sizeof(call_vc_sat_callinfo.disp_text), (char *)psatsetup_info->satengine_setupcall_data.dispText.string); + call_vc_sat_callinfo.duration = psatsetup_info->satengine_setupcall_data.duration; + if (call_vc_sat_callinfo.duration > 0) { + psatsetup_info->bduration = TRUE; + + /*Store the duration, this remaining duration will be reduced in subsequent redial attempts */ + psatsetup_info->remaining_duration = call_vc_sat_callinfo.duration; + } + CALL_ENG_DEBUG(ENG_DEBUG, "Voice call set up request sent to voice call application psatsetup_info->bduration = %d", psatsetup_info->bduration); + CALL_ENG_DEBUG(ENG_DEBUG, "psatsetup_info->remaining_duration = %lu", psatsetup_info->remaining_duration); + CALL_ENG_DEBUG(ENG_DEBUG, "sat call type = %d", psatsetup_info->satengine_setupcall_data.calltype); + + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_REQUEST, SAT_RQST_SETUP_CALL, 0, &call_vc_sat_callinfo); + } + break; + case SAT_RQST_SEND_DTMF: + { + memset(&(psatsetup_info->satengine_dtmf_data), 0, sizeof(TelSatSendDtmfIndDtmfData_t)); + memcpy(&(psatsetup_info->satengine_dtmf_data), result, sizeof(TelSatSendDtmfIndDtmfData_t)); + + if (FALSE == __vc_core_is_dtmf_possible(pagent)) { + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } else { + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + + _vc_core_util_strcpy(call_vc_sat_callinfo.call_number, sizeof(call_vc_sat_callinfo.call_number), (char *)psatsetup_info->satengine_dtmf_data.dtmfString.string); + call_vc_sat_callinfo.bsat_hidden = psatsetup_info->satengine_dtmf_data.bIsHiddenMode; + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_REQUEST, SAT_RQST_SEND_DTMF, 0, &call_vc_sat_callinfo); + } + } + break; + } + } + break; + case VC_ACTION_SAT_RESPONSE: + { + call_vc_call_objectinfo_t objectInfo; + switch (sat_event_type) { + case SAT_RESP_SETUP_CALL: + { + if (_vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &objectInfo) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL_CONTROL Outgoing call info does not exist.."); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + break; + } + memset(&(psatsetup_info->satengine_callctrl_data), 0, sizeof(psatsetup_info->satengine_callctrl_data)); + memcpy(&(psatsetup_info->satengine_callctrl_data), result, sizeof(psatsetup_info->satengine_callctrl_data)); + + switch (psatsetup_info->satengine_callctrl_data.callCtrlResult) { + case TAPI_SAT_CALL_CTRL_R_ALLOWED_NO_MOD: + { + CALL_ENG_DEBUG(ENG_DEBUG, "ret=TAPI_SAT_CALL_CTRL_R_ALLOWED_NO_MOD"); + pagent->call_manager.setupcall_info.call_control_type = CALL_VC_SAT_CC_ALLOWED; + } + break; + case TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "ret=TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED"); + pagent->call_manager.setupcall_info.call_control_type = CALL_VC_SAT_CC_NOT_ALLOWED; + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + if (objectInfo.call_type == VC_CALL_ORIG_TYPE_SAT) { + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_CONTROL_PERMANENT_PROBLEM); + } else { + _vc_core_cm_clear_outgoing_call(&pagent->call_manager); + } + + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + call_vc_sat_callinfo.sat_mo_call_ctrl_res = CALL_NOT_ALLOWED; + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_RESPONSE, SAT_RESP_SETUP_CALL, 0, &call_vc_sat_callinfo); + } + break; + case TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD: + { + gboolean bsscode = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "ret=TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD"); + pagent->call_manager.setupcall_info.call_control_type = CALL_VC_SAT_CC_ALLOWED_WITH_MODIFIED; + + memset(objectInfo.connected_telnumber, 0, sizeof(objectInfo.connected_telnumber)); + memset(objectInfo.connected_name, 0, sizeof(objectInfo.connected_name)); + + _vc_core_util_strcpy(objectInfo.connected_telnumber, sizeof(objectInfo.connected_telnumber), (char *)psatsetup_info->satengine_callctrl_data.u.callCtrlCnfCallData.address.string); + _vc_core_util_strcpy(objectInfo.connected_name, sizeof(objectInfo.connected_name), (char *)psatsetup_info->satengine_callctrl_data.dispData.string); + + /*Prepare the data to be sent to the client */ + memset(&call_vc_sat_callinfo, 0, sizeof(voicecall_sat_callinfo_t)); + _vc_core_util_strcpy(call_vc_sat_callinfo.call_number, sizeof(call_vc_sat_callinfo.call_number), objectInfo.connected_telnumber); + _vc_core_util_strcpy(call_vc_sat_callinfo.disp_text, sizeof(call_vc_sat_callinfo.disp_text), objectInfo.connected_name); + + /* when call number is changed as SS string */ + _vc_core_engine_status_isvalid_ss_code((voicecall_engine_t *)pcall_agent, objectInfo.connected_telnumber, &bsscode); + if (TRUE == bsscode) { + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + call_vc_sat_callinfo.sat_mo_call_ctrl_res = CALL_CHANGED_TO_SS; + CALL_ENG_DEBUG(ENG_DEBUG, "VC Call Control Response Event: %d", call_vc_sat_callinfo.sat_mo_call_ctrl_res); + } else { + objectInfo.bemergency_number = _vc_core_ecc_check_emergency_number(pagent->tapi_handle, pagent->card_type, objectInfo.connected_telnumber, pagent->bis_no_sim, &objectInfo.ecc_category); + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &objectInfo); + + call_vc_sat_callinfo.duration = psatsetup_info->satengine_setupcall_data.duration; + call_vc_sat_callinfo.sat_mo_call_ctrl_res = CALL_ALLOWED_WITH_MOD; + CALL_ENG_DEBUG(ENG_DEBUG, "VC Call Control Response Event: %d", call_vc_sat_callinfo.sat_mo_call_ctrl_res); + } + + /*Send the Call Control response event to the client */ + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_SAT_RESPONSE, SAT_RESP_SETUP_CALL, 0, &call_vc_sat_callinfo); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL_CONTROL - not defined return code"); + break; + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid Sat Event Type"); + break; + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid SAT Event"); + return FALSE; + } + return TRUE; +} + +static gboolean __call_vc_incoming_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)puser_data; + call_vc_call_objectinfo_t callobject_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Handling Incoming call in Idle Callback"); + + if (FALSE == _vc_core_cm_get_incoming_call_info(&pagent->call_manager, &callobject_info)) { + CALL_ENG_DEBUG(ENG_ERR, "Incoming Call Info not available"); + return FALSE; + } + + /*If the Incoming End event arrived before processing the Incoming request, then donot change the state to Incombox */ + if (pagent->io_state != VC_INOUT_STATE_INCOME_END) { + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_BOX); + } + + /* Send Incoming Call Event to Client */ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_INCOM, callobject_info.call_handle, callobject_info.bincoming_call_is_fwded, callobject_info.tel_number); + + /* Reset Incoming Call Details */ + gincoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; + memset(&gincoming_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + + /*Check whether the incoming call is accepted or rejected by + cheking the Incoming callobjects status */ + if (_vc_core_cm_get_call_state(&pagent->call_manager, callobject_info.call_handle) != VC_CALL_STATE_INCOME) { + CALL_ENG_DEBUG(ENG_DEBUG, "[Call :%d] not in VC_CALL_STATE_INCOME state", callobject_info.call_handle); + return FALSE; + } + + /*Always Return FALSE from this g_idle callback, so it will not be called again */ + return FALSE; +} + +/*Rejects the call, only if the call state is in rejected state*/ +static gboolean __call_vc_reject_call_full_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)puser_data; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + call_vc_call_objectinfo_t call_object; + + CALL_ENG_DEBUG(ENG_DEBUG, "Rejecting the [Call:%d] in IDLE CB", gincoming_call_handle); + + if (gincoming_call_handle != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, gincoming_call_handle, &call_object); + + if (VC_CALL_STATE_REJECTED == call_object.state) { + /*Answer the incoming call by accepting or rejecting the call */ + tapi_err = tel_answer_call(pcall_agent->tapi_handle, gincoming_call_handle, TAPI_CALL_ANSWER_REJECT, _vc_core_engine_answer_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_ERR, "tel_answer_call failed, Error: %d", tapi_err); + } + + gincoming_call_handle = -1; + } + } + return FALSE; +} + +/*Always reject the call, if the reject call handle is valid*/ +static gboolean __call_vc_reject_call_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)puser_data; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + CALL_ENG_DEBUG(ENG_DEBUG, "Rejecting the [Call Handle :%d] in IDLE CB", gincoming_call_handle); + + if (gphone_rejected_call != -1) { + /*Answer the incoming call by accepting or rejecting the call */ + tapi_err = tel_answer_call(pcall_agent->tapi_handle, gphone_rejected_call, TAPI_CALL_ANSWER_REJECT, _vc_core_engine_answer_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_ERR, "tel_answer_call failed, Error: %d", tapi_err); + } + gphone_rejected_call = -1; + } + return FALSE; +} + +static gboolean __call_vc_sat_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)puser_data; + + TelSatSetupCallIndCallData_t temp_data = { 0, }; + + memset(&temp_data, 0, sizeof(TelSatSetupCallIndCallData_t)); + memcpy(&temp_data, gpresult, sizeof(TelSatSetupCallIndCallData_t)); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->calltype = 0x%x", temp_data.calltype); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->dispText.string = %s", temp_data.dispText.string); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->callNumber.string = %s", temp_data.callNumber.string); + CALL_ENG_DEBUG(ENG_DEBUG, "[SAT] call_data->duration = %d", (int)temp_data.duration); + + __call_vc_handle_sat_engine_events(pagent, VC_ACTION_SAT_REQUEST, gsat_event_type, gpresult); + + /*Free the result after copying the data */ + /*g_free(gpresult);*/ + gpresult = NULL; + /*Always Return FALSE from this g_idle callback, so it will not be called again */ + return FALSE; +} + +void _vc_core_engine_handle_incoming_tapi_events(void *mt_data, void *userdata) +{ + char *data = mt_data; + + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + VOICECALL_RETURN_IF_FAIL(pagent != NULL); + + int current_mt_call_handle = -1; + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_EVENT_CALL_INCOM_IND..."); + + /*Safety Check to avoid the mutiple incoming noti for the same call */ + current_mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_ERR, "current_mt_call_handle = %d", current_mt_call_handle); + + if (current_mt_call_handle != VC_TAPI_INVALID_CALLHANDLE) { + TelCallIncomingCallInfo_t mt_call_info; + CALL_ENG_DEBUG(ENG_ERR, "Already an Incoming Call exits ,Problem in accpeting the incoming call, Current Call Details"); + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_ERR, "****************Currently received call details *************************"); + + memset(&mt_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + memcpy(&mt_call_info, data, sizeof(TelCallIncomingCallInfo_t)); + CALL_ENG_DEBUG(ENG_ERR, "****************call handle = [%d] *************************", mt_call_info.CallHandle); + CALL_ENG_DEBUG(ENG_ERR, "****************call Number = [%s] *************************", mt_call_info.szCallingPartyNumber); + CALL_ENG_DEBUG(ENG_ERR, "**************** Ignoring this incoming notification *************************"); + return; + } + + memset(&gincoming_call_info, 0, sizeof(TelCallIncomingCallInfo_t)); + memcpy(&gincoming_call_info, data, sizeof(TelCallIncomingCallInfo_t)); + gincoming_call_handle = gincoming_call_info.CallHandle; + + CALL_ENG_DEBUG(ENG_DEBUG, "CallHandle = %d, Number = %s", gincoming_call_info.CallHandle, gincoming_call_info.szCallingPartyNumber); + + /* Reject the Incoming call */ + if (FALSE == gphone_init_finished) { + CALL_ENG_DEBUG(ENG_ERR, "Phone is not initialized, So reject the Call"); + + gphone_rejected_call = gincoming_call_handle; + + /*Reject the Call in the Idle Callback */ + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_reject_call_idle_cb, pagent, NULL); + + return; + } + + /* Check the IO State before accepting the call */ + switch (pagent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + case VC_INOUT_STATE_INCOME_END: /*If the Previous End event is still not prcocessed then reject the call */ + { + call_vc_call_objectinfo_t objectInfo; + + /* setting the new member info */ + _vc_core_cm_clear_call_object(&objectInfo); + objectInfo.call_handle = gincoming_call_handle; + _vc_core_cm_change_call_state(&objectInfo, VC_CALL_STATE_REJECTED); + + /* add new member info */ + _vc_core_cm_add_call_object(&pagent->call_manager, &objectInfo); + + /*Reject the Call in the Idle Callback */ + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_reject_call_full_idle_cb, pagent, NULL); + + return; + } + break; + /*If Outgoing call is in any of the following wait state during an Incoming Event Cancel the Outgoing Call */ + case VC_INOUT_STATE_OUTGOING_WAIT_RELEASE: /*If Outgoing call is in any of the following wait state during an Incoming Event Cancel the Outgoing Call */ + case VC_INOUT_STATE_OUTGOING_ABORTED: + case VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE: + case VC_INOUT_STATE_OUTGOING_WAIT_REDIAL: + case VC_INOUT_STATE_OUTGOING_SHOW_RETRY_CALLBOX: + { + int mo_call_handle = -1; + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + _vc_core_cm_remove_call_object(&pagent->call_manager, mo_call_handle); + + /* Inform the Client that waiting outgoing call are cleaned up to accept the incoming call , */ + _vc_core_ca_send_event_to_client(pagent, VC_ACTION_INCOM_FORCE, mo_call_handle, 0, NULL); + } + default: + break; + } + + /*If Incoming End event is still pending, First Process the incoming end indication before processing the new + Incoming Call */ + if (VC_INOUT_STATE_INCOME_END == pagent->io_state) { + int mt_call_handle = -1; + + CALL_ENG_DEBUG(ENG_ERR, "Previous Incoming End Call Not processed, Processing Here"); + mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + if (mt_call_handle != -1) { + __call_vc_incomingcall_endhandle(pagent, mt_call_handle); + } + } + + /* Handle Incoming Call */ + if (TRUE == _vc_core_tapi_event_handle_incoming_event(pagent, gincoming_call_handle, &gincoming_call_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Using Idle Add Full with G_PRIORITY_HIGH_IDLE for processing Incoming Call"); + g_idle_add_full(G_PRIORITY_HIGH_IDLE, __call_vc_incoming_idle_cb, pagent, NULL); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "MT CALL event processed done."); + return; + +} + +static void __call_vc_handle_tapi_events(TapiHandle *handle, const char *noti_id, void *data, void *user_data) +{ + + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + VOICECALL_RETURN_IF_FAIL(pagent != NULL); + + CALL_ENG_DEBUG(ENG_WARN, "event_type:[%s]", noti_id); + + /* Process TAPI events */ + if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_IDLE) == 0) { + /* End IND */ + call_vc_call_objectinfo_t objectInfo; + voicecall_call_state_t present_call_state = VC_CALL_STATE_NONE; + call_vc_handle incoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelTapiEndCause_t tapi_cause = TAPI_CALL_END_NO_CAUSE; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallStatusIdleNoti_t callIdleInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_VOICE_CALL_STATUS_IDLE.."); + + /* tapicallback data = TelCallStatusIdleNoti_t */ + if (data != NULL) { + memset(&callIdleInfo, 0, sizeof(TelCallStatusIdleNoti_t)); + memcpy(&callIdleInfo, data, sizeof(TelCallStatusIdleNoti_t)); + + call_handle = callIdleInfo.id; + tapi_cause = callIdleInfo.cause; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d,end cause:%d", call_handle, tapi_cause); + + /*the end of incoming call rejected by callagent, because the call had come before the phone is initialized */ + if (call_handle == gphone_rejected_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Rejected call..phone not initialized"); + + gphone_rejected_call = VC_TAPI_INVALID_CALLHANDLE; + + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + + incoming_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + present_call_state = _vc_core_cm_get_call_state(&pagent->call_manager, call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "New Call Handle = %d, Already registered MT call handle : %d", call_handle, incoming_call_handle); + switch (present_call_state) { + case VC_CALL_STATE_NONE: + case VC_CALL_STATE_ENDED: + case VC_CALL_STATE_ENDED_FINISH: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d state is %d", call_handle, present_call_state); + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + break; + case VC_CALL_STATE_REJECTED: + { + /*End of incoming call (not registered as incoming call in CallAgent) rejected by callagent */ + if (incoming_call_handle != call_handle) { + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "end of call rejected by callagent"); + + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + } + break; + default: + break; + } + + /*End of the call rejected by user or by callagent (when hold is failed) */ + if ((VC_INOUT_STATE_INCOME_WAIT_RELEASE == pagent->io_state) && (incoming_call_handle == call_handle)) { + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + + /*Change the In Out state to None*/ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + /*Notify Client about rejected Event*/ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_REJECTED_END, call_handle, 0, NULL); + + return; + } + + /*End of Incoming Call */ + if (incoming_call_handle == call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "Adding Incoming End Event to Idle Callback"); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_END); + /*Make sure that the End Indication is processed always after the Incoming Indication , as both are + processed in Idle Add Callbacks */ + g_idle_add(__call_vc_incoming_call_end_idle_cb, pagent); + return; + } + + /*End of Outgoing Call */ + if (_vc_core_cm_get_outgoing_call_handle(&pagent->call_manager) == call_handle) { + __call_vc_outgoingcall_endhandle(pagent, call_handle, TAPI_NOTI_VOICE_CALL_STATUS_IDLE, tapi_cause); + return; + } + + /*End of Normal Connected Call */ + _vc_core_tapi_event_handle_call_end_event(pagent, noti_id, call_handle, tapi_cause); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + _vc_core_cm_clear_call_object(&objectInfo); + if (FALSE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &objectInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Already Cleared for Call Handle = %d", call_handle); + + /* + * Because of _vc_core_tapi_rqst_answer_call( .., VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT,.. ) inside _vc_core_tapi_event_handle_call_end_event(), + * pagent->call_manager is cleared. so, we didn't send VC_CALL_NORMAL_END to call-ui. + * so we should send this event to call-ui. + */ + { + voice_call_end_cause_type_t end_cause_type; + _vc_core_tapi_event_get_end_cause_type(pagent, noti_id, tapi_cause, &end_cause_type); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NORMAL_END, call_handle, end_cause_type, NULL); + } + } else { + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NORMAL_END, objectInfo.call_handle, objectInfo.end_cause_type, NULL); + } + } else if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_ACTIVE) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "event_type == TAPI_NOTI_VOICE_CALL_STATUS_ACTIVE..."); + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallStatusActiveNoti_t callActiveInfo; + + if (data != NULL) { + memset(&callActiveInfo, 0, sizeof(TelCallStatusActiveNoti_t)); + memcpy(&callActiveInfo, data, sizeof(TelCallStatusActiveNoti_t)); + call_handle = callActiveInfo.id; + } + CALL_ENG_DEBUG(ENG_DEBUG, "IO State: %d", pagent->io_state); + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call Handle = %d", call_handle); + + if (call_handle == _vc_core_cm_get_incoming_call_handle(&pagent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call is being connected..."); + } else if (call_handle == _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call is being connected..."); + } else { + CALL_ENG_DEBUG(ENG_ERR, "invalid connected event Call Handle = %d", call_handle); + + if ((VC_INVALID_CALL_INDEX != pagent->call_manager.mtcall_index) || (VC_INVALID_CALL_INDEX != pagent->call_manager.setupcall_info.mocall_index)) { + CALL_ENG_DEBUG(ENG_DEBUG, "incoming/outgoin calls call exits, invalid call handle [PROBLEM]"); + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + + assert(0); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No pending calls to connect, ignoreing connect event for call handle= %d", call_handle); + return; + } + return; + } + + /*Handle Connected Call Event */ + _vc_core_tapi_event_handle_call_connect_event(pagent, call_handle); + CALL_ENG_KPI("TAPI_NOTI_VOICE_CALL_STATUS_ACTIVE done"); + } else if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_DIALING) == 0) { + /*Dialing IND*/ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallStatusDialingNoti_t callDialingInfo; + call_vc_call_objectinfo_t objectInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "Data Received for DIALING_IND is %p", data); + + if (TRUE == _vc_core_cm_get_outgoing_call_info(&pagent->call_manager, &objectInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO call index (%d)",objectInfo.call_id); + } else { + CALL_ENG_DEBUG(ENG_ERR, "EXCEPTION:Outgoing call Info Missing.."); + } + + + /* tapicallback data = TelCallStatusHeldNoti_t */ + if (data != NULL) { + memset(&callDialingInfo, 0, sizeof(TelCallStatusDialingNoti_t)); + memcpy(&callDialingInfo, data, sizeof(TelCallStatusDialingNoti_t)); + call_handle = callDialingInfo.id; + CALL_ENG_DEBUG(ENG_DEBUG, "Received Call Handle = %d", call_handle); + } + + if (VC_INOUT_STATE_OUTGOING_WAIT_ORIG != pagent->io_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "Io State not in WAIT_ORIG, current io state is : %d", pagent->io_state); + return; + } + + /* Get the outgoing call handle from CallManger and check */ + if ((VC_TAPI_INVALID_CALLHANDLE == call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call does not exist or call_handle doesn't match"); + return; + } + + /* Set the Call Handle to the CallbObject for future reference */ + objectInfo.call_handle = call_handle; + _vc_core_cm_set_outgoing_call_info(&pagent->call_manager, &objectInfo); + + _vc_core_tapi_event_handle_originated_event(pagent, call_handle); + CALL_ENG_KPI("TAPI_NOTI_VOICE_CALL_STATUS_DIALING done"); + } else if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_ALERT) == 0) { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_handle mo_call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallStatusAlertNoti_t callAlertInfo; + + CALL_ENG_KPI("TAPI_NOTI_VOICE_CALL_STATUS_ALERT START"); + /*There are possiblities, that TAPI issued the Alert Notification and it is pending in the gmain loop, but meanwhile, the call + is released by the user - so ignore the event if it doesn't match with the IN OUT Wait state */ + if (VC_INOUT_STATE_OUTGOING_WAIT_ALERT != pagent->io_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "Io State not in WAIT_ORIG, current io state is : %d", pagent->io_state); + return; + } + + if (data != NULL) { + memset(&callAlertInfo, 0, sizeof(TelCallStatusAlertNoti_t)); + memcpy(&callAlertInfo, data, sizeof(TelCallStatusAlertNoti_t)); + call_handle = callAlertInfo.id; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Alert Call Handle = %d", call_handle); + + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Handle = %d", mo_call_handle); + + /*Get the outgoing call handle from CallManger and check*/ + if ((VC_TAPI_INVALID_CALLHANDLE == call_handle) || (mo_call_handle != call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call does not exist or call_handle doesn't match"); + return; + } + + _vc_core_tapi_event_handle_alert_event(pagent, call_handle); + CALL_ENG_KPI("TAPI_NOTI_VOICE_CALL_STATUS_ALERT done"); + } else if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_INCOMING) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_VOICE_CALL_STATUS_INCOMING is not used."); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_ACTIVE) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_ACTIVE"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_ACTIVATE, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_HELD) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_HELD"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_HOLD, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_TRANSFERED) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_TRANSFERRED"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_TRANSFER, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_JOINED) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_JOINED"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_SETUPCONFERENCE, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_WAITING) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_WAITING"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_WAITING, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_FORWARDED) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_FORWARDED"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_FORWARD, VC_FRWD_IND_OUTGOING_FRWD, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_FORWARDED_CALL) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_FORWARDED_CALL"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_FORWARD, VC_FRWD_IND_INCOM_IS_FRWD, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_BARRED_OUTGOING) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_BARRED_OUTGOING"); + pagent->barring_ind_type = VC_BARR_IND_ALL; + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_BARRING, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_CUG) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_CUG"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_CUGINFO, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_CALL_NAME_INFORMATION) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_CALL_NAME_INFORMATION"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_CALLINGNAMEINFO, 0, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_DEFLECTED) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_DEFLECTED"); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_FORWARD_UNCONDITIONAL) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_FORWARD_UNCONDITIONAL"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_SSNOTIFY, VC_SSNOTIFY_IND_CFU, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_INFO_FORWARD_CONDITIONAL) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_INFO_FORWARD_CONDITIONAL"); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_IND_SSNOTIFY, VC_SSNOTIFY_IND_ALL_COND_FORWARDING, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_SOUND_WBAMR) == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_SOUND_WBAMR"); + TelCallSoundWbamrNoti_t wbamrInfo = TAPI_CALL_SOUND_WBAMR_STATUS_OFF; + int wbamr_status = FALSE; + + if (data != NULL) { + memset(&wbamrInfo, 0, sizeof(TelCallSoundWbamrNoti_t)); + memcpy(&wbamrInfo, data, sizeof(TelCallSoundWbamrNoti_t)); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "WBAMR is %d", wbamrInfo); + if (wbamrInfo == TAPI_CALL_SOUND_WBAMR_STATUS_ON) { + wbamr_status = TRUE; + } + + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NOTI_WBAMR, wbamr_status, 0, NULL); + } else if (strcmp(noti_id, TAPI_NOTI_CALL_SOUND_CLOCK_STATUS) == 0) { + gboolean status = FALSE; + + memcpy(&status, data, sizeof(gboolean)); + CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_NOTI_CALL_SOUND_CLOCK_STATUS : %d", status); + if (status) { + _vc_core_ca_send_event_to_client(pagent, VC_CALL_OUTGOING_CLOCK_NOTI, 0, 0, NULL); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR!! Noti is not defined"); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "tapi noti(%s) processed done.", noti_id); + + return; +} + +static gboolean __call_vc_outgoingcall_endhandle(call_vc_callagent_state_t *pagent, call_vc_handle call_handle, const char *type, TelTapiEndCause_t tapi_cause) +{ + call_vc_call_objectinfo_t objectInfo; + voice_call_end_cause_type_t endcause_type = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pagent != NULL); + + _vc_core_cm_clear_call_object(&objectInfo); + _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &objectInfo); + + /*Inform Client App about MO Call Disconnect */ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_ABORTED); + if ((type == NULL) && (TAPI_CALL_END_NO_CAUSE == tapi_cause)) { + /* This case is dial failed because of FDN */ + endcause_type = VC_ENDCAUSE_FIXED_DIALING_NUMBER_ONLY; + } else { + _vc_core_tapi_event_get_end_cause_type(pagent, type, tapi_cause, &endcause_type); + } + _vc_core_ca_send_event_to_client(pagent, VC_CALL_OUTGOING_END, call_handle, (int)endcause_type, NULL); + + /* Response call setup result to SAT if this is SAT call */ + if (VC_CALL_ORIG_TYPE_SAT == objectInfo.call_type) { + /*Cancelled by user */ + if (VC_CALL_STATE_CANCELLED == objectInfo.state) { + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN); + } else { /* Disconnected by Network */ + + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + if (FALSE == pcall_vc_satcall_info->redial) { + /*Send only if SAT redial is not enabled */ + _vc_core_ca_send_sat_response(pagent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); + } + } + + /*Free SAT Icon data if available */ + if (pagent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data != NULL) { + free(pagent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data); + pagent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data = NULL; + } + } + + /* SS: 1 send, while outgoing is CONNECTING state... */ + if (CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL == pagent->callagent_state) { + gboolean bActiveCall = _vc_core_cm_isexists_active_call(&pagent->call_manager); + gboolean bHoldCall = _vc_core_cm_isexists_held_call(&pagent->call_manager); + + if (FALSE == bActiveCall) { + if (TRUE == bHoldCall) { + CALL_ENG_DEBUG(ENG_DEBUG, "Continue SS Action"); + + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + if (_vc_core_tapi_rqst_retrieve_call(pagent) == TRUE) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } else { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } + } else { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "active call must not exist!"); + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } + } + + return TRUE; +} + +static gboolean __call_vc_incoming_call_end_idle_cb(gpointer puser_data) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)puser_data; + call_vc_handle call_handle = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "Ending the Incoming Call in Idle Callback"); + /*Send the Incoming end indication to the client, only if the io state is in VC_INOUT_STATE_INCOME_END */ + if (VC_INOUT_STATE_INCOME_END == pagent->io_state) { + call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + if (-1 != call_handle) { + __call_vc_incomingcall_endhandle(pagent, call_handle); + } + } + return FALSE; +} + +static gboolean __call_vc_incomingcall_endhandle(call_vc_callagent_state_t *pagent, call_vc_handle call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + + if (TRUE == _vc_core_ca_send_event_to_client(pagent, VC_CALL_INCOM_END, call_handle, 0, NULL)) { + CALL_ENG_DEBUG(ENG_DEBUG, "client call back returned TRUE Removing Inomcing call Object"); + + /*Remove Call Object Once the Incoming Call Got Ended*/ + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + + /*Finally Move the IO State None*/ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + } + return TRUE; +} + +static gboolean __call_vc_is_callagent_waitstate(call_vc_callagent_state_t *pagent) +{ + + switch (pagent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_SPLIT: + case CALL_VC_CA_STATE_WAIT_DROP: + case CALL_VC_CA_STATE_WAIT_SWAP: + case CALL_VC_CA_STATE_WAIT_HOLD: + case CALL_VC_CA_STATE_WAIT_UNHOLD: + case CALL_VC_CA_STATE_WAIT_JOIN: + case CALL_VC_CA_STATE_WAIT_TRANSFER_CNF: + case CALL_VC_CA_STATE_WAIT_TRANSFER_CALLEND: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL: + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP: + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL: + { + return TRUE; + } + break; + default: + return FALSE; + } +} + +/** + * This function checks whether dtmf is possible + * + * @return This function returns TRUE if dtmf is possible or else FALSE + * @param[in] pcall_agent Pointer to the call agent structure + */ +static gboolean __vc_core_is_dtmf_possible(call_vc_callagent_state_t *pcall_agent) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (VC_INOUT_STATE_NONE != pcall_agent->io_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_core_is_dtmf_possible, io_state not idle"); + return FALSE; + } + + if (CALL_VC_CA_STATE_NORMAL != pcall_agent->callagent_state) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_core_is_dtmf_possible, callagent_state not idle"); + return FALSE; + } + + if (FALSE == _vc_core_cm_isexists_active_call(&pcall_agent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "NO Active Calls available to send DTMF"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "DTMF Possible"); + return TRUE; +} + +/** + * This function checks the voicecall engine's idle status and send VC_ACTION_NO_ACTIVE_TASK to client if engine is idle + * + * @return void + * @param[in] pcall_agent Pointer to the call agent structure + */ +void __vc_core_check_engine_active_task(call_vc_callagent_state_t *pcall_agent) +{ + VOICECALL_RETURN_IF_FAIL(pcall_agent != NULL); + if (_vc_core_ca_check_end(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine is Idle, Informing the Client"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_NO_ACTIVE_TASK, 0, 0, NULL); + } +} + +/** +* This function ends only the connected call corresponding to the given call handle +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle Call handle of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_bycallId +*/ +voicecall_error_t _vc_core_engine_end_call_byhandle(voicecall_engine_t *pvoicecall_agent, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + + return (TRUE == _vc_core_tapi_rqst_end_call_by_callhandle(pagent, call_handle)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function ends a call corresponding to the given call ID +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id call id of the call to be ended +* @remarks pvoicecall_agent cannot be NULL +* call_id shall take only values between 1 to 7 +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call +* - _vc_core_engine_end_call_byhandle +*/ +voicecall_error_t _vc_core_engine_end_call_bycallId(voicecall_engine_t *pvoicecall_agent, int call_id) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_groupstate_t call_group_state = CALL_VC_GROUP_STATE_NONE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL((call_id >= 1 && call_id <= 7), ERROR_VOICECALL_INVALID_ARGUMENTS); + + call_handle = _vc_core_cm_get_call_handle_ingroup_bycallId(&pagent->call_manager, call_id); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + call_group_state = _vc_core_cm_get_group_state_callid(&pagent->call_manager, call_id); + if (CALL_VC_GROUP_STATE_ACTIVE == call_group_state) { + + if (-1 == _vc_core_cm_get_active_group_index(&pagent->call_manager)) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + if (TRUE == _vc_core_tapi_rqst_end_call_by_callhandle(pagent, call_handle)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_DROP); + return ERROR_VOICECALL_NONE; + } + } else if (CALL_VC_GROUP_STATE_HOLD == call_group_state) { + int held_group_member_num = 0; + int held_group_index = -1; + + held_group_index = _vc_core_cm_get_held_group_index(&pagent->call_manager); + if (-1 == held_group_index) { + return FALSE; + } + + held_group_member_num = _vc_core_cm_get_member_count_ingroup(&pagent->call_manager, held_group_index); + if (held_group_member_num > 1) { + /*Individual calls cannot be ended when the conf call in held state */ + return ERROR_VOICECALL_OPERATION_NOT_ALLOWED; + } + + if (TRUE == _vc_core_tapi_rqst_end_call_by_callhandle(pagent, call_handle)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_DROP); + return ERROR_VOICECALL_NONE; + } + } + + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; +} + +/** +* This function ends the call according to the given end call type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] end_call_type End Call Type +* @remarks pvoicecall_agent cannot be NULL +* @see See also following functions +* - _vc_core_engine_make_call +* - _vc_core_engine_end_call_byhandle +* - _vc_core_engine_end_call_bycallId +* . +*/ +voicecall_error_t _vc_core_engine_end_call(voicecall_engine_t *pvoicecall_agent, _vc_core_engine_end_call_type_t end_call_type) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + gboolean bret_val = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*If Call Agent is waiting for any of the release event then ignore the end call request */ + if ((CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL == pagent->callagent_state) || (CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL == pagent->callagent_state) || (CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS == pagent->callagent_state)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "end_call_type = %d", end_call_type); + + switch (end_call_type) { + case VC_END_OUTGOING_CALL: + { + bret_val = _vc_core_tapi_rqst_release_outgoing_call(pagent); + } + break; + case VC_END_INCOMING_CALL: + { + bret_val = _vc_core_tapi_rqst_release_incoming_call(pagent); + } + break; + case VC_END_ACTIVE_OR_HELD_CALLS: + { + bret_val = _vc_core_tapi_rqst_end_call(pagent); + } + break; + case VC_END_ALL_ACTIVE_CALLS: + { + bret_val = _vc_core_ca_end_active_calls(pagent); + } + break; + case VC_END_ALL_HELD_CALLS: + { + bret_val = _vc_core_ca_end_held_calls(pagent); + } + break; + case VC_END_ALL_CALLS: + { + bret_val = _vc_core_ca_end_all_calls(pagent); + } + break; + default: + return ERROR_VOICECALL_INVALID_CALL_TYPE; + } + + return (TRUE == bret_val) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_INCOMPLETE; +} + +/** +* This function does the explicit call transfer +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_transfer_calls(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_CA_STATE_WAIT_TRANSFER_CNF == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_transfer_call_possible(pagent)) { + return ERROR_VOICECALL_TRANSFER_CALL_NOT_POSSIBLE; + } else { + if (TRUE == _vc_core_tapi_rqst_transfer_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_TRANSFER_CNF); + return ERROR_VOICECALL_NONE; + } + } + + return ERROR_VOICECALL_TRANSFER_FAILED; +} + +/** +* This function swaps the active and held calls if any available +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_hold_call +* - _vc_core_engine_retrieve_call +* +*/ +voicecall_error_t _vc_core_engine_swap_calls(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*If call agent is in any of the wait states, then ignore the request */ + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } + + if (TRUE == _vc_core_tapi_rqst_swap_calls(pagent)) { +#ifdef VC_WITHOUT_SWAP_CNF + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE); +#endif + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_SWAP_FAILED; +} + +/** +* This function puts the active call if any on hold +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see voicecall_retreive_call +*/ +voicecall_error_t _vc_core_engine_hold_call(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } +#ifdef _CPHS_DEFINED_ + if (TRUE == _vc_core_svcall_cphs_csp_get_status(pagent, VC_CPHS_CSP_HOLD)) { + if (TRUE == _vc_core_tapi_rqst_hold_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_HOLD); + return ERROR_VOICECALL_NONE; + } + } else { + return ERROR_VOICECALL_HOLD_NOT_SUPPORTED; + } +#else + if (TRUE == _vc_core_tapi_rqst_hold_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_HOLD); + return ERROR_VOICECALL_NONE; + } +#endif + return ERROR_VOICECALL_HOLD_FAILED; +} + +/** +* This function retrieves/activates the held call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_hold_call +*/ +voicecall_error_t _vc_core_engine_retrieve_call(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (TRUE == __call_vc_is_callagent_waitstate(pagent)) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } + + if (TRUE == _vc_core_tapi_rqst_retrieve_call(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_UNHOLD); + return ERROR_VOICECALL_NONE; + } + return ERROR_VOICECALL_RETREIVE_FAILED; +} + +/** +* This function sets up a conference beween the currently available active and held calls +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_private_call +* - _vc_core_engine_private_call_by_callid +* +*/ +voicecall_error_t _vc_core_engine_setup_conference(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*If call agent is in any of the wait states, then ignore the request */ + if (CALL_VC_CA_STATE_WAIT_JOIN == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_conf_call_possible(pagent)) { + return ERROR_VOICECALL_CONF_NOT_POSSIBLE; + } else { + if (TRUE == _vc_core_tapi_rqst_join_calls(pagent)) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_WAIT_JOIN); + return ERROR_VOICECALL_NONE; + } + } + return ERROR_VOICECALL_SETUP_CONF_FAILED; +} + +/** +* This function makes a private call to the call member corressponding to the given call id. +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_id Call ID of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call +* +*/ +voicecall_error_t _vc_core_engine_private_call_by_callid(voicecall_engine_t *pvoicecall_agent, int call_id) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL((call_id >= 1 && call_id <= 7), ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_CA_STATE_WAIT_SPLIT == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_private_call_possible(pagent)) { + return ERROR__vc_core_engine_private_call_NOT_POSSIBLE; + } else { + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + call_handle = _vc_core_cm_get_call_handle_ingroup_bycallId(&pagent->call_manager, call_id); + + if (VC_TAPI_INVALID_CALLHANDLE != call_handle) { + return (TRUE == _vc_core_tapi_rqst_private_call(pagent, call_handle)) ? ERROR_VOICECALL_NONE : ERROR__vc_core_engine_private_call_FAILED; + } + } + + return ERROR_VOICECALL_INVALID_CALLID; +} + +/** +* This function makes a private call to the given call member from the currently available active conference call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] call_handle call handle of the call to be made private +* @remarks pvoicecall_agent cannot be NULL +* @see See also the following APIs +* - _vc_core_engine_setup_conference +* - _vc_core_engine_private_call_by_callid +* +*/ +voicecall_error_t _vc_core_engine_private_call(voicecall_engine_t *pvoicecall_agent, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (CALL_VC_CA_STATE_WAIT_SPLIT == pagent->callagent_state) { + return ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + } else if (FALSE == _vc_core_ca_is_private_call_possible(pagent)) { + return ERROR__vc_core_engine_private_call_NOT_POSSIBLE; + } + + return (TRUE == _vc_core_tapi_rqst_private_call(pagent, call_handle)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_REQUEST_FAILED; +} + +/** +* This function rejects the incoming call if any +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] budub User Determined User Busy - TRUE, Else - FALSE +* @exception In case of exceptions return value contains appropriate error code. +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_answer_call +*/ +voicecall_error_t _vc_core_engine_reject_call(voicecall_engine_t *pvoicecall_agent, gboolean budub) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + int error_code = -1; + gboolean ret = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + ret = _vc_core_tapi_rqst_reject_mt_call(pagent, budub, &error_code); + + return (TRUE == ret) ? ERROR_VOICECALL_NONE : error_code; +} + +/** +* This function answers a call according to the given answer type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] answer_type The answer type to be used +* @remarks pvoicecall_agent and pcall_handle cannot be NULL +* @see _vc_core_engine_reject_call +*/ +voicecall_error_t _vc_core_engine_answer_call(voicecall_engine_t *pvoicecall_agent, voicecall_answer_type_t answer_type) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + int error_code = 0; + gboolean ret = FALSE; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(answer_type, VC_ANSWER_NORMAL, VC_ANSWER_RELEASE_ALL_AND_ACCEPT, ERROR_VOICECALL_INVALID_ARGUMENTS); +#else + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(answer_type, VC_ANSWER_NORMAL, VC_ANSWER_RELEASE_HOLD_AND_ACCEPT, ERROR_VOICECALL_INVALID_ARGUMENTS); +#endif + ret = _vc_core_tapi_rqst_answer_call(pcall_agent, answer_type, &error_code); + + return (TRUE == ret) ? ERROR_VOICECALL_NONE : error_code; +} + +/** +* This function sends the given dtmf digits +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] pdtmf_string dtmf digits to be sent +* @remarks pvoicecall_agent and pdtmf_string cannot be NULL +* pdtmf_string shall only accept strings containing the digit value (0-9,A,B,C,D,*,#) +* +*/ +voicecall_error_t _vc_core_engine_send_dtmf(voicecall_engine_t *pvoicecall_agent, char *pdtmf_string) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(pdtmf_string != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + if (FALSE == _vc_core_util_isvalid_dtmf_number(pdtmf_string)) { + _vc_core_ca_send_event_to_client(pagent, VC_ERROR_OCCURED, ERROR_VOICECALL_INVALID_DTMF_CHAR, -1, NULL); + return ERROR_VOICECALL_INVALID_DTMF_CHAR; + } + + return (TRUE == _vc_core_tapi_rqst_start_dtmf(pagent, pdtmf_string)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_DTMF_FAILED; +} + +/** +* This function sends response to sat based on the given sat response type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] sat_rqst_resp_type sat rqst/response type sent by client +* @param[in] sat_response_type sat response type to be sent to SAT +*/ +voicecall_error_t _vc_core_engine_send_sat_response(voicecall_engine_t *pvoicecall_agent, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(sat_rqst_resp_type, SAT_RQST_SETUP_CALL, SAT_RESP_SETUP_CALL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(sat_response_type, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND, CALL_VC_ME_RET_SUCCESS, ERROR_VOICECALL_INVALID_ARGUMENTS); + + return (TRUE == _vc_core_ca_send_sat_response(pagent, sat_rqst_resp_type, sat_response_type)) ? ERROR_VOICECALL_NONE : ERROR_VOICECALL_REQUEST_FAILED; +} + +/** +* This function finalizes the voiecall engine and removes all allocated resources +* +* @return nothing +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks pvoicecall_agent cannot be NULL +*/ +void _vc_core_engine_engine_finish(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_IF_FAIL(pvoicecall_agent != NULL); + + /*Unsubscribe Events */ + CALL_ENG_DEBUG(ENG_DEBUG, "Unsubscribing Events"); + + tel_deinit(pcall_agent->tapi_handle); + + VOICECALL_RETURN_IF_FAIL(pcall_agent != NULL); + _vc_core_ca_finish_agent(pcall_agent); +} + +#ifdef _SAT_MENU_ +/** +* This function requests SAT Engine to setup SIM services Menu +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @remarks Voicecall Engine only requests the SAT engine to display the menu. +*/ +voicecall_error_t voicecall_request_sat_menu(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + TelSatSetupMenuInfo_t sim_menu; /*LiMo SAT*/ + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + memset(&sim_menu, 0, sizeof(TelSatSetupMenuInfo_t)); + /*LiMo SAT*/ + if (FALSE == TelTapiSatGetMainMenuList(&sim_menu)) { + CALL_ENG_DEBUG(ENG_DEBUG, "TelTapiSatGetMainMenuList failed"); + return ERROR_VOICECALL_REQUEST_FAILED; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function retreives the SIM Menu Title from the SAT Engine +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] title contains the sat menu title on sucess +*/ +voicecall_error_t voicecall_request_sat_menu_title(voicecall_engine_t *pvoicecall_agent, char *title) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + TelSatMainMenuTitleInfo_t sat_menu_title; /*LiMo SAT*/ + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(title != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + memset(&sat_menu_title, 0, sizeof(TelSatMainMenuTitleInfo_t)); + if (TRUE == TelTapiSatGetMainMenuTitle(&sat_menu_title)) { + if (TRUE == sat_menu_title.bIsMainMenuPresent) { + strcpy(title, (char *)sat_menu_title.mainMenuTitle.string); + return ERROR_VOICECALL_NONE; + } + } + + return ERROR_VOICECALL_REQUEST_FAILED; +} +#endif + +/** +* This function prepares the engine for the redial call. It preserves the previsouly made call object to used for the next make call +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] call_handle call handle +* @remarks If this API is used, _vc_core_engine_prepare_call is not reqired for making the call again. The last prepared call details will +* be used for the redialling. Application has to just use _vc_core_engine_make_call API to redial the call +*/ +voicecall_error_t _vc_core_engine_prepare_redial(voicecall_engine_t *pvoicecall_agent, int call_handle) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_call_objectinfo_t call_object; + int mo_call_handle = -1; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(call_handle >= 0, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Check the validity of the call handle */ + mo_call_handle = _vc_core_cm_get_outgoing_call_handle(&pagent->call_manager); + if ((mo_call_handle == -1) || (mo_call_handle != call_handle)) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + if (FALSE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &call_object)) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + /*Set the callobject status */ + call_object.state = VC_CALL_STATE_REDIAL; + + /*Reintialize Call ID */ + call_object.call_id = 0; + _vc_core_cm_set_call_object(&pagent->call_manager, &call_object); + + /*Set Engine IO State */ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE); + + /*todo Set SAT Redial Data */ + + return ERROR_VOICECALL_NONE; +} + +#ifdef _OLD_SAT_ +/** +* This function checks whether SAT redial duration is valid +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] bredial_duration Contains TRUE if SAT redial duration is enabled, FALSE otherwise +* @remarks pvoicecall_agent and bredial_duration cannot be NULL +*/ +voicecall_error_t voicecall_get_sat_redial_duration_status(voicecall_engine_t *pvoicecall_agent, gboolean *bredial_duration) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bredial_duration != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Redial Duration Status= %d", pcall_vc_satcall_info->bduration); + + *bredial_duration = pcall_vc_satcall_info->bduration; + return ERROR_VOICECALL_NONE; +} + +/** +* This function sets the current duration and retrieves the modified remaining SAT redial duration +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[out] remaining_duration remaining sat duration +* @remarks pvoicecall_agent and remaining_duration cannot be NULL +*/ +voicecall_error_t voicecall_get_set_sat_remaining_duration(voicecall_engine_t *pvoicecall_agent, long *remaining_duration) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(remaining_duration != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pcall_agent->call_manager.setupcall_info.satcall_setup_info); + *remaining_duration = pcall_vc_satcall_info->remaining_duration; + CALL_ENG_DEBUG(ENG_DEBUG, "Remaining Duration: %ld", *remaining_duration); + + return ERROR_VOICECALL_NONE; +} +#endif + +voicecall_error_t _vc_core_engine_get_sat_dtmf_hidden_mode(voicecall_engine_t *pvoicecall_agent, gboolean *bhidden_mode) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + call_vc_satsetup_info_t *pcall_vc_satcall_info = NULL; + + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_FAIL(bhidden_mode != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + pcall_vc_satcall_info = (call_vc_satsetup_info_t *) &(pagent->call_manager.setupcall_info.satcall_setup_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Hidden Mode= %d", pcall_vc_satcall_info->satengine_dtmf_data.bIsHiddenMode); + + *bhidden_mode = pcall_vc_satcall_info->satengine_dtmf_data.bIsHiddenMode; + return ERROR_VOICECALL_NONE; +} + +/** +* This function changes the voice audio path +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path audio path to be changed +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_change_audio_path(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path, gboolean bextra_volume) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + TelCallSoundPathInfo_t tapi_sound_path; + /*Enum for encapsulating errors from TAPI Lib */ + TapiResult_t tapi_error = TAPI_API_SUCCESS; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Voicecall Path Should not be modified if calls are not available */ + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) <= 0) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + switch (audio_path) { + case VC_AUDIO_PATH_HANDSET: + { + tapi_sound_path.path = TAPI_SOUND_PATH_HANDSET; + } + break; + case VC_AUDIO_PATH_HEADSET: + { + tapi_sound_path.path = TAPI_SOUND_PATH_HEADSET; + } + break; + case VC_AUDIO_PATH_HANDSFREE: + { + tapi_sound_path.path = TAPI_SOUND_PATH_HANDSFREE; + } + break; + case VC_AUDIO_PATH_BLUETOOTH: + { + tapi_sound_path.path = TAPI_SOUND_PATH_BLUETOOTH; + } + break; + case VC_AUDIO_PATH_STEREO_BLUETOOTH: + { + tapi_sound_path.path = TAPI_SOUND_PATH_STEREO_BLUETOOTH; + } + break; + case VC_AUDIO_PATH_SPK_PHONE: + { + tapi_sound_path.path = TAPI_SOUND_PATH_SPK_PHONE; + } + break; + case VC_AUDIO_PATH_HEADSET_3_5PI: + { + tapi_sound_path.path = TAPI_SOUND_PATH_HEADSET_3_5PI; + } + break; + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid audio path"); + return ERROR_VOICECALL_INVALID_ARGUMENTS; + } + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_audio_path: %d(extra voluem: %d)", tapi_sound_path, bextra_volume); + if ((bextra_volume) + && ((tapi_sound_path.path == TAPI_SOUND_PATH_HANDSET) + || (tapi_sound_path.path = TAPI_SOUND_PATH_SPK_PHONE))) { + tapi_sound_path.ex_volume = TAPI_SOUND_EX_VOLUME_ON; + } else { + tapi_sound_path.ex_volume = TAPI_SOUND_EX_VOLUME_OFF; + } + + tapi_error = tel_set_call_sound_path(pcall_agent->tapi_handle, &tapi_sound_path, _vc_core_engine_set_sound_path_resp_cb, NULL); + if (tapi_error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_set_sound_path error: %d", tapi_error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_set_audio_mute(voicecall_engine_t *pvoicecall_agent, gboolean bmute_audio) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + TapiResult_t error = TAPI_API_SUCCESS; + TelSoundMuteStatus_t micmute_set = TAPI_SOUND_MUTE_STATUS_OFF; + + micmute_set = (TRUE == bmute_audio) ? TAPI_SOUND_MUTE_STATUS_ON : TAPI_SOUND_MUTE_STATUS_OFF; + + error = tel_set_call_mute_status(pcall_agent->tapi_handle, micmute_set, _vc_core_engine_set_mute_status_resp_cb, NULL); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_set_sound_mute_status Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_NONE; +} + +/** +* This function sets the voice call audio volume for the given audio path type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be set +* @param[in] vol_level volume level +* @remarks pvoicecall_agent cannot be NULL +*/ +voicecall_error_t _vc_core_engine_set_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type, voicecall_audio_volume_t vol_level) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + /*Enum for encapsulating errors from TAPI Lib */ + TapiResult_t error = TAPI_API_SUCCESS; + TelCallVolumeInfo_t vol_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start! path(%d), volume(%d)", audio_path_type, vol_level); + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(audio_path_type, VC_AUDIO_PATH_HANDSET, VC_AUDIO_PATH_HEADSET_3_5PI, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(vol_level, VC_AUDIO_VOLUME_LEVEL_0, VC_AUDIO_VOLUME_LEVEL_9, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Ignore the request if calls are not available */ + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) <= 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + vol_info.volume = vol_level; + vol_info.type = TAPI_SOUND_TYPE_VOICE; + switch (audio_path_type) { + case VC_AUDIO_PATH_HEADSET: + vol_info.device = TAPI_SOUND_DEVICE_HEADSET; + break; + case VC_AUDIO_PATH_BLUETOOTH: + case VC_AUDIO_PATH_STEREO_BLUETOOTH: + vol_info.device = TAPI_SOUND_DEVICE_BLUETOOTH; + break; + case VC_AUDIO_PATH_SPK_PHONE: + vol_info.device = TAPI_SOUND_DEVICE_SPEAKER_PHONE; + break; + default: + vol_info.device = TAPI_SOUND_DEVICE_RECEIVER; + break; + } + + error = tel_set_call_volume_info(pcall_agent->tapi_handle, &vol_info, _vc_core_engine_set_volume_resp_cb, NULL); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi API Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_NONE; +} + +/** +* This function retreives the voice call audio volume for the given audio path type +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to Voicecall Engine +* @param[in] audio_path_type audio path for the volume to be retreived +* @remarks pvoicecall_agent cannot be NULL +* The audio volume level will be send as a response with the below details +* event - VC_CALL_GET_VOLUME_RESP +* param1 - audio_path_type +* param2 - volume level +* param3 - NULL +*/ +voicecall_error_t _vc_core_engine_get_audio_volume(voicecall_engine_t *pvoicecall_agent, voicecall_audio_path_t audio_path_type) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + TapiResult_t error = TAPI_API_SUCCESS; + TelSoundDevice_t volume_type = TAPI_SOUND_DEVICE_RECEIVER; + + VOICECALL_RETURN_VALUE_IF_FAIL(pcall_agent != NULL, ERROR_VOICECALL_INVALID_ARGUMENTS); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(audio_path_type, VC_AUDIO_PATH_HANDSET, VC_AUDIO_PATH_HEADSET_3_5PI, ERROR_VOICECALL_INVALID_ARGUMENTS); + + /*Ignore the request if calls are not available */ + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) <= 0) { + return ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + } + + switch (audio_path_type) { + case VC_AUDIO_PATH_HEADSET: + volume_type = TAPI_SOUND_DEVICE_HEADSET; + break; + case VC_AUDIO_PATH_BLUETOOTH: + case VC_AUDIO_PATH_STEREO_BLUETOOTH: + volume_type = TAPI_SOUND_DEVICE_BLUETOOTH; + break; + case VC_AUDIO_PATH_SPK_PHONE: + volume_type = TAPI_SOUND_DEVICE_SPEAKER_PHONE; + break; + default: + volume_type = TAPI_SOUND_DEVICE_RECEIVER; + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "volume_type = %d", volume_type); + + pcall_agent->curr_tapi_path = volume_type; + error = tel_get_call_volume_info(pcall_agent->tapi_handle, volume_type, TAPI_SOUND_TYPE_VOICE, _vc_core_engine_get_volume_resp_cb, NULL); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi API Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + return ERROR_VOICECALL_NONE; +} + +/** +* This function changes the inout state of the engine to the given state +* +* @return ERROR_VOICECALL_NONE on success or return value contains appropriate error code on failure +* @param[in] pvoicecall_agent Handle to voicecall engine +* @param[in] io_state Inout state to be set +* @remarks pvoicecall_agent cannot be NULL +* @see _vc_core_engine_status_get_engine_iostate +*/ +voicecall_error_t _vc_core_engine_change_engine_iostate(voicecall_engine_t *pvoicecall_agent, int io_state) +{ + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)pvoicecall_agent; + VOICECALL_RETURN_VALUE_IF_FAIL(pagent != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_NOT_IN_RANGE(io_state, VC_INOUT_STATE_NONE, VC_INOUT_STATE_INCOME_END, ERROR_VOICECALL_INVALID_CALL_HANDLE); + + if (TRUE == _vc_core_ca_change_inout_state(pagent, (voicecall_inout_state_t) io_state)) { + return ERROR_VOICECALL_NONE; + } + + return ERROR_VOICECALL_INVALID_ARGUMENTS; +} + +voicecall_error_t _vc_core_engine_extract_phone_number(const char *source_tel_number, char *phone_number, const int buf_size) +{ + VOICECALL_RETURN_VALUE_IF_FAIL(source_tel_number != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + VOICECALL_RETURN_VALUE_IF_FAIL(phone_number != NULL, ERROR_VOICECALL_INVALID_CALL_HANDLE); + + if (FALSE == _vc_core_util_extract_call_number(source_tel_number, phone_number, buf_size)) { + _vc_core_util_strcpy(phone_number, buf_size, source_tel_number); + } + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_set_to_default_values(voicecall_engine_t *pvoicecall_agent) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start"); + /*Initialize Call Manager */ + _vc_core_call_manager_init(&pcall_agent->call_manager); + + /* Initialize Call Agent Flags */ + _vc_core_ca_init_data(pcall_agent); + +#ifdef _CCBS_DEFINED_ + /* Init CCBS Info */ + _vc_core_init_ccbs_info(pcall_agent); +#endif + + /* Init CPHS Info */ +#ifdef _CPHS_DEFINED_ + _vc_core_svcall_init_cphs_info(pcall_agent); +#endif + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_check_incoming_handle(voicecall_engine_t *pvoicecall_agent, int call_id) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Start Incoming handle : %d", call_id); + + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + TapiResult_t error = TAPI_API_SUCCESS; + TelCallStatus_t call_status; + memset(&call_status, 0x0, sizeof(TelCallStatus_t)); + + error = tel_get_call_status(pcall_agent->tapi_handle, call_id, &call_status); + + if (error != TAPI_API_SUCCESS) { + /* If incoming call handle is not valid, terminate current incoming call */ + CALL_ENG_DEBUG(ENG_DEBUG, "tel_get_call_status Error: %d", error); + CALL_ENG_DEBUG(ENG_DEBUG, "Adding Incoming End Event to Idle Callback"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_END); + + g_idle_add(__call_vc_incoming_call_end_idle_cb, pcall_agent); + return ERROR_VOICECALL_TAPI_ERROR; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return ERROR_VOICECALL_NONE; +} + +voicecall_error_t _vc_core_engine_off_sound_clock_status(voicecall_engine_t *pvoicecall_agent) +{ + TapiResult_t error = TAPI_API_SUCCESS; + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pvoicecall_agent; + + error = tel_set_call_sound_clock_status(pcall_agent->tapi_handle, FALSE, _vc_core_engine_set_sound_clock_cb, NULL); + + if (error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_set_call_sound_equalization Error: %d", error); + return ERROR_VOICECALL_TAPI_ERROR; + } + + return ERROR_VOICECALL_NONE; +} + +void _vc_core_engine_dial_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_dial_call_resp_cb"); + + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + if (TAPI_CAUSE_FIXED_DIALING_NUMBER_ONLY == result) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Dial call Failed with fixed dialing number only"); + __call_vc_outgoingcall_endhandle(pagent, VC_TAPI_DUMMY_CALLHANDLE, NULL, TAPI_CALL_END_NO_CAUSE); + } else if (TAPI_CAUSE_SUCCESS != result) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Dial call Failed with error cause: %d", result); + __call_vc_outgoingcall_endhandle(pagent, VC_TAPI_DUMMY_CALLHANDLE, TAPI_NOTI_VOICE_CALL_STATUS_IDLE, TAPI_CC_CAUSE_FACILITY_REJECTED); + /* Need to make warning popup for abnormal status... */ + } +} + +void _vc_core_engine_answer_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_answer_call_resp_cb"); + + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + if (result != TAPI_CAUSE_SUCCESS) { + /*If IO State is waiting for Answer Response */ + if ((VC_INOUT_STATE_INCOME_WAIT_CONNECTED == pagent->io_state) || (VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED == pagent->io_state) || (VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED == pagent->io_state)) { + int mt_call_handle = -1; + + mt_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + + if (mt_call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "mt_call_handle = %d", mt_call_handle); + + /*Send Hold Failed Notification to client UI */ + if (pagent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pagent, VC_ERROR_OCCURED, ERROR_VOICECALL_HOLD_FAILED, 0, NULL); + } + + /*Send Incoming call MT End Indication to Client UI */ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_END); + g_idle_add(__call_vc_incoming_call_end_idle_cb, pagent); + } + } + } else { + _vc_core_ca_send_event_to_client(pagent, VC_CALL_ANSWER_CNF, 0, 0, NULL); + } +} + +void _vc_core_engine_end_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_end_call_resp_cb.."); + + TelCallEndCnf_t callEndInfo ; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelCallEndType_t call_end_type = TAPI_CALL_END; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + memset(&callEndInfo, 0, sizeof(TelCallEndCnf_t)); + memcpy(&callEndInfo, tapi_data, sizeof(TelCallEndCnf_t)); + + call_handle = callEndInfo.id; + call_end_type = callEndInfo.type; + + if (TAPI_CAUSE_SUCCESS == result) { + /*Ignore this event as endication will be received from TAPI for the call release request */ + CALL_ENG_DEBUG(ENG_DEBUG, "Success response for tel_end_call request"); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Call Release request failed, proceeding with Call end process"); + call_vc_call_objectinfo_t objectInfo; + voicecall_call_state_t present_call_state = VC_CALL_STATE_NONE; + call_vc_handle incoming_call_handle = VC_TAPI_INVALID_CALLHANDLE; + TelTapiEndCause_t tapi_cause = TAPI_CALL_END_NO_CAUSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d,end cause:%d", call_handle, tapi_cause); + + /*the end of incoming call rejected by callagent, because the call had come before the phone is initialized */ + if (call_handle == gphone_rejected_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Rejected call..phone not initialized"); + + gphone_rejected_call = VC_TAPI_INVALID_CALLHANDLE; + + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + + incoming_call_handle = _vc_core_cm_get_incoming_call_handle(&pagent->call_manager); + present_call_state = _vc_core_cm_get_call_state(&pagent->call_manager, call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "New Call Handle = %d, Already registered MT call handle : %d", call_handle, incoming_call_handle); + switch (present_call_state) { + case VC_CALL_STATE_NONE: + case VC_CALL_STATE_ENDED: + case VC_CALL_STATE_ENDED_FINISH: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d state is %d", call_handle, present_call_state); + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + break; + case VC_CALL_STATE_REJECTED: + { + /*End of incoming call (not registered as incoming call in CallAgent) rejected by callagent */ + if (incoming_call_handle != call_handle) { + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "end of call rejected by callagent"); + + /*If no more calls available, End the Application */ + __vc_core_check_engine_active_task(pagent); + return; + } + } + break; + default: + break; + } + + /*End of the call rejected by user or by callagent (when hold is failed) */ + if ((VC_INOUT_STATE_INCOME_WAIT_RELEASE == pagent->io_state) && (incoming_call_handle == call_handle)) { + _vc_core_cm_remove_call_object(&pagent->call_manager, call_handle); + + /*Change the In Out state to None*/ + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_NONE); + + /*Notify Client about rejected Event*/ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_REJECTED_END, call_handle, 0, NULL); + + return; + } + + /*End of Incoming Call */ + if (incoming_call_handle == call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "Adding Incoming End Event to Idle Callback"); + _vc_core_ca_change_inout_state(pagent, VC_INOUT_STATE_INCOME_END); + /*Make sure that the End Indication is processed always after the Incoming Indication , as both are + processed in Idle Add Callbacks */ + g_idle_add(__call_vc_incoming_call_end_idle_cb, pagent); + return; + } + + /*End of Outgoing Call */ + if (_vc_core_cm_get_outgoing_call_handle(&pagent->call_manager) == call_handle) { + __call_vc_outgoingcall_endhandle(pagent, call_handle, TAPI_NOTI_VOICE_CALL_STATUS_IDLE, tapi_cause); + return; + } + + /*End of Normal Connected Call */ + _vc_core_tapi_event_handle_call_end_event(pagent, "", call_handle, tapi_cause); + + CALL_VC_DUMP_CALLDETAILS(&pagent->call_manager); + _vc_core_cm_clear_call_object(&objectInfo); + if (FALSE == _vc_core_cm_get_call_object(&pagent->call_manager, call_handle, &objectInfo)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Already Cleared for Call Handle = %d", call_handle); + + /* jspark + * Because of _vc_core_tapi_rqst_answer_call( .., VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT,.. ) inside _vc_core_tapi_event_handle_call_end_event(), + * pagent->call_manager is cleared. so, we didn't send VC_CALL_NORMAL_END to call-ui. + * so we should send this event to call-ui. + */ + { + voice_call_end_cause_type_t end_cause_type; + _vc_core_tapi_event_get_end_cause_type(pagent, "", tapi_cause, &end_cause_type); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NORMAL_END, call_handle, end_cause_type, NULL); + } + } else { + _vc_core_ca_send_event_to_client(pagent, VC_CALL_NORMAL_END, objectInfo.call_handle, objectInfo.end_cause_type, NULL); + } + } + return; +} + +void _vc_core_engine_hold_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_hold_call_resp_cb"); + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + if (TAPI_CAUSE_SUCCESS == result) { + memcpy(&call_handle, tapi_data, sizeof(call_vc_handle)); + } else { + _vc_core_cm_get_first_active_call_handle(&pagent->call_manager, &call_handle); + } + + if (_vc_core_tapi_event_handle_call_held_event(pagent, call_handle, result) == FALSE) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } else { + /* + Be carefull in clearing the end call member, because _vc_core_engine_status_is_any_call_ending + function depends on the end call object status. If it is cleared often, the check by + _vc_core_engine_status_is_any_call_ending becomes invalid + */ + _vc_core_cm_clear_endcall_member(&pagent->call_manager); + } +} + +void _vc_core_engine_active_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_active_call_resp_cb"); + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + TelCallActiveCnf_t callActiveInfo; + + if (TAPI_CAUSE_SUCCESS == result) { + memset(&callActiveInfo, 0, sizeof(TelCallActiveCnf_t)); + memcpy(&callActiveInfo, tapi_data, sizeof(TelCallActiveCnf_t)); + call_handle = callActiveInfo.id; + } else { + _vc_core_cm_get_first_held_call_handle(&pagent->call_manager, &call_handle); + } + + if (_vc_core_tapi_event_handle_call_retrieve_event(pagent, call_handle, result) == FALSE) { + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + } else { + /* + Be carefull in clearing the end call member, because _vc_core_engine_status_is_any_call_ending + function depends on the end call object status. If it is cleared often, the check by + _vc_core_engine_status_is_any_call_ending becomes invalid + */ + _vc_core_cm_clear_endcall_member(&pagent->call_manager); + } +} + +void _vc_core_engine_swap_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + TelCallSwapCnf_t callSwapInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "result:%d, handle:%d", result); + + if (TAPI_CAUSE_SUCCESS == result) { + memset(&callSwapInfo, 0, sizeof(TelCallSwapCnf_t)); + memcpy(&callSwapInfo, tapi_data, sizeof(TelCallSwapCnf_t)); + call_handle = callSwapInfo.id; + + _vc_core_cm_swap_group_state(&pagent->call_manager); + _vc_core_ca_send_event_to_client(pagent, VC_CALL_SS_SWAP, call_handle, 0, NULL); + } else { + /*Reset the Call Agent State*/ + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pagent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } +} + +void _vc_core_engine_join_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + TelCallJoinCnf_t callJoinInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_join_call_resp_cb..."); + + if (TAPI_CAUSE_SUCCESS == result) { + memset(&callJoinInfo, 0, sizeof(TelCallJoinCnf_t)); + memcpy(&callJoinInfo, tapi_data, sizeof(TelCallJoinCnf_t)); + call_handle = callJoinInfo.id; + } else { + call_handle = 0; + } + + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_tapi_event_handle_call_join_event(pagent, call_handle, result); +} + +void _vc_core_engine_split_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + TelCallSplitCnf_t callSplitInfo; + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_split_call_resp_cb"); + + if (TAPI_CAUSE_SUCCESS == result) { + memset(&callSplitInfo, 0, sizeof(TelCallSplitCnf_t)); + memcpy(&callSplitInfo, tapi_data, sizeof(TelCallSplitCnf_t)); + call_handle = callSplitInfo.id; + } + + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_tapi_event_handle_call_split_event(pagent, call_handle, result); +} + +void _vc_core_engine_transfer_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_transfer_call_resp_cb"); + + _vc_core_ca_change_agent_state(pagent, CALL_VC_CA_STATE_NORMAL); + _vc_core_tapi_event_handle_call_transfer_event(pagent, result); +} + +void _vc_core_engine_dtmf_call_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_dtmf_call_resp_cb"); + + if (TAPI_CAUSE_SUCCESS != result) { + CALL_ENG_DEBUG(ENG_DEBUG, "Tapi Error Code %d", result); + /*Forward the events to client */ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_DTMF_ACK, FALSE, 0, NULL); + } else { + /*Forward the events to client */ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_DTMF_ACK, TRUE, 0, NULL); + } +} + +void _vc_core_engine_set_volume_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_set_volume_resp_cb : %d", result); +} + +void _vc_core_engine_get_volume_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + int tapi_sound_path = 0; + int volume_level = 0; + TelCallGetVolumeInfoResp_t snd_resp_data; + call_vc_callagent_state_t *pagent = gpcall_agent_for_callback; + + memset(&snd_resp_data, 0, sizeof(TelCallGetVolumeInfoResp_t)); + memcpy(&snd_resp_data, tapi_data, sizeof(TelCallGetVolumeInfoResp_t)); + + int i = 0; + tapi_sound_path = pagent->curr_tapi_path; + for (i = 0; i < snd_resp_data.record_num; i++) { + if (tapi_sound_path == snd_resp_data.record[i].device) { + volume_level = snd_resp_data.record[i].volume; + break; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "Changed Vol Type = %d, Vol Level = %d", tapi_sound_path, volume_level); + + _vc_core_ca_send_event_to_client(pagent, VC_CALL_GET_VOLUME_RESP, tapi_sound_path, volume_level, NULL); +} + +void _vc_core_engine_set_sound_path_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_set_sound_path_resp_cb : %d", result); +} + +void _vc_core_engine_set_mute_status_resp_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_set_mute_status_resp_cb : %d", result); +} + +void _vc_core_engine_get_aoc_info_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_get_aoc_info_cb : %d", result); +} + +void _vc_core_engine_set_sound_clock_cb(TapiHandle *handle, int result, void *tapi_data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_set_sound_clock_cb : %d", result); +} + +static void __vc_core_engine_tapi_event_flight_mode_cb(TapiHandle *handle, int result, void *data, void *user_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + if (!user_data) + return; + call_vc_callagent_state_t *pagent = (call_vc_callagent_state_t *)user_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "result:%d", result); + + switch (result) { + case TAPI_POWER_FLIGHT_MODE_RESP_OFF: + /*Flight mode is disabled.. make a new call*/ + _vc_core_ca_send_event_to_client(pagent, VC_CALL_FLIGHT_MODE_DISABLED, -1, -1, NULL); + break; + + case TAPI_POWER_FLIGHT_MODE_RESP_FAIL: + /*Error in disabling request - show popup*/ + break; + + case TAPI_POWER_FLIGHT_MODE_RESP_ON: + case TAPI_POWER_FLIGHT_MODE_RESP_MAX: + default: + /* do nothing */ + break; + } +} + +gboolean _vc_core_engine_disable_flight_mode(voicecall_engine_t *pvoicecall_agent) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + int ret = -1; + + ret = tel_set_flight_mode(pvoicecall_agent->tapi_handle, TAPI_POWER_FLIGHT_MODE_LEAVE, __vc_core_engine_tapi_event_flight_mode_cb, pvoicecall_agent); + if (ret != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_ERR, "*** [ERR] tel_set_flight_mode(TAPI_POWER_FLIGHT_MODE_LEAVE) ***"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Request SUCCESS"); + + return TRUE; +} diff --git a/call-engine/core/vc-core-svcall.c b/call-engine/core/vc-core-svcall.c new file mode 100755 index 0000000..f24dc42 --- /dev/null +++ b/call-engine/core/vc-core-svcall.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef _CPHS_DEFINED_ + +#include +#include +#include "vc-core-engine.h" +#include "vc-core-svcall.h" +#include "vc-core-util.h" +#include "tapi-inc.h" +#include "status-interface.h" + +/*Local Function Decleration*/ +/** +* This function checks whether csp is enabled in the cphs group +* +* @internal +* @return TRUE if customer service profile is enabled -FALSE otherwise +* @param[in] pcall_agent Handle to Voicecall Call Agent +*/ +static gboolean __call_vcsv_cphs_is_csp_enabled(call_vc_callagent_state_t *pcall_agent); + +/** +* This function returns the csp index of the given csp service from the cphs cspprofile +* +* @internal +* @return index to the specified csp service +* @param[in] pcphs_csp_profile Handle to csp profile entry table +* @param[in] csp_group_max_count maximumm service entry +* @param[in] csp_service csp service to be found +*/ +static int __call_vcsv_cphs_find_csp_index(TelSimCphsCustomerServiceProfileEntry_t *pcphs_csp_profile, int csp_group_max_count, TelSimCphsCustomerServiceGroup_t csp_service); + +/** + * This function retrieves cphs information from the Telephony and stores with the engine + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Handle to Voicecall Call Agent + */ +gboolean _vc_core_svcall_init_cphs_info(call_vc_callagent_state_t *pcall_agent) +{ + gboolean ret_val = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + memset(&pcall_agent->cphs_status, 0, sizeof(status_class_cphs_type)); + + /*Read CPHS Info */ +#ifdef _CPHS_DEFINED_ + ret_val = nps_get_cphs_status(&pcall_agent->cphs_status); +#endif + + if (FALSE == ret_val) { + CALL_ENG_DEBUG(ENG_DEBUG, "nps_get_cphs_status failed or CPHS feature not enabled"); + pcall_agent->bcphs_read_success = FALSE; + return FALSE; + } + + pcall_agent->bcphs_read_success = TRUE; + + return TRUE; +} + +/** + * This function retrieves status of the given csp service type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] csp_service csp service whose status to be retreived + */ +gboolean _vc_core_svcall_cphs_csp_get_status(call_vc_callagent_state_t *pcall_agent, voicecall_cphs_csp_service csp_service) +{ + status_class_cphs_type *pcphs_status_info = (status_class_cphs_type *) &pcall_agent->cphs_status; + int csp_index = -1; + + if (FALSE == __call_vcsv_cphs_is_csp_enabled(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "CPHS CSP Not enabled"); + + if (VC_CPHS_CSP_ALS == csp_service) { + return FALSE; + } else { + /*If CPHS is not supported, then by default return TRUE for the client to have default action */ + return TRUE; + } + } + + switch (csp_service) { + case VC_CPHS_CSP_ALS: /*CPHS Teleservices */ + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_CPHS_TELESERVICES); + } + break; + case VC_CPHS_CSP_HOLD: /*Call Completion Services */ + case VC_CPHS_CSP_CW: + case VC_CPHS_CSP_CBS: + case VC_CPHS_CSP_UUS: + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_CALL_COMPLETION); + } + break; + case VC_CPHS_CSP_CT: /*Call Offering Services */ + case VC_CPHS_CSP_CFU: + case VC_CPHS_CSP_CFB: + case VC_CPHS_CSP_CFNRY: + case VC_CPHS_CSP_CFNRC: + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_CALL_OFFERING); + } + break; + case VC_CPHS_CSP_MPTY: /*Other Supplementary Services */ + case VC_CPHS_CSP_CUG: + case VC_CPHS_CSP_AOC: + case VC_CPHS_CSP_PREFCUG: + case VC_CPHS_CSP_CUGOA: + { + csp_index = __call_vcsv_cphs_find_csp_index(pcphs_status_info->csp.serviceProfileEntry, TAPI_SIM_CPHS_CUSTOMER_SERVICE_PROFILE_ENTRY_COUNT_MAX, TAPI_SIM_CPHS_CSP_SERVICE_GROUP_OTHER_SUPP_SERVICES); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Actions defined for service type: %d", csp_service); + break; + } + + if (-1 == csp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "csp_index failed for csp service: %d", csp_service); + return FALSE; + } + + switch (csp_service) { + case VC_CPHS_CSP_ALS: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.cphsTeleservices.bAlternativeLineService; + } + break; + case VC_CPHS_CSP_HOLD: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bCallHold; + } + break; + case VC_CPHS_CSP_CW: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bCallWaiting; + } + break; + case VC_CPHS_CSP_CBS: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bCompletionOfCallToBusySubscriber; + } + break; + case VC_CPHS_CSP_UUS: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callComplete.bUserUserSignalling; + } + break; + case VC_CPHS_CSP_CFU: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingUnconditional; + } + break; + case VC_CPHS_CSP_CFB: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingOnUserBusy; + } + break; + case VC_CPHS_CSP_CFNRY: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingOnNoReply; + } + break; + case VC_CPHS_CSP_CFNRC: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallForwardingOnUserNotReachable; + } + break; + case VC_CPHS_CSP_CT: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.callOffering.bCallTransfer; + } + break; + case VC_CPHS_CSP_MPTY: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bMultiPartyService; + } + break; + case VC_CPHS_CSP_CUG: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bClosedUserGroup; + } + break; + case VC_CPHS_CSP_AOC: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bAdviceOfCharge; + } + break; + case VC_CPHS_CSP_PREFCUG: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bPreferentialClosedUserGroup; + } + break; + case VC_CPHS_CSP_CUGOA: + { + return pcphs_status_info->csp.serviceProfileEntry[csp_index].u.otherSuppServices.bPreferentialClosedUserGroup; + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for csp service: %d", csp_service); + return FALSE; + } + + return FALSE; +} + +voice_call_cphs_alsline_t _vc_core_svcall_get_cphs_als_active_line(call_vc_callagent_state_t *pcall_agent) +{ + status_class_cphs_type *pcphs_status_info = (status_class_cphs_type *) &pcall_agent->cphs_status; + + if (FALSE == __call_vcsv_cphs_is_csp_enabled(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "CPHS CSP Not enabled"); + return VC_CALL_CPHS_ALS_LINE1; + } + + if (TAPI_SIM_DYNAMIC_FLAGS_LINE1 == pcphs_status_info->dflagsinfo.dynamicFlags) { + return VC_CALL_CPHS_ALS_LINE1; + } else if (TAPI_SIM_DYNAMIC_FLAGS_LINE2 == pcphs_status_info->dflagsinfo.dynamicFlags) { + return VC_CALL_CPHS_ALS_LINE2; + } + + return VC_CALL_CPHS_ALS_LINE1; + +} + +/*Local Function Decleration*/ +static gboolean __call_vcsv_cphs_is_csp_enabled(call_vc_callagent_state_t *pcall_agent) +{ + status_class_cphs_type *pnps_cphs_status = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (pcall_agent->bcphs_read_success == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "CSP Status not read"); + return FALSE; + } + + pnps_cphs_status = &pcall_agent->cphs_status; + + if (FALSE == pnps_cphs_status->cphsinfo.CphsServiceTable.bCustomerServiceProfile) { + return TRUE; + } + + return FALSE; +} + +static int __call_vcsv_cphs_find_csp_index(TelSimCphsCustomerServiceProfileEntry_t *pcphs_csp_profile, int csp_group_max_count, TelSimCphsCustomerServiceGroup_t csp_service) +{ + int index = 0; + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + for (index = 0; index < csp_group_max_count; index++) { + if (pcphs_csp_profile[index].customerServiceGroup == csp_service) { + return index; + } + } + + return VC_ERROR; +} +#endif /*_CPHS_DEFINED_*/ diff --git a/call-engine/core/vc-core-tapi-evnt.c b/call-engine/core/vc-core-tapi-evnt.c new file mode 100755 index 0000000..f710391 --- /dev/null +++ b/call-engine/core/vc-core-tapi-evnt.c @@ -0,0 +1,1331 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include "vc-core-tapi-evnt.h" +#include "vc-core-callmanager.h" +#include "vc-core-util.h" +#include "vc-core-tapi-rqst.h" + +/** +* This function processes the current io wait states if available +* +* @internal +* @return if wait states are processed, FALSE otherwise +* @param[in] pcall_agent handle to voicecall agent structure +*/ +static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent); +static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata); +static gboolean __call_vc_download_call_timer_cb(gpointer pdata); + +/** + * This function retreives the voicecall engine specific end cause type for the given TAPI end cause type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] type TAPI event type + * @param[in] cause TAPI call end cause + * @param[out] end_cause_type voicecall engine end cause + */ +void _vc_core_tapi_event_get_end_cause_type(call_vc_callagent_state_t *pcall_agent, const char *noti_id, TelTapiEndCause_t cause, voice_call_end_cause_type_t *end_cause_type) +{ + VOICECALL_RETURN_IF_FAIL(noti_id != NULL); + VOICECALL_RETURN_IF_FAIL(end_cause_type != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "EventType:[%s],EndCause:%d", noti_id, cause); + + if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_IDLE) == 0) { + switch (cause) { + case TAPI_CC_CAUSE_NORMAL_UNSPECIFIED: + *end_cause_type = VC_ENDCAUSE_CALL_DISCONNECTED; + break; + case TAPI_CC_CAUSE_FACILITY_REJECTED: + *end_cause_type = VC_ENDCAUSE_CALL_FAILED; + break; + case TAPI_CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE: + case TAPI_CC_CAUSE_ACCESS_INFORMATION_DISCARDED: + case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED: + case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE: + case TAPI_CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE: + case TAPI_CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED: + case TAPI_CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED: + + *end_cause_type = VC_ENDCAUSE_CALL_ENDED; + break; + + case TAPI_CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED: + *end_cause_type = VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED; + break; + + case TAPI_CC_CAUSE_OPERATOR_DETERMINED_BARRING: + *end_cause_type = VC_ENDCAUSE_CALL_BARRED; + break; + case TAPI_REJECT_CAUSE_MM_REJ_NO_SERVICE: + *end_cause_type = VC_ENDCAUSE_NO_SERVICE; + break; + + case TAPI_REJECT_CAUSE_CONGESTTION: + case TAPI_REJECT_CAUSE_CNM_REJ_NO_RESOURCES: + case TAPI_CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION: /* Match as NW_BUSY*/ + *end_cause_type = VC_ENDCAUSE_NW_BUSY; + break; + + case TAPI_REJECT_CAUSE_NETWORK_FAILURE: + case TAPI_REJECT_CAUSE_MSC_TEMPORARILY_NOT_REACHABLE: + *end_cause_type = VC_ENDCAUSE_NW_FAILED; + break; + + case TAPI_REJECT_CAUSE_IMEI_NOT_ACCEPTED: + { + unsigned long mcc = 0; + + _vc_core_util_get_mcc(&mcc); + + if (mcc == CALL_NETWORK_MCC_UK) { + *end_cause_type = VC_ENDCAUSE_IMEI_REJECTED; /*Display "Please verify SIM or insert valid SIM"*/ + } else { + *end_cause_type = VC_ENDCAUSE_NW_FAILED; /*Display Network unavailable*/ + } + } + break; + + case TAPI_CC_CAUSE_NO_ROUTE_TO_DEST: + case TAPI_CC_CAUSE_TEMPORARY_FAILURE: + case TAPI_CC_CAUSE_NETWORK_OUT_OF_ORDER: + case TAPI_CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE: + case TAPI_CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE: + case TAPI_CC_CAUSE_DESTINATION_OUT_OF_ORDER: + *end_cause_type = VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE; + break; + case TAPI_CC_CAUSE_NO_USER_RESPONDING: + case TAPI_CC_CAUSE_USER_ALERTING_NO_ANSWER: + *end_cause_type = VC_ENDCAUSE_USER_DOESNOT_RESPOND; + break; + + case TAPI_CC_CAUSE_ACM_GEQ_ACMMAX: + *end_cause_type = VC_ENDCAUSE_NO_CREDIT; + break; + + case TAPI_CC_CAUSE_CALL_REJECTED: + if (pcall_agent->barring_ind_type == VC_BARR_IND_ALL) + *end_cause_type = VC_ENDCAUSE_CALL_BARRED; + else + *end_cause_type = VC_ENDCAUSE_USER_UNAVAILABLE; + + pcall_agent->barring_ind_type = VC_BARR_IND_NONE; + break; + + case TAPI_CC_CAUSE_USER_BUSY: + *end_cause_type = VC_ENDCAUSE_USER_BUSY; + break; + + case TAPI_CC_CAUSE_USER_NOT_MEMBER_OF_CUG: + *end_cause_type = VC_ENDCAUSE_WRONG_GROUP; + break; + + case TAPI_CC_CAUSE_INVALID_NUMBER_FORMAT: + + *end_cause_type = VC_ENDCAUSE_INVALID_NUMBER_FORMAT; + break; + + case TAPI_CC_CAUSE_UNASSIGNED_NUMBER: + *end_cause_type = VC_ENDCAUSE_UNASSIGNED_NUMBER; + break; + + case TAPI_CC_CAUSE_NUMBER_CHANGED: + *end_cause_type = VC_ENDCAUSE_NUMBER_CHANGED; + break; + + case TAPI_CALL_END_NO_CAUSE: + default: + *end_cause_type = VC_ENDCAUSE_CALL_ENDED; + + CALL_ENG_DEBUG(ENG_ERR, "Call Ended or Default Cause Value: %d", cause); + break; + } + } else { + *end_cause_type = VC_ENDCAUSE_CALL_FAILED; + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid call end cause or error !!"); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Engine End Cause: %d", (int)*end_cause_type); +} + +void _vc_core_tapi_event_copy_incoming_call_data(call_vc_callagent_state_t *pcall_agent, TelCallIncomingCallInfo_t *callInfo, call_vc_call_objectinfo_t *pcallobject_info) +{ +#ifdef _CPHS_DEFINED_ + if (_vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_ALS)) { + TelCallActiveLine_t activeLine = callInfo->ActiveLine; + + if (activeLine == TAPI_CALL_ACTIVE_LINE1) { + pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE1; + } else if (activeLine == TAPI_CALL_ACTIVE_LINE2) { + pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE2; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "undefined currentLine=%d", activeLine); + } + } +#endif + + _vc_core_util_strcpy(pcallobject_info->calling_name, sizeof(pcallobject_info->calling_name), callInfo->CallingNameInfo.szNameData); + pcallobject_info->bcalling_namemode = callInfo->CallingNameInfo.NameMode; + + /* If BCD number exists, number should be shown even though number restriction is set */ + if (strlen(callInfo->szCallingPartyNumber) > 0) { + pcallobject_info->brestricted_namemode = FALSE; + + if (callInfo->szCallingPartyNumber[0] == '*') { + pcallobject_info->bccbs_call = TRUE; + _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber + 1); + } else { + _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber); + } + + /* check callInfo->name_mode if override category isn't supported.*/ + } else { /* If BCD number doesn't exist, cause_of_no_cli value should be checked to decide its presentation */ + + pcallobject_info->brestricted_namemode = TRUE; + +/*code clean: #ifndef _ARM_SP*/ + pcallobject_info->name_mode = callInfo->CliCause; + + CALL_ENG_DEBUG(ENG_DEBUG, "no_cli_cause = %d, name_mode = %d...", callInfo->CliCause, pcallobject_info->name_mode); + } +} + +/** + * This function handles the incoming event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Incoming call handle + * @param[in] callInfo Incoming call info associated with the incoming call + */ +gboolean _vc_core_tapi_event_handle_incoming_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallIncomingCallInfo_t *callInfo) +{ + call_vc_call_objectinfo_t callobject_info; + int callIndex; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, number = %s..", call_handle, callInfo->szCallingPartyNumber); + + /* setting the new member info */ + _vc_core_cm_clear_call_object(&callobject_info); + + callobject_info.call_handle = call_handle; + callobject_info.call_id = _vc_core_cm_get_new_callId(&pcall_agent->call_manager); + callobject_info.bincoming_call_is_fwded = callInfo->fwded; + + /* setting the incom call telephone number */ + CALL_ENG_DEBUG(ENG_DEBUG, "[callobject_info.call_handle=%d], FWDED Call: %d", callobject_info.call_handle, callobject_info.bincoming_call_is_fwded); + + /*Copy Incoming call data in to the callobject */ + _vc_core_tapi_event_copy_incoming_call_data(pcall_agent, callInfo, &callobject_info); + + /*Change the Call Object Call State*/ + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_INCOME); + + /*Add the newly created callobject to the Call Manager*/ + callIndex = _vc_core_cm_add_call_object(&pcall_agent->call_manager, &callobject_info); + if (callIndex != -1) { + /*Set the Call Manager's MT Call Index as CallObject Index*/ + if (FALSE == _vc_core_cm_set_incoming_call(&pcall_agent->call_manager, callIndex)) { + CALL_ENG_DEBUG(ENG_ERR, "Problem in accpeting the incoming call, Current Call Details"); + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + return FALSE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "Problem in adding the call to the call manager"); + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + } + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_START); + + return TRUE; +} + +/** + * This function handles TAPI alert event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_alert_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ALERT); + + /* Change Inout state to "wait connected" before sending event to client so the same state is + reflected in client side also */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED); + + /*Send Alert Event to Client*/ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ALERT, call_handle, 0, NULL); + return TRUE; +} + +/** + * This function handles TAPI origination event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle associated with the alert event + */ +gboolean _vc_core_tapi_event_handle_originated_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle > 0); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ORIG); + + /* Send Alert Event to Client */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ORIG, call_handle, 0, NULL); + + /* Change Inout state to "wait Alert" */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ALERT); + + /* send response here.. not connected ind. Disable checking gcf status. */ +#ifndef _vc_core_ca_send_sat_response_ORIG + if (TRUE == _vc_core_util_check_gcf_status()) +#endif + { + call_vc_call_objectinfo_t callobject_info; + + _vc_core_cm_clear_call_object(&callobject_info); + + /*Process Connected Event*/ + /* Get the member info and chage info */ + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) { + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS); + } + } + + return TRUE; +} + +/** + * This function handles the call end event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] type TAPI Event Type + * @param[in] handle Call Handle of the call being ended + * @param[in] cause TAPI End Cause + */ +gboolean _vc_core_tapi_event_handle_call_end_event(call_vc_callagent_state_t *pcall_agent, const char * noti_id, call_vc_handle handle, TelTapiEndCause_t cause) +{ + gboolean active_call = FALSE; + gboolean held_call = FALSE; + int error_code = 0; + call_vc_call_objectinfo_t callobject_info; + voicecall_call_state_t prev_callstate; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_call_object(&pcall_agent->call_manager, handle, &callobject_info); + + prev_callstate = callobject_info.state; + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_ENDED); + + /* set end cause text*/ + _vc_core_tapi_event_get_end_cause_type(pcall_agent, noti_id, cause, &callobject_info.end_cause_type); + + /*Set the modified CallObject to the Call Manager*/ + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + /*All calls are disconnected, so stop call timer*/ + if (_vc_core_cm_isexists_connected_call(&pcall_agent->call_manager) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Connected Call Exist"); + } + + active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager); + held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager); + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_JOIN: + if ((FALSE == active_call) || (FALSE == held_call)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_HOLD: + if (FALSE == active_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_UNHOLD: + if (FALSE == held_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_SWAP: + if ((FALSE == active_call) || (FALSE == held_call)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL: +#ifdef AUTO_RETREIVE_HELD_CALL + if (FALSE == active_call) { + /* todo call: IF Ear MIC is Inserted && */ + if ((TRUE == held_call) && (pcall_agent->io_state == VC_INOUT_STATE_NONE) && \ + (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL); + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + } +#else + if (FALSE == active_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Still Active Calls are available"); + } +#endif + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL: + if (FALSE == held_call) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS: + if ((active_call == FALSE) && (held_call == FALSE)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + CALL_ENG_DEBUG(ENG_DEBUG, "Retrieve held call on active call end"); + if (FALSE == active_call) { + if ((TRUE == held_call) && (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_DROP: + if (VC_CALL_STATE_RELEASE_WAIT == prev_callstate) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + + break; + + case CALL_VC_CA_STATE_SPLIT_CALLBOX: + case CALL_VC_CA_STATE_DROP_CALLBOX: + case CALL_VC_CA_STATE_SENDMSG_CALLBOX: + case CALL_VC_CA_STATE_SAVE_TO_CONTACT_CALLBOX: + case CALL_VC_CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX: + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL: + if ((FALSE == active_call) && (FALSE == held_call)) { + char tel_number[VC_PHONE_NUMBER_LENGTH_MAX]; + + memset(tel_number, 0, VC_PHONE_NUMBER_LENGTH_MAX); + } + break; + case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP: + { + if ((active_call == FALSE) && (held_call == FALSE)) { + call_vc_call_objectinfo_t callInfo; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) { + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callInfo)) { + /*Send response only if call type is sat */ + if (callInfo.call_type == VC_CALL_ORIG_TYPE_SAT) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call"); + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + } + break; + } + + /*Update CallManager State */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG); + call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", call_handle); + + /*Inform Client about the Deferred Outgoing */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, call_handle, 0, NULL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_TRANSFER_CNF: + { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + CALL_ENG_DEBUG(ENG_DEBUG, "Waiting transfer canceled!"); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this call agent state:%d", pcall_agent->callagent_state); + } + + /* if waiting call end for mtc */ + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_INCOME_WAIT_HOLD: + + if (active_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "call to hold is disconnected..proceed to answer call"); + /*It will be better to show end of call + _vc_core_tapi_rqst_answer_call( pcall_agent);*/ + } + + break; + + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVECALL: + if (active_call == FALSE) { + /*_vc_core_tapi_rqst_answer_call( pcall_agent);*/ + } + break; + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL: + if (held_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Answering call after ending held calls"); + + /*Change the state to Income box, so the answer API will process it */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX); + + /* end held call and then accept incoming call */ + _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT, &error_code); + } + break; +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE: + if (held_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Answering(rel and accept) call after ending held calls"); + + /*Change the state to Income box, so the answer API will process it */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX); + + /* end held call and then accept incoming call */ + _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, &error_code); + } + break; +#endif + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED); + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Actions defined for IO State: %d", pcall_agent->io_state); + } + + if (VC_CALL_ORIG_TYPE_SAT == callobject_info.call_type) { + if (pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data != NULL) { + free(pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data); + pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data = NULL; + } + } + + return TRUE; +} + +static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED: + { + int grp_index; + call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE; + + if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) { + CALL_ENG_DEBUG(ENG_DEBUG, "Separate HOLD_CNF event not arrived for HOLD and ACCEPT request, holding the call in the CONNECTED event"); + grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager); + + if (-1 == grp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index); + return TRUE; + } + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle); + + _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD); + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, active_handle, 0, NULL); + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED); + } + } + break; + +#ifdef _INCOME_WAIT_CONNECTED_ + /*currently not applied, Fix to change the group state to hold, if the second call is connected before getting the holdcnf resp from tapi */ + case VC_INOUT_STATE_INCOME_WAIT_CONNECTED: + { + /*Check for incoming call exists */ + if (VC_INVALID_CALL_INDEX == pcall_agent->call_manager.mtcall_index) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Incoming call exists"); + return TRUE; + } + + if (0 == _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 0)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Previous Connected Members"); + return TRUE; + } + + /*Connected Event for the incoming call is arrived, when waiting for hold confirmation + So change the active call state to hold before processing the connected indication */ + if (CALL_VC_CA_STATE_WAIT_HOLD == pcall_agent->callagent_state) { + int grp_index; + /*call_vc_handle active_handle =TAPI_INVALID_CALLHANDLE;*/ + grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager); + + if (-1 == grp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index); + return TRUE; + } + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + /*_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager,&active_handle);*/ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD); + } else if (CALL_VC_CA_STATE_WAIT_UNHOLD == pcall_agent->callagent_state) { + int grp_index; + call_vc_handle held_handle = VC_TAPI_INVALID_CALLHANDLE; + grp_index = _vc_core_cm_get_held_group_index(&pcall_agent->call_manager); + if (-1 == grp_index) { + CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index); + return TRUE; + } + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_handle); + _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_ACTIVE); + + } + } + break; +#endif + case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED: + { + call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE;; + CALL_ENG_DEBUG(ENG_DEBUG, "VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED"); + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "Active Call Handle = %d", active_handle); + + /*_vc_core_tapi_event_handle_call_end_event(pcall_agent, TAPI_EVENT_CALL_END, active_handle, TAPI_CALL_END_NO_CAUSE);*/ + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this wait io state: %d", pcall_agent->io_state); + } + + return TRUE; +} + +/** + * This function handles the TAPI call connect event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being connected + */ +gboolean _vc_core_tapi_event_handle_call_connect_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + call_vc_call_objectinfo_t callobject_info; + int index; + int connectednum = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle); + + _vc_core_cm_clear_call_object(&callobject_info); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + /*First Process the wait state events before processing the connect event */ + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + __call_vc_process_wait_state_success_events(pcall_agent); + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /*Process Connected Event*/ + /* Get the member info and chage info */ + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + /* + ** Reqeust from SAT. When GCF field is ON, send response when get a setup confirm. + ** To send response to SAT faster... + */ +#ifndef _vc_core_ca_send_sat_response_ORIG + if (FALSE == _vc_core_util_check_gcf_status()) { + if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) { + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS); + } + } +#endif + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_CONNECTED); + + VOICECALL_RETURN_FALSE_IF_FAIL(callobject_info.call_id != VC_INVALID_CALL_ID); + + index = _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + VOICECALL_RETURN_FALSE_IF_FAIL(index != -1); + + connectednum = _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 0) + _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 1); + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Member Num before adding Connected call to group is :%d", connectednum); + + /*If any previous calls are not cleared after end, clear it here so makes provision to add one more call to the call manager */ + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + + /*Add the conneted call to the active group */ + if (FALSE == _vc_core_cm_add_call_member_togroup(&pcall_agent->call_manager, index)) { + CALL_ENG_DEBUG(ENG_ERR, "Call Object not added to the Group, [PROBLEM] !!!"); + } + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /* Send Connected Event to the Client */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_CONNECTED, callobject_info.call_handle, 0, NULL); + + /* Once the Call is connected, change the InOut state to None */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + + /*Getting AOC PPM Value is delayed to make the current flow faster by adding it to g_idle_add */ + g_idle_add(__call_vc_get_aoc_ppm_value_idle_cb, pcall_agent); + + if (_vc_core_engine_status_get_download_call(pcall_agent) == TRUE) { + g_timeout_add(9000, __call_vc_download_call_timer_cb, pcall_agent); + + _vc_core_util_download_test_call("downloadcall_success"); + } + + return TRUE; +} + +/** + * This function handles call hold event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being held + * @param[in] status TAPI cause incase of hold failed + */ +gboolean _vc_core_tapi_event_handle_call_held_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + call_vc_call_objectinfo_t callobject_info; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /* Verify call handle */ + CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + { + /* Recover and reset related state variable */ + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist"); + assert(0); + } + + if ((callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) && \ + ((pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \ + TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD) || \ + (pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \ + TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL))) { + + /* Terminal Response for Option B */ + /* _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); */ + /* Terminal Response for Option A */ + _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND_WITHOUT_CAUSE); + + } + _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ABORTED, VC_ENDCAUSE_CALL_ENDED, 0, NULL); + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + } + break; + + case VC_INOUT_STATE_INCOME_WAIT_HOLD: + break; + + case VC_INOUT_STATE_NONE: + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_event_handle_call_held_event(fail): Not allowed io_state=%d", pcall_agent->io_state); + break; + } + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + /* Reset the Agent State */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /* Reset the Agent State */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_WAIT_HOLD: + { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_HOLD_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + break; + case CALL_VC_CA_STATE_NORMAL: + default: /*Fall Through */ + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + return FALSE; + break; + } + } else { + int index; + int grp_state = 0; + + /* Get the Group Index */ + index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle); + grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, grp_state); + + switch (pcall_agent->io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + { + /* Change the Group State */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index); + + /* Send Call Held Event to the Client */ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL); + + if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) { + _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED); + } else { + call_vc_handle outgoing_call_handle = VC_TAPI_INVALID_CALLHANDLE; + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG); + outgoing_call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", outgoing_call_handle); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, outgoing_call_handle, 0, NULL); + } + + if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + return TRUE; + } + break; + case VC_INOUT_STATE_INCOME_WAIT_HOLD: + { + int error_code; + + /*Change the Group State*/ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index); + + if (_vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_NORMAL, &error_code)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Answered"); + /*TODO: Inform client to update ui */ + } + if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } + } + break; + case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Hold arrived for Hold and Accept Event, Current IO State:%d", pcall_agent->io_state); + /*Change state to wait_connected */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED); + } + break; + case VC_INOUT_STATE_NONE: + default: /*Fall Through */ + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed io_state=%d", pcall_agent->io_state); + break; + } + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + int held_call_num = 0; + int act_call_num = 0; + + held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager); + act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager); + if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) { + if (CALL_VC_GROUP_STATE_HOLD != grp_state) { + /* Set the State to HOLD and inform client */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, 0, 0, NULL); + } + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP); + } + } + break; + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /*Always reset the agent state as the event for this wait state is arrived */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + /*Swap the state only if the group state of the given call handle is not in hold state already + as this is a hold confirmation event */ + if (CALL_VC_GROUP_STATE_HOLD != grp_state) { + _vc_core_cm_swap_group_state(&pcall_agent->call_manager); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_HOLD: + { + /* Change the Group State */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD); + CALL_ENG_DEBUG(ENG_DEBUG, "Group Index: %d , set to GROUP_STATE_HOLD", index); + + /* Change Call Agent State */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL); + } + break; + case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL: + { + gboolean active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager); + gboolean held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager); + + /*Upon waiting for the success event for hold request, + Other calls might have been released during this time, so the held call need to retrieved */ + if ((active_call == FALSE) && (held_call == TRUE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Unhold call"); + if (_vc_core_tapi_rqst_retrieve_call(pcall_agent) == TRUE) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD); + } + } + } + break; + case CALL_VC_CA_STATE_NORMAL: + default: /*Fall Through */ + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + return FALSE; + break; + } + } + + return TRUE; +} + +/** +* This function handles TAPI call activate/retrieve event +* +* @return Returns TRUE on success and FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] call_handle call handle associated with the call being retrieved +* @param[in] status TAPI cause in case of retrieve failed +*/ +gboolean _vc_core_tapi_event_handle_call_retrieve_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + /*Reset the Agent State*/ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /*Reset the Call Agent State*/ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL); + } + break; + case CALL_VC_CA_STATE_WAIT_UNHOLD: + { + /*Reset the Agent State*/ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_RETREIVE_FAILED, 0, NULL); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + return FALSE; + break; + } + + } else { + int index; + int cur_grp_state = 0; + + /*Get the Group Index and current group status */ + index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle); + cur_grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, cur_grp_state); + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE: + { + int held_call_num = 0; + int act_call_num = 0; + + held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager); + act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager); + if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) { + if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) { + /* Set the State ACTIVE and inform client */ + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, 0, 0, NULL); + } + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP); + } + } + break; + case CALL_VC_CA_STATE_WAIT_SWAP: + { + /* Always reset the agent state as the event for the wait state is arrived */ + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + /*Change the state only when the current state of the given handle is not in ACTIVE state */ + if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) { + _vc_core_cm_swap_group_state(&pcall_agent->call_manager); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL); + } + } + break; + case CALL_VC_CA_STATE_WAIT_UNHOLD: + { + int index; + /* get the member info and chage info */ + index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle); + _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE); + + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + + /*Send Call Retreived Event to Client*/ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, call_handle, 0, NULL); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state); + /*return FALSE if the event is not handled here, because end call memeber will be unnecessarily cleared if returned TRUE */ + return FALSE; + break; + } + + } + + return TRUE; +} + +/** + * This function handles call join/conference event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle assoicated with the call being joined + * @param[in] status tapi cause incase of join failed + */ +gboolean _vc_core_tapi_event_handle_call_join_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Join fail and return.."); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SETUP_CONF_FAILED, 0, NULL); + return TRUE; + } + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + /* get the member info and chage info */ + _vc_core_cm_join_group(&pcall_agent->call_manager); + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SETUP_CONF, 0, 0, NULL); + return TRUE; +} + +/** + * This function handles call split/private call event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle call handle associated with the call being made as private call + * @param[in] status TAPI cause in case of split failed + */ +gboolean _vc_core_tapi_event_handle_call_split_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status) +{ + call_vc_call_objectinfo_t callobject_info; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL); + return FALSE; + } + + if (TAPI_CAUSE_SUCCESS != status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Split fail and return.."); + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL); + return FALSE; + } + + /* get the member info and chage info */ + _vc_core_cm_clear_call_object(&callobject_info); + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + _vc_core_cm_split_group(&pcall_agent->call_manager, call_handle); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SPLIT_CONF, call_handle, 0, NULL); /* Added Call handle */ + return TRUE; +} + +/** +* This function handles the call transfer event +* +* @return Returns TRUE on success and FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] status TAPI cause in case of hold failed +*/ +gboolean _vc_core_tapi_event_handle_call_transfer_event(call_vc_callagent_state_t *pcall_agent, TelCallCause_t status) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Started, status = %d", status); + + if (TAPI_CAUSE_SUCCESS != status) { + int err_cause = 0; + CALL_ENG_DEBUG(ENG_DEBUG, "TapiTransfer Failed"); + if (VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager) + && VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager)) { + err_cause = ERROR_VOICECALL_TRANSFER_FAILED; + + } else { + if (_vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager)) { + err_cause = ERROR_VOICECALL_TRANSFER_FAILED; + } else if (VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pcall_agent->io_state) { + err_cause = ERROR_VOICECALL_TRANSFER_FAILED; + } + } + + _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, err_cause, 0, NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer failed and return.."); + + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer success!"); + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_TRANSFERRED, 0, 0, NULL); + } + /*todo ss: Check Updating flag gbpsh_voicecall_command_transfer*/ + return TRUE; +} + +/** +* This function handles the TAPI connected line indication handle +* +* @return Returns TRUE on success and FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] call_handle TAPI Call Handle associated with connected line indication +* @param[in] connected_number_info Connected Number Details +*/ +gboolean _vc_core_tapi_event_connected_line_ind_handle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallConnectedNumberInfo_t *connected_number_info) +{ + call_vc_call_objectinfo_t callobject_info; + call_vc_handle active_call_handle = VC_TAPI_INVALID_CALLHANDLE; + gboolean bConnectedCall = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ":Number(%s)", connected_number_info->number); + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, " INVALID_CALLHANDLE Error"); + return FALSE; + } + + _vc_core_cm_clear_call_object(&callobject_info); + + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info)) { + if (callobject_info.call_handle != call_handle) { + CALL_ENG_DEBUG(ENG_ERR, "It is not outging call(Call Handle = %d, MO Call Handle =%d)", call_handle, callobject_info.call_handle); + return FALSE; + } + } else { + if (_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call_handle) == -1) { + CALL_ENG_DEBUG(ENG_ERR, "No Active Calls(Call Handle = %d)", call_handle); + return FALSE; + } + + if (active_call_handle != call_handle) { + CALL_ENG_DEBUG(ENG_ERR, "Call Handle Mismatch(Call Handle = %d)", call_handle); + return FALSE; + } + + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + bConnectedCall = TRUE; + } + + switch (connected_number_info->name_mode) { + case TAPI_CALL_NAME_AVAIL: /*if sznumber of the callInfo is null, set Anoymous*/ + + if (0 == strlen(connected_number_info->number)) { + /*Forwarded Call number is unknown*/ + memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber)); + } else { + _vc_core_util_strcpy(callobject_info.connected_telnumber, sizeof(callobject_info.connected_telnumber), connected_number_info->number); + } + + break; + + case TAPI_CALL_NAME_RESTRICTED: + case TAPI_CALL_NAME_AVAIL_RESTRICTED: /*withheld*/ + /*Forwarded Call number is unknown*/ + memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber)); + break; + + case TAPI_CALL_NAME_UNAVAIL: /*Anoymous*/ + default: + /*Forwarded Call number is unknown*/ + memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber)); + break; + } + + /*Set the modified call object to call manager*/ + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + /*Send Event to the Client*/ + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_CONNECT_LINE_IND, callobject_info.call_handle, 0, (void *)callobject_info.connected_telnumber); + + return TRUE; +} + +/** + * This function handles the AOC Event + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle Call Handle + * @param[in] ptapi_aoc_info AOC info associated with the AOC Event + */ +gboolean _vc_core_tapi_event_handle_aoc(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallAocInfo_t *ptapi_aoc_info) +{ + call_vc_call_objectinfo_t callobject_info; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error"); + return FALSE; + } + + /* get the member info and chage info */ + _vc_core_cm_clear_call_object(&callobject_info); + if (FALSE == _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info)) { + CALL_ENG_DEBUG(ENG_ERR, "Call Object Not available"); + return FALSE; + } + + /* Store the call cost TAPI info */ + callobject_info.aoc_ccm = ptapi_aoc_info->CCM; + memcpy((void *)callobject_info.aoc_currency, (const void *)ptapi_aoc_info->szCurrency, VC_AOC_CURRENCY_CODE_LEN_MAX); + + /* Set the modified call object to the Call Mangaer */ + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_AOC, call_handle, 0, &callobject_info); + return TRUE; + +} + +static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata; + _vc_core_tapi_rqst_get_aoc_ppm_value(pcall_agent); + return FALSE; +} + +static gboolean __call_vc_download_call_timer_cb(gpointer pdata) +{ + call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata; + _vc_core_ca_end_all_calls(pcall_agent); + return FALSE; +} + diff --git a/call-engine/core/vc-core-tapi-rqst.c b/call-engine/core/vc-core-tapi-rqst.c new file mode 100755 index 0000000..367a3aa --- /dev/null +++ b/call-engine/core/vc-core-tapi-rqst.c @@ -0,0 +1,1182 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include "vc-core-tapi-rqst.h" +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "vc-core-engine.h" + +/* DTMF Duration */ +#define PSH_SOUND_DTMFTONE_LONG 300 +#define PSH_SOUND_DTMFTONE_SHORT 200 +#define PSH_DTMF_DEFAULT_DURATION 0x01 /*PSH_SOUND_DTMFTONE_LONG*/ + +static int gcall_vc_callmember_count = 0; +static gboolean gcall_vc_callend_wait = FALSE; + +#ifdef _CALL_LONG_DTMF +static char gsz_dtmf_buffer[TAPI_CALL_DIALDIGIT_LEN_MAX + 1]; +static int gdtmf_headindex = 0; +static int gdtmf_tailindex = 0; +static call_vc_dtmf_bufferstate_t gdtmf_buffer_state = CALL_VC_DTMF_BUF_NONE; +static gboolean glong_dtmf_mode = FALSE; +#endif + +/*Local Function Declerations */ +/** +* This function splits the given call from the conference call , if available +* +* @internal +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_agent Pointer to the call agent state +* @param[in] call_handle handle of the call to be splitted +*/ +static gboolean __call_vc_split_member(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle); + + /** + * This function prepares for a call setup + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_prepare_setup_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_call_objectinfo_t callobject_info = { 0 }; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "IO State =%d, Agent State: %d", pcall_agent->io_state, pcall_agent->callagent_state); + + _vc_core_cm_clear_call_object(&callobject_info); + if ((_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) || (strlen(callobject_info.tel_number) == 0) || (pcall_agent->callagent_state != CALL_VC_CA_STATE_NORMAL)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Not Possible: Number: %s", callobject_info.tel_number); + return FALSE; + } else if (_vc_core_cm_isexists_active_call(&pcall_agent->call_manager) && _vc_core_cm_isexists_held_call(&pcall_agent->call_manager)) { + /*Emergency calls should be established, even when active or hold calls exists */ + if (TRUE == callobject_info.bemergency_number) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP); + _vc_core_tapi_rqst_release_all_calls(pcall_agent); + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Active&Held call exist!"); + return FALSE; + } + } else if (_vc_core_cm_isexists_active_call(&pcall_agent->call_manager)) { + CALL_ENG_DEBUG(ENG_DEBUG, "There is active call when trying new call..."); + + /* Change the In Out State accordingly after Hold Call */ + if (_vc_core_tapi_rqst_hold_call(pcall_agent) == FALSE) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + return FALSE; + } else { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_HOLD); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_HOLD); + return TRUE; + } + } else { + if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_prepare_setup_call:Fail to _vc_core_tapi_rqst_setup_call"); + return FALSE; + } else { + /* Wait for the TAPI_EVENT_CALL_ORIG */ + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG); + return TRUE; + } + } + + return FALSE; +} + + /** + * This function sets up an outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_setup_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_DUMMY_CALLHANDLE; + TelCallDial_t dialCallInfo; +/* TelCallCugInfo_t pCugInfo = {0,};*/ + call_vc_call_objectinfo_t callobject_info = { 0 }; +/* TelCallIdentityMode_t identityMode = TAPI_CALL_IDENTITY_DEFAULT;*/ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int ReqId = VC_RQSTID_DEFAULT; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + memset(&dialCallInfo, 0, sizeof(TelCallDial_t)); + + /* Get the Outgoing Call Info */ + _vc_core_cm_clear_call_object(&callobject_info); + if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist!"); + return FALSE; + } + /* set setupCallInfo structure for call setup */ + if (callobject_info.bemergency_number == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency call!"); + dialCallInfo.CallType = TAPI_CALL_TYPE_E911; + /*setupCallInfo.Ecc = callobject_info.ecc_category; + CALL_ENG_DEBUG(ENG_DEBUG,"Emergency call, ecc_category:[%d]!", callobject_info.ecc_category);*/ + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Normal call!"); + dialCallInfo.CallType = TAPI_CALL_TYPE_VOICE; + } + + /*Set the Call Object MO Flag as TRUE */ + callobject_info.mo = TRUE; + + /* cli setting */ + if (_vc_core_util_extract_call_number_without_cli(callobject_info.source_tel_number, dialCallInfo.szNumber, sizeof(dialCallInfo.szNumber)) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No proper number = %s", callobject_info.source_tel_number); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "tapi callnum=[%s]", dialCallInfo.szNumber); + + + /* CUG settings */ +#ifdef _TAPI_CUG_ + dialCallInfo.pCugInfo = &pCugInfo; + if (FALSE == callobject_info.cug_info.bcug_used) { + dialCallInfo.pCugInfo->bCugFlag = FALSE; + } else { + dialCallInfo.pCugInfo->bCugFlag = TRUE; + /*if the index is 0, use pref cug, so no cug index */ + if (0 == callobject_info.cug_info.cug_index) { + dialCallInfo.pCugInfo->Option = TAPI_CALL_CUG_NO_INFO; + dialCallInfo.pCugInfo->Index = 0; + } else { + if ((FALSE == callobject_info.cug_info.bpref_cug) && (FALSE == callobject_info.cug_info.boa_cug)) { + dialCallInfo.pCugInfo->Option = TAPI_CALL_CUG_SUPRESS_OA_AND_CUG; + } else if (FALSE == callobject_info.cug_info.bpref_cug) { + dialCallInfo.pCugInfo->Option = TAPI_CALL_CUG_SUPRESS_PRF_CUG; + } else if (FALSE == callobject_info.cug_info.boa_cug) { + dialCallInfo.pCugInfo->Option = TAPI_CALL_CUG_SUPRESS_OA; + } else { + dialCallInfo.pCugInfo->Option = TAPI_CALL_CUG_NO_INFO; + } + dialCallInfo.pCugInfo->Index = callobject_info.cug_info.cug_index; + } + } +#endif + +#ifdef _CPHS_DEFINED_ + if (TRUE == _vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_ALS)) { + if (callobject_info.setupBy == VC_CALL_SETUP_BY_MAILBOX) { + if (callobject_info.alsLine == VC_CALL_CPHS_ALS_LINE1) { + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE1, &ReqId); + } else if (callobject_info.alsLine == VC_CALL_CPHS_ALS_LINE2) { + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE2, &ReqId); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "callobject_info.alsLine invalid value=%d", callobject_info.alsLine); + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE1, &ReqId); + } + } else { + /*read the line information from the dynamic flags */ + voice_call_cphs_alsline_t als_line; + callobject_info.alsLine = _vc_core_svcall_get_cphs_als_active_line(pcall_agent); + tel_set_call_act_line(callobject_info.alsLine); + _vc_core_cm_set_outgoing_call_info(&pcall_agent->call_manager, &callobject_info); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "ACtive Line Set is TAPI_ACTIVE_LINE1"); + tel_set_call_act_line(TAPI_CALL_ACTIVE_LINE1, &ReqId); + } +#endif + + CALL_ENG_DEBUG(ENG_DEBUG, "call_type = %d", dialCallInfo.CallType); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Type by Source: %d", callobject_info.call_type); + if (VC_CALL_ORIG_TYPE_SAT == callobject_info.call_type) { + /*setupCallInfo.bRequestedBySAT = TRUE;*/ + } else { + /*setupCallInfo.bRequestedBySAT = FALSE;*/ + } + /*CALL_ENG_DEBUG(ENG_DEBUG,"Call Initiated by SAT: %d",setupCallInfo.bRequestedBySAT);*/ + + CALL_ENG_KPI("tel_dial_call start"); + /*This Function originates MO Call set-up, This is asynchronous function */ + + tapi_err = tel_dial_call(pcall_agent->tapi_handle, &dialCallInfo, _vc_core_engine_dial_call_resp_cb, NULL); + CALL_ENG_KPI("tel_dial_call done"); + + CALL_ENG_DEBUG(ENG_DEBUG, "ReqId is = %d", ReqId); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_setup failed: Error Code: %d", tapi_err); + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + /* Set the Call Handle to the CallbObject for future reference */ + callobject_info.call_handle = call_handle; + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_OUTGOING); + callobject_info.call_id = _vc_core_cm_get_new_callId(&pcall_agent->call_manager); + + _vc_core_cm_set_outgoing_call_info(&pcall_agent->call_manager, &callobject_info); + + CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager); + } + return TRUE; +} + + /** + * This function answers the call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] answer_type call answer type #voicecall_answer_type_t + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_answer_call(call_vc_callagent_state_t *pcall_agent, voicecall_answer_type_t answer_type, int *error_code) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + /*Encapsulates Errors and Warnings from TAPI Library */ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(error_code != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if ((VC_INOUT_STATE_INCOME_WAIT_CONNECTED == pcall_agent->io_state) + || (VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED == pcall_agent->io_state) + || (VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED == pcall_agent->io_state)) + /*||(VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL == pcall_agent->io_state))*/ + { + CALL_ENG_DEBUG(ENG_DEBUG, "Answer Call Request Already Made"); + *error_code = ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + return FALSE; + } + + /* Process the answer call request only when the state is in income and it is not ended. + This must be checked as both incoming event and incoming end event from tapi are added to g_idle_add + so any change in state should be noted before accepting the call */ + if ((VC_INOUT_STATE_INCOME_BOX != pcall_agent->io_state) || (VC_INOUT_STATE_INCOME_END == pcall_agent->io_state)) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State not in VC_INOUT_STATE_INCOME_BOX, Current state: %d", pcall_agent->io_state); + *error_code = ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS; + return FALSE; + } + + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + call_handle = _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager); + + CALL_ENG_DEBUG(ENG_DEBUG, "answer_type = %d,Incoming call Handle: %d", answer_type, call_handle); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + *error_code = ERROR_VOICECALL_CALL_INFO_NOT_AVAILABLE; + return FALSE; + } + + switch (answer_type) { + case VC_ANSWER_NORMAL: + { + /*Answer a call by accepting or rejecting a call */ + tapi_err = tel_answer_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_ANSWER_ACCEPT, _vc_core_engine_answer_call_resp_cb, NULL); + if (TAPI_API_SUCCESS == tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED); + } + } + break; + case VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT: + { + /*Answer a call by accepting or rejecting a call */ + tapi_err = tel_answer_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_ANSWER_HOLD_AND_ACCEPT, _vc_core_engine_answer_call_resp_cb, NULL); + if (TAPI_API_SUCCESS == tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_HOLD); + } + } + break; + case VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT: + { + /*Answer a call by accepting or rejecting a call */ + tapi_err = tel_answer_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_ANSWER_REPLACE, _vc_core_engine_answer_call_resp_cb, NULL); + if (TAPI_API_SUCCESS == tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED); + } + } + break; + case VC_ANSWER_RELEASE_HOLD_AND_ACCEPT: + { + /* first end held call and then accept incoming */ + if (TRUE == _vc_core_tapi_rqst_release_held_calls(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_release_held_calls returns TRUE"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + return TRUE; + } + break; +#ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT + case VC_ANSWER_RELEASE_ALL_AND_ACCEPT: + { + /* first (end held call) and then ( release accept and accept ) */ + if (TRUE == _vc_core_tapi_rqst_release_held_calls(pcall_agent)) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_release_held_calls returns TRUE"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + return TRUE; + } + break; +#endif + default: + { + *error_code = ERROR_VOICECALL_NOT_SUPPORTED; + return FALSE; + } + } + + if (TAPI_API_SUCCESS != tapi_err) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + CALL_ENG_DEBUG(ENG_DEBUG, "tel_answer_call failed ,Error Code:%d", tapi_err); + *error_code = ERROR_VOICECALL_ANSWER_FAILED; + CALL_ENG_DEBUG(ENG_DEBUG, "tel_answer_call failed ,Engine Error Code:%d", *error_code); + return FALSE; + } + + return TRUE; +} + +/** + * This function checks and prepares to accept a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_response_call(call_vc_callagent_state_t *pcall_agent) +{ + gboolean active_call, held_call, incoming_call; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager); + held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager); + incoming_call = _vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager); + + if (active_call && held_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Show EndCallChoice Box"); + return TRUE; + } else if (active_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "Case of bActiceCall..."); + /* if there are active call, after hold call can accept mtc */ + /* set the flag and return */ + /*Although TapiHold failed, keep on going( because , when active call is ended, TapiHold failed then ansercall is possible... only when Tapihold succeed, state is changed to WAIT_HOLD*/ + if (_vc_core_tapi_rqst_hold_call(pcall_agent) == TRUE) { + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_HOLD); + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_HOLD); + return TRUE; + } + } else if (incoming_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Call Available"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Calling tapi_call_respond_recall(call_handle = %d, TRUE) ...", call_handle); + + return TRUE; +} + +/** + * This function releases active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_active_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + TapiResult_t tapi_err = TAPI_API_SUCCESS; + int nPos; + int nCount = 0; + call_vc_call_objectinfo_t callobject_info = { 0 }; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, ".."); +#ifdef NEW_TAPI_API + nPos = _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + + if (call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "First Active call_handle = %d", call_handle); +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL) + } else +#endif + { + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ACTIVE_ALL, _vc_core_engine_end_call_resp_cb, NULL) + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "Release All Active Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "pReqId = %d", pReqId); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + nPos = _vc_core_cm_get_next_active_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active calls available"); + return FALSE; + } +#else + gcall_vc_callmember_count = 0; + + nPos = _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + + _vc_core_cm_clear_call_object(&callobject_info); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + if (callobject_info.state == VC_CALL_STATE_CONNECTED) { +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END, _vc_core_engine_end_call_resp_cb, NULL); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_relese Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + nCount++; + } + } + nPos = _vc_core_cm_get_next_active_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + gcall_vc_callmember_count = nCount; + if (gcall_vc_callmember_count > 0) { + gcall_vc_callend_wait = TRUE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "There is no active call to release.."); + return FALSE; + } +#endif +} + +/** + * This function releases held calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_held_calls(call_vc_callagent_state_t *pcall_agent) +{ + int nPos; + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + call_vc_call_objectinfo_t callobject_info = { 0 }; + int nCount = 0; + + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, ".."); +#ifdef NEW_TAPI_API + nPos = _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + + if (call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "First Held call_handle = %d", call_handle); +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL); + } else +#endif + { + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_HOLD_ALL, _vc_core_engine_end_call_resp_cb, NULL); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "Release All Held Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "pReqId = %d", pReqId); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + + nPos = _vc_core_cm_get_next_held_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No Held calls available"); + return FALSE; + } +#else + gcall_vc_callmember_count = 0; + + nPos = _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + + _vc_core_cm_clear_call_object(&callobject_info); + while (nPos != -1) { + _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info); + + if (callobject_info.state == VC_CALL_STATE_CONNECTED) { +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END, _vc_core_engine_end_call_resp_cb, NULL); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_relese Failed call_handle=%d Error Code:%d...", call_handle, tapi_err); + return FALSE; + } else { + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + nCount++; + } + } + nPos = _vc_core_cm_get_next_held_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + gcall_vc_callmember_count = nCount; + if (gcall_vc_callmember_count > 0) { + gcall_vc_callend_wait = TRUE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "There is no held call to release.."); + return FALSE; + } +#endif +} + +/** + * This function releases all calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_all_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d]..", call_handle); + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + } + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) { + CALL_ENG_DEBUG(ENG_DEBUG, "invalid call handle"); + return FALSE; + } + + /*Releases All calls irrespective of call is in hold or active state */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_release_call_all failed: Error _Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function releases the incoming call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_incoming_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + call_handle = _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager); + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) + return FALSE; + +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_release_call_all(&pReqId); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END, _vc_core_engine_end_call_resp_cb, NULL); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_release_call() call_handle=%d Failed, Error Code: %d...", call_handle, tapi_err); + return FALSE; + } + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_REJECTED); + + return TRUE; + +} + +/** + * This function releases outgoing call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_release_outgoing_call(call_vc_callagent_state_t *pcall_agent) +{ + + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + + if (VC_TAPI_INVALID_CALLHANDLE == call_handle) + return FALSE; + +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END, _vc_core_engine_end_call_resp_cb, NULL); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_release_call Failed call_handle=%d Error Code:%d", call_handle, tapi_err); + return FALSE; + } + + _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_CANCELLED); + + return TRUE; +} + +/** + * This function holds a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_hold_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + /*Get the current active call handle and hold it*/ + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR: No active call available"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "calling tapi_call_hold, Current active call = %d...", call_handle); + + /* Hold the call */ + /*Puts the given call on hold */ + tapi_err = tel_hold_call(pcall_agent->tapi_handle, call_handle, _vc_core_engine_hold_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_hold_call() Failed Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function retrieves a call from hold + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_retrieve_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &call_handle); + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Hold Call Error..."); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Cur held call_handle = %d.", call_handle); + /* activate the call */ + /*This function retrieves the held call */ + tapi_err = tel_active_call(pcall_agent->tapi_handle, call_handle, _vc_core_engine_active_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_retrieve_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function swaps held and active calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_swap_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle active_call = VC_TAPI_INVALID_CALLHANDLE, held_call = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call); + if (active_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call..."); + return FALSE; + } + + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_call); + if (held_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_rqst_swap_calls: No Hold Call..."); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Active call = %d, Hold call :%d", active_call, held_call); + + tapi_err = tel_swap_call(pcall_agent->tapi_handle, active_call, held_call, _vc_core_engine_swap_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_swap_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function joins two calls + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_join_calls(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle active_call = VC_TAPI_INVALID_CALLHANDLE, held_call = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call); + if (active_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call"); + return FALSE; + } + + _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_call); + if (held_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Hold Call"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Active call = %d, Hold call :%d", active_call, held_call); + /*This functions joins given two calls */ + tapi_err = tel_join_call(pcall_agent->tapi_handle, active_call, held_call, _vc_core_engine_join_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_join_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function splits the members of a call given its call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] call_handle Call handle for a call the members of which has to be split + */ +gboolean _vc_core_tapi_rqst_private_call(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + + if (TRUE == __call_vc_split_member(pcall_agent, call_handle)) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SPLIT); + return TRUE; + } else { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL); + return FALSE; + } +} + +static gboolean __call_vc_split_member(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + VOICECALL_RETURN_FALSE_IF_FAIL(call_handle != VC_TAPI_INVALID_CALLHANDLE); + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle to be splited : %d", call_handle); + + /*Splits a private call from multiparty call. */ + tapi_err = tel_split_call(pcall_agent->tapi_handle, call_handle, _vc_core_engine_split_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_split_call() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function transfers call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + */ +gboolean _vc_core_tapi_rqst_transfer_call(call_vc_callagent_state_t *pcall_agent) +{ + call_vc_handle active_call = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call); + if (active_call == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call..."); + + active_call = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager); + if (VC_TAPI_INVALID_CALLHANDLE == active_call) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Outgoing Call..."); + return FALSE; + } else + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call exist..!!"); + } + CALL_ENG_DEBUG(ENG_DEBUG, "active_call = %d ", active_call); + + /*An explicit call transfer by connecting the two parties where in one party being + active (active state) and another party being held (held state) */ + tapi_err = tel_transfer_call(pcall_agent->tapi_handle, active_call, _vc_core_engine_transfer_call_resp_cb, NULL); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tel_exe_call_explicit_transfer() Failed, Error Code: %d", tapi_err); + return FALSE; + } + + return TRUE; +} + +/** + * This function sends the given string as dtmf + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent structure + * @param[in] dtmf_string dtmf string + */ +gboolean _vc_core_tapi_rqst_start_dtmf(call_vc_callagent_state_t *pcall_agent, char *dtmf_string) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Start DTMF!! string = %s", dtmf_string); + + _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + + if (call_handle == VC_TAPI_INVALID_CALLHANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Active Call Handle.."); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "string = %s", dtmf_string); + + /* start DTMF */ + /*This function sends one or more DTMF digits during call */ + tapi_err = tel_call_dtmf(pcall_agent->tapi_handle, dtmf_string, _vc_core_engine_dtmf_call_resp_cb, NULL); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_dtmf Failed, Error Code: %d", tapi_err); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, " Ended..."); + + return TRUE; + +} + +#ifdef _SEND_UUSINFO_ +/** + * This function sends user to user information + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle The call handle for which the information has to be sent + * @param[in] pszUusData User data + */ +gboolean call_vc_send_uusinfo(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, char *pszUusData) +{ + TelCallUusInfo_t uusInfo; + int nPos; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + memset(&uusInfo, 0, sizeof(TelCallUusInfo_t)); + + uusInfo.bMoreDataPresent = FALSE; /*more_data_present = FALSE;*/ + uusInfo.ProtocolType = TAPI_CALL_UUS_PROTO_SPECIFIC; + uusInfo.UusType = TAPI_CALL_UUS_1; + uusInfo.UusDataLen = strlen(pszUusData); + + _vc_core_util_strcpy((char *)uusInfo.UusData, sizeof(uusInfo.UusData), pszUusData); + + nPos = _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &call_handle); + while (nPos != -1) { + /*TAPI API not available to send user info */ + /*tapi doen't supprot this api.*/ + /****************************************************************************************** + tapi_err = tapi_call_send_user_info(call_handle, &uusInfo); + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_send_user_info() Failed,Error Code: %d", tapi_err); + return FALSE; + } + ******************************************************************************************/ + nPos = _vc_core_cm_get_next_active_call_handle(&pcall_agent->call_manager, &call_handle, nPos); + } + + return TRUE; +} +#endif + +/** + * This function releases the call associate with the given call handle + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] call_handle handle of the call to be ended + */ +gboolean _vc_core_tapi_rqst_end_call_by_callhandle(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle) +{ + call_vc_call_objectinfo_t callobject_info; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + if (FALSE == _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Object not available for call handle: %d", call_handle); + return FALSE; + + } + + if (VC_CALL_STATE_CONNECTED == callobject_info.state) { +#ifdef SINGLE_CALL_END + if (_vc_core_cm_get_call_member_count(&pcall_agent->call_manager) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "End Single call.."); + + /* Use ReleaseAll api in case single call is ended - this is caused by modem limitation */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END_ALL, _vc_core_engine_end_call_resp_cb, NULL); + } else +#endif + { + /*Releases the call identified by Call Handle irrespective of call is hold or active state */ + tapi_err = tel_end_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_END, _vc_core_engine_end_call_resp_cb, NULL); + } + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, "tapi_call_release Failed Call Handle: %d, Error Code: %d", call_handle, tapi_err); + return FALSE; + } + + _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_RELEASE_WAIT); + _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info); + return TRUE; + } + + return FALSE; +} + +/** + * This function ends a call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + */ +gboolean _vc_core_tapi_rqst_end_call(call_vc_callagent_state_t *pcall_agent) +{ + gboolean ret_val = FALSE; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + switch (pcall_agent->callagent_state) { + case CALL_VC_CA_STATE_NORMAL: + case CALL_VC_CA_STATE_WAIT_HOLD: + case CALL_VC_CA_STATE_WAIT_UNHOLD: + { + + if (_vc_core_cm_isexists_active_call(&pcall_agent->call_manager)) { + ret_val = _vc_core_tapi_rqst_release_active_calls(pcall_agent); + if (TRUE == ret_val) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL); + } + } else if (_vc_core_cm_isexists_held_call(&pcall_agent->call_manager)) { + ret_val = _vc_core_tapi_rqst_release_held_calls(pcall_agent); + if (TRUE == ret_val) { + _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL); + } + } else { + _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager); + } + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Action defined for current call agent state: %d", pcall_agent->callagent_state); + return FALSE; + } + + return TRUE; +} + +/** + * This function rejects a mobile terminated call + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pcall_agent Pointer to the call agent state + * @param[in] budub TRUE - User Determined User Busy, FALSE - otherwise + * @param[out] error_code Error code + */ +gboolean _vc_core_tapi_rqst_reject_mt_call(call_vc_callagent_state_t *pcall_agent, gboolean budub, int *error_code) +{ + call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE; + TapiResult_t tapi_err = TAPI_API_SUCCESS; + + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "budub = %d", budub); + if (_vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call does not exist"); + *error_code = ERROR_VOICECALL_NO_INCOMING_CALL_EXIST; + return FALSE; + } + + if (pcall_agent->io_state == VC_INOUT_STATE_INCOME_WAIT_RELEASE) { + CALL_ENG_DEBUG(ENG_DEBUG, " io_state is already VC_INOUT_STATE_INCOME_WAIT_RELEASE"); + /*return TRUE since call release has been already done and it is waiting for the release*/ + return TRUE; + } + + if (pcall_agent->io_state == VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "return FALSE io_state=%d", pcall_agent->io_state); + *error_code = ERROR_VOICECALL_ENGINE_STATE_NONE; + return FALSE; + } + + call_handle = _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager); + + if (TRUE == budub) { + /*Reject the Call for User Busy Scenario */ + tapi_err = tel_answer_call(pcall_agent->tapi_handle, call_handle, TAPI_CALL_ANSWER_REJECT, _vc_core_engine_answer_call_resp_cb, NULL); + + if (TAPI_API_SUCCESS != tapi_err) { + CALL_ENG_DEBUG(ENG_DEBUG, " tel_answer_call failed: %d", tapi_err); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + *error_code = ERROR_VOICECALL_TAPI_ERROR; + return FALSE; + } + } else { + /*Release the call to end it normally */ + if (FALSE == _vc_core_tapi_rqst_release_incoming_call(pcall_agent)) { + CALL_ENG_DEBUG(ENG_ERR, "Release Incoming Call Failed"); + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE); + *error_code = ERROR_VOICECALL_TAPI_ERROR; + return FALSE; + } + } + + _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_RELEASE); + return TRUE; +} + +gboolean _vc_core_tapi_rqst_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent) +{ + TapiResult_t tapi_error = TAPI_API_SUCCESS; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (pcall_agent->aoc_ppm == VC_INVALID_PPM) { + tapi_error = tel_get_ss_aoc_info(pcall_agent->tapi_handle, TAPI_SS_AOC_TYPE_PUC, _vc_core_engine_get_aoc_info_cb, NULL); + + if (tapi_error != TAPI_API_SUCCESS) { + CALL_ENG_DEBUG(ENG_ERR, "TAPI Error: %x", tapi_error); + return FALSE; + } + } + return TRUE; +} + diff --git a/call-engine/core/vc-core-util.c b/call-engine/core/vc-core-util.c new file mode 100755 index 0000000..c338286 --- /dev/null +++ b/call-engine/core/vc-core-util.c @@ -0,0 +1,761 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "vc-core-engine.h" +#include "vc-core-util.h" +#include "vc-core-callagent.h" +#include "vc-core-callmanager.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#define CALL_VODAFONEUK_CLI_SHOW_ID "1470" +#define CALL_COMMON_CLI_SHOW_ID "*31#" +#define CALL_COMMON_CLI_HIDE_ID "#31#" + +#define ASCII_0 48 +#define ASCII_9 57 +#define ASCII_A 65 +#define ASCII_D 68 +#define ASCII_STAR 42 +#define ASCII_HASH 35 +#define ASCII_P 80 +#define ASCII_p 112 +#define ASCII_COMMA 44 +#define ASCII_W 87 +#define ASCII_w 119 +#define ASCII_SEMI_COLON 59 + +#define EIGTH_BIT 0x80 +#define SEVENTH_BIT 0x40 +#define SIXTH_BIT 0x20 +#define FIFTH_BIT 0x10 +#define FOURTH_BIT 0x08 +#define THIRD_BIT 0x04 +#define SECOND_BIT 0x02 +#define FIRST_BIT 0x01 + +#define CALLVC_MIN(x, y) ((x) <= (y) ? (x) : (y)) +#define ISUSSDDIGIT(X) ((X >= '2') && (X <= '9')) +#define ISDIGIT(X) ((X >= '0') && (X <= '9')) +#define ISSSDIGITINCALL(X) ((X >= '7') && (X <= '9')) +#define IS1CHARUSSDDIGIT(X) ((X >= '1') && (X <= '9')) + +#define DATE_FORMAT_1 "EEMMMddyyyy" /* Thu Aug 23 2001 */ +#define TIME_12_TYPE "hma" /* 7:58 AM */ +#define TIME_24_TYPE "HHmm" /* 19:58 */ + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] src Telehone number from which call number needd to be parsed + * @param[out] dst Pointer to the buffer to store the parsed number + */ +gboolean _vc_core_util_remove_invalid_chars(const char *src, char *dst) +{ + VOICECALL_RETURN_FALSE_IF_FAIL((src != NULL)); + VOICECALL_RETURN_FALSE_IF_FAIL((dst != NULL)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Source phone number - %s", src); + int i = 0; + int j = 0; + int nSrc = 0; + + nSrc = strlen(src); + CALL_ENG_DEBUG(ENG_DEBUG, "source String len - %d", nSrc); + + for (i = 0; i < nSrc; ++i) { + switch (src[i]) { + case '(': + { + if (src[i + 1] == '0') + ++i; + break; + } + + case ')': + case '-': + case ' ': + case '/': + { + break; + } + + default: + { + dst[j++] = src[i]; + break; + } + } + if (j > 40) { + break; + } + } + + dst[j] = '\0'; + CALL_ENG_DEBUG(ENG_DEBUG, "Destination phone number - %s", dst); + + return TRUE; +} + +/** + * This function publishes the event of a given publish type + * + * @return Returns TRUE on success and FALSE on failure + * @param[in] pszTelNumber Telehone number from which call number nned to be extracted + * @param[out] pBuffer Pointer to the buffer to store the extracted number + * @param[in] nBufSize Size of input buffer + */ +gboolean _vc_core_util_extract_call_number(const char *pszTelNumber, char *pBuffer, const int nBufSize) +{ + char *pszNum = NULL; + char *pst = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL((pBuffer != NULL)); + VOICECALL_RETURN_FALSE_IF_FAIL((pszTelNumber != NULL)); + + CALL_ENG_DEBUG(ENG_DEBUG, "number = %s..", pszTelNumber); + + memset(pBuffer, 0, nBufSize); + + if ((strncmp(pszTelNumber, CALL_COMMON_CLI_SHOW_ID, 4) == 0) || (strncmp(pszTelNumber, CALL_COMMON_CLI_HIDE_ID, 4) == 0)) + pszNum = (char *)pszTelNumber + 4; + else + pszNum = (char *)pszTelNumber; + + pst = pszNum; + while (*pst != '\0') { + if (*pst == 'P' || *pst == 'p' || *pst == ',' || *pst == 'W' || *pst == 'w' || *pst == ';') { + break; + } + pst++; + } + + if (strlen(pst) == 0) { + if (strlen(pszNum) == 0) + return FALSE; + _vc_core_util_strcpy(pBuffer, nBufSize, pszNum); + } else { + if (pst == pszNum) + return FALSE; + + _vc_core_util_strcpy(pBuffer, min((((int)pst - (int)pszNum) + 1), (nBufSize)), pszNum); + } + return TRUE; +} + +gboolean _vc_core_util_extract_call_number_without_cli(const char *pszTelNumber, char *pBuffer, const int nBufSize) +{ + char *pszNum = NULL; + char *pst = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL((pszTelNumber != NULL)); + VOICECALL_RETURN_FALSE_IF_FAIL((pBuffer != NULL)); + + CALL_ENG_DEBUG(ENG_DEBUG, "number = %s..", pszTelNumber); + + memset(pBuffer, 0, nBufSize); + pszNum = (char *)pszTelNumber; + pst = pszNum; + while (*pst != '\0') { + if (*pst == 'P' || *pst == 'p' || *pst == ',' || *pst == 'W' || *pst == 'w' || *pst == ';') { + break; + } + pst++; + } + if (strlen(pst) == 0) { + if (strlen(pszNum) == 0) + return FALSE; + _vc_core_util_strcpy(pBuffer, nBufSize, pszNum); + } else { + if (pst == pszNum) + return FALSE; + + _vc_core_util_strcpy(pBuffer, min((((int)pst - (int)pszNum) + 1), (nBufSize)), pszNum); + } + return TRUE; +} + +/** +* This function checks the validity of the given string for SS string + * +* @return Returns SS_SI_FORMAT_INVALID - if the string is invalid ss string, SS_SI_FORMAT_VALID - if valid +* @param[in] pinput_string string to be verified + */ +call_vc_ss_si_format _vc_core_util_check_si_format(const char *pinput_string) +{ + int index = 0, pos = 1, cnt = 0; + VOICECALL_RETURN_VALUE_IF_FAIL((pinput_string != NULL), SS_SI_FORMAT_INVALID); + + if ((pinput_string[1] == '*') || (pinput_string[1] == '#')) + pos = 2; + + index = pos; + + while (cnt < 1) { + if (pinput_string[index++] == '*') + cnt++; + + if (index >= strlen(pinput_string + pos)) { + CALL_ENG_DEBUG(ENG_DEBUG, "valid ss format..."); + return SS_SI_FORMAT_VALID; + } + } + + return SS_SI_FORMAT_VALID; +} + +gboolean _vc_core_util_get_mcc(unsigned long *mcc) +{ + int ret = 0; + int plmn_value = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL((mcc != NULL)); + + ret = vconf_get_int(VCONFKEY_TELEPHONY_PLMN, &plmn_value); + if (0 == ret) { + char mcc_value[4]; + char plmn_string[10]; + + CALL_ENG_DEBUG(ENG_DEBUG, "plmn_value = [%d]", plmn_value); + + memset(plmn_string, 0, sizeof(plmn_string)); + memset(mcc_value, 0, sizeof(mcc_value)); + + snprintf(plmn_string, 10, "%d", plmn_value); + + /*First 3 digits of plmn value constitutes the mcc value */ + _vc_core_util_strcpy(mcc_value, 4, plmn_string); + *mcc = (unsigned long)atoi(mcc_value); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + *mcc = CALL_NETWORK_MCC_UK; + } + CALL_ENG_DEBUG(ENG_DEBUG, "mcc = %ld", *mcc); + + return TRUE; +} + +gboolean _vc_core_util_get_mnc(unsigned long *mnc) +{ + int ret = 0; + int plmn_value = 0; + + VOICECALL_RETURN_FALSE_IF_FAIL((mnc != NULL)); + + ret = vconf_get_int(VCONFKEY_TELEPHONY_PLMN, &plmn_value); + if (0 == ret) { + char mnc_value[4]; + char plmn_string[10]; + + CALL_ENG_DEBUG(ENG_DEBUG, "plmn_value = [%d]", plmn_value); + + memset(plmn_string, 0, sizeof(plmn_string)); + memset(mnc_value, 0, sizeof(mnc_value)); + + snprintf(plmn_string, 10, "%d", plmn_value); + + /* 4~6th digits of plmn value constitutes the mnc value */ + _vc_core_util_strcpy(mnc_value, 4, &plmn_string[3]); + *mnc = (unsigned long)atoi(mnc_value); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + *mnc = CALL_NETWORK_MNC_01; + } + CALL_ENG_DEBUG(ENG_DEBUG, "mnc = %ld", *mnc); + + return TRUE; +} + +/** + * This function checks whether the given number is SS string or not + * + * @return TRUE if the number is SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_ss_string(const char *pNumber) +{ + int len; + VOICECALL_RETURN_FALSE_IF_FAIL(pNumber != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "pNumber(%s)", pNumber); + + len = strlen(pNumber); + + if (len > 3) { + if (pNumber[len - 1] == '#') { + if (pNumber[0] == '*' || pNumber[0] == '#') { + return TRUE; + } + } else { + /* + * '*31#', '#31#' -> launch CISS + * '*31#nn..', '#31#nn...' -> launch Voice-call + */ + if (strncmp(pNumber, CALL_COMMON_CLI_SHOW_ID, 4) == 0 || strncmp(pNumber, CALL_COMMON_CLI_HIDE_ID, 4) == 0) { + if (len > 4) + return FALSE; + return TRUE; + } + } + } + + if ((len == 2) && (ISUSSDDIGIT(pNumber[0]) && ISDIGIT(pNumber[1]))) { + CALL_ENG_DEBUG(ENG_DEBUG, "USSD string"); + return TRUE; + } + + if ((len == 1) && (IS1CHARUSSDDIGIT(pNumber[0]))) { + CALL_ENG_DEBUG(ENG_DEBUG, "1 character USSD string"); + return TRUE; + } + + return FALSE; +} + +/** + * This function checks whether the given number is in CALL SS string or not + * + * @return TRUE if the number is in call SS string, FALSE otherwise + * @param[in] pNumber number to be verified + */ +gboolean _vc_core_util_check_incall_ss_string(const char *number) +{ + int len; + int num_int; + VOICECALL_RETURN_FALSE_IF_FAIL(number != NULL); + CALL_ENG_DEBUG(ENG_DEBUG, "number(%s)", number); + + len = strlen(number); + if (len > 2 || len < 1) + return FALSE; + + if (number[0] > '6') + return FALSE; + + if (len == 1) { + /* 0 ~ 4 */ + if (number[0] >= '0' && number[0] <= '4') + return TRUE; + } else { + /* 11 ~ 17, 21 ~ 27 */ + num_int = atoi(number); + + if (num_int >= 11 && num_int <= 17) + return TRUE; + if (num_int >= 21 && num_int <= 27) + return TRUE; + } + + return FALSE; +} + +/** +* This function extracts the dtmf number from the given telephone number +* +* @param[in] tel_number source telephone number +* @param[out] dtmf_number extracted dtmf number +* @param[out] dtmf_buf_len size of dtmf number buffer +*/ +gboolean _vc_core_util_extract_dtmf_number(const char *tel_number, char *dtmf_number, const int dtmf_buf_len) +{ + char *pst; + VOICECALL_RETURN_FALSE_IF_FAIL(tel_number != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(dtmf_number != NULL); + + memset(dtmf_number, 0, dtmf_buf_len); + + pst = (char *)tel_number; + while (*pst != '\0') { +#ifdef WDIAL_SEND_DTMF + if (*pst == 'P' || *pst == 'p' || *pst == ',' || *pst == 'W' || *pst == 'w' || *pst == ';') { +#else + if (*pst == 'P' || *pst == 'p' || *pst == ',') { +#endif + break; + } + pst++; + } + + if (strlen(pst) == 0) { + return FALSE; + } else { + if (pst == tel_number) + return FALSE; + strncpy(dtmf_number, pst, CALLVC_MIN((int)strlen(pst), (dtmf_buf_len-1))); + } + return TRUE; +} + +/** +* This function checks whether the given number ia a valid dtmf number or not +* +* @return TRUE if the number can be used for sending dtmf , FALSE otherwise +* @param[in] pnumber number to be verified +*/ +gboolean _vc_core_util_isvalid_dtmf_number(char *pnumber) +{ + int len = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pnumber != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_util_isvalid_dtmf_number.. entering"); + + if (NULL == pnumber || (len = strlen(pnumber)) <= 0) { + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Length = %d", len); + while (len > 0) { + if (IS_DIGIT(pnumber[len - 1]) || (pnumber[len - 1] >= ASCII_A && pnumber[len - 1] <= ASCII_D) || (pnumber[len - 1] == ASCII_STAR || pnumber[len - 1] == ASCII_HASH)) { + return TRUE; + } + len--; + } + return FALSE; +} + +/** +* This function checks whether the given number ia a valid dtmf number or not +* +* @return TRUE if the number can be used for sending dtmf , FALSE otherwise +* @param[in] pnumber number to be verified +*/ +gboolean _vc_core_util_isvalid_full_dtmf_number(char *pnumber) +{ + int len = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(pnumber != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_util_isvalid_dtmf_number.. entering"); + + if (NULL == pnumber || (len = strlen(pnumber)) <= 0) { + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Length = %d", len); + while (len > 0) { + if (!(IS_DIGIT(pnumber[len - 1]) || (pnumber[len - 1] >= ASCII_A && pnumber[len - 1] <= ASCII_D) || \ + (pnumber[len - 1] == ASCII_STAR || pnumber[len - 1] == ASCII_HASH) || \ + (pnumber[len - 1] == ASCII_P || pnumber[len - 1] == ASCII_p || pnumber[len - 1] == ASCII_COMMA) || \ + (pnumber[len - 1] == ASCII_W || pnumber[len - 1] == ASCII_w || pnumber[len - 1] == ASCII_SEMI_COLON))) { + CALL_ENG_DEBUG(ENG_DEBUG, "invalid character encountered..."); + return FALSE; + } + len--; + } + CALL_ENG_DEBUG(ENG_DEBUG, "Fully valid DTMF string.."); + return TRUE; +} + +/** +* This function checks the validity of the given telephone number +* +* @return TRUE if the given number is valid telephone number, FALSE otherwise +* @param[in] ptel_number telephone number to be verified +*/ +gboolean _vc_core_util_isvalid_telephone_number(char *ptel_number) +{ + int len = 0; + int i = 0; + VOICECALL_RETURN_FALSE_IF_FAIL(ptel_number != NULL); + + if (ptel_number != NULL) { + char call_number[VC_PHONE_NUMBER_LENGTH_MAX] = { 0, }; + + /* Function Test SLP-Call-0250 fixed. + * If user Input "*" or "#" and then make a call, + * the device should alert you that the phone number is incorrect. + */ + /*if ((strlen(ptel_number) == 1) && ((strcmp(ptel_number, "*") == 0) ||(strcmp(ptel_number, "#") == 0))) */ + /* 1 digit number -> wrong number popup */ + if (strlen(ptel_number) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "It is wrong number.(1 digit number)"); + return FALSE; + } + /*end */ + + /*To avoid checking *31# and #31# */ + if (_vc_core_util_extract_call_number(ptel_number, call_number, sizeof(call_number)) == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "No proper number = %s", ptel_number); + return FALSE; + } + + len = strlen(call_number); + for (i = 0; i < len; i++) { + /*'+' should be allowed only as first digit of the dialling number */ + if (i >= 1 && call_number[i] == '+') { + return FALSE; + } + + if (!IS_DIGIT(call_number[i]) && call_number[i] != '+' && call_number[i] != ASCII_STAR && call_number[i] != ASCII_HASH && call_number[i] != 'P' && call_number[i] != 'p' && call_number[i] != ',') { + return FALSE; + } + } + return TRUE; + } + return FALSE; +} + +gboolean _vc_core_util_check_gcf_status(void) +{ + gboolean bgcf_status = FALSE; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_ADMIN_GCF_TEST, &bgcf_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bgcf_status = [%d]", bgcf_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + return bgcf_status; +} + +gboolean _vc_core_util_check_zuhause_status(void) +{ + int isZuhauseArea = 0; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_TELEPHONY_ZONE_ZUHAUSE, &isZuhauseArea); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "isZuhauseArea = [%d]", isZuhauseArea); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + if (isZuhauseArea == 0) { + /*Not in a zuhause area.. */ + return FALSE; + } else { + /*in a zuhause area.. */ + return TRUE; + } +} + +/*********************************************************************/ +gboolean _vc_core_util_set_call_status(int call_status) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "call_status = [%d]", call_status); + + if (vconf_set_int(VCONFKEY_CALL_STATE, call_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_set_int failed."); + return FALSE; + } + return TRUE; +} + +gboolean _vc_core_util_set_call_volume(int vol_level) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "vol_level = [%d]", vol_level); + + if (vconf_set_int(VCONFKEY_CALL_VOLUME_LEVEL, vol_level)) { + CALL_ENG_DEBUG(ENG_WARN, "vconf_set_int failed."); + return FALSE; + } + return TRUE; +} + +int _vc_core_util_get_call_volume(void) +{ + int vol_level = 0; + + if (vconf_get_int(VCONFKEY_CALL_VOLUME_LEVEL, &vol_level)) { + CALL_ENG_DEBUG(ENG_WARN, "vconf_set_int failed."); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "vol_level(%d)", vol_level); + return vol_level; +} + +gboolean _vc_core_util_check_video_call_status(void) +{ + int call_status = 0; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_CALL_STATE, &call_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "call_status = [%d]", call_status); + if (call_status == VCONFKEY_CALL_VIDEO_CONNECTING || call_status == VCONFKEY_CALL_VIDEO_ACTIVE) { + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + return FALSE; +} + +gboolean _vc_core_util_get_SAP_status() +{ + int bt_status = VCONFKEY_BT_DEVICE_NONE; + gboolean ret = FALSE; + + ret = vconf_get_int(VCONFKEY_BT_DEVICE, &bt_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_status = [0x%x]", bt_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + if (bt_status == VCONFKEY_BT_DEVICE_SAP_CONNECTED) { + return TRUE; + } else { + return FALSE; + } +} + +void _vc_core_util_get_cug_info(voicecall_setup_info_t *psetupcall_info) +{ + VOICECALL_RETURN_IF_FAIL(psetupcall_info != NULL); + voicecall_cug_info_t *pcug_info = NULL; + /*int error_code = -1; */ + + pcug_info = (voicecall_cug_info_t *) &psetupcall_info->cug_info; + + /*Get the CUG Information from the Settings */ + memset(&psetupcall_info->cug_info, 0, sizeof(voicecall_cug_info_t)); + pcug_info->bcug_used = 0; +} + +void _vc_core_util_get_identity_mode(voicecall_setup_info_t *psetupcall_info) +{ + int id_mode = 0; /*0 - default, 1-show, 2-hide */ + int ret = -1; + VOICECALL_RETURN_IF_FAIL(psetupcall_info != NULL); + + ret = vconf_get_int(VCONFKEY_CISSAPPL_SHOW_MY_NUMBER_INT, &id_mode); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "id_mode = [%d]", id_mode); + psetupcall_info->identity_mode = id_mode; + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + psetupcall_info->identity_mode = 0; + } +} + +gboolean _vc_core_util_is_pwlock(void) +{ + int pwlock_state = -1; + + if (vconf_get_int(VCONFKEY_PWLOCK_STATE, &pwlock_state)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed."); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "pwlock_state:[%d]", pwlock_state); + if ((pwlock_state == VCONFKEY_PWLOCK_BOOTING_LOCK) || (pwlock_state == VCONFKEY_PWLOCK_RUNNING_LOCK)) { + return TRUE; + } else { + return FALSE; + } +} + +gboolean _vc_core_util_get_nw_status(int *network_status) +{ + int svc_type = -1; + gboolean ret = FALSE; + VOICECALL_RETURN_FALSE_IF_FAIL(network_status != NULL); + + ret = vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &svc_type); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "svc_type = [%d]", svc_type); + *network_status = svc_type; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + return FALSE; + } +} + +/* Function Definitions */ +/** + * This function copies the source string to the target string according to the size of the destination string + * + * @return Returns newly copied string on success or NULL on failure + * @param[out] pbuffer Target Buffer + * @param[in] buf_count Size of Target Buffer + * @param[in] pstring Source String + */ +gboolean _vc_core_util_strcpy(char *pbuffer, int buf_count, const char *pstring) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pbuffer != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pstring != NULL); + + if (buf_count == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "buf_count is zero!!"); + return FALSE; + } +#ifdef _NO_USE_STRCPY_ + if ((buf_count - 1) >= (int)strlen(pstring)) { + strcpy(pbuffer, pstring); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "pbuffer size is smaller than pstring!!"); + strncpy(pbuffer, pstring, (buf_count - 1)); + pbuffer[buf_count - 1] = '\0'; + } +#else + strncpy(pbuffer, pstring, (buf_count - 1)); + pbuffer[buf_count - 1] = '\0'; +#endif + return TRUE; +} + +gboolean _vc_core_util_phonelock_status(void) +{ + gboolean b_phonelock = FALSE; + if (!vconf_get_bool(VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL, &b_phonelock)) { + CALL_ENG_DEBUG(ENG_DEBUG, "b_phonelock:[%d]", b_phonelock); + return b_phonelock; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "get VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL failed.."); + return FALSE; + } +} + +void _vc_core_util_download_test_call(char *result) +{ + int ret; + FILE *d_call_test = NULL; + char string[20] = { }; + + VOICECALL_RETURN_IF_FAIL(result != NULL); + + /*create string */ + snprintf(string, sizeof(string), "/tmp/%s", result); + + d_call_test = fopen(string, "w"); + if (d_call_test == NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "FAIL:fopen(%s)", string); + return; + } + /*ret = fwrite("\0", sizeof(char), 1, d_call_test); */ + /*CALL_ENG_DEBUG(ENG_DEBUG,"Result:fwrite(%d)", ret); */ + + ret = fclose(d_call_test); + CALL_ENG_DEBUG(ENG_DEBUG, "Result:fwrite(%d)", ret); + if (ret != 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "FAIL:fclose"); + return; + } + +} + diff --git a/call-engine/etc/rc.d/init.d/voice-calld b/call-engine/etc/rc.d/init.d/voice-calld new file mode 100755 index 0000000..1eb7128 --- /dev/null +++ b/call-engine/etc/rc.d/init.d/voice-calld @@ -0,0 +1,7 @@ +#!/bin/sh +# +# Script for voice call daemon during booting time +# +if [ -x /usr/bin/voice-calld ]; then + /usr/bin/voice-calld & +fi diff --git a/call-engine/etc/rc.d/rc3.d/S60voice-calld b/call-engine/etc/rc.d/rc3.d/S60voice-calld new file mode 100755 index 0000000..1eb7128 --- /dev/null +++ b/call-engine/etc/rc.d/rc3.d/S60voice-calld @@ -0,0 +1,7 @@ +#!/bin/sh +# +# Script for voice call daemon during booting time +# +if [ -x /usr/bin/voice-calld ]; then + /usr/bin/voice-calld & +fi diff --git a/call-engine/include/voice-call-bt.h b/call-engine/include/voice-call-bt.h new file mode 100755 index 0000000..32d1058 --- /dev/null +++ b/call-engine/include/voice-call-bt.h @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_BT_H_ +#define _VOICE_CALL_BT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "voice-call-core.h" +#include "vconf.h" +#include "vconf-keys.h" +#include "bluetooth.h" + +/* Enum describes list of message for BT */ +typedef enum { + VC_BT_AG_RES_CALL_ORIG, /**< Phone originated a call. */ + VC_BT_AG_RES_CALL_INCOM, /**< Incoming call notification to Headset */ + VC_BT_AG_RES_CALL_CONNECT, /**< Call connected */ + VC_BT_AG_RES_CALL_END, /**< MO or MT call ended */ + VC_BT_AG_RES_CALL_HOLD, /**< Call on Hold */ + VC_BT_AG_RES_CALL_RETRIEVE, /**< Held call retrieved */ + VC_BT_AG_RES_CALL_JOINED, /**< Held call joined */ + VC_BT_AG_RES_SPK_GAIN, /**< Speaker volume changed */ + VC_BT_AG_RES_MIC_GAIN, /**< Microphone gain changed */ + VC_BT_AG_RES_CALL_REMOTE_RINGING, /**< Remote party call alerted */ + VC_BT_AG_RES_SWITCH_TO_HEADSET,/**< Switch to HS */ + VC_BT_AG_RES_SWITCH_TO_PHONE, /**< Switch to Phone */ + VC_BT_AG_RES_CALL_STATUS, /**< For call status information to headset */ + VC_BT_AG_RES_HEADSET_VOL, /**< Request Current Headset Volume level from Call */ + VC_BT_AG_RES_CALL_SWAPPED +} vc_bt_ag_res_t; + +/* Enum describes the AG request commands */ +typedef enum { + VC_BT_AG_REQ_CONNECT, /**< Headset Connected */ + VC_BT_AG_REQ_CONNECT_ERROR, /**< Headset Connection Failed */ + VC_BT_AG_REQ_DISCONNECT, /**< Headset Disconnected */ + VC_BT_AG_REQ_SPK_GAIN, /**< Speaker volume changed */ + VC_BT_AG_REQ_MIC_GAIN, /**< Microphone gain changed */ + VC_BT_AG_REQ_CALL_ACCEPTED, /**< Call accepted */ + VC_BT_AG_REQ_CALL_REJECT, /**< Incoming call rejected */ + VC_BT_AG_REQ_CALL_END, /**< Call Ended*/ + VC_BT_AG_REQ_CALL_HOLD, /**< Put Call on Hold */ + VC_BT_AG_REQ_CALL_RETRIEVE, /**< Retrieve held call */ + VC_BT_AG_REQ_BUTTON_PRESSED, /**< Headset Button was pressed */ + VC_BT_AG_REQ_CALL_REDIAL, /**< Handsfree requested call redial */ + VC_BT_AG_REQ_CALL_2_SEND, /**< Places all active calls on hold and accepts the other call */ + VC_BT_AG_REQ_CALL_3_SEND, /**< Adds a held call to the conversation */ + VC_BT_AG_REQ_CALL_0_SEND, /**< Releases all held calls or sets User Determined User Busy for a waiting call */ + VC_BT_AG_REQ_CALL_1_SEND, /**< Releases all active calls and accepts the other call */ + VC_BT_AG_REQ_HEADSET_VOL, /**< Send current Headset Volume level to Call */ + VC_BT_AG_REQ_SWITCH_TO_HEADSET,/**< Switch to HS */ + VC_BT_AG_REQ_SWITCH_TO_PHONE, /**< Switch to Phone */ + VC_BT_AG_REQ_DTMF, /**< Send DTMF tone */ + VC_BT_AG_REQ_CALL_STATUS /**< Ask current call status */ +} connectivity_bt_ag_req_t; + +typedef enum { + VC_BT_AG_RES_AUDIO_CONNECTION_ERROR, + VC_BT_AG_RES_AUDIO_DISCONNECTION_ERROR, +} vc_bt_ag_resp_status_t; + +typedef struct { + int param1; + int param2; + int param3; + char param4[VC_DISPLAY_NAME_LENGTH_MAX]; +} vc_bt_ag_param_info_t; + +typedef struct { + unsigned int call_id; /**< Call identification */ + bt_ag_call_state_e call_status; /**< Status of the call */ +} vc_bt_ag_call_status_info_t; + +gboolean _vc_bt_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset, gboolean bsend_bt_response); + +/** + * This function sends event to BT for switch to Headset/Phone + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bheadset TRUE if sound type is Audio Headset, FALSE otherwise + */ +void _vc_bt_request_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset); + +/** + * This function handles the bluetooth notifications sent by blue tooth application + * + * @return TRUE -if event is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] pbt_info bt notification details + */ +gboolean _vc_bt_handle_bt_events(call_vc_core_state_t *pcall_core, vc_bt_ag_param_info_t * pbt_info); + +/** + * This function sends response back to the bt application + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_event bluetooth event type + * @param[in] param1 user param1 + * @param[in] param2 user param2 + */ +void _vc_bt_send_response_to_bt(call_vc_core_state_t *pcall_core, int bt_event, int param1, gpointer param2); + +/** + * This function register bt callback. + * + * @return TRUE if bt status is registered, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _vc_bt_status_init(call_vc_core_state_t *pcall_core); + +/** + * This function de-register bt callback. + * + * @return TRUE if bt status is registered, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _vc_bt_status_deinit(call_vc_core_state_t *pcall_core); + +/** + * This function gets the blue tooth active status from the phone status server + * + * @return TRUE - if BT is enabled, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_bt_status(void); + +/** + * This function gets the BT inband ringtone activate settings + * + * @return TRUE - if BT inband ringtone activate settings is ON, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_inband_ringtone_active(void); + +/** + * This function handles the notifications sent by phone status server + * + * @return TRUE -if notification is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_status Blue tooth status + */ +gboolean _vc_bt_handle_phonestatus_bt_events(keynode_t *node, call_vc_core_state_t *pcall_core); + +/** + * This function retreives volume level of headset + * + * @param[in] pcall_core Handle to voicecall core + */ +void _vc_bt_get_headset_volume(call_vc_core_state_t *pcall_core); + +/** + * This function returns the BT connection status + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _vc_bt_is_bt_connected(call_vc_core_state_t *pcall_core); + +/** + * This function returns the BT SCO status.(Synchronized Connection Oriented link) + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_get_bt_sco_status(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/call-engine/include/voice-call-core.h b/call-engine/include/voice-call-core.h new file mode 100755 index 0000000..b8b7542 --- /dev/null +++ b/call-engine/include/voice-call-core.h @@ -0,0 +1,653 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VOICE_CALL_CORE_H_ +#define _VOICE_CALL_CORE_H_ + +#ifdef __cplusplus +extern "C" { + +#endif + +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "voice-call-sound.h" +#include "voice-call-engine.h" + +typedef enum _call_vc_core_flags_t { + CALL_VC_CORE_FLAG_NONE = 0x00000000, /**< NONE state */ + CALL_VC_CORE_FLAG_SOS_CALL_ONLY = 0x00000001, /**< SET - Emergency Calls Only, UNSET - All Calls Allowed */ + CALL_VC_CORE_FLAG_MSG_SVC_INIT = 0x00000002, /**< SET - Messenger service intialization done, UNSET - otherwise */ + CALL_VC_CORE_FLAG_FDN_SVC_ENABLED = 0x00000004, /**< SET - FDN enabled, UNSET - otherwise */ + CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT = 0x00000008, /**< SET - volume change request from BT, UNSET - otherwise */ + CALL_VC_CORE_FLAG_BT_EVENT_WAITING = 0x00000010, /**< SET - Waiting for Switch Headset/Phone Event fom Bluetooth, UNSET - otherwise */ + CALL_VC_CORE_FLAG_IT_WAS_LOCKED = 0x00000020, /**< SET - It was locked when voice call app luanched, UNSET - otherwise */ + CALL_VC_CORE_FLAG_UNLOC_BY_SLIDER = 0x00000040, /**< SET - Voice call unlock by slider, UNSET - otherwise */ + CALL_VC_CORE_FLAG_EXPT_APPLET_QUIT = 0x00000080, /**< SET - Thread safe applet quit required, UNSET - otherwise */ + CALL_VC_CORE_FLAG_LANG_CHGD_UPDATE = 0x00000100, /**< SET - UI needs to be updated for language change, UNSET - otherwise */ + CALL_VC_CORE_FLAG_WAIT_SWITCH_FROM_BT = 0x00000200, /**< SET - Don't change path in path_change API, UNSET - change path according to current status */ + CALL_VC_CORE_FLAG_SETUPCALL_FAIL = 0x00000400, /**< SET - Setup call fail.(ex. Emergency call only). UNSET - Normal mo call.*/ + CALL_VC_CORE_FLAG_ACCEPT_BY_BT = 0x00000800, /**< SET - MT call accpeted by BT Headset, UNSET - MT call accept by Phone/ Call ended.*/ + CALL_VC_CORE_FLAG_QC_SIM_INSERTED = 0x00001000, /**< SET - Inserted SIM is QC Test SIM, UNSET - Inserted SIM is Normal SIM.*/ + CALL_VC_CORE_FLAG_MOCALL_END_BY_USER = 0x00002000, /**< SET - MO Call Ended by user, UNSET - MO Call not ended by user.*/ +} call_vc_core_flags_t; + +/** + * This enum defines the In Call Supplementary Services State + */ +typedef enum _call_vc_core_incall_ss_state_t { + CALL_VC_CORE_SS_NONE, /**< Idle State*/ + CALL_VC_CORE_SS_0, /**< Releases all held calls or Set UDUB for a waiting call*/ + CALL_VC_CORE_SS_1, /**< Releases all active calls and accepts the other(held or waiting) calls*/ + CALL_VC_CORE_SS_1X, /**< Releases a specific active call X*/ + CALL_VC_CORE_SS_2, /**< Places all active calls (if any exist) on hold and accepts the other(held or waiting)call*/ + CALL_VC_CORE_SS_2X, /**< Places all active calls on hold except call X with which communication shall be supported*/ + CALL_VC_CORE_SS_3, /**< Adds a held call to the conversation*/ + CALL_VC_CORE_SS_4, /**< ECT */ + CALL_VC_CORE_SS_USSD /**< USSD */ +} call_vc_core_incall_ss_state_t; + +/** +* This structure defines the details of the DTMF related data handled in document +*/ +typedef struct _voicecall_dtmf_info_t { + gboolean bdtmf_queue; /**< TRUE -dtmf queue enabled, FALSE - dtmf quue disabled */ + int dtmf_index; /**< index of the current dtmf digit sent */ + int dtmf_max_length; /**< maximum length of the dtmf number being sent */ + int dtmf_pause_timer; /**< Timer handle of the DTMF Pause Timer */ + gboolean bsat_dtmf; /**< SAT DTMF Type Engine Flag*/ + gboolean bsat_hidden; /**< SAT DTMF Hidden Engine Flag*/ + gboolean bdtmf_wait; /**< Wait enabled while sending dtmf string*/ + char dtmf_number[VC_PHONE_NUMBER_LENGTH_MAX]; +} voicecall_dtmf_info_t; + +/** + * This structure defines voicecall core info + */ +typedef struct _call_vc_core_state_t { + voicecall_setup_info_t call_setup_info; /**< Info of MO Call */ + voicecall_engine_t *pcall_engine; /**< Handle to Voicecall Engine */ + voicecall_snd_mgr_t *papp_snd; /**< Handle to Sound Manager */ + voicecall_dtmf_info_t dtmf_info; /**< DTMF Info*/ + + unsigned int core_status; /**< call core status */ + gboolean bt_connected; /**< TRUE - Bluetooth connected, FALSE - otherwise */ + gboolean bdtmf_queue; /**< TRUE -dtmf queue enabled, FALSE - dtmf quue disabled */ + int auto_redial_count; /** Auto Redial count **/ + unsigned int auto_answer_timer; /**< Timer Handle for Auto Answering */ + unsigned int callstatus_timer; /**< Timer Handle for callstatus set. */ + int selected_call_id_in_ss; /** +#include "vc-core-engine-types.h" + +#define VCALL_SENSOR_NEAR 1 +#define VCALL_SENSOR_FAR 2 + +/** + * Voicecall Engine API result values + */ +typedef enum _vcall_engine_api_result_t { + VCALL_ENGINE_API_FAILED = -1, + VCALL_ENGINE_API_SUCCESS, + + VCALL_ENGINE_API_ACTIVE_CALL_EXIST, + VCALL_ENGINE_API_ACTIVE_AND_HELD_CALL_EXIST, + + VCALL_ENGINE_API_CALLNOTALLOWED, + VCALL_ENGINE_API_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL, + VCALL_ENGINE_API_UNAVAILABLE, + VCALL_ENGINE_API_CHANGEOFFLINEMODETOCALL, + VCALL_ENGINE_API_CALLING_EMERG_ONLY, + VCALL_ENGINE_API_FDNCALLONLY, + VCALL_ENGINE_API_CALLFAILED, + VCALL_ENGINE_API_CALLENDED, + VCALL_ENGINE_API_SOS_CALL_ONLY_IN_NO_SIM_MODE, + VCALL_ENGINE_API_PHONE_NOT_INITIALISED, + VCALL_ENGINE_API_CAUSE_WRONG_NUMBER, + + VCALL_ENGINE_API_DTMFSENDING_FAIL, + VCALL_ENGINE_API_HOLD_FAILED, + VCALL_ENGINE_API_UNABLE_TO_RETRIEVE, + VCALL_ENGINE_API_SWAP_FAILED, + VCALL_ENGINE_API_SPLIT_FAILED, + VCALL_ENGINE_API_JOIN_FAILED, + VCALL_ENGINE_API_TRANSFER_FAILED, + VCALL_ENGINE_API_SWAP_NOT_SUPPORTED, + VCALL_ENGINE_API_HOLD_NOT_SUPPORTED, + VCALL_ENGINE_API_UNHOLD_NOT_SUPPORTED, + VCALL_ENGINE_API_JOIN_NOT_SUPPORTED, + VCALL_ENGINE_API_SPLIT_NOT_SUPPORTED, + VCALL_ENGINE_API_TRANSFER_NOT_SUPPORTED, + VCALL_ENGINE_API_INCOMPLETE, + + VCALL_ENGINE_API_NOT_ENOUGH_MEMORY_FOR_RECORDING, + VCALL_ENGINE_API_NO_CONNECTED_CALL_FOR_RECORDING, + + VCALL_ENGINE_API_FLIGHT_MODE_DISABLE_REQUEST, + + VCALL_ERROR_MAX +} vcall_engine_api_result_t; + +/** + * This enum defines call answer types + */ +typedef enum _vcall_engine_answer_type_t { + VCALL_ENGINE_ANSWER_HOLD_ACTIVE_AND_ACCEPT = 1, /**< Puts the active call on hold and accepts the call (Only CONNECTED will be sent to client) */ + VCALL_ENGINE_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to Client) */ + VCALL_ENGINE_ANSWER_RELEASE_HOLD_AND_ACCEPT, /**< Releases the active call and accept the call (END and CONNECTED will be sent to client) */ + VCALL_ENGINE_ANSWER_RELEASE_ALL_AND_ACCEPT /**< Releases the all calls and accept the call (END and CONNECTED will be sent to client) */ +} vcall_engine_answer_type_t; + +/** + * This enum defines call release types + */ +typedef enum _vcall_engine_release_type_t { + VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS, /**< To end all available active calls*/ + VCALL_ENGINE_RELEASE_ALL_HELD_CALLS, /**< To end all available held calls*/ + VCALL_ENGINE_RELEASE_ALL_CALLS, /**< To end all available calls(active,held,incoming/outgoing*/ +} vcall_engine_release_type_t; + +/** +* This enum defines the command type sent by recorder to the client view through update signal +*/ +typedef enum _vcall_engine_record_stop_type_t { + VCALL_ENGINE_RECORD_STOP_BY_NORMAL, /**< BY_NORMAL*/ + VCALL_ENGINE_RECORD_STOP_BY_MAX_SIZE, /**< by MAX_SIZE*/ + VCALL_ENGINE_RECORD_STOP_BY_NO_FREE_SPACE, /**< BY_NO_FREE_SPACE*/ + VCALL_ENGINE_RECORD_STOP_BY_TIME_LIMIT, /**< BY_TIME_LIMIT*/ + VCALL_ENGINE_RECORD_STOP_ERROR, /**< ERROR*/ +} vcall_engine_record_stop_type_t; + +/** + * This enum defines call answer types + */ +typedef enum _vcall_engine_vol_type_t { + VCALL_ENGINE_VOL_TYPE_RINGTONE, /**< ringtone volume*/ + VCALL_ENGINE_VOL_TYPE_VOICE, /**< voice volume*/ + VCALL_ENGINE_VOL_TYPE_HEADSET /**< headset volume*/ +} vcall_engine_vol_type_t; + +/** +* This enumeration defines names of the on call audio status +*/ +typedef enum _vcall_engine_audio_type_t { + VCALL_ENGINE_AUDIO_NONE, /**< none*/ + VCALL_ENGINE_AUDIO_SPEAKER, /**< System LoudSpeaker Audio */ + VCALL_ENGINE_AUDIO_RECEIVER_EARJACK, /**< System receiver or earjack Audio */ + VCALL_ENGINE_AUDIO_HEADSET, /**< System Headset Audio */ + VCALL_ENGINE_AUDIO_MAX, +} vcall_engine_audio_type_t; + +/** +* This enumeration defines names of lcd control +*/ +typedef enum _vcall_engine_lcd_control_t { + VCALL_ENGINE_LCD_OFF, /**< LCD Off*/ + VCALL_ENGINE_LCD_ON, /**< LCD On */ + VCALL_ENGINE_LCD_ON_LOCK, /**< LCD ON lock */ + VCALL_ENGINE_LCD_ON_UNLOCK, /**< LCD ON unlock */ + VCALL_ENGINE_LCD_MAX, +} vcall_engine_lcd_control_t; + +typedef enum { + VC_LCD_OFF = 1, + VC_LCD_ON, + VC_LCD_ON_LOCK, + VC_LCD_ON_UNLOCK, +} voicecall_lcd_control_t; + +/** + * This struct provides a structure for call setup info data. + */ +typedef struct _vcall_engine_setup_info_t { + int contact_index; + int storage_type; + int phone_type; + int bemergency; + char call_num[VC_PHONE_NUMBER_LENGTH_MAX]; + char call_name[VC_DISPLAY_NAME_LENGTH_MAX]; + char call_file_path[VC_IMAGE_PATH_LENGTH_MAX]; +} vcall_engine_setup_info_t; + +/** + * This struct provides a structure for sat setup call info data. + */ +typedef struct _vcall_engine_sat_setup_call_info_t { + int command_id; /** +#include +#include +#include +#include + +#define VOICE_CALL_SND_RINGTONE_PATH_LEN 256 /**DfQX`!q5>*0 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 O-;AMuu7&^8YyTHqOq#F& literal 0 HcmV?d00001 diff --git a/call-engine/sounds/03_Call_connect.wav b/call-engine/sounds/03_Call_connect.wav new file mode 100755 index 0000000000000000000000000000000000000000..22efdba902a3c986512bbfe5cc72ccae38828293 GIT binary patch literal 47944 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 literal 0 HcmV?d00001 diff --git a/call-engine/sounds/04_Call_disconnect.wav b/call-engine/sounds/04_Call_disconnect.wav new file mode 100755 index 0000000000000000000000000000000000000000..626ad401f0d119abd672289d78529e284cbd67a0 GIT binary patch literal 17004 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 B=mh`( literal 0 HcmV?d00001 diff --git a/call-engine/sounds/Call_RecordStart.wav b/call-engine/sounds/Call_RecordStart.wav new file mode 100755 index 0000000000000000000000000000000000000000..ee974ca0f3177bdf229779de2bf4a81ba66538de GIT binary patch literal 22768 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 BT */ +static char *gszbt_res_event[VC_BT_AG_RES_CALL_SWAPPED + 1] = { + "VC_BT_AG_RES_CALL_ORIG", + "VC_BT_AG_RES_CALL_INCOM", + "VC_BT_AG_RES_CALL_CONNECT", + "VC_BT_AG_RES_CALL_END", + "VC_BT_AG_RES_CALL_HOLD", + "VC_BT_AG_RES_CALL_RETRIEVE", + "VC_BT_AG_RES_CALL_JOINED", + "VC_BT_AG_RES_SPK_GAIN", + "VC_BT_AG_RES_MIC_GAIN", + "VC_BT_AG_RES_CALL_REMOTE_RINGING", + "VC_BT_AG_RES_SWITCH_TO_HEADSET", + "VC_BT_AG_RES_SWITCH_TO_PHONE", + "VC_BT_AG_RES_CALL_STATUS", + "VC_BT_AG_RES_HEADSET_VOL", + "VC_BT_AG_RES_CALL_SWAPPED" +}; + +/* CALL <-- BT */ +static char *gszbt_req_event[VC_BT_AG_REQ_CALL_STATUS + 1] = { + "VC_BT_AG_REQ_CONNECT", + "VC_BT_AG_REQ_CONNECT_ERROR", + "VC_BT_AG_REQ_DISCONNECT", + "VC_BT_AG_REQ_SPK_GAIN", + "VC_BT_AG_REQ_MIC_GAIN", + "VC_BT_AG_REQ_CALL_ACCEPTED", + "VC_BT_AG_REQ_CALL_REJECT", + "VC_BT_AG_REQ_CALL_END", + "VC_BT_AG_REQ_CALL_HOLD", + "VC_BT_AG_REQ_CALL_RETRIEVE", + "VC_BT_AG_REQ_BUTTON_PRESSED", + "VC_BT_AG_REQ_CALL_REDIAL", + "VC_BT_AG_REQ_CALL_2_SEND", + "VC_BT_AG_REQ_CALL_3_SEND", + "VC_BT_AG_REQ_CALL_0_SEND", + "VC_BT_AG_REQ_CALL_1_SEND", + "VC_BT_AG_REQ_HEADSET_VOL", + "VC_BT_AG_REQ_SWITCH_TO_HEADSET", + "VC_BT_AG_REQ_SWITCH_TO_PHONE", + "VC_BT_AG_REQ_DTMF", + "VC_BT_AG_REQ_CALL_STATUS" +}; + +static gboolean b_user_rqst_path_change = FALSE; +static int __vc_bt_converted_bt_vol_to_voice_vol(int bt_vol_level); +static void __vc_bt_handle_connectivity_event(call_vc_core_state_t *pcall_core, gboolean bt_headset_connect_status); + +static int __vc_bt_converted_bt_vol_to_voice_vol(int bt_vol_level) +{ + int converted_vol_level = -1; + + if (bt_vol_level <= 0) { + converted_vol_level = 1; + } else if (bt_vol_level > 15) { + converted_vol_level = 15; + } else { + converted_vol_level = bt_vol_level; + } + return converted_vol_level; +} + +static void __vc_bt_handle_connectivity_event(call_vc_core_state_t *pcall_core, gboolean bt_headset_connect_status) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "bt_headset_connect_status = %d", bt_headset_connect_status); + if (FALSE == bt_headset_connect_status) { + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING, FALSE); + } + + if (bt_headset_connect_status == pcall_core->bt_connected) { + CALL_ENG_DEBUG(ENG_DEBUG, "No change in state, Ignoring Event"); + CALL_ENG_DEBUG(ENG_DEBUG, "bt_headset_connect_status = %d", bt_headset_connect_status); + return; + } + pcall_core->bt_connected = bt_headset_connect_status; + + if (TRUE == pcall_core->bt_connected) { + /*Check the Call Status and Send Response event to the Bluetooth */ + int call_handle = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "BT connected, Not changing the sound status"); + /* Headset is connected, Set the Sound Status to Headset + and change the path only incase of mocall and connected call */ + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_INCOMING_CALL, &call_handle); + if (call_handle != -1) { + call_vc_call_objectinfo_t callobject_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call Exists, call handle = %d", call_handle); + + voicecall_core_get_call_object(pcall_engine, call_handle, &callobject_info); + + /*Incoming Call Exists */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_INCOM, call_handle, callobject_info.tel_number); + return; + } + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_OUTGOING_CALL, &call_handle); + if (call_handle != -1) { + int io_state = VC_INOUT_STATE_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing Call Exists, call handle = %d", call_handle); + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + + switch (io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: /*Fall Through */ + { + call_vc_call_objectinfo_t callobject_info; + + voicecall_core_get_call_object(pcall_engine, call_handle, &callobject_info); + + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_ORIG, call_handle, callobject_info.tel_number); + } + break; + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + { + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_REMOTE_RINGING, call_handle, NULL); + } + break; + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine not in desired IO State, Current IO State: %d", io_state); + return; + } + break; + } + + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + + return; + } + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_CONNECTED_CALL, &call_handle); + if (call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call Exists, call handle = %d", call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "BT connected, Not changing the path in bt connect event"); + + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_CONNECT, call_handle, NULL); + + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } + + } else { + vc_engine_headset_status_type event_data; + + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + + /* Headset is disconnected, so voice sound path should be changed to phone. */ + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_HEADSET, FALSE); + if (voicecall_core_is_incoming_call_exists(pcall_engine)) { + sound_manager_call_session_set_mode(pcall_core->papp_snd->psnd_session, SOUND_CALL_SESSION_MODE_RINGTONE); + } else { + if (voicecall_core_is_outgoing_call_exists(pcall_engine) || (voicecall_core_is_connected_call_exist(pcall_engine))) { + voicecall_snd_change_path(pcall_core->papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No valid calls, not changing the path"); + } + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "BT disconnected when path is not on BT. Do NOT change path. only update UI"); + } + + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_HEADSET_STATUS_TO_UI, (void *)&event_data); + } + +} + +gboolean _vc_bt_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset, gboolean bsend_bt_response) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + vc_bt_ag_res_t bt_event = VC_BT_AG_RES_SWITCH_TO_PHONE; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, "bheadset = %d,bsend_bt_response = %d", bheadset, bsend_bt_response); + + CALL_ENG_DEBUG(ENG_DEBUG, "b_user_rqst_path_change(%d)", b_user_rqst_path_change); + if (b_user_rqst_path_change == FALSE) { + if (TRUE == bheadset) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Don't set path_status.. rqst from User. Already setted."); + } + + /*Donot change the path for MT Call. Change the Audio Path only for MO and Connected calls */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_engine))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Changing the Path on BT Request"); + voicecall_snd_change_path_real(papp_snd); + + /*Send Response to BT only if the path is changed */ + if (TRUE == bsend_bt_response) { + bt_event = (TRUE == bheadset) ? VC_BT_AG_RES_SWITCH_TO_HEADSET : VC_BT_AG_RES_SWITCH_TO_PHONE; + CALL_ENG_DEBUG(ENG_DEBUG, "Sending BT Response bt_event: %d", bt_event); + _vc_bt_send_response_to_bt(pcall_core, bt_event, -1, NULL); + } + return TRUE; + } + + return FALSE; +} + +/** + * This function sends event to BT for switch to Headset/Phone + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bheadset TRUE if sound type is Audio Headset, FALSE otherwise + */ +void _vc_bt_request_switch_headset_path(call_vc_core_state_t *pcall_core, gboolean bheadset) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + vc_bt_ag_res_t bt_event = VC_BT_AG_RES_SWITCH_TO_PHONE; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + /*Donot change the path for MT Call. Change the Audio Path only for MO and Connected calls */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_engine))) { + bt_event = (TRUE == bheadset) ? VC_BT_AG_RES_SWITCH_TO_HEADSET : VC_BT_AG_RES_SWITCH_TO_PHONE; + CALL_ENG_DEBUG(ENG_DEBUG, "Sending BT Response bt_event: %d", bt_event); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING, TRUE); + + _vc_bt_send_response_to_bt(pcall_core, bt_event, -1, NULL); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No Valid calls to switch path"); + } +} + +/** + * This function handles the bluetooth notifications sent by blue tooth application + * + * @return TRUE -if event is handled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] pbt_info bt notification details + */ +gboolean _vc_bt_handle_bt_events(call_vc_core_state_t *pcall_core, vc_bt_ag_param_info_t * pbt_info) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(pbt_info != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "Event: %s(%d)", gszbt_req_event[pbt_info->param1], pbt_info->param1); + + /*HS Connection not required for sending response to VC_BT_AG_REQ_CALL_STATUS */ + if ((FALSE == pcall_core->bt_connected) && (VC_BT_AG_REQ_CALL_STATUS != pbt_info->param1)) { + CALL_ENG_DEBUG(ENG_ERR, "BT not connected, Ignoring BT Events, BT Event= %d", pbt_info->param1); + return TRUE; + } + + switch (pbt_info->param1) { + case VC_BT_AG_REQ_CALL_STATUS: + { + /*Send the Current Call status to BT */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_STATUS, -1, NULL); + + } + break; + case VC_BT_AG_REQ_SPK_GAIN: + { + int bt_vol_level = pbt_info->param2; + int converted_vol_level; + vc_engine_vol_set_from_bt_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Speaker Gain Value : %d", bt_vol_level); + + if (voicecall_snd_get_path_status(pcall_core->papp_snd) != VOICE_CALL_SND_PATH_BT) { + CALL_ENG_DEBUG(ENG_DEBUG, "Headset not switched on, Ignoring Speaker Gain Event"); + return TRUE; + } + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT, TRUE); + + converted_vol_level = __vc_bt_converted_bt_vol_to_voice_vol(bt_vol_level); + + CALL_ENG_DEBUG(ENG_DEBUG, "converted Speaker Gain Value : %d", converted_vol_level); + + memset(&event_data, 0, sizeof(event_data)); + event_data.vol_level = converted_vol_level; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SET_VOLUME_FROM_BT_TO_UI, (void *)&event_data); + } + break; + case VC_BT_AG_REQ_CALL_ACCEPTED: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call Accept by BT"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, TRUE); + if (_vc_core_util_phonelock_status() == FALSE) + vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + if (TRUE == voicecall_core_answer_call(pcall_core, FALSE)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_answer_call success"); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "No Incoming call, skipping BT request"); + } + } + break; + case VC_BT_AG_REQ_CALL_REJECT: + { + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + if (FALSE == voicecall_core_reject_mt(pcall_core, TRUE)) { + CALL_ENG_DEBUG(ENG_ERR, "voicecall_core_reject_mt returned FALSE!"); + } + /*Call rejected, reset the accept by flag */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + } else if (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + /*To retrieve the held call automatically once the mo call is ended, if held is call is available */ + _vc_core_engine_status_set_end_flag(pcall_core->pcall_engine, VC_RETREIVE_CALL_ON_MOCALL_END); + + voicecall_core_end_mo_call(pcall_core->pcall_engine); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No Incoming/Outgoing calls, skipping BT request"); + } + } + break; + case VC_BT_AG_REQ_BUTTON_PRESSED: + { + if (voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + return voicecall_core_process_hold_call(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_ERR, "No connected calls, skipping BT request"); + } + + } + break; + case VC_BT_AG_REQ_CALL_END: + { + voicecall_core_end_call(pcall_core); + } + break; + case VC_BT_AG_REQ_CONNECT_ERROR: + { + /*To change path , reset flags and to update UI, if this is conisdered as Bt disconnect */ + __vc_bt_handle_connectivity_event(pcall_core, FALSE); + } + break; + case VC_BT_AG_REQ_CALL_0_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_0); + } + } + break; + case VC_BT_AG_REQ_CALL_1_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call Accept by BT"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, TRUE); + } + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_1); + } + } + break; + case VC_BT_AG_REQ_CALL_2_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + gboolean bactive_calls = FALSE; + gboolean bheld_calls = FALSE; + + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + voicecall_core_is_call_exists(pcall_core->pcall_engine, &bactive_calls, &bheld_calls); + if (!((TRUE == bactive_calls) && (TRUE == bheld_calls))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call Accept by BT"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, TRUE); + } + } + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_2); + } + } + break; + case VC_BT_AG_REQ_CALL_3_SEND: + { + if (TRUE == voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + voicecall_core_start_incall_ss(pcall_core, CALL_VC_CORE_SS_3); + } + } + break; + case VC_BT_AG_REQ_HEADSET_VOL: + { + int bt_vol_level = pbt_info->param2; + int converted_vol_level; + + CALL_ENG_DEBUG(ENG_DEBUG, "BT volume Level: %d", bt_vol_level); + + if (voicecall_core_is_any_call_exists(pcall_core->pcall_engine)) { + vc_engine_vol_resp_type event_data; + + converted_vol_level = __vc_bt_converted_bt_vol_to_voice_vol(bt_vol_level); + + memset(&event_data, 0, sizeof(event_data)); + event_data.vol_alert_type = VOICE_CALL_VOL_TYPE_HEADSET; + event_data.vol_level = converted_vol_level; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_ERR, "NO Calls, Skipping BT Response"); + } + } + break; + case VC_BT_AG_REQ_SWITCH_TO_HEADSET: + case VC_BT_AG_REQ_SWITCH_TO_PHONE: + { + gboolean bswitch_to_headset = FALSE; + int bt_error = pbt_info->param2; + + if (voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING) == TRUE) { + b_user_rqst_path_change = TRUE; + } else { + b_user_rqst_path_change = FALSE; + } + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING, FALSE); + + /*Switch to response is received from BT, BT decision is fina, so reset the accept by BT */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + CALL_ENG_DEBUG(ENG_DEBUG, "BT Error :%d", bt_error); + if (0 == bt_error) { + /*Audio Connection/Disconnection Success case */ + bswitch_to_headset = (VC_BT_AG_REQ_SWITCH_TO_HEADSET == pbt_info->param1) ? TRUE : FALSE; + } else { + /*Audio Connection/Disconnection Error Case */ + if (VC_BT_AG_RES_AUDIO_CONNECTION_ERROR == bt_error) { + /*Connection Error, switch to phone */ + bswitch_to_headset = FALSE; + } else if (VC_BT_AG_RES_AUDIO_DISCONNECTION_ERROR == bt_error) { + /*Disconnection Error, switch to headset */ + bswitch_to_headset = TRUE; + } else { + CALL_ENG_DEBUG(ENG_ERR, "Invalid BT Error: %d", bt_error); + } + + } + + CALL_ENG_DEBUG(ENG_DEBUG, "bswitch_to_headset = %d", bswitch_to_headset); + + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))) { + gboolean bupdate = FALSE; + + if (0 == bt_error) { + /*Connection/Diconnection is sucess, don't send response to BT */ + bupdate = _vc_bt_switch_headset_path(pcall_core, bswitch_to_headset, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, "bupdate = %d, bswitch_to_headset = %d", bupdate, bswitch_to_headset); + + vc_engine_headset_status_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = bswitch_to_headset; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_HEADSET_STATUS_TO_UI, (void *)&event_data); + } else { + /*Connection/Diconnection is NOT sucess, change path and send response to BT */ + bupdate = _vc_bt_switch_headset_path(pcall_core, bswitch_to_headset, TRUE); + } + + } else { + CALL_ENG_DEBUG(ENG_ERR, "No connected/outgoing calls, Skipping BT Request"); + } + } + break; + case VC_BT_AG_REQ_DTMF: + { + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Send DTMF(%s)", pbt_info->param4); + if ((voicecall_core_is_call_exists(pcall_core->pcall_engine, &active_calls, &held_calls)) && (TRUE == active_calls)) { + voicecall_core_send_dtmf(pcall_core, pbt_info->param4); + } + } + break; + + case VC_BT_AG_REQ_CALL_REDIAL: + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for bt event: %d", pbt_info->param1); + return FALSE; + break; + + } + + return TRUE; +} + +/** + * This function sends response back to the bt application + * + * @return void + * @param[in] pcall_core Handle to voicecall core + * @param[in] bt_event bluetooth event type + * @param[in] param1 user param1 + * @param[in] param2 user param2 + */ +void _vc_bt_send_response_to_bt(call_vc_core_state_t *pcall_core, int bt_event, int param1, gpointer param2) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + int ret = 0; + char number_buf[256] = {0,}; + CALL_ENG_DEBUG(ENG_DEBUG, "Event: %s(%d), param1=[%d]", gszbt_res_event[bt_event], bt_event, param1); + + /*Skip events, if Bluetooth is not connected */ +/* if((FALSE == pcall_core->bt_connected) && (VC_BT_AG_RES_CALL_STATUS != bt_event)) + { + CALL_ENG_DEBUG(ENG_DEBUG,"Bluetooth not connected , Not sending any responses to BT"); + return; + } +*/ + + switch (bt_event) { + case VC_BT_AG_RES_CALL_STATUS: + case VC_BT_AG_RES_CALL_SWAPPED: + case VC_BT_AG_RES_CALL_JOINED: + { + vc_bt_ag_call_status_info_t call_status_info[10]; + int mt_call_handle = -1; + int mo_call_handle = -1; + int connected_call_handle = -1; + int active_group_member_num = 0; + int held_group_member_num = 0; + int index = 0; + int i = 0; + char temp_str[10] = { 0, }; + char result_str[256] = { 0, }; + bt_call_list_h call_list = NULL; + + /*Incoming Call */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_INCOMING_CALL, &mt_call_handle); + if (mt_call_handle != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call Exists, call handle = %d", mt_call_handle); + + call_status_info[index].call_id = mt_call_handle; + call_status_info[index].call_status = BT_AG_CALL_STATE_INCOMING; + index++; + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after mt= %d", index); + } + + /*Outgoing Call */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, &mo_call_handle); + if (mo_call_handle != -1) { + voicecall_call_state_t call_state; + gboolean bvalid_call = TRUE; + + _vc_core_engine_status_get_call_state_byhandle(pcall_core->pcall_engine, mo_call_handle, &call_state); + CALL_ENG_DEBUG(ENG_DEBUG, "call state: %d", call_state); + + switch (call_state) { + case VC_CALL_STATE_OUTGOING_ALERT: + { + call_status_info[index].call_status = BT_AG_CALL_STATE_ALERTING; + } + break; + case VC_CALL_STATE_PREPARE_OUTGOING: + case VC_CALL_STATE_OUTGOING: + case VC_CALL_STATE_OUTGOING_ORIG: + { + call_status_info[index].call_status = BT_AG_CALL_STATE_DIALING; + } + break; + default: /*All Other states , donot consider for mocall */ + CALL_ENG_DEBUG(ENG_DEBUG, "mo call state: %d", call_state); + bvalid_call = FALSE; + } + + if (TRUE == bvalid_call) { + call_status_info[index].call_id = mo_call_handle; + index++; + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after mo= %d", index); + } + + } + + /*Connected call */ + int act_grp_index = -1; + int held_grp_index = -1; + + _vc_core_engine_group_get_group_indices(pcall_core->pcall_engine, &act_grp_index, &held_grp_index); + + CALL_ENG_DEBUG(ENG_DEBUG, "act_grp_index = %d, held_grp_index = %d", act_grp_index, held_grp_index); + /*Active Connected Call */ + if (act_grp_index != -1) { + _vc_core_engine_group_get_connected_member_count(pcall_core->pcall_engine, act_grp_index, &active_group_member_num); + CALL_ENG_DEBUG(ENG_DEBUG, "active_group_connected_member_num = %d", active_group_member_num); + for (i = 0; i < active_group_member_num; i++) { + _vc_core_engine_group_get_call_handle_byposition(pcall_core->pcall_engine, act_grp_index, i, &connected_call_handle); + if (connected_call_handle != -1) { + call_status_info[index].call_id = connected_call_handle; + call_status_info[index].call_status = BT_AG_CALL_STATE_ACTIVE; + index++; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after active calls= %d", index); + } + + /*Held Connected Call */ + if (held_grp_index != -1) { + _vc_core_engine_group_get_connected_member_count(pcall_core->pcall_engine, held_grp_index, &held_group_member_num); + + CALL_ENG_DEBUG(ENG_DEBUG, "held_group_member_num = %d", held_group_member_num); + for (i = 0; i < held_group_member_num; i++) { + _vc_core_engine_group_get_call_handle_byposition(pcall_core->pcall_engine, held_grp_index, i, &connected_call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle[%d] = %d", i, connected_call_handle); + if (connected_call_handle != -1) { + call_status_info[index].call_id = connected_call_handle; + call_status_info[index].call_status = BT_AG_CALL_STATE_HELD; + index++; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "total_call_member after held calls= %d", index); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Total Calls = %d", index); + + memset(result_str, 0x00, sizeof(result_str)); + for (i = 0; i < index; i++) { + memset(temp_str, 0x00, sizeof(temp_str)); + snprintf(temp_str, sizeof(temp_str), "%d.%d/", call_status_info[i].call_id, call_status_info[i].call_status); + strncat(result_str, temp_str, sizeof(temp_str) - 1); + } + CALL_ENG_DEBUG(ENG_DEBUG, "The resultant string is %s", result_str); + + CALL_ENG_DEBUG(ENG_DEBUG, "Actual Data Passed to BT"); + ret = bt_call_list_create(&call_list); + if (ret == BT_ERROR_NONE) { + for (i = 0; i < index; i++) { + CALL_ENG_DEBUG(ENG_DEBUG, "call id = %d", call_status_info[i].call_id); + CALL_ENG_DEBUG(ENG_DEBUG, "call status= %d", call_status_info[i].call_status); + bt_call_list_add(call_list, call_status_info[i].call_id, call_status_info[i].call_status); + } + bt_ag_notify_call_list(call_list); + bt_call_list_destroy(call_list); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Verification of BT data being sent"); + } + break; + case VC_BT_AG_RES_CALL_INCOM: + { + /*Length of Incoming Call Number */ + if (NULL != param2) { + CALL_ENG_DEBUG(ENG_DEBUG, "phone number=%s", (char *)param2); + _vc_core_util_strcpy(number_buf, VC_PHONE_NUMBER_LENGTH_MAX, param2); + } + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_INCOMING, param1, number_buf); + if (ret != BT_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT_AG_CALL_EVENT_INCOMING / error[%d]", ret); + } + } + break; + case VC_BT_AG_RES_CALL_ORIG: + { + if (NULL != param2) { + CALL_ENG_DEBUG(ENG_DEBUG, "phone number=%s", (char *)param2); + memset(number_buf, 0x00, sizeof(number_buf)); + _vc_core_util_strcpy(number_buf, VC_PHONE_NUMBER_LENGTH_MAX, param2); + + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_DIALING, param1, number_buf); + + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + ret = bt_ag_open_sco(); + } + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "VC_BT_AG_RES_CALL_CONNECT / error[%d]", ret); + } + } + } + break; + case VC_BT_AG_RES_CALL_REMOTE_RINGING: + { + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_ALERTING, param1, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT_AG_CALL_EVENT_ALERTING / error[%d]", ret); + } + } + break; + case VC_BT_AG_RES_CALL_CONNECT: + case VC_BT_AG_RES_CALL_END: + { + if (bt_event == VC_BT_AG_RES_CALL_CONNECT) { + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_ANSWERED, param1, NULL); + + /* open bt audio channel */ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + ret = bt_ag_open_sco(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "VC_BT_AG_RES_CALL_CONNECT / error[%d]", ret); + } + } + } else if(bt_event == VC_BT_AG_RES_CALL_END) { + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_IDLE, param1, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "VC_BT_AG_RES_CALL_END / error[%d]", ret); + } + } + } + break; + case VC_BT_AG_RES_SPK_GAIN: + /*BT Volume Level */ + ret = bt_ag_notify_speaker_gain(param1); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_get_speaker_gain / error[%d]", ret); + } + + break; + case VC_BT_AG_RES_HEADSET_VOL: /*Request For Current BT Volume Level */ + { + CALL_ENG_DEBUG(ENG_DEBUG, "Requesting for Current BT Volume Level"); + int hs_vol = 0; + vc_bt_ag_param_info_t ag_param; + ret = bt_ag_get_speaker_gain(&hs_vol); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_get_speaker_gain / error[%d]", ret); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Requesting for Current BT Volume Level [%d]", hs_vol); + ag_param.param1 = VC_BT_AG_REQ_HEADSET_VOL; + ag_param.param2 = (int)hs_vol; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + case VC_BT_AG_RES_SWITCH_TO_HEADSET: + { + ret = bt_ag_open_sco(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_open_sco / error[%d]", ret); + } + } + break; + case VC_BT_AG_RES_SWITCH_TO_PHONE: + { + ret = bt_ag_close_sco(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_close_sco / error[%d]", ret); + } + } + break; + case VC_BT_AG_RES_CALL_HOLD: + { + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_HELD, param1, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT_AG_CALL_EVENT_HELD / error[%d]", ret); + } + } + break; + case VC_BT_AG_RES_CALL_RETRIEVE: + { + ret = bt_ag_notify_call_event(BT_AG_CALL_EVENT_RETRIEVED, param1, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT_AG_CALL_EVENT_RETRIEVED / error[%d]", ret); + } + } + break; + default: + break; + } + CALL_ENG_DEBUG(ENG_DEBUG, "bt response ended."); +} + +static void __vc_bt_audio_connection_state_changed_cb(int result, + bool connected, const char *remote_address, + bt_audio_profile_type_e type, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_audio_connection_state_changed_cbt [%d]", connected); + if (connected) { + ag_param.param1 = VC_BT_AG_REQ_CALL_STATUS; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + else { + CALL_ENG_DEBUG(ENG_DEBUG, "HF Disconnected"); + } + + __vc_bt_handle_connectivity_event(pcall_core, connected); + +} + +static void __vc_bt_ag_sco_state_changed_cb(int result, bool opened, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_sco_state_changed_cb [%d]", opened); + if (opened) { + ag_param.param1 = VC_BT_AG_REQ_SWITCH_TO_HEADSET; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + + if (BT_ERROR_NONE != result) { + CALL_ENG_DEBUG(ENG_DEBUG, "connection error = [%d] \n", result); + ag_param.param2 = VC_BT_AG_RES_AUDIO_CONNECTION_ERROR; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer to BT Headset \n"); + } + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } else { + ag_param.param1 = VC_BT_AG_REQ_SWITCH_TO_PHONE; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + + if (BT_ERROR_NONE != result) { + ag_param.param2 = VC_BT_AG_RES_AUDIO_DISCONNECTION_ERROR; + CALL_ENG_DEBUG(ENG_DEBUG, "connection error = [%d] \n", result); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Transfer to Phone ( Speaker) \n"); + } + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } +} + +static void __vc_bt_ag_call_handling_event_cb(bt_ag_call_handling_event_e event, + unsigned int call_id, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + CALL_ENG_DEBUG(ENG_DEBUG, "bt call event [%d]", event); + + switch (event) { + case BT_AG_CALL_HANDLING_EVENT_ANSWER: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_ACCEPTED; + ag_param.param2 = 0; + ag_param.param3 = call_id; + ag_param.param4[0] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call id = %d \n", ag_param.param3); + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + + case BT_AG_CALL_HANDLING_EVENT_RELEASE: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_END; + ag_param.param2 = 0; + ag_param.param3 = call_id; + ag_param.param4[0] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call id = %d \n", ag_param.param3); + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + + case BT_AG_CALL_HANDLING_EVENT_REJECT: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_REJECT; + ag_param.param2 = 0; + ag_param.param3 = call_id; + ag_param.param4[0] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call id = %d \n", ag_param.param3); + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + default: + break; + } +} + +static void __vc_bt_ag_multi_call_handling_event_cb (bt_ag_multi_call_handling_event_e event, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + CALL_ENG_DEBUG(ENG_DEBUG, "bt multi call event [%d]", event); + + switch (event) { + case BT_AG_MULTI_CALL_HANDLING_EVENT_RELEASE_HELD_CALLS: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_0_SEND; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + + case BT_AG_MULTI_CALL_HANDLING_EVENT_RELEASE_ACTIVE_CALLS: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_1_SEND; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + + case BT_AG_MULTI_CALL_HANDLING_EVENT_ACTIVATE_HELD_CALL: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_2_SEND; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + + case BT_AG_MULTI_CALL_HANDLING_EVENT_MERGE_CALLS: + { + ag_param.param1 = VC_BT_AG_REQ_CALL_3_SEND; + ag_param.param2 = 0; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + _vc_bt_handle_bt_events(pcall_core, &ag_param); + } + break; + case BT_AG_MULTI_CALL_HANDLING_EVENT_EXPLICIT_CALL_TRANSFER: + default: + break; + } +} + +static void __vc_bt_ag_dtmf_transmitted_cb(const char *dtmf, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + ag_param.param1 = VC_BT_AG_REQ_DTMF; + ag_param.param2 = 0; + ag_param.param3 = 0; + _vc_core_util_strcpy(ag_param.param4, sizeof(ag_param.param4), dtmf); + + CALL_ENG_DEBUG(ENG_DEBUG, "bt dtmf event received [%s]", dtmf); + _vc_bt_handle_bt_events(pcall_core, &ag_param); +} + +static void __vc_bt_ag_speaker_gain_changed_cb(int gain, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + ag_param.param1 = VC_BT_AG_REQ_SPK_GAIN; + ag_param.param2 = gain; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Speaker Gain: %d\n", gain); + _vc_bt_handle_bt_events(pcall_core, &ag_param); +} + +static void __vc_bt_ag_microphone_gain_changed_cb(int gain, void *user_data) +{ + vc_bt_ag_param_info_t ag_param = { 0, }; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + + ag_param.param1 = VC_BT_AG_REQ_MIC_GAIN; + ag_param.param2 = gain; + ag_param.param3 = 0; + ag_param.param4[0] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Mic Gain: %d\n", gain); + _vc_bt_handle_bt_events(pcall_core, &ag_param); +} + + +/** + * This function register bt callback. + * + * @return TRUE if bt status is registered, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_status_init(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + int ret = 0; + int bstatus = 0; + + bstatus = _vc_bt_get_bt_status(); + CALL_ENG_DEBUG(ENG_DEBUG, "bt_connected:[%d]", bstatus); + __vc_bt_handle_connectivity_event(pcall_core, bstatus); + + ret = bt_initialize(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_audio_initialize - Failed"); + } + + ret = bt_audio_initialize(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_audio_initialize - Failed"); + } + + ret = bt_audio_set_connection_state_changed_cb(__vc_bt_audio_connection_state_changed_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_audio_connection_state_changed_cb / error[%d]", ret); + } + + ret = bt_ag_set_sco_state_changed_cb(__vc_bt_ag_sco_state_changed_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_sco_state_changed_cb / error[%d]", ret); + } + + ret = bt_ag_set_call_handling_event_cb(__vc_bt_ag_call_handling_event_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_call_handling_event_cb / error[%d]", ret); + } + + ret = bt_ag_set_multi_call_handling_event_cb(__vc_bt_ag_multi_call_handling_event_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_multi_call_handling_event_cb / error[%d]", ret); + } + + ret = bt_ag_set_dtmf_transmitted_cb(__vc_bt_ag_dtmf_transmitted_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_dtmf_transmitted_cb / error[%d]", ret); + } + + ret = bt_ag_set_speaker_gain_changed_cb(__vc_bt_ag_speaker_gain_changed_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_speaker_gain_changed_cb / error[%d]", ret); + } + + ret = bt_ag_set_microphone_gain_changed_cb(__vc_bt_ag_microphone_gain_changed_cb, NULL); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "__vc_bt_ag_microphone_gain_changed_cb / error[%d]", ret); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "BT init success"); + return TRUE; +} + +gboolean _vc_bt_status_deinit(call_vc_core_state_t *pcall_core) +{ + int ret = 0; + + ret = bt_audio_unset_connection_state_changed_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_audio_unset_connection_state_changed_cb / error[%d]", ret); + } + + ret = bt_ag_unset_sco_state_changed_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_unset_sco_state_changed_cb / error[%d]", ret); + } + + ret = bt_ag_unset_call_handling_event_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_unset_call_handling_event_cb / error[%d]", ret); + } + + ret = bt_ag_unset_multi_call_handling_event_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_unset_multi_call_handling_event_cb / error[%d]", ret); + } + + ret = bt_ag_unset_dtmf_transmitted_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_unset_dtmf_transmitted_cb / error[%d]", ret); + } + + ret = bt_ag_unset_speaker_gain_changed_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_unset_speaker_gain_changed_cb / error[%d]", ret); + } + + ret = bt_ag_unset_microphone_gain_changed_cb(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_ag_unset_microphone_gain_changed_cb / error[%d]", ret); + } + + + ret = bt_audio_deinitialize(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_audio_deinitialize / error[%d]", ret); + } + + ret = bt_deinitialize(); + if (BT_ERROR_NONE != ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_deinitialize / error[%d]", ret); + } + + return ret; +} + +/** + * This function gets the blue tooth active status from the phone status server + * + * @return TRUE - if BT is enabled, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_bt_status(void) +{ + int bt_status = VCONFKEY_BT_DEVICE_NONE; + gboolean ret = FALSE; + + ret = vconf_get_int(VCONFKEY_BT_DEVICE, &bt_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "bt_status = [0x%x]", bt_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + return (VCONFKEY_BT_DEVICE_HEADSET_CONNECTED == (bt_status & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)) ? TRUE : FALSE; +} + +/** + * This function gets the BT inband ringtone activate settings + * + * @return TRUE - if BT inband ringtone activate settings is ON, FALSE otherwise + * @param[in] none + */ +gboolean _vc_bt_get_inband_ringtone_active(void) +{ + /* InBand_Ringtone_Active for vconf.. */ + return FALSE; +} + +/** + * This function retreives volume level of headset + * + * @return + * @param[in] pcall_core Handle to voicecall core + */ +void _vc_bt_get_headset_volume(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_IF_FAIL(pcall_core != NULL); + + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_HEADSET_VOL, 0, NULL); +} + +/** + * This function returns the BT connection status + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _vc_bt_is_bt_connected(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + return pcall_core->bt_connected; +} + +/** + * This function returns the BT SCO status.(Synchronized Connection Oriented link) + * + * @return TRUE if bt is connected, FALSE otherwise + * @param[in] void + */ +gboolean _vc_bt_get_bt_sco_status(void) +{ + gboolean sco_status = FALSE; + gboolean ret = FALSE; + + ret = vconf_get_bool(VCONFKEY_BT_HEADSET_SCO, &sco_status); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "sco_status = [%d]", sco_status); + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..[%d]", ret); + } + + return sco_status; +} diff --git a/call-engine/voice-call-core.c b/call-engine/voice-call-core.c new file mode 100755 index 0000000..6a464c8 --- /dev/null +++ b/call-engine/voice-call-core.c @@ -0,0 +1,3766 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "vc-core-callagent.h" +#include "vc-core-engine.h" +#include "vc-core-error.h" +#include "voice-call-core.h" +#include "voice-call-engine-msg.h" +#include "voice-call-service.h" +#include "voice-call-device.h" +#include "voice-call-sound.h" + +#include "voice-call-bt.h" +#include "vc-core-engine.h" + +#include "voice-call-engine.h" + +#define MO_REDIAL_COUNT_MAX 10 +#define MO_REDIAL_TIMER_INTERVAL_FIRST 3000 /**< MO Redial Timer Interva; - 5 Secs*/ +#define MO_REDIAL_TIMER_INTERVAL_SECOND 3000 /**< MO Redial Timer Interva; - 1 Minute*/ +#define MO_REDIAL_TIMER_INTERVAL_THIRD 3000 /**< MO Redial Timer Interva; - 3 Minutes*/ + +#define MINUTE_MINDER_TIMEOUT_VALUE 60000 + +#define DTMF_PAUSE_TIMER_INTERVAL_FIRST 3000 /*3 Seconds */ +#define DTMF_PAUSE_TIMER_INTERVAL_REST 3000 /*3 Seconds */ +#define DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST 800 /*0.8 Second */ +#define DTMF_PAUSE_TIMER_INTERVAL_GCF_REST 3300 /*3 Seconds */ + +gboolean mo_redial_timer_cb(void *data); + +#define SET_PATH_TIMER_VALUE 50 +static guint g_set_path_timer_handler = 0; +static gboolean __voicecall_core_set_path_timer_cb(gpointer puser_data); +static gboolean __voicecall_core_check_incoming_handle(gpointer puser_data); + +/* For Debug Information, Call Engine Event name string constant */ +char *gszcall_engine_event[VC_ENGINE_EVENT_MAX] = { + "VC_CALL_INCOM", + "VC_CALL_OUTGOING", + "VC_CALL_OUTGOING_ORIG", + "VC_CALL_OUTGOING_CLOCK_NOTI", + "VC_CALL_OUTGOING_ALERT", + "VC_CALL_CONNECTED", + "VC_CALL_NORMAL_END", + "VC_CALL_INCOM_END", + "VC_CALL_INCOM_DROPPED", + "VC_CALL_REJECTED_END", + "VC_CALL_OUTGOING_END", /* 10 */ + + "VC_CALL_OUTGOING_ABORTED", + "VC_CALL_DTMF_ACK", + "VC_CALL_AUTO_REDIAL_CHECK", + "VC_CALL_ANSWER_CNF", + "VC_CALL_SS_HELD", + "VC_CALL_SS_RETREIVED", + "VC_CALL_SS_SWAP", + "VC_CALL_SS_SETUP_CONF", + "VC_CALL_SS_SPLIT_CONF", + "VC_CALL_SS_TRANSFERRED", /* 20 */ + + "VC_CALL_SS_CONNECT_LINE_IND", + "VC_CALL_IND_FORWARD", + "VC_CALL_IND_ACTIVATE", + "VC_CALL_IND_HOLD", + "VC_CALL_IND_TRANSFER", + "VC_CALL_IND_SETUPCONFERENCE", + "VC_CALL_IND_BARRING", + "VC_CALL_IND_WAITING", + "VC_CALL_IND_CUGINFO", + "VC_CALL_IND_SSNOTIFY", /* 30 */ + + "VC_CALL_IND_CALLINGNAMEINFO", + "VC_CALL_IND_REDIRECT_CNF", + "VC_CALL_IND_ACTIVATECCBS_CNF", + "VC_CALL_IND_ACTIVATECCBS_USERINFO", + "VC_CALL_IND_AOC", + "VC_ERROR_OCCURED", + "VC_ACTION_INCOM_FORCE", + "VC_ACTION_SAT_REQUEST", + "VC_ACTION_SAT_RESPONSE", + "VC_ACTION_CALL_END_HELD_RETREIVED", /* 40 */ + + "VC_ACTION_NO_ACTIVE_TASK", + "VC_CALL_GET_VOLUME_RESP" +}; + +static gboolean __vc_core_is_answermode_enabled_from_testmode(void); +static gboolean __vc_core_is_answermode_enabled(void); +static void __voicecall_core_start_auto_answer(call_vc_core_state_t *pcall_core, gboolean isTestMode); +static void __voicecall_core_cancel_auto_answer(call_vc_core_state_t *pcall_core); +/*static void __voicecall_core_check_headset_earjack_status(call_vc_core_state_t *pcall_core);*/ +static void __vc_core_set_auto_redial_count(call_vc_core_state_t *pcall_core, int auto_redial_count); +/*static gboolean __voicecall_core_callstatus_set_timer_cb(gpointer puser_data);*/ + +static int __voicecall_core_get_string_id_by_errorcode(int error_code); +static void __voicecall_core_mocall_reset_engine_state(voicecall_engine_t *pcall_engine); +static gboolean __voicecall_core_is_redial_cuase(int end_cause); + +static gboolean __voicecall_core_queue_dtmf_string(call_vc_core_state_t *pcall_core, char *dtmf_string, gboolean bsat_dtmf); +static gboolean __voicecall_core_handle_dtmf_ack(call_vc_core_state_t *pcall_core, gboolean success); + +/** + * This function puts the currently active call on hold + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_hold_call(voicecall_engine_t *pcall_engine) +{ + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + error_code = _vc_core_engine_hold_call(pcall_engine); + + CALL_ENG_DEBUG(ENG_DEBUG, "Error Code : %d", error_code); + return (ERROR_VOICECALL_NONE == error_code || ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS == error_code) ? TRUE : FALSE; +} + +/** + * This function retreives the currently held call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_retrieve_call(voicecall_engine_t *pcall_engine) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + error_code = _vc_core_engine_retrieve_call(pcall_engine); + + CALL_ENG_DEBUG(ENG_DEBUG, "Error Code : %d", error_code); + return (ERROR_VOICECALL_NONE == error_code || ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS == error_code) ? TRUE : FALSE; +} + +/** + * This function swaps the currently available active and held calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_swap_calls(voicecall_engine_t *pcall_engine) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + error_code = _vc_core_engine_swap_calls(pcall_engine); + + CALL_ENG_DEBUG(ENG_DEBUG, "Error Code : %d", error_code); + return (ERROR_VOICECALL_NONE == error_code || ERROR_VOICECALL_PREVIOUS_REQUEST_IN_PROGRESS == error_code) ? TRUE : FALSE; +} + +/** + * This function clears the MO Call Details + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_clear_mo_call(voicecall_engine_t *pcall_engine) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1)) ? TRUE : FALSE; +} + +/** + * This function clears the Connected Call Details + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] call_handle Handle of the Connected Call to be cleared + */ +inline gboolean voicecall_core_clear_connected_call(voicecall_engine_t *pcall_engine, int call_handle) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_finalize_call(pcall_engine, VC_CONNECTED_CALL, call_handle)) ? TRUE : FALSE; +} + +/** + * This function changes the voicecall engine's state + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] eng_state Engine State to be changed + */ +inline gboolean voicecall_core_change_engine_state(voicecall_engine_t *pcall_engine, int eng_state) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_change_engine_iostate(pcall_engine, eng_state)) ? TRUE : FALSE; +} + +/** + * This function ends an Outgoing Call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_end_mo_call(voicecall_engine_t *pcall_engine) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_OUTGOING_CALL)) ? TRUE : FALSE; +} + +/** + * This function retreives the Voicecall Engine's State + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] io_state Voicecall Engine InOut State + */ +inline gboolean voicecall_core_get_engine_state(voicecall_engine_t *pcall_engine, int *eng_state) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_engine_iostate(pcall_engine, eng_state)) ? TRUE : FALSE; +} + +/** + * This function checks whether any call exists + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] active_calls TRUE - If active call exists or FALSE If active call doesn't exists + * @param[out] held_calls TRUE - If held call exists or FALSE If held call doesn't exists + */ +inline gboolean voicecall_core_is_call_exists(voicecall_engine_t *pcall_engine, gboolean *active_calls, gboolean *held_calls) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_isexists_any_call(pcall_engine, active_calls, held_calls)) ? TRUE : FALSE; +} + +/** + * This function checks whether incoming call exists or not + * + * @return Returns TRUE if incoming call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_incoming_call_exists(voicecall_engine_t *pcall_engine) +{ + gboolean bmtcall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_INCOMING_CALL, &bmtcall_exists); + return bmtcall_exists; +} + +/** + * This function checks whether outgoing call exists or not + * + * @return Returns TRUE if outgoing call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_outgoing_call_exists(voicecall_engine_t *pcall_engine) +{ + gboolean bmocall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_OUTGOING_CALL, &bmocall_exists); + return bmocall_exists; +} + +/** + * This function checks whether any connexcted call exists or not + * + * @return Returns TRUE if connected call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_connected_call_exist(voicecall_engine_t *pcall_engine) +{ + gboolean bcall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_CONNECTED_CALL, &bcall_exists); + return bcall_exists; +} + +/** + * This function checks whether any connexcted call exists or not in the given group + * + * @return Returns TRUE if connected call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] group_index Group Index to be searhced + */ +inline gboolean voicecall_core_is_connected_call_exist_in_group(voicecall_engine_t *pcall_engine, int group_index) +{ + gboolean bcall_exists = FALSE; + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + if (ERROR_VOICECALL_NONE != _vc_core_engine_group_isexists_connected_call_ingroup(pcall_engine, group_index, &bcall_exists)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Error_code %d", error_code); + + } + + return bcall_exists; +} + +/** + * This function checks whether any call exists + * + * @return Returns TRUE if connected call exists or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_any_call_exists(voicecall_engine_t *pcall_engine) +{ + gboolean bcall_exists = FALSE; + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_INCOMING_CALL, &bcall_exists); + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call = [%d]", bcall_exists); + + if (FALSE == bcall_exists) { + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_OUTGOING_CALL, &bcall_exists); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing Call = [%d]", bcall_exists); + + if (FALSE == bcall_exists) { + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_CONNECTED_CALL, &bcall_exists); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call = [%d]", bcall_exists); + + return bcall_exists; +} + +/** + * This function retreives the totally number of availavle calls including connected, MO and MT Calls + * + * @return Returns TRUE if success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] ptotal_call_member number of avialble calls + */ +inline gboolean voicecall_core_get_total_call_member(voicecall_engine_t *pcall_engine, int *ptotal_call_member) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_member_count(pcall_engine, ptotal_call_member)) ? TRUE : FALSE; +} + +/** + * This function checks whether voicecall engine's call agent is idle or not + * + * @return Returns TRUE if call agent is idle or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + */ +inline gboolean voicecall_core_is_callagent_idle(voicecall_engine_t *pcall_engine) +{ + gboolean bcallagent_idle = FALSE; + + _vc_core_engine_status_is_engine_busy(pcall_engine, &bcallagent_idle); + CALL_ENG_DEBUG(ENG_DEBUG, "Call Agent Busy State : %d", bcallagent_idle); + + return !bcallagent_idle; +} + +/** +* This function checks the current call status and engine status +* +* @return TRUE, if connected calls available and engine is in idle, FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine +*/ +inline gboolean voicecall_core_is_incall_request_possible(voicecall_engine_t *pcall_engine) +{ + int eng_state = VC_INOUT_STATE_NONE; + int member_num_0 = 0; + int member_num_1 = 0; + + _vc_core_engine_group_get_connected_member_count(pcall_engine, 0, &member_num_0); + _vc_core_engine_group_get_connected_member_count(pcall_engine, 1, &member_num_1); + voicecall_core_get_engine_state(pcall_engine, &eng_state); + if (!(voicecall_core_is_callagent_idle(pcall_engine) && ((member_num_1 + member_num_0) > 0) + && (eng_state == VC_INOUT_STATE_NONE))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine Busy, Cannot complete Request,mem_0:%d,mem_1:%d,eng_state:%d ", member_num_0, member_num_1, eng_state); + return FALSE; + } + + return TRUE; +} + +/** + * This function changes the modem call audio path + * + * @return TRUE sucess, FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] audio_path audio path to be changed + */ +inline gboolean voicecall_core_change_audio_path(voicecall_engine_t *pcall_engine, voicecall_audio_path_t audio_path, gboolean bextra_volume) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_change_audio_path(pcall_engine, audio_path, bextra_volume)) ? TRUE : FALSE; +} + +/** + * This function sets the voice call audio volume for the given audio path type + * + * @return returns TRUE in success , FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] tapi_snd_path audio path for the volume to be set + * @param[in] vol_level volume level + */ +inline gboolean voicecall_core_set_audio_volume(voicecall_engine_t *pcall_engine, voicecall_audio_path_t tapi_snd_path, int vol_level) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_set_audio_volume(pcall_engine, tapi_snd_path, (voicecall_audio_volume_t) vol_level)) ? TRUE : FALSE; +} + +/** + * This function retreives the voice call audio volume for the given audio path type + * + * @return returns TRUE in success , FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] audio_path_type audio path for the volume to be retreived + */ +inline gboolean voicecall_core_get_audio_volume(voicecall_engine_t *pcall_engine, voicecall_audio_path_t audio_path_type) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_get_audio_volume(pcall_engine, audio_path_type)) ? TRUE : FALSE; +} + +/** + * This function set the voice call audio mute status + * + * @return returns TRUE in success , FALSE otherwise + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] bvoice_mute mute status + */ +inline gboolean voicecall_core_set_audio_mute_status(voicecall_engine_t *pcall_engine, gboolean bvoice_mute) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_set_audio_mute(pcall_engine, bvoice_mute)) ? TRUE : FALSE; +} + +/** + * This function retreives the first active call among the available active calls + * + * @return Returns TRUE if success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[out] pcall_handle call handle of the active call + */ +inline gboolean voicecall_core_get_zuhause(voicecall_engine_t *pcall_engine, gboolean * bzuhause) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_is_zuhause_area(pcall_engine, bzuhause)) ? TRUE : FALSE; +} + +/** + * This function retreives the Voicecall Engine's State + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] call_handle Call handle of the call for which the call object is retrieved + * @param[out] pcall_object Pointer to the retrived call object info + */ +inline gboolean voicecall_core_get_call_object(voicecall_engine_t *pcall_engine, int call_handle, call_vc_call_objectinfo_t * pcall_object) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_object(pcall_engine, call_handle, pcall_object)) ? TRUE : FALSE; +} + +/** + * This function sends response to sat engine + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_engine Handle to voicecall engine + * @param[in] sat_rqst_resp_type sat rqst/resp type to be set by the client + * @param[in] sat_response_type sat response type to be sent to sat + */ +inline gboolean voicecall_core_send_sat_response(voicecall_engine_t *pcall_engine, voicecall_engine_sat_rqst_resp_type sat_rqst_resp_type, call_vc_sat_reponse_type_t sat_response_type) +{ + voicecall_error_t error_code = 0; + error_code = _vc_core_engine_send_sat_response(pcall_engine, sat_rqst_resp_type, sat_response_type); + CALL_ENG_DEBUG(ENG_DEBUG, "error_code:[%d] ", error_code); + return (ERROR_VOICECALL_NONE == error_code) ? TRUE : FALSE; +} + +/** + * This function retreives the number of active call members + * + * @return Returns TRUE if success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[out] pactive_member_num number of active call members available + */ +inline gboolean voicecall_core_get_active_call_member(call_vc_core_state_t *pcall_core, int *pactive_member_num) +{ + *pactive_member_num = 0; + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_member_info(pcall_core->pcall_engine, VC_ACTIVE_CALL, pactive_member_num)) ? TRUE : FALSE; +} + +/** + * This function checks whether possible to make conference call + * + * @return Returns TRUE If Conference call can be made or FALSE if not + * @param[in] papp_document Handle to Application Document + */ +inline gboolean voicecall_core_is_conf_call_possible(call_vc_core_state_t *pcall_core) +{ + gboolean bconf_call = FALSE; + + _vc_core_engine_status_is_conf_call_possible(pcall_core->pcall_engine, &bconf_call); + + return bconf_call; +} + +/** + * This function checks whether possible to transfer call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + */ +inline gboolean voicecall_core_is_transfer_call_possible(call_vc_core_state_t *pcall_core) +{ + gboolean btransfer_call = FALSE; + + _vc_core_engine_status_is_transfer_call_possible(pcall_core->pcall_engine, &btransfer_call); + + return btransfer_call; +} + +/** + * This function checks whether the given code is a valid Supplementary Services Code + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] pszInput Number to be verified + */ +inline gboolean voicecall_core_is_valid_sscode(call_vc_core_state_t *pcall_core, const char *pszInput) +{ + gboolean bsscode = FALSE; + + _vc_core_engine_status_isvalid_ss_code(pcall_core->pcall_engine, pszInput, &bsscode); + + return bsscode; +} + +#ifdef _CPHS_DEFINED_ +/** + * This function gets the cphs status from the engine + * + * @return TRUE if queried status is enabled, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + * @param[in] csp_service csp service to be queried + */ +inline gboolean voicecall_core_get_cphs_csp_status(call_vc_core_state_t *pcall_core, voicecall_cphs_csp_service csp_service) +{ + gboolean bcsp_status = FALSE; + + _vc_core_engine_status_get_cphs_csp_status(pcall_core->pcall_engine, csp_service, &bcsp_status); + return bcsp_status; +} +#endif + +/** + * This function informs the Voicecall Engine that current SS operation has been completed + * + * @return Returns TRUE if all the calls are ended or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +inline gboolean voicecall_core_set_check_ss_on_end(call_vc_core_state_t *pcall_core) +{ + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_set_end_flag(pcall_core->pcall_engine, VC_RETREIVE_CALL_ON_MOCALL_END)) ? TRUE : FALSE; +} + +/** + * This function extracts vaild phone number + * + * @return void + * @param[in] + */ +inline void voicecall_core_extract_phone_number(const char *source_tel_number, char *phone_number, const int buf_size) +{ + _vc_core_engine_extract_phone_number(source_tel_number, phone_number, buf_size); +} + +/************************ +* inline function END +**************************/ +void voicecall_core_set_status(call_vc_core_state_t *pcall_core, call_vc_core_flags_t core_flags, gboolean bstatus) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "core flags:[0x%x], Set status:[%d] ", core_flags, bstatus); + + if (CALL_VC_CORE_FLAG_NONE == core_flags) { + /*Set the document flag to defaults */ + pcall_core->core_status = CALL_VC_CORE_FLAG_NONE; + return; + } + + if (TRUE == bstatus) { + /*Set Flag */ + pcall_core->core_status |= core_flags; + } else { + /*Remove bit field only if it is already set/ otherwise ignore it */ + if ((pcall_core->core_status & core_flags) == core_flags) { + pcall_core->core_status = (pcall_core->core_status ^ core_flags); + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "After SET, core_status:[0x%x]", pcall_core->core_status); + +} + +gboolean voicecall_core_get_status(call_vc_core_state_t *pcall_core, call_vc_core_flags_t core_flags) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "core_flags:[0x%x]", core_flags); + CALL_ENG_DEBUG(ENG_DEBUG, "Before Get, core_status:[0x%x]", pcall_core->core_status); + + if ((pcall_core->core_status & core_flags) == core_flags) { + CALL_ENG_DEBUG(ENG_DEBUG, "Flag [0x%x] is available", core_flags); + return TRUE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Flag [0x%x] is not available", core_flags); + return FALSE; +} + +static gboolean __voicecall_core_set_path_timer_cb(gpointer puser_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + VOICECALL_RETURN_FALSE_IF_FAIL(puser_data != NULL); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + voicecall_snd_change_path(pcall_core->papp_snd); + + if (g_set_path_timer_handler > 0) { + g_source_remove(g_set_path_timer_handler); + g_set_path_timer_handler = 0; + } + + return FALSE; +} + +static gboolean __voicecall_core_handle_call_end_on_silent_reject(call_vc_core_state_t *pcall_core, int call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + if ((pcall_core->mtcall_silent_reject_handle == call_handle)) { + /*Call rejected due to lawmo lock */ + if (FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + /*Connected calls need to be checked, Connected emergency calls may be avaialble */ + voicecall_core_set_to_default(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Connected calls available"); + _vc_core_engine_status_dump_call_details(pcall_core->pcall_engine); + } + pcall_core->mtcall_silent_reject_handle = -1; + return TRUE; + } + + return FALSE; +} + +static gboolean __voicecall_core_silent_reject_mt(call_vc_core_state_t *pcall_core, int call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + pcall_core->mtcall_silent_reject_handle = call_handle; + + /*Reject the call */ + error_code = _vc_core_engine_reject_call(pcall_core->pcall_engine, FALSE); + + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_ERR, "_vc_core_engine_reject_call Failed, error_code = %d", error_code); + } + + return TRUE; +} + +static void __voicecall_core_processing_mo_cancel(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + int total_call_member; + vc_engine_outgoing_end_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (TRUE == voicecall_snd_is_signal_playing(pcall_core->papp_snd)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Signal is playing, skipping cancel timer"); + return; + } + + /* Destroy the END screen which is displayed */ + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = pcall_core->mo_end_call_handle; + event_data.end_cause_type = pcall_core->mo_end_cause_type; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_UI_DESTROY, (void *)&event_data); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, pcall_core->mo_end_call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_engine); + + __voicecall_core_mocall_reset_engine_state(pcall_engine); + + /* __vcui_app_view_mo_finish_call() start */ + voicecall_snd_stop_signal(pcall_core->papp_snd); + + voicecall_core_get_total_call_member(pcall_engine, &total_call_member); + /* If No Connected Calls End the UI */ + if (total_call_member == 0) { + /*Reset voice call core to default values */ + voicecall_core_set_to_default(pcall_core); + } else { + voicecall_snd_change_path(pcall_core->papp_snd); + } + /* __vcui_app_view_mo_finish_call() end */ +} + +static void __voicecall_core_mocall_signal_tone_play_end_cb(gpointer pdata) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)pdata; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No More calls, resetting path"); + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + } + + if (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Updating MO UI on signal end"); + __voicecall_core_processing_mo_cancel(pcall_core); + } +} + +static gboolean __voicecall_core_check_signal_tone_from_endcause(int end_cause) +{ + int play_signal_tone = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, "End end_cause_type: %d", end_cause); + + switch (end_cause) { + case VC_ENDCAUSE_USER_BUSY: + case VC_ENDCAUSE_USER_DOESNOT_RESPOND: + case VC_ENDCAUSE_USER_UNAVAILABLE: + case VC_ENDCAUSE_NO_ANSWER: + { + play_signal_tone = TRUE; + } + break; + default: + break; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Play Signal Tone, FALSE - (0), TRUE - (1): %d", play_signal_tone); + return play_signal_tone; +} + +static void __voicecall_core_handle_normal_end(call_vc_core_state_t *pcall_core, int call_handle, voice_call_end_cause_type_t end_cause) +{ + int total_call_member = 0; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + /*Set the callstatus to OFF before processing the End Event Animation */ + if (TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) { + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } else if ((TRUE == voicecall_core_is_incoming_call_exists(pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_engine))) { + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + } else { + /*Reset the Path Actual path must be closed when modem path closed!! */ + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + } + + if (FALSE == voicecall_snd_play_effect_tone(pcall_core->papp_snd, VOICE_CALL_SND_EFFECT_CALL_DISCONNECT)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Effect tone not played, check and play busy tone"); + } + if ((FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) + && (TRUE == voicecall_core_is_incoming_call_exists(pcall_engine)) + && (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_SPEAKER)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call: TRUE,Connected Call:FALSE, Speaker: TRUE. So change path to normal"); + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + voicecall_snd_change_path(pcall_core->papp_snd); + } + + voicecall_core_clear_connected_call(pcall_engine, call_handle); + + voicecall_core_get_total_call_member(pcall_engine, &total_call_member); + if (0 == total_call_member) { + voicecall_core_set_to_default(pcall_core); + } + +} + +static gboolean __voicecall_core_handle_rejected_call_end(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_snd_stop_alert(pcall_core->papp_snd); + + /*Send Incoming call End Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No More Calls"); + voicecall_core_set_to_default(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Path for Voicecall"); + /*Change Path to Call, when the incomging call is cancelled. */ + voicecall_snd_change_path(pcall_core->papp_snd); + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Reject Call End Processed"); + return TRUE; +} + +static void __voicecall_core_handle_outgoingcall_end(call_vc_core_state_t *pcall_core, int call_handle, voice_call_end_cause_type_t end_cause_type) +{ + gboolean bsignal_play = FALSE; + gboolean btone_play = FALSE; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + vc_engine_outgoing_end_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle=:%d,end_cause=%d", call_handle, end_cause_type); + pcall_core->mo_end_call_handle = call_handle; + pcall_core->mo_end_cause_type = end_cause_type; + + /* Display the END screen */ + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = pcall_core->mo_end_call_handle; + event_data.end_cause_type = pcall_core->mo_end_cause_type; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_TO_UI, (void *)&event_data); + + if (VC_ENDCAUSE_FIXED_DIALING_NUMBER_ONLY == end_cause_type) { + CALL_ENG_DEBUG(ENG_DEBUG, "Fixed dialing number only, not playing signal tone"); + } else if (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) { + gboolean play_signal = FALSE; + vc_engine_outgoing_end_signal_play_type event_data; + /*Play Signal Tone only when the connected calls are not exists */ + play_signal = __voicecall_core_check_signal_tone_from_endcause(end_cause_type); + + if (play_signal == TRUE) { + voicecall_snd_set_signal_type(pcall_core->papp_snd, VOICE_CALL_SIGNAL_USER_BUSY_TONE); + voicecall_snd_play_signal(pcall_core->papp_snd, __voicecall_core_mocall_signal_tone_play_end_cb, pcall_core); + bsignal_play = TRUE; + } else { + voicecall_snd_play_tone(pcall_core->papp_snd, __voicecall_core_mocall_signal_tone_play_end_cb, pcall_core); + btone_play = TRUE; + } + /* just end string updated */ + + /* normal outgoing end */ + CALL_ENG_DEBUG(ENG_DEBUG, "It is normal outgoing end case."); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d],end_cause_type:[%d]", call_handle, pcall_core->mo_end_cause_type); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + event_data.end_cause_type = pcall_core->mo_end_cause_type; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_SIGNAL_PLAY_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Connected call exists, not playing signal tone"); + } + + if (TRUE == voicecall_core_is_connected_call_exist(pcall_engine)) { + /* Set phone status value */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } else if ((FALSE == bsignal_play) && (FALSE == btone_play)) { + /*Reset the Path Actual path must be closed when modem path closed!! */ + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + } else { + /* nothing to do. */ + } + __voicecall_core_processing_mo_cancel(pcall_core); +} + +static gboolean __voicecall_core_handle_incoming_call_end(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_snd_stop_alert(pcall_core->papp_snd); + + /*Send Incoming call End Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + + if (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No More Calls"); + voicecall_core_set_to_default(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Path for Voicecall"); + /*Change Path to Call, when the incomging call is cancelled. */ + voicecall_snd_change_path(pcall_core->papp_snd); + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming Call End Processed"); + return TRUE; +} + +static gboolean voicecall_core_cb(int event, int param1, int param2, void *param3, void *puser_data) +{ + CALL_ENG_DEBUG(ENG_WARN, " Engine Event: %s(%d)", gszcall_engine_event[event], event); + + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_VC_DUMP_CALLDETAILS(&pcall_engine->call_manager); + + switch (event) { + case VC_CALL_INCOM: + { + int call_handle = param1; + char tel_number[VC_PHONE_NUMBER_LENGTH_MAX]; + gboolean restricted = FALSE; + gboolean bcalling_namemode = FALSE; + gboolean brejected_number = FALSE; + vc_engine_incoming_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "tel_number:[%s]", (char *)param3); + _vc_core_util_strcpy(tel_number, sizeof(tel_number), (char *)param3); + + /*Changing the path to headset/phone will be decided by user accept action. + This will apply for second incoming call, if the first call was accpeted by BT Headset + and the path was changed to BT headset, then the path will be in headset for second call by default + So reset the headset flag for second call so the path will not + be automatically changed to headset, it will be decided by user action. + If this requirement fits only for first incoming call then comment this fix. */ + /* vcui_app_snd_set_status(papp_document->papp_snd, VCUI_APP_AUDIO_HEADSET, FALSE); */ + + /*Will be set based on user action */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + if (_vc_core_util_check_video_call_status() == TRUE) { + /*Check for Lawmo Lock */ + if (TRUE == __voicecall_core_silent_reject_mt(pcall_core, call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call rejected due to silent reject"); + return TRUE; + } + } + + /* Check for Restricted Mode */ + _vc_core_engine_status_isrestricted_call(pcall_engine, call_handle, &restricted); + _vc_core_engine_status_get_calling_namemode(pcall_engine, call_handle, &bcalling_namemode); + if (TRUE == bcalling_namemode) { + call_vc_call_objectinfo_t call_object; + + voicecall_core_get_call_object(pcall_engine, call_handle, &call_object); + CALL_ENG_DEBUG(ENG_DEBUG, "call_object.calling_name:[%s]", call_object.calling_name); + + _vc_core_util_strcpy(event_data.call_name, sizeof(event_data.call_name), call_object.calling_name); + } else if (TRUE == restricted) { + call_vc_call_objectinfo_t call_object; + + voicecall_core_get_call_object(pcall_engine, call_handle, &call_object); + CALL_ENG_DEBUG(ENG_DEBUG, "call_object.name_mode:[%s]", call_object.name_mode); + + event_data.brestricted = TRUE; + if (call_object.name_mode == CALL_VC_NAME_MODE_PAYPHONE) { + event_data.bpayphone = TRUE; + } else { + event_data.bpayphone = FALSE; + + } + event_data.contact_index = -1; + event_data.phone_type = -1; + } else { + voicecall_contact_info_t ct_info; + memset(&ct_info, 0, sizeof(ct_info)); + ct_info.ct_index = -1; + + voicecall_service_contact_info_by_number(tel_number, &ct_info); + + _vc_core_util_strcpy(event_data.call_name, sizeof(event_data.call_name), ct_info.display_name); + _vc_core_util_strcpy(event_data.call_file_path, sizeof(event_data.call_file_path), ct_info.caller_id_path); + event_data.contact_index = ct_info.ct_index; + event_data.phone_type = ct_info.phone_type; + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + char ringtone_path[VOICE_CALL_SND_RINGTONE_PATH_LEN] = { 0, }; + memset(papp_snd->ring_tone, 0, VOICE_CALL_SND_RINGTONE_PATH_LEN); + if (TRUE == g_file_test(ct_info.ring_tone, G_FILE_TEST_EXISTS)) { + snprintf(ringtone_path, sizeof(ringtone_path), "file://%s", ct_info.ring_tone); + _vc_core_util_strcpy(papp_snd->ring_tone, VOICE_CALL_SND_RINGTONE_PATH_LEN, ringtone_path); + CALL_ENG_DEBUG(ENG_DEBUG, "From Contact Ringtone: %s", papp_snd->ring_tone); + } else { + /*Get Ringtone File From Settings */ + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid Ringtone from Contact: %s", ct_info.ring_tone); + } + } + + event_data.call_handle = call_handle; + event_data.brejected = brejected_number; + event_data.bfwded = param2; + + _vc_core_util_strcpy(event_data.call_num, sizeof(event_data.call_num), tel_number); + + /* in case of rejected number, sound & callstatus is not processed */ + if (event_data.brejected + ) { + /* Send to ui */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_INCOM_TO_UI, (void *)&event_data); + } else { + /* Register sound session for notifying to other applications before calling app_pause() */ + voicecall_snd_register_cm(pcall_core->papp_snd); + + /* Send to ui */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_INCOM_TO_UI, (void *)&event_data); + { + gboolean benabledTestMode = FALSE; + + /* Set vconf status with CONNECTING */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + + /*Send Incoming Call Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_INCOM, call_handle, tel_number); + + benabledTestMode = __vc_core_is_answermode_enabled_from_testmode(); + if ((TRUE == __vc_core_is_answermode_enabled()) || (TRUE == benabledTestMode)) { + CALL_ENG_DEBUG(ENG_DEBUG, "auto answer mode is enabled."); + __voicecall_core_start_auto_answer(pcall_core, benabledTestMode); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Preparing Sound "); + voicecall_snd_prepare_alert(pcall_core->papp_snd, call_handle); + voicecall_snd_play_alert(pcall_core->papp_snd); + + pcall_core->mtcall_handle = call_handle; + g_idle_add(__voicecall_core_check_incoming_handle, pcall_core); + } + } + } + break; + + case VC_CALL_OUTGOING: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Start: Call handle %d", call_handle); + } + break; + + case VC_CALL_OUTGOING_ORIG: + { + int call_handle = param1; + vc_engine_outgoing_orig_type event_data; + call_vc_call_objectinfo_t callobject_info; + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + if (pcall_core->call_setup_info.call_type == VC_CALL_ORIG_TYPE_EMERGENCY) { + event_data.bemergency = TRUE; + } else { + event_data.bemergency = FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, bemergency:[%d]", event_data.call_handle, event_data.bemergency); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + voicecall_core_get_call_object(pcall_engine, call_handle, &callobject_info); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_ORIG, call_handle, callobject_info.tel_number); + } + break; + + case VC_CALL_OUTGOING_CLOCK_NOTI: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Clock noti"); + g_set_path_timer_handler = g_timeout_add(SET_PATH_TIMER_VALUE, __voicecall_core_set_path_timer_cb, pcall_core); + } + break; + + case VC_CALL_OUTGOING_ALERT: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + event_data.call_handle = call_handle; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ALERT_TO_UI, (void *)&event_data); + + /*Play Connected Effect Tone */ + CALL_ENG_KPI("voicecall_snd_play_effect_tone start"); + if (FALSE == voicecall_snd_play_effect_tone(pcall_core->papp_snd, VOICE_CALL_SND_EFFECT_CALL_CONNECT)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_snd_play_effect_tone return value is FALSE"); + voicecall_snd_change_path(pcall_core->papp_snd); + } + CALL_ENG_KPI("voicecall_snd_play_effect_tone done"); + + CALL_ENG_KPI("_vc_bt_send_response_to_bt start"); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_REMOTE_RINGING, call_handle, NULL); + CALL_ENG_KPI("_vc_bt_send_response_to_bt done"); + } + break; + + case VC_CALL_ANSWER_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Answer confirm"); + if (_vc_core_cm_get_call_member_count(&(pcall_engine->call_manager)) == 1) { + CALL_ENG_DEBUG(ENG_DEBUG, "single call state"); + voicecall_snd_change_path(pcall_core->papp_snd); + } + } + break; + + case VC_CALL_CONNECTED: + { + int call_handle = param1; + vc_engine_connected_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Connected Call Handle : %d", call_handle); + + event_data.call_handle = call_handle; + event_data.bt_status = (int)_vc_bt_get_bt_status(); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_CONNECTED_TO_UI, (void *)&event_data); + voicecall_snd_stop_alert(pcall_core->papp_snd); /* To stop alert in case of call accept by AT command */ + voicecall_snd_change_path(pcall_core->papp_snd); + + /* Set phone-status value */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_ACTIVE); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_CONNECT, call_handle, NULL); + + /*Call is accepted, reset the flag */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + +#ifdef PDIAL_SEND_DTMF + g_idle_add(voicecall_core_send_phone_number_dtmf, (gpointer) call_handle); +#endif + + } + break; + + case VC_CALL_NORMAL_END: + { + int call_handle = param1; + voice_call_end_cause_type_t end_cause = param2; + vc_engine_normal_end_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Normal End Call Handle : %d,End Cause=%d", call_handle, end_cause); + + event_data.call_handle = call_handle; + event_data.end_cause_type = end_cause; + + /* Display the end UI */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_NORMAL_END_TO_UI, (void *)&event_data); + + /* Play the sound */ + __voicecall_core_handle_normal_end(pcall_core, call_handle, end_cause); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + } + break; + + case VC_CALL_INCOM_END: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call End Call Handle: %d", call_handle); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + if (TRUE == __voicecall_core_handle_call_end_on_silent_reject(pcall_core, call_handle)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call end processed for silent reject:"); + return TRUE; + } + + event_data.call_handle = call_handle; + + __voicecall_core_handle_incoming_call_end(pcall_core, call_handle); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_INCOM_END_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_INCOM_DROPPED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Check it. Not used"); + } + break; + + case VC_CALL_REJECTED_END: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + CALL_ENG_DEBUG(ENG_DEBUG, "Rejected call End Call Handle: %d", call_handle); + + event_data.call_handle = call_handle; + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + __voicecall_core_handle_rejected_call_end(pcall_core, call_handle); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_REJECTED_END_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_OUTGOING_END: + { + int call_handle = param1; + int end_cause_type = param2; + int bauto_redial = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "end cause type :[%d]", end_cause_type); + CALL_ENG_DEBUG(ENG_DEBUG, "bauto_redial:[%d]", bauto_redial); + + if ((TRUE == bauto_redial) && (FALSE == voicecall_core_is_connected_call_exist(pcall_engine)) + && (FALSE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_MOCALL_END_BY_USER)) + && (TRUE == __voicecall_core_is_redial_cuase(end_cause_type))) { + /* auto redial */ + CALL_ENG_DEBUG(ENG_DEBUG, "It is auto redial case."); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + + vc_engine_outgoing_end_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + event_data.end_cause_type = end_cause_type; + event_data.bauto_redial = TRUE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_END_TO_UI, (void *)&event_data); + } else { + __voicecall_core_handle_outgoingcall_end(pcall_core, call_handle, end_cause_type); + } + } + break; + + case VC_CALL_OUTGOING_ABORTED: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ABORTED_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_DTMF_ACK: + { + gboolean bsuccess = param1; + CALL_ENG_DEBUG(ENG_DEBUG, "bsuccess:[%d]", bsuccess); + __voicecall_core_handle_dtmf_ack(pcall_core, bsuccess); + } + break; + + case VC_CALL_AUTO_REDIAL_CHECK: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Check it. Not used"); + } + break; + + case VC_CALL_SS_HELD: + { + int call_handle = param1; + vc_engine_common_type event_data; + + /* held popup shold not be displayed on outgoing popup */ + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_HELD_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_HOLD, call_handle, NULL); + } + break; + + case VC_CALL_SS_RETREIVED: + { + int call_handle = param1; + vc_engine_common_type event_data; + + /* held popup shold not be displayed on outgoing popup */ + memset(&event_data, 0, sizeof(event_data)); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_RETREIVED_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_RETRIEVE, call_handle, NULL); + } + break; + + case VC_CALL_SS_SWAP: + { + vc_engine_common_type event_data; + + int call_handle = param1; + + memset(&event_data, 0, sizeof(event_data)); + + /* Show Call Swapped Message Box */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_SWAP_TO_UI, (void *)&event_data); + + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_SWAPPED, call_handle, NULL); + } + break; + + case VC_CALL_SS_SETUP_CONF: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + /* Show Call Joined Message Box */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_SETUP_CONF_TO_UI, (void *)&event_data); + + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_JOINED, 0, NULL); + } + break; + + case VC_CALL_SS_SPLIT_CONF: + { + vc_engine_common_with_handle_type event_data; + int call_handle = param1; + CALL_ENG_DEBUG(ENG_DEBUG, "The handle to be split is %d", call_handle); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + + /* Show Private Call Message Box */ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_SPLIT_CONF_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_SS_TRANSFERRED: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_SS_TRANSFERRED_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_SS_CONNECT_LINE_IND: + { + int call_handle = param1; + char *pconnected_number = (char *)param3; + vc_engine_msg_box_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle : [%d]", call_handle); + + /* check whether Call Info for recevice Call Handle exists or not. */ + + if ((pconnected_number != NULL) && (strlen(pconnected_number) > 0)) { + CALL_ENG_DEBUG(ENG_DEBUG, "connected line ind : [%s]", pconnected_number); + + memset(&event_data, 0, sizeof(event_data)); + + event_data.string_id = IDS_CALL_POP_CALL_IS_DIVERTED; + _vc_core_util_strcpy(event_data.diverted_num, sizeof(event_data.diverted_num), pconnected_number); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No conneccted info"); + } + + } + break; + + case VC_CALL_IND_FORWARD: + { + vc_engine_ind_forward_type event_data; + int fwd_type = param1; + + memset(&event_data, 0, sizeof(event_data)); + event_data.fwd_type = fwd_type; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_FORWARD_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_ACTIVATE: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_ACTIVATE_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_HOLD: + { + vc_engine_common_type event_data; + int call_handle = param1; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_HOLD_TO_UI, (void *)&event_data); + + /*Send Event to Blue Tooth */ + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_HOLD, call_handle, NULL); + } + break; + + case VC_CALL_IND_TRANSFER: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_SETUPCONFERENCE: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_BARRING: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_BARRING_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_WAITING: + { + vc_engine_common_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_WAITING_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_CUGINFO: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_SSNOTIFY: + { + vc_engine_ind_ssnotify_type event_data; + int ss_type = param1; + + memset(&event_data, 0, sizeof(event_data)); + event_data.ss_type = ss_type; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_IND_SSNOTIFY_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_IND_CALLINGNAMEINFO: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + case VC_CALL_IND_ACTIVATECCBS_CNF: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_ACTIVATECCBS_USERINFO: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not used."); + } + break; + + case VC_CALL_IND_AOC: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not yet."); + } + break; + + case VC_ERROR_OCCURED: + { + int error_code = param1; + + CALL_ENG_DEBUG(ENG_DEBUG, "error code:[%d]", error_code); + switch (error_code) { + case ERROR_VOICECALL_INVALID_DTMF_CHAR: + case ERROR_VOICECALL_DTMF_FAILED: + { + vc_engine_error_occured_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.error_code = error_code; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ERROR_OCCURED_TO_UI, (void *)&event_data); + } + break; + default: + { + vc_engine_msg_box_type event_data; + int string_id = -1; + + string_id = __voicecall_core_get_string_id_by_errorcode(error_code); + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = __voicecall_core_get_string_id_by_errorcode(error_code); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + break; + } + } + break; + + case VC_ACTION_INCOM_FORCE: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle); + + memset(&event_data, 0, sizeof(event_data)); + event_data.call_handle = call_handle; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACTION_INCOM_FORCE_TO_UI, (void *)&event_data); + } + break; + + case VC_ACTION_SAT_REQUEST: + { + if (SAT_RQST_SETUP_CALL == param1) { + voicecall_sat_callinfo_t *psat_callinfo = (voicecall_sat_callinfo_t *) param3; + vc_engine_outgoing_type event_data; + + if (psat_callinfo == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "psat_callinfo is NULL.."); + assert(psat_callinfo != NULL); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "VC_ACTION_SAT_REQUEST is received by Voice call."); + pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_SAT; + pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_SAT; + + /*Phone Number */ + _vc_core_util_strcpy(pcall_core->call_setup_info.source_tel_number, VC_PHONE_NUMBER_LENGTH_MAX, psat_callinfo->call_number); + _vc_core_engine_extract_phone_number(pcall_core->call_setup_info.source_tel_number, pcall_core->call_setup_info.tel_number, VC_PHONE_NUMBER_LENGTH_MAX); + + /*Name */ + CALL_ENG_DEBUG(ENG_ERR, "psat_callinfo->disp_text:[%s]", psat_callinfo->disp_text); + + memset(&event_data, 0, sizeof(event_data)); + _vc_core_util_strcpy(event_data.call_num, sizeof(event_data.call_num), pcall_core->call_setup_info.tel_number); + event_data.contact_index = -1; + event_data.phone_type = -1; + _vc_core_util_strcpy(event_data.call_num, sizeof(event_data.call_num), psat_callinfo->disp_text); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + /*Get Icon Information */ + if (TRUE == psat_callinfo->bicon_present) { /*bicon_present is TRUE when SAT icon info available and when GCF is enabled */ + CALL_ENG_DEBUG(ENG_ERR, "SAT icon available."); + } + + /* Prepare and Make Call with the Give Information */ + if (FALSE == voicecall_core_setup_call(pcall_core, FALSE)) { + /*Send Response to SAT Engine */ + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + } + } else if (SAT_RQST_SEND_DTMF == param1) { + voicecall_sat_callinfo_t *psat_callinfo = (voicecall_sat_callinfo_t *) param3; + + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Send DTMF Number: %s, hidden: %d", psat_callinfo->call_number, psat_callinfo->bsat_hidden); + __voicecall_core_queue_dtmf_string(pcall_core, psat_callinfo->call_number, TRUE); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Invalid SAT Request Type: %d", param2); + } + } + break; + + case VC_ACTION_SAT_RESPONSE: + { + if (SAT_RESP_SETUP_CALL == param1) { + voicecall_sat_callinfo_t *psat_call_info = (voicecall_sat_callinfo_t *) param3; + + CALL_ENG_DEBUG(ENG_DEBUG, "sat_mo_call_ctrl_res = %d", psat_call_info->sat_mo_call_ctrl_res); + + if (CALL_NOT_ALLOWED == psat_call_info->sat_mo_call_ctrl_res) { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else if (CALL_ALLOWED_WITH_MOD == psat_call_info->sat_mo_call_ctrl_res) { + CALL_ENG_DEBUG(ENG_DEBUG, "psat_call_info->call_number = [%s]", psat_call_info->call_number); + CALL_ENG_DEBUG(ENG_DEBUG, "psat_call_info->disp_text = [%s]", psat_call_info->disp_text); +#ifdef _OLD_SAT_ + mocall_index = vcui_app_doc_get_mocall_index(papp_document); + + /*Update MO CALL Display Data with the SAT modified info */ + if (mocall_index != -1) { + vcui_app_call_display_data_t display_data; + vcui_app_call_display_data_t new_display_data; + vcui_app_view_mo_state_t *pmo_state = NULL; + + if (FALSE == vcui_app_cdm_get_display_object_byindex(&papp_document->call_display_manager, mocall_index, &display_data)) { + return TRUE; + } + + vcui_app_cdm_clear_display_object(&new_display_data); + + /*Copy all must parameters required for MO Call */ + new_display_data.call_handle = display_data.call_handle; + new_display_data.call_index = display_data.call_index; + new_display_data.call_type = display_data.call_type; + new_display_data.start_time = display_data.start_time; + new_display_data.used = display_data.used; + + if (strlen(psat_call_info->call_number) > 0) { + vcui_app_util_strcpy(new_display_data.source_tel_number, sizeof(new_display_data.source_tel_number), psat_call_info->call_number); + _vc_core_engine_extract_phone_number(new_display_data.source_tel_number, new_display_data.tel_number, VC_PHONE_NUMBER_LENGTH_MAX); + } + + if (strlen(psat_call_info->disp_text) > 0) { + vcui_app_util_strcpy(new_display_data.name, sizeof(new_display_data.name), psat_call_info->disp_text); + } + + /*todo, Check whether contact search need to be done for the SAT modified number */ + + /*Set the newly modified data to the CDM */ + vcui_app_cdm_set_display_object(pdisplay_mgr, &new_display_data); + + /*Update the MO View */ + pmo_state = (vcui_app_view_mo_state_t *) calloc(1, sizeof(vcui_app_view_mo_state_t)); + pmo_state->mo_call_state = VCUI_MO_CALL_STATE_UPDATE; + + /* Update MO Call Screen View to update the connection status */ + dv_view_manager_update_view(dv_document_get_view_manager(DV_DOCUMENT(papp_document)), VCUI_APP_VIEWID_MO_VIEW, VCUI_APP_UPD_MO_SET_STATE, pmo_state); + + } else { + VCUI_DEBUG(VCUI_LOG_ERR, "Invalid Mo Call Index: %d", mocall_index); + } +#endif + } else if (CALL_CHANGED_TO_SS == psat_call_info->sat_mo_call_ctrl_res) { + /*Issue notification to Launch SS */ + } + } + } + break; + + case VC_ACTION_CALL_END_HELD_RETREIVED: + { + int call_handle = param1; + vc_engine_common_with_handle_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "call handle:[%d]", call_handle); + + memset(&event_data, 0, sizeof(event_data)); + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACTION_CALL_END_HELD_RETREIVED_TO_UI, (void *)&event_data); + } + break; + + case VC_ACTION_NO_ACTIVE_TASK: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Not yet."); + } + break; + + case VC_CALL_GET_VOLUME_RESP: + { + vc_engine_vol_resp_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Current Voicecall (TAPI)Volume Type %d, Current Volume Level: %d", param1, param2); + + memset(&event_data, 0, sizeof(event_data)); + event_data.vol_alert_type = VOICE_CALL_VOL_TYPE_VOICE; + event_data.vol_level = param2; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_NOTI_WBAMR: + { + vc_engine_wbamr_status_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Current WBAmr status %d", param1); + + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = param1; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_NOTI_WBAMR_TO_UI, (void *)&event_data); + } + break; + + case VC_CALL_FLIGHT_MODE_DISABLED: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Flight mode is disabled"); + } + break; + + case VC_CALL_FLIGHT_MODE_ERROR: + { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_FM_REQUEST_ERR; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, " Engine Event ID : %d not handled", event); + break; + } + + CALL_VC_DUMP_CALLDETAILS(&pcall_engine->call_manager); + + CALL_ENG_DEBUG(ENG_DEBUG, " Ended."); + + return TRUE; +} + +/** + * This function converts Error Code to string id. + * + * @return string id + * @param[in] error_code error code to be used to display the message content + */ +static int __voicecall_core_get_string_id_by_errorcode(int error_code) +{ + int string_id = -1; + switch (error_code) { + case ERROR_VOICECALL_DTMF_FAILED: + string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + break; + + case ERROR_VOICECALL_CALL_NOT_ALLOWED: + string_id = IDS_CALL_POP_CALLNOTCALLOWED; + break; + + case ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM: + string_id = IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE; + break; + + case ERROR_VOICECALL_EMERGENCY_CALLS_ONLY: + string_id = IDS_CALL_POP_CALLING_EMERG_ONLY; + break; + + case ERROR_VOICECALL_PHONE_NOT_INITIALIZED: + string_id = IDS_CALL_POP_PHONE_NOT_INITIALISED; + break; + + case ERROR_VOICECALL_ANSWER_FAILED: + string_id = IDS_CALL_POP_CALLFAILED; + break; + + case ERROR_VOICECALL_HOLD_REJECTED: + case ERROR_VOICECALL_HOLD_FAILED: + string_id = IDS_CALL_POP_HOLD_FAILED; + break; + + case ERROR_VOICECALL_ACTIVATE_REJECTED: + case ERROR_VOICECALL_RETREIVE_FAILED: + string_id = IDS_CALL_POP_UNABLE_TO_RETRIEVE; + break; + + case ERROR_VOICECALL_SWAP_REJECTED: + case ERROR_VOICECALL_SWAP_FAILED: + string_id = IDS_CALL_POP_SWAP_FAILED; + break; + + case ERROR_VOICECALL_SPLIT_CONF_FAILED: + string_id = IDS_CALL_POP_SPLIT_FAILED; + break; + + case ERROR_VOICECALL_SETUP_CONF_FAILED: + string_id = IDS_CALL_POP_JOIN_FAILED; + break; + + case ERROR_VOICECALL_TRANSFER_FAILED: + string_id = IDS_CALL_POP_TRANSFER_FAILED; + break; + + case ERROR_VOICECALL_SWAP_NOT_SUPPORTED: + string_id = IDS_CALL_POP_SWAP_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_HOLD_NOT_SUPPORTED: + string_id = IDS_CALL_POP_HOLD_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_RETREIVE_NOT_SUPPORTED: + string_id = IDS_CALL_POP_UNHOLD_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_SETUP_CONF_NOT_SUPPORTED: + string_id = IDS_CALL_POP_JOIN_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_SPLIT_CONF_NOT_SUPPORTED: + string_id = IDS_CALL_POP_SPLIT_NOT_SUPPORTED; + break; + case ERROR_VOICECALL_TRANSFER_NOT_SUPPORTED: + string_id = IDS_CALL_POP_TRANSFER_NOT_SUPPORTED; + break; + + case ERROR_VOICECALL_INCOMPLETE: + string_id = IDS_CALL_POP_INCOMPLETE; + break; + + case ERROR_VOICECALL_UNAVAILABLE: + string_id = IDS_CALL_POP_UNAVAILABLE; + break; + + case ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED: + string_id = IDS_CALL_POP_CALLFAILED; + break; + + case ERROR_VOICECALL_INVALID_CALL_TYPE: + case ERROR_VOICECALL_INVALID_TELEPHONE_NUMBER: + string_id = IDS_CALL_POP_CAUSE_WRONG_NUMBER; + break; + case ERROR_VOICE_SERVICE_BLOCKED: + string_id = IDS_COM_BODY_VOICE_SERVICES_BLOCKED; + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, " Invalid Error Code: %x", error_code); + string_id = IDS_CALL_POP_CALLFAILED; + break; + } + return string_id; +} + +/** + * This function de-initialize voicecall core external-resource. + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] pcallback_func callback function + */ +int voicecall_core_deinit(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_deinit"); + + /* Reset BT */ + _vc_bt_status_deinit(pcall_core); + + _voicecall_dvc_control_lcd_state(VC_LCD_ON_UNLOCK); + + return TRUE; +} + + +gboolean voicecall_core_set_to_default(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + if (pcall_core->pcall_engine == NULL) + return FALSE; + + /*Set Engine states to default */ + _vc_core_engine_set_to_default_values(pcall_core->pcall_engine); + + /*Initialize MO Call Setup Info */ + pcall_core->call_setup_info.mo_call_index = VC_TAPI_INVALID_CALLHANDLE; + pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + + pcall_core->call_setup_info.mo_call_index = VC_TAPI_INVALID_CALLHANDLE; + pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + memset(pcall_core->call_setup_info.tel_number, 0, sizeof(pcall_core->call_setup_info.tel_number)); + + pcall_core->mo_redial_timer = -1; + __vc_core_set_auto_redial_count(pcall_core, 0); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_NONE, TRUE); + + pcall_core->bt_connected = _vc_bt_get_bt_status(); + if (FALSE == pcall_core->bt_connected) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "BT connected, Not changing the sound status"); + } + + if (vconf_set_int(VCONFKEY_FACTORY_CALL_CONNECT_STATE, VCONFKEY_FACTORY_CALL_DISCONNECTED)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_set_int failed."); + } + + /* Reset Sound manager */ + voicecall_snd_unregister_cm(pcall_core->papp_snd); + + /* off clock status*/ + _vc_core_engine_off_sound_clock_status(pcall_core->pcall_engine); + + return TRUE; +} + +static void __voicecall_core_mocall_reset_engine_state(voicecall_engine_t *pcall_engine) +{ + int eng_state = VC_INOUT_STATE_NONE; + + voicecall_core_get_engine_state(pcall_engine, &eng_state); + + CALL_ENG_DEBUG(ENG_DEBUG, "current engine state is: %d", eng_state); + + if ((eng_state > VC_INOUT_STATE_OUTGOING_START) && (eng_state < VC_INOUT_STATE_OUTGOING_END)) { + voicecall_core_change_engine_state(pcall_engine, VC_INOUT_STATE_NONE); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine state is already changed, current engine state is: %d", eng_state); + CALL_VC_DUMP_CALLDETAILS(&pcall_engine->call_manager); + } +} + +/** + * This function initialize voicecall core + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] pcallback_func callback function + */ +int voicecall_core_init(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = NULL; + + if (ERROR_VOICECALL_NONE != _vc_core_engine_init(&pcall_engine, (voicecall_cb) voicecall_core_cb, pcall_core)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Engine Init Failed"); + return FALSE; + } + + if (FALSE == voicecall_snd_init(pcall_core, &pcall_core->papp_snd)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_snd_init() failed"); + return FALSE; + } + /*Store Voicecall Engine Handle */ + pcall_core->pcall_engine = pcall_engine; + + _vc_bt_status_init(pcall_core); + + _voicecall_dvc_earjack_init(pcall_core); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_NONE, TRUE); + return TRUE; +} + +/** + * This function prepares a voice call with the given data + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] bemergency emergency call or not from dialer + * @param[in] + */ +gboolean voicecall_core_setup_call(call_vc_core_state_t *pcall_core, gboolean bemergency) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + voicecall_setup_info_t setupcall_info = { 0, }; + voicecall_error_t error_code = -1; + gboolean bemergency_call = FALSE; + gboolean bmocall_exists = FALSE; + gboolean bmtcall_exists = FALSE; + int nw_status = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SOS_CALL_ONLY, bemergency); + + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_OUTGOING_CALL, &bmocall_exists); + if (TRUE == bmocall_exists) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO call is in progress..."); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } + + /*Ignore the MO Call, if already an Incoming call is in progress, MT Call is given high priority */ + _vc_core_engine_status_isexists_call_bytype(pcall_engine, VC_INCOMING_CALL, &bmtcall_exists); + if (TRUE == bmtcall_exists) { + CALL_ENG_DEBUG(ENG_DEBUG, "MT call is in progress"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } + + if (TRUE == _vc_core_util_check_video_call_status()) { + CALL_ENG_DEBUG(ENG_DEBUG, "Voice call is not allowed during video call..."); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + + if (TRUE == _vc_core_util_get_SAP_status()) { + CALL_ENG_DEBUG(ENG_DEBUG, "SAP is on"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_UNAVAILABLE; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + + /*Prpare a call with the Voicecall Engine */ + setupcall_info.call_type = pcall_core->call_setup_info.call_type; + _vc_core_util_strcpy(setupcall_info.source_tel_number, sizeof(setupcall_info.source_tel_number), pcall_core->call_setup_info.source_tel_number); + _vc_core_util_strcpy(setupcall_info.tel_number, sizeof(setupcall_info.tel_number), pcall_core->call_setup_info.tel_number); + + /*Get CUG Details */ + _vc_core_util_get_cug_info(&setupcall_info); + + /*Get Identity Mode */ + _vc_core_util_get_identity_mode(&setupcall_info); + + CALL_ENG_DEBUG(ENG_DEBUG, "identity_mode = [%d], tel_number = [%s]", setupcall_info.identity_mode, setupcall_info.tel_number); + + error_code = _vc_core_engine_prepare_call(pcall_engine, &setupcall_info); + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_prepare_call failed, error code: %d", error_code); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = __voicecall_core_get_string_id_by_errorcode(error_code); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + return FALSE; + } + + /*Check flight mode enabled/disabled*/ + int flight_mode = -1; + if (voicecall_service_get_flight_mode_setting(&flight_mode)) { + CALL_ENG_DEBUG(ENG_DEBUG, "flight_mode: %d", flight_mode); + + if (flight_mode) { + /*Show popup in UI - call not allowed*/ + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_FM_DISABLE_MSG; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return VCALL_ENGINE_API_FLIGHT_MODE_DISABLE_REQUEST; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "flight-mode API failed..."); + } + + pcall_core->call_setup_info.call_type = setupcall_info.call_type; + CALL_ENG_DEBUG(ENG_DEBUG, "call_type:[%d]", pcall_core->call_setup_info.call_type); + + pcall_core->call_setup_info.mo_call_index = setupcall_info.mo_call_index; + + /* Check for Following Conditions , only if not emergency Number */ + CALL_ENG_DEBUG(ENG_DEBUG, "mo_call_index = [%d]", setupcall_info.mo_call_index); + error_code = _vc_core_engine_status_check_emergency_byindex(pcall_engine, setupcall_info.mo_call_index, &bemergency_call); + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency Check Error code: %d", error_code); + } + + /*Check PwLock */ + if (TRUE == _vc_core_util_is_pwlock()) { + CALL_ENG_DEBUG(ENG_DEBUG, "PwLock is enabled."); + if (bemergency_call == FALSE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Only emergency call is possible."); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_CALLING_EMERG_ONLY; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + } + + /*Check for the following cases, if the call is not emergency call */ + if (FALSE == bemergency_call) { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + /* Check for NW Status and Emergency Mode */ + if (FALSE == _vc_core_util_get_nw_status(&nw_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Can't get a network status..."); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + + event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } else { + if ((VCONFKEY_TELEPHONY_SVCTYPE_NONE == nw_status) || (VCONFKEY_TELEPHONY_SVCTYPE_NOSVC == nw_status) || (VCONFKEY_TELEPHONY_SVCTYPE_SEARCH == nw_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Service: Call not Allowed"); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } else if ((VCONFKEY_TELEPHONY_SVCTYPE_EMERGENCY == nw_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Emergency mode: Emergency call only..."); + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + event_data.string_id = IDS_CALL_POP_CALLING_EMERG_ONLY; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + return FALSE; + } else { + /* ok. */ + } + + } + + /*Check for voicemail number if it is not an emergency call */ + } + + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Setup OVer"); + + if (_vc_bt_get_bt_status() == TRUE) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + } + + voicecall_core_make_call(pcall_core); + + return TRUE; +} + +/** + * This function makes the actual voicecall prepared by the #voicecall_core_setup_call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_make_call(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + int call_handle = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*Make Actual Call with Voicecall Engine */ + error_code = _vc_core_engine_make_call(pcall_engine, pcall_core->call_setup_info.mo_call_index, &call_handle); + if (ERROR_VOICECALL_NONE != error_code) { + vc_engine_msg_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + + _vc_core_engine_finalize_call(pcall_engine, VC_OUTGOING_CALL, -1); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_make_call Failed: Error_Code: %d..", error_code); + + switch (error_code) { + case ERROR_VOICECALL_TAPI_CAUSE_CALL_FAILED: + event_data.string_id = IDS_CALL_POP_CALLFAILED; + break; + + case ERROR_VOICECALL_CALL_IMPOSSIBLE_NOSIM_NOEMERGNUM: + event_data.string_id = IDS_CALL_POP_CALLFAILED; + break; + + default: + event_data.string_id = IDS_CALL_BODY_CALLENDED; + break; + } + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle After Setup Call %d.", call_handle); + + voicecall_snd_register_cm(pcall_core->papp_snd); + + /* Set phonestatus value */ + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + + return TRUE; +} + +/** + * This function processed sat setup call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] +*/ +gboolean voicecall_core_process_sat_setup_call(vcall_engine_sat_setup_call_info_t *sat_setup_call_info) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + TelSatSetupCallIndCallData_t *SatSetupCallIndCallInfo = NULL; + + SatSetupCallIndCallInfo = (TelSatSetupCallIndCallData_t *) calloc(1, sizeof(TelSatSetupCallIndCallData_t)); + if (NULL == SatSetupCallIndCallInfo) + return FALSE; + + SatSetupCallIndCallInfo->commandId = sat_setup_call_info->command_id; + SatSetupCallIndCallInfo->calltype = sat_setup_call_info->command_qualifier; + SatSetupCallIndCallInfo->dispText.stringLen = strlen(sat_setup_call_info->disp_text); + memcpy(SatSetupCallIndCallInfo->dispText.string, sat_setup_call_info->disp_text, strlen(sat_setup_call_info->disp_text)); + + SatSetupCallIndCallInfo->callNumber.stringLen = strlen(sat_setup_call_info->call_num); + memcpy(SatSetupCallIndCallInfo->callNumber.string, sat_setup_call_info->call_num, strlen(sat_setup_call_info->call_num)); + + SatSetupCallIndCallInfo->duration = sat_setup_call_info->duration; + + _vc_core_engine_handle_sat_events_cb(SatSetupCallIndCallInfo, NULL); + + if (SatSetupCallIndCallInfo) { + free(SatSetupCallIndCallInfo); + SatSetupCallIndCallInfo = NULL; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End.."); + + return TRUE; +} + +/** + * This function processed incoming call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] +*/ +gboolean voicecall_core_process_incoming_call(call_vc_core_incoming_info_t *incoming_call_info) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + TelCallIncomingCallInfo_t *IncomingCallInfo = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, " number is : [%s]", incoming_call_info->call_num); + + IncomingCallInfo = (TelCallIncomingCallInfo_t *) malloc(sizeof(TelCallIncomingCallInfo_t)); + if (NULL == IncomingCallInfo) + return FALSE; + memset(IncomingCallInfo, 0, sizeof(TelCallIncomingCallInfo_t)); + + IncomingCallInfo->CallHandle = incoming_call_info->call_handle; + IncomingCallInfo->CallType = incoming_call_info->call_type; + IncomingCallInfo->CliPresentationIndicator = incoming_call_info->cli_presentation_indicator; + _vc_core_util_strcpy(IncomingCallInfo->szCallingPartyNumber, sizeof(IncomingCallInfo->szCallingPartyNumber), incoming_call_info->call_num); + IncomingCallInfo->CallingNameInfo.NameMode = incoming_call_info->calling_name_mode; + _vc_core_util_strcpy(IncomingCallInfo->CallingNameInfo.szNameData, sizeof(IncomingCallInfo->CallingNameInfo.szNameData), incoming_call_info->calling_name); + _vc_core_util_strcpy(IncomingCallInfo->RedirectInfo.szRedirectedNumber, sizeof(IncomingCallInfo->RedirectInfo.szRedirectedNumber), incoming_call_info->redirected_number); + _vc_core_util_strcpy(IncomingCallInfo->RedirectInfo.szRedirectSubAddress, sizeof(IncomingCallInfo->RedirectInfo.szRedirectSubAddress), incoming_call_info->redirected_sub_address); + IncomingCallInfo->CliCause = incoming_call_info->cli_cause; + IncomingCallInfo->fwded = incoming_call_info->bfwded; + IncomingCallInfo->ActiveLine = incoming_call_info->active_line; + + _vc_core_engine_handle_incoming_tapi_events(IncomingCallInfo, NULL); + + if (IncomingCallInfo) { + free(IncomingCallInfo); + IncomingCallInfo = NULL; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "End.."); + + return TRUE; +} + +/** + * This function answers an incoming call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] +*/ +gboolean voicecall_core_answer_call(call_vc_core_state_t *pcall_core, gboolean auto_accept) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*First Stop the Incoming alert */ + voicecall_snd_stop_alert(pcall_core->papp_snd); + + __voicecall_core_cancel_auto_answer(pcall_core); + + _vc_core_engine_status_isexists_any_call(pcall_engine, &active_calls, &held_calls); + CALL_ENG_DEBUG(ENG_DEBUG, "active_calls=%d, held_calls=%d", active_calls, held_calls); + + if (TRUE == active_calls && TRUE == held_calls) { + /* Both Active and held calls available, so show Accept Call Choice Box */ + vc_engine_accept_choice_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.choice = VC_CALL_ACCEPT_2; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI, (void *)&event_data); + + return TRUE; + } else if (TRUE == active_calls) { + /*If Auto Accpet is FALSE, show popup for manual accept */ + if (FALSE == auto_accept) { + /* Active calls available, so show Accept Call Choice Box */ + vc_engine_accept_choice_box_type event_data; + + memset(&event_data, 0, sizeof(event_data)); + event_data.choice = VC_CALL_ACCEPT_1; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI, (void *)&event_data); + } else { + voicecall_core_answer_call_bytype(pcall_core, VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT); + } + return TRUE; + } else if (TRUE == held_calls) { + /* vcui_app_view_mtcall_destroy(papp_document); */ + } + + /* Normal Call Scenario */ + voicecall_core_answer_call_bytype(pcall_core, VC_ANSWER_NORMAL); + + return TRUE; +} + +/** + * This function answers an incoming call according to the given type + * + * @return Returns TRUE -if answer is sucess, FALSE - otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_answer_call_bytype(call_vc_core_state_t *pcall_core, voicecall_answer_type_t answer_type) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "answer type: %d", answer_type); + + /*First Stop the Incoming alert */ + voicecall_snd_stop_alert(pcall_core->papp_snd); + __voicecall_core_cancel_auto_answer(pcall_core); + + error_code = _vc_core_engine_answer_call(pcall_engine, answer_type); + + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_ERR, "_vc_core_engine_answer_call Failed : %d", error_code); + return FALSE; + } + + return TRUE; +} + +/** +* This function rejects an incoming call +* +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_core Handle to voicecall core +* @param[in] bUDUB TRUE - set UDUB, FALSE - reject call +*/ +gboolean voicecall_core_reject_mt(call_vc_core_state_t *pcall_core, gboolean bUDUB) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*Incoming call rejected, reset the accept by flag */ + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_ACCEPT_BY_BT, FALSE); + + /* Stop Incmoing Call Alert */ + voicecall_snd_stop_alert(papp_snd); + + __voicecall_core_cancel_auto_answer(pcall_core); + + CALL_ENG_DEBUG(ENG_DEBUG, "bUDUB = %d", bUDUB); + error_code = _vc_core_engine_reject_call(pcall_engine, bUDUB); + + if (ERROR_VOICECALL_NONE != error_code) { + CALL_ENG_DEBUG(ENG_ERR, "_vc_core_engine_reject_call Failed, error_code = %ud", error_code); + return FALSE; + } + + return TRUE; + +} + +/** + * This function ends the call by state + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_call(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ACTIVE_OR_HELD_CALLS)) ? TRUE : FALSE; +} + +/** + * This function ends the call corresponding to the given call handle + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] call_handle handle of the call to be ended + */ +gboolean voicecall_core_end_call_by_handle(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call_byhandle(pcall_engine, call_handle)) ? TRUE : FALSE; +} + +/** + * This function ends all available calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_all_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ALL_CALLS)) ? TRUE : FALSE; +} + +/** + * This function ends all available active calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_all_active_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ALL_ACTIVE_CALLS)) ? TRUE : FALSE; +} + +/** + * This function ends all available held calls + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_end_all_held_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_end_call(pcall_engine, VC_END_ALL_HELD_CALLS)) ? TRUE : FALSE; +} + +/** + * This function cancel outgoing call + * + * @return Returns TRUE -if answer is sucess, FALSE - otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_cancel_call(call_vc_core_state_t *pcall_core) +{ + int io_state = 0; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + voicecall_call_type_bysetup_t call_setup_by = VC_CALL_SETUP_BY_NORMAL; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /*Get Call Setup by Information */ + call_setup_by = pcall_core->call_setup_info.call_setup_by; + + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + + switch (io_state) { + case VC_INOUT_STATE_OUTGOING_WAIT_HOLD: + { + int call_handle = -1; + + if (VC_CALL_SETUP_BY_SAT == call_setup_by) { + _vc_core_engine_send_sat_response(pcall_engine, SAT_RQST_SETUP_CALL, CALL_VC_ME_CLEAR_DOWN_BEFORE_CONN); + } + + /* Clear the MO Call, since the call is not dialed yet */ + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_engine); + + _vc_core_engine_change_engine_iostate(pcall_engine, VC_INOUT_STATE_OUTGOING_ABORTED); + } + return TRUE; + + case VC_INOUT_STATE_OUTGOING_WAIT_ORIG: + case VC_INOUT_STATE_OUTGOING_WAIT_ALERT: + case VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED: + { + /*To retrieve the held call automatically once the mo call is ended, if held is call is available */ + _vc_core_engine_status_set_end_flag(pcall_engine, VC_RETREIVE_CALL_ON_MOCALL_END); + + /* release the call , since it is dialed and waiting for connecting */ + if (FALSE == voicecall_core_end_mo_call(pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call Release Failed"); + } else { + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_MOCALL_END_BY_USER, TRUE); + _vc_core_engine_change_engine_iostate(pcall_engine, VC_INOUT_STATE_OUTGOING_WAIT_RELEASE); + } + } + return TRUE; + + case VC_INOUT_STATE_OUTGOING_WAIT_RELEASE: + { + /*Call already released */ + CALL_ENG_DEBUG(ENG_DEBUG, "MO Call has been released already"); + } + return TRUE; + + case VC_INOUT_STATE_OUTGOING_SHOW_REDIALCAUSE: + case VC_INOUT_STATE_OUTGOING_ABORTED: + case VC_INOUT_STATE_OUTGOING_WAIT_REDIAL: + { + int call_handle = -1; + + if (VC_CALL_SETUP_BY_SAT == call_setup_by) { + _vc_core_engine_send_sat_response(pcall_engine, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); + } + + /*Stop Signal Play */ + voicecall_snd_stop_signal(pcall_core->papp_snd); + + __voicecall_core_mocall_reset_engine_state(pcall_engine); + + _vc_core_engine_status_get_call_handle_bytype(pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_engine); + + } + return TRUE; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this IO State: %d", io_state); + break; + } + + return FALSE; +} + +/** + * This function process hold/retrive/swap conntected call + * + * @return Returns TRUE -if answer is sucess, FALSE - otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_process_hold_call(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + gboolean active_calls = FALSE; + gboolean held_calls = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (TRUE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_SOS_CALL_ONLY)) { + CALL_ENG_DEBUG(ENG_DEBUG, "SOS Call... Ignore this button..."); + return TRUE; + } + + if (FALSE == voicecall_core_is_incall_request_possible(pcall_engine)) { + return TRUE; + } + + voicecall_core_is_call_exists(pcall_engine, &active_calls, &held_calls); + CALL_ENG_DEBUG(ENG_DEBUG, "active calls: %d, held calls: %d", active_calls, held_calls); + + if (active_calls && held_calls) { + + /*Both Calls available, swap the calls */ + if (FALSE == voicecall_core_swap_calls(pcall_engine)) { + return FALSE; + } + } else if (active_calls) { + /*Only activa call available, hold the call */ + if (FALSE == voicecall_core_hold_call(pcall_engine)) { + return FALSE; + } + } else if (held_calls) { + /*Only Held call available, retrieve the call */ + if (FALSE == voicecall_core_retrieve_call(pcall_engine)) { + return FALSE; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "no call exists!"); + return FALSE; + } + + return TRUE; +} + +/** + * This function sets up a conference call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_setup_conference(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_setup_conference(pcall_engine)) ? TRUE : FALSE; +} + +/** + * This function splits the call corressponding to the given call handle and makes a private call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] call_handle Call to be splitted from the conference call + */ +gboolean voicecall_core_make_private_call(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_private_call(pcall_engine, call_handle)) ? TRUE : FALSE; +} + +/** + * This function transfers the call from active call to the held call + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_transfer_calls(call_vc_core_state_t *pcall_core) +{ + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + return (ERROR_VOICECALL_NONE == _vc_core_engine_transfer_calls(pcall_engine)) ? TRUE : FALSE; +} + +/** + * This function sends a dtmf string + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] dtmf_string dtmf string to be sent + */ +gboolean voicecall_core_send_dtmf(call_vc_core_state_t *pcall_core, char *dtmf_string) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + CALL_ENG_DEBUG(ENG_DEBUG, "dtmf string: %s", dtmf_string); + + pcall_core->bdtmf_queue = FALSE; + error_code = _vc_core_engine_send_dtmf(pcall_core->pcall_engine, dtmf_string); + return (ERROR_VOICECALL_NONE == error_code) ? TRUE : FALSE; +} + +/** +* This function stops sound alert in case of reject with msg +* +* @return Returns TRUE on success or FALSE on failure +* @param[in] pcall_core Handle to voicecall core +*/ +gboolean voicecall_core_stop_alert(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + /* Stop Incmoing Call Alert */ + voicecall_snd_stop_alert(pcall_core->papp_snd); + + return TRUE; +} + +inline gboolean voicecall_core_get_mo_call_handle(call_vc_core_state_t *pcall_core, int *pcall_handle) +{ + *pcall_handle = -1; + return (ERROR_VOICECALL_NONE == _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, pcall_handle)) ? TRUE : FALSE; +} + +inline int voicecall_core_get_auto_redial_count(call_vc_core_state_t *pcall_core) +{ + return pcall_core->auto_redial_count; +} + +void __vc_core_set_auto_redial_count(call_vc_core_state_t *pcall_core, int auto_redial_count) +{ + pcall_core->auto_redial_count = auto_redial_count; +} + +gboolean voicecall_core_start_redial(call_vc_core_state_t *pcall_core, int manual_redial) +{ + int auto_redial_status = FALSE; + int redial_count = 1; + int call_handle = -1; + int total_call_member = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + CALL_ENG_DEBUG(ENG_DEBUG, "auto_redial_status:[%d]", auto_redial_status); + + redial_count = voicecall_core_get_auto_redial_count(pcall_core); + + redial_count++; + + /* + bmanual_redial == TRUE : Redial is made by User, No need to check the auto redial status and count + auto_redial_status == 1: Auto Redial for GCF case, auto redial count must be checked + */ + if ((1 == manual_redial) || (redial_count < MO_REDIAL_COUNT_MAX)) { + CALL_ENG_DEBUG(ENG_DEBUG, "redial_count = %d", redial_count); + + /*Start Redial Timer */ + if (1 == redial_count) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO_REDIAL_TIMER_INTERVAL_FIRST"); + pcall_core->mo_redial_timer = g_timeout_add(MO_REDIAL_TIMER_INTERVAL_FIRST, mo_redial_timer_cb, pcall_core); + } else if ((redial_count > 1) && (redial_count < 5)) { + CALL_ENG_DEBUG(ENG_DEBUG, "MO_REDIAL_TIMER_INTERVAL_SECOND"); + pcall_core->mo_redial_timer = g_timeout_add(MO_REDIAL_TIMER_INTERVAL_SECOND, mo_redial_timer_cb, pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "MO_REDIAL_TIMER_INTERVAL_THIRD"); + pcall_core->mo_redial_timer = g_timeout_add(MO_REDIAL_TIMER_INTERVAL_THIRD, mo_redial_timer_cb, pcall_core); + } + + voicecall_core_change_engine_state(pcall_core->pcall_engine, VC_INOUT_STATE_OUTGOING_WAIT_REDIAL); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "You dont need to redial close the MO Call Things"); + + /* __vcui_app_view_mo_canceltimer_cb() */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_core->pcall_engine); + + __voicecall_core_mocall_reset_engine_state(pcall_core->pcall_engine); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + + voicecall_snd_stop_signal(pcall_core->papp_snd); + + /* If No Connected Calls End the UI */ + if (total_call_member == 0) { + /*Reset voice call core to default values */ + voicecall_core_set_to_default(pcall_core); + } else { + voicecall_snd_change_path(pcall_core->papp_snd); + } + + } + + return TRUE; +} + +inline gboolean voicecall_core_prepare_redial(call_vc_core_state_t *pcall_core, int call_handle) +{ + voicecall_error_t error_code = ERROR_VOICECALL_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + error_code = _vc_core_engine_prepare_redial(pcall_core->pcall_engine, call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_engine_prepare_redial returned : %d", error_code); + + return (ERROR_VOICECALL_NONE == error_code) ? TRUE : FALSE; +} + +gboolean mo_redial_timer_cb(void *data) +{ + int call_handle = -1; + int redial_count; + + CALL_ENG_DEBUG(ENG_DEBUG, "mo_redial_timer_cb"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)data; + voicecall_core_get_mo_call_handle(pcall_core, &call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "call handle is %d", call_handle); + + redial_count = voicecall_core_get_auto_redial_count(pcall_core); + redial_count++; + __vc_core_set_auto_redial_count(pcall_core, redial_count); + + CALL_ENG_DEBUG(ENG_DEBUG, "redial_count:[%d]", redial_count); + + voicecall_core_prepare_redial(pcall_core, call_handle); + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_prepare_redial done."); + + voicecall_core_make_call(pcall_core); + return FALSE; +} + +gboolean voicecall_core_stop_redial(call_vc_core_state_t *pcall_core) +{ + int call_handle = -1, total_call_member = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "coming inside voicecall_core_stop_redial"); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + + /*Cancel the Redial Timer */ + if (pcall_core->mo_redial_timer != -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "mo_redial_timer removing.."); + g_source_remove(pcall_core->mo_redial_timer); + pcall_core->mo_redial_timer = -1; + } + + /* __vcui_app_view_mo_canceltimer_cb() */ + _vc_core_engine_status_get_call_handle_bytype(pcall_core->pcall_engine, VC_OUTGOING_CALL, &call_handle); + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_CALL_END, call_handle, NULL); + + __vc_core_set_auto_redial_count(pcall_core, 0); + voicecall_core_clear_mo_call(pcall_core->pcall_engine); + + __voicecall_core_mocall_reset_engine_state(pcall_core->pcall_engine); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + + voicecall_snd_stop_signal(pcall_core->papp_snd); + + /* If No Connected Calls End the UI */ + if (total_call_member == 0) { + /*Reset voice call core to default values */ + voicecall_core_set_to_default(pcall_core); + } else { + voicecall_snd_change_path(pcall_core->papp_snd); + } + return TRUE; + +} + +static gboolean __voicecall_core_auto_answer_timer_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + if (pcall_core->auto_answer_timer > 0) { + g_source_remove(pcall_core->auto_answer_timer); + pcall_core->auto_answer_timer = 0; + } + + /*Check for Incoming call and then answer the call */ + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Answered"); + voicecall_core_answer_call(pcall_core, TRUE); + } + + return FALSE; +} + +#if 0 +static gboolean __voicecall_core_callstatus_set_timer_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + if (pcall_core->callstatus_timer > 0) { + g_source_remove(pcall_core->callstatus_timer); + pcall_core->callstatus_timer = 0; + } + + _vc_core_util_set_call_status(VCONFKEY_CALL_VOICE_CONNECTING); + + return FALSE; +} +#endif + +static gboolean __voicecall_core_auto_answer_idle_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + int engine_state = 0; + int auto_answer_time = 0, ret = -1; + unsigned long auto_answer_time_interval = 0; + + _vc_core_engine_status_get_engine_iostate(pcall_core->pcall_engine, &engine_state); + CALL_ENG_DEBUG(ENG_DEBUG, "eng_state : %d", engine_state); + if (engine_state != VC_INOUT_STATE_INCOME_BOX) { + CALL_ENG_DEBUG(ENG_DEBUG, "Engine State not in Income Box, Current State: %d", engine_state); + return FALSE; + } + /* Read the time interval from gconf and set the redial timer */ + ret = vconf_get_int(VCONFKEY_CISSAPPL_ANSWERING_MODE_TIME_INT, &auto_answer_time); + if (0 == ret) { + auto_answer_time_interval = auto_answer_time * 1000; + CALL_ENG_DEBUG(ENG_DEBUG, "The time interval is : %ld", auto_answer_time_interval); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_get_int FAILED"); + return FALSE; + } + + pcall_core->auto_answer_timer = g_timeout_add(auto_answer_time_interval, __voicecall_core_auto_answer_timer_cb, pcall_core); + return FALSE; +} + +/** +* This function checks whether given answer mode is enabled or not +* +* @return returns TRUE if given answer mode type is enabled in the settings or FALSE otherwise +* +*/ +static gboolean __vc_core_is_answermode_enabled_from_testmode(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + int benabled = -1; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_TESTMODE_AUTO_ANSWER, &benabled); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "benabled = %d", benabled); + if (TRUE == benabled) + return TRUE; + else + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_get_int FAILED"); + return FALSE; + } +} + +/** +* This function checks whether given answer mode is enabled or not +* +* @return returns TRUE if given answer mode type is enabled in the settings or FALSE otherwise +* +*/ +static gboolean __vc_core_is_answermode_enabled(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "coming inside voicecall_is_answermode_enabled"); + int answer_mode_enabled = -1; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_CISSAPPL_ANSWERING_MODE_INT, &answer_mode_enabled); + if (0 == ret) { + CALL_ENG_DEBUG(ENG_DEBUG, "answer_mode_enabled = %d", answer_mode_enabled); + if (2 == answer_mode_enabled) /* here 2 is auto answer mode is enabled */ + return TRUE; + else + return FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "vconf_get_int FAILED"); + return FALSE; + } + +} + +/** +* This function processes auto answer request +* +* @return Returns void +* @param[in] pcall_core Handle to voicecall core +*/ +static void __voicecall_core_start_auto_answer(call_vc_core_state_t *pcall_core, gboolean isTestMode) +{ + gboolean earjack_connected = FALSE; + gboolean headset_connected = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (TRUE == isTestMode) { + CALL_ENG_DEBUG(ENG_DEBUG, "In case Of Testmode, always auto answer enabled"); + + g_idle_add(__voicecall_core_auto_answer_idle_cb, pcall_core); + return; + } + earjack_connected = _voicecall_dvc_get_earjack_connected(); + + if (TRUE == earjack_connected) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack is connected"); + } + headset_connected = _vc_bt_get_bt_status(); + + if (TRUE == headset_connected) { + CALL_ENG_DEBUG(ENG_DEBUG, "headset is connected"); + } + + if (TRUE == earjack_connected || TRUE == headset_connected) { + __voicecall_core_auto_answer_idle_cb(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Without earjack or headset, skip auto answer "); + return; + } +} + +/** +* This function cancels the auto answering timer +* +* @return void +* @param[in] pcall_core Handle to voicecall core +*/ +static void __voicecall_core_cancel_auto_answer(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "coming inside __voicecall_cancel_auto_answer"); + if (pcall_core->auto_answer_timer > 0) { + g_source_remove(pcall_core->auto_answer_timer); + pcall_core->auto_answer_timer = 0; + } +} + +#if 0 +/** +* This function checks BT headset and Earjack status +* +* @return void +* @param[in] pcall_core Handle to voicecall core +*/ +static void __voicecall_core_check_headset_earjack_status(call_vc_core_state_t *pcall_core) +{ + gboolean bt_connected = FALSE; + + bt_connected = _vc_bt_get_bt_status(); + CALL_ENG_DEBUG(ENG_DEBUG, "Bt connected =%d", bt_connected); + + pcall_core->bt_connected = bt_connected; + + CALL_ENG_DEBUG(ENG_DEBUG, "Update the earjack status"); + _voicecall_dvc_get_earjack_status(pcall_core); +} +#endif + +/** + * This function parses the in call supplementary services string and returns the in call ss to be used + * + * @return Returns in call ss state #vcui_app_incall_ss_state_t + * @param[in] pcall_core Handle to voicecall core + * @param[in] number number to be parsed + */ +call_vc_core_incall_ss_state_t voicecall_core_parse_incall_ss_string(call_vc_core_state_t *pcall_core, char *number) +{ + call_vc_core_incall_ss_state_t ss_value = CALL_VC_CORE_SS_USSD; + + if (strlen(number) == 1) { + switch (number[0]) { + case '0': + ss_value = CALL_VC_CORE_SS_0; + break; + case '1': + ss_value = CALL_VC_CORE_SS_1; + break; + case '2': + ss_value = CALL_VC_CORE_SS_2; + break; + case '3': + ss_value = CALL_VC_CORE_SS_3; + break; + case '4': + ss_value = CALL_VC_CORE_SS_4; + break; + default: + ss_value = CALL_VC_CORE_SS_USSD; + break; + } + } else if (strlen(number) == 2) { + if ((number[0] == '1') && (number[1] > '0') && (number[1] < '8')) { + pcall_core->selected_call_id_in_ss = atoi(number + 1); + ss_value = CALL_VC_CORE_SS_1X; + } + + if ((number[0] == '2') && (number[1] > '0') && (number[1] < '8')) { + pcall_core->selected_call_id_in_ss = atoi(number + 1); + ss_value = CALL_VC_CORE_SS_2X; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "ss parsed value: %d", ss_value); + return ss_value; +} + +/** + * This function starts the supplementary services while on call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + * @param[in] incall_ss_state state of the In Call Supplementary Service + */ +gboolean voicecall_core_start_incall_ss(call_vc_core_state_t *pcall_core, call_vc_core_incall_ss_state_t incall_ss_state) +{ + gboolean active_calls = FALSE, held_calls = FALSE; + + _vc_core_engine_status_isexists_any_call(pcall_core->pcall_engine, &active_calls, &held_calls); + + CALL_ENG_DEBUG(ENG_DEBUG, "ss state = %d", incall_ss_state); + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_OPERATION_REFUSED; + + /*Cancel DTMF Sending if any and close the dtmf ui */ + /* vcui_app_doc_cancel_dtmf_queue(papp_document); sathwick TBD */ + + switch (incall_ss_state) { + /* Releases all held calls or Set UDUB(User Determined User Busy) for a waiting call */ + case CALL_VC_CORE_SS_0: + { + /* if an incoming call is activated, reject the incoming all */ + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + voicecall_core_reject_mt(pcall_core, TRUE); + return TRUE; + } else if (held_calls) { + voicecall_core_end_all_held_calls(pcall_core); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "There are no held calls to do the processing"); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + } + } + break; + case CALL_VC_CORE_SS_1: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + /* Accept incoming call */ + voicecall_core_answer_call_bytype(pcall_core, VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT); + return TRUE; + } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + /* This fucntion checks for held calls to be retreived on response of ending call */ + voicecall_core_set_check_ss_on_end(pcall_core); + voicecall_core_end_mo_call(pcall_core->pcall_engine); + } else if (active_calls) { + voicecall_core_end_all_active_calls(pcall_core); + voicecall_core_set_check_ss_on_end(pcall_core); + } else if (held_calls) { + _vc_core_engine_retrieve_call(pcall_core->pcall_engine); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_1X: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else if (active_calls) { + + if (!(ERROR_VOICECALL_NONE == _vc_core_engine_end_call_bycallId(pcall_core->pcall_engine, pcall_core->selected_call_id_in_ss))) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_2: + { + + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + if (active_calls && held_calls) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else { +#ifdef _CPHS_DEFINED_ /* Not used currently */ + if (TRUE == active_calls && (voicecall_core_get_cphs_csp_status(pcall_core->pcall_engine, VC_CPHS_CSP_HOLD))) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + break; + } +#endif + voicecall_core_answer_call(pcall_core, TRUE); + } + } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } else if (active_calls && held_calls) { + _vc_core_engine_swap_calls(pcall_core->pcall_engine); + } else if (active_calls) { + _vc_core_engine_hold_call(pcall_core->pcall_engine); + } else if (held_calls) { + _vc_core_engine_retrieve_call(pcall_core->pcall_engine); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_2X: + { + if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine) || voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + } else if (TRUE == active_calls && FALSE == held_calls) { + int active_members = 0; + + voicecall_core_get_active_call_member(pcall_core, &active_members); + + if (!(active_members > 1 && (ERROR_VOICECALL_NONE == _vc_core_engine_private_call_by_callid(pcall_core->pcall_engine, pcall_core->selected_call_id_in_ss)))) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_3: + { + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + return TRUE; + } + + if (TRUE == voicecall_core_is_conf_call_possible(pcall_core)) { + _vc_core_engine_setup_conference(pcall_core->pcall_engine); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } + break; + case CALL_VC_CORE_SS_4: + if (TRUE == voicecall_core_is_transfer_call_possible(pcall_core)) { + if (FALSE == voicecall_core_transfer_calls(pcall_core)) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid SS State"); + CALL_ENG_DEBUG(ENG_DEBUG, "Need to show a popup to the user "); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } + return TRUE; +} + +/** + * This function processed the supplementary services while on call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + * @param[in] pdialled_number dial number + */ +void voicecall_core_process_incall_ss(call_vc_core_state_t *pcall_core, char *pdialled_number) +{ + call_vc_core_incall_ss_state_t incall_ss_state = CALL_VC_CORE_SS_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, " .."); + + incall_ss_state = voicecall_core_parse_incall_ss_string(pcall_core, pdialled_number); + + if (incall_ss_state != CALL_VC_CORE_SS_USSD) { + voicecall_core_start_incall_ss(pcall_core, incall_ss_state); + } else { + + CALL_ENG_DEBUG(ENG_DEBUG, "Involves CISS functionality so need for us to handle and will be handled by CISS"); + vc_engine_msg_box_type event_data; + memset(&event_data, 0, sizeof(event_data)); + event_data.string_id = IDS_CALL_POP_OPERATION_REFUSED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&event_data); + } +} + +#ifdef PDIAL_SEND_DTMF +gboolean voicecall_core_send_phone_number_dtmf(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)vcall_engine_get_core_state(); + int call_handle = (int)puser_data; + char dtmf_number[VC_PHONE_NUMBER_LENGTH_MAX]; + call_vc_call_objectinfo_t obj_info = { 0, }; + + CALL_ENG_DEBUG(ENG_DEBUG, "inside ..."); + + if (TRUE == _vc_core_cm_get_call_object(&pcall_core->pcall_engine->call_manager, call_handle, &obj_info)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Source telephone number - %s", obj_info.source_tel_number); + if (TRUE == _vc_core_util_extract_dtmf_number(obj_info.source_tel_number, dtmf_number, sizeof(dtmf_number))) { + CALL_ENG_DEBUG(ENG_DEBUG, "DTMF number - %s", dtmf_number); + if (VC_CALL_ORIG_TYPE_SAT == pcall_core->call_setup_info.call_type) { + __voicecall_core_queue_dtmf_string(pcall_core, dtmf_number, TRUE); + } else { + __voicecall_core_queue_dtmf_string(pcall_core, dtmf_number, FALSE); + } + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Call Info not available for call handle: %d", call_handle); + } + + return FALSE; +} + +/** + * This function cancels the dtmf queue + * + * @return TRUE - sucess, FALSE otherwise + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_core_cancel_dtmf_queue(call_vc_core_state_t *pcall_core) +{ + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start:pcall_core(%p)", pcall_core); + + if (FALSE == pdtmf_info->bdtmf_queue) { + return TRUE; + } + + /*Remove Pauser Timer */ + if (pdtmf_info->dtmf_pause_timer > 0) { + g_source_remove(pdtmf_info->dtmf_pause_timer); + pdtmf_info->dtmf_pause_timer = -1; + } + + /*Reset the Status Flags */ + pdtmf_info->bdtmf_queue = FALSE; + pdtmf_info->dtmf_index = 0; + pdtmf_info->bdtmf_wait = FALSE; + memset(pdtmf_info->dtmf_number, 0, sizeof(pdtmf_info->dtmf_number)); + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + pdtmf_info->bsat_dtmf = FALSE; + pdtmf_info->bsat_hidden = FALSE; + CALL_ENG_DEBUG(ENG_DEBUG, "End"); + return TRUE; +} + +static gboolean __voicecall_core_dtmf_pause_timer_cb(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + + __voicecall_core_handle_dtmf_ack(pcall_core, TRUE); + + /*Always return FALSE, so that it won't be called again */ + return FALSE; +} + +gboolean __voicecall_core_send_dtmf_idle_cb(gpointer pdata) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)pdata; + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + voicecall_error_t vc_error; + vc_engine_dtmf_ack_type event_data; + char dtmf_string[2]; + + dtmf_string[0] = pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]; + dtmf_string[1] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "inside ..."); + + vc_error = _vc_core_engine_send_dtmf(pcall_core->pcall_engine, dtmf_string); + + if (vc_error == ERROR_VOICECALL_INVALID_DTMF_CHAR) { + CALL_ENG_DEBUG(ENG_DEBUG, "ERROR_VOICECALL_INVALID_DTMF_CHAR"); + } else if (ERROR_VOICECALL_NONE != vc_error) { + voicecall_core_cancel_dtmf_queue(pcall_core); + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + } + + return FALSE; +} + +static gboolean __voicecall_core_handle_dtmf_ack(call_vc_core_state_t *pcall_core, gboolean success) +{ + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + vc_engine_dtmf_ack_type event_data; + CALL_ENG_DEBUG(ENG_DEBUG, "..."); + + if (FALSE == pdtmf_info->bdtmf_queue) { + CALL_ENG_DEBUG(ENG_DEBUG, "DTMF Queue Canceled, do nothing"); + return TRUE; + } + + if (TRUE == success) { + char dtmf_string[2]; + pdtmf_info->dtmf_index++; + + dtmf_string[0] = pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]; + dtmf_string[1] = '\0'; + + CALL_ENG_DEBUG(ENG_DEBUG, "Current dtmf_index: %d,dtmf_max_length=%d", pdtmf_info->dtmf_index, pdtmf_info->dtmf_max_length); + CALL_ENG_DEBUG(ENG_DEBUG, "Current DTMF String: %s", &pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]); + + /*Find the End of the queue */ + if (pdtmf_info->dtmf_index >= pdtmf_info->dtmf_max_length) { + + CALL_ENG_DEBUG(ENG_DEBUG, "Updating DTMF Progress before destroying"); + + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; /*check it*/ + event_data.string_id = IDS_CALL_POP_DTMF_SENT; /*check it*/ + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_RET_SUCCESS); + } + } else { + if (0 == strcasecmp(dtmf_string, "p") || 0 == strcmp(dtmf_string, ",")) { + CALL_ENG_DEBUG(ENG_DEBUG, "Pause on the dtmf string"); + + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = TRUE; + event_data.string_id = IDS_CALL_POP_SENDING; + snprintf(event_data.display_string, sizeof(event_data.display_string), "%s", &pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + + int dtmf_interval = 0; + + if (FALSE == _vc_core_util_check_gcf_status()) { + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_FIRST : DTMF_PAUSE_TIMER_INTERVAL_REST; + } else { +#ifdef GCONF_GCF_SAT_TEST + int start_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST; + int rest_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; + { + GConfClient *client = NULL; + client = gconf_client_get_default(); + if (NULL == client) { + CALL_ENG_DEBUG(ENG_DEBUG, "gconf_client_get_default failed.."); + } else { + + start_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_FIRST, NULL); + + rest_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_REST, NULL); + g_object_unref(client); + } + + } + CALL_ENG_DEBUG(ENG_DEBUG, "start_interval:%d, rest_interval = %d", start_interval, rest_interval); + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? start_interval : rest_interval; +#else + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST : DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; +#endif + } + CALL_ENG_DEBUG(ENG_DEBUG, "dtmf_interval:%d", dtmf_interval); + pdtmf_info->dtmf_pause_timer = g_timeout_add(dtmf_interval, __voicecall_core_dtmf_pause_timer_cb, pcall_core); + } else if (0 == strcasecmp(dtmf_string, "w") || 0 == strcmp(dtmf_string, ";")) { + CALL_ENG_DEBUG(ENG_DEBUG, "Wait on the dtmf string"); + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = TRUE; + event_data.string_id = IDS_CALL_POP_UNAVAILABLE; /*assign ID when string is added*/ + snprintf(event_data.display_string, sizeof(event_data.display_string), "%s", &pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + } else { + g_idle_add_full(G_PRIORITY_HIGH_IDLE + 25, __voicecall_core_send_dtmf_idle_cb, pcall_core, NULL); + } + } + } else { + voicecall_core_cancel_dtmf_queue(pcall_core); + + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + + return TRUE; +} + +/** + * This function queues the dtmf digits one by one from the given dtmf string + * + * @return TRUE - sucess, FALSE otherwise + * @param[in] papp_document Handle to Application Document + * @param[in] dtmf_string dtmf string to be queued + */ +static gboolean __voicecall_core_queue_dtmf_string(call_vc_core_state_t *pcall_core, char *dtmf_string, gboolean bsat_dtmf) +{ + voicecall_dtmf_info_t *pdtmf_info = (voicecall_dtmf_info_t *)&pcall_core->dtmf_info; + gboolean bhidden_mode = FALSE; + char dtmf_digit[2]; + vc_engine_dtmf_ack_type event_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "bsat_dtmf = %d", bsat_dtmf); + + if (TRUE == bsat_dtmf) { + /*Always get the status from the engine */ + _vc_core_engine_get_sat_dtmf_hidden_mode(pcall_core->pcall_engine, &bhidden_mode); + CALL_ENG_DEBUG(ENG_DEBUG, "SAT Hidden Mode : %d", bhidden_mode); + } + + /*Check for the validity of the DTMF String */ + if (FALSE == _vc_core_util_isvalid_full_dtmf_number(dtmf_string)) { + if (TRUE == bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + + if (!((TRUE == bsat_dtmf) && (TRUE == bhidden_mode))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_INVALID_DTMF; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + return FALSE; + } + + /*Reset DTMF Values */ + pdtmf_info->bdtmf_queue = FALSE; + pdtmf_info->dtmf_index = 0; + pdtmf_info->bsat_dtmf = bsat_dtmf; + + if (TRUE == bsat_dtmf) { + /*Initialize */ + pdtmf_info->bsat_hidden = bhidden_mode; + } + + /*It takes only 40 characters from the source, rest of the characters are ignored*/ + memset(pdtmf_info->dtmf_number, 0, sizeof(pdtmf_info->dtmf_number)); + strncpy(pdtmf_info->dtmf_number, dtmf_string, min((sizeof(pdtmf_info->dtmf_number) - 1), strlen(dtmf_string))); + pdtmf_info->dtmf_max_length = strlen(pdtmf_info->dtmf_number); + CALL_ENG_DEBUG(ENG_DEBUG, "Dtmf Number:%s ,dtmf_max_length:%d", pdtmf_info->dtmf_number, pdtmf_info->dtmf_max_length); + + dtmf_digit[0] = pdtmf_info->dtmf_number[pdtmf_info->dtmf_index]; + dtmf_digit[1] = '\0'; + + /*Send DTMF */ + if (0 == strcasecmp(dtmf_digit, "p") || 0 == strcmp(dtmf_digit, ",")) { + int dtmf_interval = 0; + + if (FALSE == _vc_core_util_check_gcf_status()) { + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_FIRST : DTMF_PAUSE_TIMER_INTERVAL_REST; + } else { +#ifdef GCONF_GCF_SAT_TEST + int start_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST; + int rest_interval = DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; + { + + GConfClient *client = NULL; + client = gconf_client_get_default(); + if (NULL == client) { + CALL_ENG_DEBUG(ENG_DEBUG, "gconf_client_get_default failed.."); + } else { + + start_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_FIRST, NULL); + + rest_interval = gconf_client_get_int(client, PATH_DTMF_INTERVAL_GCF_REST, NULL); + g_object_unref(client); + } + + } + CALL_ENG_DEBUG(ENG_DEBUG, "start_interval:%d, rest_interval = %d", start_interval, rest_interval); + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? start_interval : rest_interval; +#else + dtmf_interval = (pdtmf_info->dtmf_index == 0) ? DTMF_PAUSE_TIMER_INTERVAL_GCF_FIRST : DTMF_PAUSE_TIMER_INTERVAL_GCF_REST; +#endif + CALL_ENG_DEBUG(ENG_DEBUG, "updated dtmf_interval:%d", dtmf_interval); + } + pdtmf_info->dtmf_pause_timer = g_timeout_add(dtmf_interval, __voicecall_core_dtmf_pause_timer_cb, pcall_core); + } else if (0 == strcasecmp(dtmf_digit, "w") || 0 == strcmp(dtmf_digit, ";")) { + /* enable wait flag for dtmf sending */ + pdtmf_info->bdtmf_wait = TRUE; + } else if ((ERROR_VOICECALL_NONE != _vc_core_engine_send_dtmf(pcall_core->pcall_engine, dtmf_digit))) { + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = FALSE; + event_data.string_id = IDS_CALL_POP_DTMFSENDING_FAIL; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } + if (TRUE == pdtmf_info->bsat_dtmf) { + voicecall_core_send_sat_response(pcall_core->pcall_engine, SAT_RQST_SEND_DTMF, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND); + } + return FALSE; + } + pdtmf_info->bdtmf_queue = TRUE; + + /*Create Progressbar popup */ + if (!((TRUE == pdtmf_info->bsat_dtmf) && (TRUE == pdtmf_info->bsat_hidden))) { + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = TRUE; + CALL_ENG_DEBUG(ENG_DEBUG, "pdtmf_info->bdtmf_wait [%d]", pdtmf_info->bdtmf_wait); + if (pdtmf_info->bdtmf_wait) { + event_data.string_id = IDS_CALL_POP_UNAVAILABLE; + } else { + event_data.string_id = IDS_CALL_POP_SENDING; + } + _vc_core_util_strcpy(event_data.display_string, VC_PHONE_NUMBER_LENGTH_MAX, pdtmf_info->dtmf_number); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_DTMF_ACK_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "SAT DTMF Hidden Mode, not showing UI"); + } + return TRUE; +} +#endif + +gboolean voicecall_core_change_sound_path(call_vc_core_state_t *pcall_core, voicecall_snd_audio_type_t sound_path) +{ + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + int ret = FALSE; + int total_call_member = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "sound_path:[%d]", sound_path); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + if (total_call_member == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "There are not active calls hence it should not work"); + return FALSE; + } + + switch (sound_path) { + case VOICE_CALL_AUDIO_SPEAKER: + { + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_SPEAKER); + ret = TRUE; + } + break; + + case VOICE_CALL_AUDIO_HEADSET: + { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + + ret = TRUE; + } + break; + + case VOICE_CALL_AUDIO_RECEIVER_EARJACK: + { + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT) { + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + ret = TRUE; + } + break; + + default: + { + CALL_ENG_DEBUG(ENG_DEBUG, "Unknown type!!"); + ret = FALSE; + } + break; + } + + /* Change Audio Path according to the current status */ + voicecall_snd_change_path(papp_snd); + + return ret; +} + +gboolean voicecall_core_get_sound_path(call_vc_core_state_t *pcall_core, int *sound_path) +{ + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + switch (voicecall_snd_get_path_status(papp_snd)) { + case VOICE_CALL_SND_PATH_SPEAKER: + { + *sound_path = VOICE_CALL_AUDIO_SPEAKER; + } + break; + + case VOICE_CALL_SND_PATH_BT: + { + *sound_path = VOICE_CALL_AUDIO_HEADSET; + } + break; + + case VOICE_CALL_SND_PATH_RECEIVER_EARJACK: + default: + { + *sound_path = VOICE_CALL_AUDIO_RECEIVER_EARJACK; + } + break; + } + + return TRUE; +} + +static gboolean __voicecall_core_is_redial_cuase(int end_cause) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "end_cause(%d)", end_cause); + + switch (end_cause) { + case VC_ENDCAUSE_CALL_BARRED: + case VC_ENDCAUSE_NO_SERVICE: + case VC_ENDCAUSE_USER_UNAVAILABLE: + case VC_ENDCAUSE_INVALID_NUMBER_FORMAT: + case VC_ENDCAUSE_NUMBER_CHANGED: + case VC_ENDCAUSE_NO_CREDIT: + case VC_ENDCAUSE_UNASSIGNED_NUMBER: + return FALSE; + + case VC_ENDCAUSE_CALL_ENDED: + case VC_ENDCAUSE_CALL_DISCONNECTED: + case VC_ENDCAUSE_NO_ANSWER: + case VC_ENDCAUSE_NW_BUSY: + case VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED: + case VC_ENDCAUSE_NW_FAILED: + case VC_ENDCAUSE_REJECTED: + case VC_ENDCAUSE_USER_BUSY: + case VC_ENDCAUSE_WRONG_GROUP: + case VC_ENDCAUSE_CALL_NOT_ALLOWED: + case VC_ENDCAUSE_CALL_FAILED: + case VC_ENDCAUSE_NO_USER_RESPONDING: + case VC_ENDCAUSE_USER_ALERTING_NO_ANSWER: + case VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE: + case VC_ENDCAUSE_USER_DOESNOT_RESPOND: + case VC_ENDCAUSE_IMEI_REJECTED: + case VC_ENDCAUSE_TAPI_ERROR: + default: + return TRUE; + } +} + +/** + * This function processed the supplementary services while on call + * + * @return Returns TRUE If transfer call can be made or FALSE if not + * @param[in] pcall_core Handle to voicecall core + */ +void voicecall_core_process_dtmf_send_status(call_vc_core_state_t *pcall_core, gboolean bsuccess) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " .."); + VOICECALL_RETURN_IF_FAIL(pcall_core); + __voicecall_core_handle_dtmf_ack(pcall_core, bsuccess); +} + +/** + * This function checks validation of incoming handle + * + * @return gboolean + * @param[in] puser_data Handle to voicecall core + */ +static gboolean __voicecall_core_check_incoming_handle(gpointer puser_data) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)puser_data; + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core); + + _vc_core_engine_check_incoming_handle(pcall_core->pcall_engine, pcall_core->mtcall_handle); + + return FALSE; +} + +gboolean _voicecall_core_disable_flight_mode(call_vc_core_state_t *pcall_core) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " .."); + + return _vc_core_engine_disable_flight_mode(pcall_core->pcall_engine); +} + diff --git a/call-engine/voice-call-device.c b/call-engine/voice-call-device.c new file mode 100755 index 0000000..21e6e56 --- /dev/null +++ b/call-engine/voice-call-device.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-device.h" +#include "voice-call-core.h" +#include "voice-call-sound.h" +#include "voice-call-bt.h" +#include "voice-call-core.h" +#include "voice-call-engine-msg.h" + +#include "vc-core-callagent.h" +#include "vc-core-engine-types.h" +#include "vc-core-util.h" + +#include +#include + +static gboolean __voicecall_dvc_earjack_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core); +static gboolean __voicecall_dvc_earjackkey_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core); + +/** + * This function handles earjack event + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] node vconf node + * @param[in] pcall_core Handle to voicecall core + */ +static gboolean __voicecall_dvc_earjack_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core) +{ + int earjack_status; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + earjack_status = vconf_keynode_get_int(node); + + CALL_ENG_DEBUG(ENG_DEBUG, "Earjack Status: %d", earjack_status); + + vc_engine_headset_status_type event_data; + + /*Change path only if outgoing call or connected call exists */ + if ((TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) + || (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine))) { + if (earjack_status != FALSE) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + voicecall_snd_change_path(pcall_core->papp_snd); + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = earjack_status; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data); + } else { + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_RECEIVER_EARJACK) { + if (_vc_bt_is_bt_connected(pcall_core) == TRUE) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + voicecall_snd_change_path(pcall_core->papp_snd); + } + memset(&event_data, 0, sizeof(event_data)); + event_data.bstatus = earjack_status; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "No path change"); + } + } + } + return TRUE; +} + +/** + * This function handles earjack key event + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] node vconf node + * @param[in] pcall_core Handle to voicecall core + */ +static gboolean __voicecall_dvc_earjackkey_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core) +{ + int key_value; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + key_value = vconf_keynode_get_int(node); + + CALL_ENG_DEBUG(ENG_DEBUG, "key_value: %d", key_value); + + if (key_value > 0) { + if (voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + voicecall_core_end_all_calls(pcall_core); + } else if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + voicecall_core_answer_call(pcall_core, FALSE); + } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) { + voicecall_core_cancel_call(pcall_core); + } + } + + return TRUE; +} + +/** + * This function initialize earjack event. + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + */ +gboolean _voicecall_dvc_earjack_init(call_vc_core_state_t *pcall_core) +{ + vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACK, (void *)__voicecall_dvc_earjack_status_cb, pcall_core); + vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACKKEY, (void *)__voicecall_dvc_earjackkey_status_cb, pcall_core); + return TRUE; +} + +void _voicecall_dvc_get_earjack_status(call_vc_core_state_t *pcall_core) +{ + int earjack_status = -1; + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]", earjack_status); + if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) { + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_RECEIVER_EARJACK, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_RECEIVER_EARJACK = FALSE **********"); + } else { + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_RECEIVER_EARJACK, TRUE); + CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_RECEIVER_EARJACK = TRUE **********"); + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed.."); + voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_RECEIVER_EARJACK, FALSE); + } +} + +gboolean _voicecall_dvc_get_earjack_connected() +{ + int earjack_status = -1; + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]", earjack_status); + if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) { + return FALSE; + } else { + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed.."); + return FALSE; + } +} + +void _voicecall_dvc_control_lcd_state(voicecall_lcd_control_t state) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "[%d]", state); + switch (state) { + case VC_LCD_OFF: + pm_change_state(LCD_OFF); + break; + + case VC_LCD_ON: + pm_change_state(LCD_NORMAL); + break; + + case VC_LCD_ON_LOCK: + if (_vcui_is_powerkey_mode_on() == TRUE) { + pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW|HOLD_KEY_BLOCK, 0); + } else { + pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0); + } + break; + + case VC_LCD_ON_UNLOCK: + pm_unlock_state(LCD_NORMAL, PM_RESET_TIMER); + break; + + default: + break; + } +} + diff --git a/call-engine/voice-call-engine.c b/call-engine/voice-call-engine.c new file mode 100755 index 0000000..3dff20f --- /dev/null +++ b/call-engine/voice-call-engine.c @@ -0,0 +1,990 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-engine.h" +#include "voice-call-core.h" +#include "voice-call-service.h" +#include "voice-call-device.h" +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "vc-core-engine-status.h" +#include "vc-core-engine-group.h" + +typedef struct { + void *puser_data; + vcall_engine_app_cb cb_func; +} app_cb_t; + +call_vc_core_state_t *global_pcall_core = NULL; + +static app_cb_t *app_client_data = NULL; + +/** + * This function send events to client. + * + * @return int API Result Code. + * @param[in] +*/ +gboolean vcall_engine_send_event_to_client(int event, void *pdata) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + if (app_client_data->cb_func != NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sending Event to APP Client"); + app_client_data->cb_func(event, pdata, app_client_data->puser_data); + } + CALL_ENG_DEBUG(ENG_ERR, "End.."); + return TRUE; +} + +/** + * This function initialize voice call engine. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_init(vcall_engine_app_cb pcb_func, void *puser_data) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + + global_pcall_core = (call_vc_core_state_t *)calloc(1, sizeof(call_vc_core_state_t)); + if (global_pcall_core == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "Memory Allocation Failed"); + return VCALL_ENGINE_API_FAILED; + } + CALL_ENG_DEBUG(ENG_DEBUG, "global_pcall_core alloctated memory:[%d],global_pcall_core(0x%x)", sizeof(call_vc_core_state_t), global_pcall_core); + + if (FALSE == voicecall_core_init(global_pcall_core)) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_core_init() failed"); + return VCALL_ENGINE_API_FAILED; + } + + app_client_data = (app_cb_t *) calloc(1, sizeof(app_cb_t)); + if (app_client_data == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "Memory Allocation Failed"); + return VCALL_ENGINE_API_FAILED; + } + app_client_data->cb_func = pcb_func; + app_client_data->puser_data = puser_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "Init dbus connection"); + + return VCALL_ENGINE_API_SUCCESS; + +} + +/** + * This function processes mo nomal call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_normal_call(char *number, int ct_index, gboolean b_download_call) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " number is (%s)", number); + voicecall_engine_t *pcall_engine = global_pcall_core->pcall_engine; + vc_engine_outgoing_type event_data; + char number_after_removal[VC_PHONE_NUMBER_LENGTH_MAX] = {"\0",}; + int io_state; + + if (number == NULL || pcall_engine == NULL) + return VCALL_ENGINE_API_FAILED; + + _vc_core_engine_status_set_download_call(pcall_engine, b_download_call); + + /* check the call-engine state before proceeding with call processing */ + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + if (io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State [%d] not NONE, cannot proceed with the call", io_state); + voicecall_core_set_status(global_pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type mbox_event_data; + + memset(&mbox_event_data, 0, sizeof(mbox_event_data)); + mbox_event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&mbox_event_data); + return VCALL_ENGINE_API_FAILED; + } + + memset(&(global_pcall_core->call_setup_info), 0, sizeof(global_pcall_core->call_setup_info)); + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_NORMAL; + + memset(&event_data, 0, sizeof(event_data)); + + _vc_core_util_remove_invalid_chars(number, number_after_removal); + snprintf(global_pcall_core->call_setup_info.source_tel_number, VC_PHONE_NUMBER_LENGTH_MAX, "%s", number_after_removal); + voicecall_core_extract_phone_number(number_after_removal, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + + if (strlen(event_data.call_num) >= VC_PHONE_NUMBER_LENGTH_MAX) { + CALL_ENG_DEBUG(ENG_ERR, " WARNING!! number is larger than max num length!!"); + memcpy(global_pcall_core->call_setup_info.tel_number, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX-1); + } else { + memcpy(global_pcall_core->call_setup_info.tel_number, event_data.call_num, strlen(event_data.call_num)); + } + CALL_ENG_DEBUG(ENG_DEBUG, "number:[%s]", number); + CALL_ENG_DEBUG(ENG_DEBUG, "number_after_removal:[%s]", number_after_removal); + CALL_ENG_DEBUG(ENG_DEBUG, "global_pcall_core->call_setup_info.source_tel_number:[%s]", global_pcall_core->call_setup_info.source_tel_number); + CALL_ENG_DEBUG(ENG_DEBUG, "global_pcall_core->call_setup_info.tel_number:[%s]", global_pcall_core->call_setup_info.tel_number); + CALL_ENG_DEBUG(ENG_DEBUG, "event_data.call_num:[%s]", event_data.call_num); + + { + voicecall_contact_info_t ct_info; + memset(&ct_info, 0, sizeof(ct_info)); + + ct_info.ct_index = ct_index; + + voicecall_service_contact_info_by_number(event_data.call_num, &ct_info); + event_data.contact_index = ct_info.ct_index; + event_data.phone_type = ct_info.phone_type; + + _vc_core_util_strcpy(event_data.call_name, sizeof(event_data.call_name), ct_info.display_name); + _vc_core_util_strcpy(event_data.call_file_path, sizeof(event_data.call_file_path), ct_info.caller_id_path); + CALL_ENG_DEBUG(ENG_DEBUG, " contact copy ended!!"); + } + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + if (voicecall_core_setup_call(global_pcall_core, FALSE)) { + CALL_ENG_DEBUG(ENG_DEBUG, " success!!"); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, " failed!!"); + } + return VCALL_ENGINE_API_SUCCESS; + +} + +/** + * This function processes mo emergency call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_emergency_call(char *number) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " number is : [%s]", number); + voicecall_engine_t *pcall_engine = global_pcall_core->pcall_engine; + gboolean bDefaultNumber = FALSE; + vc_engine_outgoing_type event_data; + int io_state; + + /* check the call-engine state before proceeding with emergency call processing */ + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + if (io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State [%d] not NONE, cannot proceed with the call", io_state); + voicecall_core_set_status(global_pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type mbox_event_data; + + memset(&mbox_event_data, 0, sizeof(mbox_event_data)); + mbox_event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&mbox_event_data); + return VCALL_ENGINE_API_FAILED; + } + + memset(&event_data, 0, sizeof(event_data)); + + memset(&(global_pcall_core->call_setup_info), 0, sizeof(global_pcall_core->call_setup_info)); + + bDefaultNumber = strlen(number) ? FALSE : TRUE; + if (bDefaultNumber == TRUE) { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_EMERGENCY; + if (strlen("911") < sizeof(event_data.call_num)) + _vc_core_util_strcpy(event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX, "911"); + + memcpy(global_pcall_core->call_setup_info.tel_number, "911", strlen("911")); + } else { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_PINLOCK; + voicecall_core_extract_phone_number(number, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + if (strlen(number) > VC_PHONE_NUMBER_LENGTH_MAX) { + CALL_ENG_DEBUG(ENG_ERR, " WARNING!! number is larger than max num length!!"); + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + } else { + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, strlen(number)); + } + } + + event_data.contact_index = -1; + event_data.phone_type = -1; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + if (voicecall_core_setup_call(global_pcall_core, TRUE)) { + CALL_ENG_DEBUG(ENG_DEBUG, " success!!"); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, " failed!!"); + } + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function processes emergency call for testing purpose. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_emergency_call_test(char *number) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " number is : [%s]", number); + voicecall_engine_t *pcall_engine = global_pcall_core->pcall_engine; + gboolean bDefaultNumber = FALSE; + vc_engine_outgoing_type event_data; + int io_state; + + /* check the call-engine state before proceeding with emergency call processing */ + _vc_core_engine_status_get_engine_iostate(pcall_engine, &io_state); + if (io_state != VC_INOUT_STATE_NONE) { + CALL_ENG_DEBUG(ENG_DEBUG, "IO State [%d] not NONE, cannot proceed with the call", io_state); + voicecall_core_set_status(global_pcall_core, CALL_VC_CORE_FLAG_SETUPCALL_FAIL, TRUE); + vc_engine_msg_box_type mbox_event_data; + + memset(&mbox_event_data, 0, sizeof(mbox_event_data)); + mbox_event_data.string_id = IDS_CALL_POP_CALLNOTCALLOWED; + vcall_engine_send_event_to_client(VC_ENGINE_MSG_MESSAGE_BOX_TO_UI, (void *)&mbox_event_data); + return VCALL_ENGINE_API_FAILED; + } + + memset(&event_data, 0, sizeof(event_data)); + + memset(&(global_pcall_core->call_setup_info), 0, sizeof(global_pcall_core->call_setup_info)); + + bDefaultNumber = strlen(number) ? FALSE : TRUE; + if (bDefaultNumber == TRUE) { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_EMERGENCY; + if (strlen("911") < sizeof(event_data.call_num)) + _vc_core_util_strcpy(event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX, "911"); + + memcpy(global_pcall_core->call_setup_info.tel_number, "911", strlen("911")); + } else { + global_pcall_core->call_setup_info.call_setup_by = VC_CALL_SETUP_BY_NORMAL; + global_pcall_core->call_setup_info.call_type = VC_CALL_ORIG_TYPE_PINLOCK; + voicecall_core_extract_phone_number(number, event_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + if (strlen(number) > VC_PHONE_NUMBER_LENGTH_MAX) { + CALL_ENG_DEBUG(ENG_ERR, " WARNING!! number is larger than max num length!!"); + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + } else { + memcpy(global_pcall_core->call_setup_info.source_tel_number, number, VC_PHONE_NUMBER_LENGTH_MAX); + memcpy(global_pcall_core->call_setup_info.tel_number, number, strlen(number)); + } + } + + event_data.contact_index = -1; + event_data.phone_type = -1; + + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_TO_UI, (void *)&event_data); + + { + int call_handle = 1; + vc_engine_outgoing_orig_type orig_event_data; + + memset(&orig_event_data, 0, sizeof(orig_event_data)); + orig_event_data.call_handle = call_handle; + orig_event_data.bemergency = TRUE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, bemergency:[%d]", orig_event_data.call_handle, orig_event_data.bemergency); + vcall_engine_send_event_to_client(VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI_TEST, (void *)&orig_event_data); + } + + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function processes sat setup call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_sat_setup_call(vcall_engine_sat_setup_call_info_t *sat_setup_call_info) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + voicecall_core_process_sat_setup_call(sat_setup_call_info); + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function processes incoming call. + * + * @return int API Result Code. + * @param[in] +*/ +int vcall_engine_process_incoming_call(vcall_engine_incoming_info_t *incoming_call_info) +{ + call_vc_core_incoming_info_t tmp_incom_info = { 0, }; + + CALL_ENG_DEBUG(ENG_WARN, ".."); + + tmp_incom_info.call_handle = incoming_call_info->call_handle; + tmp_incom_info.call_type = incoming_call_info->call_type; + tmp_incom_info.cli_presentation_indicator = incoming_call_info->cli_presentation_indicator; + _vc_core_util_strcpy(tmp_incom_info.call_num, sizeof(tmp_incom_info.call_num), incoming_call_info->call_num); + tmp_incom_info.calling_name_mode = incoming_call_info->calling_name_mode; + _vc_core_util_strcpy(tmp_incom_info.calling_name, sizeof(tmp_incom_info.calling_name), incoming_call_info->calling_name); + _vc_core_util_strcpy(tmp_incom_info.redirected_number, sizeof(tmp_incom_info.redirected_number), incoming_call_info->redirected_number); + _vc_core_util_strcpy(tmp_incom_info.redirected_sub_address, sizeof(tmp_incom_info.redirected_sub_address), incoming_call_info->redirected_sub_address); + tmp_incom_info.cli_cause = incoming_call_info->cli_cause; + tmp_incom_info.bfwded = incoming_call_info->bfwded; + tmp_incom_info.active_line = incoming_call_info->active_line; + + voicecall_core_process_incoming_call(&tmp_incom_info); + return VCALL_ENGINE_API_SUCCESS; +} + +/** + * This function answers an incoming call + * + * @return int API Result Code. + * @param[in] none +*/ +int vcall_engine_answer_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = VCALL_ENGINE_API_FAILED; + + ret = voicecall_core_answer_call(global_pcall_core, FALSE); + CALL_ENG_DEBUG(ENG_DEBUG, " ret:[%d]", ret); + return ret; +} + +/** + * This function answers an incoming call according to the given type + * + * @return int API Result Code. + * @param[in] answer_type answer type + */ +int vcall_engine_answer_call_by_type(vcall_engine_answer_type_t answer_type) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + CALL_ENG_DEBUG(ENG_DEBUG, "answer_type:[%d]", answer_type); + + if (TRUE == voicecall_core_answer_call_bytype(global_pcall_core, answer_type)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } + +} + +/** + * This function cancel outgoing call + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_cancel_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + + if (TRUE == voicecall_core_cancel_call(global_pcall_core)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function reject incoming call + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_reject_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + + if (TRUE == voicecall_core_reject_mt(global_pcall_core, TRUE)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function release a active or held call + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_release_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + + if (TRUE == voicecall_core_end_call(global_pcall_core)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function release a call by handle + * + * @return int API Result Code. + * @param[in] int call_handle + */ +int vcall_engine_release_call_by_handle(int call_handle) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle:[%d]", call_handle); + + if (TRUE == voicecall_core_end_call_by_handle(global_pcall_core, call_handle)) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function release calls by type + * + * @return int API Result Code. + * @param[in] release_type release_type + */ +int vcall_engine_release_call_by_type(vcall_engine_release_type_t release_type) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " release_type : [%d]", release_type); + switch (release_type) { + case VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS: + { + ret = voicecall_core_end_all_active_calls(global_pcall_core); + } + break; + + case VCALL_ENGINE_RELEASE_ALL_HELD_CALLS: + { + ret = voicecall_core_end_all_held_calls(global_pcall_core); + } + break; + + case VCALL_ENGINE_RELEASE_ALL_CALLS: + { + ret = voicecall_core_end_all_calls(global_pcall_core); + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, " Unknown release_type : [%d]", release_type); + break; + + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processes hold/retrive/swap calls. + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_process_hold_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_process_hold_call(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processes in call SS code.. + * + * @return int API Result Code. + * @param[in] none + */ +void vcall_engine_process_incall_ss(char *number) +{ + CALL_ENG_DEBUG(ENG_WARN, "number(%s)"); + + voicecall_core_process_incall_ss(global_pcall_core, number); +} + +/** + * This function sets up a conference calls + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_join_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_setup_conference(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function make a private call in conference calls. + * + * @return int API Result Code. + * @param[in] int call_handle + */ +int vcall_engine_split_call(int call_handle) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_make_private_call(global_pcall_core, call_handle); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function transfers the call from active call to the held call + * + * @return int API Result Code. + * @param[in] int call_handle + */ +int vcall_engine_transfer_call(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_transfer_calls(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processed loud speaker. + * + * @return int API Result Code. + * @param[in] int bstatus + */ +int vcall_engine_process_loudspeaker(int bstatus) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " bstatus : [%d]", bstatus); + if (bstatus) { + ret = voicecall_service_loudspeaker_on(global_pcall_core); + } else { + ret = voicecall_service_loudspeaker_off(global_pcall_core); + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processed voice mute status. + * + * @return int API Result Code. + * @param[in] int bstatus + */ +int vcall_engine_process_voice_mute(int bstatus) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " bstatus : [%d]", bstatus); + if (bstatus) { + ret = voicecall_service_mute_status_on(global_pcall_core); + } else { + ret = voicecall_service_mute_status_off(global_pcall_core); + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function gets the volume level + * + * @return int API Result Code. + * @param[in] vcall_engine_vol_type_t vol_type + * @param[in] voicecall_snd_volume_alert_type_t vol_alert_type + */ +int vcall_engine_get_volume_level(vcall_engine_vol_type_t vol_type) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + + CALL_ENG_DEBUG(ENG_DEBUG, " vol_type : [%d]", vol_type); + /* jspark 201007 decide to sync or async. */ + + return voicecall_snd_get_volume(global_pcall_core->papp_snd, vol_type); + +} + +/** + * This function sets the volume level + * + * @return int API Result Code. + * @param[in] vcall_engine_vol_type_t vol_type + * @param[in] int vol_level + */ +int vcall_engine_set_volume_level(vcall_engine_vol_type_t vol_type, int vol_level) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " vol_type : [%d], vol_level:[%d]", vol_type, vol_level); + ret = voicecall_service_set_volume(global_pcall_core, vol_type, vol_level); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function stop alert + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_stop_alert(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_stop_alert(global_pcall_core); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function mute alert. + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_mute_alert(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_snd_mute_alert(global_pcall_core->papp_snd); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function play minute minder. + * + * @return int API Result Code. + * @param[in] none + */ +int vcall_engine_play_minute_minder(void) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_snd_play_effect_tone(global_pcall_core->papp_snd, VOICE_CALL_SND_EFFECT_CALL_MINUTE_MINDER); + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function process auto redial. + * + * @return int API Result Code. + * @param[in] int bstatus + */ +int vcall_engine_process_auto_redial(int bstatus) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + CALL_ENG_DEBUG(ENG_DEBUG, " bstatus : [%d]", bstatus); + if (bstatus) { + ret = voicecall_core_start_redial(global_pcall_core, TRUE); + } else { + ret = voicecall_core_stop_redial(global_pcall_core); + } + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function send the DTMF number + * + * @return int API Result Code. + * @param[in] char* dtmf_number + */ +int vcall_engine_send_dtmf_number(char *dtmf_number) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_send_dtmf(global_pcall_core, dtmf_number); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function processed sound path + * + * @return int API Result Code. + * @param[in] int sound_path + */ +int vcall_engine_change_sound_path(vcall_engine_audio_type_t sound_path) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_change_sound_path(global_pcall_core, sound_path); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function get sound path + * + * @return int API Result Code. + * @param[out] int sound_path + */ +int vcall_engine_get_sound_path(int *sound_path) +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + int snd_path = 0; + + ret = voicecall_core_get_sound_path(global_pcall_core, &snd_path); + + if (snd_path == VOICE_CALL_AUDIO_SPEAKER) { + *sound_path = VCALL_ENGINE_AUDIO_SPEAKER; + } else if (snd_path == VOICE_CALL_AUDIO_HEADSET) { + *sound_path = VCALL_ENGINE_AUDIO_HEADSET; + } else if (snd_path == VOICE_CALL_AUDIO_RECEIVER_EARJACK) { + *sound_path = VCALL_ENGINE_AUDIO_RECEIVER_EARJACK; + } else { + *sound_path = VCALL_ENGINE_AUDIO_RECEIVER_EARJACK; + } + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function set call engine to default + * + * @return int API Result Code. + * @param[in] + */ +int vcall_engine_set_to_default() +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_set_to_default(global_pcall_core); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +/** + * This function set call engine to default + * + * @return int API Result Code. + * @param[in] + */ +int vcall_engine_deinit() +{ + CALL_ENG_DEBUG(ENG_WARN, ".."); + int ret = FALSE; + + ret = voicecall_core_deinit(global_pcall_core); + + if (ret == TRUE) { + return VCALL_ENGINE_API_SUCCESS; + } else { + return VCALL_ENGINE_API_FAILED; + } +} + +gpointer vcall_engine_get_core_state(void) +{ + return global_pcall_core; +} + +/** + * This function is interface to call-utility to perform string copy + * + * @return instance of the core state + * @param[out] pbuffer Target Buffer + * @param[in] buf_count Size of Target Buffer + * @param[in] pstring Source String + */ +gboolean vcall_engine_util_strcpy(char *pbuffer, int buf_count, const char *pstring) +{ + return _vc_core_util_strcpy(pbuffer, buf_count, pstring); +} + +/** + * This function returns the number of groups + * + * @param[in] pcount count of the groups + */ +gboolean vcall_engine_get_group_count(int *pcount) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + return _vc_core_engine_group_get_enabled_group_count(global_pcall_core->pcall_engine, pcount); +} + +/** + * This function is force reset all engine status. + * + * @return void + * @param[in] void + */ +void vcall_engine_force_reset(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + voicecall_snd_unregister_cm(global_pcall_core->papp_snd); + + vcall_engine_deinit(); + + _vc_core_util_set_call_status(VCONFKEY_CALL_OFF); + + voicecall_core_end_all_calls(global_pcall_core); +} + +/** + * This function will process the dtmf send request from UI + * It is executed when wait(w/W/;) is finished while sending a dtmf string + * + * @return void + * @param[in] void + */ +void vcall_engine_send_dtmf(gboolean bsuccess) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + voicecall_core_process_dtmf_send_status(global_pcall_core, bsuccess); +} + +/** + * This function cancel dtmf queue + * + * @return void + * @param[in] void + */ +void vcall_engine_cancel_dtmf(void) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + voicecall_core_cancel_dtmf_queue(global_pcall_core); +} + + +/** + * This function is interface to call-utility to check for ss string + * + * @return TRUE or FALSE if success/failure + * @param[in] call_number pointer to the number + */ +gboolean vcall_engine_check_incall_ss_string(char *call_number) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + return _vc_core_util_check_incall_ss_string(call_number); +} + +/** + * This function checks whether a given number is a SS string or not + * + * @return TRUE or FALSE if success/failure + * @param[in] call_number pointer to the number + */ +gboolean vcall_engine_check_ss_string(char *call_number) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + return _vc_core_util_check_ss_string(call_number); +} + +/** + * This function controls the lcd state + * + * @return void + * @param[in] lcd_state state of the lcd control + */ +void vcall_engine_device_control_lcd_state(voicecall_lcd_control_t lcd_state) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + _voicecall_dvc_control_lcd_state(lcd_state); +} + +gboolean vcall_engine_disable_flight_mode() +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + return _voicecall_core_disable_flight_mode(global_pcall_core); +} + +gboolean vcall_engine_get_network_status(int *nw_status) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + return _vc_core_util_get_nw_status(nw_status); +} + diff --git a/call-engine/voice-call-service.c b/call-engine/voice-call-service.c new file mode 100755 index 0000000..8e1ddba --- /dev/null +++ b/call-engine/voice-call-service.c @@ -0,0 +1,427 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "voice-call-service.h" +#include "vc-core-util.h" +#include "voice-call-core.h" +#include "voice-call-sound.h" +#include "voice-call-bt.h" +#include +#include + +static int __voicecall_service_get_person_id_with_num(const char *phonenumber) +{ + contacts_query_h query = NULL; + contacts_filter_h filter = NULL; + contacts_list_h list = NULL; + contacts_record_h record = NULL; + contacts_error_e err = CONTACTS_ERROR_NONE; + int person_id = -1; + unsigned int projection[] = { + _contacts_person_number.person_id, + }; + + if (contacts_query_create(_contacts_person_number._uri, &query) != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_query_create is error"); + } else if (contacts_filter_create(_contacts_person_number._uri, &filter) != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_filter_create is error"); + } else if (contacts_filter_add_str(filter, _contacts_person_number.number_filter, CONTACTS_MATCH_EXACTLY, phonenumber) != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_filter_add_str is error"); + } else if (contacts_query_set_filter(query, filter) != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_query_set_filter is error"); + } else if (contacts_query_set_projection(query, projection, sizeof(projection)/sizeof(unsigned int)) != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_query_set_projection is error"); + } else if (contacts_query_set_distinct(query, TRUE) != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_query_set_distinct is error"); + } + + err = contacts_db_get_records_with_query(query, 0, 0, &list); + + if (CONTACTS_ERROR_NONE == err) { + contacts_list_first(list); + + while(CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) { + contacts_record_get_int(record, _contacts_person_number.person_id, &person_id); + CALL_ENG_DEBUG(ENG_ERR, "person id %d", person_id); + err = contacts_list_next(list); + if (CONTACTS_ERROR_NONE != err) + break; + } + + err = contacts_list_destroy(list, TRUE); + if (err != CONTACTS_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_list_destroy is error"); + } + } + + contacts_filter_destroy(filter); + contacts_query_destroy(query); + return person_id; +} + +/** + * This function gets contact info from phone number + * + * @return gboolean + * @param[in] phonenumber phone number + * @param[out] ct_info contact info + */ +gboolean voicecall_service_contact_info_by_number(char *phonenumber, voicecall_contact_info_t * ct_info) +{ + CALL_ENG_KPI("voicecall_service_contact_info_by_number start"); + contacts_error_e err = CONTACTS_ERROR_NONE; + contacts_record_h person_record = NULL; + + VOICECALL_RETURN_FALSE_IF_FAIL(phonenumber != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(ct_info != NULL); + + CALL_ENG_DEBUG(ENG_DEBUG, "num:[%s],index:[%d]..", phonenumber, ct_info->ct_index); + + err = contacts_connect2(); + if (CONTACTS_ERROR_NONE != err) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_connect2 is error : %d", err); + ct_info->ct_index = -1; + ct_info->phone_type = -1; + return FALSE; + } + + if (ct_info->ct_index == -1) { + /* Get person ID with phone number */ + ct_info->ct_index = __voicecall_service_get_person_id_with_num(phonenumber); + + if (ct_info->ct_index == -1) { + CALL_ENG_DEBUG(ENG_DEBUG, "Can not find person ID"); + ct_info->ct_index = -1; + ct_info->phone_type = -1; + return FALSE; + } + } + + err = contacts_db_get_record(_contacts_person_number._uri, ct_info->ct_index, &person_record); + if (CONTACTS_ERROR_NONE != err) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_db_get_record error %d", err); + } else { + char *name = NULL; + char *img_path = NULL; + char *ringtone_path = NULL; + + /* Get display name */ + err = contacts_record_get_str(person_record, _contacts_person_number.display_name, &name); + if (CONTACTS_ERROR_NONE != err) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_record_get_str(display name) error %d", err); + } else { + _vc_core_util_strcpy(ct_info->display_name, sizeof(ct_info->display_name), name); + free(name); + } + + /* Get caller id path */ + err = contacts_record_get_str(person_record, _contacts_person_number.image_thumbnail_path, &img_path); + if (CONTACTS_ERROR_NONE != err) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_record_get_str(caller id path) error %d", err); + } else { + _vc_core_util_strcpy(ct_info->caller_id_path, sizeof(ct_info->caller_id_path), img_path); + free(img_path); + } + + /* Get ringtone path */ + err = contacts_record_get_str(person_record, _contacts_person_number.ringtone_path, &ringtone_path); + if (CONTACTS_ERROR_NONE != err) { + CALL_ENG_DEBUG(ENG_ERR, "contacts_record_get_str(ringtone path) error %d", err); + } else { + _vc_core_util_strcpy(ct_info->ring_tone, sizeof(ct_info->ring_tone), ringtone_path); + free(ringtone_path); + } + contacts_record_destroy(person_record, TRUE); + + } + + CALL_ENG_DEBUG(ENG_DEBUG, "contact index:[%d]", ct_info->ct_index); + CALL_ENG_DEBUG(ENG_DEBUG, "display name:[%s]", ct_info->display_name); + CALL_ENG_DEBUG(ENG_DEBUG, "img path:[%s]", ct_info->caller_id_path); + CALL_ENG_DEBUG(ENG_DEBUG, "ringtone path:[%s]", ct_info->ring_tone); + + contacts_disconnect2(); + return TRUE; +} + +/** + * This function gets contact info from contact id + * + * @return gboolean + * @param[in] phonenumber phone number + * @param[in] contact_id contact id + * @param[in] storage_type storage type + * @param[out] ct_info contact info + */ +gboolean voicecall_service_contact_info_by_contact_id(char *phonenumber, int contact_id, voicecall_contact_info_t * ct_info) +{ +#ifdef _CT_SEARCH_BY_ID_ + VOICECALL_RETURN_FALSE_IF_FAIL(phonenumber != NULL); + VOICECALL_RETURN_FALSE_IF_FAIL(ct_info != NULL); + + int bfound = FALSE; + int ret; + contact_t record; + int index = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + memset(&record, 0, sizeof(contact_t)); + + if (contact_db_service_connect() != CONTACT_OPERATION_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "contact_db_service_connect error"); + return FALSE; + } + + ret = contact_db_service_contact_get(CONTACT_DB_GET_RECORD_BY_KEY, contact_id, storage_type, &record); + + if (ret == CONTACT_OPERATION_SUCCESS) { + bfound = TRUE; + } else { + bfound = FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, " bfound = [%d]", bfound); + if (bfound) { + if (record.contact.display_name != NULL) + _vc_core_util_strcpy(ct_info->display_name, sizeof(ct_info->display_name), record.contact.display_name); + if (record.contact.media_data.ringtone_path != NULL) + _vc_core_util_strcpy(ct_info->ring_tone, sizeof(ct_info->ring_tone), record.contact.media_data.ringtone_path); + + ct_info->ct_index = contact_id; + ct_info->storage_type = storage_type; + + CALL_ENG_DEBUG(ENG_DEBUG, "phone count:[%d]", record.phone_count); + for (index = 0; index < record.phone_count; index++) { + if (strcmp(record.phone_info[index].number, phonenumber) == 0) { + ct_info->phone_type = record.phone_info[index].type; + } + } + CALL_ENG_DEBUG(ENG_DEBUG, "*** found ***"); + CALL_ENG_DEBUG(ENG_DEBUG, "name:[%s] vs [%s]", ct_info->display_name, record.contact.display_name); + CALL_ENG_DEBUG(ENG_DEBUG, "ringtone path:[%s] vs [%s]", ct_info->ring_tone, record.contact.media_data.ringtone_path); + } else { + ct_info->ct_index = contact_id; + ct_info->storage_type = storage_type; + ct_info->phone_type = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, "not found. name:[%s], path:[%s]", ct_info->display_name, ct_info->caller_id_path); + } + + contact_db_service_contact_free(&record); + if (contact_db_service_disconnect() != CONTACT_OPERATION_SUCCESS) { + CALL_ENG_DEBUG(ENG_DEBUG, "contact_db_service_disconnect error"); + return FALSE; + } +#endif + return TRUE; +} + +/** + * This function on the loud speaker state + * + * @return gboolean + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_service_loudspeaker_on(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + gboolean ret = FALSE; + int total_call_member = -1; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + if (total_call_member == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "There are not active calls hence it should not work"); + return FALSE; + } + + /* Toggle the LoudSpeaker Status */ + if (voicecall_snd_get_path_status(pcall_core->papp_snd) != VOICE_CALL_SND_PATH_SPEAKER) { + if (TRUE == _vc_bt_is_bt_connected(pcall_core) && + (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_BT)) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_SPEAKER); + _vc_bt_request_switch_headset_path(pcall_core, FALSE); + } else { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_SPEAKER); + voicecall_snd_change_path(papp_snd); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "loudspeacker is already on."); + ret = FALSE; + } + return ret; +} + +/** + * This function off the loud speaker state + * + * @return gboolean + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_service_loudspeaker_off(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean ret = FALSE; + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + int total_call_member = -1; + voicecall_core_get_total_call_member(pcall_core->pcall_engine, &total_call_member); + if (total_call_member == 0) { + CALL_ENG_DEBUG(ENG_DEBUG, "There are not active calls hence it should not work"); + return FALSE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_SPEAKER) { + if (TRUE == _vc_bt_is_bt_connected(pcall_core)) { + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT); + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Set VOICE_CALL_SND_PATH_RECEIVER_EARJACK"); + voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK); + voicecall_snd_change_path(papp_snd); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "loudspeacker is already on."); + ret = FALSE; + } + return ret; +} + +/** + * This function is mute on + * + * @return void + * @param[in] pcall_core Handle to voicecall core + */ + +gboolean voicecall_service_mute_status_on(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bactive_calls = FALSE; + gboolean bheld_calls = FALSE; + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + voicecall_core_is_call_exists(pcall_engine, &bactive_calls, &bheld_calls); + + if (FALSE == bactive_calls && TRUE == bheld_calls) { + CALL_ENG_DEBUG(ENG_DEBUG, "nothing to do."); + /*Mute button should not be handled if only held calls exists */ + return TRUE; + } + + if (FALSE == papp_snd->bmute_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Voice Audio Mute Status On."); + voicecall_core_set_audio_mute_status(pcall_engine, TRUE); + papp_snd->bmute_status = TRUE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "mute status is already on."); + return FALSE; + } + +} + +/** + * This function is mute off + * + * @return void + * @param[in] pcall_core Handle to voicecall core + */ +gboolean voicecall_service_mute_status_off(call_vc_core_state_t *pcall_core) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + gboolean bactive_calls = FALSE; + gboolean bheld_calls = FALSE; + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + voicecall_engine_t *pcall_engine = pcall_core->pcall_engine; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + voicecall_core_is_call_exists(pcall_engine, &bactive_calls, &bheld_calls); + + if (FALSE == bactive_calls && TRUE == bheld_calls) { + CALL_ENG_DEBUG(ENG_DEBUG, "nothing to do."); + /*Mute button should not be handled if only held calls exists */ + return TRUE; + } + + if (TRUE == papp_snd->bmute_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "Setting Voice Audio Mute Status Off."); + voicecall_core_set_audio_mute_status(pcall_engine, FALSE); + papp_snd->bmute_status = FALSE; + return TRUE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "mute status is already off."); + return FALSE; + } + +} + +/** + * This function set volume level. + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] pcall_core Handle to voicecall core + * @param[in] vol_alert_type volume alert type + * @param[in] volume_level volume level to be set + */ +gboolean voicecall_service_set_volume(call_vc_core_state_t *pcall_core, voicecall_snd_volume_alert_type_t vol_alert_type, int volume_level) +{ + VOICECALL_RETURN_FALSE_IF_FAIL(pcall_core != NULL); + + voicecall_snd_mgr_t *papp_snd = pcall_core->papp_snd; + + voicecall_snd_set_volume(papp_snd, vol_alert_type, volume_level); + + return TRUE; +} + +/** + * This function will get the flight mode setting by checking the vconf entry + * + * @return void + * @param[out] bflight flight mode enabled or disabled + */ +gboolean voicecall_service_get_flight_mode_setting(int *bflight) +{ + gboolean flight_mode = -1; + int ret_val = -1; + + ret_val = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode); + if (ret_val) { + CALL_ENG_DEBUG(ENG_WARN, "vconf_get_int failed.. ret_val: %d", ret_val); + return FALSE; + } + + *bflight = (int) flight_mode; + CALL_ENG_DEBUG(ENG_DEBUG, "flight-mode : %d", *bflight); + + return TRUE; +} + diff --git a/call-engine/voice-call-sound.c b/call-engine/voice-call-sound.c new file mode 100755 index 0000000..46ddbc7 --- /dev/null +++ b/call-engine/voice-call-sound.c @@ -0,0 +1,1504 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "voice-call-sound.h" +#include "vc-core-util.h" +#include "vc-core-engine-types.h" +#include "voice-call-core.h" +#include "voice-call-bt.h" +#include "voice-call-service.h" +#include "voice-call-device.h" +#include +#include + +#include +#include + +#ifdef _VC_TONE_PLAYER_MINUTE_MINDER +#include +#endif + +#define VOICE_CALL_SND_INVALID_SND_HANDLE -1 /**pcall_core = pcall_core; + psnd_mgr->current_snd_path = VOICE_CALL_SND_PATH_RECEIVER_EARJACK; + psnd_mgr->old_snd_path = VOICE_CALL_SND_PATH_NONE; + psnd_mgr->bsound_cm_state = FALSE; + + psnd_mgr->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + psnd_mgr->pmm_signal_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + + psnd_mgr->pmm_effect_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + psnd_mgr->pmm_call_waiting_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + + psnd_mgr->psignal_play_end_cb = NULL; + psnd_mgr->psignal_play_end_cb_data = NULL; + + /*Return the created Sound Manager */ + *papp_snd = psnd_mgr; + return TRUE; + +} + +void __voicecall_snd_alternate_sound_cb(void *puser_data); +void __voicecall_snd_play_alternate_sound(voicecall_snd_mgr_t *papp_snd); +gboolean __voicecall_snd_stop_alternate_sound(voicecall_snd_mgr_t *papp_snd); + +gboolean __voicecall_snd_alternate_sound_idle_cb(void *puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (TRUE == papp_snd->balternate_play) { + if ((FALSE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) + && (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine))) { + /* case : during 2nd incoming call, connected call is cleared. so, just 1 incoming call case... */ + CALL_ENG_DEBUG(ENG_DEBUG, "2nd incoming -> just single incoming call."); + voicecall_snd_prepare_alert(papp_snd, papp_snd->incoming_call_handle); + sound_manager_call_session_set_mode(papp_snd->psnd_session, SOUND_CALL_SESSION_MODE_RINGTONE); + voicecall_snd_play_alert(papp_snd); + } else { + __voicecall_snd_play_alternate_sound(papp_snd); + } + } + + return FALSE; +} + +gboolean __voicecall_snd_alternate_play_timeout_cb(gpointer pdata) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)pdata; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + if (papp_snd->balternate_play == TRUE) { + __voicecall_snd_play_alternate_sound(papp_snd); + } + + return FALSE; +} + +void __voicecall_snd_play_alternate_sound(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + if (TRUE == voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Incoming call is there!Play Alternate Sound"); + + int mmf_error = -1; + + char ring_tone[VOICE_CALL_SND_RINGTONE_PATH_LEN]; + snprintf(ring_tone, sizeof(ring_tone), "file://%s", VOICE_CALL_SND_SECOND_RINGTONE_PATH); + + sound_manager_call_session_set_mode(pcall_core->papp_snd->psnd_session, SOUND_CALL_SESSION_MODE_MEDIA); + + CALL_ENG_DEBUG(ENG_DEBUG, "Call mm_sound_play_sound to play alternate ringtonen"); + + mmf_error = tone_player_start(TONE_TYPE_SUP_CALL_WAITING, SOUND_TYPE_MEDIA, 4000, &papp_snd->pmm_call_waiting_play_handle); + + if (mmf_error == TONE_PLAYER_ERROR_NONE) { + papp_snd->balternate_play = TRUE; + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_PLAY; + CALL_ENG_DEBUG(ENG_DEBUG, "Alternate Sound Play Called,papp_snd->balternate_play=%d", papp_snd->balternate_play); + } else { + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOP; + papp_snd->balternate_play = FALSE; + CALL_ENG_DEBUG(ENG_DEBUG, "mmf_error = [0x%x]", mmf_error); + } + __voicecall_snd_alternate_sound_cb(papp_snd); + CALL_ENG_DEBUG(ENG_DEBUG, "End of Alternate Sound!"); + } +} + +gboolean __voicecall_snd_stop_alternate_sound(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, " papp_snd->balternate_play = %d", papp_snd->balternate_play); + if (TRUE == papp_snd->balternate_play) { + /*Only Stop if it is in Play State */ + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->ringtone_sound_status) { + int error = 0; + error = tone_player_stop(papp_snd->pmm_call_waiting_play_handle); + papp_snd->pmm_call_waiting_play_handle = -1; + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOP; + CALL_ENG_DEBUG(ENG_ERR, "Alternate Ringtone Stopeed,Error Code: [0x%x]", error); + } + papp_snd->balternate_play = FALSE; + return TRUE; + } + return FALSE; +} + +void __voicecall_snd_alternate_sound_cb(void *puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->balternate_play= %d", papp_snd->balternate_play); + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + /*If connected call exists then change the audio path */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))) { + voicecall_snd_change_path(papp_snd); + } + + g_timeout_add(VOICE_CALL_SND_2ND_CALL_BEEP_INTERVAL, __voicecall_snd_alternate_sound_idle_cb, papp_snd); + +} + +void voicecall_snd_prepare_alert(voicecall_snd_mgr_t *papp_snd, int call_handle) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + int err_code = -1; + + papp_snd->incoming_call_handle = call_handle; + + /* Save the original volume level to reset */ + err_code = sound_manager_get_volume(SOUND_TYPE_RINGTONE, &(papp_snd->org_ringtone_value)); + + if (SOUND_MANAGER_ERROR_NONE != err_code) { + CALL_ENG_DEBUG(ENG_ERR, "Get Volume Error: [0x%x]", err_code); + return; + } + + if (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Alternate Sound Needs to be played"); + papp_snd->ringtone_sound_status = VOICE_CALL_AND_STATUS_ALTERNATE_PLAY; + return; + } + + /* + Always stop the alert before starting another + to make sure the previous alert is proerly closed. + */ + voicecall_snd_stop_alert(papp_snd); + + /*Initizlize Variables */ + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + papp_snd->settings_sound_status = FALSE; + papp_snd->settings_vib_status = FALSE; + + err_code = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &papp_snd->settings_sound_status); + CALL_ENG_DEBUG(ENG_DEBUG, "cur_sound_status = %d, error_code = %d", papp_snd->settings_sound_status, err_code); + + err_code = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &papp_snd->settings_vib_status); + CALL_ENG_DEBUG(ENG_DEBUG, "cur_vib_status = %d, error_code = %d", papp_snd->settings_vib_status, err_code); + + if (papp_snd->settings_sound_status == FALSE) + papp_snd->bmute_play = TRUE; + + __voicecall_snd_start_melody(papp_snd, FALSE, call_handle); +} + +void voicecall_snd_play_alert(voicecall_snd_mgr_t *papp_snd) +{ + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->ringtone_sound_status=%d", papp_snd->ringtone_sound_status); + + if (VOICE_CALL_AND_STATUS_ALTERNATE_PLAY == papp_snd->ringtone_sound_status) { + if (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Starting Alternate Sound"); + papp_snd->balternate_play_count = 0; + __voicecall_snd_play_alternate_sound(papp_snd); + } + } + + if (VOICE_CALL_SND_STATUS_READY != papp_snd->ringtone_sound_status) { + CALL_ENG_DEBUG(ENG_DEBUG, " Invalid ringtone_sound_status: %d", papp_snd->ringtone_sound_status); + return; + } + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_PROCESSED; + + CALL_ENG_DEBUG(ENG_DEBUG, " [##### papp_snd->settings_sound_status #####] : %d", papp_snd->settings_sound_status); + CALL_ENG_DEBUG(ENG_DEBUG, " [##### papp_snd->settings_vib_status #####] : %d", papp_snd->settings_vib_status); + + sound_manager_call_session_set_mode(papp_snd->psnd_session, SOUND_CALL_SESSION_MODE_RINGTONE); + __voicecall_snd_play_melody(papp_snd, FALSE); + + if (papp_snd->settings_vib_status) { + __voicecall_snd_start_vibration(papp_snd); + } +} + +gboolean voicecall_snd_mute_alert(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + if (papp_snd->pmm_player != VOICE_CALL_SND_INVALID_PLAYER_HANDLE) { + int ret_value = PLAYER_ERROR_NONE; + + ret_value = player_set_mute(papp_snd->pmm_player, TRUE); + CALL_ENG_DEBUG(ENG_DEBUG, "MM Set Mute Error code: [0x%x]", ret_value); + } + + if (TRUE == papp_snd->bvibration) { + CALL_ENG_DEBUG(ENG_DEBUG, "Vibration is playing, stopping vibration"); + __voicecall_snd_stop_vibration(papp_snd); + } + + /*Make Vibration than melody flag to FALSE, so melody will not be played when it is muted */ + papp_snd->bvibration_then_melody = FALSE; + + /*Make Increasing Melody flag to FALSE, so melody volume will not be increased when it is muted */ + papp_snd->bincreasingmelody = FALSE; + + return FALSE; +} + +/** + * This function stops the sound alert + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + */ +void voicecall_snd_stop_alert(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + __voicecall_snd_stop_vibration(papp_snd); + + if (TRUE == __voicecall_snd_stop_alternate_sound(papp_snd)) { + CALL_ENG_DEBUG(ENG_DEBUG, "Alternate sound stopped"); + return; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "pmm_player = %d", papp_snd->pmm_player); + if (papp_snd->pmm_player != VOICE_CALL_SND_INVALID_PLAYER_HANDLE) { + int ret_value = PLAYER_ERROR_NONE; + player_state_e mmplayer_state = PLAYER_STATE_NONE; + + player_get_state(papp_snd->pmm_player, &mmplayer_state); + CALL_ENG_DEBUG(ENG_DEBUG, "Callling mmplayer_stop, current mm state = %d, Player = %d", mmplayer_state, papp_snd->pmm_player); + + if (PLAYER_STATE_PLAYING == mmplayer_state || PLAYER_STATE_PAUSED == mmplayer_state) { + ret_value = player_stop(papp_snd->pmm_player); + if (PLAYER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_stop failed: [0x%x]", ret_value); + } + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Callling mmplayer_unrealize, Player = %d", papp_snd->pmm_player); + ret_value = player_unprepare(papp_snd->pmm_player); + if (PLAYER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_unrealize failed: [0x%x]", ret_value); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Callling mmplayer_destroy, Player = %d", papp_snd->pmm_player); + ret_value = player_destroy(papp_snd->pmm_player); + if (PLAYER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_destroy failed: [0x%x]", ret_value); + } + + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + ret_value = sound_manager_set_volume(SOUND_TYPE_RINGTONE, papp_snd->org_ringtone_value); + + if (SOUND_MANAGER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "Set Volume Error: [0x%x]", ret_value); + } + } + + /* Stop All periodic Timers */ + papp_snd->bvibration_then_melody = FALSE; + papp_snd->bincreasingmelody = FALSE; + + /* Make the Current Sound Playing Call HAndle Invalid */ + papp_snd->current_playing_call_handle = -1; + + papp_snd->bmute_play = FALSE; + +} + +gboolean voicecall_snd_set_play_end_callback(voicecall_snd_mgr_t *papp_snd, voicecall_snd_callback psignal_play_end_cb, gpointer psignal_play_end_cb_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "signal_type = %d", papp_snd->signal_type); + + if (VOICE_CALL_SND_STATUS_NONE == papp_snd->signal_sound_status) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Signal Being Played"); + return FALSE; + } + + papp_snd->psignal_play_end_cb = psignal_play_end_cb; + papp_snd->psignal_play_end_cb_data = psignal_play_end_cb_data; + + return TRUE; +} + +/** + * This function plays call sound + * + * @return Returns TRUE on success or FALSE on failure + * @param[in] papp_snd Handle to Sound Manager + */ +gboolean voicecall_snd_is_signal_playing(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Signal Sound Status : [%d]", papp_snd->signal_sound_status); + if (((papp_snd->pmm_signal_play_handle != VOICE_CALL_SND_INVALID_SND_HANDLE) && (VOICE_CALL_SND_STATUS_PLAY == papp_snd->signal_sound_status)) || + ((papp_snd->pmm_effect_play_handle != VOICE_CALL_SND_INVALID_SND_HANDLE) && (VOICE_CALL_SND_STATUS_PLAY == papp_snd->signal_sound_status))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Signal is playing"); + return TRUE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Signal is not playing"); + return FALSE; +} + +gboolean voicecall_snd_play_signal(voicecall_snd_mgr_t *papp_snd, voicecall_snd_callback psignal_play_end_cb, gpointer psignal_play_end_cb_data) +{ + int ret_value = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "signal_type = %d", papp_snd->signal_type); + + if (VOICE_CALL_SIGNAL_NONE == papp_snd->signal_type) { + CALL_ENG_DEBUG(ENG_DEBUG, "No Signal Type Assigned"); + return FALSE; + } + + /* + Always stop the signal before playing another one + This is to make sure that previous signal sound is stopeed completely + */ + voicecall_snd_stop_signal(papp_snd); + + /*Set status, the signal play is being prepared */ + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_READY; + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->signal_sound_status = %d", papp_snd->signal_sound_status); + + papp_snd->psignal_play_end_cb = psignal_play_end_cb; + papp_snd->psignal_play_end_cb_data = psignal_play_end_cb_data; + + if (TRUE == voicecall_snd_is_effect_playing(papp_snd)) { + CALL_ENG_DEBUG(ENG_ERR, "Stopping effect tone to play signal"); + voicecall_snd_stop_effect_tone(papp_snd); + } + + CALL_ENG_DEBUG(ENG_ERR, "Changing path to play signal"); + sound_manager_call_session_set_mode(papp_snd->psnd_session, SOUND_CALL_SESSION_MODE_MEDIA); + CALL_ENG_DEBUG(ENG_ERR, "Changing path to play signal Over"); + + switch (papp_snd->signal_type) { + case VOICE_CALL_SIGNAL_USER_BUSY_TONE: + ret_value = tone_player_start(TONE_TYPE_SUP_BUSY, SOUND_TYPE_MEDIA, 4000, &papp_snd->pmm_signal_play_handle); + break; + case VOICE_CALL_SIGNAL_WRONG_NUMBER_TONE: + case VOICE_CALL_SIGNAL_CALL_FAIL_TONE: + ret_value = tone_player_start(TONE_TYPE_SUP_ERROR, SOUND_TYPE_MEDIA, 4000, &papp_snd->pmm_signal_play_handle); + break; + case VOICE_CALL_SIGNAL_NW_CONGESTION_TONE: + ret_value = tone_player_start(TONE_TYPE_SUP_CONGESTION, SOUND_TYPE_MEDIA, 4000, &papp_snd->pmm_signal_play_handle); + break; + default: + CALL_ENG_DEBUG(ENG_ERR, "Invalid Signal Type"); + break; + } + + if (TONE_PLAYER_ERROR_NONE != ret_value) { + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_NONE; + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_play_sound failed,Error: [0x%x]", ret_value); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->pmm_signal_play_handle[%d]", papp_snd->pmm_signal_play_handle); + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_PLAY; + g_timeout_add(VOICE_CALL_SIGNAL_PLAY_INTERVAL, __voicecall_snd_mmplayer_signal_tone_snd_end_cb, (gpointer)papp_snd); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Signal Play Started, Sound Status is: %d", papp_snd->signal_sound_status); + + return TRUE; +} + +gboolean voicecall_snd_play_tone(voicecall_snd_mgr_t *papp_snd, voicecall_snd_callback psignal_play_end_cb, gpointer psignal_play_end_cb_data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_snd_play_tone - Play the Call Disconnect tone"); + + /* Set status, the tone play is being prepared */ + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_READY; + + papp_snd->psignal_play_end_cb = psignal_play_end_cb; + papp_snd->psignal_play_end_cb_data = psignal_play_end_cb_data; + + if (TRUE == voicecall_snd_is_effect_playing(papp_snd)) { + CALL_ENG_DEBUG(ENG_ERR, "Stopping effect tone to play signal"); + voicecall_snd_stop_effect_tone(papp_snd); + } + + /* play end tone */ + if (TRUE == voicecall_snd_play_effect_tone(papp_snd, VOICE_CALL_SND_EFFECT_CALL_DISCONNECT)) { + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_PLAY; + g_timeout_add(VOICE_CALL_TONE_PLAY_INTERVAL, __voicecall_snd_mmplayer_signal_tone_snd_end_cb, (gpointer)papp_snd); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Effect tone not played"); + } + + return TRUE; +} + +/** + * This function stops the sound alert + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + */ +void voicecall_snd_stop_signal(voicecall_snd_mgr_t *papp_snd) +{ + int ret_value = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Status: %d, papp_snd->pmm_signal_play_handle(%d)", papp_snd->signal_sound_status, papp_snd->pmm_signal_play_handle); + if (papp_snd->pmm_signal_play_handle != VOICE_CALL_SND_INVALID_SND_HANDLE) { + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->signal_sound_status) { + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + CALL_ENG_DEBUG(ENG_DEBUG, "Stopping Signal Sound"); + ret_value = tone_player_stop(papp_snd->pmm_signal_play_handle); + if (TONE_PLAYER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mm_sound_stop_sound failed: [0x%x]", ret_value); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Play Over / Already Stopped"); + } + papp_snd->pmm_signal_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + } + if (papp_snd->psignal_play_end_cb != NULL) { + papp_snd->psignal_play_end_cb(papp_snd->psignal_play_end_cb_data); + papp_snd->psignal_play_end_cb = NULL; + papp_snd->psignal_play_end_cb_data = NULL; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Application Sound Status:%d", papp_snd->signal_sound_status); +} + +/** + * This function sets the end signal of the given end cause type + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + * @param[in] end_cause_type Type of the end cause + */ +void voicecall_snd_set_signal_type(voicecall_snd_mgr_t *papp_snd, voicecall_snd_signal_type_t signal_type) +{ + papp_snd->signal_type = signal_type; +} + +static void __voicecall_snd_get_voice_path(voicecall_snd_mgr_t *papp_snd, int *voice_snd_path) +{ + voicecall_audio_path_t tmp_audio_path; + + CALL_ENG_DEBUG(ENG_DEBUG, "current path = %d", voicecall_snd_get_path_status(papp_snd)); + + switch (voicecall_snd_get_path_status(papp_snd)) { + case VOICE_CALL_SND_PATH_BT: + { + tmp_audio_path = VC_AUDIO_PATH_BLUETOOTH; + } + break; + case VOICE_CALL_SND_PATH_SPEAKER: + { + tmp_audio_path = VC_AUDIO_PATH_SPK_PHONE; + } + break; + case VOICE_CALL_SND_PATH_RECEIVER_EARJACK: + default: + { + if (_voicecall_dvc_get_earjack_connected() == TRUE) + tmp_audio_path = VC_AUDIO_PATH_HEADSET; + else + tmp_audio_path = VC_AUDIO_PATH_HANDSET; + } + } + *voice_snd_path = tmp_audio_path; + + CALL_ENG_DEBUG(ENG_DEBUG, "voice_snd_path = %d", *voice_snd_path); + +} + +void voicecall_snd_change_mm_path(voicecall_snd_mgr_t *papp_snd) +{ + sound_route_e route = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->current_path_type = %d", papp_snd->current_path_type); + + switch (voicecall_snd_get_path_status(papp_snd)) { + case VOICE_CALL_SND_PATH_BT: + CALL_ENG_DEBUG(ENG_DEBUG, "route path : SOUND_ROUTE_INOUT_BLUETOOTH"); + route = SOUND_ROUTE_INOUT_BLUETOOTH; + break; + + case VOICE_CALL_SND_PATH_SPEAKER: + CALL_ENG_DEBUG(ENG_DEBUG, "route path : SOUND_ROUTE_IN_MIC_OUT_SPEAKER"); + route = SOUND_ROUTE_IN_MIC_OUT_SPEAKER; + break; + + case VOICE_CALL_SND_PATH_RECEIVER_EARJACK: + default: + { + if (_voicecall_dvc_get_earjack_connected() == TRUE) { + if (sound_manager_is_route_available (SOUND_ROUTE_INOUT_HEADSET)) { + CALL_ENG_DEBUG(ENG_DEBUG, "route path : SOUND_ROUTE_INOUT_HEADSET"); + route = SOUND_ROUTE_INOUT_HEADSET; + } else if (sound_manager_is_route_available (SOUND_ROUTE_IN_MIC_OUT_HEADPHONE)) { + route = SOUND_ROUTE_IN_MIC_OUT_HEADPHONE; + CALL_ENG_DEBUG(ENG_DEBUG, "route path : SOUND_ROUTE_IN_MIC_OUT_HEADPHONE"); + } else { + route = SOUND_ROUTE_IN_MIC_OUT_RECEIVER; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "route path : SOUND_ROUTE_IN_MIC_OUT_RECEIVER"); + route = SOUND_ROUTE_IN_MIC_OUT_RECEIVER; + } + } + break; + } + CALL_ENG_DEBUG(ENG_ERR, "route = 0x04X", route); + + if (papp_snd->bsound_cm_state == TRUE) { + CALL_ENG_DEBUG(ENG_ERR, "sound_manager_set_active_route [0x%X]", route); + sound_manager_set_active_route(route); + + CALL_ENG_KPI("mm_sound_set_path done"); + papp_snd->current_path_type = VOICE_CALL_MM_VOICE; + } else { + CALL_ENG_DEBUG(ENG_ERR, "** we can't change mm path. check it. ****"); + } +} + +/** + * This function changes the sound path according to the current status + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + */ +void voicecall_snd_change_path(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + CALL_ENG_KPI("voicecall_snd_change_path start"); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + if (voicecall_snd_get_path_status(papp_snd) == VOICE_CALL_SND_PATH_BT) { + int bt_sco_status = 0; + + bt_sco_status = _vc_bt_get_bt_sco_status(); + if (FALSE == bt_sco_status) { + gboolean bevent_wait = FALSE; + + CALL_ENG_DEBUG(ENG_ERR, "BT Sco is OFF, request BT for path change"); + bevent_wait = voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING); + if (FALSE == bevent_wait) { + /*Request BT for change path to headset */ + _vc_bt_request_switch_headset_path(pcall_core, TRUE); + } else { + CALL_ENG_DEBUG(ENG_ERR, "bevent_wait = %d, waiting for BT Event", bevent_wait); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "BT SCO is open, Change the path to sync with BT Path"); + voicecall_snd_change_path_real(papp_snd); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "new PATH is not BT."); + gboolean bevent_wait = FALSE; + + bevent_wait = voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_BT_EVENT_WAITING); + if (FALSE == bevent_wait) { + /*Request BT for change path to headset */ + voicecall_snd_change_path_real(papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "bevent_wait = %d, waiting for BT Event", bevent_wait); + } + } + CALL_ENG_KPI("voicecall_snd_change_path done"); +} + +void voicecall_snd_change_path_real(voicecall_snd_mgr_t *papp_snd) +{ + sound_call_session_mode_e current_session_mode; + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + /* Change the mm sound path */ + sound_manager_call_session_get_mode(papp_snd->psnd_session, ¤t_session_mode); + + CALL_ENG_DEBUG(ENG_ERR, "current session mode = %d..", current_session_mode); + + if (current_session_mode != SOUND_CALL_SESSION_MODE_VOICE) { + sound_manager_call_session_set_mode(papp_snd->psnd_session, SOUND_CALL_SESSION_MODE_VOICE); + } else { + voicecall_snd_change_mm_path(papp_snd); + } + voicecall_snd_change_modem_path(papp_snd); +} + +void voicecall_snd_change_modem_path(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + int audio_path = VC_AUDIO_PATH_HANDSET; + + /* Change the tapi sound path */ + __voicecall_snd_get_voice_path(papp_snd, &audio_path); + + if (FALSE == voicecall_core_change_audio_path(pcall_core->pcall_engine, audio_path, papp_snd->bextra_volume_status)) { + CALL_ENG_DEBUG(ENG_ERR, "TAPI Audio Change Path ERROR"); + } +} + +/** + * This function sets the status of the given call audio type + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + * @param[in] snd_audio_type Type of the Device to be changed + * @param[in] status Status, TRUE - Enable, FALSE -Disable + */ +void voicecall_snd_set_status(voicecall_snd_mgr_t *papp_snd, voicecall_snd_audio_type_t snd_audio_type, gboolean status) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "snd_audio_type:[%d], status:[%d]", snd_audio_type, status); + + /*if BT headset is connected , switch off loud speaker - it will be reflectd in the next sound path change */ + if (((VOICE_CALL_AUDIO_HEADSET == snd_audio_type) || (VOICE_CALL_AUDIO_RECEIVER_EARJACK == snd_audio_type)) && (TRUE == status)) { + CALL_ENG_DEBUG(ENG_DEBUG, "loud speaker status is to be FALSE"); + papp_snd->bcall_audio_status[VOICE_CALL_AUDIO_SPEAKER] = FALSE; + } + papp_snd->bcall_audio_status[snd_audio_type] = status; +} + +/** + * This function returns the current status of the given call audio type + * + * @return Returns TRUE if given call audio type is enables or FALSE otherwise + * @param[in] papp_snd Handle to Sound Manager + * @param[in] snd_audio_type Type of the Device to be changed + */ +gboolean voicecall_snd_get_status(voicecall_snd_mgr_t *papp_snd, voicecall_snd_audio_type_t snd_audio_type) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "Status[%d] = %d", snd_audio_type, papp_snd->bcall_audio_status[snd_audio_type]); + return papp_snd->bcall_audio_status[snd_audio_type]; +} + +/** + * This function sets the status of the given call audio type + * + * @return void + * @param[in] papp_snd Handle to Sound Manager + * @param[in] snd_audio_type Type of the Device to be changed + * @param[in] status Status, TRUE - Enable, FALSE -Disable + */ +void voicecall_snd_set_path_status(voicecall_snd_mgr_t *papp_snd, voicecall_snd_path_t path) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "current path:[%d], new path:[%d]", papp_snd->current_snd_path, path); + + papp_snd->old_snd_path = papp_snd->current_snd_path; + papp_snd->current_snd_path = path; +} + +voicecall_snd_path_t voicecall_snd_get_path_status(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "old path:[%d], current path:[%d]", papp_snd->old_snd_path, papp_snd->current_snd_path); + + return papp_snd->current_snd_path; +} + +/** +* This function sets the volume level for the given volume alert type +* +* @return void +* @param[in] papp_snd Handle to Sound Manager +* @param[in] vol_alert_type volume alert type #voicecall_snd_volume_alert_type_t +* @param[in] volume_level volume level to be set +*/ +void voicecall_snd_set_volume(voicecall_snd_mgr_t *papp_snd, voicecall_snd_volume_alert_type_t vol_alert_type, int volume_level) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "volume_level = %d", volume_level); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + switch (vol_alert_type) { + case VOICE_CALL_VOL_TYPE_RINGTONE: + { + int ret_value = 0; + int volume; + + if (VOICE_CALL_SND_INVALID_PLAYER_HANDLE == papp_snd->pmm_player) { + CALL_ENG_DEBUG(ENG_ERR, "Invalid MM Player Handle"); + return; + } + + /* Make Increasing Melody flag to FALSE, so melody volume will not be increased when volume it adjusted by user during increasing melody */ + papp_snd->bincreasingmelody = FALSE; + + volume = volume_level; + + ret_value = sound_manager_set_volume(SOUND_TYPE_RINGTONE, volume); + if (SOUND_MANAGER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "mmplayer_set_volume failed Error: [0x%x]", ret_value); + } + } + break; + case VOICE_CALL_VOL_TYPE_VOICE: + { + int incall_vol_level = 0; + int audio_path = 0; + + if (VOICE_CALL_VOL_LEVEL_1 >= volume_level) { + incall_vol_level = VOICE_CALL_VOL_LEVEL_1; + } else if (VOICE_CALL_VOL_LEVEL_6 < volume_level) { + incall_vol_level = VOICE_CALL_VOL_LEVEL_6; + } else { + incall_vol_level = volume_level; + } + + __voicecall_snd_get_voice_path(papp_snd, &audio_path); + + _vc_core_util_set_call_volume(volume_level); + + /* MODEM want to get volume level as 0~5, not a 1~6. So pass -1 value */ + if (FALSE == voicecall_core_set_audio_volume(pcall_core->pcall_engine, audio_path, (incall_vol_level-1))) { + CALL_ENG_DEBUG(ENG_DEBUG, "voicecall_doc_set_audio_volume failed"); + } + } + break; + case VOICE_CALL_VOL_TYPE_HEADSET: + { + int bt_vol_level = 0; + if (TRUE == voicecall_core_get_status(pcall_core, CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT)) { + CALL_ENG_DEBUG(ENG_DEBUG, "BT Requested Volume flag is enabled, not sending response"); + voicecall_core_set_status(pcall_core, CALL_VC_CORE_FLAG_VOL_CHNGD_BYBT, FALSE); + } else { + bt_vol_level = volume_level; + CALL_ENG_DEBUG(ENG_DEBUG, "bt_vol_level = %d", bt_vol_level); + + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_SPK_GAIN, bt_vol_level, NULL); + } + + } + break; + default: + CALL_ENG_DEBUG(ENG_DEBUG, "No Actions Defined for the volume alert type: %d", vol_alert_type); + + } +} + +/** + * This function retreives the volume according to the given volume alert type + * + * @return current volume level + * @param[in] papp_snd Handle to Sound Manager + * @param[in] vol_alert_type volume alert type #voicecall_snd_volume_alert_type_t + */ +int voicecall_snd_get_volume(voicecall_snd_mgr_t *papp_snd, voicecall_snd_volume_alert_type_t vol_alert_type) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ""); + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + switch (vol_alert_type) { + case VOICE_CALL_VOL_TYPE_RINGTONE: + { + int ret_val = 0; + unsigned int volume = 0; + + ret_val = sound_manager_get_volume(SOUND_TYPE_RINGTONE, (int *)&volume); + if (SOUND_MANAGER_ERROR_NONE != ret_val) { + CALL_ENG_DEBUG(ENG_DEBUG, "ret_val = [0x%x]", ret_val); + return VC_INVALID_VOLUME; + } + CALL_ENG_DEBUG(ENG_DEBUG, "MM Volume Level : %d", volume); + + return volume; + + } + break; + case VOICE_CALL_VOL_TYPE_VOICE: + { + return _vc_core_util_get_call_volume(); + } + break; + case VOICE_CALL_VOL_TYPE_HEADSET: + { + _vc_bt_send_response_to_bt(pcall_core, VC_BT_AG_RES_HEADSET_VOL, 0, NULL); + return VC_INVALID_VOLUME; /*Return Invalid Volume level as default */ + } + break; + default: + return VC_INVALID_VOLUME; /*Return Invalid Volume level as default */ + } + + return VC_INVALID_VOLUME; +} + +gboolean voicecall_snd_get_alternate_play(voicecall_snd_mgr_t *papp_snd) +{ + return papp_snd->balternate_play; +} + +static gboolean __voicecall_snd_start_melody(voicecall_snd_mgr_t *papp_snd, gboolean bis_increasing, int call_handle) +{ + char *setting_file_path = NULL; + char ringtone_path[VOICE_CALL_SND_RINGTONE_PATH_LEN] = { 0, }; + + CALL_ENG_DEBUG(ENG_DEBUG, "call_handle = %d", call_handle); + + CALL_ENG_DEBUG(ENG_DEBUG, "Contact ring_tone_path = [%s]", papp_snd->ring_tone); + + if (strlen(papp_snd->ring_tone) <= 0) { + setting_file_path = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR); +#ifdef DRM_USED + if ((setting_file_path == NULL) || (strlen(setting_file_path) <= 0) || + (FALSE == g_file_test(setting_file_path, G_FILE_TEST_EXISTS)) || + (FALSE == voicecall_util_is_valid_drm_file(setting_file_path, DRM_PERMISSION_PLAY))) +#else + if ((setting_file_path == NULL) || (strlen(setting_file_path) <= 0) || + (FALSE == g_file_test(setting_file_path, G_FILE_TEST_EXISTS))) +#endif + { + CALL_ENG_DEBUG(ENG_ERR, "setting ring tone path is invalid : [%s]", setting_file_path); + snprintf(ringtone_path, sizeof(ringtone_path), "file://%s", VOICE_CALL_SND_DEFAULT_RINGTONE_PATH); + } else { + snprintf(ringtone_path, sizeof(ringtone_path), "file://%s", setting_file_path); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Ringtone From Settings : %s", ringtone_path); + _vc_core_util_strcpy(papp_snd->ring_tone, sizeof(papp_snd->ring_tone), ringtone_path); + } + + /* Create MM Player */ + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + __voicecall_snd_create_player(papp_snd, &papp_snd->pmm_player, VOICE_CALL_PLAY_TYPE_RINGTONE); + + /*Set Volume */ + __voicecall_snd_set_mm_volume(papp_snd, bis_increasing); + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_READY; + + return TRUE; +} + +static void __voicecall_snd_mm_player_completed_cb(void *data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "in __voicecall_snd_mm_player_completed_cb"); + /* Use idle add callback to cotrol UI and other. */ +} + + +static void __voicecall_snd_mm_player_interrupted_cb(player_interrupted_code_e code, void *data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "in __voicecall_snd_mm_player_interrupted_cb"); + /* Use idle add callback to cotrol UI and other. */ +} + +static void __voicecall_snd_mm_player_error_cb(int error_code, void *data) +{ + CALL_ENG_DEBUG(ENG_DEBUG, "in __voicecall_snd_mm_player_error_cb"); + /* Use idle add callback to cotrol UI and other. */ +} + +static gboolean __voicecall_snd_create_player(voicecall_snd_mgr_t *papp_snd, player_h *pPlayer, voicecall_snd_play_type_t play_type) +{ + int ret = PLAYER_ERROR_NONE; + + CALL_ENG_DEBUG(ENG_DEBUG, "Start.."); + + if (*pPlayer != VOICE_CALL_SND_INVALID_SND_HANDLE) { + CALL_ENG_DEBUG(ENG_DEBUG, "Player = %d", *pPlayer); + ret = player_destroy(*pPlayer); + if (ret != PLAYER_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "mm_player_destroy ERR: %x!!!", ret); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "mm_player_destroy successfully~~~"); + } + *pPlayer = VOICE_CALL_SND_INVALID_SND_HANDLE; + } + + ret = player_create(pPlayer); + if (ret != PLAYER_ERROR_NONE || *pPlayer == 0) { + CALL_ENG_DEBUG(ENG_ERR, "mm_player_create ERR: %x!!!!", ret); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "*pPlayer: %d", *pPlayer); + + if (play_type == VOICE_CALL_PLAY_TYPE_RINGTONE) { + ret = player_set_uri(*pPlayer, papp_snd->ring_tone); + if (ret != PLAYER_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "player_set_uri() ERR: %x!!!!", ret); + return FALSE; + } + + ret = player_set_sound_type(*pPlayer, SOUND_TYPE_RINGTONE); + if (ret != PLAYER_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, + "player_set_sound_type() ERR: %x!!!!", ret); + return FALSE; + } + + ret = player_set_looping(*pPlayer, TRUE); + if (ret != PLAYER_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "player_set_looping() ERR: %x!!!!", ret); + return FALSE; + } + + player_set_completed_cb(*pPlayer, + __voicecall_snd_mm_player_completed_cb, NULL); + player_set_interrupted_cb(*pPlayer, + __voicecall_snd_mm_player_interrupted_cb, NULL); + player_set_error_cb(*pPlayer, + __voicecall_snd_mm_player_error_cb, NULL); + + ret = player_prepare(*pPlayer); + if (ret != PLAYER_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "mm_player_realize ERR: %x!!!!", ret); + return FALSE; + } + CALL_ENG_DEBUG(ENG_DEBUG, "mm_player_realize successfully~~"); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Finish.."); + return TRUE; +} + +static void __voicecall_snd_set_mm_volume(voicecall_snd_mgr_t *papp_snd, int bis_increasing) +{ +#ifdef _VOL_LEVEL_FROM_SETTINGS_ + int ret_value = 0; + int set_volume_level = VOICE_CALL_VOL_LEVEL_1; + int volume_val; + + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + /*Get the settings current ringtone volume level and set to media player */ + if (FALSE == vconf_get_int(VCONFKEY_SETAPPL_CALL_RINGTONE_SOUND_VOLUME_INT, &set_volume_level)) { + CALL_ENG_DEBUG(ENG_ERR, "settings read failed Error: %d", ret_value); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Settings Volume Level = %d", set_volume_level); + + if (set_volume_level > 0) { + if (TRUE == bis_increasing) { + papp_snd->increment_melody_value = set_volume_level = 1; + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing melody not set to VOICE_CALL_VOL_LEVEL_1"); + } + + volume_val = set_volume_level; + ret_value = sound_manager_set_volume(SOUND_TYPE_RINGTONE, volume_val); + if (SOUND_MANAGER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "Set Volume Error: [0x%x]", ret_value); + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "Final Volume Set to [%d]", volume_val); + } +#endif +} + +static gboolean __voicecall_snd_play_melody(voicecall_snd_mgr_t *papp_snd, gboolean bis_increasing) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (strlen(papp_snd->ring_tone) > 0) { + int mm_error = PLAYER_ERROR_NONE; + + mm_error = player_start(papp_snd->pmm_player); + if (PLAYER_ERROR_NONE != mm_error) { + CALL_ENG_DEBUG(ENG_ERR, "mm_player_start failed,Error: [0x%x]", mm_error); + } else { + if (TRUE == bis_increasing) { + papp_snd->bincreasingmelody = TRUE; + g_timeout_add(VOICE_CALL_SND_INCREMENT_TIMER_INTERVAL, __voicecall_snd_increasing_melody_cb, (gpointer) papp_snd); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "ringtone_sound_status : %d", papp_snd->ringtone_sound_status); + + papp_snd->ringtone_sound_status = VOICE_CALL_SND_STATUS_PLAY; + return TRUE; + } + } else { + CALL_ENG_DEBUG(ENG_ERR, "Ringtone is empty(Problem)"); + } + + return FALSE; +} + +static gboolean __voicecall_snd_mmplayer_signal_tone_snd_end_cb(gpointer pdata) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)pdata; + + CALL_ENG_DEBUG(ENG_DEBUG, ""); + + if (papp_snd->signal_sound_status != VOICE_CALL_SND_STATUS_PLAY) { + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Play already stopped by application"); + return FALSE; + } + + papp_snd->signal_sound_status = VOICE_CALL_SND_STATUS_STOPPED; + + /*Callback needs to be called, only when the tone is played completely and it is ended + if the signal is explictly stopped, don't call the user callback */ + if (papp_snd->psignal_play_end_cb != NULL) { + CALL_ENG_DEBUG(ENG_DEBUG, "Calling user callback"); + papp_snd->psignal_play_end_cb(papp_snd->psignal_play_end_cb_data); + papp_snd->psignal_play_end_cb = NULL; + papp_snd->psignal_play_end_cb_data = NULL; + } + + return FALSE; +} + +static gboolean __voicecall_snd_increasing_melody_cb(void *data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)data; + int ret_value = 0; + int set_volume_level = VOICE_CALL_VOL_LEVEL_1; + + if (FALSE == papp_snd->bincreasingmelody) { + CALL_ENG_DEBUG(ENG_DEBUG, "Already Deactivated"); + return FALSE; + } + + if ((set_volume_level != 0) && (papp_snd->increment_melody_value <= set_volume_level)) { + int volume_val; + + papp_snd->increment_melody_value++; + + volume_val = papp_snd->increment_melody_value; + ret_value = sound_manager_set_volume(SOUND_TYPE_RINGTONE, volume_val); + + if (SOUND_MANAGER_ERROR_NONE != ret_value) { + CALL_ENG_DEBUG(ENG_ERR, "Set Volume Error: [0x%x]", ret_value); + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing Melody Continuing, Current Increased Melody : %d", papp_snd->increment_melody_value); + if (papp_snd->increment_melody_value >= set_volume_level) { + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing Melody Ended"); + return FALSE; + } + + return TRUE; + } + + CALL_ENG_DEBUG(ENG_DEBUG, "Increasing Melody Ended"); + return FALSE; +} + +static void __voicecall_snd_start_vibration(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + char *vib_pattern_str = NULL; + haptic_error_e haptic_ret = HAPTIC_ERROR_NONE; + + papp_snd->bvibration = FALSE; + + haptic_ret = haptic_open(HAPTIC_DEVICE_0, &papp_snd->vib_handle); + + if (haptic_ret != HAPTIC_ERROR_NONE || papp_snd->vib_handle == NULL) { + CALL_ENG_DEBUG(ENG_ERR, "haptic_open:error : %d, %x", haptic_ret, papp_snd->vib_handle); + return; + } + + vib_pattern_str = vconf_get_str(VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_STR); + + haptic_ret = haptic_vibrate_file_with_detail(papp_snd->vib_handle, vib_pattern_str, HAPTIC_ITERATION_INFINITE, HAPTIC_FEEDBACK_AUTO, HAPTIC_PRIORITY_MIN, NULL); + if (haptic_ret != HAPTIC_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "haptic_vibrate_file_with_detail error : %d", haptic_ret); + haptic_ret = haptic_close(papp_snd->vib_handle); + if (haptic_ret != HAPTIC_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "haptic_close error : %d", haptic_ret); + } + return; + } + + papp_snd->bvibration = TRUE; +} + + +static void __voicecall_snd_stop_vibration(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_DEBUG, ".."); + + if (TRUE == papp_snd->bvibration) { + CALL_ENG_DEBUG(ENG_DEBUG, "Stopping Vibration , handle=%d", papp_snd->vib_handle); + + if (papp_snd->vib_handle) { + if (haptic_stop_all_effects(papp_snd->vib_handle) != HAPTIC_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "haptic_stop_all_effects error"); + } else if (haptic_close(papp_snd->vib_handle) != HAPTIC_ERROR_NONE) { + CALL_ENG_DEBUG(ENG_ERR, "haptic_close error"); + } + papp_snd->vib_handle = NULL; + } + + papp_snd->bvibration = FALSE; + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "bvibration is not enabled."); + } + +} + +/** +* This function unregisters the application with the sound conflict manager +* +* @return void +* @param[in] papp_snd Handle to Sound Manager +*/ +void voicecall_snd_register_cm(voicecall_snd_mgr_t *papp_snd) +{ + int error_code = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "current bsound_cm_state:[%d].", papp_snd->bsound_cm_state); + + if (FALSE == papp_snd->bsound_cm_state) { + error_code = sound_manager_call_session_create(SOUND_SESSION_TYPE_CALL, &papp_snd->psnd_session); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "sound_manager_call_session_create failed. error_code:[0x%x]", error_code); + return; + } + papp_snd->bsound_cm_state = TRUE; + } + return; +} + +/** +* This function unregisters the application from the sound conflict manager +* +* @return void +* @param[in] papp_snd Handle to Sound Manager +*/ +void voicecall_snd_unregister_cm(voicecall_snd_mgr_t *papp_snd) +{ + int error_code = 0; + + CALL_ENG_DEBUG(ENG_DEBUG, "current bsound_cm_state:[%d].", papp_snd->bsound_cm_state); + + if (TRUE == papp_snd->bsound_cm_state) { + /*Reset the Path when the app is closed - safety code */ + CALL_ENG_DEBUG(ENG_DEBUG, "Sound Path reset to Default"); + + papp_snd->bsound_cm_state = FALSE; + + error_code = sound_manager_call_session_destroy(papp_snd->psnd_session); + if (error_code) { + CALL_ENG_DEBUG(ENG_ERR, "sound_manager_call_session_destroy failed. error_code:[0x%x]", error_code); + } + } + /*Set to Defaults */ + voicecall_snd_set_to_defaults(papp_snd); + return; +} + +gboolean __voicecall_snd_effect_idle_cb(gpointer puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_NONE; + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd->effect_tone_status = %d", papp_snd->effect_tone_status); + + /*If connected call exists then change the audio path */ + if ((TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) || (TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))) { + CALL_ENG_DEBUG(ENG_DEBUG, "Connected call exists, changing path at the end of effect tone"); + + CALL_ENG_DEBUG(ENG_ERR, "papp_snd->signal_sound_status = %d", papp_snd->signal_sound_status); + /*Check the signal play status, if signal is being prepared / played, don't change the path */ + if (VOICE_CALL_SND_STATUS_NONE == papp_snd->signal_sound_status) { + voicecall_snd_change_path(papp_snd); + } else { + CALL_ENG_DEBUG(ENG_ERR, "Signal is playing, skipping path change, it will be done at the end of signal"); + } + } else { + CALL_ENG_DEBUG(ENG_DEBUG, "non connected call"); + } + CALL_ENG_DEBUG(ENG_DEBUG, "Over"); + return FALSE; +} + +static void __voicecall_snd_effect_cb(gpointer puser_data) +{ + voicecall_snd_mgr_t *papp_snd = (voicecall_snd_mgr_t *)puser_data; + + CALL_ENG_DEBUG(ENG_DEBUG, "effect_tone_status = %d, Calling Idle", papp_snd->effect_tone_status); + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_STOPPED; + + g_idle_add(__voicecall_snd_effect_idle_cb, papp_snd); + CALL_ENG_DEBUG(ENG_DEBUG, "End : papp_snd->effect_tone_status = %d", papp_snd->effect_tone_status); +} + +gboolean voicecall_snd_play_effect_tone(voicecall_snd_mgr_t *papp_snd, int effect_type) +{ + int error_code = -1; + gboolean bzuhause = FALSE; + gboolean bstatus = FALSE; + call_vc_core_state_t *pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + CALL_ENG_DEBUG(ENG_DEBUG, "effect type:[%d]", effect_type); + + switch (effect_type) { + case VOICE_CALL_SND_EFFECT_CALL_CONNECT: + { + CALL_ENG_KPI("voicecall_core_get_zuhause start"); + voicecall_core_get_zuhause(pcall_core->pcall_engine, &bzuhause); + CALL_ENG_KPI("voicecall_core_get_zuhause done"); + + if (bzuhause == TRUE) { + CALL_ENG_DEBUG(ENG_DEBUG, "It's zuhause area! don't play connect tone!"); + return FALSE; + } + + CALL_ENG_KPI("get VCONFKEY_CISSAPPL_CALL_CONNECT_TONE_BOOL start"); + if (vconf_get_bool(VCONFKEY_CISSAPPL_CALL_CONNECT_TONE_BOOL, &bstatus)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed."); + } + CALL_ENG_KPI("get VCONFKEY_CISSAPPL_CALL_CONNECT_TONE_BOOL done"); + + if (!bstatus) { + CALL_ENG_DEBUG(ENG_DEBUG, "Connect Tone Settings not enabled"); + return FALSE; + } + + /*First Reset the audio Path to PDA */ + error_code = tone_player_start(TONE_TYPE_PROP_ACK, SOUND_TYPE_MEDIA, 400, &papp_snd->pmm_effect_play_handle); + } + break; + case VOICE_CALL_SND_EFFECT_CALL_DISCONNECT: + { + + if (vconf_get_bool(VCONFKEY_CISSAPPL_CALL_END_TONE_BOOL, &bstatus)) { + CALL_ENG_DEBUG(ENG_ERR, "vconf_get_bool failed."); + } + + if (!bstatus) { + CALL_ENG_DEBUG(ENG_DEBUG, "Disconnect Tone Settings not enabled"); + return FALSE; + } + + error_code = tone_player_start(TONE_TYPE_PROP_PROMPT, SOUND_TYPE_MEDIA, 400, &papp_snd->pmm_effect_play_handle); + + } + break; + + case VOICE_CALL_SND_EFFECT_CALL_MINUTE_MINDER: + { +#ifdef _VC_TONE_PLAYER_MINUTE_MINDER + error_code = tone_player_start(TONE_TYPE_PROP_ACK , SOUND_TYPE_MEDIA, 400, &papp_snd->pmm_effect_play_handle); +#endif + } + break; + + default: + CALL_ENG_DEBUG(ENG_DEBUG, "Invalid Effect Type: %d", effect_type); + + } + + if (TONE_PLAYER_ERROR_NONE == error_code) { + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_PLAY; + } + + __voicecall_snd_effect_cb(papp_snd); + + CALL_ENG_DEBUG(ENG_DEBUG, "error code = [0x%x]", error_code); + return (TONE_PLAYER_ERROR_NONE == error_code) ? TRUE : FALSE; +} + +gboolean voicecall_snd_is_effect_playing(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_ERR, "Effect tone status: %d", papp_snd->effect_tone_status); + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->effect_tone_status) { + return TRUE; + } + + return FALSE; +} + +void voicecall_snd_stop_effect_tone(voicecall_snd_mgr_t *papp_snd) +{ + CALL_ENG_DEBUG(ENG_ERR, "Effect tone status: %d", papp_snd->effect_tone_status); + + if (VOICE_CALL_SND_STATUS_PLAY == papp_snd->effect_tone_status) { + if (TONE_PLAYER_ERROR_NONE != tone_player_stop(papp_snd->pmm_effect_play_handle)) { + CALL_ENG_DEBUG(ENG_ERR, "MM Stop Sound Failed"); + } + + papp_snd->effect_tone_status = VOICE_CALL_SND_STATUS_NONE; + papp_snd->pmm_effect_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + } + CALL_ENG_DEBUG(ENG_ERR, "Effect tone status: %d", papp_snd->effect_tone_status); +} + +void voicecall_snd_set_to_defaults(voicecall_snd_mgr_t *papp_snd) +{ + call_vc_core_state_t *pcall_core = NULL; + + CALL_ENG_DEBUG(ENG_DEBUG, "papp_snd = %p", papp_snd); + + /*Backup core handle */ + pcall_core = (call_vc_core_state_t *)papp_snd->pcall_core; + + /*Reset Sound Magr Data */ + memset(papp_snd, 0, sizeof(voicecall_snd_mgr_t)); + + /*Re Assign core handle */ + papp_snd->pcall_core = pcall_core; + + /*Set to Defaults */ + papp_snd->pmm_player = VOICE_CALL_SND_INVALID_PLAYER_HANDLE; + papp_snd->pmm_signal_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + + papp_snd->pmm_effect_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; + papp_snd->pmm_call_waiting_play_handle = VOICE_CALL_SND_INVALID_SND_HANDLE; +} + diff --git a/org.tizen.call.manifest b/org.tizen.call.manifest new file mode 100755 index 0000000..2eaa1b6 --- /dev/null +++ b/org.tizen.call.manifest @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packaging/org.tizen.call.spec b/packaging/org.tizen.call.spec new file mode 100755 index 0000000..ec511cc --- /dev/null +++ b/packaging/org.tizen.call.spec @@ -0,0 +1,85 @@ +Name: org.tizen.call +Summary: call application +Version: 0.2.392 +Release: 1 +Group: comm +License: Flora Software License +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(utilX) +BuildRequires: pkgconfig(alsa) +BuildRequires: pkgconfig(pmapi) +BuildRequires: pkgconfig(sensor) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(ui-gadget-1) +BuildRequires: pkgconfig(tapi) +BuildRequires: pkgconfig(mm-camcorder) +BuildRequires: pkgconfig(haptic) +BuildRequires: pkgconfig(msg-service) +BuildRequires: pkgconfig(ecore-x) +BuildRequires: pkgconfig(ecore-input) +BuildRequires: pkgconfig(capi-network-bluetooth) +BuildRequires: pkgconfig(icu-i18n) +BuildRequires: pkgconfig(appsvc) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(notification) +BuildRequires: pkgconfig(minicontrol-provider) +BuildRequires: pkgconfig(capi-media-sound-manager) +BuildRequires: pkgconfig(capi-media-tone-player) +BuildRequires: pkgconfig(capi-media-player) +BuildRequires: pkgconfig(capi-system-sensor) +BuildRequires: pkgconfig(capi-system-power) +BuildRequires: pkgconfig(accounts-svc) +BuildRequires: pkgconfig(db-util) +BuildRequires: pkgconfig(secure-storage) +BuildRequires: pkgconfig(contacts-service2) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(sysman) +BuildRequires: libug-contacts-devel +BuildRequires: cmake +BuildRequires: gettext-tools +BuildRequires: edje-tools +Requires(post): /usr/bin/vconftool +Requires: pkgmgr + + +%description +call application. + +%prep +%setup -q + + +%build +%define PREFIX "/usr/apps/%{name}" +cmake . -DCMAKE_INSTALL_PREFIX=%{PREFIX} + +make %{?jobs:-j%jobs} + + +%install +rm -rf %{buildroot} +%make_install +mkdir -p %{buildroot}/usr/share/license + +%post +# 5000 is inhouse user id +# do not use relative path +chown -R 5000:5000 /usr/apps/%{name}/data +/usr/bin/vconftool set -t int memory/call/state "0" -g 6521 -i +/usr/bin/vconftool set -t int "db/call/vol_level" "4" -g 6521 + +%files +%manifest %{name}.manifest +%defattr(-,root,root,-) +/usr/apps/%{name}/bin/call +/usr/apps/%{name}/res/edje/*.edj +/usr/apps/%{name}/res/images/*.png +/usr/apps/%{name}/res/locale/*/LC_MESSAGES/call.mo +/usr/apps/%{name}/res/media/*.wav +/usr/share/packages/%{name}.xml +/usr/share/icons/default/small/%{name}.png +/usr/share/license/%{name} diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt new file mode 100755 index 0000000..cf5e8b9 --- /dev/null +++ b/ui/CMakeLists.txt @@ -0,0 +1,179 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +SET(UI_SRCS + ../call-engine/core/vc-core-engine.c + ../call-engine/core/vc-core-callmanager.c + ../call-engine/core/vc-core-engine-status.c + ../call-engine/core/vc-core-tapi-evnt.c + ../call-engine/core/vc-core-util.c + ../call-engine/core/vc-core-callagent.c + ../call-engine/core/vc-core-ccbs.c + ../call-engine/core/vc-core-engine-group.c + ../call-engine/core/vc-core-svcall.c + ../call-engine/core/vc-core-tapi-rqst.c + ../call-engine/core/vc-core-ecc.c + ../call-engine/voice-call-core.c + ../call-engine/voice-call-sound.c + ../call-engine/voice-call-service.c + ../call-engine/voice-call-device.c + ../call-engine/voice-call-bt.c + ../call-engine/voice-call-engine.c + ./src/vcui-application.c + ./src/vcui-app-window.c + ./src/vcui-view-choice.c + ./src/vcui-document.c + ./src/vcui-view-dialing.c + ./src/vcui-view-incoming-lock.c + ./src/vcui-view-keypad.c + ./src/vcui-view-elements.c + ./src/vcui-view-common.c + ./src/vcui-view-single-call.c + ./src/vcui-view-multi-call-split.c + ./src/vcui-view-multi-call-conf.c + ./src/vcui-view-multi-call-list.c + ./src/vcui-view-popup.c + ./src/vcui-doc-launch.c + ./src/vcui-view-callend.c + ./src/vcui-view-quickpanel.c #_QUICKPANNEL_SUPPORT_ +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ../call-engine/include ../call-engine/core/include ./src/include) + +SET(PKG_NAME org.tizen.call) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(RESDIR "${PREFIX}/res") +SET(DATADIR "${PREFIX}/data") +SET(LOCALEDIR "${RESDIR}/locale") +SET(ICONDIR "${RESDIR}/icons/default/small") +SET(EDJDIR "${RESDIR}/edje") +SET(IMGDIR "${RESDIR}/images") +SET(MEDIADIR "${RESDIR}/media") + +IF("${CMAKE_BUILD_TYPE}" STREQUAL "") + SET(CMAKE_BUILD_TYPE "Release") +ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") +MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") + + +# for LOG +ADD_DEFINITIONS("-DCALL_DEBUG_ON_DLOG") + +# for Engine +ADD_DEFINITIONS("-DCALL_VC_SEND_SAT_RESPONSE_ORIG") +ADD_DEFINITIONS("-DRELEASE_ALL_AND_ACCEPT_SUPPORT") +#ADD_DEFINITIONS("-DVC_WITHOUT_SWAP_CNF") +ADD_DEFINITIONS("-DWDIAL_SEND_DTMF") + +# for SOUND +ADD_DEFINITIONS("-D_VC_TONE_PLAYER_MINUTE_MINDER") + +# for debuging +#ADD_DEFINITIONS("-DVOICECALL_KPI") +#ADD_DEFINITIONS("-DCALLDETAILS_DUMP") + +#for UI +#ADD_DEFINITIONS("-DSEND_END_TO_UG") +ADD_DEFINITIONS("-DPDIAL_SEND_DTMF") +ADD_DEFINITIONS("-D_QUICKPANNEL_SUPPORT_") +ADD_DEFINITIONS("-DSIGNAL_HANDLER") + +INCLUDE(FindPkgConfig) +pkg_check_modules(ui_pkgs REQUIRED + vconf + utilX + alsa + pmapi + sensor + dlog + aul + ui-gadget-1 + tapi + capi-media-sound-manager + capi-media-tone-player + capi-media-player + capi-system-power + pmapi + haptic + msg-service + ecore + ecore-x + ecore-input + edje + eina + evas + elementary + capi-network-bluetooth + icu-i18n + appsvc + notification + minicontrol-provider + accounts-svc + db-util + secure-storage + contacts-service2 + capi-system-info + sysman +) + + +SET(EXTRA_CFLAGS "") +FOREACH(flag ${ui_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${COMMON_C_FLAGS} -fpie ${EXTRA_CFLAGS}") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"") +ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DICONDIR=\"${ICONDIR}\"") +ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"") +ADD_DEFINITIONS("-DIMGDIR=\"${IMGDIR}\"") +ADD_DEFINITIONS("-DMEDIADIR=\"${MEDIADIR}\"") + +ADD_EXECUTABLE(call ${UI_SRCS}) +TARGET_LINK_LIBRARIES(call "-pie" "-ldl" ${ui_pkgs_LDFLAGS}) +message(${ui_pkgs_LDFLAGS}) + +ADD_CUSTOM_TARGET(call.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images ${SHARED_FLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/call_edc/call.edc ${CMAKE_CURRENT_SOURCE_DIR}/call.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/call_edc/call.edc +) +ADD_DEPENDENCIES(call call.edj) + +ADD_CUSTOM_TARGET(call_theme.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/themes + ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edc ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edc +) +ADD_DEPENDENCIES(call call_theme.edj) + +#install binary & edj files +INSTALL(TARGETS call DESTINATION ${BINDIR}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/call.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/themes/call_theme.edj DESTINATION ${EDJDIR}) + +# install ini file ( not used) +#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/call.ini DESTINATION share/process-info) + +# install manifest file & icon +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PKG_NAME}.xml DESTINATION /usr/share/packages) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PKG_NAME}.png DESTINATION /usr/share/icons/default/small) +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images/hd/icon/ DESTINATION ${IMGDIR} FILES_MATCHING PATTERN "*.png") +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images/hd/landscape/ DESTINATION ${IMGDIR} FILES_MATCHING PATTERN "*.png") +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images/hd/ani/ DESTINATION ${IMGDIR} FILES_MATCHING PATTERN "*.png") +INSTALL(DIRECTORY ../call-engine/sounds/ DESTINATION ${MEDIADIR} FILES_MATCHING PATTERN "*.wav") + +# install license file +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE DESTINATION /usr/share/license RENAME ${PKG_NAME}) + +# install application HOME directory +INSTALL(DIRECTORY DESTINATION ${DATADIR}) + +# i18n +ADD_SUBDIRECTORY(po) diff --git a/ui/call_edc/call.edc b/ui/call_edc/call.edc new file mode 100644 index 0000000..7eaefb5 --- /dev/null +++ b/ui/call_edc/call.edc @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../src/include/vcui-view-layout-hd.h" + +#define IMG_SRC_DIR "./hd" + +images { + image: IMG_SRC_DIR/"vc_keypad_btn_normal.png" COMP; + image: IMG_SRC_DIR/"vc_keypad_btn_press.png" COMP; + image: IMG_SRC_DIR/"vc_keypad_btn_icon.png" COMP; + image: IMG_SRC_DIR/"vc_lock_accept_left.png" COMP; + image: IMG_SRC_DIR/"vc_lock_accept_left_press.png" COMP; + image: IMG_SRC_DIR/"vc_lock_accept_left_dial_answer.png" COMP; + image: IMG_SRC_DIR/"vc_lock_accept_left_dial_answer_dim.png" COMP; + image: IMG_SRC_DIR/"vc_lock_accept_arrow.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_right.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_right_press.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_right_dial_decline.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_right_dial_decline_dim.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_arrow.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_message_bg.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_message_arrow_open.png" COMP; + image: IMG_SRC_DIR/"vc_lock_reject_message_arrow_close.png" COMP; + image: IMG_SRC_DIR/"vc_reject_msg_icon.png" COMP; + image: IMG_SRC_DIR/"vc_alerts_arrow_01.png" COMP; + image: IMG_SRC_DIR/"vc_alerts_arrow_02.png" COMP; + image: IMG_SRC_DIR/"vc_calling_cid_BG.png" COMP; + image: IMG_SRC_DIR/"vc_call_ID_thumbnail_bg.png" COMP; + image: IMG_SRC_DIR/"vc_calling_no_cid_bg.png" COMP; + image: IMG_SRC_DIR/"vc_no_caller_ID.png" COMP; + image: IMG_SRC_DIR/"vc_default_caller_ID_720x720.png" COMP; + image: IMG_SRC_DIR/"vc_call_button_bg.png" COMP; + image: IMG_SRC_DIR/"vc_caller_info_bg.png" COMP; + image: IMG_SRC_DIR/"vc_caller_info_end_bg.png" COMP; +} + + +collections { + + #include "vcui-view-button-layout.edc" + #include "vcui-view-incoming-lock.edc" + #include "vcui-view-dialing.edc" + #include "vcui-view-keypad.edc" + #include "vcui-view-single-call.edc" + #include "vcui-view-multi-call-conf.edc" + #include "vcui-view-multi-call-split.edc" + #include "vcui-view-multi-call-list.edc" + #include "vcui-view-reject.edc" + #include "vcui-view-naviframe.edc" + #include "vcui-view-ug-effect.edc" + #include "vcui-view-end-single-call.edc" + #include "vcui-view-end-conf-call.edc" + #include "vcui-view-quick-pannel.edc" + #include "vcui-view-popup.edc" + #include "vcui-view-caller-info.edc" + #include "vcui-view-caller-id.edc" + #include "vcui-view-landscape-quick-pannel.edc" +} diff --git a/ui/call_edc/vcui-view-button-layout.edc b/ui/call_edc/vcui-view-button-layout.edc new file mode 100755 index 0000000..2960483 --- /dev/null +++ b/ui/call_edc/vcui-view-button-layout.edc @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group{ + name: "separator-layout"; + parts{ + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 153; + } + } + + part { name: "swl_bg_image"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "background"; } + rel2 { relative: 1 1; to: "background"; } + align: 0.5 0.5; + color: 255 255 255 255; + image { normal: IMG_SRC_DIR/"vc_call_button_bg.png"; } + } + } + } + + programs{ + + } +} + +#define SWL_BUTTON(part_name, left, top, right, bottom) \ + part { name: part_name; \ + type: SWALLOW; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: left top; to: "background";} \ + rel2 { relative: right bottom; to: "background";} \ + } \ + } + +group{ + name: "button-layout"; + parts{ + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + /*TOP BUTTON*/ + SWL_BUTTON("top_end_button", TOP_BUTTON_L, TOP_BUTTON_T, + TOP_BUTTON_R, TOP_BUTTON_B) + + /*BOTTOM FIRST BUTTON*/ + SWL_BUTTON("bottom_first_button", BOTTOM_FIRST_BUTTON_L, BOTTOM_FIRST_BUTTON_T, + BOTTOM_FIRST_BUTTON_R, BOTTOM_FIRST_BUTTON_B) + + /*BOTTOM SECOND BUTTON*/ + SWL_BUTTON("bottom_second_button", BOTTOM_SECOND_BUTTON_L, BOTTOM_SECOND_BUTTON_T, + BOTTOM_SECOND_BUTTON_R, BOTTOM_SECOND_BUTTON_B) + + /*BOTTOM THIRD BUTTON*/ + SWL_BUTTON("bottom_third_button", BOTTOM_THIRD_BUTTON_L, BOTTOM_THIRD_BUTTON_T, + BOTTOM_THIRD_BUTTON_R, BOTTOM_THIRD_BUTTON_B) + + /*BOTTOM FOURTH BUTTON*/ + SWL_BUTTON("bottom_fourth_button", BOTTOM_FOURTH_BUTTON_L, BOTTOM_FOURTH_BUTTON_T, + BOTTOM_FOURTH_BUTTON_R, BOTTOM_FOURTH_BUTTON_B) + + /*BOTTOM FIFTH BUTTON*/ + SWL_BUTTON("bottom_fifth_button", BOTTOM_FIFTH_BUTTON_L, BOTTOM_FIFTH_BUTTON_T, + BOTTOM_FIFTH_BUTTON_R, BOTTOM_FIFTH_BUTTON_B) + } + + programs{ + + } +} diff --git a/ui/call_edc/vcui-view-caller-id.edc b/ui/call_edc/vcui-view-caller-id.edc new file mode 100644 index 0000000..5461989 --- /dev/null +++ b/ui/call_edc/vcui-view-caller-id.edc @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group{ + name: "caller-id-layout"; + parts { + part { name: "background"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_full_bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "background"; } + rel2 { relative: 1 1; to: "background"; } + align: 0.5 0.5; + color: 255 255 255 255; + image { normal: IMG_SRC_DIR/"vc_calling_cid_BG.png"; } + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "swl_cid_full"; + type: SWALLOW; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "swl_cid_full_bg"; } + rel2 { relative: 1 1; to: "swl_cid_full_bg"; } + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "swl_cid_thumbnail_bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: VC_CALLER_ID_THUMB_BG_L VC_CALLER_ID_THUMB_BG_T; to: "background"; } + rel2 { relative: VC_CALLER_ID_THUMB_BG_R VC_CALLER_ID_THUMB_BG_B; to: "background"; } + align: 0.5 0.5; + color: 255 255 255 255; + image { normal: IMG_SRC_DIR/"vc_call_ID_thumbnail_bg.png"; } + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "swl_cid_thumbnail"; + type: SWALLOW; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: VC_CALLER_ID_THUMB_L VC_CALLER_ID_THUMB_T; to: "background"; } + rel2 { relative: VC_CALLER_ID_THUMB_R VC_CALLER_ID_THUMB_B; to: "background"; } + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "swl_no_cid_bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "background"; } + rel2 { relative: 1 1; to: "background"; } + align: 0.5 0.5; + color: 255 255 255 255; + visible: 0; + } + description { + state: "connecting" 0.0; + inherit: "default" 0.0; + image { normal: IMG_SRC_DIR/"vc_calling_no_cid_bg.png"; } + visible: 1; + } + description { + state: "connected" 0.0; + inherit: "default" 0.0; + image { normal: IMG_SRC_DIR/"vc_default_caller_ID_720x720.png"; } + visible: 1; + } + } + + part { name: "swl_no_cid"; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "swl_no_cid_bg"; } + rel2 { relative: 1 1; to: "swl_no_cid_bg"; } + align: 0.5 0.5; + visible: 0; + } + description { + state: "connecting" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } //parts + + programs { + program { name: "full_caller_id"; + signal: "show-full-cid"; + source: "cid-img"; + action: STATE_SET "show" 0.0; + target: "swl_cid_full_bg"; + target: "swl_cid_full"; + } + program { name: "thumb_caller_id"; + signal: "show-thumb-cid"; + source: "cid-img"; + action: STATE_SET "show" 0.0; + target: "swl_cid_thumbnail_bg"; + target: "swl_cid_thumbnail"; + } + program { name: "no_caller_id_connecting"; + signal: "show-no-cid-connecting"; + source: "cid-img"; + action: STATE_SET "connecting" 0.0; + target: "swl_no_cid_bg"; + target: "swl_no_cid"; + } + program { name: "no_caller_id_connected"; + signal: "show-no-cid-connected"; + source: "cid-img"; + action: STATE_SET "connected" 0.0; + target: "swl_no_cid_bg"; + target: "swl_no_cid"; + } + } //programs +} diff --git a/ui/call_edc/vcui-view-caller-info.edc b/ui/call_edc/vcui-view-caller-info.edc new file mode 100755 index 0000000..e48fea5 --- /dev/null +++ b/ui/call_edc/vcui-view-caller-info.edc @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group{ + name: "caller-info"; + parts{ + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 150; + } + description { + state: "hide" 0.0; + color: 0 0 0 0; + } + } + + /*CALLER INFO BACKGROUND*/ + part { name: "call_info_bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R 1.0; to: "background";} + image { normal: IMG_SRC_DIR/"vc_caller_info_bg.png"; } + } + description { + state: "end_color" 0.0; + inherit: "default" 0.0; + image { normal: IMG_SRC_DIR/"vc_caller_info_end_bg.png"; } + } + } + + /*CALLER NAME*/ + part { name: "txt_call_name"; /* call name or number */ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: CALLER_INFO_NAME_L CALLER_INFO_NAME_T; to: "background";} + rel2 { relative: CALLER_INFO_NAME_R CALLER_INFO_NAME_B; to: "background";} + text { font, FONT_SLP_Regular; size, 70; align, 0 0.5; text_class, TEXT_CLASS_SLP_REGULAR;} + color: 255 255 255 255; + color2: 0 0 0 255; + } + } + + /*CALLER INFO Seprator*/ + part { name: "vert_sep_1"; /*Caller info for more*/ + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "show" 0.0; + visible: 1; + min: 2 70; + rel1 { relative: CALLER_INFO_VERT_SEP_1_L CALLER_INFO_VERT_SEP_1_T; to: "background";} + rel2 { relative: CALLER_INFO_VERT_SEP_1_R CALLER_INFO_VERT_SEP_1_B; to: "background";} + color: 0 0 0 128; + } + } + + part { name: "vert_sep_2"; /*Caller info for more*/ + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "show" 0.0; + visible: 1; + min: 2 70; + rel1 { relative: CALLER_INFO_VERT_SEP_2_L CALLER_INFO_VERT_SEP_2_T; to: "background";} + rel2 { relative: CALLER_INFO_VERT_SEP_2_R CALLER_INFO_VERT_SEP_2_B; to: "background";} + color: 179 179 179 128; + } + } + + /*CALLER INFO*/ + part { name: "caller_info_icon"; /*Caller info for more*/ + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_ICON_L CALLER_INFO_ICON_T; to: "background";} + rel2 { relative: CALLER_INFO_ICON_R CALLER_INFO_ICON_B; to: "background";} + } + } + + part { name: "txt_2nd_area"; + type: RECT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: CALLER_INFO_NUMBER_L CALLER_INFO_NUMBER_T; to: "background";} + rel2 { relative: CALLER_INFO_NUMBER_R CALLER_INFO_NUMBER_B; to: "background";} + } + } + + /*CALL NUMBER*/ + part { name: "txt_phone_num"; /* Phone number*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "txt_2nd_area";} + rel2 { relative: 0 1; to: "txt_padding";} + max: CALLER_INFO_NUMBER_WIDTH CALLER_INFO_NUMBER_HEIGHT; + min: CALLER_INFO_MIN_WIDTH CALLER_INFO_NUMBER_HEIGHT; + fixed: 0 1; + align: 0 0; + text { font, FONT_SLP_Regular; size, 38; align: 0 0.5; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 255 255 255 120; + color2: 0 0 0 120; + } + } + + part { name: "txt_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 0; + min: CALLER_INFO_MAIN_GAP 0; + align: 1 0; + visible: 0; + rel1 { relative: 0 0; to: "txt_status";} + rel2 { relative: 0 1; to: "txt_status";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0 0; to: "txt_timer";} + rel2 { relative: 0 1; to: "txt_timer";} + } + } + + /* CALL STATUS*/ + part { name: "txt_status"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 1.0 0; to: "txt_2nd_area";} + rel2 { relative: 1.0 1; to: "txt_2nd_area";} + max: CALLER_INFO_NUMBER_WIDTH CALLER_INFO_NUMBER_HEIGHT; + min: CALLER_INFO_MIN_WIDTH CALLER_INFO_NUMBER_HEIGHT; + fixed: 0 1; + align: 1 0; + text { font, FONT_SLP_Regular; size, 30; align: 1.0 0.5; min: 1 0; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 249 249 249 255; + color2: 0 0 0 255; + } + description { + state: "connecting" 0.0; + inherit: "default" 0.0; + color: 139 246 50 255; + color2: 0 0 0 255; + } + description { + state: "end_color" 0.0; + inherit: "default" 0.0; + color: 255 0 0 255; + color2: 0 0 0 255; + } + description { + state: "hide" 0.0; + visible: 0; + } + } + + /* CALL TIME*/ + part { name: "txt_timer"; /*Call time or Call status*/ + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 1.0 0; to: "txt_2nd_area";} + rel2 { relative: 1.0 1; to: "txt_2nd_area";} + max: CALLER_INFO_NUMBER_WIDTH CALLER_INFO_NUMBER_HEIGHT; + min: CALLER_INFO_MIN_WIDTH CALLER_INFO_NUMBER_HEIGHT; + fixed: 0 1; + align: 1 0; + text { font, FONT_SLP_Regular; size, 30; align: 1.0 0.5; min: 1 0; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 139 246 50 255; + color2: 0 0 0 255; + } + description { + state: "hide" 0.0; + visible: 0; + } + } + + programs { + program { name: "hold_call"; + signal: "set-hold-state"; + source: "call-screen"; + action: STATE_SET "hide" 0.0; + target: "txt_timer"; + after: "show_status"; + } + program { name: "show_status"; + action: STATE_SET "default" 0.0; + target: "txt_padding"; + target: "txt_status"; + } + + program { name: "unhold_call"; + signal: "set-unhold-state"; + source: "call-screen"; + action: STATE_SET "default" 0.0; + target: "txt_timer"; + after: "hide_status"; + } + program { name: "hide_status"; + action: STATE_SET "hide" 0.0; + target: "txt_padding"; + target: "txt_status"; + } + + program { name: "connecting_caller_info"; + signal: "set-connecting-caller_info"; + source: "connecting-screen"; + action: STATE_SET "connecting" 0.0; + target: "txt_status"; + } + + program { name: "end_caller_info"; + signal: "set-end-caller_ifno"; + source: "end-screen"; + action: STATE_SET "end_color" 0.0; + target: "call_info_bg"; + target: "txt_status"; + } + + program { name: "vert_seperator"; + signal: "show_vert_separtor"; + source: "call-screen"; + action: STATE_SET "show" 0.0; + target: "vert_sep_1"; + target: "vert_sep_2"; + } + } + } +} diff --git a/ui/call_edc/vcui-view-dialing.edc b/ui/call_edc/vcui-view-dialing.edc new file mode 100644 index 0000000..cd7bf21 --- /dev/null +++ b/ui/call_edc/vcui-view-dialing.edc @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group{ + name: "mo-view"; + parts{ + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + + part { name: "caller_id"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: VC_CALLER_ID_LAYOUT_L VC_CALLER_ID_LAYOUT_T; to: "background";} + rel2 { relative: VC_CALLER_ID_LAYOUT_R VC_CALLER_ID_LAYOUT_B; to: "background";} + } + } + + part { name: "caller_info"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "extra_vol_icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_EXTRA_VOL_ICON_L INCALL_EXTRA_VOL_ICON_T; to: "background";} + rel2 { relative: INCALL_EXTRA_VOL_ICON_R INCALL_EXTRA_VOL_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "alerts_layout"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_L DIALLING_MT_SNS_ALERTS_LAYOUT_T; to: "background";} + rel2 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_R DIALLING_MT_SNS_ALERTS_LAYOUT_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "shift-show" 0.0; + inherit: "default" 0.0; + rel1 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_L DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_T; to: "background";} + rel2 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_R DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_B; to: "background";} + visible: 1; + } + description { + state: "expand" 0.0; + inherit: "default" 0.0; + rel1 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_L DIALLING_MT_SNS_ALERTS_LAYOUT_EXPANDED_T; to: "background";} + rel2 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_R DIALLING_MT_SNS_ALERTS_LAYOUT_EXPANDED_B; to: "background";} + visible: 1; + } + description { + state: "shift-expand" 0.0; + inherit: "default" 0.0; + rel1 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_L DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_T; to: "background";} + rel2 { relative: DIALLING_MT_SNS_ALERTS_LAYOUT_R DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_B; to: "background";} + visible: 1; + } + } + + part { name: "keypad_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: KEYPAD_AREA_L KEYPAD_AREA_T; to: "background";} + rel2 { relative: KEYPAD_AREA_R KEYPAD_AREA_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_LAYOUT_L SIX_BTN_LAYOUT_T; to: "background";} + rel2 { relative: SIX_BTN_LAYOUT_R SIX_BTN_LAYOUT_B; to: "background";} + } + } + + part { name: "btn_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "btn_bg"; } + rel2 { relative: 1 1; to: "btn_bg"; } + } + } + } + + programs{ + program { name: "alerts_normal"; + signal: "show-alerts-normal"; + source: "alerts-ly"; + action: STATE_SET "show" 0.0; + target: "alerts_layout"; + } + program { name: "alerts_expand"; + signal: "show-alerts-expand"; + source: "alerts-ly"; + action: STATE_SET "expand" 0.0; + target: "alerts_layout"; + } + program { name: "alerts_shift_normal"; + signal: "show-alerts-shift-normal"; + source: "alerts-ly"; + action: STATE_SET "shift-show" 0.0; + target: "alerts_layout"; + } + program { name: "alerts_shift_expand"; + signal: "show-alerts-shift-expand"; + source: "alerts-ly"; + action: STATE_SET "shift-expand" 0.0; + target: "alerts_layout"; + } + + program { name: "show_keypadbtn"; + signal: "SHOW"; + source: "KEYPAD_BTN"; + action: STATE_SET "show" 0.0; + target: "keypad_region"; + } + program { name: "hide_keypadbtn"; + signal: "HIDE"; + source: "KEYPAD_BTN"; + action: STATE_SET "hide" 0.0; + target: "keypad_region"; + } + + program { name: "show_after_keypad"; + signal: "SHOW"; + source: "CALL_AREA"; + action: STATE_SET "show" 0.0; + target: "caller_info"; + /*target: "bday_icon"; + target: "bday_text";*/ + target: "alerts_layout"; + target: "extra_vol_icon"; + } + program { name: "hide_caller_info"; + signal: "HIDE"; + source: "CALL_AREA"; + action: STATE_SET "hide" 0.0; + target: "caller_info"; + /*target: "bday_icon"; + target: "bday_text";*/ + target: "alerts_layout"; + target: "extra_vol_icon"; + } + } +} diff --git a/ui/call_edc/vcui-view-end-conf-call.edc b/ui/call_edc/vcui-view-end-conf-call.edc new file mode 100644 index 0000000..9a0fa74 --- /dev/null +++ b/ui/call_edc/vcui-view-end-conf-call.edc @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "end-confcall"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_BACKGROUND_CID_L INCALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_CID_R INCALL_BACKGROUND_CID_B; to: "background";} + } + } + + /*part { name: "call_bg_img"; + type: SWALLOW; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "background";} + rel2 { relative: 1 1; to: "background";} + } + }*/ + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_CID_L INCALL_CID_T; } + rel2 { relative: INCALL_CID_R INCALL_CID_B; } + } + } + + part { name: "swl_cid_dim"; /*for held call dim*/ + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 0; + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "wvga" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; offset: 6 0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; offset: -6 0; to: "swl_cid";} + } + description { + state: "hd" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; to: "swl_cid";} + } + } + + part { name: "caller_info"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + } + + part { name: "btn_hold_swap"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_HOLD_L INCALL_HOLD_T; to: "background";} + rel2 { relative: INCALL_HOLD_R INCALL_HOLD_B; to: "background";} + } + } + + part { name: "txt_hold_swap"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_HOLD_TXT_L INCALL_HOLD_TXT_T; to: "background";} + rel2 { relative: INCALL_HOLD_TXT_R INCALL_HOLD_TXT_B; to: "background";} + text { font, FONT_SLP_Bold; size, 36; align, 1.0 0.5; text_class, TEXT_CLASS_SLP_BOLD; } + color: 204 204 204 255; + color2: 0 0 0 255; + } + } + + part { name: "btn_bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_LAYOUT_L SIX_BTN_LAYOUT_T; to: "background";} + rel2 { relative: SIX_BTN_LAYOUT_R SIX_BTN_LAYOUT_B; to: "background";} + } + } + + part { name: "btn_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "btn_bg"; } + rel2 { relative: 1 1; to: "btn_bg"; } + } + } + + } + + programs { + program { name: "hide_dim_cid"; + signal: "HIDE_DIM"; + source: "CID"; + action: STATE_SET "default" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_wvga"; + signal: "SHOW_DIM_WVGA"; + source: "CID_WVGA"; + action: STATE_SET "wvga" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_hd"; + signal: "SHOW_DIM_HD"; + source: "CID_HD"; + action: STATE_SET "hd" 0.0; + target: "swl_cid_dim"; + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-end-single-call.edc b/ui/call_edc/vcui-view-end-single-call.edc new file mode 100644 index 0000000..4eceae6 --- /dev/null +++ b/ui/call_edc/vcui-view-end-single-call.edc @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group{ + name: "separator-layout-3button"; + parts{ + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 153; + } + } + + part { name: "swl_bg_image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "background"; } + rel2 { relative: 1 1; to: "background"; } + align: 0.5 0.5; + color: 255 255 255 255; + image { normal: IMG_SRC_DIR/"vc_call_button_bg.png"; } + } + } + } + + programs{ + + } +} + +group { + name: "end-singlecall"; + + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + + part { name: "caller_id"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: VC_CALLER_ID_LAYOUT_L VC_CALLER_ID_LAYOUT_T; to: "background";} + rel2 { relative: VC_CALLER_ID_LAYOUT_R VC_CALLER_ID_LAYOUT_B; to: "background";} + } + } + + part { name: "caller_info"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + } + + part { name: "btn_bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_BTN_BG_L ENDSINGLECALL_BTN_BG_T; to: "background";} + rel2 { relative: ENDSINGLECALL_BTN_BG_R ENDSINGLECALL_BTN_BG_B; to: "background";} + } + } + + part { name: "btn_voicecall"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_VOICE_BTN_L ENDSINGLECALL_VOICE_BTN_T; to: "background";} + rel2 { relative: ENDSINGLECALL_VOICE_BTN_R ENDSINGLECALL_VOICE_BTN_B; to: "background";} + } + } + + part { name: "btn_videocall"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_VIDEO_BTN_L ENDSINGLECALL_VIDEO_BTN_T; to: "background";} + rel2 { relative: ENDSINGLECALL_VIDEO_BTN_R ENDSINGLECALL_VIDEO_BTN_B; to: "background";} + } + } + + part { name: "btn_message"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: ENDSINGLECALL_MSG_BTN_L ENDSINGLECALL_MSG_BTN_T; to: "background";} + rel2 { relative: ENDSINGLECALL_MSG_BTN_R ENDSINGLECALL_MSG_BTN_B; to: "background";} + } + } + + part { name: "btn_contacts"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: ENDSINGLECALL_CONTACT_BTN_L ENDSINGLECALL_CONTACT_BTN_T; to: "background";} + rel2 { relative: ENDSINGLECALL_CONTACT_BTN_R ENDSINGLECALL_CONTACT_BTN_B; to: "background";} + } + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-incoming-lock.edc b/ui/call_edc/vcui-view-incoming-lock.edc new file mode 100644 index 0000000..6818cb7 --- /dev/null +++ b/ui/call_edc/vcui-view-incoming-lock.edc @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define COLOR_OPACITY_100 255 255 255 255 +#define COLOR_OPACITY_75 255 255 255 191 +#define COLOR_OPACITY_60 255 255 255 153 +#define COLOR_OPACITY_50 255 255 255 128 +#define COLOR_OPACITY_25 255 255 255 64 +#define COLOR_OPACITY_20 255 255 255 51 +#define COLOR_OPACITY_0 255 255 255 0 +#define SHIFT_VALUE (20/720) + +group { + name: "lock_reject_with_msg"; + + parts { + part { + name: "reject_msg_bg"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MTLOCK_REJECT_MSG_BG_L MTLOCK_REJECT_MSG_BG_T; } + rel2 { relative: MTLOCK_REJECT_MSG_BG_R MTLOCK_REJECT_MSG_BG_B; } + image { normal: IMG_SRC_DIR/"vc_lock_reject_message_bg.png"; } + align: 0.0 0.5; + color: 255 255 255 128; + visible: 1; + } + } + + part { + name: "reject_msg_arw"; + type: IMAGE; + mouse_events:1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MTLOCK_REJECT_MSG_ARW_L MTLOCK_REJECT_MSG_ARW_T; } + rel2 { relative: MTLOCK_REJECT_MSG_ARW_R MTLOCK_REJECT_MSG_ARW_B; } + align: 0.5 0.5; + color: 255 255 255 255; + visible: 0; + } + description { + state: "list_close" 0.0; + inherit: "default" 0.0; + image { normal: IMG_SRC_DIR/"vc_lock_reject_message_arrow_open.png"; } + visible: 1; + } + description { + state: "list_open" 0.0; + inherit: "default" 0.0; + image { normal: IMG_SRC_DIR/"vc_lock_reject_message_arrow_close.png"; } + visible: 1; + } + } + + part { + name: "reject_msg_text_area"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MTLOCK_REJECT_MSG_TEXT_L MTLOCK_REJECT_MSG_TEXT_T; } + rel2 { relative: MTLOCK_REJECT_MSG_TEXT_R MTLOCK_REJECT_MSG_TEXT_B; } + visible: 0; + } + } + + part { + name: "reject_msg_icon"; + type: IMAGE; + mouse_events:0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "reject_msg_text_area";} + rel2 { relative: 0 1; to: "txt_padding";} + align: 1 0.5; + min: MTLOCK_REJECT_MSG_ICON_WIDTH MTLOCK_REJECT_MSG_ICON_HEIGHT; + max: MTLOCK_REJECT_MSG_ICON_WIDTH MTLOCK_REJECT_MSG_ICON_HEIGHT; + color: 255 255 255 255; + image { normal: IMG_SRC_DIR/"vc_reject_msg_icon.png"; } + visible: 1; + } + } + + part { name: "txt_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 0; + min: MTLOCK_REJECT_MSG_PAD 0; + align: 1 0; + visible: 0; + rel1 { relative: 0 0; to: "reject_msg_text";} + rel2 { relative: 0 1; to: "reject_msg_text";} + } + } + + + part { + name: "reject_msg_text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: (0.5+((MTLOCK_REJECT_MSG_ICON_WIDTH+MTLOCK_REJECT_MSG_PAD)/(MTLOCK_REJECT_MSG_TEXT_WIDTH*2))) 0; to: "reject_msg_text_area";} + rel2 { relative: (0.5+((MTLOCK_REJECT_MSG_ICON_WIDTH+MTLOCK_REJECT_MSG_PAD)/(MTLOCK_REJECT_MSG_TEXT_WIDTH*2))) 1; to: "reject_msg_text_area";} + fixed: 0 1; + max: (MTLOCK_REJECT_MSG_TEXT_WIDTH-MTLOCK_REJECT_MSG_ICON_WIDTH-MTLOCK_REJECT_MSG_PAD) MTLOCK_REJECT_MSG_TEXT_HEIGHT; + text { font, FONT_SLP_Regular; size, 32; align, 0.5 0.5; min: 1 0; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 249 249 249 255; + color2: 0 0 0 191; + visible: 1; + } + } + + part { + name: "swl_msglist_bg"; + type: RECT; + description { + state: "default" 0.0; + visible: 0; + color: 0 0 0 255; + rel1 { relative: MTLOCK_REJECT_MSG_LIST_L MTLOCK_REJECT_MSG_LIST_T; } + } + description { + state: "one-line" 0.0; + inherit: "default" 0.0; + visible: 1; + rel2 { relative: MTLOCK_REJECT_MSG_LIST_R MTLOCK_REJECT_MSG_ONE_LINE_LIST_B; } + } + description { + state: "two-line" 0.0; + inherit: "default" 0.0; + visible: 1; + rel2 { relative: MTLOCK_REJECT_MSG_LIST_R MTLOCK_REJECT_MSG_TWO_LINE_LIST_B; } + } + description { + state: "three-line" 0.0; + inherit: "default" 0.0; + visible: 1; + rel2 { relative: MTLOCK_REJECT_MSG_LIST_R MTLOCK_REJECT_MSG_THREE_LINE_LIST_B; } + } + description { + state: "four-line" 0.0; + inherit: "default" 0.0; + visible: 1; + rel2 { relative: MTLOCK_REJECT_MSG_LIST_R MTLOCK_REJECT_MSG_FOUR_LINE_LIST_B; } + } + description { + state: "five-line" 0.0; + inherit: "default" 0.0; + visible: 1; + rel2 { relative: MTLOCK_REJECT_MSG_LIST_R MTLOCK_REJECT_MSG_FIVE_LINE_LIST_B; } + } + description { + state: "six-line" 0.0; + inherit: "default" 0.0; + visible: 1; + rel2 { relative: MTLOCK_REJECT_MSG_LIST_R MTLOCK_REJECT_MSG_SIX_LINE_LIST_B; } + } + } + + part { + name: "swl_msglist"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "swl_msglist_bg"; } + rel2 { relative: 1.0 1.0; to: "swl_msglist_bg"; } + } + } + + part { + name: "toolbar_bg"; + type: RECT; + description { + state: "default" 0.0; + fixed: 0 1; + align: 0.0 1.0; + visible: 1; + rel1 { relative: 0.0 1.0; to: "swl_msglist_bg"; } + rel2 { relative: 1.0 1.0; to: "swl_msglist_bg"; offset: 0 MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; } + color: MTLOCK_REJECT_MSG_TOOLBAR_COLOR; + min: 0 MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + max: MTLOCK_REJECT_MSG_TOOLBAR_WIDTH MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + } + } + + part { + name: "back_btn"; + type: SWALLOW; + description { + state: "default" 0.0; + max: MTLOCK_REJECT_MSG_BACK_BTN_W MTLOCK_REJECT_MSG_BACK_BTN_H; + fixed: 1 1; + rel1 { relative: MTLOCK_REJECT_MSG_BACK_BTN_L MTLOCK_REJECT_MSG_BACK_BTN_T; to: "toolbar_bg"; } + rel2 { relative: MTLOCK_REJECT_MSG_BACK_BTN_R MTLOCK_REJECT_MSG_BACK_BTN_B; to: "toolbar_bg"; } + } + } + + part { + name: "create_btn"; + type: SWALLOW; + description { + state: "default" 0.0; + max: MTLOCK_REJECT_MSG_CREATE_BTN_W MTLOCK_REJECT_MSG_CREATE_BTN_H; + fixed: 1 1; + rel1 { relative: MTLOCK_REJECT_MSG_CREATE_BTN_L MTLOCK_REJECT_MSG_CREATE_BTN_T; to: "toolbar_bg"; } + rel2 { relative: MTLOCK_REJECT_MSG_CREATE_BTN_R MTLOCK_REJECT_MSG_CREATE_BTN_B; to: "toolbar_bg"; } + } + } + } + + programs { + program { + name: "up_arrow"; + signal: "show-up-arrow"; + source: "reject_msg"; + action: STATE_SET "list_close" 0.0; + target: "reject_msg_arw"; + transition: LINEAR 0.0; + } + program { + name: "down_arrow"; + signal: "show-down-arrow"; + source: "reject_msg"; + action: STATE_SET "list_open" 0.0; + target: "reject_msg_arw"; + transition: LINEAR 0.0; + } + + program { + name: "one-line-list"; + signal: "show-one-line"; + source: "reject-list"; + action: STATE_SET "one-line" 0.0; + target: "swl_msglist_bg"; + } + program { + name: "two-line-list"; + signal: "show-two-line"; + source: "reject-list"; + action: STATE_SET "two-line" 0.0; + target: "swl_msglist_bg"; + } + program { + name: "three-line-list"; + signal: "show-three-line"; + source: "reject-list"; + action: STATE_SET "three-line" 0.0; + target: "swl_msglist_bg"; + } + program { + name: "four-line-list"; + signal: "show-four-line"; + source: "reject-list"; + action: STATE_SET "four-line" 0.0; + target: "swl_msglist_bg"; + } + program { + name: "five-line-list"; + signal: "show-five-line"; + source: "reject-list"; + action: STATE_SET "five-line" 0.0; + target: "swl_msglist_bg"; + } + program { + name: "six-line-list"; + signal: "show-six-line"; + source: "reject-list"; + action: STATE_SET "six-line" 0.0; + target: "swl_msglist_bg"; + } + } +} + +group { + name: "mtlock"; + parts { + part { name: "background"; + type: RECT; + mouse_events: 1; + pointer_mode: NOGRAB; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + + part { name: "caller_id"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: VC_CALLER_ID_LAYOUT_L VC_CALLER_ID_LAYOUT_T; to: "background";} + rel2 { relative: VC_CALLER_ID_LAYOUT_R VC_CALLER_ID_LAYOUT_B; to: "background";} + } + } + + part { name: "caller_info"; + type: SWALLOW; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + } + + part { name: "btn_accept"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_MT_BTN1_L DIALLING_MT_BTN1_T; to: "background";} + rel2 { relative: DIALLING_MT_BTN1_R DIALLING_MT_BTN1_B; to: "background";} + } + } + part { name: "btn_reject"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: DIALLING_MT_BTN2_L DIALLING_MT_BTN2_T; to: "background";} + rel2 { relative: DIALLING_MT_BTN2_R DIALLING_MT_BTN2_B; to: "background";} + } + } + + }//parts +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-keypad.edc b/ui/call_edc/vcui-view-keypad.edc new file mode 100644 index 0000000..7c92eb7 --- /dev/null +++ b/ui/call_edc/vcui-view-keypad.edc @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PART_KEYPAD_CUSTOM_TWO_LABLE(txt, offx, offy, label_left_text, label_left_size, label_right_text, label_right_size, right_txt_lpad) \ + part { \ + name: txt; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 0; \ + rel1 { relative: REL_KEYPAD_W(offx) REL_KEYPAD_H(offy); to:"keypad/area";} \ + rel2 { relative: REL_KEYPAD_W(offx+KEYPAD_EACH_BTN_WIDTH) REL_KEYPAD_H(offy+KEYPAD_EACH_BTN_HEIGHT); to:"keypad/area"; } \ + } \ + description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + visible: 1; \ + image.normal: IMG_SRC_DIR/"vc_keypad_btn_press.png"; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_left"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: KEYPAD_BTN_LEFT_TXT_L 0.0; to: txt;} \ + rel2 { relative: KEYPAD_BTN_LEFT_TXT_R 1.0; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + color: 242 242 242 255; \ + text { \ + font: FONT_SLP_Light; \ + text: label_left_text; \ + size: label_left_size; \ + min: 1 1; \ + align: 0.5 0.5; \ + text_class: TEXT_CLASS_SLP_LIGHT; \ + } \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_right"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: right_txt_lpad 0.0; to: txt;} \ + rel2 { relative: 1.0 1.0; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + color: 197 197 197 255; \ + text { \ + font: FONT_SLP_Regular; \ + text: label_right_text; \ + size: label_right_size; \ + min: 1 1; \ + align: 0.0 0.5; \ + text_class: TEXT_CLASS_SLP_REGULAR; \ + } \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { name: "over_"txt; \ + type: RECT; \ + mouse_events: 1; \ + repeat_events: 1; \ + ignore_flags: ON_HOLD; \ + description { state: "default" 0.0; \ + rel1 { relative: 0 0; to: txt; } \ + rel2 { relative: 1 1; to: txt; } \ + color: 0 0 0 0; \ + } \ + } + + +#define PART_KEYPAD_CUSTOM_ONELABEL_ONEICON(txt, offx, offy, icon_right, icon_right_sizex, icon_right_sizey, label_left_text, label_left_size) \ + part { \ + name: txt; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + visible: 0; \ + rel1 { relative: REL_KEYPAD_W(offx) REL_KEYPAD_H(offy); to:"keypad/area";} \ + rel2 { relative: REL_KEYPAD_W(offx+KEYPAD_EACH_BTN_WIDTH) REL_KEYPAD_H(offy+KEYPAD_EACH_BTN_HEIGHT); to:"keypad/area"; } \ + } \ + description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + visible: 1; \ + image.normal: IMG_SRC_DIR/"vc_keypad_btn_press.png"; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_left"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: KEYPAD_BTN_LEFT_TXT_L 0.0; to: txt;} \ + rel2 { relative: KEYPAD_BTN_LEFT_TXT_R 1.0; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + color: 242 242 242 255; \ + text { \ + font: FONT_SLP_Light; \ + text: label_left_text; \ + size: label_left_size; \ + min: 1 1; \ + align: 0.5 0.5; \ + text_class: TEXT_CLASS_SLP_LIGHT; \ + } \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: txt"_right"; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 0; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + min: icon_right_sizex icon_right_sizey; \ + fixed: 1 1; \ + rel1 { relative: KEYPAD_BTN_RIGHT_ICON_L 0.5; to: txt;} \ + rel2 { relative: KEYPAD_BTN_RIGHT_ICON_R 0.5; to: txt;} \ + align: 0.5 0.5; \ + image.normal: icon_right; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { name: "over_"txt; \ + type: RECT; \ + mouse_events: 1; \ + repeat_events: 1; \ + ignore_flags: ON_HOLD; \ + description { state: "default" 0.0; \ + rel1 { relative: 0 0; to: txt; } \ + rel2 { relative: 1 1; to: txt; } \ + color: 0 0 0 0; \ + } \ + } + +#define PROG_KEYPAD(txt) \ + program { \ + name: "down_"txt; \ + signal: "mouse,down,*"; \ + source: "over_"txt; \ + script { \ + set_state(PART:txt, "pressed", 0.0); \ + emit("pad_down", txt); \ + } \ + } \ + program { \ + name: "ani_"txt; \ + signal: "ani"; \ + source: "over_"txt; \ + action: STATE_SET "default" 0.0; \ + transition: SINUSOIDAL 0.1; \ + target: txt; \ + } \ + program { \ + name: "up_"txt; \ + signal: "mouse,up,1"; \ + source: "over_"txt; \ + script { \ + set_state(PART:txt, "default", 0.0); \ + emit("pad_up", txt); \ + emit("ani", "over_"txt); \ + } \ + } \ + program { \ + name: "clicked_"txt; \ + signal: "mouse,clicked,1"; \ + source: "over_"txt; \ + script { \ + emit("pad_clicked", txt); \ + } \ + } + +#define TARGET_KEYPAD(txt) \ + target: txt; \ + target: txt"_left"; \ + target: txt"_right"; \ + target: "over_"txt; + +group{ + name: "keypad"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 128; + } + } + + part { name: "keypad/area"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0 1; to: "background"; } + rel2 { relative: 1 1; to: "background"; } + } + description { + state: "show" 0.0; + visible: 1; + rel1 { relative: 0 0; to: "background"; } + rel2 { relative: 1 1; to: "background"; } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + } + } + + part { + name: "textblock/textarea"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: KEYPAD_ENTRY_TEXT_L KEYPAD_ENTRY_TEXT_T; to: "keypad/area"; } + rel2 { relative: KEYPAD_ENTRY_TEXT_R KEYPAD_ENTRY_TEXT_B; to: "keypad/area"; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "keypad_btns/bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: KEYPAD_BTNS_BG_L KEYPAD_BTNS_BG_T; to: "keypad/area"; } + rel2 { relative: KEYPAD_BTNS_BG_R KEYPAD_BTNS_BG_B; to: "keypad/area"; } + color: 255 255 255 179; + image { + normal: IMG_SRC_DIR/"vc_keypad_btn_normal.png"; + border: 20 20 0 0; + border_scale: 1; + } + } + } + + PART_KEYPAD_CUSTOM_ONELABEL_ONEICON("1", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW1_BTN_T_PAD, IMG_SRC_DIR/"vc_keypad_btn_icon.png", RIGHT_ICON_WIDTH, RIGHT_ICON_HEIGHT, "1", KEYPAD_BTN_TXT_REGION_HEIGHT) + PART_KEYPAD_CUSTOM_TWO_LABLE("2", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW1_BTN_T_PAD, "2", KEYPAD_BTN_TXT_REGION_HEIGHT, "ABC", 30, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("3", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW1_BTN_T_PAD, "3", KEYPAD_BTN_TXT_REGION_HEIGHT, "DEF", 30, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("4", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW2_BTN_T_PAD, "4", KEYPAD_BTN_TXT_REGION_HEIGHT, "GHI", 30, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("5", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW2_BTN_T_PAD, "5", KEYPAD_BTN_TXT_REGION_HEIGHT, "JKL", 30, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("6", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW2_BTN_T_PAD, "6", KEYPAD_BTN_TXT_REGION_HEIGHT, "MNO", 30, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("7", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW3_BTN_T_PAD, "7", KEYPAD_BTN_TXT_REGION_HEIGHT, "PQRS", 30, KEYPAD_BTN_RIGHT_TXT_TYPE2_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("8", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW3_BTN_T_PAD, "8", KEYPAD_BTN_TXT_REGION_HEIGHT, "TUV", 30, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("9", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW3_BTN_T_PAD, "9", KEYPAD_BTN_TXT_REGION_HEIGHT, "WXYZ", 30, KEYPAD_BTN_RIGHT_TXT_TYPE2_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("star", KEYPAD_COL1_BTN_L_PAD, KEYPAD_ROW4_BTN_T_PAD, "*", KEYPAD_BTN_TXT_REGION_HEIGHT, "P", 60, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("0", KEYPAD_COL2_BTN_L_PAD, KEYPAD_ROW4_BTN_T_PAD, "0", KEYPAD_BTN_TXT_REGION_HEIGHT, "+", 64, KEYPAD_BTN_RIGHT_TXT_TYPE1_L) + PART_KEYPAD_CUSTOM_TWO_LABLE("sharp", KEYPAD_COL3_BTN_L_PAD, KEYPAD_ROW4_BTN_T_PAD, "#", KEYPAD_BTN_TXT_REGION_HEIGHT, "", 64, KEYPAD_BTN_RIGHT_TXT_TYPE2_L) + + } + + programs{ + program { name: "show_keypadbtn"; + signal: "SHOW"; + source: "KEYPADBTN"; + action: STATE_SET "show" 0.0; + transition: LINEAR 0.5; + target: "keypad/area"; + after: "show_keypadbtn_next"; + } + program { name: "show_keypadbtn_next"; + action: STATE_SET "show" 0.0; + target: "textblock/textarea"; + } + program { name: "hide_keypadbtn"; + signal: "HIDE"; + source: "KEYPADBTN"; + action: STATE_SET "hide" 0.0; + target: "textblock/textarea"; + after: "hide_keypadbtn_next"; + } + program { name: "hide_keypadbtn_next"; + action: STATE_SET "hide" 0.0; + transition: ACCELERATE 0.5; + target: "keypad/area"; + after: "hide_keypadbtn_done"; + } + program { name: "hide_keypadbtn_done"; + action: SIGNAL_EMIT "DONE" "HIDEKEYPAD"; + } + PROG_KEYPAD("1") + PROG_KEYPAD("2") + PROG_KEYPAD("3") + PROG_KEYPAD("4") + PROG_KEYPAD("5") + PROG_KEYPAD("6") + PROG_KEYPAD("7") + PROG_KEYPAD("8") + PROG_KEYPAD("9") + PROG_KEYPAD("star") + PROG_KEYPAD("0") + PROG_KEYPAD("sharp") + } +} diff --git a/ui/call_edc/vcui-view-landscape-quick-pannel.edc b/ui/call_edc/vcui-view-landscape-quick-pannel.edc new file mode 100644 index 0000000..d339de7 --- /dev/null +++ b/ui/call_edc/vcui-view-landscape-quick-pannel.edc @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "quickpanel-lscape"; + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 20 20 20 255; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: LSCAPE_QUICKPANEL_CID_L LSCAPE_QUICKPANEL_CID_T; to: "background";} + rel2 { relative: LSCAPE_QUICKPANEL_CID_R LSCAPE_QUICKPANEL_CID_B; to: "background";} + } + } + + part { name: "btn_left"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { relative: LSCAPE_QUICKPANEL_BTN_MUTE_L LSCAPE_QUICKPANEL_BTN_MUTE_T; to: "background";} + rel2 { relative: LSCAPE_QUICKPANEL_BTN_MUTE_R LSCAPE_QUICKPANEL_BTN_MUTE_B; to: "background";} + } + } + + part { name: "btn_right"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { relative: LSCAPE_QUICKPANEL_BTN_END_L LSCAPE_QUICKPANEL_BTN_END_T; to: "background";} + rel2 { relative: LSCAPE_QUICKPANEL_BTN_END_R LSCAPE_QUICKPANEL_BTN_END_B; to: "background";} + } + } + + part { name: "txt_area"; + type: RECT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: LSCAPE_QUICKPANEL_NAME_L LSCAPE_QUICKPANEL_NAME_T; to: "background";} + rel2 { relative: LSCAPE_QUICKPANEL_NAME_R LSCAPE_QUICKPANEL_NAME_B; to: "background";} + } + } + + part { name: "txt_call_name"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "txt_area";} + rel2 { relative: 0 1; to: "txt_padding";} + max: LSCAPE_QP_NAME_WIDTH LSCAPE_QP_NAME_HEIGHT; + min: QP_STR_MIN_WIDTH LSCAPE_QP_NAME_HEIGHT; + fixed: 0 1; + align: 0 0; + text { font, FONT_SLP_Regular; size, 32; align: 0 0.5; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 249 249 249 255; + color2: 0 0 0 128; + } + } + + part { name: "txt_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 0; + min: QP_CID_L_PAD 0; + align: 1 0; + visible: 0; + rel1 { relative: 0 0; to: "txt_timer";} + rel2 { relative: 0 1; to: "txt_timer";} + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 1.0 0; to: "txt_area";} + rel2 { relative: 1.0 1; to: "txt_area";} + max: LSCAPE_QP_NAME_WIDTH LSCAPE_QP_NAME_HEIGHT; + min: QP_STR_MIN_WIDTH LSCAPE_QP_NAME_HEIGHT; + fixed: 0 1; + align: 1 0; + text { font, FONT_SLP_Regular; size, 32; align: 1 0.5; min: 1 0; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 98 161 22 255; + color2: 0 0 0 191; + } + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-multi-call-conf.edc b/ui/call_edc/vcui-view-multi-call-conf.edc new file mode 100644 index 0000000..08bd20c --- /dev/null +++ b/ui/call_edc/vcui-view-multi-call-conf.edc @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "multicall-conf"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_BACKGROUND_CID_L INCALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_CID_R INCALL_BACKGROUND_CID_B; to: "background";} + } + } + + /*part { name: "call_bg_img"; + type: SWALLOW; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "background";} + rel2 { relative: 1 1; to: "background";} + } + }*/ + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_CID_L INCALL_CID_T; } + rel2 { relative: INCALL_CID_R INCALL_CID_B; } + } + } + + part { name: "swl_cid_dim"; /*for held call dim*/ + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 0; + color: COLOR_BG_FOR_HELD_CALL_DIM; + } + description { + state: "wvga" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; offset: 6 0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; offset: -6 0; to: "swl_cid";} + } + description { + state: "hd" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "swl_cid";} + rel2 { relative: 1.0 1.0; to: "swl_cid";} + } + } + + part { name: "caller_info"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "extra_vol_icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_EXTRA_VOL_ICON_L INCALL_EXTRA_VOL_ICON_T; to: "background";} + rel2 { relative: INCALL_EXTRA_VOL_ICON_R INCALL_EXTRA_VOL_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "noise_reduction_icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_NOISE_ICON_L INCALL_NOISE_ICON_T; to: "background";} + rel2 { relative: INCALL_NOISE_ICON_R INCALL_NOISE_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_NOISE_ICON_L INCALL_NOISE_ICON_T; to: "background";} + rel2 { relative: INCALL_NOISE_ICON_R INCALL_NOISE_ICON_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "sound_eq_icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_SOUND_EQ_ICON_L INCALL_SOUND_EQ_ICON_T; to: "background";} + rel2 { relative: INCALL_SOUND_EQ_ICON_R INCALL_SOUND_EQ_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_SOUND_EQ_ICON_L INCALL_SOUND_EQ_ICON_T; to: "background";} + rel2 { relative: INCALL_SOUND_EQ_ICON_R INCALL_SOUND_EQ_ICON_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_hold_swap"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_HOLD_L INCALL_HOLD_T; to: "background";} + rel2 { relative: INCALL_HOLD_R INCALL_HOLD_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "txt_hold_swap"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: INCALL_HOLD_TXT_L INCALL_HOLD_TXT_T; to: "background";} + rel2 { relative: INCALL_HOLD_TXT_R INCALL_HOLD_TXT_B; to: "background";} + text { font, FONT_SLP_Bold; size, 36; align, 1.0 0.5; text_class, TEXT_CLASS_SLP_BOLD; } + color: 204 204 204 255; + color2: 0 0 0 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: SIX_BTN_LAYOUT_L SIX_BTN_LAYOUT_T; to: "background";} + rel2 { relative: SIX_BTN_LAYOUT_R SIX_BTN_LAYOUT_B; to: "background";} + } + } + + part { name: "btn_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "btn_bg"; } + rel2 { relative: 1 1; to: "btn_bg"; } + } + } + + part { name: "keypad_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: KEYPAD_AREA_L KEYPAD_AREA_T; to: "background";} + rel2 { relative: KEYPAD_AREA_R KEYPAD_AREA_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + }//parts + + programs { + program { name: "hide_dim_cid"; + signal: "HIDE_DIM"; + source: "CID"; + action: STATE_SET "default" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_wvga"; + signal: "SHOW_DIM_WVGA"; + source: "CID_WVGA"; + action: STATE_SET "wvga" 0.0; + target: "swl_cid_dim"; + } + program { name: "show_dim_cid_hd"; + signal: "SHOW_DIM_HD"; + source: "CID_HD"; + action: STATE_SET "hd" 0.0; + target: "swl_cid_dim"; + } + + program { name: "show_noise_reduction"; + signal: "SHOW_NOISE_REDUCTIION"; + source: "NOISE_REDUCTIION"; + action: STATE_SET "show" 0.0; + target: "noise_reduction_icon"; + } + + program { name: "hide_noise_reduction"; + signal: "HIDE_NOISE_REDUCTIION"; + source: "NOISE_REDUCTIION"; + action: STATE_SET "default" 0.0; + target: "noise_reduction_icon"; + } + + program { name: "show_sound_eq"; + signal: "SHOW_SOUND_EQ"; + source: "SOUND_EQ"; + action: STATE_SET "show" 0.0; + target: "sound_eq_icon"; + } + + program { name: "hide_sound_eq"; + signal: "HIDE_SOUND_EQ"; + source: "SOUND_EQ"; + action: STATE_SET "default" 0.0; + target: "sound_eq_icon"; + } + + program { name: "show_keypadbtn"; + signal: "SHOW"; + source: "KEYPAD_BTN"; + action: STATE_SET "show" 0.0; + target: "keypad_region"; + } + program { name: "hide_keypadbtn"; + signal: "HIDE"; + source: "KEYPAD_BTN"; + action: STATE_SET "hide" 0.0; + target: "keypad_region"; + } + + program { name: "show_after_keypad"; + signal: "SHOW"; + source: "CALL_AREA"; + action: STATE_SET "show" 0.0; + target: "caller_info"; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "extra_vol_icon"; + } + program { name: "hide_caller_info"; + signal: "HIDE"; + source: "CALL_AREA"; + action: STATE_SET "hide" 0.0; + target: "caller_info"; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "extra_vol_icon"; + } + } +} diff --git a/ui/call_edc/vcui-view-multi-call-list.edc b/ui/call_edc/vcui-view-multi-call-list.edc new file mode 100644 index 0000000..ac4dbc8 --- /dev/null +++ b/ui/call_edc/vcui-view-multi-call-list.edc @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "multicall-list"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_calllist"; + type: SWALLOW; + description { + state: "show" 0.0; + rel1 { relative: MULTICALL_LIST_L MULTICALL_LIST_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_R MULTICALL_LIST_B; to: "background"; } + } + description { + state: "hide" 0.0; + visible: 0; + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MULTICALL_LIST_TIMER_L MULTICALL_LIST_TIMER_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_TIMER_R MULTICALL_LIST_TIMER_B; to: "background"; } + text { font, FONT_SLP_Regular; size, 48; align, 0.5 0.5; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 0 0 0 255; + } + description { + state: "end" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_hold"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MULTICALL_LIST_HOLD_L MULTICALL_LIST_HOLD_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_HOLD_R MULTICALL_LIST_HOLD_B; to: "background"; } + } + } + + part { name: "btn_bigend"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: MULTICALL_LIST_BIG_END_L MULTICALL_LIST_BIG_END_T; to: "background"; } + rel2 { relative: MULTICALL_LIST_BIG_END_R MULTICALL_LIST_BIG_END_B; to: "background"; } + } + } + }//parts + + programs { + + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-multi-call-split.edc b/ui/call_edc/vcui-view-multi-call-split.edc new file mode 100644 index 0000000..93419b8 --- /dev/null +++ b/ui/call_edc/vcui-view-multi-call-split.edc @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "multicall-split"; + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + max: MAIN_LAYOUT_W MAIN_LAYOUT_H; + } + } + + part { name: "swl_cid_unhold"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: MULTICALL_SPLIT_CID_1_L MULTICALL_SPLIT_CID_1_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_CID_1_R MULTICALL_SPLIT_CID_1_B; to: "background";} + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "swl_cid_hold"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: MULTICALL_SPLIT_CID_2_L MULTICALL_SPLIT_CID_2_T; to: "background";} + rel2 { relative: MULTICALL_SPLIT_CID_2_R MULTICALL_SPLIT_CID_2_B; to: "background";} + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "caller_info_unhold"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "caller_info_hold"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: CALLER_INFO_HOLD_L CALLER_INFO_HOLD_T; to: "background";} + rel2 { relative: CALLER_INFO_HOLD_R CALLER_INFO_HOLD_B; to: "background";} + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "extra_vol_icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: INCALL_EXTRA_VOL_ICON_L INCALL_EXTRA_VOL_ICON_T; to: "background";} + rel2 { relative: INCALL_EXTRA_VOL_ICON_R INCALL_EXTRA_VOL_ICON_B; to: "background";} + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "noise_reduction_icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_NOISE_ICON_L INCALL_NOISE_ICON_T; to: "background";} + rel2 { relative: INCALL_NOISE_ICON_R INCALL_NOISE_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_NOISE_ICON_L INCALL_NOISE_ICON_T; to: "background";} + rel2 { relative: INCALL_NOISE_ICON_R INCALL_NOISE_ICON_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "sound_eq_icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_SOUND_EQ_ICON_L INCALL_SOUND_EQ_ICON_T; to: "background";} + rel2 { relative: INCALL_SOUND_EQ_ICON_R INCALL_SOUND_EQ_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_SOUND_EQ_ICON_L INCALL_SOUND_EQ_ICON_T; to: "background";} + rel2 { relative: INCALL_SOUND_EQ_ICON_R INCALL_SOUND_EQ_ICON_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_hold_swap"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: INCALL_HOLD_L INCALL_HOLD_T; to: "background";} + rel2 { relative: INCALL_HOLD_R INCALL_HOLD_B; to: "background";} + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "txt_hold_swap"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: INCALL_HOLD_TXT_L INCALL_HOLD_TXT_T; to: "background";} + rel2 { relative: INCALL_HOLD_TXT_R INCALL_HOLD_TXT_B; to: "background";} + text { font, FONT_SLP_Bold; size, 36; align, 1.0 0.5; text_class, TEXT_CLASS_SLP_BOLD; } + color: 204 204 204 255; + color2: 0 0 0 255; + } + description { + state: "portrait" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_LAYOUT_L SIX_BTN_LAYOUT_T; to: "background";} + rel2 { relative: SIX_BTN_LAYOUT_R SIX_BTN_LAYOUT_B; to: "background";} + } + } + + part { name: "btn_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "portrait" 0.0; + visible: 1; + rel1 { relative: 0 0; to: "btn_bg"; } + rel2 { relative: 1 1; to: "btn_bg"; } + } + } + + part { name: "keypad_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: KEYPAD_AREA_L KEYPAD_AREA_T; to: "background";} + rel2 { relative: KEYPAD_AREA_R KEYPAD_AREA_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + }//parts + + programs { + program { name: "show_portrait_mode"; + signal: "set-portrait"; + source: "incall-split-view"; + action: STATE_SET "portrait" 0.0; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "btn_bg"; + target: "btn_region"; + target: "swl_cid_unhold"; + target: "swl_cid_hold"; + target: "caller_info_hold"; + target: "caller_info_unhold"; + target: "extra_vol_icon"; + } + + program { name: "show_noise_reduction"; + signal: "SHOW_NOISE_REDUCTIION"; + source: "NOISE_REDUCTIION"; + action: STATE_SET "show" 0.0; + target: "noise_reduction_icon"; + } + + program { name: "hide_noise_reduction"; + signal: "HIDE_NOISE_REDUCTIION"; + source: "NOISE_REDUCTIION"; + action: STATE_SET "default" 0.0; + target: "noise_reduction_icon"; + } + + program { name: "show_sound_eq"; + signal: "SHOW_SOUND_EQ"; + source: "SOUND_EQ"; + action: STATE_SET "show" 0.0; + target: "sound_eq_icon"; + } + + program { name: "hide_sound_eq"; + signal: "HIDE_SOUND_EQ"; + source: "SOUND_EQ"; + action: STATE_SET "default" 0.0; + target: "sound_eq_icon"; + } + + program { name: "show_keypadbtn"; + signal: "SHOW"; + source: "KEYPAD_BTN"; + action: STATE_SET "show" 0.0; + target: "keypad_region"; + } + program { name: "hide_keypadbtn"; + signal: "HIDE"; + source: "KEYPAD_BTN"; + action: STATE_SET "hide" 0.0; + target: "keypad_region"; + } + + program { name: "show_after_keypad"; + signal: "SHOW"; + source: "CALL_AREA"; + action: STATE_SET "portrait" 0.0; + target: "caller_info_hold"; + target: "caller_info_unhold"; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "extra_vol_icon"; + } + program { name: "hide_caller_info"; + signal: "HIDE"; + source: "CALL_AREA"; + action: STATE_SET "hide" 0.0; + target: "caller_info_hold"; + target: "caller_info_unhold"; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "extra_vol_icon"; + } + } +} diff --git a/ui/call_edc/vcui-view-naviframe.edc b/ui/call_edc/vcui-view-naviframe.edc new file mode 100755 index 0000000..301b153 --- /dev/null +++ b/ui/call_edc/vcui-view-naviframe.edc @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "navigation_view"; + parts { + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + + part { name: "swl_msglist"; + type: SWALLOW; + description { + state: "show" 0.0; + rel1 { relative: REJECT_W_MSG_LIST_L REJECT_W_MSG_LIST_T; to: "base";} + rel2 { relative: REJECT_W_MSG_LIST_R REJECT_W_MSG_LIST_B; to: "base";} + } + description { + state: "hide" 0.0; + visible: 0; + } + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-popup.edc b/ui/call_edc/vcui-view-popup.edc new file mode 100644 index 0000000..fc05827 --- /dev/null +++ b/ui/call_edc/vcui-view-popup.edc @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +styles { + style { + name: "text_status_style"; + base: "font="FONT_SLP_Regular" text_class="FONT_SLP_Regular_Txt_Class" font_size=36 color=#000000FF wrap=word align=left valign=bottom ellipsis=-1.0"; + tag: "br" "\n"; + tag: "ps" "ps"; + tag: "hilight" "+ font="FONT_SLP_Regular "+ text_class="FONT_SLP_Regular_Txt_Class; + tag: "b" "+ font="FONT_SLP_Regular "+ text_class="FONT_SLP_Regular_Txt_Class; + tag: "tab" "\t"; + } +} + +group { + name: "volume"; + parts { + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + + part { + name: "body_bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 624 126; + max: 624 126; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + color: 0 0 0 0; + } + } + + part { + name: "volume_icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + min: 64 64; + max: 64 64; + align: 0.5 0.5; + rel1 { relative: (38/624) (31/126); to: "body_bg"; } + rel2 { relative: (102/624) (95/126); to: "body_bg"; } + color: 255 255 255 255; + } + description { + state: "mute" 0.0; + inherit: "default" 0.0; + } + } + + part { + name: "volume_slider"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 102/624 0.0; to: "body_bg"; } + rel2 { relative: 586/624 1.0; to: "body_bg"; } + color: 0 0 0 0; + } + } + } +} + +group { + name: "flight_mode_popup"; + parts { + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + + part { + name: "body_bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 624 250; + max: 624 250; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + color: 0 0 0 0; + } + } + + part { + name: "text_msg"; + type: TEXTBLOCK; + + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 0.05 0; offset: 0 10; to: "body_bg"; } + rel2 { relative: 1 (178/250); to: "body_bg"; } + text { style: "text_status_style"; } + } + } + + part { + name: "check"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 0 (198/250); offset: 50 0; to: "body_bg"; } + rel2 { relative: 0 1; offset: 110 -10; to: "body_bg"; } + color: 0 0 0 0; + } + } + + part { name: "check_text"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: (130/624) (198/250); to: "body_bg"; } + rel2 { relative: 1 1; offset: 0 -10; to: "body_bg"; } + text { + font, FONT_SLP_Regular; + size, 36; + align, 0.0 0.5; + text_class, TEXT_CLASS_SLP_REGULAR; + } + color: 0 0 0 255; + } + } + } +} + +group { name: "checking_progress"; + parts{ + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + + part { + name: "body_bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 624 126; + max: 624 126; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + color: 0 0 0 0; + } + } + part { + name: "content"; + type: SWALLOW; + scale: 1; + description { + align: 0.5 0.5; + fixed: 1 0; + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "body_bg";} + rel2 { relative: 0.3 1.0; to: "body_bg";} + } + } + part{ name: "text"; + type: TEXT; + description { + state: "default" 0.0; + rel1 { relative: 0.3 0.0; to: "body_bg";} + rel2 { relative: 1.0 1.0; to: "body_bg";} + text { font, FONT_SLP_Regular; size, 32; align, 0.0 0.5; text_class, TEXT_CLASS_SLP_REGULAR;} + color: 0 0 0 255; + } + } + } +} diff --git a/ui/call_edc/vcui-view-quick-pannel.edc b/ui/call_edc/vcui-view-quick-pannel.edc new file mode 100644 index 0000000..b06b6d0 --- /dev/null +++ b/ui/call_edc/vcui-view-quick-pannel.edc @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "quickpanel"; + + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: 20 20 20 255; + } + } + + part { name: "swl_cid"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: CALL_QUICKPANEL_CID_L CALL_QUICKPANEL_CID_T; to: "background";} + rel2 { relative: CALL_QUICKPANEL_CID_R CALL_QUICKPANEL_CID_B; to: "background";} + } + } + + part { name: "btn_left"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { relative: CALL_QUICKPANEL_BTN_MUTE_L CALL_QUICKPANEL_BTN_MUTE_T; to: "background";} + rel2 { relative: CALL_QUICKPANEL_BTN_MUTE_R CALL_QUICKPANEL_BTN_MUTE_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_right"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { relative: CALL_QUICKPANEL_BTN_END_L CALL_QUICKPANEL_BTN_END_T; to: "background";} + rel2 { relative: CALL_QUICKPANEL_BTN_END_R CALL_QUICKPANEL_BTN_END_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "txt_area"; + type: RECT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: CALL_QUICKPANEL_NAME_L CALL_QUICKPANEL_NAME_T; to: "background";} + rel2 { relative: CALL_QUICKPANEL_NAME_R CALL_QUICKPANEL_NAME_B; to: "background";} + } + } + + part { name: "txt_call_name"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0 0; to: "txt_area";} + rel2 { relative: 0 1; to: "txt_padding";} + max: QP_NAME_WIDTH QP_NAME_HEIGHT; + min: QP_STR_MIN_WIDTH QP_NAME_HEIGHT; + fixed: 0 1; + align: 0 0; + text { font, FONT_SLP_Regular; size, 32; align: 0 0.5; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 249 249 249 255; + color2: 0 0 0 128; + } + } + + part { name: "txt_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 0; + min: QP_CID_L_PAD 0; + align: 1 0; + visible: 0; + rel1 { relative: 0 0; to: "txt_timer";} + rel2 { relative: 0 1; to: "txt_timer";} + } + } + + part { name: "txt_timer"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 1.0 0; to: "txt_area";} + rel2 { relative: 1.0 1; to: "txt_area";} + max: QP_NAME_WIDTH QP_NAME_HEIGHT; + min: QP_STR_MIN_WIDTH QP_NAME_HEIGHT; + fixed: 0 1; + align: 1 0; + text { font, FONT_SLP_Regular; size, 32; align: 1 0.5; min: 1 0; text_class, TEXT_CLASS_SLP_REGULAR; } + color: 98 161 22 255; + color2: 0 0 0 191; + } + } + } +} \ No newline at end of file diff --git a/ui/call_edc/vcui-view-reject.edc b/ui/call_edc/vcui-view-reject.edc new file mode 100755 index 0000000..aac6ee3 --- /dev/null +++ b/ui/call_edc/vcui-view-reject.edc @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "reject_with_msg"; + parts { + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + description { + state: "show" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_cid_background"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: INCALL_BACKGROUND_CID_L INCALL_BACKGROUND_CID_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_CID_R INCALL_BACKGROUND_CID_B; to: "background";} + } + } + + part { name: "bg_alpha"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_BG_ALPHA; + } + } + + part { name: "swl_naviframe"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + fixed: 1 1; + min: 0 50; + state: "default" 0.0; + rel1 { relative: CALL_NAVIGATION_BAR_L CALL_NAVIGATION_BAR_T; to: "background";} + rel2 { relative: CALL_NAVIGATION_BAR_R CALL_NAVIGATION_BAR_B; to: "background";} + } + } + + part { name: "btn_create_new"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: REJECT_W_MSG_CREATE_NEW_L REJECT_W_MSG_CREATE_NEW_T; to: "background";} + rel2 { relative: REJECT_W_MSG_CREATE_NEW_R REJECT_W_MSG_CREATE_NEW_B; to: "background";} + } + } + } +} diff --git a/ui/call_edc/vcui-view-single-call.edc b/ui/call_edc/vcui-view-single-call.edc new file mode 100644 index 0000000..48b670c --- /dev/null +++ b/ui/call_edc/vcui-view-single-call.edc @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "incall"; + parts { + + part { name: "background"; + type: RECT; + description { + state: "default" 0.0; + color: COLOR_DEFAULT; + } + } + + part { name: "swl_share_background"; //CALL_RCS_CHANGE start + type: RECT; + description { + state: "default" 0.0; + visible: 0; + color: 50 42 37 255; + rel1 { relative: INCALL_BACKGROUND_SHARE_L INCALL_BACKGROUND_SHARE_T; to: "background";} + rel2 { relative: INCALL_BACKGROUND_SHARE_R INCALL_BACKGROUND_SHARE_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } //CALL_RCS_CHANGE end + + part { name: "caller_id"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: VC_CALLER_ID_LAYOUT_L VC_CALLER_ID_LAYOUT_T; to: "background";} + rel2 { relative: VC_CALLER_ID_LAYOUT_R VC_CALLER_ID_LAYOUT_B; to: "background";} + } + description { //CALL_RCS_CHANGE start + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } //CALL_RCS_CHANGE end + } + + part { name: "caller_info"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: CALLER_INFO_L CALLER_INFO_T; to: "background";} + rel2 { relative: CALLER_INFO_R CALLER_INFO_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "extra_vol_icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_EXTRA_VOL_ICON_L INCALL_EXTRA_VOL_ICON_T; to: "background";} + rel2 { relative: INCALL_EXTRA_VOL_ICON_R INCALL_EXTRA_VOL_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "noise_reduction_icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_NOISE_ICON_L INCALL_NOISE_ICON_T; to: "background";} + rel2 { relative: INCALL_NOISE_ICON_R INCALL_NOISE_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_NOISE_ICON_L INCALL_NOISE_ICON_T; to: "background";} + rel2 { relative: INCALL_NOISE_ICON_R INCALL_NOISE_ICON_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "sound_eq_icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_SOUND_EQ_ICON_L INCALL_SOUND_EQ_ICON_T; to: "background";} + rel2 { relative: INCALL_SOUND_EQ_ICON_R INCALL_SOUND_EQ_ICON_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_SOUND_EQ_ICON_L INCALL_SOUND_EQ_ICON_T; to: "background";} + rel2 { relative: INCALL_SOUND_EQ_ICON_R INCALL_SOUND_EQ_ICON_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_hold_swap"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { relative: INCALL_HOLD_L INCALL_HOLD_B; to: "background";} + rel2 { relative: INCALL_HOLD_R INCALL_HOLD_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_HOLD_L INCALL_HOLD_T; to: "background";} + rel2 { relative: INCALL_HOLD_R INCALL_HOLD_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "txt_hold_swap"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: INCALL_HOLD_TXT_L INCALL_HOLD_TXT_B; to: "background";} + rel2 { relative: INCALL_HOLD_TXT_R INCALL_HOLD_TXT_B; to: "background";} + text { font, FONT_SLP_Bold; size, 36; align, 1.0 0.5; text_class, TEXT_CLASS_SLP_BOLD; } + color: 204 204 204 255; + color2: 0 0 0 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: INCALL_HOLD_TXT_L INCALL_HOLD_TXT_T; to: "background";} + rel2 { relative: INCALL_HOLD_TXT_R INCALL_HOLD_TXT_B; to: "background";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { name: "btn_bg"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: SIX_BTN_LAYOUT_L SIX_BTN_LAYOUT_B; to: "background";} + rel2 { relative: SIX_BTN_LAYOUT_R SIX_BTN_LAYOUT_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 { relative: SIX_BTN_LAYOUT_L SIX_BTN_LAYOUT_T; to: "background";} + rel2 { relative: SIX_BTN_LAYOUT_R SIX_BTN_LAYOUT_B; to: "background";} + } + } + + part { name: "btn_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0 0; to: "btn_bg"; } + rel2 { relative: 1 1; to: "btn_bg"; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "keypad_region"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: KEYPAD_AREA_L KEYPAD_AREA_T; to: "background";} + rel2 { relative: KEYPAD_AREA_R KEYPAD_AREA_B; to: "background";} + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + }//parts + + programs { + program { name: "show_effect_allbtn"; + signal: "SHOW_EFFECT"; + source: "ALLBTN"; + action: STATE_SET "show" 0.0; + transition: DECELERATE 0.5; //LINEAR 1.0; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "btn_bg"; + target: "btn_region"; + } + program { name: "show_no_effect_allbtn"; + signal: "SHOW_NO_EFFECT"; + source: "ALLBTN"; + action: STATE_SET "show" 0.0; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "btn_bg"; + target: "btn_region"; + } + + //CALL_RCS_CHANGE start + program { name: "show_share_bg"; + signal: "SHOW_SHARE_BG"; + source: "Share_BG"; + action: STATE_SET "show" 0.0; + target: "swl_share_background"; + } + program { name: "hide_share_bg"; + signal: "HIDE_SHARE_BG"; + source: "Share_BG"; + action: STATE_SET "default" 0.0; + target: "swl_share_background"; + } + + program { name: "show_noise_reduction"; + signal: "SHOW_NOISE_REDUCTIION"; + source: "NOISE_REDUCTIION"; + action: STATE_SET "show" 0.0; + target: "noise_reduction_icon"; + } + + program { name: "hide_noise_reduction"; + signal: "HIDE_NOISE_REDUCTIION"; + source: "NOISE_REDUCTIION"; + action: STATE_SET "default" 0.0; + target: "noise_reduction_icon"; + } + + program { name: "show_sound_eq"; + signal: "SHOW_SOUND_EQ"; + source: "SOUND_EQ"; + action: STATE_SET "show" 0.0; + target: "sound_eq_icon"; + } + + program { name: "hide_sound_eq"; + signal: "HIDE_SOUND_EQ"; + source: "SOUND_EQ"; + action: STATE_SET "default" 0.0; + target: "sound_eq_icon"; + } + + program { name: "show_keypadbtn"; + signal: "SHOW"; + source: "KEYPAD_BTN"; + action: STATE_SET "show" 0.0; + target: "keypad_region"; + } + program { name: "hide_keypadbtn"; + signal: "HIDE"; + source: "KEYPAD_BTN"; + action: STATE_SET "hide" 0.0; + target: "keypad_region"; + } + + program { name: "show_after_keypad"; + signal: "SHOW"; + source: "CALL_AREA"; + action: STATE_SET "show" 0.0; + target: "caller_info"; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "extra_vol_icon"; + } + program { name: "hide_caller_info"; + signal: "HIDE"; + source: "CALL_AREA"; + action: STATE_SET "hide" 0.0; + target: "caller_info"; + target: "btn_hold_swap"; + target: "txt_hold_swap"; + target: "extra_vol_icon"; + } + } +} diff --git a/ui/call_edc/vcui-view-ug-effect.edc b/ui/call_edc/vcui-view-ug-effect.edc new file mode 100755 index 0000000..e31c396 --- /dev/null +++ b/ui/call_edc/vcui-view-ug-effect.edc @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "ug_effect"; + parts { + part { + name: "clip"; + type: RECT; + description { + state: "default" 0.0; + rel1 { relative: 1 0; } + rel2 { relative: 2 1; } + color: 255 255 255 0; + } + description { + state: "show" 0.0; + rel1 { relative: 0 0; } + rel2 { relative: 1 1; } + color: 255 255 255 255; + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + clip_to: "clip"; + description { + rel1.to: "clip"; + rel2.to: "clip"; + } + } + part { + name: "event_blocker"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "show"; + signal: "elm,state,show"; + action: STATE_SET "show" 0.0; + target: "clip"; + target: "event_blocker"; + transition: "DECELERATE" 0.5; + after: "show_end"; + } + program { + name: "hide"; + signal: "elm,state,hide"; + action: STATE_SET "default" 0.0; + target: "clip"; + target: "event_blocker"; + transition: "DECELERATE" 0.5; + after: "hide_end"; + } + program { + name: "disable_blocker"; + action: STATE_SET "disabled" 0.0; + target: "event_blocker"; + } + program { + name: "show_end"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + after: "disable_blocker"; + } + program { + name: "hide_end"; + action: SIGNAL_EMIT "elm,action,hide,finished" ""; + after: "disable_blocker"; + } + } +} \ No newline at end of file diff --git a/ui/default.conf b/ui/default.conf new file mode 100755 index 0000000..f65a00c --- /dev/null +++ b/ui/default.conf @@ -0,0 +1,3 @@ +PREFIX=/usr +EDJDIR=share/edje +LOCALEDIR=/share/locale diff --git a/ui/images/PUT_IMAGES_HERE b/ui/images/PUT_IMAGES_HERE new file mode 100755 index 0000000..e69de29 diff --git a/ui/images/hd/ani/vc_income_01.png b/ui/images/hd/ani/vc_income_01.png new file mode 100755 index 0000000000000000000000000000000000000000..53a0cd5b7984a3ac8145232932404a0053c400ad GIT binary patch literal 31089 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_income_03.png b/ui/images/hd/ani/vc_income_03.png new file mode 100755 index 0000000000000000000000000000000000000000..9d743aef3c2c4decb63b7874d78a9f52a7bdec97 GIT binary patch literal 42134 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_income_05.png b/ui/images/hd/ani/vc_income_05.png new file mode 100755 index 0000000000000000000000000000000000000000..7ac6c69a1b12d98bbae8e721d8c0eb9e2ab6fbf9 GIT binary patch literal 61037 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_income_07.png b/ui/images/hd/ani/vc_income_07.png new file mode 100755 index 0000000000000000000000000000000000000000..9d743aef3c2c4decb63b7874d78a9f52a7bdec97 GIT binary patch literal 42134 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_outgoing_01.png b/ui/images/hd/ani/vc_outgoing_01.png new file mode 100755 index 0000000000000000000000000000000000000000..53a0cd5b7984a3ac8145232932404a0053c400ad GIT binary patch literal 31089 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_outgoing_03.png b/ui/images/hd/ani/vc_outgoing_03.png new file mode 100755 index 0000000000000000000000000000000000000000..6b8c44704c37df5d87850709ab9237f2f5494b13 GIT binary patch literal 43499 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 Kvs&FQ`hNk-aX`=j literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_outgoing_05.png b/ui/images/hd/ani/vc_outgoing_05.png new file mode 100755 index 0000000000000000000000000000000000000000..6d52001be4761223baf10976f2a8731a5f6af55c GIT binary patch literal 60566 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%0DQ1j=4M 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�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 Y_FEWjso8IlN(Qc5+IO_dG#-Tf2mL3_{r~^~ literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_outgoing_06.png b/ui/images/hd/ani/vc_outgoing_06.png new file mode 100755 index 0000000000000000000000000000000000000000..05e3e5cb41250737ae5a4138fb998d3c6142a18f GIT binary patch literal 51429 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 Kvs&FQ`hNk-aX`=j literal 0 HcmV?d00001 diff --git a/ui/images/hd/ani/vc_outgoing_07.png b/ui/images/hd/ani/vc_outgoing_07.png new file mode 100755 index 0000000000000000000000000000000000000000..6b8c44704c37df5d87850709ab9237f2f5494b13 GIT binary patch literal 43499 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_caller_ID_split.png b/ui/images/hd/icon/vc_caller_ID_split.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6df5877db21a0b52960f7cfcb9508c9409b156 GIT binary patch literal 16603 zcma)jc{tQ<)c;hTq{SA|Lxn66Cdo3{vXyOk%#fW@$kbS7vM+5aOJ(0?20hkhY(++6 zjLH(i$R5MUGGv{Qgz$ci@%*meAMbU&e{{L>z3+3M`r?o zmbZ_XvA({T56au!^Nt$`6gZFp_ppLb9n)H&|I{;$yq{$14HG;d2GfhVFAy&+C(gxd z5-I*~zo6wuK0`wek*1fC`(C`b|4h(Q{&4icubkuJ*)JaDL`HvJ9|_61-CMmf(Y9I9 zr#)G;lu_Q!`QgCf6eDFzmHUVBdMEk5J!-7~G%~Ju>A^us9}w?>@|)u5jnjKTzr!^( z&q{pYtO4x_>^gJ+^Z|GbJ9P((UN;PRr4 z=EB($-bpz?Qt4%yBuR+j1BU|&zMM8TiYL!djfKt%s9xWD9dk*sHYol0`3DzxzAd$a zKriD3f!i)^1X8(6s8rP#L~a*_>G%7$BwSs`HW}@OK9@kCk-Om?oATiDzwc}8zmMF^ zmYV0d<$UO+-%5;o8PBB((95X-nJ3{@EsM)1%hqgU!aB z)o{%}E6d+%MkODdcY1Jz5w3$1u~+_79@_eIqD!LQ*p*}}CopEo z@B6|4^K9vSoBvd#x+-^P{l* zhy9`-{~G*w=+8CP2tCRAT0LI9gE#MsqOQpnJ=8n%r0w+yxohC=OD8UTu)Oso(T7{H z*7_Z{mJiR`^#hq7&s0C);?Qk6aP+$PK;$0RXxq~-4hW?`{w@B|h=V^yQmi>rz*53A zUd2cW7HuVFZFFK$3$+*W)bVmvyhan~{KG#_s;?*|Jt(u(>ONedPkN>Hcf{rFLtk#* zRl>v`dx`ymdi%H5Gu3}5zZBl$8Hm-^Z#?(myD+D6{hf1)pX&79sLOLD-e`FvQFOTQ z)8DVJ7VRTPE#GK=6Trd$!0-c?Do22x*!7dTMz&_Q=3k9oiHS;H;2YplJ)Ln8I-)g<|&^v}zX;`SQ9$+ha_@4VdU1v@<@ zkH=mx`ulWZ^T5s9Wt@;Cd9kxikH<5{>&BJGMaIP!9S&x=Uh>WT4Ie!N`;0I-&fsNS zVC;8GJFjbP#k2JL z-73DJ6$dfja^m8p=zHu3={v>wj#_{q%dGXsv z3ZM8rP^p)G)7BsAFGo(>I6;olBH;gp=qsBj+myqWlH7GT$I^U%jxtv~VyS;+ zOv3x&Lj?y5jzP69E|(}0Zs&>oOEw62?^Q6LmRaL`Khw;+fF4AdToVlgZ&+<0*9w-e z9JbwGepqrp?J!kXvq8nzTk{0Ck+xu|?^Jh5Kks_-_0*Awcv6REPS54%mwBFfesUa> z97BFWe#(*FFD))@3Y~_|V_;BHzHGjRnTAC*xI>Qw9OfPqhj(j_y#!Mrnv8QWnKVbQT%TQ|3Yw>m%t_oeoD?2CG!`@muE`tRUS@%JxuF4Ek7mG#f*K6^>h71WJ=Sp1Oj zu~__8(`;O^_{wA&HJ<9p{rI2o@4a6*uTNZ$sS7_W^Z4mwn58yVf4t3|r$nrlJrmo(zQ9^v2uO2}hnn?7R_Ly+@Zz*znT(;TZ6;la5natUIyF9MwFFS>UM7{j)R`zH5 zaCXr{Jl=vd`i{j^%MQl0M{ zs<__w+pA+t z+}F8pgYz^uv5(Z3}%4B5!EBs&vBndPx}}IjZdv`4X>O$ za&f@_SxC_cXV)qJ6CNkP2tCXq<}wzJS$A-CsIq9)?&zJS2miT3JH>;$plKImvSiil zIWYCGE74=I{aHqGMp(Gw>fkk6HZf%K26Y(0u=HNZVhk%z$9fMa^ z_CJ2qz8Sw9%cK8SYIAW6nnSlp5rFRB_Q49*xLn!-32@d~2iR}6W~+wu_veA49|@5)0? zR}pHrHix&`ad30lNqGr=*8?BBQI~f%TP@HVg~u9JqtM#N{;~*X{gQ-^;(Q$7JWW7| zWd0EYxH+&Glq;H2cm22bR^!$I@h7%F#yPji$B~6RFeuI7#nTFc+pOqn+nBoPn*PN) z+FovZ=ff{B*8e#E&D;K;*a7y+TlgRH2mVj%Si5$~M5G*Kk$Gzscr4=or}w|CW8Fyi z7M}H4??2u&53!`jqL*bnjSz`>n6>|**jp<=ppKoyIsb~^jNwgvm8GsrygQ3@35f9U z1RBvEyy_`-V4G50yF`z_HBwcgY^Z2|P89k@7S9d^l4+D-N3Wk{3LaUEe37-a*7APq zilyj}CEXob0jD7qLNcX>)sgBR7&HPKlV~G;Ib3^3SmTPB{ukAt5poKBcuW^<#m@{a4>`f4T~k zk_N>h&Wa~Jx*qqXx5vHWTo>xx-!DETYMuX^Bj}|{+#*s?q$`2?x=`3G|XBVJA2~r{v1^6F!#ejv?tcy+7mC< zw2?~mM0wHj=_RSB@U%u`Y@pUEQkude0i%_BFI#n-AH&eq@>s*mc7rwfoN6-|EGt)_uRK|8=|#7({K0<42}*sT+09g964Pkm z&1iLf_TYxMO8)ekPWvV6$w`@(n5CSo@P3-kIP-+=SHLecrKVI7dSm*hT09ECTefWl zL$vo9bDhsykvzrTGUv6^eS(VsN40X8x#D{TGUIju02Q{SB@h9~{r?xh zS)&5g`2JBdhCL#Yth3~XxY66)vs&muLav5f;q?a`z@njBxxHe3!LmOxpSqS*A2Ymc zP@PU{k<7DDEO8H7CPn=+{_IBoH$T-ldh2C1HeqnQaC3Bh7A6wEiLTPg4rEr}>1#oq zyGuv&vz>wy22pO`s#2kJ%>CaMr~&MBig&!BHa0S1b+x%UMrV4?UhjZX^iPtp+URIorcoB$kqLaP zgeL@`6TNlmMh;bf3~@jd5Rw5?R&YmHPPNG+o>&r_wMBFSuNxRVL{kSV2FD5Bt~KD) z2yNyUizbbllDl1>)<&a)nHgxj=l&cnir~)96D_lUZu~gF$E2 zR$Q{5)jehyq2d1W{OSrj&eB4V4-&E(s*;6)a7l<8eNPlnPV_QQO$|@# zTft%n&p9mgl?leojGi{wGx&6H ze5^dV4YAs|wRVpu>(9^c%{;hMJ2$&xdI0rn+7ON;A32@ssaM%nf46Vwodv16xGWjh zIs3DxVd^$l?W!*Cc9aT@Q1@tTzju53bGlzflGwjlj2^XrYByS;Uh&0&Us~uo_g<2iYc4AB;dM=C*YGtFfZA@O4@o$+xcEf#c8!=>3Uc7OrL4i zOVD(LglxD5`AUn|XAAIoTuwlRL_HQ#>LDVb==VeP7XJ!$uW3qM4zKZZmaEd#>@P`a zi7CI`MLC#|WWmp+bQ#>aaX3SnOZ=Fn-q(^;mYZq7>u)P)@%2qgTGom8-@|*pLV>%H z_D#7zj9QWCJaV5|--Lc{-L z4-~0CWl3(nyqh-H95alf@~_F~(ZKDQN$nEubn-ms(DK#p){s6c+D9LGanyO%EeG}O zs9>tgdmpNxp}4r?u=@6L=?$}UaA5U*!s_qUQqI^c?#6YT8Ov-}Oi(71r7pQd-+caB zvdCn!fp&o{wcl<9{laPByjFNmuYM3FgdSSq;WmjcH-mf$J&B|%@P*p+|MriQ_?bhud)~oZA`#S zESKNQPcnkl^xtV{MbQp7hBRFJFlES6z(%usg=WaInYA&jX5mi5DyrPR9`!*ngvIr6 zdLXksHcQRVFkw-_<7}#k?S%qH!|?(kmO@q}F^daJ!&n0Ug7ZUwS8uBlri177oR6mL zXYtA7tTh2*w6@^j#j@g=>@x-rA;2Qrk~xQ{H@66LA3NYwW!9CMm)r|ViG^-`k0Spv z{=D+myTQt4=@9#)w-Ytir6g6EPuzI5=2!7u+H3|Xn5_6DC;NQ-&gW!7C4KKoasWn|p7n9zUb#FHY)Ajb*k2>Iqi zJd|%^FIF6p5oPhLCez~|_G|6&inC;7BznV47C70wzO}V`y`~c8-CNgOLqOH;2=^?I zQ#DNaM!rdUke;7}Q*qYogNc)Vdr2O1Hn4`%-ukI%1uc&kxTufpaLUz;*SfcHzTm1s z)sW~=Vvxu5+=TpDe%yu@vqC#Z)<)S>Tq2?t-_Uy0<~K+GMMl zHB=cpvvcDU3;ew?G1IX#{2b7|YwPW_R}XAbfoxLoMk+e0+RhYP`wdX%dlCgTyp{ z6t4ualp&NL9D^u-Vc72nlZ>!Ul5i!+N|isc8g=$6;Sv92n^ecgUg(jE8;I%ZlhB^c z4@tMn%Kb?jFp`?5O|0Qyl}9|vG3Y}qcNWTJ2cCphgq0_DdYg+sdRKs*sh~YMJqo9N z%AOrlp8ty_s&+}FlNt?5#n0s44S}^@$ODXJ(`1UmBo@A!Zs?!M+FE{(0`Cx1T%fiW z$Vi0AFv{M4q2S{Vk7}DnI??RVC2F_Z(nB7wUMIRaGG;J zSNTjvk{8-!*hS1Y(1>PT9ht7ENF@pF_%d5_7wy{^!c4BwfzG*?HY#XIZXPr_8i5hj z=2k+%S&R=pcf_3lyH85M1l)#=Jsmuz$!)U0y1V3PVYRUvHb{{-9<&ErPEkV2EvXqvyyW9Kxm-;Qj@K>a9jbmbtHBejOP`WiT1xEhoqc&lTYXQ_ zSyOC!gu3vHcRTyF^{&RGqf5?2-(ITusvBEv^SAXf{WfBS=M*|%M}bz`RZ|!x>H~N1 zxJ90Z2m$Zu`fN~|MOrNxC>(qAB#n66Cj`dzkA7HdSe6h!zvnPZvCrKuq#u5A+9PE^ zm2}y_^(I|t(E}FDBy(LWUmB~E(ecIZoM7ZCf5S4cUrVPiTnOU1cQL#l3Zj+Ru+KOp zj%8>T+;ks$3ohF?E`9U^4n0PxvlZB7A!IalAZfrhN%vv=2{APsXrg-M1ucT5seIRo zyOodVF=_6=&bp%?Tw9SXNIjNy!uqZj?D!!DXAlYqOKp==btvlD?~32C?-Dv7MzWGypoMkD|D-DdCq2_&XwRC z;Uw2|B(G(t`asC^PCoEEDho|ph8f^yGE=%>y4qr+lyqflrd##B4?A=hufO?t?vq4b zZ^aSdT2Dfzp*=x5!h*B-E38|ej{nlOo}KqFv^8@L*VdXorYgRjl9J+qti&Cne8u#y z)kv*nC)0)y9fPS*co%BHuGE7@`+z*ctFnM@HbeMtWiHVZ`y}Nc zimbI9!WkPV$cp}`M=2)MWq*Bu_*boEs_CMtv_}D#J=PnPXZJnVlUTpC2A#)kWaKzRE$P7?S5>wBdbMs z0@A6<%O2QAgov`OBh=Px$)~!Hi67QdkkPp0)d>THwrjDYxWdYr zlDtkR=(NVAZPaO7JvTh32_?iZQz;I3*}iRXU^|5)r|>=`{32T^mJ0&bt*?;$(Wjnm zTyV=CVhI#oY1&XEqGRHJ|24q#c5<8Xd1R~ra0WzV#%%-1V^aNlY87`%xd8dZNBZ|x z|2X!9Soq%$eU}FV%xhb4i%O$mwvM>6f|IMSQa*2v@Req>M4)ZnN)kRDG94d#3oojz z3ZLg@F%=u<^-Bo&Ew<9?$!WHuQD&}SuIa7G53UIp>~{4C=S4VoJ^(GTcq~_jzLC2aPk@33#*plpk%3K=lVAQ zYb`0!%I^byN3y@=taJw`2zsP^g~x`z$~!Om{QtSL(4U!WyfM5I+dRIt(i`7#vZUm0 zS_Q%%u*pr6?hqzL0H}}XV{8X}D}AE7H#zm6q&z_E^t0Q}9s@IFixgQ8xtE-~{Xr(R zYh+hpd3SnSaQ5+Hx;SO{ukO>{F@fGxE3`ak-9p4Ji*6S(Z_zO2-Kx~q@`95=u@~~E ztA|Cjw_(ohL|YY>^k{Px!07suF6;@qVg)zJw-=BK;AH6$S+DUPu=xP|&!ZoVj>gTn zP6IJ&Y@?3%(5@O%mQl`qG_TZXqjNyWpeP7}2_z)&Vs^~859Yg}C>YPHue0YFK)o=J z|B=uFaO$>c4Vqh3(2FtxBt~1)JAiBT!IV4*IU85RIoPymP2=AzE1dJYF)F}Y2y!ts zw5Bu#mNl{?n(6W9GDD)xIG9>JhDAF8K7F~)mmN%CD4N&R7=W(`F+kfv7N&V;I04IJ zlXft1@`lr#=U~RgcKVq6v-JUhRo{$di|ki6g4!K2%!F-6LCmdTm~6`)wm{~jIPitV z0aTI~loG_($&o9>w~*~#*PI#A#AYi5-&@!-T3hja7gbDq%8%V*A zI&z0ouTL9RRlZ1&7PBe;hMLz?V{>Ma(BrB|j`gZI=(!gV41pl%1_3Fexj z$-(75KrB{X<_9!VlLr$>+_+NLk%rw-XJUQ&F~+6Zo+UKEds&`@v-CPAJLd=x!@y|W zPAL-f5UyOV$Q5eP0{xWc=Ev4|vO6!$TD1@WA}A5zd(!~E9s?c^gT^i=uqks(e)?Kz zRm~#~JW&$vFPoHoUOWClV*u`bwK$c22r%{A4pUI*3U^k$FlmSA{H4od&Gei`z~U7r z!}7Wb)3=x}LmJPp^QoaG`sT>8*7Eovo~uhoj#=>mOEX*!GFd0P|$jkxhKbB$B+IUYlj3As1vypzg^GE2Smf=_V_+5>l=wH*Z06^02qH}MfQ3t5&S;_D96WPFl;N&Pk`B*S!66pj8-dqP}3s=xg=bvX8n1K zuMG_h?)2I4GbtQ=OiEG?UnSR0mSs@?RQQpdNpl`?7}tr+vnWmna!ou?nF`59*RDT6 zc+vdJoexWg?1t_HVhNA~ci@01`GnVSukk^Y6eM8Gwq(+4cSUkA*>n1HYpY`=#IRcZ z3g&)wX{AKx99|9ZaOXvt|K)ARggl@X$-L3ogMKjn41sZQnc$?KQ)e`d!go-`;JH9))md0 zdzNZg9yK%}BD)C^kVq}2nNt-7$DcdNF}mJw6rx}3I<^G(N#yOW8(lCHr)YNJmg7T3f4EocDUxJ`!4{hk&o>{F$Zru$^kGMWR+Y`oQwUFv<2M$aA_0oMC^sb+wvus^42V7JW6JNzW4c{67| zs%l=f4|qnG;(4nh(bD4V`gM?^&g_jj#H1K~r(Z<41AYYx6#Sey&9}-Lck0c>pqrW< zNo{YD4j!NVlb^~w$6t&;wYBNZxK__zV0W`R;H#D;bGw$(RJVl6CNo}&K6|%QjB2L> zF`JU+XLpcheG+$TUi$qB?aeo5ICq`Q68;)3jg)=HpJr_&dh*3@-WcHMfWTeaL56zO zxb<$2vp{L;Mo*1S%{di5!A21FTKwe%x7kGOO$+AZf4UB)L%@a*b@kxS3amnTvES_i z=1yu%H?bK3{y7>Z0a!?R2R+=9oAejUoz}#qp~a8sK4e*EI>`UMT0t)0uIXb1 zyD*5kUgQuwfJu=%`eB|F$Y(9cMTdCpVWneWnKx%<=1i=IdN^KR+VAVqU}cSDc347$ zec3pLrLQw)&O|TLuwMan`q8_r?EV-5x7G1R7pr78cQGcBN|Qx|QK^XU6d7PeLOJ1u z4CkYf$ldRzCO!TN{07x%s#RN)*!*NQnCZ6l-8b?tHe`~T0^qjGqqVItL@}~T%|A|e zP%Wy%6i*<0t_HIrfQxQ)w&=4@^pLJX1(BP)D@b~((SeU4Ox#%O>FxY?^vD5h-{*I6VjrOvWq$cIhGO}1rZ zc&p`}$O~x#2HpwW2JDJKo8+hCM%NR0DMHMQh=h!Zu>pJKkZ&f$Wh_mdIY2x~3>pKA6ER$y| ze(^V*ucm~1b0Kx))-1)Q2d7L)_V(rs6J?%y<-P+{$1&|( zpD}zW@4oMM51$J7BDsFK|@Xr+%KP{$jo)nuoo;|T+s9f`Kw>V-S0 zPSh(zmlbt2TmEs_Sr?}Z8sMB}dPi5*?&nzbF5Z^;;v8`faIT1pHA=OMQg@n-z^_Xi z0?lu~m55<8vc2@wr#@c5rN`%-+MHYCqu-Cew$$726~4>IIryX1mM-b8FvPtpqWpo*Q8C; zn8+1=*EcKQm1K^xghNT*sLMf+{oRqv@RA+O+n;zq7o=OosA5Z25XA>AccQ6q42~`3N zp9&l!sj31nr}Oa|{WwZ~IfRphl;lv}PIvkp@5x}{K>Om}Dd?}= z?p}Ad-!os7kAU6}dLe?EZZ_VfRsg8vR$2RTRzK~bV{@SQJ+l1-uC)kk8ss_|bwh%?gtMQSBSn>ke^A0>Hv8*9mn?mK5W3l5qn|eeI>HeP>C{ z(10(Ew)NSXYYVAW1Y%G_6bs*b_y-?p1Q9Lt54rSE2$jg=4?|Tx(mn=^;N8}yfGpm3m|Soz<7uM(UM#ES^qBq#)&Jn zo~#7s;h^(C)n{4bxFL>nKrltC9qg(-uOH)^Qj zU5Orm&$|6_{Q zCRc&9OzGUg1WXylDJFK@zW{XFen&l(N%QZ^P$W}BW7samd3zLsmY*UwINF*|@C@A%Q1 z>Oaa_0Ial{2II1Xl0_`T5aa$jhaC-`spL5ckL+!fH!3;3@uF#0JlAj z$wJ6oD?7;@F)8d!y%)@oT#cFB`s0ExHXN5To^p@_`dWbf zb-wcNH?i~XO?-3(cV@?(t~Z3df2XbyvY}Z~F)`Z;OodrWz6-BSj?b-ju~K2u?L}&5 zfBM0Z5Vi}g%)`&bB&PPb&$YJVn!M1_X!p<6r96@8E9SXJTOdfanU28NxgEGL&N({U zQCVaIuPkiv(VWvF?E+ zUP?fTEJ%2%i9;oUHowdJ!J-M=MHbUMHdkZ%7e|ZmM0&_1E*+vg9J_MRY4V{YBM0b% zTZN`x4)UO0@a~)8y$OJ^>>z6kG~ZfQAH$!&nMEZI%E-E@T~sbmmCZ<^8BbBvdRp$} zor&(gP}qNAayFekvmhRccfwU`hOHJApJk1Qyvy8M|J8fHxG|}sUU>NPRlR3Or;PV& zH!9N5+&g`it>QDl0ErrOu3?2_oSOR%XjJpf6of#4$&S{mIOQH(MX@SERn!6p`7fJm z>HoPJvjwhfb2yR|3TZLj9`kE^mNY(JE(m9aS*Fm}ySu@gt2#1IV?TvF-A&F6wg)z{ zTyPXBo^t19b$V`^QRNM-wBzYblTB9@Js$c+SyQJ*$CrQp&cmbFvlhdnxZ-0=tEgp^!Gl1+2z7OJ0rNjLE%O~<_IyU= zSy~$+co9LiPa}zq;+P3ZY8tX+J7<1iwyd@$c}Ov22ClGN(@wfD*@k%ItRUHRO&#bU zvu6|>%IsTHg$n#Co*P1hpOcfugA=mzf!z=6oQETB)nE#Vv=4xnkRPb3QV*-Je|CAy zSe_H-!?H0Km+F9}C4iy#rKyJkiaC9gbAPTgz#c*IUZEnL1@@hjj#MkZzMHbuOEbXO z&#HHM`3;Ob%h}cB=O!H!Dwu2p&me9OEJJH6BpIl)(X#~pT#@0lyNSK6Yq;B~#p*LO z1^PN}U^@#<=J2KNP5?lZdfHHy$g5=JA}lG-asHAgR$Fb#BS@<38S|3sh+&BZ7deyI zN_B3hTKwWZr4{_=hP)}eY;QjUsfdZ0nu-}NkO89+B^L7s`CaALh9PSw>lyN3fP$`M zwThIy(Ys8dIsn0G>4f_NZ;mlrJ>d0UbAF(Tq^^^haZ;`4ljHCu(%=J$5kyL=^3itr z()Dvvv-U(3DbcX%i2SlY+`AV7WW!wXY%~b&R*^>evvF$Kogr199cj4WzAvvDH^?Yj zkWl)SA%KczhM1&zB1GU6`py2fBTI&s!C(^7d1JwX>pcD5-Jd@j%QV03cCU@06pRZn zYvc#a=g>>6d(xdJq&Jj*-KLF`?=%$6qw_kMe2*K-`nf$ zfd=eqSi-F%>8SIxoYN{%hTjT;W+(~FMH zG&rIYgj+s-dA82V^~Rz7MK;)mqJfftt#Abt0;s#6%aBi;L7tyc^93mEQM03eZI;;A z6P}Q^#2-@&acIkrS?WTm0|oF&QLT}1R%#kWy&E1Ly!fZDf7O`QJ@hG2>|^?}Mq7Z! zKmHcoJu6+5uhLt*Sb1;e%_)nR`H5=dXNGYvF?}(ss|zuG?cq*s1tcWN7YM#U?{Z&Q zO<#A@#G!rG_#z&_@S_ZSYpji`%J`!u%s$wm-qX-oc<4H|_+EF-kaPJx2{ z_e>1x!wCam0Dhd4w3Us(7n3P3y)EWpP+0~rWh^7xM>{xvsEIZTh7*68m<-=DzfpV< ztOV3yK<5we8j$UF*vc;+QZm3t=3n9~P=i``6`iov*`E#G*akGJ4yB6&3Lu7--< zvv4)Qy)+5M>F|XFc-ao$rVdM$Nh+atbTY z%vBg5tc>Q|o<>$UwYQI5Qx}~(@l0lY&~3Y$6*?ngky0K5R0}RT>ys$eHd(*0#QF4J z%ll0#HEOaL4daUARK}vgZ@7JH#*zOY7l&Pa*`d5LW zWIVp=xlDuCn6c_Ie~H>Z3HYYvW~bQ~S86D483^x~G=vv+4q506qd~J7Cu$k4r zH)eav+faOZ-vmM1t;8%RVAj($xCUc^1xD-rsT<9ojxI^qh*+!zL2H4#JD58Rx($@k zIy>7l&=ZEOZ}F;2Q^14@wme%j?#b!xPUMR`d?C<4Q7e2rAsSOA|J1z?mN0{^^3O;L zP|Z9?I<)$tGbP;Av@=vCz#OgSP=uTY`m3YYE_e};@&}!zSWRT(1h@mTw<}TcV!Em| zqtzgHn8&M%Cam}-Fl5a5z#UE9nwGb20l}qf@aw5W^}YT*wddO!+{ z>`YZ_c|0M>uXmt2fhAT8sXTvets!|KDEu$3p^)z-?Ne2l!5&rM?;sRK&Hyj^lGnpQ zFiEo=x)MH_eI_*P{dQwkzzrz8R7ph>UCXGe0*@9pfnvDv_MvSp(^K*Zz#LlNy+7#S zKPU?BHg#xyX*jK`0z23jD1Z!Ok*l98IOX>S^e*f7s?) z127E=jK<;dK^5D03=g0%>k4OikFGWZ-6|QewRhkznO~pA75TVQv7-SznfhDDHJ@HN zX*H0&p}^Z;;pCY09%vEO+$P^LCn15o4mLm+be6MJ2N2o#o@Q6oA^AxtMG!2ZtM|^# zm_F!Tn;*!r+Va+LiMEmrJj7`?8&m7PmVT7>kv9OSjr#FDD&oUge&A}P_Jjd{m8_cZ zUo*fMJTUrbKJ|P+q)nxhLd*Uw zw*|II*uao#%kC98XkScBFu57xH=BDtC<{4pthgGk7E8u>Bm@QoX)Vx!-K%$ohb7$U_ z$)42Jw)CexELn5hxcu)7y3Rkb9)lpO>p;SP(Gc1y*3ON9@iwU`K%H!`JqT?FXPh8|Qt+)t7YRR^Lt1Ag$Aae~AhJr3kVjXU@l40x^3^{hBg>!e?s_ ZNXC-tH$~3a{_8Q2v7xy^iQct`{{!_z1fu`| literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_caller_ID_split_group.png b/ui/images/hd/icon/vc_caller_ID_split_group.png new file mode 100644 index 0000000000000000000000000000000000000000..2abf777468a754110db55b355b502e099358f48d GIT binary patch literal 19547 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_caller_info_icon.png b/ui/images/hd/icon/vc_caller_info_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df2e9a89286011cc37e09285951cb46ac12cb8b2 GIT binary patch literal 6004 zcmV-)7mMhLP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000c1NklN!5-7PCUz!q+l)Paq-k+e8#~4i5*ypR1qhG?dZNc_ zwU2wwuYc?cgpoi9Yo$`o%x^R!opbN*_kMrh-{YJsB_doM=MU>D1XqE%3d|=loZ&1A z1OmfZHW6qY%`e;A+Y7)@bk#}0=UD+PEW9>-;_;7qehK_+bJ&g>+>`^ePK_{QhB$J8 z+vl##Te0r(8|OL!?S1Ya_7wc=uTGp+I4^<*#%@F$DUJDD_GIs-^-o`a|DXP3MolDe z+}p_!ZobP?0@NrRKp{zJQe`8qF&7wF!18Nra+cr!RQX(QFcj#NBSh&$q3}&i4_s5@ zo3`E`D%u=&jtS<<65l~aHL&RJAD4e-!B;1g^-43H(oCEX1{Vtt7Mk)U{^0)qiCl;D z0V7weD|vvG*Vg1b@aUd-U!C`rKv|a@rJH)9bfSqP7zBgC<%VTxMM|l;3LAyGvKZ4Z z+}#W;`tpX--&?e1@+=)_^L9uJF}l&j&S8T=qj4Euq_XqNo#}rb2u*sp$J;zs-RW{% zY5KUyp8LP`LdD$tYwciI8i+_6F1;9Za>`jo2%vE>XsYhaD5(Fi{bsOVmNRp&99LSh z>hXe#iRC@PE_0k7IYnH0Fyey90AWE8F=&Z1dznAsPGW}zA zMnH?kV7T>0Xo*o&>(_kw-^w{%d8t}8mKhU{ zbQ6~|8ScP$R@hkB^wma6seY6*j4O(#i%5aN?7AXK0uiY_@|rZ?_+?c#_$-BmgB!79 z$KI62u0|8?cLmyxx#3@Lj=Zk5-YMcAQpWNBKc`}PKC(ptX^bdI(Ctzk1pYu(Va#}12F7ZF;+;T>*=>$+Qj&b}Nd`Lh@3{(k4U z*jU^5yBv*)iO9)QdrV7inH`ifHFSSv_ux|*@yaZZ22iT)B*qWbvrAKHjuPw}e_Ge75b- zpD~H_UyDoSAB`^-kp&8S)L4_sW_VOY8cu#-n)`~$bDt6zV{lEJ(uL{8nUkEkf1BG9 zNM#RZR5Zrp@fZ>L@X&v{jTh?Lxe~=SF{;-Fi-E-n)~G9*F^I_S{r?efNjw$nJgqST z+8A7kGy4nKB|x<$K1PEzDFwzD(-LadM^C)#HeeKDIM1}v#B~&Z4uOi#XO}!w&`_bo zX0Z7qWhoQiWEvk6k&kL$aZe_4l!5XT(Bk5nIP+EqOGIRmCBBsBG%00_<2YiBd29Ex zk%nkkV*OpH&$I}x(ZnRilpFm8d9(ag-gQk_wpH!HC4`$fmE zv+$%WLZuv-q&vM=_eS(c^FG}&IBN_s6CrM*{K1Bq6~JPj%0l58FmwJtoB4iBghL|o z_IuBS4_%BkQ4?m$P5y#K>xz~>RCwSkUNTTPBhH-Ba3yTp*2b7u-+v~2sN=ZqfPp*z zMl?~=OGJnG>^G-Xmd?*v_IJg#D?J28yi^z!V3MOlM0V}?Vd(t?b?pHYKG(Q}br)gX z!Kx=K7L?4-`O=1IM;3ZiIu|Q4`#04SW{qj_?PE>c81wS}m%_EJ``i{K3MJNgd!-_V zxQWoCPvd&KyWwq%svP|1twAhod~BL| zq9!xwd*Yh;lOEkLqxS0$&uo}B6sC@>1DmgaI!FP`4fQ>^Mz@l$FUsL_y&zCIzv!@r{pB40d?}syw)_7Ea zi|v7rN>ut-gz7fN{OfB!=-Acx+jxT#JJDVqu)x$rOqg!Bot#n?y!)xDJ4Iwk0-Urn zI-xs2}+gwjfY^&$c=1fF%!?)+LyOjg1#ze%a@;i$ZQY z?eTir;wSLsMY7jFS6!VIOk2INbe{}cr_crg)5hs@Tz=MbJ9ybZj{Pg0r+vcwW zR&6Nxpc+`T^gExba7~=Ji6z0*^y(fu;!X5=+Ptf_RxK!<7yQ!3(tRua)_5$u=iKK~ zh8oTepl#ci(yy_ANlK}&7tIOWxa_gq1(r{Hjp*e0U-{UkuEJIx0(Lf8&Lm=u{*Jev zt*g!bRQk9XpY@e=x~GWfP`{I*U}5960%ST9@Wpaszut2AgY7>)ucAwyv4P1-snvyZ0<)KGxi~nMa!9i>2-w+pRT^=L5!M~_nl6mE=dH1@ z@mPK`>>M(kiTu~*!@FMDa$py=3rpEp%1-Q;<6;Jw+y4lG$MTVG=P=Hh#P9yCY46X!z3WL}`}(~zjy^K0 zcI*LjJ~)BdcWla?o0daBi#s4V!x;(-$MTYHk0;9sa`g33-4m|9s-D@Y_HA{bSoh_0r+s!NwVSYJUL}F}ONPPrRMZ*eQzVrx)M-F9{J> zN>z`j_zssbYj@`Z@YwYYHjtx~`T}s%^2Z8pE}ZW#Hj+3}FJdm6J!eIH92w38LJhiO z%OCE1Ez}yj$C&=-bjAQ<`kv~&y9+eXDk9H_$V<=P+py!UN85Kv#EIE>5+|@OlRc7b zrFO+zI2AcW@5B??6@QXh4AhMDF_2+s%-LLG?fX*%=z9Ey`d^92;dlP2{mzpgMmiS% zO>SjofiD{_k39+tr7Uc06c+Jb6Wjk%cLT70%(>El>)Cf-pP;_Ew!bAC1!7Pj)BqY^v#tM1yJkF_2Ox4G|$$m1ds9uZ*rA27Tm zV0KIy^lw`i)Z4%~;09pn)XMat+rFJ!nVIKg8*$O1FBrKJfF#1ZtsHcO*um}HwL7=A z916F&O~8Kx?*i>27vFwMEil`sTy)OXCG}~*6ks_pYyR3vrPnRbo@IOSYKbS`a5?K< z9|uG!i{tO~)NS8*a(B4hZ31=x9{^22BoVDgD32L7FfSGiY2MbQ4SnpH1$;g*-pOC` zU|vOGWuUn4xP9M4SISBPVsm^~Pu*{xY~I^?G};R61b)*8$eI@mWb4v~kxlT14a_g{ zFKPbP6^%Y%60iW6Gqoa+|LN6}Dkc{Df^x=%;P~&tb#FY?ytlP3+6MeK2}nH36*`3e2;4m%L`{7f&i602BhZ17%aM4@@kcoe>1s_iATD>#;L{ya_Y_J!_uLGXq>} zYyxw+T~iY8br%A&foaLCWp7eL8h{?Sc=)=~fawpAA4pFE6H1EekPmu{7%=}I#?}8H ia}}7YzF_oOI+jt0000Yfuws6wO$0T8)ws1w^XrDi$S=-9Um_6E(0&2_+PPV(K7eNj46*M72xZnblPYjjHGZtB7_8bND2eeU?Cg~$%18kKn%f<2o{T=5CIG!k`M%ffr$rX zqfrJU5`(HIVzDa)Xkr*EA`)d}WC$~Ygd~+Bf@Lz92oj6LVgZW~(3utnvk5Hp5|;vs z(|XEmWz3`na4KTSWICe&*-T%TKv*YbE%d}Ou?HryVO9|=gq$V0fLiVULkVIMO*1k0 zn|%LMn2yV|;-VOwCetZB+c@JAXDBNYM&TGkQgI}i>N>?}6UmUYiL?S?u@WH+tT$T> zWClHs*J=@sg=R2|9@n4>kW~P zoQ?fgqg`99dz{lr+p>#EH-la@Uj=3BTyCh~MCGr02wLEc#$U^iwVf zRu|XZowvBwdr!&e;YHlPY$xlR#!6lqA1?o%=cb%^clJ~joA`X6_s)nUo`&yqrf)v& z9PIC-xL(-D2WPrXdpVi|obKBf)Cd5aETz{IH&u99Oyo+xrkW(EwyCmn5XuX^V9Zj! z%HEzg@MlOhuW)xwXSbjF&eEX~8I6b+M_gk(YLof?d?~(Hc6(( zju6)eo_PSb>Yn%b@%t8a$Zy@R*Iy2JdiQ9!=Y=ILmYTqey>kiVtL)ss`gY}TL;1z) z`DHPhpbs~kia-Bk%T`XqeYJN^FW2n9E8w#XX^CLkjX++@o#G)=@Ht1k!}dp-s(cmX zH``-D!R0(gcii3*dCfn_hx;W8{+2FZsK1)!@b;*?6~U7WcQ*7FcRga6z~9iK+Qi?A%_LmF<@_J zs>~tSoq8hTSaUX2kQ`icBi%me*l1pU`Ycgx>V0=CVc2)LDAN&eaK%_i^QIS(H@tm* zKM@%)RH0Z{XqThMbo}h~k9&4`x*411eSRr%AK;N}SbW+TQkq}pULLoi;c&7~R1t%0 zD}AwQj~8BbHZ$-?*-77Zms`hx`^SAB>dsZTZx9}`-?O}&>39d+n)6CgTL4zh8m-~F g9K~9z#s11GiPN~h??_b_p6k5mHL57IA~Y%IA8B}Nt^fc4 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_conf_call_end.png b/ui/images/hd/icon/vc_icon_conf_call_end.png new file mode 100644 index 0000000000000000000000000000000000000000..f1103b7d0d418e503df48844c250d1576938f8d0 GIT binary patch literal 1408 zcmeAS@N?(olHy`uVBq!ia0vp^0YL1c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh*)icxGNo zet9uiy|1s8XI^nhVqS8pr;Du;&;-5A%oHm(V`CR1GjkIQBWDvsLsvs53v*Xj12-2- zS3@H+H%Bv=UYGpj(%jU%5}4i;gkDpedO=Acw*Y9fOKMSOS!#+~QGTuh*vnR#xZPre z(>$o&6x?nx#;I2y=oo!a#3DsBObD2IKumbD1#;jCKQ#}S+KYh6+F9fGH3kO8FP<)r zAr-gY+lVV2ASq z%l-b+;(zggKQvVApU(QG$mp-W>D2xQ zD&~1RZg@UhcubbZfN4jV$7)0NnTLw}>_e~jihh~1V)?y=8>Q04=Y2NW`qV1?;y<=m zvG=~lczU;f%DuU5mf1F|nTM_&uYDBvyX(Dqz^(0l!LPiHHt(w3_o~|G`JJpYit}93 zWLK9eMoNX%Cx(SG+n-u0tNrZerr@>D)``wN%5$T%|NE+H=hZhN?mxM~7#zD&cU69F zWN0(vD=tgPMMB3uS*`XK4f!==>xC^54slC%PLBEcJmIcX?ETkkrgdfQGvwS9^y=Qm z3v0wh_p8@lF!R`|e(b+?c>W^owJps&InswivKxNoUfUg)T+;AguVN`bmT<-l{s$3{ d!y6bG_?LV7{Q35EHn2!!@O1TaS?83{1OW4S_>lkr literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_hold_call.png b/ui/images/hd/icon/vc_icon_hold_call.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd2666a784567e05a525f5aeedcfcd40f56fe68 GIT binary patch literal 2860 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_icon_unhold_call.png b/ui/images/hd/icon/vc_icon_unhold_call.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4d9b0f94ca7616a4fdd956f2f20e24cd52dad3 GIT binary patch literal 3319 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 BGIam| literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_more_join.png b/ui/images/hd/icon/vc_more_join.png new file mode 100755 index 0000000000000000000000000000000000000000..f0008d3f46bd1c979932a99fdc0113c3cf84fa12 GIT binary patch literal 3415 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 z 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_notify_sub_missed_call.png b/ui/images/hd/icon/vc_notify_sub_missed_call.png new file mode 100755 index 0000000000000000000000000000000000000000..bacd6af2cda295bce4b83b7d0f699d1afc95ca37 GIT binary patch literal 4642 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 Y049SuPu~n*%K!iX07*qoM6N<$f^u`U$N&HU literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_qp_caller_ID.png b/ui/images/hd/icon/vc_qp_caller_ID.png new file mode 100755 index 0000000000000000000000000000000000000000..93c0f9b830b10dcdb9f4979f26e02de7ddeaae98 GIT binary patch literal 5874 zcmV004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 IM6N<$f+&e6YybcN literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_qp_caller_ID_group.png b/ui/images/hd/icon/vc_qp_caller_ID_group.png new file mode 100755 index 0000000000000000000000000000000000000000..57f27ed9bdab70178330519d408a5e4695db2598 GIT binary patch literal 7290 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 U0pVh0%K!iX07*qoM6N<$f};W3Bme*a literal 0 HcmV?d00001 diff --git a/ui/images/hd/icon/vc_qp_mute_on.png b/ui/images/hd/icon/vc_qp_mute_on.png new file mode 100755 index 0000000000000000000000000000000000000000..05622ffa185b1a027c74e374c46c475f44f4a899 GIT binary patch literal 3710 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 JPDHLkV1lgBGl2jA literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_alerts_arrow_01.png b/ui/images/hd/vc_alerts_arrow_01.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3d23d3b6ed41ad3c05df6dc880071644d7aceb GIT binary patch literal 3435 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_call_ID_thumbnail_bg.png b/ui/images/hd/vc_call_ID_thumbnail_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..92b64a442d38f8fed5322b99c3c8edf000ec014c GIT binary patch literal 4421 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_call_button_bg.png b/ui/images/hd/vc_call_button_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..ff3c825269cabe8a9caadf3aedb868e12e35fc87 GIT binary patch literal 25547 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 VI@|L=>)-#SnW^>l%D?VB{vUZ2dO83A literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_caller_info_bg.png b/ui/images/hd/vc_caller_info_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..c8cdd2d7e157b21d04d173eccc820dbe01c9beae GIT binary patch literal 3823 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_calling_cid_BG.png b/ui/images/hd/vc_calling_cid_BG.png new file mode 100644 index 0000000000000000000000000000000000000000..c487a43d359f27fad4701ba09287c350af7f159d GIT binary patch literal 4163 zcmeHKO>Em_82<7@S=$vACIn1K7+0bkh<~!AjZLyPjhi)sbX6LunZ%*4{k5?=|6sd~ zQ*9zenov(%xbY({+z{FUiA_wSV`$PeBsd|c5OfEGg!r4d4vqJ7<1Eb*ZXA#jDT@92 zeV_N|d%n+4b{6JOjSL+hLI{l%=A;rr;jhW}$N*R_FP(Y^ex7n?EAFDX>egf%qpWJK zV5*?YYq*4Ewf^c&oJJ@@YvqbtDZVT!rq0O3hw*d^q7h0@d6ulKW0zXNYnqXv|M>JX zn$pw^y_76+MJtD^+T50n7q{li%GSCfsPxoHD(#5?pkr62JpHWUh+c;FaYeW$W|pRW z7k52F9~4z7E>Jns##EBwVhT6GQxge>PjEs)c!7#@Jje2JmYa<6oS2*xIi6~MXvk)( zt71vYH*>*VhOWA7}H*3c|j0ZF3!f|G4O~vb;FgtnBj~C2oiP_TeDov zG$?{7ub3NdhK5QHTF|W)tl>1r1OsC|*UzuDaZC7qyJ(o61KHXtmbV~r~H;ht#>VxJ@J~cYVTT7J!4rYh9wKzw$OnI*h4N`w1t}%@v#AH zw}IB*of+Fh=;$W}DO>jTe*OO1;PvUzX!hpw_ul&H&B(U{&%7Z$p4zS_Z=L!1{ErVK z#QnvG5IRytXcYD(^?nFVPe)Lr0oyaAhr3xvVEgVxJAH}uI6~2n2T>bBU`>z|$50dZ zkd>r(4mNS<0V_#SgeN|(kI-Ju+wdg%fR&U!(Ql}~LI>37Q?9><4$iawq0m3Jo9~PM zq0m1R{;NY_`S-hjgUks%(G*k{Z)|vBP*aP2=Jrr^AU6QXiiOHXaMlyXHn(W|fR}y#Ty0+8^p>b{~{>wM-0hJIc%+5<6 I%`CtE5A{C(fdBvi literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_calling_no_cid_bg.png b/ui/images/hd/vc_calling_no_cid_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..17df09a77627258c2de42dd5e7344e55fa26d5b8 GIT binary patch literal 9104 zcmeI1=TlV6*2Wt_auSIm91sLVa&*YdkfXrh3_&Fih)7hDAV>}eL?kl^DmjRtgG0_B zVGxiw1jzydSAv6*u6o|8x9a%8`v=U2uCD6+tkr9;+Rv}MYR6nP(x#(6M-2d=)78;1 z1>n^CpM#S8#|jpqo&95?^3bvH27u=5&p`q*v)KWlHgzED+dq^YQtC@C?ALwT)2va=C(WMfgXjGOCoY{1DAhD@svM3Isxo zTL`Dic9~hu_LOa=npmrU28UFr48zBrJ^*r)Sbn_i&XFIEz5<7nOTf_I6kTf~Ke=FM zw{W~PQ0k!uz?@I;;IW8!^|=s5@({P)02b?z-6geXZvoWte@d{4GikF;|yf)FR&$DRP((BKz? z_f)HPQ39Zm8!B9>&biydF49bXzUA~(3(cX8TsV}!y%ov`rFIB8?`3nT>>*SrvcHl` z*hc(=8kbD7iF0JK2fbLU`CEEr4~FlylsPRz^`TT`>fMxQZFwi7N$g^gd%u zEjnaOar`{*qM1!D=qJhQNSemNdCYaVww1k3L87d+YLgVZfz-pp$a-zbC!tj)${%Ro zz_3N~=fbs~(Y$x?k<3hF&CPo6_4=H0yjYR^oka2ut)M-26@YJW=mM7rxsOBcx!))kEs;>cpBU`KKIvcF6>DBu{5 zLonhX(G=GV+K*j(o>1gd*lA4x^EY&GBDb-$YkgM1zL>Dw@)>#~c(yMpr30ezk zqY`na(JN*XX48e#g{+3k3VRh|C9e6Ld374TO?L`6({mbcgya~w7tZ)Mtb9KoBz^=x za{FGmr%j6_ucqZE$J652l{#cS-Ich+yYOF3VAtE!VEMKwwrO+WN!UT9=ObEwYca&T zbXqU)FSvEObv_p$7vL4pH(WE^%rrH`7F;S&G*C3?>hJ4+)<2pdo24u{Cbg2ak~Nk! zTVrGCXDNay!n}3Vty;7!u-L@Z--)njhp8}#>)G6h}K1br!&C0DTbYcFPn zYYH=&xa>{UppMq$HnMB>=jE>5zFH2 zobGN|)brW%ygnB&w1>{B&T8E#!oS><+jQBCntIwN^Yl`Vg|zqkwr0UCHWbt8H<~J^365fHND1d z?m0IjW?>KbP8?1GP6k0?$VCzqX-ueksMV>1{eb(tO$n+Bc*n0*6C3LBxma};^~8te z50_fXd7ZmIKPu-Xtfb?Ta4z%_SA#!|zNfHVwvB5GrWK5cia2i;Ddezb-s5qT zQdVe?411jP$P-$^YnY5dt)Z5k?)8>AMpPYl+=;6Z=T4z`=UV-!?6id_H3nMn32rGg zCQMOa^~dx;QcH6#_iyx7_uwDNXKy_{*DxX_f}5@(cqPgBO!lh?(i?O2Bary-}+leb;g<)XW=S@m)>m3W<;rbO-;V%Yo;9>H7H6OL5gHR8=l%ne7JMjQ`x52^{O6)`2N`>6+R*UOFEJU6;X zhe(eo_~&^+Vow2H6Ek4d`0Qx=*<7l?wsfI(C}YeB~Z;0xakxo z@5Kj}%~1^hb&m_hC4LKb1`U9}DM3D|Vhh^p1`)cDragImqMxjTbX+63~5 zuz};Gy+j7s>BNl0-blL0^_(jz5Xii$*U{=>A#A{5Kp=@7tU0){rLOZiG@`PuEYpr1&&vZ}3g)__5@T`^KsI zbfB0YlE7yl-v=4C?8Ugblsn=w7Oq_R`53bDbmryQdROCCamntCnYo2)(9==NlGtAf zy&FeeTRpMXw{w4`f}C`a*FJW@%gt{8ip)OwXdgcozObIMVU_bw1%w=ph_HWRS?GV( z@^kD&NXK=cjKH$>n3W{W?b mz(n8tufEx7vYhjy2QPx#Ih+$#Ie+}}0J@q+8Wm8RhyMk&*fB%^ literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_default_caller_ID_720x720.png b/ui/images/hd/vc_default_caller_ID_720x720.png new file mode 100644 index 0000000000000000000000000000000000000000..085c0575145ec2513089ebef2fac9af1f2037715 GIT binary patch literal 34577 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 Bx4i%W literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_keypad_btn_normal.png b/ui/images/hd/vc_keypad_btn_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..55004653d8723a2e9dbaf04ded1b8b6d1d180d55 GIT binary patch literal 16343 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 literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_lock_reject_message_arrow_open.png b/ui/images/hd/vc_lock_reject_message_arrow_open.png new file mode 100755 index 0000000000000000000000000000000000000000..5a0023ea97d41cb33aab7d0886d481b03d04464e GIT binary patch literal 3536 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 KMNUMnLSTX!zLzZk literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_lock_reject_message_bg.png b/ui/images/hd/vc_lock_reject_message_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..a5668ad514fa9e6ad7c5936c1844eb79780bfeeb GIT binary patch literal 3453 zcmbtWXE>bO7T#l&(K|ti-g`azn9*x6q9#$oNJNl0Y9gZ(qD1tJkVG#LWJHi?L5R_! zw`dU@+@pj9))S^+>Z0G)3k z$e}+SLa-VNl)i@ccL1PfKKo!G=gBz$s4T9d(HAdz`uO|Y@$~WKHA16#eQ*1CT)*iK zK+q)K8jG=BWz*cB-9?$i;U1g#Sg|5_txyR#mQ-PJK1v4TIKF}jR?AjKJv~yc?)*4- zQW7qa)l!n?0o6Fg65q3=$mekndJgA9pL>lq?SJh%c|E4JQn7=t?Wbr#&}0}YSSsOY zN>MzFUn09YI_H<9k>ON=zJLKydyVhTu>cGlglT9<@V8LB1F)cBY6NI8%WaW8AA3r_ zhRSw=;i6zI{;9v2AaE=I8Ipu50!V!r4xc4#4f08WbFZ80BDg38oJH<`9R@i3L3St% zI6mfMh2^ILUS{_=UErw>D*7)y&;xd|fW^b4Llulm0a+tk4?|F04_b%})HMJ>17t1Z zqQwAdC~)o;5C{TM*?>iV+g9UGi7JK_aY(7`8jS`)RlRUWgp?nJt*tbVDA9;rf<@Vd z#3ctQ-4>k9As?CaLEY>ipmL6Fh3@k*`7i>ZI+C@0m7w1t|>^6U$3W;#e!?Ag%=e65D0ObLR#ALCdo z`At%l4CSmIV0di|xwkcMlc>fz>Ay`??*{S_M=?zXa*xAnEHyvVyhb;asBlKI-C9WmDZAU7+E7I@9f%Sr@RnHA$j%9{r#bt8$ zEO{N9=Q&n0B?TBprDO+GWdXtJrDbdhv*PbLs(q1cMka-o&(eoEJ=s0?ufP1}|CVtk zoyRv2)!B@&xMjMg{ZnLOeQk%^oKH1d1 z_hC0j1z)k;ql=*;f^GS2O)R)-Y03RO}T%snb^=t%x}!ysP5mMFB%94M4T72L+%hUJ$T zR33~QM>~o0m~R`3n}t03Beh8>Snz{Fq2zKylt^hxlPRs~Os-lUTTTG4x4foWvs~n( z)D%Bd8J}4i0lS9%>JiXe;T~Oc^5IrOy$nw}#YeB&lnOF?DJlZ0=o`jCbWEJ02J3F? z@xCvV57Poi(*Q*F;wiprC%r>7fCZA|lz2!$~wwo=@7Uz;m#sMcus1y4~evXV)} zTq3W~c=LcD?mc2rzG0hL71k^qV&)ZorL`xb^)<|Eo!W+KIr`rE^w`E_3p*M6xz{c~ zWAI#Btnm-3Sf#rpKT&z^ojP03{TiB2^}63`9L-)p>SaxeZ!>{Hjqyuj>Yeqxk2hh|>8j2+w> z+~f*v`mXrL$dqH#{;}4_cT+Yn8?zCQ5%)u*!`glAs`#?igN#G(%a!Kdej8ozA^0(c z03Bhh;qwUhkS4||c~oNEfUfJpyA%9YpcJh#tG0JhW<)0g0g% z^Ay7u0=TiiA8fpX`FMSDHDWjo zyWO9NPsiU2lm0R7JoStay5dHhyFu@>^_IbZen{^$VMV=3o#?dv#(%qJYMI&gjcv|L zwX5E1{%aa1X~Py>jZYeLsv4ZU8a6|kUx#|^uX5$75NCFqga2eZ9UaM2)tqVG3Gvzg zu)jCQHWPMRJUX)f zBy}&D9!-{)uUo`|FwSMJob}kC%skdY%*a7BkNB9?;Q)tICi&kCV^(hWu6YcZTzC5CI78SIxgOe}g>y zKN_{zPWSILJ%jQ4Nm0LL;w z1@Z7m@`d>NK6QgbQmYIdt(IrzOou0$O+mesTbSLat*Wqy}ARx^M+Zii;$Z zXLueEHsxoV;Xp zeBi9h8JX|6fCxAM#>gqC8p@p!fZqOM1*?1tRg>=eML`uFGLV)yyh+qAB0?yLHEcuV zuRuxxKosu3yT3de65)BF6lz5@fSfc#P$%74BlT8Dw|_Aqt)qo@4LuG2MLh2nv}lF_ zEi2er*oH(1_;qeMYiIZ`I&~3Ht!BPv+ke6&V<1UZIMg9lO=lNE`Fjdyzya})Rsp{R v@x5?16to%bv&}FaBh>&Il0oIB?2QobKNSGbHqOZ+?>;1 literal 0 HcmV?d00001 diff --git a/ui/images/hd/vc_no_caller_ID.png b/ui/images/hd/vc_no_caller_ID.png new file mode 100644 index 0000000000000000000000000000000000000000..57c5d57c5d2a82d3b578aa581f5bbe7d04e378d6 GIT binary patch literal 69772 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 z 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

A~u~(H6%1zk!2j#Vkntk`!rDk#KN!0gYhgSc%0w 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 P)d=WlKGwjh*@pigEHpDn literal 0 HcmV?d00001 diff --git a/ui/org.tizen.call.png b/ui/org.tizen.call.png new file mode 100755 index 0000000000000000000000000000000000000000..d4a3bfebf7aa82c9bfaa2b1f156968634232cbfa GIT binary patch literal 8071 zcmZ`-byU<}u>aDXvUGQMH@kGFEC>P;ONfLZ4GTzjHzG=Rx6-MkNOyyPkZ?31+`dlp!(swVFN0O!Sj zj09xok^=y?jspaut84G#;quJLYYPD0i+KhxLxTfS8N})(SR)di zs^Ov!!lc&+$G}OFSUDN62-PDQJ}-dudWe*iP^pFsB2nVw;jth+Zro_>d5mp_!uZfH zk~ve?B(N$?jEN*xxvQW3D1 z0xBn7Mk@hOet^VIqhA7;=K=WDjO|o`+7_UDoDioTz{Cak^&-PK08~G~a+rz98~B(7 zkSL!UOP_I76Yg<7Bb8Mz-Nr1T6#NR4#|^{Sn3tA)T#by2MAQn|DqEhn*C&fYFj$yi z{o)4z6eNM3UwiT3J&s>JJ}w&HjBmkn_#OR;@y(m9$DN4^S9t)~@CclG6C<`W|t${%w;vSkOFJ1@&gV_s6AX5%oke*2g!?y9p}yEjUm2G&79-YH!-0oFrR% z#BTA5*|8UbMT}A4WR3xr=_i}bHSRkU*)Xd|}0~7>V>I8p;%pNtP9M!_cFON*u#XKN3lz$EcAcqAH*tZAfpV zN^>sbjw}&jrre$+H4F%b+=q9n2&4wr>&g7WZGyCwicx-4F2tF%@es&PAT7w5bZ?}T zi5304H(6m%u$UkV8RGBWC&v)#f6LE1*axl?=f+C09;;)l#H|>ltbJLD(h+rKJyGX{ zN*t`zjU|fe1*W&6RZxX$Lbc~rOX;bZg^3oi#IR64>h-cQrj%+lvbGcb>nDFBC=dZv z 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 literal 0 HcmV?d00001 diff --git a/ui/org.tizen.call.xml b/ui/org.tizen.call.xml new file mode 100755 index 0000000..830f4c0 --- /dev/null +++ b/ui/org.tizen.call.xml @@ -0,0 +1,66 @@ + + + + Sung Joon Won + Jungmin Kim + Voice call Application + + org.tizen.call.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/po/CMakeLists.txt b/ui/po/CMakeLists.txt new file mode 100755 index 0000000..b2f2de8 --- /dev/null +++ b/ui/po/CMakeLists.txt @@ -0,0 +1,28 @@ +# for i18n + +SET(POFILES ar.po az.po bg.po ca.po cs.po da.po de_DE.po el_GR.po en.po en_PH.po +en_US.po es_ES.po es_MX.po et.po eu.po fi.po fr_CA.po fr_FR.po ga.po gl.po +hi.po hr.po hu.po hy.po is.po it_IT.po ja_JP.po ka.po kk.po ko_KR.po +lt.po lv.po mk.po nb.po nl_NL.po pl.po pt_BR.po pt_PT.po ro.po ru_RU.po sk.po +sl.po sr.po sv.po tr_TR.po uk.po uz.po zh_CN.po zh_HK.po zh_SG.po zh_TW.po ) + +SET(MSGFMT "/usr/bin/msgfmt") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/ui/po/ar.po b/ui/po/ar.po new file mode 100755 index 0000000..cdd9fbf --- /dev/null +++ b/ui/po/ar.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "رفض بواسطة رسالة" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "قبول" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "إضافة مكالمة" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "جهات الاتصال" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "تعليق" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "ضم" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "رفض" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "مكبر الصوت" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "إستئناف" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "رفض الاتصال مع رسالة" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "إنهاء كافة المكالمات" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "إنهاء المكالمات النشطة (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "سماعات رأس" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "لوحة المفاتيح" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "كتم" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "جاري التوصيل" + +msgid "IDS_CALL_POP_REJECTED" +msgstr "مرفوضة" + +msgid "IDS_CALL_POP_SENDING" +msgstr "جاري الإرسال..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "تبديل" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "تعليق الاتصال بـ %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "انهاء المكالمة مع %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "تحسين نغمات منخفضة" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "تحسين نغمات عالية" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "محسن للأذن اليسرى" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "محسن للأذن اليمنى" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "إدارة الاتصال الجماعي" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "صوت" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "مشاركة" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "مشاركة الملف عبر ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "مشاركة" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "المكالمة" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "الطرف المراد غير متاح" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "تم إنهاء المكالمة" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "تم رفض المكالمة" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "تم الفصل" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "لا يوجد رد" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "تم تغيير الرقم" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "الرقم غير موجود" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "في انتظار" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "أشخاص" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "سماعة" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "مكالمة متعددة الأطراف" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "خطأ بالنظام" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "كل المكالمات الواردة محجوبة" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "كل المكالمات الصادرة محجوبة" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "فشل الاتصال" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "مكالمات طوارئ فقط" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "المكالمة غير مسموحة" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "المكالمة محجوبة" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "المكالمات المحولة: دومًا" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "المكالمات المحولة: بدون رد" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "المكالمات المحولة: لا يمكن الوصول إليه" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "المكالمات المحولة: عندما يكون مشغولاً" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "تم تحويل المكالمة" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "رقم خطأ" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "قم بتغيير وضع غير متصل إلى وضع أخر من أجل خدمات الشبكة" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "جاري الاتصال..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "فشل الإرسال. حاول ثانية" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "مكالمة طوارئ" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "مكالمات FDN فقط" + +msgid "IDS_CALL_POP_HELD" +msgstr "تم التعليق" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "فشل التعليق" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "التعليق غير مدعوم" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "الواردة محجوبة أثناء السفر" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "غير كامل" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "فشل الضم" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "الضم غير مدعوم" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "الشبكة مشغولة" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "الشبكة غير متاحة" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "لا يوجد رصيد" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "لا توجد خدمة" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "تم رفض العملية" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "حجب الصادرة الدولية ما عدا الوطن" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "تم حجب المكالمات الدولية الصادرة" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "لم يتم بدء تشغيل الهاتف" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "جاري إعادة الاتصال..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "الخدمة غير مسموحة" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "مكالمة طوارئ فقط. قم بإدخال البطاقة للنفاذ إلى خدمات الشبكة" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "فشل الفصل" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "الفصل غير مدعوم" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "فشل الانتقال" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "الانتقال غير مدعوم" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "فشل التحويل" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "التحويل غير مدعوم" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "غير قادر على التحميل" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "غير متوفر" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "تم الاستئناف" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "الاستئناف غير مدعوم" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "المستخدم مشغول" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "التحقق من بطاقة SIM أو إدراج بطاقة SIM صالحة" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "غير مسموح بإجراء مكالمة صوتية أثناء مكالمة الفيديو" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "الانتظار مفعل" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "مجموعة خطأ" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "إنهاء المكالمات المعلقة (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "المستقبل" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "تعليق مكالمة جارية" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "لا يوجد ذاكرة كافية. امسح بعض العناصر" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "إنهاء مك" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "الخدمة غير متوفرة" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "تسجيل" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "تم رفض المكالمة غير المعروفة" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "خلال %d يوم" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "غداً" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "خلال أسبوع" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "قبول المكالمة بعد" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "إيقاف تشغيل تقليل التشويش" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "تشغيل ميزة تقليل التشويش" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "يتعذر تشغيل تخفيض التشويش عند تفعيل مستوى الصوت الإضافي‬" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "يتعذر تشغيل وظيفة خفض التشويش عند توصيل سماعة الأذن" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "يتعذر تشغيل تخفيض التشويش عند تشغيل سماعة رأس Bluetooth‬" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "يتعذر تشغيل خفض التشويش عند إجراء المكالمات عريضة النطاق" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "لاستخدام هذه الوظيفة، يلزم التحقق من تحسين معادل الصوت لي ضمن إعدادات المكالمة" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "يتعذر تفعيل معادل الصوت أثناء المكالمة عند تشغيل السماعة" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "يتعذر تفعيل معادل الصوت أثناء المكالمة عند توصيل سماعات الأذن" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "يتعذر تفعيل معادل‬ الصوت أثناء المكالمة عند تشغيل سماعة رأس بلوتوث" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "يتعذر استخدام نطاق مستوى الصوت الإضافي عند توصيل سماعات الأذن أو سماعة البلوتوث" + +msgid "IDS_CALL_POP_CALLING" +msgstr "اتصال" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "يتعذر تفعيل موازن‬ الصوت أثناء المكالمة عند تفعيل مستوى الصوت الإضافي" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "يتعذر تفعيل موازن‬ الصوت أثناء المكالمة أثناء إجراء المكالمات عريضة النطاق‬" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "يتعذر تشغيل وظيفة خفض التشويش أثناء تشغيل السماعة" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "مكالمة جماعية (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "الصورة التي تم حفظها" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "الفيديو الذي تم حفظه" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "التقاط صورة" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "فيديو مباشر" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "عرض جهة اتصال" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d مكالمة (مكالمات) فائتة" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "مكالمة فائتة" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "تم تفعيل مستوى الصوت الإضافي" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "تم إلغاء تفعيل مستوى الصوت الإضافي" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "الصادرة محولة" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "المكالمات الصادرة الدولية محجوبة" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "مكالمة محولة" + diff --git a/ui/po/az.po b/ui/po/az.po new file mode 100755 index 0000000..107f500 --- /dev/null +++ b/ui/po/az.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Mesajla imtina edin" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Qəbul et" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Zng əlv.et" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontaktlar" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Gözlət" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Qoşulun" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "İmtina et" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Dinamik" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Gözlətmə" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Mesaj ilə zəngdən imtina edin" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Bütün zəngləri bitirin" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Aktiv zəngləri bitir (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Qulaqlıqlar" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Klaviat." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Səssiz" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "qoşulur" + +msgid "IDS_CALL_POP_REJECTED" +msgstr "İmtina edildi" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Göndərilir..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Qoş" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s gözləməyə qoyulur" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "%s ilə zəng bitirilir" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Yksln aşağı tonlar" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Yksln yüksək tonlar" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Sol qulaq üçün optimallaş" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Sağ qulaq üçün optimallaş" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Konfrans zəngini idarə edin" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Səs" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Paylaş" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Faylı ChatON ilə paylaş" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Paylaş" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Zəng" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Qarş.tər-ə zəng çatm." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Zəng bitdi" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Zəngdən imtina edildi" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "əlaqəsi pozuldu" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Cavab yoxdur" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nömrə dəyişdrilmişdir" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nömrə mövcud deyil" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Gözlədilr" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "İnsanlar" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Qulaqlıq" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konfrans zəngi" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistemdə yanlışlıq" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Bütün gələn zənglərə qadağa qoyulub" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Bütün gedən zənglərə qadağa qoyulub" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Zəng etmək mümkün olmadı" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Yalnız fövqəladə zənglər üçün" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Zəngə icazə verilmir" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Zəng qadağan edildi" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Zəng yönləndirmə aktivdir: Həmişə" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Zəng yönləndirmə aktivdir: Cavab vermir" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Zəng yönləndirmə aktivdir: Zəng çatmır" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Zəng yönləndirmə aktivdir: Məşğul olduqda" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Zəng yönləndirildi" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Yanlış nömrə" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Şəbəkə xidmətləri üçün Offline rejimindən digər profilə keçirin" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Yığılır..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Göndərilmə baş tutmadı. Yenidən cəhd edin" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Təcili zəng" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Ancaq FDN zəngləri" + +msgid "IDS_CALL_POP_HELD" +msgstr "Gözlədilir" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Gözlətmə alınmadı" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Gözlətmə dəstəklənmir" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Roaminq zamanı daxil olan zənglərə qadağa qoyulur" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Natamam" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Calaşdırma alınmadı" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Calaşdırma dəstəklənmir" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Şəbəkə məşğuldur" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Şəbəkədən istifadə etmək mümkün deyil" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kredit qalmamışdır" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Servis yoxdur" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Əməliyyatdan imtina edildi" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Evə istisna olmaqla ölkəxaricinə qadağa" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Gedən beynəlxalq zənglərə qadağa qoyulub" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon hazırlıq vəziyyətinə gətirilir" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Yenidən yığılır..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Xidmətə icazə verilmir" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Yalnız SOS zənglər.\nXahiş olunur şəbəkə xidmətlərinə giriş üçün SIM kart daxil edin" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Ayırma alınmadı" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Ayırma dəstəklənmir" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Yerdəyişmə alınmadı" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Yerdəyişmə dəstəklənmir" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Köçürmə alınmadı" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Köçürmə dəstəklənmir" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Çıxarmaq mümkün deyil" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "İstifadəsi mümkün deyil" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Gətir" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Gətirmə dəstəklənmir" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "İstifadəçi məşğuldur" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM kartı yoxla və ya düzgun SIM daxil et" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Video zəng zamanı səs zənginə icazə verilmir" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Gözləmə aktivdir" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Qrup səhvdir" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Gözləyən zəngləri bitir (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Qəbuledici" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktiv zəngi gözlədin" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Yaddaş kifayət etmir. Xahiş olunur bəzi elementləri silin" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Zng btrn" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servisdən istifadə etmək mümkün deyil" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Yazı" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Naməlum zəng rədd edildi" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d günə" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Sabah" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Bir həftəyə" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Zəngi sonra qəbul et" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Səs-küyün azaldılması söndürülmüşdür" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Səs-küyün azaldılması qoşuludur" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Əlavə səs səviyyəsi aktiv olduqda səs azaldılmasını yandırmaq mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Qulaqlıq qoşulduqda səsin azaldılmasını söndürmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth qulaqlığı aktiv olduqda səsin azaldılmasını söndürmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Genişzolaqlı zənglər zamanı səsin azaldılmasını söndürmək mümkün deyil" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Bu funksiyadan istifadə etmək üçün Zəng parametrlərində EQ-nin optimallaşdırmasını yoxlamalısınız" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Dinamik aktiv olduqda zəngdaxili səs EQ-ni aktivləşdirmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Qulaqlıqlar qoşulduqda zəngdaxili səs EQ-ni aktivləşdirmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth qulaqlığı aktiv olduqda zəngdaxili səs EQ-ni aktivləşdirmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Qulaqlıq və ya BT qulaqlıqları qoşulduqda, əlavə səs səviyyəsindən istifadə etmək mümkün deyil" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Zəng edilir..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Əlavə səs səviyyəsi aktivləşdirildikdə zəngdaxili səs EQ-ni aktivləşdirmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Genişzolaqlı zənglər zamanı səsdaxili EQ-ni aktivləşdirmək mümkün deyil" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Dinamik aktiv olduqda səsin azaldılmasını söndürmək mümkün deyil" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Qrup zəngi (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Saxlanmış şəkil" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Saxlanmış video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Şəkil çək" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Canlı video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Kontakta bax" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Buraxılmış zənglər" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Buraxılmış zəng" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Əlavə səs səviyyəsi aktivdir" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Əlavə səs səviyyəsi qeyri-aktivdir" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Xaric olan zəng ütürüldü" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Xaric olan zənglər qadağandır" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Ötürülmüş zəng" + diff --git a/ui/po/bg.po b/ui/po/bg.po new file mode 100755 index 0000000..71db6f3 --- /dev/null +++ b/ui/po/bg.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Отказване със съобщение" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Приеми" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Доб. разг." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Указател" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Задръж" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Вкл. се" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Отказ" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Високог" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Освободи" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Отказване на разговора с изпращане на съобщение" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Край на всички повиквания" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Край на активните (%d) разговори" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Слушалки" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Клавиат." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Заглуш." + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Свързване..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Отхвърлен" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Изпращане..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Превключване" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Разговорът с %s е задържан" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Край на разговора с %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Усилв. ниски тонове" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Усилв. вис. тонове" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Оптимизиран за ляво ухо" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Оптимизиран за дясно ухо" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Управление на конферентен разговор" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Звук" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Споделям" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Спод. на файла през ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Споделям" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Повикване" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Набраният недостъпен" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Край на разговор" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Повикване отхвърлено" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Изключен" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Няма отговор" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Номерът е променен" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Номерът не съществува" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Задържане" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Хора" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Слуш." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Конферентен разговор" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Системна грешка" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Всички входящи повиквания са блокирани" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Международните изходящи повиквания са блокирани" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Неуспешно обаждане" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Само спешни повиквания" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Повикването не е разрешено" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Повикване не е разрешено" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Активирано пренасочване на разговор: Винаги" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Активирано пренасочване на разговор: Няма отговор" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Активирано пренасочване на разговор: Недостъпен" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Активирано пренасочване на разговор: При заето" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Повикването е пренасочено" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Грешен номер" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "За мрежови услуги преминете от профил офлайн на друг профил" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Набиране..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Изпращането неуспешно. Опитайте отново" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Спешно повикване" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Само FDN повиквания" + +msgid "IDS_CALL_POP_HELD" +msgstr "Задържано" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Задържането неуспешно" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Задържане не се поддържа" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Входящите повиквания блокирани при роуминг" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Непълен" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Съединяването неуспешно" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Присъединяване не се поддържа" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Мрежата е заета" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Няма мрежа" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Разрешени са само местни и вътрешни изходящи повиквания" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Няма услуга" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Операция отказана" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Изходящите международни повиквания блокирани, с изкл. на собствената мрежа" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Международните изходящи\nповиквания са блокирани" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Телефонът не е инициализиран" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Пренабиране..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Услугата не е позволена" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Само SOS повиквания.\nПоставете SIM картата, за да получите достъп до услуги на мрежата" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Разделянето неуспешно" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Разделяне не се поддържа" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Размяната неуспешна" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Размяна не се поддържа" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Прехвърлянето неуспешно" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Прехвърляне не се поддържа" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Невъзможно изтегляне" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Недостъпен*" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Освободен" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Освобождаване не се поддържа" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Зает" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Проверете SIM или поставете валидна SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "По време на видео разговор не е разрешено гласово повикване" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Изчакване активно" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Грешна група" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Край на задържаните (%d) разговори" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Приемник" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Задръж акт. разговор" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Няма достатъчно памет. Изтрийте някои елементи" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Край рзг" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Услугата не е налична" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Запис" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Отхвърлено неизвестно повикване" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "за %d дни" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Утре" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "След седмица" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Приемане на повикването след" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Потискане на шума изкл." + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Потискане на шума вкл." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Не може да се включи потискане на шума, когато е активирана допълнителна сила на звука" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Не може да се включи потискане на шума, когато е свързана слушалка" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Не може да се включи потискане на шума, когато са включени Bluetooth слушалки" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Не може да се включи потискане на шума при широколентови разговори" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "За да използвате тази функция, трябва да проверите и оптимизирате EQ за мен под настройките за повикване" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Не може да се активира звуков EQ в повикване, когато е включен високоговорителят" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Не може да се активира звуков EQ в повикване, когато слушалките са свързани" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Не може да се активира звуков EQ в повикване, когато е включена Bluetooth слушалка" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Не може да се използва допълнителна сила на звука, когато има свързани слушалки или BT слушалка" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Повикване..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Не може да се активира звуков EQ в повикване, когато е активирана допълнителна сила на звука" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Не може да се активира звуков EQ в повикване по време на широколентови разговори" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Не може да се включи потискане на шума, когато е включен високоговорителят" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Групово повикв. (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Записано изображение" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Записано видео" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Правене на снимка" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Вид. на живо" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Прегл. запис" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Пропуснати повиквания" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Пропуснат разговор" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Допълнителна сила на звука активирана" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Допълнителна сила на звука деактивирана" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Изходящо повикване пренасочено" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Изходящи повиквания забранени" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Препратено повикване" + diff --git a/ui/po/ca.po b/ui/po/ca.po new file mode 100755 index 0000000..ca47ffd --- /dev/null +++ b/ui/po/ca.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rebutjar amb un missatge" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Acceptar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Af trucada" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactes" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Retenir" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Afegir" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rebutjar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altaveu" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Des. esp." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rebutjar trucada amb un missatge" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Final. totes les trucades" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Finalitzar les trucades actives (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auriculars" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclat" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silenci" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connectant..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rebutjat" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Enviant..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Canviar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Posant %s en espera" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Finalitzar una trucada amb %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Potenciar tons baix" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Potenciar tons alts" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optim per orella esquerra" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optim per l'orella dreta" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Administrar trucada de multiconferència" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "So" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Compartir" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Compart fitxer per ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Compartir" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Trucar" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Multicon truc no disp" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Fi de trucada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Trucada rebutjada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desconnectat" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "No hi ha resposta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "El número ha canviat" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Aquest número no existeix" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Retinguda" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Gent" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auricul" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Multiconferència" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Error del sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Totes les trucades d'entrada restringides" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Totes les trucades de sortida restringides" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Error de trucada" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Només trucades d'emergència" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "No es permet la trucada" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Trucada restringida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Activar desviació de trucada: Sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Activar desviació de trucada: si no hi ha resposta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Activar desviació de trucada: si no localitzable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Activar desviació de trucada: si ocupat" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Trucada desviada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número incorrecte" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Canviar perfil Fora de línia a un altre perfil per a serveis de xarxa" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Marcant..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Error en enviar. Tornar-ho a intentar" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Trucada d'emergència" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Només trucades FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Retinguda" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Error en retenir" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "No s'admet retenció" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Trucades d'entrada bloquejades en itinerància" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incomplet" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Error en unir" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "No s'admet la unió" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Xarxa ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Xarxa no disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No hi ha crèdit" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sense servei" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operació rebutjada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Trucades internacionals de sortida bloquejades, excepte a casa" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Trucades de sortida internacionals restringides" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "No s'ha inicialitzat el telèfon" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Tornant a marcar.." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "No es permet el servei" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Només trucada SOS.\nInsereixi targeta SIM per a accedir als serveis de xarxa" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Error en dividir" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "No s'admet la separació" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Error en intercanviar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "No s'admet l'intercanvi" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Error de transferència" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "No s'admet la transferència" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "No es pot recuperar" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "No disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "No s'ha retingut" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "No s'admet sense retenció" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Usuari ocupat" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verifiqui la SIM o introdueixi'n una de vàlida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "No s'admeten trucades de veu durant una trucada de vídeo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "En espera actiu" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grup incorrecte" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Finalitzar les trucades en espera (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receptor" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Retenir truc activa" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "No hi ha prou memòria. Esborrar-ne alguns elements" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Fi truc" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servei no disponible" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Grav." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Trucada desconeguda rebutjada" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "en %d dies" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Demà" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "En una setmana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Acceptar la trucada després de" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Reducció de soroll desactivada" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Reducció de soroll activada" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "No es pot activar la reducció de soroll mentre el volum extra està habilitat" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "No es pot activar la reducció de soroll mentre l'auricular està connectat" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "No es pot activar la reducció de soroll quan els auriculars Bluetooth estan activats" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "No es pot activar la reducció de soroll durant trucades de banda ampla" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Per utilitzar aquesta funció, ha de marcar optimitzar EQ per mi a Ajustaments de trucada" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "No es pot habilitar l'EQ de so de trucades mentre l'altaveu està activat" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "No es pot habilitar l'EQ de so de trucades mentre els auriculars estan connectats" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "No es pot habilitar l'EQ de so de trucades mentre els auriculars Bluetooth estan activats" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "No es pot utilitzar l'interval de volum extra quan hi ha auriculars o un auricular BT connectats" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Trucant..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "No es pot habilitar l'EQ de so de trucades mentre el volum extra està habilitat" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "No es pot habilitar l'EQ de so de trucades durant les trucades de banda ampla" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "No es pot activar la reducció de soroll mentre l'altaveu està activat" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Trucada de grup (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imatge desada" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vídeo desat" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Fer una foto" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vídeo direct" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Veure contacte" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Trucades perdudes" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Trucada perduda" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volum extra habilitat" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volum extra deshabilitat" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Trucada de sortida reenviada" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Trucades de sortida restringides" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Trucada desviada" + diff --git a/ui/po/cs.po b/ui/po/cs.po new file mode 100755 index 0000000..fda61d5 --- /dev/null +++ b/ui/po/cs.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Odmítnout se zprávou" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Přijmout" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Př. hovor" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakty" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Podržet" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Spojit" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Odmítnout" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Reprod." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Uvolnit" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Odmítnout hovor se zprávou" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Ukončit všechny hovory" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Ukončit aktivní hovory (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Sluchátka" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Klávesnice" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Ztlumit" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Připojování..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Odmítnuto" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Odesílání..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Přepnout" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Přidržení hovoru s %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Ukončování hovoru s %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Zvýraznit níz. tóny" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Zvýraznit vys. tóny" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimal. pro levé ucho" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimal. pro pravé ucho" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Správa konferenčních hovorů" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Zvuk" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Sdílet" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Sdílet soubor přes ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Sdílet" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Volat" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Volaný úč. je nedost." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Hovor ukončen" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Hovor odmítnut" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Odpojeno" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Žádná odpověď" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Číslo bylo změněno" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Číslo neexistuje" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Za hovoru" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Lidé" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Sluch." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenční hovor" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systémová chyba" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Všechny příchozí hovory blokovány" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Všechny odchozí hovory blokovány" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Hovor se nezdařil" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Pouze tísňová volání" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Hovor není povolen" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Hovor je blokován" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Přesměrování hovorů aktivní: Vždy" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Přesměrování hovorů aktivní: Když neodpovídá" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Přesměrování hovorů aktivní: Když je nedostupný" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Přesměrování hovorů aktivní: Když je obsazeno" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Hovor byl přesměrován" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Chybné číslo" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Chcete-li používat síťové služby, změňte profil Offline na jiný profil" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Připojuji hovor..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Odeslání se nezdařilo. Opakujte akci později" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Tísňové volání" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Pouze hovory FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Podržený" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Přidržení se nezdařilo" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Přidržení není podporováno" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Příchozí hovory jsou při roamingu blokovány" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nedokončené" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Připojení se nezdařilo" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Připojení není podporováno" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Síť obsazena" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Síť není dostupná" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Žádný kredit" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Žádné služby" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operace byla odmítnuta" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Odchozí mezinárodní hovory jsou blokovány kromě hovorů domů" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Mezinárodní odchozí hovory blokovány" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon nebyl inicializován" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Opakované vytáčení..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Služba není povolena" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Pouze hovor SOS.\nChcete-li používat síťové služby, vložte SIM kartu." + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Rozdělení se nezdařilo" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Rozdělení není podporováno" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Přepnutí se nezdařilo" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Přepnutí není podporováno" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Chyba přenosu" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Předání není podporováno" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nelze načíst" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Není k dispozici" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Puštěno" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Puštění není podporováno" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Obsazeno" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Zkontrolujte SIM kartu nebo vložte platnou SIM kartu" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Během videohovoru není povolen hlasový hovor" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Čekání je aktivní" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Chybná skupina" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Ukončit držené hovory (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Příjemce" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Držet aktivní hovor" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedostatek paměti. Odstraňte některé položky" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Konec" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Služba není dostupná" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Nahr." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Neznámý hovor odmítnut" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "za %d dnů" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Zítra" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Za týden" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Přijmout hovor potom" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Redukce hluku vypnuta" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Redukce hluku zapnuta" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Když je zapnutá dodatečná hlasitost, nelze zapnout redukci hluku" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Když jsou připojená sluchátka, nelze zapnout redukci hluku" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Když jsou zapnuta sluchátka Bluetooth, nelze zapnout redukci hluku" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Při širokopásmovém připojení nelze během hovoru zapnout redukci hluku" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Chcete-li použít tuto funkci, musíte v Nastavení hovorů zaškrtnout možnost Optimalizovat ekvalizér pro mě" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Když je zapnutý reproduktor, nelze zapnout zvukový ekvalizér během hovoru" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Když jsou připojená sluchátka, nelze zapnout zvukový ekvalizér během hovoru" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Když jsou zapnutá sluchátka Bluetooth, nelze zapnout zvukový ekvalizér během hovoru" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Když jsou připojená sluchátka nebo sluchátka BT, nelze použít dodatečnou hlasitost" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Volání..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Když je zapnutá dodatečná hlasitost, nelze zapnout zvukový ekvalizér během hovoru" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Při širokopásmovém připojení nelze zapnout zvukový ekvalizér během hovoru" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Když je zapnutý reproduktor, nelze zapnout redukci hluku" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Skupinový hovor (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Uložený obrázek" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Uložené video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Vyfotografovat" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Živé video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Zobr. kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "Nepřijaté hovory: %d" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Zmeškaný hovor" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Dodatečná hlasitost zapnuta" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Dodatečná hlasitost vypnuta" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Odchozí hovor přesměrován" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Odchozí hovory blokovány" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Přesměrovaný hovor" + diff --git a/ui/po/da.po b/ui/po/da.po new file mode 100755 index 0000000..13746ff --- /dev/null +++ b/ui/po/da.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Afvis med meddelelse" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Besvar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Tilf. opk." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakter" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Sæt på hold" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Tilslut" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Afvis" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Højttaler" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Hent" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Afvis opkald med meddelelse" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Afslut alle opkald" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Afslut aktive opkald (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Høretelefoner" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastatur" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Lydløs" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Opretter forbindelse..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Afvist" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sender..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Skift" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Sætter %s på hold" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Afslut opkald med %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Forstærk lave toner" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Forstærk høje toner" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimeret til venstre øre" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimeret til højre øre" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Administrér konferenceopkald" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Lyd" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Del" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Del fil via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Del" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Opkald" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Nummer kunne ikke nås" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Opkald afsluttet" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Opkaldet er afvist" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Afbrudt" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Intet svar" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nummer ændret" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nummeret findes ikke" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "På hold" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personer" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Høretel" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenceopkald" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systemfejl" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alle indgående opkald spærret" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alle udgående opkald spærret" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Opkald mislykkedes" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Kun nødopkald" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Opkald er ikke tilladt" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Opkald spærret" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Viderestilling af opkald: Altid" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Viderestilling af opkal ved inget svar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Viderestilling aktiv: Uden for net" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Viderestilling aktiv: Når optaget" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Opkaldet er viderestillet" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Forkert nummer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Skift fra Fligtmode til anden profiler for netværkstjenester" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Ringer op..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Afsendelsen mislykkedes. Prøv igen" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Nødopkald" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Kun FDN-opkald" + +msgid "IDS_CALL_POP_HELD" +msgstr "På hold" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Opkald på hold mislykkedes" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Ventning understøttes ikke" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Indgående opkald spærret ved roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Ufuldstændig" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Tilknytning mislykkedes" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Tilknytning understøttes ikke" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Netværket er optaget" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Netværk ikke tilgængeligt" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Saldo tom" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Ingen dækning" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Handlingen blev afvist" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Udgående internationale opkald undtagen hjem spærret" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Udgående internationale opkald spærret" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon er ikke initialiseret" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Foretager genkald..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Opkald ikke tilladt" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Kun SOS-opkald.\nIndsæt SIM-kortet for at få adgang til netværkstjenesterne" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Deling mislykkedes" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Deling understøttes ikke" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Skift mislykkedes" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Skift understøttes ikke" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Overførselsfejl" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Overførsel understøttes ikke" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Kunne ikke hentes" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Ikke tilgængelig" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Hold fra" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Hentning af opkald på hold mislykkedes" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Bruger optaget" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Kontrollér SIM, eller isæt gyldigt SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Stemmeopkald er ikke tilladt under videoopkald" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Ventning aktiv" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Forkert gruppe" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Afslut holdte opkald (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Modtager" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Hold aktivt opkald" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Der er ikke tilstrækkelig hukommelse. Slet nogle elementer" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Læg på" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Tjeneste ikke tilgængelig" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Optag" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Ukendt opkald er afvist" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "om %d dage" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "I morgen" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Om en uge" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Acceptér opkald efter" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Støjreducering fra" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Støjreducering til" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kan ikke tænde for støjreduktion, når ekstra lydstyrke er aktiveret" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Kan ikke tænde for støjreduktion, når høretelefon er tilsluttet" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kan ikke tænde for støjreduktion, når Bluetooth-hovedtelefon er slået til" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Kan ikke tænde for støjreduktion under bredbåndsopkald" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Du skal markere optimering af equalizer under opkaldsindstillingerne for at bruge denne funktion" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Lyd-EQ under opkald kan ikke aktiveres, når højttaleren er tændt" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Lyd-EQ under opkald kan ikke aktiveres, når hovedtelefonerne er tilsluttet" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Lyd-EQ under opkald kan ikke aktiveres, når Bluetooth-høretelefonerne er tændt" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Kan ikke bruge ekstra volumeninterval, når hovedtelefoner eller BT-headset er tilsluttet" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Ringer op..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Lyd-EQ under opkald kan ikke aktiveres, når ekstra lydstyrke er aktiveret" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Lyd-EQ under opkald kan ikke aktiveres under bredbåndsopkald" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Kan ikke tænde for støjreduktion, når højttaler er slået til" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Gruppeopkald (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Gemt billede" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Gemt video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Tag et billede" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Lev. video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Vis kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d ubesvarede opkald" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Ubesvaret opkald" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Ekstra lydstyrke aktiveret" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Ekstra lydstyrke deaktiveret" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Udgående opkald videresendt" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Udgående opkald spærret" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Viderestillet opkald" + diff --git a/ui/po/de_DE.po b/ui/po/de_DE.po new file mode 100755 index 0000000..410d1db --- /dev/null +++ b/ui/po/de_DE.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Ablehnen und Mitteilung senden" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Annehmen" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Anruf hzfg." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakte" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Halten" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Konferenz" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Ablehnen" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Lautspr." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Abrufen" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Anruf mit Nachricht abweisen" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Alle Anrufe beenden" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Aktive Anrufe beenden (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Kopfhörer" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastenfeld" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Stumm" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Verbindung wird hergestellt..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Abgelehnt" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sendevorgang läuft..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Umschalten" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s halten" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Anruf beenden mit %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Tiefen-Verstärkung" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Höhen-Verstärkung" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimiert für linkes Ohr" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimiert für rechtes Ohr" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Konferenzanruf verwalten" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Ton" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Senden via" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Datei über ChatON freig." + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Senden via" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My Call Sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Anruf" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Teiln. nicht erreich." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Anruf beendet" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Anruf abgelehnt" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Getrennt" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Antwortet nicht" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nummer gewechselt" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nummer nicht vorhanden" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Gehalten" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Teilnehmer" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenz" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systemfehler" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alle eingehenden Anrufe blockiert" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alle ausgehenden Anrufe blockiert" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Anruf fehlgeschlagen" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Nur Notrufe" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Anruf unzulässig" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Anruf gesperrt" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Umleitung aktiv: Immer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Umleitung aktiv: Immer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Umleitung aktiv: Nicht erreichbar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Umleitung aktiv: Bei besetzt" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Anruf weitergeleitet" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Falsche Nummer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Wechseln Sie vom Offline-Profil zu einem anderen Profil, um Netzdienste nutzen zu können" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Wählen ..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sendevorgang fehlgeschlagen. Erneut versuchen" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Notruf" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Nur FDN-Anrufe" + +msgid "IDS_CALL_POP_HELD" +msgstr "Gehalten" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Halten fehlgeschlagen" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Halten nicht unterstützt" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Eingehende Anrufe bei Roaming gesperrt" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Unvollständig" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Konferenz fehlgeschlagen" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Konferenz nicht unterstützt" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Netz besetzt" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Netzwerk nicht verfügbar" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kein Guthaben übrig" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Kein Netz" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Betrieb abgelehnt" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Ausgehende internationale Anrufe außer Daheim gesperrt" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Ausgehende internationale Anrufe gesperrt" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon nicht initialisiert" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Wahlwiederholung..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Dienst unzulässig" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Nur SOS-Anruf.\nSIM-Karte einsetzen, um Netzdienste zu nutzen" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Teilen fehlgeschlagen" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Teilen nicht unterstützt" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Tauschen fehlgeschlagen" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Tauschen nicht unterstützt" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Übertragungsfehler" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Übertragen nicht unterstützt" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Kann nicht abgerufen werden" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nicht verfügbar" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Übernommen" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Nicht halten nicht unterstützt" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Besetzt" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM verifizieren oder gültige SIM eingeben" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Sprachanruf ist während Videoanruf nicht zugelassen" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Warten aktiv" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Falsche Gruppe" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Gehaltene Anrufe beenden (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Empfänger" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktiven Anruf halten" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nicht genügend Speicher. Löschen Sie einige Elemente" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Beenden" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service nicht verfügbar" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Rec" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Unbekannten Anruf abgewiesen" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "in %d Tagen" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Morgen" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "In einer Woche" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Anruf annehmen nach" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Rauschverminderung aus" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Rauschverminderung ein" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Einschalten der Rauschverminderung bei aktivierter Extralautstärke nicht möglich." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Einschalten der Rauschverminderung nicht möglich, wenn Kopfhörer angeschlossen sind." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Einschalten der Rauschverminderung nicht möglich, wenn ein Bluetooth-Headset verbunden ist." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Einschalten der Rauschverminderung während Breitband-Anrufen nicht möglich." + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Um diese Funktion zu nutzen, müssen Sie die EQ-Optimierung unter “Anrufeinstellungen” aktivieren." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Gesprächston-EQ kann nicht aktiviert werden wenn der Lautsprecher eingeschaltet ist." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Gesprächston-EQ kann nicht aktiviert werden wenn Kopfhörer angeschlossen sind." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Gesprächston-EQ kann nicht aktiviert werden wenn Bluetooth-Headset eingeschaltet ist." + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Zusätzlicher Lautstärkebereich kann nicht verwendet werden, wenn Kopfhörer oder BT-Headset verwendet werden." + +msgid "IDS_CALL_POP_CALLING" +msgstr "Anrufen..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Gesprächston-EQ kann bei aktivierter Extralautstärke nicht aktiviert werden." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Gesprächston-EQ kann während Breitband-Anrufen nicht aktiviert werden." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Einschalten der Rauschverminderung nicht möglich, wenn Lautsprecher eingeschaltet ist." + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Gruppenanruf (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Gespeichertes Bild" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Gespeichertes Video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Foto aufnehmen" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Live-Video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Kontakt anz." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d verpasste Anrufe" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Anr. in Abwesenheit" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extralautstärke aktiviert" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extralautstärke deaktiviert" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Ausgehender Anruf weitergeleitet" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Ausgehende Anrufe gesperrt" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Weitergeleiteter Anruf" + diff --git a/ui/po/el_GR.po b/ui/po/el_GR.po new file mode 100755 index 0000000..f991e63 --- /dev/null +++ b/ui/po/el_GR.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Απόρριψη με μήνυμα" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Αποδοχή" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Πρ. κλήσ." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Επαφές" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Αναμονή" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Ένωση" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Απόρριψη" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Ηχείο" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Απελευθ." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Απόρριψη κλήσης με μήνυμα" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Τερματ. όλων κλήσεων" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Τερματισμός ενεργών κλήσεων (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Ακουστικά" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Πληκτρολ." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Σίγαση" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Σύνδεση..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Απόρριψη" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Αποστολή..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Αλλαγή" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Θέτοντας %s σε αναμονή" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Τερματισμός κλήσης με %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Ενίσχ.χαμηλών τόνων" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Ενίσχ. υψηλών τόνων" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Βελτ. για το αριστ. αυτί" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Βελτιστ. για το δεξί αυτί" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Διαχείριση τηλεφωνικής συνδιάσκεψης" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Ήχος" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Κοινόχρηστο" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Κοινή χρ.αρχ. μέσω ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Κοινόχρηστο" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Κλήση" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Ο καλ.δεν είναι διαθ." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Τέλος κλήσης" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Απόρριψη κλήσης" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Αποσυνδέθηκε" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Δεν απαντά" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Ο αριθμός άλλαξε" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Δεν υπάρχει ο αριθμός." + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Αναμονή" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Ακουστικά" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Τηλεφωνική συνδιάσκεψη" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Σφάλμα συστήματος" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Φραγή όλων των εισερχόμενων κλήσεων" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Φραγή όλων των εξερχόμενων κλήσεων" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Αποτυχία κλήσης" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Μόνο επείγουσες κλήσεις" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Μη επιτρεπτή κλήση" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Φραγή κλήσης" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Ενεργή Προώθηση Κλήσεων: Πάντα" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Προώθηση κλήσεων ενεργή: Εάν δεν απαντά" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Προώθηση κλήσεων ενεργή: Aδύνατη πρόσβαση" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Προώθηση κλήσεων ενεργή: Σε κατειλημμένη γραμμή" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Έγινε προώθηση κλήσης" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Λάθος αριθμός" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Αλλαγή από προφίλ χωρίς σύνδεση σε άλλο προφίλ για υπηρεσίες δικτύου" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Κλήση..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Αποτυχία αποστολής. Επανάληψη" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Κλήση έκτακτης ανάγκης" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Μόνο κλήσεις FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Αναμονή" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Αποτυχία αναμονής" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Η αναμονή δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Φραγή εισερχομένων σε περιαγωγή" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Δεν ολοκληρώθηκε" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Αποτυχία ένωσης" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Η ένωση δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Κατειλημμένο δίκτυο" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Δίκτυο μη διαθέσιμο" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Εξάντληση μονάδων" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Μη διαθέσιμη υπηρεσία" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Η λειτουργία απορρίφθηκε" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Φραγή εξερχομένων διεθνών εκτός χώρας επιλογής" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Φραγή όλων των\nεξερχόμενων διεθνών κλήσεων" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Το τηλέφωνο δεν ξεκίνησε" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Επανάκληση..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Δεν επιτρέπεται η υπηρεσία" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Μόνο κλήση SOS.\nΤοποθετήστε την κάρτα SIM για πρόσβαση στις υπηρεσίες δικτύου" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Αποτυχία διαχωρισμού" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Ο διαχωρισμός δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Αποτυχία εναλλαγής" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Η εναλλαγή δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Σφάλμα μεταφοράς" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Η μεταφορά δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Δεν είναι δυνατή η ανάκτηση" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Μη διαθέσιμο" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Απενεργοποίηση αναμονής" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Η κατάργηση αναμονής δεν υποστηρίζεται" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Κατειλημμένη γραμμή" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Επαληθεύστε SIM ή εισάγετε έγκυρη SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Δεν επιτρέπεται φωνητική κλήση κατά τη διάρκεια κλήσης βίντεο" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Αναμονή ενεργή" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Λάθος ομάδα" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Τερματισμός κλήσεων σε αναμονή (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Δέκτης" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Ενερ. κλήση σε κράτ." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Δεν υπάρχει αρκετή μνήμη. Διαγράψτε ορισμένα στοιχεία" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Τερμ.κλ." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Μη διαθέσιμη λειτουργία" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Εγγρ." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Άγνωστη κλήση απορρίφθηκε" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "σε %d ημέρες" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Αύριο" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Σε 1 εβδομάδα" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Αποδοχή κλήσης μετά" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Απενεργοποίηση μείωσης θορύβου" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Η μείωση θορύβου ενεργοποιήθηκε" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Δεν είναι δυνατή η ενεργοποίηση της μείωσης θορύβου όταν είναι ενεργοποιημένη η επιλογή της επιπλέον έντασης" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Δεν είναι δυνατή η ενεργοποίηση της μείωσης θορύβου όταν είναι συνδεδεμένα τα ακουστικά" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Δεν είναι δυνατή η ενεργοποίηση της μείωσης θορύβου όταν είναι ενεργά τα ακουστικά Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Δεν είναι δυνατή η ενεργοποίηση της μείωσης θορύβου κατά τις ευρυζωνικές κλήσεις" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Για να χρησιμοποιήσετε αυτήν τη λειτουργία, θα πρέπει να επιλέξετε το στοιχείο “αυτόματη βελτιστοποίηση ισοσταθμιστή” από τις Ρυθμίσεις κλήσης" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Δεν είναι δυνατή η ενεργοποίηση του ισοσταθμιστή ήχου κατά την κλήση όταν το ηχείο είναι ενεργό" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Δεν είναι δυνατή η ενεργοποίηση του ισοσταθμιστή ήχου κατά την κλήση όταν είναι συνδεδεμένα τα ακουστικά" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Δεν είναι δυνατή η ενεργοποίηση του ισοσταθμιστή ήχου κατά την κλήση όταν είναι ενεργό το ακουστικό Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Δεν είναι δυνατή η χρήση του εύρους επιπλέον έντασης όταν είναι συνδεδεμένα ακουστικά ή ακουστικό BT" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Κλήση..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Δεν είναι δυνατή η ενεργοποίηση του ισοσταθμιστή ήχου κατά την κλήση όταν έχει ενεργοποιηθεί η επιπλέον ένταση" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Δεν είναι δυνατή η ενεργοποίηση του ισοσταθμιστή ήχου κατά τις ευρυζωνικές κλήσεις" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Δεν είναι δυνατή η ενεργοποίηση της μείωσης θορύβου όταν είναι ενεργοποιημένο το ηχείο" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Ομαδική κλήση (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Αποθηκευμένη εικόνα" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Αποθηκευμένο βίντεο" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Λήψη εικόνας" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Ζωντ. βίντεο" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Προβολή επαφής" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d αναπάντητες κλήσεις" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Αναπάντητη κλήση" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Ενεργοποιήθηκε η επιπλέον ένταση" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Απενεργοποιήθηκε η επιπλέον ένταση" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Προώθηση εξερχόμενων" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Φραγή εξερχόμενων" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Προώθηση κλήσης" + diff --git a/ui/po/en.po b/ui/po/en.po new file mode 100755 index 0000000..a18db8f --- /dev/null +++ b/ui/po/en.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Reject with message" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accept" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Add call" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Hold" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Join" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Reject" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Speaker" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Unhold" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Reject call with message" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "End all calls" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "End active calls (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Headphones" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Keypad" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Mute" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connecting..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejected" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sending..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Switch" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Putting %s on hold" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Ending call with %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Boost low tones" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Boost high tones" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimised for left ear" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimised for right ear" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Manage conference call" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Sound" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Share" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Share file via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Share" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Call" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Called party not available" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Call ended" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Call rejected" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Disconnected" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "No answer" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Number changed" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Number does not exist" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "On hold" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conference call" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "System error" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "All incoming calls barred" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "All outgoing calls barred" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Call failed" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Emergency calls only" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Call not allowed" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Call barred" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Divert calls: Always" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Divert calls: No answer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Divert calls: Unreachable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Divert calls: When busy" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Call diverted" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Wrong number" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Change from Offline to other profile for network services" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Dialling..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sending failed. Try again" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Emergency call" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN calls only" + +msgid "IDS_CALL_POP_HELD" +msgstr "Held" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Hold failed" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Hold not supported" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Incoming calls barred when roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incomplete" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Join failed" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Join not supported" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Network busy" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Network not available" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No credit left" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "No service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operation refused" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Outgoing international calls except home barred" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Outgoing international calls barred" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Phone not initialised" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Redialling..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service not allowed" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "SOS call only.\nInsert SIM card to access network services" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Split failed" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Split not supported" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Swap failed" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Swap not supported" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer failed" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer not supported" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Unable to retrieve" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Unavailable" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Unheld" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Unhold not supported" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "User busy" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verify SIM or insert valid SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Voice call is not allowed during video call" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Waiting active" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Wrong group" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "End held calls (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receiver" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Hold active call" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "End call" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service not available" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Unknown call rejected" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "in %d days" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Tomorrow" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "In a week" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Accept call after" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Noise reduction off" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Noise reduction on" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Unable to turn on noise reduction while extra volume is enabled" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Unable to turn on noise reduction when earphone connected" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Unable to turn on noise reduction when Bluetooth headset is on" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Unable to turn on noise reduction during wideband calls" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "To use this function, you have to check optimise EQ for me under call settings" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Unable to enable in-call sound EQ when speaker is on" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Unable to enable in-call sound EQ when earphones are connected" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Unable to enable in-call sound EQ when Bluetooth headset is on" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Unable to use extra volume range when earphones or BT headset are connected" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Calling..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Unable to enable in-call sound EQ while extra volume is enabled" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Unable to enable in-call sound EQ during wideband calls" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Unable to turn on noise reduction when speaker is on" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Group call (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Saved image" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Saved video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Take a picture" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Live video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "View contact" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d missed calls" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Missed call" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extra volume enabled" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extra volume disabled" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Outgoing call forwarded" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Outgoing calls barred" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Forwarded call" + diff --git a/ui/po/en_PH.po b/ui/po/en_PH.po new file mode 100755 index 0000000..9459775 --- /dev/null +++ b/ui/po/en_PH.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Reject with message" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accept" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Add call" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Hold" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Join" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Reject" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Speaker" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Unhold" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Reject call with message" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "End all calls" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "End active calls (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Headphones" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Keypad" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Mute" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connecting..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejected" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sending..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Switch" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Putting %s on hold" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Ending call with %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Boost low tones" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Boost high tones" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimized for left ear" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimized for right ear" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Manage conference call" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Sound" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Share" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Share file via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Share" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Call" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Called party unavailable" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Call ended" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Call rejected" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Disconnected" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "No answer" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Number changed" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Number does not exist" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "On hold" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conference call" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "System error" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "All incoming calls barred" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "All outgoing calls barred" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Call failed" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Emergency calls only" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Call not allowed" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Call barred" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Divert calls: Always" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Divert calls: No answer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Divert calls: Unreachable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Divert calls: When busy" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Call diverted" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Wrong number" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Change Offline to other profile for network services" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Dialing..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sending failed. Try again" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Emergency call" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN calls only" + +msgid "IDS_CALL_POP_HELD" +msgstr "Held" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Hold failed" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Hold not supported" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Incoming calls barred when roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incomplete" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Join failed" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Join not supported" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Network busy" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Network unavailable" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No credit left" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "No service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operation refused" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Outgoing international calls except home barred" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Outgoing international calls barred" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Phone not initialized" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Redialing..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service not allowed" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "SOS call only.\nInsert SIM card to access network services" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Split failed" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Split not supported" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Swap failed" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Swap not supported" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer failed" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer not supported" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Unable to retrieve" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Unavailable" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Unheld" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Unhold not supported" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "User busy" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verify SIM card or insert valid SIM card" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Voice call is not allowed during video call" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Waiting active" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Wrong group" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "End held calls (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receiver" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Hold active call" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "End call" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service unavailable" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Unknown call rejected" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "in %d days" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Tomorrow" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "In a week" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Accept call after" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Noise reduction off" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Noise reduction on" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Unable to turn on noise reduction while extra volume is enabled" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Unable to activate noise reduction when earphone is connected" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Unable to activate noise reduction when Bluetooth headset is on" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Unable to activate noise reduction during wideband calls" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "To use this function, you have to check optimize EQ under Call settings" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Unable to activate in-call sound EQ when speaker is on" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Unable to activate in-call sound EQ when earphones are connected" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Unable to activate in-call sound EQ when Bluetooth headset is on" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Unable to use extra volume range while earphones or BT headset are connected" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Calling..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Unable to enable in-call sound EQ while extra volume is enabled" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Unable to enable in-call sound EQ during wideband calls" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Unable to activate noise reduction when speaker is on" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Group call (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Saved image" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Saved video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Take a picture" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Live video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "View contact" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d missed calls" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Missed call" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extra volume enabled" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extra volume disabled" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Outgoing call forwarded" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Outgoing calls barred" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Forwarded call" + diff --git a/ui/po/en_US.po b/ui/po/en_US.po new file mode 100755 index 0000000..04fd118 --- /dev/null +++ b/ui/po/en_US.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Reject with message" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accept" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Add call" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Hold" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Join" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Reject" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Speaker" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Unhold" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Reject call with message" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "End all calls" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "End active calls (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Headphones" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Keypad" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Mute" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connecting..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejected" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sending..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Switch" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Putting %s on hold" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Ending call with %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Boost low tones" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Boost high tones" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimized for left ear" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimized for right ear" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Manage conference call" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Sound" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Share" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Share file via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Share" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Call" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Called party unavailable" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Call ended" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Call rejected" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Disconnected" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "No answer" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Number changed" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Number does not exist" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "On hold" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conference call" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "System error" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "All incoming calls barred" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "All outgoing calls barred" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Call failed" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Emergency calls only" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Call not allowed" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Call barred" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Divert calls: Always" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Divert calls: No answer" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Divert calls: Unreachable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Divert calls: When busy" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Call diverted" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Wrong number" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Change from Offline to other profile for network services" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Dialing..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sending failed. Try again" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Emergency call" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN calls only" + +msgid "IDS_CALL_POP_HELD" +msgstr "Held" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Hold failed" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Hold not supported" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Incoming calls barred when roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incomplete" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Join failed" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Join not supported" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Network busy" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Network unavailable" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No credit left" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "No service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operation refused" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Outgoing international calls except home barred" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Outgoing international calls barred" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Phone not initialized" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Redialing..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service not allowed" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "SOS call only.\nInsert SIM card to access network services" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Split failed" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Split not supported" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Swap failed" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Swap not supported" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer failed" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer not supported" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Unable to retrieve" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Unavailable" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Unheld" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Unhold not supported" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "User busy" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verify SIM or insert valid SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Voice call is not allowed during video call" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Waiting active" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Wrong group" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "End held calls (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receiver" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Hold active call" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "End call" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service unavailable" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Rec" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Unknown call rejected" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "in %d days" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Tomorrow" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "In a week" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Accept call after" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Noise reduction off" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Noise reduction on" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Unable to turn on noise reduction while extra volume is enabled" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Unable to turn on noise reduction when earphone connected" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Unable to turn on noise reduction when Bluetooth headset is on" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Unable to turn on noise reduction during wideband calls" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "To use this function, you have to check optimize EQ for me under Call settings" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Unable to enable in-call sound EQ when speaker is on" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Unable to enable in-call sound EQ when earphones are connected" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Unable to enable in-call sound EQ when Bluetooth headset is on" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Unable to use extra volume range when earphones or BT headset are connected" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Calling..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Unable to enable in-call sound EQ while extra volume is enabled" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Unable to enable in-call sound EQ during wideband calls" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Unable to turn on noise reduction when speaker is on" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Group call (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Saved image" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Saved video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Take a picture" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Live video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "View contact" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d missed calls" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Missed call" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extra volume enabled" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extra volume disabled" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Outgoing call forwarded" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Outgoing calls barred" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Forwarded call" + diff --git a/ui/po/es_ES.po b/ui/po/es_ES.po new file mode 100755 index 0000000..b220927 --- /dev/null +++ b/ui/po/es_ES.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rechazar con mensaje" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceptar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Añadir llamada" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactos" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Retener" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Enlazar" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rechazar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altavoz" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Canc. ret." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Definir mens. de rechazo" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Fin todas llamadas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Finalizar llamadas activas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auriculares" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silencio" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Conectando..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rechazado" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Enviando..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Cambiar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Poniendo %s en espera" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Finalizar la llamada con %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Potenc tonos bajos" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Potenc tonos altos" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optim para oído izquierdo" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optim para oído derecho" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Administrar multiconferencia" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Sonido" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Compartir" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Compart archivo por ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Compartir" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Llamadas" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destinatario ocupado" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Llamada finalizada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Llamada rechazada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desconectado" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Sin respuesta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Número cambiado" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "No hay número" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "En espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Gente" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Bluetooth" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Multiconferencia" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Error del sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Restringidas todas las llamadas entrantes" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Restringidas todas las llamadas salientes" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Error al llamar" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Sólo llamadas de emergencia" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Llamada no permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Llamada restringida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvío de llamadas: Siempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvío de llamadas: Sin respuesta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvío de llamada: Si no localizable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvío de llamada: Si ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Llamada reenviada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número erróneo" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Cambiar de Fuera de línea a otro perfil de servicios de red" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Marcando..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Error al enviar. Inténtelo de nuevo" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Llamada de emergencia" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Sólo llamadas FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Espera" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Error de espera" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Espera no admitida" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Llamadas entrantes restringidas en el extranjero" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Error de enlace" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Enlace no admitido" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Red ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Red no disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No queda saldo" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sin servicio" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operación rechazada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Llamadas internacionales salientes excepto país de origen restringidas" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Llamadas salientes internacionales restringidas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Teléfono no iniciado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Marcando nuevamente..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servicio no permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Sólo llamadas de emergencia.\nInserte tarjeta SIM para acceder a los servicios de red" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Error al dividir" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "División no admitida" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Error al cambiar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Cambio no admitido" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Error de transferencia" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferencia no admitida" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "No se puede recuperar" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "No disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Desactivar en espera" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Desactivación de espera no admitida" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Usuario ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Compruebe SIM o inserte SIM válida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "No se permite realizar llamadas de voz durante una llamada de vídeo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Espera activa" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo erróneo" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Finalizar llamadas retenidas (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receptor" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Poner llam act esper" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "No hay memoria suficiente. Elimine algunos elementos" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Fin llam" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servicio no disponible" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Llamada desconocida rechazada" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "en %d días" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Mañana" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Dentro de 1 semana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Aceptar la llamada después de" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Reducción de ruido desactivada" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Reducción de ruido activada" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "No se puede activar la reducción de sonido mientras el volumen extra está habilitado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "No se puede activar la reducción de sonido cuando el auricular está conectado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "No se puede activar la reducción de sonido cuando los auriculares Bluetooth están activados" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "No se puede activar la reducción de sonido durante llamadas de banda ancha" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Para utilizar esta función, debe marcar optimizar EQ para mí en Ajustes de llamada" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "No se puede activar EQ de sonido de llamadas cuando el altavoz está encendido" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "No se puede activar EQ de sonido de llamadas cuando los auriculares están conectados" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "No se puede activar EQ de sonido de llamadas cuando los auriculares Bluetooth están activados" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "No se puede utilizar el intervalo de volumen extra cuando hay auriculares o un auricular BT conectados" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Llamando..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "No se puede activar EQ de sonido de llamadas mientras el volumen extra está habilitado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "No se puede habilitar EQ de sonido de llamadas durante llamadas de banda ancha" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "No se puede activar la reducción de sonido cuando el altavoz está encendido" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Llamada a grupo (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imagen guardada" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vídeo guardado" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Hacer una fotografía" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vídeo direct" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Ver contacto" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d llamadas perdidas" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Llamada perdida" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volumen extra activado" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volumen extra desactivado" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Llamada saliente reenviada" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Llamadas salientes restringidas" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Llamada transferida" + diff --git a/ui/po/es_MX.po b/ui/po/es_MX.po new file mode 100755 index 0000000..f941376 --- /dev/null +++ b/ui/po/es_MX.po @@ -0,0 +1,408 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rechazar con mensaje" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceptar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Añadir" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactos" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Retener" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Unir" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rechazar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altavoz" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Recup." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rechazar llamada con mensaje" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Finalizar todas las llamadas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Finalizar llamadas activas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auriculares" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silenciar" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Conectando..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rechazado" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Enviando..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Cambiar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Poner %s en espera" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Finalizar la llamada con %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Tonos bajos" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Tonos altos" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimizado oreja izquierda" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimizado oreja derecha" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Administrar multiconferencia" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Sonido" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Compartir" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Comp. archivo vía ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Compartir" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Llamadas" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destinatario ocupado" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Llamada finalizada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Llamada rechazada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desconectado" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Sin respuesta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Número cambiado" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "No hay número" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "En espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personas" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auricular" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Multiconferencia" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Error del sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Todas las llamadas entrantes restringidas" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Todas las llamadas salientes restringidas" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Llamada fallida" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Sólo llamadas de emergencia" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Llamada no permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Llamada restringida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvío de llamadas activo: Siempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvío de llamadas activo: Sin respuesta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvío de llamadas activo: No disponible" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvío de llamadas activo: Ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Llamada desviada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número incorrecto" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Cambiar del perfil Fuera de línea a otro perfil para acceder a los servicios de red" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Marcando..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Error al enviar. Inténtelo de nuevo" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Llamada de emergencia" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "M. Fijo activado" + +msgid "IDS_CALL_POP_HELD" +msgstr "En espera" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Error llamada en espera" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Llamada en espera no admitida" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Llamadas entrantes restringidas en el extranjero" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Error al unir" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Unión no admitida" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Red ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Red no disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "No queda crédito" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sin servicio" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operación rechazada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Llamadas internacionales salientes excepto país de origen restringidas" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Llamadas salientes internacionales restringidas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Teléfono no iniciado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Rellamando nuevamente..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servicio no permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Sólo llamadas de emergencia. Inserte tarjeta SIM para acceder a los servicios de red" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Error al separar" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Separación no admitida" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Error cambio" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Cambio no admitido" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Error de transferencia" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferencia no admitida" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "No se puede recuperar" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "No disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Recuperada" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Recuperación no admitida" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Usuario ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verificar la tarjeta SIM o insertar tarjeta SIM válida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "No se permite realizar llamadas de voz durante una videollamada" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "En espera activa" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo incorrecto" + +msgid "IDS_VCALL_POP_BATTERY_TOO_LOW_TO_MAKE_VIDEO_CALL" +msgstr "No hay suficiente batería para realizar videollamadas" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Finalizar llamadas en espera(%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receptor" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Llam. act. en espera" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memoria insuficiente. Elimine algunos elementos" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Llam. finalizada" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servicio no disponible" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Rec" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Llamada desconocida rechazada" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "en %d días" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Mañana" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Dentro de 1 semana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Aceptar la llamada después de" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Desactivar claridad de voz" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Activar claridad de voz" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "No es posible activar la reducción de ruidos mientras el volumen extra está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "No se puede activar la reducción de sonido cuando el auricular está conectado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "No se puede activar la reducción de sonido cuando el auricular Bluetooth está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "No se puede activar la reducción de sonido durante llamadas de banda ancha" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Para usar esta función, debe marcar Optimizar EQ por mí en Configuración de llamada" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "No se puede activar el EQ de sonido de llamada entrante cuando el altavoz está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "No se puede activar el EQ de sonido de llamada entrante cuando los auriculares están conectados" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "No se puede activar el EQ de sonido de llamada entrante cuando los auriculares de Bluetooth están activados" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "No se puede usar el rango de volumen extra cuando los audífonos o el auricular BT están conectados" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Llamando..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "No se puede activar el EQ de sonido de llamada mientras que el volumen extra está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "No se puede activar el EQ de sonido de llamada entrante durante las llamadas de banda ancha" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "No se puede activar la reducción de sonido cuando el altavoz está encendido" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Llam. grupo (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imagen guardada" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Video guardado" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Capturar imagen" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vid. en vivo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Ver contacto" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d llamadas perdidas" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Llamada perdida" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volumen extra activado" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volumen extra desactivado" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Llamada saliente reenviada" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Llamadas salientes restringidas" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Llamada desviada" + +msgid "IDS_VCALL_BUTTON_VIEW_CONTACT" +msgstr "Ver contacto" + diff --git a/ui/po/et.po b/ui/po/et.po new file mode 100755 index 0000000..efce42a --- /dev/null +++ b/ui/po/et.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Keeldu sõnumiga" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Nõustu" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Lisa kõne" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontaktid" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Ootele" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Liitu" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Keeldu" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Kõlar" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Vabasta" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Kõnest keeldumine sõnumiga" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Lõpeta kõik kõned" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Lõpeta aktiivne kõne (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Kõrvaklapid" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Klahvid" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Vaigista" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Ühendamine..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Keeldutud" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Saatmine..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Lülitumine" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Kõne kontaktiga %s pannakse ootele" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Kõne kontaktiga %s lõpetatakse" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Võim. madal. toone" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Võim. kõrgeid toone" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Opt.-tud vas. kõrva jaoks" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Opt.-tud par. kõrva jaoks" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Halda konverentskõnet" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Heli" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Jaga" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Jaga faili ChatONi kaudu" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Jaga" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Kõne" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Osaleja pole saadaval" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Kõne on lõpetatud" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Kõnest keelduti" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Ühendus katkestatud" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Ei vasta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Number on muutunud" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numbrit pole" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Ootel" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Inimesed" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Peakom." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Liitu konverentskõnega" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Süsteemi tõrge" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Kõik saabuvad kõned on piiratud" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Kõik väljuvad kõned on piiratud" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Kõne nurjus" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Ainult hädaabikõned" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Kõne pole lubatud" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Kõne on piiratud" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Kõnesuunamine on aktiivne: alati" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Kõnesuunamine on aktiivne: kui ei vasta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Kõne suunamine on aktiivne, kui olen kättesaamatu" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Kõne suunamine on aktiivne, kui olen hõivatud" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Kõne suunatud" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Vale number" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Kiire sisselülitus" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Ühenduse loomine..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Saatmine nurjus. Proovige uuesti" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Hädaabikõne" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Ainult FDN-kõned" + +msgid "IDS_CALL_POP_HELD" +msgstr "Ootel" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Peatamine nurjus" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Peatamist ei toetata" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Rändluse ajal on saabuvatele kõnedele seatud piirang" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Poolik" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Liitumine nurjus" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Liitumist ei toetata" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Võrk on hõivatud" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Võrk pole saadaval" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Krediit on otsas" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Teenus puudub" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Toimingust keelduti" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Väljuvad rahvusvahelised kõned v.a kodumaale on piiratud" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Väljuvad rahvusvahelised kõned on piiratud" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefoni pole lähtestatud" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Kordusvalimine..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Teenus pole lubatud" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Ainult hädaabikõne.\nSisestage SIM-kaart võrguteenustele ligipääsemiseks" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Tükeldamine nurjus" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Tükeldamist ei toetata" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Vahetamine nurjus" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Vahetamist ei toetata" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Edastamine nurjus" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Edastamist ei toetata" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Ei saa tuua" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Kättesaamatu" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Vabastatud" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Vabastamist ei toetata" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Kasutaja on hõivatud" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Kontrollige SIM-i või sisestage kehtiv SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Häälkõne ei ole videokõne ajal lubatud" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Ootamine on aktiivne" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Vale rühm" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Lõpeta ootel kõne (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Vastuvõtja" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktiivne kõne ootele" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mälu pole piisavalt. Kustutage mõned üksused" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Lõpeta" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Teenus pole saadaval" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Salv." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Tundmatust kõnest keelduti" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d päeva pärast" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Homme" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Nädala pärast" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Nõustu kõnega" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Müravähendus väljas" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Müravähendus sees" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Müravähendust ei saa sisse lülitada, kui lisahelitugevus on aktiveeritud" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Müravähendust ei saa sisse lülitada, kui kõrvaklapid on ühendatud" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Müravähendust ei saa sisse lülitada, kui Bluetooth-peakomplekt on sees" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Müravähendust ei saa lairibakõnede ajal sisse lülitada" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Selle funktsiooni kasutamiseks peate kõneseadetes märgistama valiku Optimeeri EQ minu jaoks" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Kõneaegse heli EQ-d ei saa aktiveerida, kui valjuhääldi on sees" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Kõneaegse heli EQ-d ei saa aktiveerida, kui kõrvaklapid on ühendatud" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kõneaegse heli EQ-d ei saa aktiveerida, kui Bluetooth-peakomplekt on sees" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Lisahelitugevuse ulatust ei saa kasutada, kui ühendatud on kõrvaklapid või BT-peakomplekt" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Helistamine..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kõneaegse heli EQ-d ei saa aktiveerida, kui lisahelitugevus on aktiveeritud" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Kõneaegse heli EQ-d ei saa lairibakõnede ajal aktiveerida" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Müravähendust ei saa sisse lülitada, kui valjuhääldi on sees" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Rühmakõne (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Salvestatud pilt" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Salvestatud video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Pildista" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Otsevideo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Kuva kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d vastamata kõnet" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Vastamata kõne" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Lisahelitugevus on aktiveeritud" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Lisahelitugevus on desaktiveeritud" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Väljuv kõne on edastatud" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Väljuvad kõned on piiratud" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Ümbersuunatud kõne" + diff --git a/ui/po/eu.po b/ui/po/eu.po new file mode 100755 index 0000000..bd5832f --- /dev/null +++ b/ui/po/eu.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Ukatu mezuaz" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Onartu" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Gehi. deia" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontaktuak" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Mantendu" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Elkartu" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Ukatu" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Bozgor." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Berreskuratu" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Ezetsi mezudun deia" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Amaitu dei guztiak" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Amaitu aktibo dauden deiak (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Aurikularrak" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teklatua" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Isilarazi" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Konektatzen" + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Ezetsita" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Bidaltzen" + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Aldatu" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s zain jartzen" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "%s-rekin deia amaitzen" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Bultzatu t. baxuak" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Bultzatu t. altuak" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Ezk. belarrirako optim." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Belarri esk. optimizatua" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Kudeatu konferentzia deia" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Soinua" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Partekatu" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Partekatu fitx. ChatON bidez" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Partekatu" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Deitu" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Harzailea ez eskuragarri" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Deia amaituta" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Deia ukatuta" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Deskonketatuta" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Erantzunik ez" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Zenbakia aldatu egin da" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Zenbakia ez dago" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Egonean" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Jendea" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Entzung" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Hizketaldi deia" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistemaren errorea" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Sarrera dei guztiak mugatuta" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Irteera dei guztiak mugatuta" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Akatsa deitzerakoan" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Larrialdi deiak bakarrik" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Dei ez onartua" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Deia mugatuta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Dei aktiboaren desbideratzea: Beti" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Dei aktiboaren desbideratzea: Erantzunik ez" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Dei aktiboaren desbideratzea: Estalduratik kanpo" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Dei aktiboaren desbideratzea: Okupatuta dagoenean" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Deia desbideratuta" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Zenbaki okerra" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Lineaz kanpo profiletik sarera sarrera duen profil batetara aldatu" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Markatzen..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Bidaltzeak huts egin du. Berriro saiatu" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Emergentzia deia" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN deiak soilik" + +msgid "IDS_CALL_POP_HELD" +msgstr "Egonean" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Akatsa egonean jartzean" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Ez da bateragarria Egonean moduarekin" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Ibiltaritzan sarrerako deiak blokeatuta" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Osatu gabe" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Akatsa elkartzean" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Elkarketa ez da bateragarria" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Sarea okupatuta" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Sarea ez dago eskuragarri" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Ez da krediturik gelditzen" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Zerbitzurik gabe" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Eragiketa ukatuta" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Nazioarteko irteera-deiak debekatuta, etxekoak izan ezik" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Irteerako nazioarteko deiak mugatuta" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefonoa ez da abiarazi" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Birmarkatzen..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Zerbitzua ez da onartzen" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Larrialdi deiak bakarrik.\nSIM txartela sartu sareko zerbitzuetara sartzeko" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Akatsa bereiztean" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Bereizketa ez da bateragarria" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Akatsa trukatzean" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Trukatzea ez da bateragarria" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Akatsa transferitzean" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferentzia ez da bateragarria" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Ezin da berreskuratu" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Ez dago eskuragarri" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Egonean amaitu" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Berreskuratzea ez da bateragarri" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Erabiltzailea okupatuta" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Egiaztatu SIM edo adierazi SIM zuzena" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Ezin da ahots bidezko deirik egin bideo-dei baten bitartean" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Itxaroten aktibo" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Okerreko taldea" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Amaitu atxikita dauden deiak (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Jasotzailea" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Eutsi dei aktiboa" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ez dago memoria nahikoa. Elementu batzuk ezabatu" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Deia amaitu" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Zerbitzua ez dago eskuragarri" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Grab." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Dei ezezaguna ukatuta" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "hemendik %d egunetara" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Bihar" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Astebetean" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Onartu deia ondoren" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Zarata murriztekoa itzalita" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Zaratak murriztekoa piztuta" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ezin da zarata murriztailea piztu bolumen gehigarria gaituta badago" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Ezin da zarata murriztailea piztu entzungailua konektatuta badago" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Ezin da zarata murriztailea piztu Bluetooth-en aurikularra piztuta badago" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Ezin da zarata murriztailea piztu banda zabaleko deiak egin bitartean" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Funtzio hau erabiltzeko, optimizatutako EQ egiaztatu behar duzu Deien ezarpenetan" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Ezin da sarrera deien soinu EQ gaitu bozgorailua piztuta badago" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Ezin da sarrera deien soinu EQ gaitu aurikularrak konektatuta badaude" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Ezin da sarrera deien soinu EQ gaitu Bluetooth aurikularra piztuta badago" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Ezin da bolumen gehigarri tartea erabili aurikularrak edo BT aurikularrak konektatuta badaude" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Deitzen..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ezin da sarrera deien soinu EQ gaitu bolumen osagarria gaituta dagoenean" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Ezin da sarrera deien soinu EQ gaitu banda zabaleko deiak egitean" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Ezin da zarata murriztailea piztu bozgorailua piztuta badago" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Talde deia (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Gordetako irudia" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Gordetako bideoa" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Atera argazkia" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Zuzen. bideoa" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Ikusi kontak." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d galdutako dei" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Galdutako deia" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Bolumen osagarria gaituta" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Bolumen osagarria ezgaituta" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Irteerakoa berbidalia" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Irteerako deiak blokeatuta" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Birbidalitako deia" + diff --git a/ui/po/fi.po b/ui/po/fi.po new file mode 100755 index 0000000..55c15f2 --- /dev/null +++ b/ui/po/fi.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Hylkää viestillä" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Vastaa" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Lisää puh." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Yhteystiedot" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Pitoon" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Liity" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Hylkää" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Kaiutin" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "P. pito" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Hylkää puhelu viestillä" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Lopeta kaikki puhelut" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Lopeta aktiiviset puhelut (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Kuulokkeet" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Nronäpp." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Mykistä" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Yhdistetään..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Hylätty" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Lähetetään..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Vaihda" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s on asetettu pitoon" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Puhelu on lopetettu henkilön %s kanssa" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Korosta mat. ääniä" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Korosta kork. ääniä" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimoitu vas. korvalle" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimoitu oik. korvalle" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Hallitse konferenssipuhelua" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Ääni" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Jaa" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Jaa tiedosto ChatONilla" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Jaa" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Puhelu" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Vastap. ei saatavilla" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Puhelu päättyi" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Puhelu hylätty" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Yhteys katkaistu" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Ei vastausta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numero muuttunut" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numeroa ei ole" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Pidossa" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Ihmiset" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Kuuloke" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Neuvottelupuhelu" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Järjestelmävirhe" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Kaikki saapuvat puhelut estetty" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Kaikki lähtevät puhelut estetty" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Puhelu epäonnistui" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Vain hätäpuhelut" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Puhelua ei sallita" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Puhelu estetty" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Soitonsiirto käytössä: Aina" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Soitonsiirto käytössä: Ei vastausta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Soitonsiirto käytössä: Ei tavoitettavissa" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Soitonsiirto käytössä: Varattu" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Puhelu siirretty" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Väärä numero" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Vaihda Offline-profiilista toiseen profiiliin verkkopalveluita varten" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Soitetaan..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Lähetys epäonnistui. Yritä uudelleen" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Hätäpuhelu" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Puhelut vain sallittuihin numeroihin" + +msgid "IDS_CALL_POP_HELD" +msgstr "Pidossa" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Pito epäonnistui" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Pitoa ei tueta" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Saapuvat puhelut estetty verkkovierailun aikana" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Keskeneräinen" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Liittäminen epäonnistui" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Liittämistä ei tueta" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Verkko varattu" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Verkko ei saatavilla" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kustannusraja täysi" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Ei palvelua" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Toiminto torjuttu" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Lähtevät ulkomaanpuhelut estetty, paitsi kotiin" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Lähtevät ulkomaanpuhelut estetty" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Puhelinta ei ole alustettu" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Soitetaan uudelleen..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Palvelu ei ole sallittu" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Vain hätäpuhelut.\nPääset verkkopalveluihin asettamalla SIM-kortin paikalleen" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Jako epäonnistui" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Jakoa ei tueta" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Vaihto epäonnistui" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Vaihtoa ei tueta" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Siirtovirhe" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Siirtoa ei tueta" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Tietoja ei voi noutaa" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Ei käytettävissä" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Palautettu pidosta" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Pidosta palautusta ei tueta" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Käyttäjä varattu" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Tarkista SIM-kortti tai aseta kelvollinen SIM-kortti" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Äänipuhelua ei sallita videopuhelun aikana" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Koputus on päällä" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Väärä ryhmä" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Lopeta pidossa olevat puhelut (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Vastaanotin" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Akt. puhelu pitoon" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Muisti ei riitä. Poista joitain kohteita" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Lo. puh" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Palvelu ei ole saatavilla" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Tall." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Tuntematon puhelu hylätty" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d päivän kuluttua" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Huomenna" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Viikon kuluttua" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Hyväksy puhelu, kun" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Kohinanvaimennus ei käytössä" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Kohinanvaimennus käytössä" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kohinanvaimennusta ei voi ottaa käyttöön, kun lisävoimakkuus on käytössä" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Kohinanvaimennusta ei voi ottaa käyttöön, kun kuuloke on kytkettynä" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kohinanvaimennusta ei voi ottaa käyttöön, kun Bluetooth-kuulokkeet ovat käytössä" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Kohinanvaimennusta ei voi ottaa käyttöön laajakaistapuheluiden aikana" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Jos haluat käyttää tätä toimintoa, valitse Puheluasetukset-kohdasta Optimoi taajuuskorjain minua varten" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Puhelun taajuuskorjainta ei voi ottaa käyttöön, kun kaiutin on käytössä" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Puhelun taajuuskorjainta ei voi ottaa käyttöön, kun kuulokkeet ovat kytkettyinä" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Puhelun taajuuskorjainta ei voi ottaa käyttöön, kun Bluetooth-kuulokemikrofoni on käytössä" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Lisävoimakkuusaluetta ei voi käyttää, kun kuulokkeet tai Bluetooth-kuulokemikrofoni on yhdistetty" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Soitetaan..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Puhelun taajuuskorjainta ei voi ottaa käyttöön, kun lisävoimakkuus on käytössä" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Puhelun taajuuskorjainta ei voi ottaa käyttöön laajakaistapuheluiden aikana" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Kohinanvaimennusta ei voi ottaa käyttöön, kun kaiutin on käytössä" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Ryhmäpuhelu (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Tallennettu kuva" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Tallennettu video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Ota kuva" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Suora video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Näytä yhteyst." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d vastaamatonta puhelua" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Vastaamaton puhelu" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Lisävoimakkuus käytössä" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Lisävoimakkuus poistettu käytössä" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Lähtevä puhelu siirretty" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Lähtevät puhelut estetty" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Siirretty puhelu" + diff --git a/ui/po/fr_CA.po b/ui/po/fr_CA.po new file mode 100755 index 0000000..7351eb3 --- /dev/null +++ b/ui/po/fr_CA.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Refus avec message" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accepter" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ajouter un appel" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Attente" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Joindre" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Refuser" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "HP" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Récup." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rejeter l'appel avec message" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Terminer tous les appels" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Terminer appels actifs (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Écouteurs" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Clavier" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Muet" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connexion ..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejeté" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Envoi ..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Changement appli." + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Mettre %s en attente" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Mettre fin à l'appel avec %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Augmenter tons bas" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Augm. tons élevés" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimisé pr oreille gche" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimisé pr oreille dte" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Gérer la conférence téléphonique" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Son" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Partager" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Partager fich. via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Partager" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Appels" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Appelé indisponible" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Appel terminé" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Appel refusé" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Déconnecté" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Aucune réponse" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numéro modifié" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Le numéro n'existe pas." + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "En attente" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personnes" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Casque" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conférence téléphonique" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erreur système" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Tous appels entrants interdits" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Tous appels sortants interdits" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Échec de l'appel" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Appels d'urgence uniquement" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Appel non autorisé" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Appel interdit" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Renvoi d'appel activé : Toujours" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Renvoi d'appel activé : Aucune réponse" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Renvoi d'appel activé : Injoignable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Renvoi d'appel activé : Occupé" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Appel renvoyé" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Numéro incorrect" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Désactivez le profil hors ligne et sélectionnez-en un autre pour utiliser les services réseau" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Composition..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Échec de l'envoi. Réessayez ultérieurement" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Appel d'urgence" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Appels de numéros autorisés uniquement" + +msgid "IDS_CALL_POP_HELD" +msgstr "En attente" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Échec de mise en attente" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Mise en attente non prise en charge" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Appels entrants interdits en itinérance" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Non terminé" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Échec conférence" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Conférence non prise en charge" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Réseau occupé" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Réseau non disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Crédit épuisé" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Aucun service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Opération refusée" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Appels internationaux sortants interdits sauf à domicile" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Appels internationaux sortants interdits" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Téléphone non initialisé" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Numérotation..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service non autorisé" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Appel d'urgence uniquement.\nInsérez la carte SIM pour accéder aux services réseau" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Échec appel isolé" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Appel isolé non pris en charge" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Échec permut." + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Permutation non prise en charge" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Erreur de transfert" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfert non pris en charge" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Récupération impossible" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Non disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Récupérer" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Récupération non prise en charge" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "utilisateur occupé" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Vérifiez la carte SIM ou insérez-en une valide" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Appel vocal non autorisé pendant un appel vidéo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "En attente" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Groupe incorrect" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Terminer appels en attente (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Destinataire" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Mettre en attente" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mémoire insuffisante. Supprimez certains éléments" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Fin d'appel" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service non disponible" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "ENREG" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Appelant inconnu refusé" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "dans %d jours" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Demain" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Dans une semaine" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Accepter l'appel après" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Désactiver réduction du bruit" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Activer réduction du bruit" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossible d'activer la réduction du bruit lorsque la fonction de volume supplémentaire est activée" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Impossible d'activer la réduction du bruit si l'écouteur est branché" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossible d'activer la réduction du bruit lorsque le casque Bluetooth est activé" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Impossible d'activer la réduction du bruit pendant des appels large bande" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Pour utiliser cette fonction, vous devez cocher Optimiser l'égaliseur pour moi dans les paramètres d'appel" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque le hautparleur est activé" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque les écouteurs sont branchés" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque le casque Bluetooth est activé" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Impossible d'utiliser la fonction de volume supplémentaire lorsque des écouteurs ou le casque BT sont branchés" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Appel ..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque la fonction de volume supplémentaire est activée" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Impossible d'activer l'égaliseur de son pendant les appels large bande" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Impossible d'activer la réduction du bruit si le hautparleur est activé" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Appel de groupe (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Image enregistrée" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vidéo enregistrée" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Prendre une photo" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vidéo direct" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Aff. Contacts" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d appels manqués" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Appel manqué" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volume supplémentaire activé" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volume supplémentaire désactivé" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Appel sortant transféré" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Appels sortants interdits" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Appel renvoyé" + diff --git a/ui/po/fr_FR.po b/ui/po/fr_FR.po new file mode 100755 index 0000000..0f113c6 --- /dev/null +++ b/ui/po/fr_FR.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Refus avec message" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accepter" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ajouter" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacts" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Attente" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Rejoindre" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Refuser" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "HP" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Récup." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rejeter l'appel avec message" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Terminer tous les appels" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Terminer appels actifs (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Écouteurs" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Clavier" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Muet" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connexion..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejeté" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Envoi..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Changement appli." + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Mettre %s en attente" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Mettre fin à l'appel avec %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Augmenter tons bas" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Augm. tons élevés" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimisé pr oreille gche" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimisé pr oreille dte" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Gérer la conférence" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Son" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Partager" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Partager fich. via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Partager" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Appels" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Contact indisponible" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Fin d'appel" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Appel rejeté" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Déconnecté" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Aucune réponse" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numéro modifié" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Le numéro n'existe pas." + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Attente" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personnes" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Casque" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conférence téléphonique" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erreur système" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Tous appels entrants interdits" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Tous appels sortants interdits" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Échec de l'appel" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Appels d'urgence uniquement" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Appel non autorisé" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Appel restreint" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Renvoi d'appel activé : Toujours" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Renvoi d'appel activé : Aucune réponse" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Renvoi d'appel activé : Injoignable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Renvoi d'appel activé : Occupé" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Appel transféré" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Numéro incorrect" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Quittez le profil hors-ligne pour les services radio" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Composition..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Échec de l'envoi. Réessayez ultérieurement" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Appel d'urgence" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Appels FDN uniquement" + +msgid "IDS_CALL_POP_HELD" +msgstr "En attente" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Échec de mise en attente" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Mise en attente non supportée" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Appels entrants interdits en itinérance" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Non terminé" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Échec conférence" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Conférence non supportée" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Réseau occupé" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Réseau non disponible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Crédit épuisé" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Aucun service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Opération refusée" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Appels internationaux sortants interdits sauf vers pays d'origine" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Appels internationaux sortants interdits" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Téléphone non initialisé" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Rappel..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Service non autorisé" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Appel d'urgence uniquement.\nInsérez la carte SIM pour accéder aux services réseau" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Échec appel isolé" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Appel isolé non supporté" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Échec permut." + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Permutation non supportée" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Échec du transfert" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfert non supporté" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Récupération impossible" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Non disponible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Récupération" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Récupération non supportée" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Occupé" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Vérifiez la carte SIM ou insérez-en une valide" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Appel vocal non autorisé pendant un appel visio" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "En attente" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Groupe incorrect" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Terminer appels en attente (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Destinataire" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Mettre en attente" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mémoire insuffisante. Supprimez certains éléments" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Fin" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service non disponible" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "ENREG" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Appelant inconnu rejeté" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "dans %d jours" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Demain" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Dans une semaine" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Accepter l'appel après" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Désactiver réduction du bruit" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Activer réduction du bruit" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossible d'activer la réduction du bruit lorsque la fonction de volume supplémentaire est activée" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Impossible d'activer la réduction du bruit si l'écouteur est branché" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossible d'activer la réduction du bruit lorsque le casque Bluetooth est activé" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Impossible d'activer la réduction du bruit pendant des appels large bande" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Pour utiliser cette fonction, vous devez cocher Optimiser l'égaliseur pour moi dans les paramètres d'appel" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque le haut-parleur est activé" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque les écouteurs sont connectés" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque le casque Bluetooth est activé" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Impossible d'utiliser la fonction de volume supplémentaire lorsque des écouteurs ou le casque BT sont connectés" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Appel..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossible d'activer l'égaliseur de son des appels en cours lorsque la fonction de volume supplémentaire est activée" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Impossible d'activer l'égaliseur de son pendant les appels large bande" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Impossible d'activer la réduction du bruit si le haut-parleur est activé" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Appel de groupe (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Image enregistrée" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vidéo enregistrée" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Prendre une photo" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vidéo direct" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Aff. contact" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d appels manqués" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Appel manqué" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volume supplémentaire activé" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volume supplémentaire désactivé" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Appel sortant transféré" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Appels sortants interdits" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Appel transféré" + diff --git a/ui/po/ga.po b/ui/po/ga.po new file mode 100755 index 0000000..29a7e8a --- /dev/null +++ b/ui/po/ga.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Diúltaigh dó le teachtaireacht" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Glac leis" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Glao leis" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Teagmhálaithe" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Ar Fionraí" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Nasc" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Diúltaigh" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Callaire" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Fionraí as" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Diúltaigh do ghlao le teachtaireacht" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Scoir gach glao" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Críochnaigh glaonna gníomhacha (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Cluasáin" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Eochaircheap" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Balbh" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Ag nascadh..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Diúltaithe" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Ag seoladh..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Aistrigh" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s á chur ar fionraí" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "An glao ar %s á chríochnú" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Treisigh toin ísle" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Treisigh toin arda" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Bfheabhsú do chluas chlé" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Bfheabhsú do chluas dheas" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Bainistigh glao comhdhála" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Fuaim" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Comhroinn" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Comhroinn comhad le ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Comhroinn" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Glaoigh" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Níl an páirtí ar a glaodh ann" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Glao scortha" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Glao diúltaithe" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Dínasctha" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Níl freagra ann" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Uimhir athraithe" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Níl an uimhir ann" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Ar fionraí" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Daoine" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Gléas cinn" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Glao comhdhála" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Earráid córais" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Cosc ar gach glao isteach" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Cosc ar gach glao amach" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Theip ar an nglao" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Glaonna éigeandála amháin" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Glao neamhcheadaithe" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Glao urchoiscthe" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Claonadh glaonna gníomhach: I gcónaí" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Claonadh glaonna gníomhach: Níl freagra ann" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Claonadh glaonna gníomhach: Doshroicthe" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Claonadh glaonna gníomhach: Agus an líne gafa" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Glao claonta" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Uimhir chontráilte" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Athraigh ó phróifíl As Líne go próifíl eile le haghaidh seirbhísí líonra" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Ag diailiú..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Theip ar sheoladh. Triail arís" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Glao éigeandála" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Glaonna FDN amháin" + +msgid "IDS_CALL_POP_HELD" +msgstr "Ar fionraí" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Theip Fionraigh" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Fionraigh gan tacú" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Cosc ar ghlaonna isteach le linn fánaíochta" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Neamhiomlán" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Theip ar dhul isteach leis" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Gabh Isteach Leis gan tacú" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Líonra gnóthach" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Níl líonra ar fáil" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Níl creidmheas fágtha" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Níl seirbhís ann" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Diúltaíodh an oibríocht" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Cosc ar ghlaonna idirnáisiúnta amach seachas abhaile" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Cosc ar ghlaonna idirnáisiúnta amach" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Níl an fón túsaithe" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ag athdhiailiú..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Seirbhís neamhcheadaithe" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Glao SOS amháin.\nIonsáigh cárta SIM chun seirbhísí líonra a rochtain" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Theip ar Scoilt" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Scoilt gan tacú" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Theip ar mhalartú" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Malartú gan tacú" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Theip ar aistriú" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Aistrigh gan tacú" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Ní féidir aisghabháil" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Níl sé ar fáil" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Dífhionraithe" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Dífhionraigh gan tacú" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Úsáideoir gafa" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Fíordheimhnigh SIM nó ionsáigh SIM bailí" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Níl glao gutha ceadaithe le linn glao físe" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Feitheamh gníomhach" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grúpa contráilte" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Críochnaigh glaonna ar fionraí (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Faighteoir" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Fionraigh glao gníomhach" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Easpa cuimhne. Scrios roinnt míreanna" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Scoir glao" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Níl seirbhís ar fáil" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "TAIF" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Glao anaithnid diúltaithe" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "i gceann %d lá" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Amárach" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "I gceann seachtaine" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Glac leis an nglao tar éis" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Laghdú fuaime as" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Laghdú fuaime ar siúl" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ní féidir laghdú fuaime a chasadh air agus airde bhreise cumasaithe" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Ní féidir laghdú fuaime a chasadh air agus an cluasán ceangailte" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Ní féidir laghdú fuaime a chasadh air agus gléas cinn Bluetooth air" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Ní féidir laghdú fuaime a chasadh air le linn glaonna leathanbhanda" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Leis an bhfeidhm seo a úsáid, ní mór duit tic a chur le 'Barrfheabhsaigh EQ domsa' faoi shocruithe glao" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Ní féidir EQ fuaime le linn glaoch a chumasú agus an callaire ar siúl" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Ní féidir EQ fuaime le linn glaoch a chumasú agus cluasáin nasctha" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Ní féidir EQ fuaime le linn glaoch a chumasú agus gléas cinn Bluetooth ar siúl" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Ní féidir raon airde breise a úsáid agus cluasáin nó gléas cinn BT ceangailte" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Ag glaoch..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ní féidir an cothromóir fuaime le linn glao a chumasú agus airde bhreise cumasaithe" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Ní féidir an fhuaim EQ le linn glao a chumasú le linn glaonna leathanbhanda" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Ní féidir laghdú fuaime a chasadh air agus an callaire air" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Glao grúpa (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Íomhá shábháilte" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Físeán sábháilte" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Glac pictiúr" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Físeán beo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Amhc ar theagmh." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d glaonna a cailleadh" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Glao caillte" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Airde bhreise cumasaithe" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Airde bhreise díchumasaithe" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Glao amach curtha ar aghaidh" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Cosc ar ghlaonna amach" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Glao seolta ar aghaidh" + diff --git a/ui/po/gl.po b/ui/po/gl.po new file mode 100755 index 0000000..0091531 --- /dev/null +++ b/ui/po/gl.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rexeitar con mensaxe" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceptar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Eng cham" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactos" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "En esp." + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Unirse" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rexeitar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altof." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Des. esp." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rexeitar chamada con mensaxe" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Finalizar todas as cham." + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Finalizar chamadas activas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auriculares" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silenc." + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Conectando..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rexeitada" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Enviando..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Cambiar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Colocando a %s en espera" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Finalizando chamada con %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Potenc. tons baixos" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Potenc. tons altos" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimiz. para orella esq." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimiz. para orella der." + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Xestionar chamada de conferencia" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Son" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Compartir" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Compar. arquivo por ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Compartir" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Chamar" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destin. non dispoñib." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Chamada finalizada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Chamada rexeitada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desconectado" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Sen resposta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Cambiou o número" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "O número non existe" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "En espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Xente" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auric." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Multiconferencia" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erro do sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Todas as chamadas entrantes restrinxidas" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Todas as chamadas saíntes restrinxidas" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Erro de chamada" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Só chamadas de urxencia" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Chamada non permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Chamada restrinxida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvío de chamadas: Sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvío de chamadas: Sen resposta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvío de chamadas: Non localizable" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvío de chamadas: Cando estea ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Chamada desviada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número incorrecto" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Cambiar de Fóra de liña a outro perfil para servizos de rede" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Marcando..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Erro de envío. Volva intentalo" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Chamada de urxencia" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Só chamadas FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "En espera" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Erro na chamada en espera" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Chamada en espera non admitida" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Chamadas entrantes restrinxidas durante a itineracia" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleta" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Erro ao unirse" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Unión non admitida" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Rede ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Rede non dispoñible" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Non queda crédito" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sen servizo" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operación rexeitada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Chamadas internacionais saíntes restrinxidas agás as do país de orixe" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Chamadas internacionais saíntes restrinxidas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Teléfono non inicializado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Volvendo chamar..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servizo non permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Só chamadas de SOS.\nInsira a tarxeta SIM para acceder aos servizos de rede" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Erro ao separar" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Separación non admitida" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Erro ao cambiar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Cambio non admitido" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Erro de transferencia" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferencia non admitida" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Non se pode recuperar" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Non dispoñible" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Desactivar en espera" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Recuperación non admitida" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Usuario ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verificar SIM ou inserir SIM válida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Non se permite a chamada de voz durante a chamada de vídeo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "En espera activa" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo erróneo" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Finalizar chamadas en espera (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Auricular" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Manter chamada act." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Non hai suficiente memoria. Elimine algúns elementos" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Finalizar cham." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servizo non dispoñible" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Grav" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Chamada descoñecida rexeitada" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "en %d días" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Mañá" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Nunha semana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Aceptar chamada despois de" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Redución de ruído desactivada" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Redución de ruído activada" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Non se pode activar a redución de ruído mentres se atopa activado o volume extra" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Non se pode activar a redución de ruído cando o auricular está conectado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Non se pode activar a redución de ruído cando o auricular Bluetooth está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Non se pode activar a redución de ruído durante as chamadas de banda ancha" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Para usar esta función, tes que seleccionar Optimizar EQ para min en Axustes das chamadas" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Non se pode activar o EQ de son de chamadas entrantes cando o altofalante está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Non se pode activar o EQ de son de chamadas entrantes cando os auriculares están conectados" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Non se pode activar o EQ de son de chamadas entrantes cando os auriculares Bluetooth están activados" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Non se pode usar o rango de volume extra cos auriculares ou os auriculares de BT conectados" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Chamando..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Non se pode activar o EQ de son de chamadas entrantes co volume extra activado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Non se pode activar o ecualizador de son de chamadas durante as chamadas de banda ancha" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Non se pode activar a redución de ruído cando o altofalante está activado" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Chamada grupo (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imaxe gardada" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vídeo gardado" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Facer unha foto" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vídeo direc." + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Ver contacto" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d chamadas perdidas" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Chamada perdida" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volume extra activado" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volume extra desactivado" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Chamada saínte reenviada" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Chamadas saíntes restrinxidas" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Chamada reenviada" + diff --git a/ui/po/hi.po b/ui/po/hi.po new file mode 100755 index 0000000..dc3a428 --- /dev/null +++ b/ui/po/hi.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "सन्देश से अस्वीकारें" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "स्‍वीकारें" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "कॉल जोड़ें" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "सं‍पर्क" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "होल्ड" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "शामिल हों" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "अस्वीकारें" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "स्पीकर" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "अनहोल्‍ड करें" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "सन्देश के साथ कॉल अस्वीकारें" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "सभी कॉल्‍स समाप्‍त करें" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "सक्रिय कॉल्‍स समाप्त करें (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "हेडफ़ोन्‍स" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "कीपैड" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "मूक" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "जोड़ा जा रहा है…" + +msgid "IDS_CALL_POP_REJECTED" +msgstr "अस्‍वीकृत" + +msgid "IDS_CALL_POP_SENDING" +msgstr "भेजा जा रहा है…" + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "स्विच करें" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s को प्रतीक्षा में रख रहे है" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "%s सह कॉल समाप्त किया जा रहा है" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "बूस्‍ट लो टोन्‍स" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "बूस्‍ट हाइ टोन्‍स" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "बाएँ कान के लिए अनुकूलित" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "दाएँ कान के लिए अनुकूलित" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "कॉन्‍फ़्रेंस कॉल व्यवस्थापित करें" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "ध्वनि" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "शेयर करें" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "ChatON के द्वारा फ़ाइल साझा करें" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "शेयर करें" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "कॉल" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "कॉल्ड पार्टी नहीं है" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "कॉल समाप्त" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "कॉल निरस्त" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "डिस्कनेक्ट हुआ" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "कोई उत्तर नहीं" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "नंबर बदला गया" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "नंबर मौजूद नहीं" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "होल्‍ड पर है" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "लोग" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "हेडसेट" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "कॉन्‍फ़्रेंस कॉल" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "सिस्‍टम त्रुटि" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "सभी आने वाली कॉलें बाधित हैं" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "सभी बाहर जाने वाली कॉलें प्रतिबंधित हैं" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "कॉल असफल" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "केवल आपात कॉलें" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "कॉल की अनुमति नहीं" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "कॉल प्रतिबन्धित" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "कॉल अंतरित करें: हमेशा" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "कॉल अंतरित करें: कोई उत्तर नहीं" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "कॉलें डायवर्ट: पहुँच से बाहर" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "कॉल अंतरित करें: जब व्यस्त हों" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "कॉल अंतरित हुई" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "गलत नंबर" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "नेटवर्क सेवाओं के लिए Offline से दूसरी प्रोफ़ाइल में बदलें" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "डायल हो रहा है…" + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "भेजना विफल। फिर से कोशिश करें" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "आपातकाल कॉल" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "केवल FDN कॉल्स" + +msgid "IDS_CALL_POP_HELD" +msgstr "आयोजित" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "होल्ड विफल हुआ" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "होल्ड को सपोर्ट नहीं किया गया" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "रोमिंग में इनकमिंग कॉल प्रतिबंधित" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "अपूर्ण" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "शामिल होना विफल" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "शामिल होना असमर्थित" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "नेटवर्क व्यस्त" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "नेटवर्क उपलब्ध नहीं" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "क्रेडिट नहीं बचा" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "कोई सेवा नहीं" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "कार्रवाई अस्वीकृत" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "सिवाय घर के आउटगोइंग अंतर्राष्ट्रीय कॉलें प्रतिबन्धित हैं" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "आउटगोइंग अंतरराष्‍ट्रीय कॉल्स प्रतिबंधित" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "फ़ोन स्थापित नहीं किया गया" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "पुनः डायल किया जा रहा है..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "सेवा की अनुमति नहीं" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "केवल आपातकाल कॉल\n नेटवर्क सेवाएं प्राप्त करने के लिए सिम कार्ड डालें" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "स्प्लिट विफल" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "स्प्लिट समर्थित नहीं है" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "स्‍वैप करना विफल" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "स्‍वैप असमर्थित" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "स्‍थानांतरण विफल" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "स्‍थानांतरण असमर्थित" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "पुनःप्राप्ति में अक्षम" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "उपलब्ध नहीं" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "होल्ड नहीं" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "अनहोल्‍ड असमर्थित" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "उपभोक्ता व्यस्त" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "सिम सत्‍यापित करें या मान्‍य सिम डालें" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "वीडियो कॉल के दौरान वॉइस कॉल की अनुमति नहीं है" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "प्रतीक्षा सक्रिय" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "ग़लत समूह" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "हेल्ड कॉल्‍स समाप्त करें (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "प्राप्तकर्ता" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "सक्रिय कॉल होल्ड करें" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "पर्याप्त मेमोरी नहीं। कुछ मदें हटाएँ" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "कॉल समाप्‍त" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "सेवा अनुपलब्ध" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "रिक." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "अज्ञात कॉल अस्‍वीकृत" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d दिनों में" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "कल" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "एक सप्ताह में" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "इस के बाद कॉल स्वीकारें" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "शोर घटाना बंद" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "शोर घटाना शुरू" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "अतिरिक्त वॉल्यूम सक्षम के दौरान शोर में कमी चालू करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "इयरफ़ोन कनेक्ट किए जाने पर शोर में कमी चालू करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "ब्लूटूथ हेडसेट चालू होने पर शोर में कमी चालू करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "वाइडबैंड कॉलों के दौरान शोर में कमी चालू करने में अक्षम" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "इस फ़ंक्‍शन का उपयोग करने के लिए, आपको कॉल सेटिंग्स के तहत मेरे लिए EQ अनुकूलित करें चेक करना होगा" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "जब स्पीकर चालू हो तब कॉल-में ध्वनि EQ सक्षम करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "जब इयरफ़ोन्स कनेक्ट किए गएँ हो तब कॉल-में ध्वनि EQ सक्षम करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "जब ब्‍लूटूथ हेडसेट चालू हो तब कॉल-में ध्वनि EQ सक्षम करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "अतिरिक्त वॉल्यूम रेंज उपयोग करने में अक्षम जब इयरफ़ोन्स या ब्लूटूथ हेडसेट कनेक्ट है" + +msgid "IDS_CALL_POP_CALLING" +msgstr "कॉल कर रहा है..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "अतिरिक्त वॉल्यूम सक्षम होने पर कॉल-में ध्वनि EQ सक्षम करने में असमर्थ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "वाइडबैंड कॉल्‍स के दौरान कॉल-में ध्वनि EQ सक्षम करने में अक्षम" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "स्पीकर चालू होने पर शोर में कमी चालू करने में अक्षम" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "समूह कॉल (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "सुरक्षित की गई छवि" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "सुरक्षित किया गया वीडियो" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "कोई तस्वीर लें" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "लाइव वीडियो" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "संपर्क देखें" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d छूटी कॉल्स" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "छूटी कॉल" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "अतिरिक्त वॉल्यूम सक्षम किया गया" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "अतिरिक्त वॉल्यूम अक्षम किया गया" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "बाहर जाने वाली कॉल अग्रेषित की गई" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "बाहर जाने वाली कॉलें प्रतिबन्धित हैं" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "फ़ॉरवर्ड किया हुआ कॉल" + diff --git a/ui/po/hr.po b/ui/po/hr.po new file mode 100755 index 0000000..b2f3b1f --- /dev/null +++ b/ui/po/hr.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Odbij s porukom" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Prihvati" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Dodaj poziv" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Imenik" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Čekanje" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Pridruži" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Odbaci" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Zvučnik" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Preuzmi" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Odbaci poziv porukom" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Prekini sve pozive" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Prekini aktivne pozive (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Slušalice" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tipkovnica" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Bešumno" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Spajanje..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Odbačeno" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Slanje..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Promjena" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Staviti %s na čekanje" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Prekidanje poziva s %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Poj. niske tonove" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Poj. visoke tonove" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimizir. za lijevo uho" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimizirano za desno uho" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Upravljanje konferencijskim pozivom" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Zvuk" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Dijeli" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Dijeli datot. putem ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Dijeli" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Poziv" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Pozvana osoba nedostupna" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Poziv završen" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Poziv odbijen" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Odspojeno" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nema odgovora" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Broj promijenjen" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Broj ne postoji" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Na ček." + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Ljudi" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Slušalica" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferencijski poziv" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Pogreška sustava" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Svi dolazni pozivi zabranjeni" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Svi odlazni pozivi zabranjeni" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Poziv neuspješan" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Samo SOS pozivi" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Poziv nedopušten" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Poziv zabranjen" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Preusmjeri pozive: Uvijek" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Preusmjeri pozive: Bez odgovora" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Preusmjeri pozive: Nedostupno" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Preusmjeri pozive: Zauzeto" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Poziv preusmjeren" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Neispravan broj" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Promijenite iz profila Bez mreže u neki drugi za pristup mrežnim uslugama" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Pozivanje..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Slanje neuspješno. Pokušajte ponovno" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "SOS poziv" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Samo FDN pozivi" + +msgid "IDS_CALL_POP_HELD" +msgstr "Na čekanju" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Na čekanju neuspješno" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Na čekanju nepodržano" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Dolazni pozivi zabranjeni u roamingu" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nepotpuno" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Pridruživanje neuspješno" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Pridruživanje nepodržano" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Mreža zauzeta" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Mreža nedostupna" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Nedovoljno sredstava" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nema usluge" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operacija nije dopuštena" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Odlazni međunarodni pozivi zabranjeni osim kući" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Odlazni međunarodni pozivi zabranjeni" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon nije pokrenut" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ponovno biranje..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Usluga nije dopuštena" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Samo SOS pozivi\nUmetnite SIM karticu za mrežne usluge" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Neuspješno izdvajanje" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Nepodržano izdvajanje" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Neuspješna zamjena" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Nepodržana zamijena" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Greška prijenosa" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Nepodržan prijenos" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nemoguće preuzeti" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nedostupno" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Preuzeto" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Preuzimanje nepodržano" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Korisnik zauzet" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Provjerite ili umetnite ispravnu SIM karticu" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Glasovni poziv nije dopušten tijekom video poziva" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Čekanje aktivno" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Neispravna grupa" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Prekini zadržane pozive (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Prijamnik" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Preuzmi drugi poziv" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedovoljno memorije. Obrišite neke datoteke" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Prekid" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Usluga nedostupna" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Nepoznati poziv odbačen" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "za %d dana" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Sutra" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Za jedan tjedan" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Prihvati sljedeći poziv" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Isklj. smanjenje buke" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Uklj. smanjenje buke" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nemoguće uključiti smanjenje buke dok je uključena dodatna glasnoća" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Nemoguće uključiti smanjenje buke dok je slušalica spojena" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nemoguće uključiti smanjenje buke dok su Bluetooth slušalice uključene" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Nemoguće uključiti smanjenje buke tijekom širokopojasnih poziva" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Za korištenje ove funkcije morate označiti Optimiziraj ekvilajzer u postavkama poziva" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Nemoguće uključiti ekvilajzer zvuka poziva dok je zvučnik uključen" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Nemoguće uključiti ekvilajzer zvuka poziva dok su slušalice spojene" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nemoguće uključiti ekvilajzer zvuka poziva dok su Bluetooth slušalice uključene" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Nemoguće koristiti raspon dodatne glasnoće kada su spojene slušalice ili BT slušalice" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Pozivanje..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nemoguće uključiti ekvilajzer zvuka poziva dok je uključena dodatna glasnoća" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Nemoguće uključiti ekvilajzer zvuka poziva tijekom širokopojasnih poziva" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Nemoguće uključiti smanjenje buke dok je zvučnik uključen" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Grupni poziv (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Spremljena slika" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Spremljeni video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Za fotografiranje" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Video uživo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Prikaži kont." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d propuštenih poziva" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Propušteni poziv" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Dodatna glasnoća uključena" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Dodatna glasnoća isključena" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Proslijeđen odlazni poziv" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Zabranjeni odlazni pozivi" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Preusmjeren poziv" + diff --git a/ui/po/hu.po b/ui/po/hu.po new file mode 100755 index 0000000..603c4f7 --- /dev/null +++ b/ui/po/hu.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Elutasítás üzenetben" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Fogad" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Új hívás" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Névjegyek" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Tart" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Összevon" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Elutasít" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Hangsz." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Beléptet" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Híváselutasítás üzenetben" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Összes hívás befejezése" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Aktív hívások bontása (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Fejhallgató" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Bill.-zet" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Némít" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Kapcsolódás..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Elutasítva" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Küldés..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Alkalmazásváltó" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s tartásba helyezése" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Beszélgetés befejezése %s partnerrel" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Mély h. erősítése" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Magas h. erősít." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Bal fülhöz optimalizálva" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Jobb fülhöz optimalizálva" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Konferenciahívás kezelése" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Hang" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Megosztás" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Fájlmegosztás a ChatON-on" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Megosztás" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "Saját hivás hangja" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Hívás" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Hívott fél nem érh.el" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Hívás vége" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Hívás elutasítva" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Szétkapcsolva" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nincs válasz" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Megváltozott a szám" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nincs szám" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Tartásban" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Ember" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "BT fülh." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenciahívás" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Rendszerhiba" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Összes bejövő hívás korlátozva" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Összes kimenő hívás korlátozva" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "A hívás nem sikerült" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Csak segélyhívás indítható" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "A hívás nem engedélyezett" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Hívás korlátozva" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Hívásátirányítás aktiválva: mindig" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Hívásátirányítás aktiválva: ha nincs válasz" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Hívásátirányítás aktiválva: ha nem elérhető" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Hívásátirányítás aktiválva: ha foglalt" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Hívás továbbítva" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Téves szám" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Hálózati szolgáltatások használatához váltson Offline profilról más profilra" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Hívás..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "A küldés sikertelen. Próbálja újra" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Segélyhívás" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Csak fixlistás hívások" + +msgid "IDS_CALL_POP_HELD" +msgstr "Tartva" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Tartás sikertelen" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Tartás nem támogatott" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Bejövő hívások korlátozása roaming esetén" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nincs kész" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "A konferencia nem sikerült." + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "A konferencia nem támogatott." + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "A hálózat foglalt" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "A hálózat nem érhető el" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "A keret kimerült" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nincs szolgáltatás" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Művelet visszautasítva" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Kimenő nemzetközi hívások korlátozva, a hazait kivéve" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Kimenő nemzetközi hívások\nkorlátozva" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon még nem lett inicializálva" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Újrahívás..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "A szolgáltatás nem engedélyezett" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Csak segélyhívás.\nHálózati szolgáltatások eléréséhez helyezze be a SIM kártyát" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Szétválasztás sikertelen" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Szétválasztás nem támogatott" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Az átváltás sikertelen" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Az átváltás nem támogatott." + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Hívásátadás sikertelen" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Hívásátadás nem támogatott" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nem tölthető le" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nem elérhető" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Tartás vége" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Beléptetés nem támogatott" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Foglalt" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Ellenőrizze a SIM-et vagy helyezzen be érvényes SIM-et" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Videohívás közben nem lehet hanghívást folytatni" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Várakoztatás bekapcsolva" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Helytelen csoport" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Tartott hívások bontása (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Hallgató" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktív hívás tartása" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Kevés a memória. Töröljön néhány tételt" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Befejez" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Szolgáltatás nem elérhető" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Felv." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Ismeretlen hívás elutasítva" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d nap múlva" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Holnap" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Egy hét múlva" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Hívás fogadása ez után:" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Zajcsökkentés kikapcsolása" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Zajcsökkentés bekapcsolása" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Bekapcsolt többlethangerő mellett nem kapcsolható be a zajcsökkentés" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Amíg fülhallgató csatlakozik a készülékhez, nem kapcsolható be a zajcsökkentés" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Amíg be van kapcsolva a Bluetooth-fejhallgató, nem kapcsolható be a zajcsökkentés" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Szélessávú hívás alatt nem kapcsolható be a zajcsökkentés" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "A funkció használatához jelölje be az Ekvalizer személyes optimalizálása beállítást a Hívásbeállításokban" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Amíg be van kapcsolva a hangszóró, nem engedélyezhető a hívás közbeni ekvalizer" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Csatlakoztatott fülhallgató mellett nem engedélyezhető a hívás közbeni ekvalizer" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bekapcsolt Bluetooth-fejhallgató mellett nem engedélyezhető a hívás közbeni ekvalizer" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Csatlakoztatott fülhallgató vagy BT-fejhallgató mellett nem használható a többlethangerő" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Hívás..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Bekapcsolt többlethangerő mellett nem engedélyezhető a hívás közbeni ekvalizer" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Szélessávú hívás alatt nem engedélyezhető a hívás közbeni ekvalizer" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Amíg be van kapcsolva a hangszóró, nem kapcsolható be a zajcsökkentés" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Csoporthívás (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Mentett kép" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Mentett videó" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Fénykép készítése" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Élő videó" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Névjegy megj." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d nem fogadott hívás" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Nem fogadott hívás" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Többlethangerő bekapcsolva" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Többlethangerő kikapcsolva" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Kimenő hívás átirányítva" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Kimenő hívások korlátozva" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Átirányított hívás" + diff --git a/ui/po/hy.po b/ui/po/hy.po new file mode 100755 index 0000000..74461f1 --- /dev/null +++ b/ui/po/hy.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Մերժել հաղորդագրության հետ" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Ընդունել" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ավլց. կանչ" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Կոնտակտներ" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Պահել" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Միացնել" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Մերժել" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Բրձրխոս" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Հն պհմ ռժ" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Մերժել հաղորդագրություն պարունակող կանչը" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Ավարտել բոլոր կանչերը" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Ավարտել ակտիվ կանչերը (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Գլխ. հռխոսներ" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Ստեղնաշար" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Անձայն" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Միացում..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Մերժված է" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Ուղարկում..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Փոխարկել" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s հետաձգվում է" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Կանչի ավարտ %s-ով" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Բրձրցնլ ցածր տոները" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Բրձրցնլ բրձր տոները" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Լավարկված է ձախ ականջի հր" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Լավարկված է աջ ականջի հր" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Կառավարել համազրույցի կանչը" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Հնչյուն" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Համատեղ օգտգրծմ" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Համօգտ. ֆայլը ChatON-ով" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Համատեղ օգտագործում" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Զանգ" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Կնչվ կղմ անհասանելի է" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Զանգն ավարտված է" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Կանչը մերժված է" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Անջատված է" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Պատասխան չկա" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Համարը փոխվել է" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Համարը գոյություն չունի" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Սպասման մեջ է" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Մարդիկ" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Ակնջկալ" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Հեռախոսային կոնֆերանս" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Համակարգի սխալ" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Բոլոր մուտքային կանչերը արգելափակված են" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Բոլոր ելքային կանչերը արգելափակված են" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Զանգը ձախողվեց" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Միայն հրատապ կանչեր" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Կանչն արգելված է" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Զանգն արգելափակված է" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Ակտիվացնել կանչի վերահասցեավորումը. Մշտապես" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Ակտիվացնել կանչի վերահասցեավորումը. Չպատասխանելու դեպքում" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Զանգի վերահասցեավորման ակտիվացում. անհասանելի է" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Ակտիվացնել զանգի վերահասցեավորումը. Երբ զբաղված է" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Կանչը վերահասցեավորված է" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Սխալ համար" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Ցանցային ծառայությունների համար փոխել Ավտոմատից այլ պրոֆիլի" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Համարհավաքում..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Ուղարկումը ձախողվեց: Կրկին փորձեք" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Հրատապ զանգ" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Միայն FDN կանչեր" + +msgid "IDS_CALL_POP_HELD" +msgstr "Պահված" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Պահումը ձախողվեց" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Պահումը հնարավոր չէ" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Մուտքային կանչերն արգելափակված են ռոումինգի ժամանակ" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Անավարտ" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Միացումը ձախողվեց" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Միացումը համատեղելի չէ" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Ցանցը զբաղված է" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Ցանցն անհասանելի է" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Գումար չի մնացել" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Ծառայություն չկա" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Գործողությունը մերժվեց" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Արգելել ելքային միջազգ. բացի տուն" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Միջազգային ելքային կանչերը արգելված են" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Հեռախոսը գործարկված չէ" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ինքնահավաքում է..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Ծառայությունը թույլարտված չէ" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Միյան SOS կանչեր:\nՏեղադրեք SIM քարտը՝ ցանցի ծառայություններ մուտք գործելու համար" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Տրոհումը ձախողվեց" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Տրոհումը համատեղելի չէ" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Փոխարկումը ձախողվեց" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Փոխարկումը չի սատարվում" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Փոխանցումը չհաջողվեց" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Գործարքը չի սատարվում" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Անհնար է ստանալ" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Անհասանելի" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Թողնված" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Պահման հանումը չի սատարվում" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Բաժանորդը զբաղված է" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Ստուգել SIM-ը կամ մտցնել վավեր SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Ձայնային զանգը թույլատրված չէ վիդեո զանգի ընթացքում" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Սպասումն ակտիվ է" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Սխալ խումբ" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Ավարտել հետաձգված կանչերը (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Ընդունիչ" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Պահել ակտիվ զանգը" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Հիշողությունը չի բավարարում: Ջնջեք որոշ տարրեր" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Ավր զնգ" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Ծառայությունը անհասանելի է" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Գրնց." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Անհայտ կանչը մերժված է" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d օրում" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Վաղը" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Մի շաբաթից" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Ընդունել կանչը հետո" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Անջատել աղմուկի նվազեցումը" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Միացնել աղմուկի նվազեցումը" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Անհնար է միացնել աղմուկների ճնշումը, քանի դեռ ձայնի հավելյալ ուժգնությունն ընձեռված է" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Անհնար է միացնել աղմուկների ճնշումը, երբ ականջակալը միացված է" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Անհնար է միացնել աղմուկների ճնշումը, երբ Bluetooth գլխային հեռախոսը միացված է" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Անհնար է միացնել աղմուկների ճնշումը լայնաշերտ կանչերի ընթացքում" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Այս գործառույթն օգտագործելու համար հարկավոր է Կանչի դրվածքներում ստուգել \"լավարկել հավասարիչն ինձ համար\"" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Անհնար է ընձեռել \"կանչի մեջ\" ձայնի հավասարիչը, երբ բարձրախոսը միացված է" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Անհնար է ընձեռել \"կանչի մեջ\" ձայնի հավասարիչը, երբ ականջակալները միացված են" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Անհնար է ընձեռել \"կանչի մեջ\" ձայնի հավասարիչը, երբ Bluetooth գլխային հեռախոսը միացված է" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Անհնար է օգտագործել ձայնի լրացուցիչ ուժգնության տիրույթը, երբ ականջակալները կամ BT գլխային հեռախոսը միացված են" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Կանչ է կատարվում..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Անհնար է ընձեռել \"զանգի մեջ\" ձայնի հավասարիչը, քանի դեռ ձայնի հավելյալ ուժգնությունն ընձեռված է" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Անհնար է ընձեռել \"զանգի մեջ\" ձայնի հավասարիչը լայնաշերտ զանգերի ընթացքում" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Անհնար է միացնել աղմուկների ճնշումը, երբ բարձրախոսը միացված է" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Խմբազանգ (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Պահպանված պատկեր" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Պահպանված տեսանյութ" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Նկարահանել" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Կենդ. տսնյթ" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Դիտել կոնտակտը" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Բացթողնված կանչ" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Բացթողած զանգ" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Ձայնի լրացուցիչ ուժգնությունն ընձեռված է" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Ձայնի լրացուցիչ ուժգնությունը կասեցված է" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Ելից զանգը փոխանցված է" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Ելքային կանչերն արգելված են" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Փոխանցված զանգ" + diff --git a/ui/po/is.po b/ui/po/is.po new file mode 100755 index 0000000..379b76f --- /dev/null +++ b/ui/po/is.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Hafna með skilaboðum" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Samþykkja" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Símtal" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Símaskrá" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Setja í bið" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Taka þtt" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Hafna" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Hátalari" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "T. úr bið" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Hafna símtali með skilaboðum" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Ljúka öllum símtölum" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Ljúka símtali í gangi (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Höfuðtól" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Takkaborð" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Hljóð af" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Verið er að tengjast..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Hafnað" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Verið er að senda..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Skipta" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Setja %s í bið" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Ljúka símtali með %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Lágtónaaukning" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Hátónaaukning" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Stillt fyrir vinstra eyra" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Stillt fyrir hægra eyra" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Vinna með símafundi" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Hljóð" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Samnýta" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Deila skrá í gegnum ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Samnýta" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Símtal" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Það næst ekki í viðmælanda" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Símtali lokið" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Símtali hafnað" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Aftengt" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Ekkert svar" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Breytt númer" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Númer er ekki til" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Í bið" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Fólk" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Höfuðt." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Símafundur" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Kerfisvilla" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Lokað fyrir öll innsímtöl" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Lokað fyrir öll símtöl út" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Hringing tókst ekki" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Aðeins neyðarhringingar" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Símtalið er óleyfilegt" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Lokað fyrir símtal" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Framsending símatala virk: Alltaf" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Framsending símatala virk: Þegar ekki er svarað" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Framsending símatala virk: Þegar ekki næst í símann" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Framsending símatala virk: Þegar er á tali" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Símtal flutt" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Rangt númer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Skiptu úr ótengdu sniði í annað snið til að fá aðgang að netþjónustu" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Verið er að hringja..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sending mistókst. Reynið aftur" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Neyðarhringing" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Aðeins FDN hringingar" + +msgid "IDS_CALL_POP_HELD" +msgstr "Í bið" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Ekki tókst að láta bíða" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Ekki stutt að láta bíða" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Það er lokað fyrir móttekin símtöl í reiki" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Ólokið" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Sameining tókst ekki" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Sameining er ekki studd" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Það næst ekki samband við kerfið" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Það er ekkert kerfi til staðar" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Engin inneign eftir" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Engin þjónusta" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Aðgerð hafnað" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Það er lokað fyrir símtöl til útlanda, nema til heimalands" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Það er lokað fyrir símtöl til útlanda" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Ræsingu símans er ekki lokið" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Hringi aftur..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Þjónusta ekki leyfð" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Það er aðeins hægt að hringja neyðarsímtöl.\nSettu SIM-kort í símann til að fá aðgang að sérþjónustu" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Ekki tókst að skipta" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Skipting er ekki studd" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Skipting tókst ekki" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Skipting er ekki studd" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Flutningur tókst ekki" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Flutningur er ekki studdur" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Endurheimt tókst ekki" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Ekki til staðar" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Losað úr bið" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Ekki stutt að taka úr bið" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Notandi á tali" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Staðfestu SIM-kort eða settu gilt SIM-kort í" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Það er ekki hægt að hringja raddsímtal meðan á myndsímtali stendur" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Bið er virk" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Rangur hópur" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Ljúka símtali í bið (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Móttakandi" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Virkt símtal í bið" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ekki er nægt minni. Eyðið nokkrum atriðum" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Leggj. á" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Ótiltæk þjónusta" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Uppt." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Óþekktu símtali hafnað" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "eftir %d daga" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Á morgun" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Eftir viku" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Svara símtali eftir" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Slökkt á suðhreinsun" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Kveikt á suðhreinsun" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ekki er hægt að slökkva á suðhreinsun þegar kveikt er á aukahljóðstyrk" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Ekki er hægt að kveikja á suðhreinsun þegar heyrnartólið er tengt" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Ekki er hægt að kveikja á suðhreinsun þegar kveikt er á Bluetooth-höfuðtóli" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Ekki er hægt að kveikja á suðhreinsun meðan á breiðbandssímtölum stendur" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Til að nota þessa aðgerð þarftu að velja hámarka tónjöfnun í símtalastillingum" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Ekki er hægt að kveikja á tónjöfnun símtalshljóðs þegar kveikt er á hátalaranum" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Ekki er hægt að kveikja á tónjöfnun símtalshljóðs þegar heyrnartól eru tengd" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Ekki er hægt að kveikja á tónjöfnun símtalshljóðs þegar kveikt er á Bluetooth-höfuðtólum" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Ekki hægt að nota aukahljóðstyrk þegar heyrnartæki eða Bluetooth-höfuðtól eru tengd" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Verið er að hringja..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ekki tókst að kveikja á tónjöfnun símtalshljóðs á meðan á símtali stendur þegar kveikt er á aukahljóðstyrk" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Ekki er hægt að kveikja á tónjafnara í símtali meðan á breiðbandssímtölum stendur" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Ekki er hægt að kveikja á suðhreinsun þegar kveikt er á hátalaranum" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Hópsímtal (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Vistuð mynd" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vistað myndskeið" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Myndataka" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Í beinni" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Skoða tengilið" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Ósvöruð símtöl" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Ósvarað" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Kveikt á aukahljóðstyrk" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Slökkt á aukahljóðstyrk" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Hringt símtal var flutt" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Lokað fyrir símtöl úr símanum" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Flutt símtal" + diff --git a/ui/po/it_IT.po b/ui/po/it_IT.po new file mode 100755 index 0000000..ae3ccb5 --- /dev/null +++ b/ui/po/it_IT.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rifiuta con messaggio" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Accetta" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Chiama" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Rubrica" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "In attesa" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "In conf." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rifiuta" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Vivavoce" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Recupera" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rifiuta con messaggio" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Termina tutte le chiamate" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Termina chiamate attive (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Cuffie" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastiera" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Muto" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Connessione..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rifiutata" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Invio..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Passa a" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Metti %s in attesa" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Fine chiamata con %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Incrementa bassi" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Incrementa alti" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Ottimizato orecchio sx" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Ottimizato orecchio dx" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Gestisci conferenza" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Suono" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Condividi" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Condividi file con ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Condividi" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "Audio in chiamata" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Chiamata" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Utente non disponib." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Chiamata terminata" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Chiamata rifiutata" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Disconnesso" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nessuna risposta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numero modificato" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numero non esistente" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "In attesa" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Persone" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auric. BT" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conferenza" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Errore di sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Tutte le chiamate in arrivo bloccate" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Tutte le chiamate in uscita bloccate" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Chiamata non riuscita" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Solo chiamate di emergenza" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Chiamata non consentita" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Chiamata bloccata" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Trasferimento chiamate attivo: sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Trasferimento chiamate attivo: nessuna risposta" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Trasferimento chiamate attivo: non raggiungibile" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Trasferimento chiamate attivo: occupato" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Chiamata inoltrata" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Numero errato" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Passare da Offline ad altro profilo per accedere ai servizi di rete" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Composizione..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Invio non eseguito. Riprovare" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Chiamata di emergenza" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Solo chiamate FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "In attesa" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Messa in attesa non eseguita" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Messa in attesa non supportata" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Chiamate in arrivo bloccate durante roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Connessione non eseguita" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Connessione non supportata" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Rete occupata" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Rete non disponibile" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Credito esaurito" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nessun servizio" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operazione rifiutata" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Chiamate internazionali in uscita bloccate tranne verso proprio paese" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Chiamate internazionali in uscita bloccate" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefono non inizializzato" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ricomposizione..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servizio non consentito" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Solo chiamate di emergenza.\nInserire scheda SIM per accedere ai servizi di rete" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Divisione non eseguita" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Divisione non supportata" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Scambio non eseguito" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Scambio non supportato" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Errore trasferimento" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Trasferimento non supportato" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Impossibile recuperare" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Non disponibile" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Annullamento attesa eseguito" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Annullamento attesa non supportato" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Utente occupato" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verifica SIM o inserisci SIM valida" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Chiamata vocale non consentita durante una videochiamata" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Avviso di chiamata attivo" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Gruppo errato" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Termina chiamate in attesa (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Ricevitore" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Ch. attiva in attesa" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memoria insufficiente. Eliminare alcuni elementi" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Termina" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servizio non disponibile" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Reg" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Chiamata sconosciuta rifiutata" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "tra %d giorni" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Domani" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Tra 1 settimana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Accetta chiamata dopo" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Disattiva riduzione disturbi" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Attiva riduzione disturbi" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossibile attivare la riduzione rumore con volume aggiuntivo attivato" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Impossibile attivare la riduzione fruscio se è connesso l'auricolare" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossibile attivare la riduzione fruscio se è attivo l'auricolare Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Impossibile attivare la riduzione fruscio durante le chiamate a banda larga" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Per utilizzare questa funzione, è necessario verificare l'equalizzazione personale ottimale nelle impostazioni di chiamata" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Impossibile attivare equalizzatore audio in chiamata se l'altoparlante è attivo" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Impossibile attivare equalizzatore audio in chiamata se gli auricolari sono connessi" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossibile attivare equalizzatore audio in chiamata se l'auricolare Bluetooth è attivo" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Impossibile utilizzare l'intervallo di volume aggiuntivo se gli auricolari o l'auricolare Bluetooth sono connessi" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Chiamata..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossibile attivare equalizzatore audio in chiamata con volume aggiuntivo attivato" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Impossibile attivare equalizzatore audio in chiamata durante le chiamate a banda larga" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Impossibile attivare la riduzione fruscio se è attivo l'altoparlante" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Chiamata gruppo (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Immagine salvata" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Video salvati" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Scatta una foto" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Video live" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Vedi contatto" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d chiamate senza risposta" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Chiamata persa" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volume aggiuntivo attivato" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volume aggiuntivo disattivato" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Chiamata in uscita deviata" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Chiamate in uscita bloccate" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Chiamata inoltrata" + diff --git a/ui/po/ja_JP.po b/ui/po/ja_JP.po new file mode 100755 index 0000000..d848b22 --- /dev/null +++ b/ui/po/ja_JP.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "拒否してメッセージ送信" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "応答" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "通話を​追加" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "連絡先" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保留" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "参加" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒否" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "スピーカー" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "保留解除" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "着信拒否時にメッセージ送信" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "全ての​相手​と​終話" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "アクティブ​通話​を​終了​する​(%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "ヘッドホン" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "キーパッド" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "消音" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "接続中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "拒否されました。" + +msgid "IDS_CALL_POP_SENDING" +msgstr "送信中..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "切替" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s​と​の​通話​を​保留" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "%s​と​の​通話​を​終了" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "低音強調" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "高音強調" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "左耳に最適化" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "右耳に最適化" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "グループ通話を​管理" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "サウンド" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "共有" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "ChatONでファイルを共有" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "共有" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通話" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "発信​相手​は​電話​に​出られ​ません" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "通話​終了" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通話​拒否​されました" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "切断しました。" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "応答​なし" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "番号​が​変更​されました" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "番号​が​存在​しません。" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保留中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "人" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "ヘッドセット" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "グループ通話" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "システムエラー" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "全ての​着信​が​規制​されて​います" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "全ての​発信​が​規制​されて​います" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "発信​でき​ません​でした。" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "緊急通報のみ発信可能です。" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "通話​は​許可されて​いません" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通話は制限されています。" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "通話​を​転送する:常時" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "通話​を転送​する:​応答​なし" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "通話​を​転送:​​圏外時" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "通話​を​転送:​ビジー時" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "通話転送されました" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "番号​が​正しく​ありません。" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "オフライン​から​他の​ネットワーク​サービス​の​接続先​に​変更" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "発信中..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "送信​に​失敗​しました。​リトライ" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "緊急通報" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN電話​限定​です" + +msgid "IDS_CALL_POP_HELD" +msgstr "保留にしました" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "保留​できません​でした" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "保留​に​対応して​いません" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "ローミング​中​は​着信​が​規制​されます" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "操作が中断されました" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "グループ​通話​参加に失敗しました" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "グループ​通話​参加に対応していません" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "ネットワーク​混雑中" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "ネットワーク​を​利用​できません。" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "料金​上限​設定​を​超えて​います" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "サービス​が​利用​でき​ません。" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "操作​は​拒否​されました" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "自国​以外の​全ての​国際​電話​発信​が​規制​されています" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "全ての​国際電話発信​が​規制​されて​います" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "写真​は​初期化​されて​いません" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "リダイヤル中..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "サービス​は​許可されて​いません" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "SOS​通話​のみ。​\nSIM​​カード​を​挿入して、​ネットワーク​サービス​に​アクセス​します" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分割​に​失敗​しました" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "分割​に​対応​して​いません" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切り替え​できません​でした" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "切り替え​に​対応​して​いません" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "転送​に​失敗​しました。" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "転送​に​対応​して​いません" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "受信できません" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不可" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "保留解除" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "保留​解除​に​対応して​いません" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "話し中,​または​通信中​です" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM​を​確認​する​か、​有効​な​SIM​を​挿入​して​ください" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "テレビ​電話中​は​音声​電話​を​使用​できません" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "割込​通話​設定中​です" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "グループ​が​間違って​います" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "保留中の​通話​を​終了​する​(%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "受話​器" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "現在の​通話​を​保留" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "メモリが不足しています。不要なアイテムを削除してください。" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "通話​を​終了​" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "サービス​を​利用​できません" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "録音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "非通知​通話​を​拒否​しました" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d日で" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "明日" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "一週間​以内" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "通話状態の選択" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "ノイズキャンセラー​を​OFF" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "ノイズキャンセラー​を​ON" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "最大音量制限が有効のときは、ノイズキャンセラーをONにできません。" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "イヤホン​が​接続​されて​いる​とき​は、​ノイズ​キャンセラー​を​ON​に​できません。" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth​ヘッドセット​が​ON​の​とき​は、​ノイズ​キャンセラー​を​ON​に​できません。" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "広帯域​で​通話中​は、​ノイズキャンセラー​を​ON​に​できません。" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "この機能を使うには、通話設定の最適EQを確認する必要があります。" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "スピーカーがONのときは、通話音EQを有効にできません。" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "イヤホンが接続されているときは、通話音EQを有効にできません。" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "BluetoothヘッドセットがONのときは、通話音EQを有効にできません。" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "イヤホンまたはBTヘッドセットを接続しているときは、最大音量域を使用できません。" + +msgid "IDS_CALL_POP_CALLING" +msgstr "発信中..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "最大音量制限が​​設定されている​​場合、​​通話音EQを​​有効に​​できません。" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "広帯域で通話中は、通話音EQを有効にできません。" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "スピーカーがONのときは、ノイズキャンセラーをONにできません。" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "グループ​通話​(%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "保存​画像" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "保存​動画" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "写真​を​撮影" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "ライブ​動画" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "連絡先を表示" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d件​の​不在​着信" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "不在着信" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "最大音量が有効になりました。" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "最大音量が無効になりました。" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "発信通話​が​転送​されました" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "発信通話が規制されています。" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "​転送された通話" + diff --git a/ui/po/ka.po b/ui/po/ka.po new file mode 100755 index 0000000..1c14711 --- /dev/null +++ b/ui/po/ka.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "უარყოფა წერილით" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "მიღება" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "ზარის დამ." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "კონტაქტები" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "დაკავება" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "შემოერთ." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "უარყოფა" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "დინამ." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "დაკ.მოხს." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "შეტყობინების მქონე ზარის უარყოფა" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "ყველა ზარის დასრულება" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "აქტიური ზარების დასრულება (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "გარნიტურები" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "კლავიატ." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "უხმო" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "უკავშირდება..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "უარყოფილია" + +msgid "IDS_CALL_POP_SENDING" +msgstr "იგზავნება..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "გადართვა" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s-ის დაკავება" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "ხარის დასრულება, %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "დაბალი ტონები" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "მაღალი ტონები" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "ოპტიმალური მარცხენა ყურზე" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "ოპტიმალური მარჯვენა ყურზე" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "საკონფერენციო ზარის მოწყობა" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "ხმა" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "გაზიარება" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "ფაილის გაზიარება ChatON-ით" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "გაზიარება" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "დარეკვა" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "აბონენტი მიუწვდომელია" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "ზარი დასრულდა" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "ზარი უარყოფილია" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "გათიშულია" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "პასუხი არ არის" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "ნომერი შეიცვალა" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "ნომერი არ არის" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "დაკავებული" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "ხალხი" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "გარნიტ." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "კონფერენც-ზარი" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "სისტემის შეცდომა" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "ყველა შემომავალი ზარი დაბლოკილია" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "დაბლოკილია ყველა გამავალი ზარი" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "ვერ დაირეკა" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "მხოლოდ გადაუდებელი ზარები" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "ზარი არაა ნებადართული" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "ზარი დაბლოკილია" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "ზარის გადამისამართება აქტიურია: ყოველთვის" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "ზარის გადამისამართება აქტიურია: როცა არ პასუხობს" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "ზარის გადამისამართება აქტიურია: როცა მიუწვდომელია" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "ზარის გადამისამართება აქტიურია: როცა დაკავებულია" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "ზარი გადამისამართებულია" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "ნომერი არასწორია" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "ოფლაინიდან გადადით სხვა რეჟიმში, ქსელის მომსახურების მისაღებად" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "იკრიფება..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "ვერ შეირჩა. თავიდან ცადეთ" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "საგანგებო ზარი" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "მხოლოდ FDN ზარები" + +msgid "IDS_CALL_POP_HELD" +msgstr "დაკავება" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "ზარი ვერ დაკავდა" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "ზარის დაკავების ფუნქცია არ მუშაობს" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "შემოსული ზარები იბლოკება როუმინგის დროს" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "არასრული" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "ვერ შეუერთდა" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "შეერთების ფუნქცია არ მუშაობს" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "ქსელი დაკავებულია" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "ქსელი მიუწვდომელია" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "კრედიტი ამოიწურა" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "მომსახურება არ არის" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "ოპერაცია უარყოფილია" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "გამავალი საერთაშორისო ზარები, საშინაოს გარდა, დაბლოკილია" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "გამავალი საერთაშორისო ზარები დაბლოკილია" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "ტელეფონი არაა ინიციალიზებული" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "ზარი მეორდება..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "მომსახურება არაა ნებადართული" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "მხოლოდ SOS ზარი.\nქსელის მომსახურების მისაღებად, გთხოვთ, ჩადოთ SIM ბარათი" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "ვერ გაიყო" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "გაყოფა შეუძლებელია" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "ვერ გაიცვალა" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "გაცვლა შეუძლებელია" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "ვერ გადაიცა" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "გადაცემა შეუძლებელია" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "შეუძლებელია მიღება" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "მიუწვდომელია" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "დაკავება გაუქმდა" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "დაკავების გაუქმება შეუძლებელია" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "მომხმარებელი დაკავებულია" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "შეამოწმეთ SIM ან ჩადეთ ქმედითი SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "ხმოვანი ზარი არაა ნებადართული ვიდეო ზარის დროს" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "მოცდა აქტიურია" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "არასწორი ჯგუფი" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "დაკავებული ზარების დასრულება (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "მიმღები" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "აქტიური ზრ. დაკავება" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "მეხსიერება საკმარისი არაა. წაშალეთ ზოგიერთი ელემენტი" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "ზარის დასრ." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "მომსახურება არ არის" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "ჩაწ." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "უცნობი ზარი უარყოფილია" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d დღეში" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "ხვალ" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "ერთ კვირაში" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "ზარის მიღება, როცა გავა" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "ხმაურის შემცირება გამორთულია" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "ხმაურის შემცირება ჩართულია" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "ხმაურის შემცირება ვერ ჩაირთვება, სანამ ჩართულია დამატებითი ხმის სიმაღლე" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "ხმაურის შემცირება ვერ ჩაირთვება, როცა მიერთებულია ყურთსასმენი" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "ხმაურის შემცირება ვერ ჩაირთვება, როცა ჩართულია Bluetooth გარნიტურა" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "ხმაურის შემცირება ვერ ჩაირთვება, ფართოდიაპაზონიანი ზარების დროს" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "ამ ფუნქციის გამოსაყენებლად, უნდა შეასრულოთ EQ-ის ოპტიმიზაცია ზარის პარამეტრებში" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "საუბრის ხმის EQ ვერ გააქტიურება, როდესაც ჩართულია დინამიკი" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "საუბრის ხმის EQ ვერ გააქტიურება, როდესაც მიერთებულია გარნიტურა" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "საუბრის ხმის EQ ვერ გააქტიურება, როდესაც ჩართულია Bluetooth გარნიტურა" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "ხმის სიმაღლის დამატებითი გაზრდა შეუძლებელია, როდესაც მიერთებულია ყურთსასმენი ან BT გარნიტურა" + +msgid "IDS_CALL_POP_CALLING" +msgstr "ირეკება..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "საუბრის ხმის EQ ვერ გააქტიურება, როდესაც ჩართულია ხმის დამატებითი სიმაღლე" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "ფართოდიაპაზონიანი ზარების დროს შეუძლებელია ზარის პერიოდში ხმის EQ-ს ჩართვა" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "ხმაურის შემცირება ვერ ჩაირთვება, როცა ჩართულია დინამიკი" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "ჯგუფური ზარი (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "შენახული სურათი" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "შენახული ვიდეო" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "სურათის გადაღება" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "ცოცხლ. ვიდეო" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "იხ. კონტაქტი" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d უპასუხოდ დატოვებული ზარი" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "გამოტოვებული ზარი" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "ხმის სიმაღლის დამატებითი გაზრდა ჩართულია" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "ხმის სიმაღლის დამატებითი გაზრდა გამორთულია" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "გამავალი ზარი გადამისამართდა" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "გამავალი ზარები დაბლოკილია" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "გადამისამართებული ზარი" + diff --git a/ui/po/kk.po b/ui/po/kk.po new file mode 100755 index 0000000..8ec8d96 --- /dev/null +++ b/ui/po/kk.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Хабар арқылы бас тарту" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Қабылдау" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Қоңы. қосу" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Контактілер" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Ұстау" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Қосылу" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Қабылдамау" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Динамик" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Ұст-маған" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Хабары бар қоңырауды қабылдамау" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Барлық қоңырауды аяқтау" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Белсенді қоңырауларды аяқтау (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Құлаққап" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Пернетақ." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Дыбыссыз" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Қосылуда..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Қайтарылды" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Жіберілуде..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Қосу" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s ұстауға қою" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "%s арқылы қоңырауды аяқтау" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Көмек. төмен. дыбыс" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Көмек. жоғар. дыбыс" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Сол құлаққа оңтайлы" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Оң құлаққа оңтайлы" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Конференциялық қоңырауды басқару" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Дыбыс" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Байланысқа жол" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Файлды ChatON арқ. бөлісу" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Байланысқа жол" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Қоңырау" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Қоң-у соғылған жаққа қол жетімсіз" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Қоңырау аяқталды" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Қоңырау қабылданбады" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Ажыратылды" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Жауап жоқ" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Нөмір өзгертылген" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Номер\nжоқ" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Ұсталуда" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Адамдар" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Құлақ-п" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Конференциалық қоңырау" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Жүйе қателігі" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Кіретін барлық қоңырауларға тыйым салынған" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Шығатын қоңырауларға тыйым салынған" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Байланыс үзіліп кетті" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Тек жедел қоңырау үшін" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Қоңырауға тыйым салынған" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Қоңырауға тыйым салынған" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Қоңыраудың үзіліп кетуі: әрқашан" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Қоңыраудың үзіліп кету: жауап жоқ" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Үзіліп кету: байланысу мүмкін емес" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Қоңырауды үзіп жіберу қосылған:Егер бос емес болса" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Қоңырау бағыты өзгертілді" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Нөмір қате" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Желі қызметтері үшн Желі аясынан тыстан басқа профильге өзгерту" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Терілуде..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Жіберу үзіліп кетті. Қайталаңыз" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Шұғыл қоңырау шалу" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "FDN қоңыраулары ғана" + +msgid "IDS_CALL_POP_HELD" +msgstr "Ұсталу" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Ұстап тұру үзіліп кетті" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Ұстау мақұлданбайды" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Кіру қоңыраулары роуминг кезінде бұғатталды" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Аяқталған жоқ" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Байланысу үзіліп кетті" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Байланысу мақұлданбайды" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Желі бос емес" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Желі үзіліп кетті" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Теңдік аяқталған" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Қызмет жоқ" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Операциядан бас тартты" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Үйден басқа халықаралық шығу қоңыраулары бұғатталды" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Халықаралық шығатын\nқоңыраулар тыйым салынған" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Телефон бастапқы қалпына келтірілмеді" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Қайта терілуде..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Қызмет рұқсат етілмеген" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Тек SOS қоңырауы үшін ғана.\n Желі қызметтеріне қол жеткізу үшін SIM картаны енгізіңіз" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Қақ айрылу үзіліп кетті" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Бөліну мақұлданбайды" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Өзгерту үзіліп кетті" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Өзгерту мақұлданбайды" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Орналастыру үзіліп кетті" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Орналастыру мақұлданбайды" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Алынбады" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Байланыс аясынан тыс жерде" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Ұсталған жоқ" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Ұстамау мақұлданбайды" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Тұтынушы бос емес" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM картасын тексеріңіз немесе жарамды SIM картасын салыңыз" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Дауыстық қоңырау бейне қоңырау кезінде рұқсат етілмейді" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "күтуде" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Қате топ" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Ұстаулы қоңырауларды аяқтау (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Қабылдаушы" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Белс. қоңыр-ды ұстау" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Жад жетыспейт.Көп арналы жою." + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Қңр соңы" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Қызмет көрсете алмайды" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Жазу" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Белгісіз қоңырау қабылданбады" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d күннен кейін" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Ертең" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Бір аптадан кейін" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Қоңырау қабылдау" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Шуыл азайту өшірулі" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Шуыл азайту қосулы" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Артық дыбыс қаттылығы қосылғанда шуылды азайтуды қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Құлаққап қосылғанда шуыл төмендетуді қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth гарнитурасы қосылғанда шуыл төмендетуді қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Кең ауқымды қоңыраулар кезінде шуыл төмендетуді қосу мүмкін емес" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Бұл функцияны пайдалану үшін қоңырау параметрлері арқылы оңтайлы эквалайзерді тексеру керек" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Динамик қосылғанда қоңырау кезіндегі дыбыстық эквалайзерді қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Құлаққап жалғанғанда қоңырау кезіндегі дыбыстық эквалайзерді қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth гарнитурасы қосылғанда қоңырау кезіндегі дыбыстық эквалайзерді қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Құлаққап немесе Bluetooth құлаққабы қосылғанда қосымша дауыс деңгейін пайдалану мүмкін емес" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Қоңырау шалу..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Қосымшы дауыс қаттылығы қосылғанда қоңырау кезіндегі дыбыс эквалайзерін қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Кең жолақты қоңыраулар кезінде дыбыстық эквалайзерді қосу мүмкін емес" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Динамик қосылғанда шуыл төмендетуді қосу мүмкін емес" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Топ қоңырауы (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Сақталған сурет" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Сақталған бейне" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Суретке түсіру" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Шынайы бейне" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Контакт көру" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Жауап берілмеген қоңырау" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Қабылданбаған қоңырау" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Қосымша дауыс деңгейі қосылды" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Қосымша дауыс деңгейі өшірілді" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Шығыс қоңырау басқаға жіберілді" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Шығыс қоңырауларға тыйым салынды" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Бағыты өзгертілген қоңырау" + diff --git a/ui/po/ko_KR.po b/ui/po/ko_KR.po new file mode 100755 index 0000000..8d6782a --- /dev/null +++ b/ui/po/ko_KR.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "수신 거절 메시지" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "통화" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "통화 추가" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "연락처" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "일시중단" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "가입하기" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "거절" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "한뼘통화" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "중단해제" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "수신 거절 메시지" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "모든 통화 종료" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "현재 통화(%d개) 종료" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "헤드폰" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "키패드" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "송화음 차단" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "연결 중..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "수신 거절하였습니다" + +msgid "IDS_CALL_POP_SENDING" +msgstr "전송 중..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "전환" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "일시중단 %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "종료 %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "낮은 음 강조" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "높은 음 강조" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "왼쪽 귀를 위해 최적화" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "오른쪽 귀를 위해 최적화" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "회의통화 관리" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "소리" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "공유" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "ChatON으로 파일 공유" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "공유" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "통화" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "상대방이 전화를 받지 않습니다" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "통화가 종료되었습니다" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "전화가 거부되었습니다" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "연결 끊김" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "응답이 없습니다" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "전화번호가 변경되었습니다" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "사용할 수 있는 번호가 없습니다" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "보류됨" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "사람" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "헤드셋" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "회의통화" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "시스템 오류가 발생하였습니다" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "모든 수신 전화가 제한되었습니다" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "모든 발신 전화가 제한되었습니다" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "연결하지 못하였습니다" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "긴급전화만 가능합니다" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "전화를 연결할 수 없습니다" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "통화가 제한되었습니다" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "착신통화 : 항상" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "착신통화 : 응답 없을 때" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "착신통화 : 서비스 지역 이탈 시" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "통화 중일 때" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "착신전환되었습니다" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "전화번호가 바르지 않습니다" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "네트워크에 연결하려면 비행기 탑승 모드를 해제하세요" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "발신 중..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "전송하지 못하였습니다. 잠시 후 다시 시도하세요" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "긴급전화" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "발신 허용 번호로만 전화를 걸 수 있습니다" + +msgid "IDS_CALL_POP_HELD" +msgstr "일시 중단 되었습니다" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "통화를 보류하지 못하였습니다" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "통화 보류가 지원되지 않습니다" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "로밍 중에는 전화 수신이 제한됩니다" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "완료되지 않았습니다" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "연결하지 못하였습니다" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "회의통화가 지원되지 않습니다" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "네트워크 연결 상태가 원활하지 않습니다" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "네트워크에 연결할 수 없습니다" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "크레디트가 없습니다" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "서비스 지역이 아닙니다" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "작업이 거부되었습니다" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "자국으로 거는 전화를 제외한 모든 국제전화 발신이 제한되었습니다" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "국제전화 발신이 제한되었습니다" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "휴대폰이 초기화되지 않았습니다" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "다시 거는 중..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "사용할 수 없는 서비스입니다" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "긴급전화만 사용할 수 있습니다. 네트워크 서비스를 이용하려면 SIM을 삽입하세요" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "통화를 분리하지 못하였습니다" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "통화 분리가 지원되지 않습니다" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "전환하지 못하였습니다" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "통화 전환이 지원되지 않습니다" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "연결하지 못하였습니다" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "상대방 연결이 지원되지 않습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "통화 보류를 취소할 수 없습니다" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "사용할 수 없음" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "통화 보류가 해제되었습니다" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "통화 보류를 취소할 수 없습니다" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "상대방이 통화 중입니다" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM을 확인해 보거나 사용할 수 있는 SIM을 삽입하세요" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "영상통화 중에는 음성통화를 할 수 없습니다" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "통화대기가 실행되어 있습니다" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "그룹이 바르지 않습니다" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "보류 통화(%d개) 종료" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "수화음 송출부" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "현재 통화 보류" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "저장 공간이 없습니다. 필요 없는 파일을 삭제하세요" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "통화 종료" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "서비스를 사용할 수 없습니다" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "녹음" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "발신자 번호가 없는 전화를 거부하였습니다" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d일 안에" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "내일" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "1주 후" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "대기 통화 설정" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "소음제거 해제" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "소음제거 실행" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "추가 음량을 이용 중일 때는 소음 제거를 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "이어폰이 연결되어 있을 때는 소음 제거를 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "블루투스 헤드셋을 사용할 때는 소음 제거를 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "광대역 통화를 이용 중일 때는 소음 제거를 실행할 수 없습니다" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "이 기능을 사용하려면 [통화] 설정에서 통화 음질 최적화를 확인해야 합니다" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "스피커가 켜져 있으면 통화 음질 설정을 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "이어폰이 연결되어 있으면 통화 음질 설정을 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "블루투스 헤드셋이 켜져 있으면 통화 음질 설정을 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "이어폰 또는 블루투스 헤드셋에 연결되어 있을 때에는 추가 음량을 사용할 수 없습니다" + +msgid "IDS_CALL_POP_CALLING" +msgstr "전화를 거는 중..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "추가 음량을 이용 중일 때는 통화 음질 설정을 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "광대역 통화 중에는 통화 음질 설정을 실행할 수 없습니다" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "스피커를 사용할 때는 소음 제거를 실행할 수 없습니다" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "그룹 통화(%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "저장된 이미지" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "저장된 영상" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "사진 촬영" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "라이브 영상" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "연락처 보기" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "부재중 전화 %d통" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "부재중 전화" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "추가 음량이 실행되었습니다" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "추가 음량이 해제되었습니다" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "발신 전화가 착신전환되었습니다" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "전화 발신이 제한되었습니다" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "착신전환된 통화입니다" + diff --git a/ui/po/lt.po b/ui/po/lt.po new file mode 100755 index 0000000..6f2009f --- /dev/null +++ b/ui/po/lt.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Atmesti su žinute" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Priimti" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Įtr. skam." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Adresatai" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Atidėti" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Jungtis" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Atmesti" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Garsiak." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Atnaujint" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Atmesti skambutį su žinute" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Baigti visus pokalbius" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Baigti aktyvius skambučius (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Ausinės" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Klaviat." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Nutildyti" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Jungiamasi..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Atmesta" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Siunčiama..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Perjungti" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "sulaikius pokalbį su %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "baigus pokalbį su %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Sustip. žemi tonai" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Sustip.aukšti tonai" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Pritaikyta kairei ausiai" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Pritaikyta dešinei ausiai" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Konf. skambučių valdymas" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Garsas" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Bendrai naudoti" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Bendrinti failą per ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Bendrinti" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Skambutis" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Skam. gav. nepasiek." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Pokalbis baigtas" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Skambutis atmestas" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Atjungta" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Neatsako" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numeris pasikeitė" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Tokio numerio nėra" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Atidėtas" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Žmonės" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Ausinės" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konf. skambutis" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistemos klaida" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Uždrausti visi gaunami skambučiai" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Uždrausti visi siunčiami skambučiai" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Prisiskambinti nepavyko" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Tik pagalbos skambučiai" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Skambinti neleidžiama" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Skambutis uždraustas" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Skambučio nukreipimas įjungtas: visada" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Skambučio nukreipimas įjungtas: neatsako" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Skambučio nukreipimas įjungtas: nepasiekiamas" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Skambučio nukreipimas įjungtas: užimta" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Skambutis nukreiptas" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Neteisingas numeris" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Tinklo paslaugoms Ne tinklo profilį pakeiskite į kitą" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Jungiamasi..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Nepavyko išsiųsti. Bandykite dar kartą" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Pagalbos skambučiai" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Tik FDN skambučiai" + +msgid "IDS_CALL_POP_HELD" +msgstr "Atidėta" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Sulaikyti nepavyko" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Sulaikymas nėra palaikomas" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Priimami skambučiai kitame tinkle draudžiami" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Neužbaigta" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Prijungimas nepavyko" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Prijungimas nepalaikomas" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Tinklas užimtas" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Tinklas nepasiekiamas" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Neliko kreditų" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Paslauga neteikiama" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operacija nepriimta" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Išeinantys tarptautiniai skambučiai, išskyrus namų, uždrausti" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Uždrausti siunčiami tarptautiniai skambučiai" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefonas neinicijuotas" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Skambinama pakartotinai..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Paslauga neleidžiama" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Tik SOS skambučiai.\nPrašom įdėti SIM kortelę, kad galėtumėte naudotis tinklo paslaugomis" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Skaidymas nepavyko" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Skaidymas nepalaikomas" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Skambučių pakeitimas nepavyko" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Skambučių pakeitimas nepalaikomas" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Persiųsti nepavyko" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Perkėlimas nepalaikomas" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Negalima atnaujinti" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Neleistina" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Atnaujinta" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Atidėjimo atšaukimas nepalaikomas" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Naudotojas užimtas" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Patikrinkite SIM arba įdėkite galiojančią SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Balso ryšys neleidžiamas vaizdo ryšio metu" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Laukimas įjungtas" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Neteisinga grupė" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Baigti sulaikytus skambučius (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Imtuvas" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Sulaik. aktyvų skam." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nepakanka atminties. Ištrinkite kai kuriuos elementus" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Bg.skam." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Paslauga neteikiama" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Įraš." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Atmestas nežinomas skambutis" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "po %d d." + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Rytoj" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Po savaitės" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Atsiliepti" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Triukšmo mažinimas išjungtas" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Triukšmo mažinimas įjungtas" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Neįmanoma įjungti triukšmo mažinimo funkcijos, kol įjungtas papildomas garsas" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Neįmanoma įjungti triukšmo mažinimo funkcijos, kai prijungta ausinė" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Neįmanoma įjungti triukšmo mažinimo funkcijos, kai įjungta „Bluetooth“ ausinė" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Neįmanoma įjungti triukšmo mažinimo funkcijos per plačiajuosčio ryšio pokalbius" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Jei norite naudotis šia funkcija, skambučių nustatymuose turite pasirinkti „Optimizuoti vienodintuvą už mane“" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Neįmanoma įjungti priimamų skambučių garso vienodintuvo, kai įjungtas garsiakalbis" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Neįmanoma įjungti priimamų skambučių garso vienodintuvo, kai prijungtos ausinės" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Neįmanoma įjungti priimamų skambučių garso vienodintuvo, kai įjungtos „Bluetooth“ ausinės" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Neįmanoma naudoti papildomo garso diapazono, kai prijungtos ausinės ar BT ausinės" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Skambinama..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kai įjungtas papildomas garsumas, negalima įjungti skambučio garso vienodintuvo" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Neįmanoma suaktyvinti priimamų skambučių garso vienodintuvo per plačiajuosčio ryšio pokalbius" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Neįmanoma įjungti triukšmo mažinimo funkcijos, kai įjungtas garsiakalbis" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Grupės skambut. (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Išsaugotas paveiks." + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Išsaugotas įr." + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Fotografuoti" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Tiesiog. įr." + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Perž. adresatą" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d praleistų skambučių" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Neatsakytas skambutis" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Papildomas garsas įjungtas" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Papildomas garsas išjungtas" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Ryšys iš telefono persiunčiamas" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Ryšiai iš telefono draudžiami" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Persiųstas skambutis" + diff --git a/ui/po/lv.po b/ui/po/lv.po new file mode 100755 index 0000000..a2f0ef9 --- /dev/null +++ b/ui/po/lv.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Noraidīt ar ziņu" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Pieņemt" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Piev. zv." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakti" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Aizturēt" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Apvienot" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Atteikt" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Skaļrunis" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Atsākt" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Noraidīt ar ziņu" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Beigt visas sarunas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Beigt aktīvās sarunas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Austiņas" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastatūra" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Izsl. sk." + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Savieno..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Noraidīts" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sūta..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Pārslēgt" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Aiztur sarunu ar %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Beidz sarunu ar %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Past. zemos toņus" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Past. augstos toņus" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimiz. kreisajai ausij" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimizēts labajai ausij" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Pārvaldīt konferences zvanu" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Skaņa" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Koplietot" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Kop. failu, izmant. ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Koplietot" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Zvans" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Izs. dal. nav pieej." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Zvans pabeigts" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Zvans noraidīts" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Atvienots" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Neatbild" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numurs mainīts" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numurs nepastāv" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Aizt.sar." + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personas" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Austiņ." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferences zvans" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistēmas kļūda" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Visi ienākošie zvani ir liegti" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Visi izejošie zvani ir liegti" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Zvans neizdevās" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Tikai ārkārtas zvani" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Zvans nav atļauts" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Zvans liegts" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Zvanu pāradresācija aktīva: vienmēr" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Zvanu pāradresācija aktīva: ja neatbild" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Aktivizēt zvanu pāradresāciju: ja nav sasniedzams" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Zvanu pāradresācija aktīva: ja aizņemts" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Zvans pāradresēts" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Nepareizs numurs" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Mainīt bezsaistes profilu uz citu tīkla pakalpojumu profilu" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Savienojas..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Neizdevās nosūtīt. Mēģiniet vēlreiz" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Ārkārtas zvans" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Tikai fiksēti zvani" + +msgid "IDS_CALL_POP_HELD" +msgstr "Aizturēts" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Aizturēšana neizdevās" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Aizturēšana netiek atbalstīta" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Viesabonēšanas laikā ienākošie zvani liegti" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nepabeigts" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Neizdevās apvienot" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Apvienošanu neatbalsta" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Tīkls aizņemts" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Tīkls nav pieejams" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Nav atlicis kredīts" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nav pakalpojuma" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Darbība atteikta" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Izejošie starptautiskie zvani, izņemot uz mājām, liegti" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Izejošie starptautiskie zvani liegti" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Tālrunis nav inicializēts" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Atkārto zvanu..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Pakalpojums nav atļauts" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Tikai SOS zvanus.\nIevietojiet SIM karti, lai piekļūtu tīkla pakalpojumiem" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Atdalīšana neizdevās" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Atdalīšanu neatbalsta" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Pārslēgšana neizdevās" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Pārslēgšanu neatbalsta" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Pārsūtīšana neizdevās" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Pārsūtīšanu neatbalsta" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nevar ielādēt" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nav pieejams" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Atsākts" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Atsākšanu neatbalsta" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Lietotājs aizņemts" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Pārbaudiet SIM karti vai ievietojiet derīgu SIM karti" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Videozvana laikā balss zvans nav atļauts" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Gaidīšana aktivizēta" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Nepareiza grupa" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Beigt aizturētās sarunas (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Uztvērējs" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aiztur. aktīvu zvanu" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nepietiek atmiņas. Izdzēsiet dažus vienumus" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Beigt" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Pakalpojums nav pieejams" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Ier." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Nezināmais zvans noraidīts" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "pēc %d dienām" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Rīt" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Pēc nedēļas" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Pieņemt zvanu pēc" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Trokšņu samaz. izsl." + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Trokšņu samaz. iesl." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ja ir aktivizēts papildu skaļuma līmenis, trokšņu mazināšanu nevar ieslēgt" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Nevar ieslēgt trokšņu samazināšanu, ja ir pievienota austiņa" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nevar ieslēgt trokšņu samazināšanu, ja ir ieslēgta Bluetooth austiņa" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Nevar ieslēgt trokšņu samazināšanu platjoslas zvanu laikā" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Lai izmantotu šo funkciju, izvēlnē Zvana iestatījumi atzīmējiet Optimizēt ekvalaizeri" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Nevar aktivizēt sarunas skaņas ekvalaizeri, kad ir ieslēgts skaļrunis" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Nevar aktivizēt sarunas skaņas ekvalaizeri, kad ir pievienotas austiņas" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nevar aktivizēt sarunas skaņas ekvalaizeri, kad ir ieslēgta Bluetooth austiņa" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Ja ir pievienotas austiņas vai Bluetooth austiņa, papildu skaļuma līmeni nevar izmantot" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Zvana..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nevar aktivizēt sarunas skaņas ekvalaizeri, ja ir aktivizēts papildu skaļuma līmenis" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Platjoslas zvanu laikā nevar aktivizēt sarunas skaņas ekvalaizeri" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Nevar ieslēgt trokšņu samazināšanu, ja ir ieslēgts skaļrunis" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Grupas zvans (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Saglabātais attēls" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Saglabātais video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Fotografēt" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Tiešr. video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Skat. kontaktu" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d neatbildēti zvani" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Neatbildēts zvans" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Aktivizēts papildu skaļuma līmenis" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Deaktivizēts papildu skaļuma līmenis" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Izejošs zvans ir pārsūtīts" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Izejošie zvani liegti" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Pārsūtīts zvans" + diff --git a/ui/po/mk.po b/ui/po/mk.po new file mode 100755 index 0000000..f222889 --- /dev/null +++ b/ui/po/mk.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Одбивање со порака" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Прифати" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Дод. повик" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Именик" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "На чекање" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Придружи" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Отфрли" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Звучник" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Врати" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Одбивање повик со порака" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Прекини ги сите повици" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Прекини активни повици (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Слушалки" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Тастатура" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Искл.звук" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Поврзување..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Отфрлено" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Се праќа..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Префрли" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s се задржува" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Се завршува на повикот со %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Засили ниски" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Засили високи" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Оптим. за левото уво" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Оптим. за десното уво" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Уреди конференциски повик" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Звук" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Сподели" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Сподели фајл преку ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Сподели" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Повик" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Бројот е недостапен" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Повикот е прекинат" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Повикот е одбиен" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Врската е прекината" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Нема одговор" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Бројот е сменет" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Бројот не постои" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "На чекање" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Луѓе" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Слушал." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Конференција" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Системска грешка" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Сите дојдовни повици се забранети" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Сите појдовни повици се забранети" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Неуспешен повик" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Само итни повици" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Не е дозволен повик" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Повикот е забранет" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Активно пренасочување на повиците: Секогаш" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Активно пренасочување на повиците: Кога нема одговор" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Активно пренасочување на повиците: Кога е недостапно" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Активно пренасочување на повиците: Кога е зафатено" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Повикот е пренасочен" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Погрешен број" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Смени од безмрежен во друг профил за мрежните услуги" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Бирање..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Неуспешно праќање. Обидете се повторно" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "SOS повик" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Само фиксни повици" + +msgid "IDS_CALL_POP_HELD" +msgstr "На чекање" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Неуспешно задржување" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Задржувањето не е поддржано" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Забрана за дојдовни при роаминг" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Нецелосно" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Неуспешно придружување" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Придружувањето не е поддржано" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Мрежата е зафатена" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Мрежата е недостапна" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Немате повеќе кредит" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Нема услуга" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Операцијата е одбиена" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Забрани појдовни освен дома" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Забранети појдовни меѓународни повици" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Телефонот не е активиран" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Повторно бирање..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Услугата не е дозволена" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Само SOS повици.\\Ставете ја SIM-картичката за да пристапите до мрежните услуги" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Неуспешно издвојување" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Издвојувањето не е поддржано" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Неуспешно заменување" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Заменувањето не е поддржано" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Неуспешно префрлување" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Префрлувањето не е поддржано" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Не може да се преземе" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Кога сте недостапни" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Вратено" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Враќањето не е поддржано" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Корисникот е зафатен" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Потврдете го SIM-от или вметнете важечки SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Не се дозволени гласовни повици за време на видео повик" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Чекањето е активно" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Погрешна група" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Прекини задржани повици (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Приемник" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Задржи акт. повик" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Нема доволно меморија. Избришете некој запис" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Крај" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Услугата е недостапна" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Сним." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Непознатиот повик е одбиен" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "за %d денови" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Утре" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "За една седмица" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Прифати повик после" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Без намалување нејаснотии" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Со намалување пречки" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Не може да се вклучи намалувањето шум кога е вклучена дополнителна гласност" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Не може да се вклучи намалувањето пречки кога се поврзани слушалки" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Не може да се вклучи намалувањето пречки кога се приклучени слушалки Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Не може да се вклучи намалувањето пречки при широкопојасни повици" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "За да ја користите оваа функција, треба да го штиклирате Оптимизирај еквализација за мене во Опции за повик" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Не може да се вклучи еквализација за повик кога е вклучен звучникот" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Не може да се вклучи еквализација за повик кога се поврзани слушалки" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Не може да се вклучи еквализација за повик кога е вклучена слушалка Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Не може да се користи опсегот на дополнителна гласност кога се поврзани слушалки или BT слушалка" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Повикување..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Не може да се вклучи еквализација за повик кога е вклучена дополнителна гласност" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Не може да се вклучи еквализација за повик при широкопојасни повици" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Не може да се вклучи намалувањето пречки кога е вклучен звучникот" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Конф. врска (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Снимена слика" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Сочувано видео" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Сликање" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Живо видео" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Види контакт" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d пропуштени повици" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Пропуштен повик" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Овозможена е дополнителна гласност" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Дополнителната гласност е исклучена" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Појдовниот повик е препратен" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Појдовните повици се забранети" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Пренасочен повик" + diff --git a/ui/po/nb.po b/ui/po/nb.po new file mode 100755 index 0000000..0ed76ea --- /dev/null +++ b/ui/po/nb.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Avvis med melding" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Godta" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Nytt anrop" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakter" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Parker" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Koble" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Avvis" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Høyttaler" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Opph vent" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Avvis anrop med melding" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Avslutt alle anrop" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Avslutte aktive samtaler (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Hodetelefoner" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastatur" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Demp" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Kobler til..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Avvist" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sender..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Skift" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Setter %s på vent" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Avslutter samtale med %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Øk lave toner" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Øk høye toner" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimal. for venstre øre" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimal. for høyre øre" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Administrer konferansesamtale" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Lyd" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Del" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Del fil via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Del" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Anrop" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Oppringt part utilgj." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Anrop avsluttet" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Anrop avvist" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Frakoblet" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Ikke svar" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nummer endret" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nummer finnes ikke" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "På vent" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Mennesker" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headsett" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Telefonmøte" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systemfeil" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alle inngående anrop sperret" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alle utgående samtaler sperret" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Samtale mislyktes" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Kun nødanrop" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Samtale ikke tillatt" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Samtale sperret" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Viderekobling aktiv: Alltid" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Viderekobling aktiv: Ikke svar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Viderekobling aktiv:\nIkke tilgjengelig" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Viderekobling aktiv:\nHvis opptatt" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Anroper er viderekoblet" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Feil nummer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Endre fra Offline til en annen profil for nettverkstjenester" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Ringer opp..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sendingen mislyktes. Prøv igjen" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Nødanrop" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Kun FDN-samtaler" + +msgid "IDS_CALL_POP_HELD" +msgstr "Hold" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Venting mislyktes" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Venting støttes ikke" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Innkommende anrop sperret når du roamer" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Ufullstendig" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Tilknytning mislyktes" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Tilknytning støttes ikke" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Nettverk opptatt" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Nettverket er ikke tilgjengelig" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kreditt oppbrukt" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nettv. mangler" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operasjon avvist" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Utgående internasjonale anrop unntatt hjemland sperret" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Utgående utenlandssamtaler sperret" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon ikke initialisert" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ringer opp igjen..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Tjeneste ikke tilgjengelig" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Bare nødanrop.\nSett inn SIM-kortet for å få tilgang til nettverkstjenester" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Deling mislyktes" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Deling støttes ikke" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Bytte feilet" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Bytte støttes ikke" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Overføringsfeil" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Overføring støttes ikke" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Kan ikke hente" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Utilgjengelig" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Opphev venting" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Opphev venting støttes ikke" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Opptatt" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Bekreft SIM-kort eller sett inn gyldig SIM-kort" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Samtale er ikke tillatt under videosamtale" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Venting aktiv" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Feil gruppe" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Avslutte samtaler satt på vent (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Mottaker" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Akt. samt. på vent" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ikke nok minne. Slett noen elementer" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Avslutt samtale" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Tjenesten er ikke tilgjengelig" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Ukjent samtale avvist" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "om %d dager" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "I morgen" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "På en uke" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Godta samtale etter" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Støyreduksjon av" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Støyreduksjon på" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kan ikke aktivere støyreduksjon mens ekstra volum er aktivert" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Kan ikke aktivere støyreduksjon når øretelefoner er tilkoblet" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kan ikke aktivere støyreduksjon når Bluetooth headset er på" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Kan ikke aktivere støyreduksjon under bredbåndsanrop" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "For å bruke denne funksjonen må du merke av for optimaliser EQ for meg under Anropsinnstillinger" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Kan ikke aktivere EQ-lyd under anrop når høyttaleren er på" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Kan ikke aktivere EQ-lyd under anrop når øretelefoner er koblet til" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kan ikke aktivere EQ-lyd under anrop når Bluetooth-headsetet er på" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Kan ikke bruke ekstra volumområde når øretelefoner eller BT-headset er koblet til" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Ringer..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kan ikke aktivere EQ-lyd under anrop når ekstra volum er aktivert" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Kan ikke aktivere EQ-lyd under anrop ved bredbåndsanrop" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Kan ikke aktivere støyreduksjon når høyttaler er på" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Gruppeanrop (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Lagret bilde" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Lagret video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Ta et bilde" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Direktevideo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Vis kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d tapte anrop" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Ubesvart anrop" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Ekstra volum aktivert" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Ekstra volum deaktivert" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Utgående samtale viderekoblet" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Utgående anrop sperret" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Viderekoblet samtale" + diff --git a/ui/po/nl_NL.po b/ui/po/nl_NL.po new file mode 100755 index 0000000..3de367a --- /dev/null +++ b/ui/po/nl_NL.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Weigeren met bericht" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Opnemen" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Nieuwe opr." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacten" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "In wacht" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Deeln." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Weigeren" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Luidspreker" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Uit wacht" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Oproep met bericht weigeren" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Alle gespr. beëindigen" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Actieve oproepen (%d) beëindigen" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Koptelefoons" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Toetsenbord" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Stil" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Verbinden..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Geweigerd" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Verzenden..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Wisselen" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s in de wacht zetten" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Oproep beëindigen met %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Lage tonen boost" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Hoge tonen boost" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimaal voor linkeroor" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimaal voor rechteroor" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Vergaderoproep beheren" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Geluid" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Delen" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Bestand delen via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Delen" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Oproepen" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Gebelde niet besch." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Oproep beëindigd" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Oproep geweigerd" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Verbinding verbroken" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Geen gehoor" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Nummer gewijzigd" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Nummer bestaat niet" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "In wacht" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Mensen" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Vergaderoproep" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systeemfout" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alle inkomende oproepen geblokkeerd" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alle uitgaande oproepen geblokkeerd" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Oproep mislukt" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Alleen noodoproepen" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Oproep niet toegestaan" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Oproep geblokkeerd" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Alle oproepen doorschakelen" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Oproepen doorschakelen bij geen antwoord" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Doorschakelen indien onbereikbaar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Doorschakelen bij in gesprek" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Oproep doorgestuurd" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Nummer onjuist" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Voor netwerkdiensten offlineprofiel in ander profiel wijzigen" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Kiezen..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Verzenden mislukt. Opnieuw" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Noodoproep" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Alleen FDN-oproepen" + +msgid "IDS_CALL_POP_HELD" +msgstr "In de wacht" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "In wacht zetten mislukt" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "In wacht zetten niet ondersteund" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Inkomende oproepen in buitenland geblokkeerd" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Niet compleet" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Deelnemen aan multiparty mislukt" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Deelnemen aan multiparty niet ondersteund" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Netwerk bezet" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Netwerk niet beschikbaar" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Beltegoed is op" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Geen netwerk" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Actie geweigerd" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Uitgaande internationale oproepen geblokkeerd behalve naar eigen land" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Uitgaande internationale oproepen geblokkeerd" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefoon niet geïnitialiseerd" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Opnieuw kiezen..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Dienst niet toegestaan" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Alleen noodoproepen mogelijk.\nVoor netwerkdiensten SIM-kaart plaatsen" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Uit multiparty halen mislukt" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Uit multiparty halen niet ondersteund" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Wisselen mislukt" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Wisselen niet ondersteund" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Fout bij doorverbinden" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Doorverbinden niet ondersteund" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Kan de details niet ophalen" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Niet beschikbaar" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Uit wacht halen" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Uit wacht halen niet ondersteund" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "In gesprek" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM controleren of geldige SIM plaatsen" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Spraakoproep is niet toegestaan tijdens videogesprek" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Wisselgesprek" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Onjuiste groep" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Oproepen in de wacht (%d) beëindigen" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Ontvanger" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Huidige opr in wacht" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Onvoldoende geheugen. Wis een aantal items" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Einde" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Service niet beschikbaar" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Opn." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Onbekende oproep geweigerd" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "over %d dagen" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Morgen" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Over een week" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Oproep accepteren na" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Ruisonderdrukking uit" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Ruisonderdrukking aan" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kan ruisreductie niet activeren terwijl extra volume is ingeschakeld" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Kan ruisreductie niet activeren wanneer oortelefoon is aangesloten" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kan ruisreductie niet activeren wanneer Bluetooth-headset is ingeschakeld" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Kan ruisreductie niet inschakelen tijdens breedbandoproepen" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Als u deze functie wilt gebruiken, moet u EQ voor mij optimaliseren inschakelen onder Oproepinstellingen" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Kan EQ toon tijdens gesprek niet activeren wanneer luidspreker is ingeschakeld" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Kan EQ toon tijdens gesprek niet activeren wanneer headset is aangesloten" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kan EQ toon tijdens gesprek niet activeren wanneer Bluetooth-headset is ingeschakeld" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Kan extra volumebereik niet gebruiken wanneer BT-headset of oortjes zijn aangesloten" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Bellen..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Kan EQ toon tijdens gesprek niet activeren wanneer extra volume is ingeschakeld" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Kan EQ toon tijdens gesprek niet activeren tijdens breedbandoproepen" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Kan ruisreductie niet activeren wanneer luidspreker is ingeschakeld" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Groepsoproep (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Opgesl. afbeelding" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Opgeslagen video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Foto nemen" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Live video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Contact tonen" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d gemiste opr." + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Gemiste oproep" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extra volume ingeschakeld" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extra volume uitgeschakeld" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Uitgaande oproepen doorgeschakeld" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Uitgaande oproepen geblokkeerd" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Oproep doorgeschakeld" + diff --git a/ui/po/pl.po b/ui/po/pl.po new file mode 100755 index 0000000..cd91896 --- /dev/null +++ b/ui/po/pl.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Odrzuć poł. z SMS" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Akceptuj" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Dod. poł." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakty" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Zawieś" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Dołącz" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Odrzuć" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Wł. głośnik" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Powróć" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Odrzuć połączenie z wiad." + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Zakończ wszystkie połącz." + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Zakończ aktywne połączenia (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Słuchawki" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Klawiat." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Wył.mikr." + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Łączenie..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Odrzucono" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Wysyłanie..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Przełącz" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Zawieszanie połączenia z %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Kończenie połączenia z %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Podbij tony niskie" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Podbij tony wysokie" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Zopt. dla lewego ucha" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Zopt. dla prawego ucha" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Zarządzaj połączeniem konferencyjnym" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Dźwięk" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Udostępnij" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Udost. plik przez ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Udostępnij" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Połączenia" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Rozmówca niedostępny" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Połączenie zakończone" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Połączenie odrzucone" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Rozłączono" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nie odpowiada" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numer zmieniony" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numer nie istnieje" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Zawiesz." + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Osoby" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Słuchawki" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferencja" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Błąd systemu" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Wszystkie połączenia przychodzące zablokowane" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Wszystkie połączenia wychodzące zablokowane" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Błąd połączenia" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Tylko połączenia alarmowe" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Połączenie niedozwolone" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Połączenie zablokowane" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Przekazywanie połączeń aktywne: Zawsze" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Przekazywanie połączeń aktywne: Gdy nie odpowiada" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Przekazywanie połączeń aktywne: Gdy niedostępny" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Przekazywanie połączeń aktywne: Gdy zajęty" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Połączenie przesłane" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Błędny numer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Wyłącz tryb offline, aby skorzystać z usług sieciowych." + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Wybieranie numeru..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Błąd wysyłania. Spróbuj ponownie" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Połączenie alarmowe" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Tylko połączenia FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Zawieszono" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Błąd zawieszenia" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Zawieszanie nieobsługiwane" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Połączenia przychodzące blokowane w ramach roamingu" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Niekompletne" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Błąd dołączania" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Dołączanie nieobsługiwane" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Sieć zajęta" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Sieć niedostępna" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kredyt wyczerpany" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Brak sieci" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operacja odrzucona" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Zablokowane międzynarodowe połączenia wychodzące oprócz tych z krajem macierzystym" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Wychodzące poł. międzynarodowe zablokowane" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon nie został zainicjowany" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ponowne wybieranie..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Usługa niedozwolona" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Możliwe tylko połączenie SOS.\nWłóż kartę SIM, aby uzyskać dostęp do usług sieciowych" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Błąd odłączania" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Odłączanie nieobsługiwane" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Błąd zamiany" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Zamiana nieobsługiwana" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Błąd transferu" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Przełączanie nieobsługiwane" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nie można pobrać" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Niedostępny" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Powrócono" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Powrót nieobsługiwany" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Użytkownik zajęty" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Sprawdź lub włóż prawidłową kartę SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Podczas połączenia wideo nie jest dozwolone połączenie głosowe" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Oczekiwanie aktywne" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Błędna grupa" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Zakończ zawieszone połączenia (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Odbiornik" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Zawieś aktywne poł." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Brak pamięci. Usuń niektóre elementy" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Rozłącz" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Usługa niedostępna" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "REC" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Nieznane połączenie odrzucone" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "za %d dni" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Jutro" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Za tydzień" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Odbierz połączenie później" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Wył. redukcję szumów" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Wł. redukcję szumów" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nie można włączyć redukcji szumów, gdy dodatkowa głośność jest włączona" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Nie można włączyć redukcji szumów, gdy słuchawka jest podłączona" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nie można włączyć redukcji szumów, gdy zestaw słuchawkowy Bluetooth jest włączony" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Nie można włączyć redukcji szumów podczas połączeń szerokopasmowych" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Aby korzystać z tej funkcji, musisz sprawdzić zoptymalizowany korektor w ustawieniach połączeń" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Nie można włączyć bieżącego korektora dźwięków, gdy głośnik jest włączony" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Nie można włączyć bieżącego korektora dźwięków, gdy słuchawki są podłączone" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nie można włączyć bieżącego korektora dźwięków, gdy zestaw słuchawkowy Bluetooth jest włączony" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Nie można użyć podwyższonego zakresu głośności, jeśli podłączone są słuchawki lub zestaw BT" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Łączenie..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nie można włączyć bieżącego korektora dźwięków, gdy dodatkowa głośność jest włączona" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Nie można włączyć bieżącego korektora dźwięków podczas połączeń szerokopasmowych" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Nie można włączyć redukcji szumów, gdy głośnik jest włączony" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Połącz. grup. (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Zapisany obraz" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Zapisany film" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Zrób zdjęcie" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Film na żywo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Wyśw. kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "Nieodebr. poł.: %d" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Połączenie nieodebrane" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Włączono dodatkową głośność" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Wyłączono dodatkową głośność" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Przekazane połączenie wychodzące" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Zablokowane połączenia wychodzące" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Połączenie przekierowane" + diff --git a/ui/po/pt_BR.po b/ui/po/pt_BR.po new file mode 100755 index 0000000..14c5025 --- /dev/null +++ b/ui/po/pt_BR.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rejeitar com mensagem" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceitar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ad. Cham." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contatos" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Espera" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Confer." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rejeitar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Viva-voz" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Recuperar" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rejeitar chamada com mensagem" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Encerrar todas as chamadas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Encerrar chamadas ativas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Fones de ouv." + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silenciar" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Conectando..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejeitado" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Enviando…" + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Trocar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Colocar %s em espera" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Finalizar chamada com %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Reforçar tons baixos" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Reforço tons altos" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Otimizado p/ ouvido esq." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Otimizado p/ ouvido dir." + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Gerenciar conferência telefônica" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Som" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Compartilhar" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Compart. arq. via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Compartilhar" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Chamadas" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destinatario indispon." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Chamada encerrada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Chamada rejeitada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desconectado" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Sem resposta" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Número alterado" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Número inexistente" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Em espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Pessoas" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "F. ouvido" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conferência" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erro de sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Todas as chamadas recebidas restritas" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Todas as chamadas efetuadas restritas" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Falha na chamada" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Somente chamadas de emergência" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Chamada não permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Chamada restrita" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvio de chamadas ativado: sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvio de chamadas ativado: não atende" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvio de chamadas ativado: fora do alcance" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvio de chamadas ativado: se ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Chamada encaminhada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número incorreto" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Saia do perfil Offline para acessar os serviços de rede" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Discando..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Erro ao enviar. Tente novamente" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Chamada de emergência" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Só chamadas FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Em espera" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Espera mal sucedida" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Espera não suportada" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Chamadas recebidas restritas quando em roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Não efetuado" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Conferência malsucedida" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Conferência não suportada" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Rede ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Rede indisponível" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Créditos esgotados" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sem serviço" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operação recusada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Chamadas internacionais efetuadas restritas exceto local" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Chamadas internationais efetuadas restritas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "O telefone não foi inicializado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Rediscando..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Serviço não permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Apenas chamadas SOS.\nInsira o cartão SIM para acessar os serviços de rede" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Erro ao dividir" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Dividir não suportado" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Erro ao alternar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Alternar não suportado" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Erro ao transferir" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferência não suportada" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Impossível recuperar" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Indisponível" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Recuperada" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Recuperar não suportado" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Usuário ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verificar SIM ou inserir SIM válido" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Chamada de voz não permitida durante videochamada" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Espera ativada" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo incorreto" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Encerrar chamadas em espera (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Destinatário" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Ch. ativa em espera" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memória insuficiente. Apague alguns itens" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Encerrar chamada" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Serviço não disponível" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Grav." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Chamada desconhecida rejeitada" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "dentro de %d dias" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Amanhã" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Dentro de uma semana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Aceitar chamada depois de" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Desativar redução de ruído" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Ativar redução de ruído" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Não é possível ligar a redução de ruído enquanto o volume adicional está ativado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Impossível ligar a redução de ruído quando o fone de ouvido estiver conectado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossível ligar a redução de ruído quando o fone de ouvido Bluetooth estiver conectado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Impossível conectar a redução de ruído durante as chamadas de banda larga" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Para usar esta função, selecione otimizar EQ para mim em Configurações de chamadas" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Não é possível ativar EQ de som de chamadas quando o alto-falante está ligado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Não é possível ativar EQ de som de chamadas quando fones de ouvido estão conectados" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Não é possível ativar EQ de som de chamadas quando o headset Bluetooth está ligado" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Não é possível ajustar o volume extra quando fones de ouvido ou Bluetooth estão conectados" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Chamando..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Não é possível ativar o EQ de som em chamada enquanto o volume adicional está ativado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Não foi possível ativar o EQ de som na chamada durante chamadas de banda larga" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Impossível conectar a redução de ruído quando o alto-falante estiver ligado" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Cham. grupo (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imagem salva" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vídeo salvo" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Tirar uma foto" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vídeo ao vivo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Exibir contato" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d chamadas perdidas" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Chamada Perdida" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volume Extra ativado" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volume Extra desativado" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Chamada efetuada encaminhada" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Chamadas efetuadas restritas" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Chamada encaminhada" + diff --git a/ui/po/pt_PT.po b/ui/po/pt_PT.po new file mode 100755 index 0000000..207e10d --- /dev/null +++ b/ui/po/pt_PT.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Rejeitar com mensagem" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Aceitar" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Adicionar" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contactos" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Reter" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Aderir" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rejeitar" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Altifalante" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Obter" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Rejeitar chamadas com mensagem" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Terminar todas chamadas" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Terminar chamadas activas (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Auscultadores" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Teclado" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Silenciar" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "A ligar..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rejeitado" + +msgid "IDS_CALL_POP_SENDING" +msgstr "A enviar..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Trocar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Colocar %s em espera" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Terminar chamada com %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Ampl. tons graves" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Ampl. tons agudos" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimizada p/ ouvido esq." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimizada p/ ouvido dir." + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Gerir chamada de conferência" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Som" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Partilhar" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Partilhar fich. via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Partilhar" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Chamada" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Destinatario indispon" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Chamada terminada" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Chamada rejeitada" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Desligado" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Não atendida" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Número alterado" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Número inexistente" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Em espera" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Pessoas" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Auricular" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Chamada de conferência" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Erro de sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Todas as chamadas recebidas restringidas" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Todas as chamadas efectuadas restringidas" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Falha na chamada" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Apenas chamadas de emergência" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Chamada não permitida" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Chamada restringida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Desvio de chamadas activado: Sempre" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Desvio de chamadas activado: Não atende" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Desvio de chamadas activado: Incontactável" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Desvio de chamadas activado: Se ocupado" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Chamada encaminhada" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Número incorrecto" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Mudar de Offline para outro perfil para serviços de rede" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "A marcar..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Falha ao enviar. Tente novamente" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Chamada de emergência" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Só chamadas FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Retida" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Falha ao colocar em espera" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Função de espera não suportada" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Chamadas recebidas barradas quando em roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incompleto" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Falha ao aderir" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Adesão não suportada" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Rede ocupada" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Rede indisponível" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Crédito esgotado" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Sem serviço" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operação recusada" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Chamadas internacionais efectuadas barradas excepto para origem" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Chamadas internacionais restringidas" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "O telefone não foi inicializado" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "A remarcar..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Serviço não permitido" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Apenas chamada SOS.\nInsira o cartão SIM para aceder aos serviços de rede" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Falha ao dividir" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Divisão não suportada" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Falha ao mudar" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Mudança não suportada" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Erro de transferência" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transferência não suportada" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Impossível receber" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Indisponível" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Obtida" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Retoma não suportada" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Utilizador ocupado" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verificar SIM ou inserir SIM válido" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Chamada de voz não permitida durante chamada de vídeo" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Espera activa" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grupo incorrecto" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Terminar chamadas em espera (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Destinatário" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Col. ch. act. em es." + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memória insuficiente. Apague alguns itens" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Ter. ch." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Serviço não disponível" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "GRAV." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Chamada anónima rejeitada" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "dentro de %d dias" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Amanhã" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Dentro de uma semana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Aceitar chamada depois de" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Desligar redução de ruído" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Ligar redução de ruído" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossível ligar a redução de ruído quando o volume extra está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Impossível ligar a redução de ruído quando o auricular está ligado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossível ligar a redução de ruído quando o auricular Bluetooth está ligado" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Impossível ligar a redução de ruído durante as chamadas de banda larga" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Para utilizar esta função, tem de marcar Optimizar EQ para mim nas definições de Chamada" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Impossível activar o EQ do som de chamada recebida quando o altifalante está ligado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Impossível activar o EQ do som de chamada recebida quando os auscultadores estão ligados" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Impossível activar o EQ do som de chamada recebida quando o auricular Bluetooth está ligado" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Impossível utilizar o intervalo de volume extra quando estão ligados auscultadores ou auriculares BT" + +msgid "IDS_CALL_POP_CALLING" +msgstr "A chamar..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Impossível activar o EQ do som de chamada recebida quando o volume extra está activado" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Impossível activar o EQ do som de chamada recebida durante chamadas de banda larga" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Impossível ligar a redução de ruído quando o altifalante está ligado" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Chamada grupo (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imagem guardada" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Vídeo guardado" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Tirar uma fotografia" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Vídeo direc." + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Ver contacto" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d chamadas perdidas" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Chamada não atendida" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volume extra activado" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volume extra desactivado" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Chamada efectuada reencaminhada" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Chamadas efectuadas barradas" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Chamada reencaminhada" + diff --git a/ui/po/ro.po b/ui/po/ro.po new file mode 100755 index 0000000..2f08a8a --- /dev/null +++ b/ui/po/ro.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Respingere cu mesaj" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Acceptare" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Ad. apel" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Contacte" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "În aşteptare" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Conf." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Resping." + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Difuzor" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Reluare" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Respingere apel cu mesaj" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Închidere totală apeluri" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Terminare apeluri active (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Căşti" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastatură" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Mc. oprit" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Conectare" + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Respins" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Se trimite..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Comutare" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Se trece %s în aşteptare" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Terminare apel cu %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Tonuri joase ampl." + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Tonuri înalte ampl." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimiz. pt. urechea stg." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimiz. pt. urechea drp." + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Gestionare apel conferinţă" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Sunet" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Partajare" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Partajaţi fiş. prin ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Partajare" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Apel" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Pers. apelată indisp." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Apel terminat" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Apel respins" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Deconectat" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nici un răspuns" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "S-a schimbat numărul" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Număr inexistent" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "În aşt." + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Participanţi" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Cască" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Conferinţă prin telefon" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Eroare de sistem" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Toate apelurile primite blocate" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Toate apelurile efectuate blocate" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Apel eşuat" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Numai apeluri de urgenţă" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Apel nepermis" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Apel blocat" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Redirecţionarea apelurilor activă: Întotdeauna" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Redirecţionarea apelurilor activă: Niciun răspuns" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Redirecţionarea apelurilor activă: De negăsit" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Redirecţionarea apelurilor activă: Când este ocupat" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Apel redirecþionat" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Număr greşit" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Schimbaţi din profilul Offline într-un alt profil pentru serviciile de reţea" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Formare nr...." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Trimitere nereuşită. Reîncercaţi" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Apel de urgenţă" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Numai apeluri FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Reţinut" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Menţinere nereuşită" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Menţinere neacceptată" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Apeluri de intrare blocate în roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Incomplet" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Asociere nereuşită" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Asociere neacceptată" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Reţea ocupată" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Reţea indisponibilă" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Credit epuizat" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nici un serviciu" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operaţie refuzată" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Apeluri internaţionale de ieşire blocate cu excepţia celor spre zona de domiciliu" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Apeluri internaţionale expediate blocate" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefonul nu este iniţializat" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Se reapelează..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Serviciu nepermis" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Numai apeluri SOS.\nIntroduceţi cartela SIM pentru a accesa serviciile de reţea" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Separare nereuşită" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Separare neacceptată" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Permutare nereuşită" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Permutare neacceptată" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer nereuşit" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer neacceptat" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Imposibil de regăsit" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Indisponibil" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Menţinere anulată" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Anulare menţinere neacceptată" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Utilizator ocupat" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verificaţi cartela SIM sau introduceţi o cartelă SIM validă" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Apelul vocal nu e permis în timpul apelului video" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Aşteptare activă" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Grup greşit" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Terminare apeluri reţinute (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Receptor" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Reţinere apel activ" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memorie insuficientă. Ştergeţi câteva elemente" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Termin. apel" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Serviciu indisponibil" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Înr." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Apel necunoscut respins" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "peste %d zile" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Mâine" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Peste 1 săptămână" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Acceptare apel după" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Reducere zgomot oprită" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Reducere zgomot activată" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Imposibil de activat reducerea zgomotului când volumul suplimentar este activat" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Imposibil de activat reducerea zgomotului când casca este conectată" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Imposibil de activat reducerea zgomotului când casca Bluetooth este pornită" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Imposibil de activat reducerea zgomotului pe durata apelurilor de bandă largă" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Pentru a utiliza această funcţie, trebuie să bifaţi Optimizare EQ pentru mine la Setări apel" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Imposibil de activat EQ de sunet pentru apelul primit când difuzorul este pornit" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Imposibil de activat EQ de sunet pentru apelul primit când căştile sunt conectate" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Imposibil de activat EQ de sunet pentru apelul primit când casca Bluetooth este pornită" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Nu se poate utiliza intervalul de volum suplimentar când căştile sau casca BT sunt conectate" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Se apelează..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Imposibil de activat EQ de sunet pentru apelul de intrare când volumul suplimentar este activat" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Imposibil de activat EQ de sunet pentru apelul de intrare pe durata apelurilor de bandă largă" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Imposibil de activat reducerea zgomotului când difuzorul este pornit" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Apel grup (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Imagine salvată" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Videoclip salvat" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Fotografiere" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Video live" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Vizual. cont." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d apeluri pierdute" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Apel pierdut" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Volum suplimentar activat" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Volum suplimentar dezactivat" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Apel efectuat redirecţionat" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Apeluri de ieşire blocate" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Apel redirecţionat" + diff --git a/ui/po/ru_RU.po b/ui/po/ru_RU.po new file mode 100755 index 0000000..a26fc36 --- /dev/null +++ b/ui/po/ru_RU.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Отклонить и отправить сообщение" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Принять" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Доб. вызов" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Контакты" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Удержать" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Конф." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Отказ" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Динамик" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Извлечь" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Отклонить вызов с сообщением" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Завершить все вызовы" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Завершить активные вызовы (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Наушники" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Клавиатура" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Звук" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Подключение..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Отклонено" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Отправка..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Переключение" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Помещение вызова %s на удержание" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Завершение разговора с %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Усил. низкие тоны" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Усил. высокие тоны" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Оптим. для лев. наушника" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Оптим. для прав. наушника" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Управление конференцией" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Звук" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Отправить" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Отправить через ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Доступ" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "Мой звуковой сигнал" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Вызовы" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Абонент недоступен" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Вызов завершен" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Вызов отклонен" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Отключено" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Нет ответа" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Номер изменен" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Номер не существует" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Удержание" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Люди" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Гарнитура" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Конференция" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Системная ошибка" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Все входящие вызовы запрещены" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Все исходящие вызовы запрещены" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Сбой вызова" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Только экстренные вызовы" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Вызов запрещен" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Вызов запрещен" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Переадресация вызовов: Всегда" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Переадресация вызова: Нет ответа" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Переадресация вызовов: Если недоступен" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Переадресация вызова: Если занято" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Вызов переадресован" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Неверный номер" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Выключите автономный режим для использования сервисов сети" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Вызов..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Сбой отправки. Повторите попытку" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Экстренный вызов" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Только разрешенные вызовы" + +msgid "IDS_CALL_POP_HELD" +msgstr "Удержано" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Сбой удержания" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Удержание не поддерживается" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Входящие вызовы запрещены при роуминге" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Не завершено" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Сбой объединения" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Объединение не поддерживается" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Сеть занята" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Сеть недоступна" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Нет средств на счете" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Нет сети" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Операция отклонена" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Запрет исходящих международных вызовов, кроме домашних" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Исходящие международные вызовы запрещены" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Телефон не инициализирован" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Повторный набор..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Услуга запрещена" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Только экстренный вызов.\nДля доступа к услугам сети вставьте SIM-карту" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Сбой разделения" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Разделение не поддерживается" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Сбой переключения" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Переключение не поддерживается" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Сбой передачи" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Перевод не поддерживается" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Невозможно извлечь" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Недоступно" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Извлечено" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Извлечение не поддерживается" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Абонент занят" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Проверьте SIM-карту или вставьте действующую SIM-карту" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Голосовой вызов невозможен во время видеовызова" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Ожидание включено" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Неверная грyппа" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Завершить удерживаемые вызовы (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Динамик" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Удержать акт. вызов" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Недостаточно памяти. Удалите некоторые элементы" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Заверш." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Услуга недоступна" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Зап." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Неизвестный вызов отклонен" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "через %d дн." + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Завтра" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Через неделю" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Принять вызов через" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Выключить шумоподавление" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Включить шумоподавление" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Невозможно включить шумоподавление, если включена дополнительная громкость" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Невозможно включить шумоподавление, если подключены наушники" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Невозможно включить шумоподавление, если включена гарнитура Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Невозможно включить шумоподавление, если используется WCDMA" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Чтобы воспользоваться этой функцией, необходимо поставить флажок рядом с пунктом \"Оптимизировать пользовательский эквалайзер\" в настройках вызова" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Включить эквалайзер звука во время вызова при работающем динамике нельзя" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Включить эквалайзер звука во время вызова при подключенных наушниках нельзя" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Включить эквалайзер звука во время вызова при подключенной Bluetooth-гарнитуре нельзя" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Невозможно использовать дополнительный диапазон громкости, если подключены наушники или гарнитура Bluetooth" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Вызов..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Включить эквалайзер звука во время вызова при использовании дополнительной громкости нельзя" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Невозможно включить эквалайзер звука во время вызова, если используется WCDMA" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Невозможно включить шумоподавление, если включен динамик" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Групповой вызов (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Сохраненное фото" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Сохраненное видео" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Сделать снимок" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Трансляция" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Просм. контакт" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "Пропущено вызовов: %d" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Пропущенный вызов" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Включена дополнительная громкость" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Дополнительная громкость отключена" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Исходящий вызов переадресован" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Запрет исходящих вызовов" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Переадресованный вызов" + diff --git a/ui/po/sk.po b/ui/po/sk.po new file mode 100755 index 0000000..c09dbc7 --- /dev/null +++ b/ui/po/sk.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Odmietnuť so správou" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Prijať" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Pr. hovor" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakty" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Podržať" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Spojiť" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Odmietnuť" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Reprod." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Uvoľniť" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Odmietnuť hovor so správou" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Ukončiť všetky hovory" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Ukončiť aktívne hovory (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Slúchadlá" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Kláv." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Stlmiť" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Pripájanie..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Odmietnuté" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Odosielanie..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Prepnúť" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s sa podrží" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Ukončuje sa hovor s používateľom %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Zvýraz. nízke tóny" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Zvýraz. vysoké tóny" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimaliz. pre ľavé ucho" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimaliz. pre pravé ucho" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Spravovať konferenčný hovor" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Zvuk" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Zdieľať" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Zdieľať súbor cez ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Zdieľať" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Hovor" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Volaný účast. je ned." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Hovor ukončený" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Hovor bol odmietnutý" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Odpojené" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Žiadna odpoveď" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Číslo bolo zmenené" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Číslo neexistuje" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Podržaný" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Ľudia" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenčný hovor" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systémová chyba" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Všetky prichádzajúce hovory blokované" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Všetky odchádzajúce hovory blokované" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Hovor sa nepodaril" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Len tiesňové volania" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Hovor nie je povolený" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Hovor je blokovaný" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Presmerovanie hovorov je aktívne: Vždy" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Presmerovanie hovorov je aktívne: Ak žiadna odpoveď" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Presmerovanie hovorov je aktívne: Ak nedostupné" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Presmerovanie hovorov je aktívne: Ak obsadené" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Hovor bol presmerovaný" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Zlé číslo" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Zmeniť z profilu offline na iný profil pre sieťové služby" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Vytáčanie..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Odoslanie zlyhalo. Skúste to znova" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Tiesňový hovor" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Iba hovory FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Podržaný" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Podržanie zlyhalo" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Podržanie nie je podporované" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Prichádzajúce hovory blokované pri roamingu" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nedokončené" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Spojenie zlyhalo" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Spojenie nie je podporované" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Sieť obsadená" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Sieť nedostupná" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Žiadny kredit" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Žiadna služba" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operácia bola odmietnutá" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Odchádzajúce medzinárodné hovory okrem domácich sú blokované" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Medzinár. odchádzajúce hovory blokované" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefón nie je inicializovaný" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Opakované vytáčanie..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Služba nie je povolená" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Iba tiesňový hovor.\nVložte SIM kartu na prístup k službám siete" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Rozdelenie zlyhalo" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Rozdelenie nie je podporované" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Prehodenie zlyhalo" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Prehodenie nie je podporované" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Chyba prenosu" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Prenos nie je podporovaný" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nedá sa prevziať" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nie je k dispozícii" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Nepodržaný" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Zrušenie podržania nie je podporované" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Užívat. obsadený" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Overte kartu SIM alebo vložte platnú kartu SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Hlasový hovor nie je povolený počas videohovoru" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Čakanie je aktívne" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Chybná skupina" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Ukončiť podržané hovory (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Prijímač" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Podrž. aktívny hovor" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedostatok pamäte. Vymažte niektoré položky" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Uk. hov." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Služba je nedostupná" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Zázn." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Neznámy hovor odmietnutý" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "v priebehu %d dní" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Zajtra" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Za týždeň" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Prijať hovor po" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Vypnúť potlačenie šumu" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Zapnúť potlačenie šumu" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Potlačenie šumu sa nedá zapnúť, keď je zapnutá zvýšená hlasitosť" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Potlačenie šumu sa nedá zapnúť, keď je pripojené slúchadlo" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Potlačenie šumu sa nedá zapnúť, keď je zapnutá náhlavná súprava Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Potlačenie šumu sa nedá zapnúť počas širokopásmových hovorov" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Ak chcete použiť túto funkciu, musíte začiarknuť možnosť optimalizácie ekvalizéra pre používateľa v menu Nastavenia hovoru" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Zvukový ekvalizér počas hovoru sa nedá aktivovať, keď je zapnutý reproduktor" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Zvukový ekvalizér počas hovoru sa nedá aktivovať, keď sú pripojené slúchadlá" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Zvukový ekvalizér počas hovoru sa nedá aktivovať, keď sú zapnuté slúchadlá s mikrofónom Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Keď sú pripojené slúchadlá alebo slúchadlá BT s mikrofónom, nemožno použiť rozsah extra hlasitosti" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Volanie..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Zvukový ekvalizér počas hovoru sa nedá aktivovať, keď je zapnutá zvýšená hlasitosť" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Zvukový ekvalizér počas hovoru sa nedá aktivovať počas širokopásmových hovorov" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Potlačenie šumu sa nedá zapnúť, keď je zapnutý reproduktor" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Skupinový hovor (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Uložený obrázok" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Uložené video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Snímať fotografiu" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Živé video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Zobr. kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "Počet zmeškaných hovorov: %d" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Zmeškaný hovor" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extra hlasitosť zapnutá" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extra hlasitosť vypnutá" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Odchádzajúci hovor preposlaný" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Odchádzajúce hovory blokované" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Presmerovaný hovor" + diff --git a/ui/po/sl.po b/ui/po/sl.po new file mode 100755 index 0000000..77afa9b --- /dev/null +++ b/ui/po/sl.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Zavrni s sporočilom" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Sprejmi" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Dodaj klic" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Stiki" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Zadrži" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Pridruži" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Zavrni" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Zvočnik" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Sprosti" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Zavrni klic s sporočilom" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Končaj vse klice" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Končaj aktivne klice (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Slušalke" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tipkovn." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Nemo" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Povezujem..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Zavrnjeno" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Pošiljam..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Preklopi" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Daj osebo %s na čakanje" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Končaj klic z osebo %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Poudari nizke tone" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Poudari visoke tone" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimirano za levo uho" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimirano za desno uho" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Uredi konferenčni klic" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Zvok" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Deli" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Deljenje dat. prek ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Deli" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Klic" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Klicani ni dosegljiv" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Klic končan" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Klic je zavrnjen" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Prekinjeno" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Ni odgovora" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Št. spremenjena" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Številka ne obstaja" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Zadržano" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Ljudje" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Slušal." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenčni klic" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistemska napaka" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Zapora vseh dohodnih klicev" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Vsi izhodni klici omejeni" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Klic ni uspel" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Samo klici v sili" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Klic ni dovoljen" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Zapora klica" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Preusmeritev klicev je vključena: Vedno" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Preusmeritev klicev je vključena: Ni odgovora" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Preusmeritev klicev je vključena: Nedosegljiv(a)" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Preusmeritev klicev je vključena: Ko sem zaseden(a)" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Klic je preusmerjen" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Napačna številka" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Preklopi iz Brez povezave na drug profil za omrežne storitve" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Kličem..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Pošiljanje ni uspelo. Poskusite znova" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Klic v sili" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Samo klici FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Zadržan" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Zadržanje ni uspelo" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Zadržanje ni podprto" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Zapora dohodnih klicev med gostovanjem" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nedokončano" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Pridruževanje ni uspelo" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Pridruževanje ni podprto" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Omrežje je zasedeno" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Omrežje ni na voljo" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Ni stanja na računu" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Ni storitve" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operacija zavrnjena" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Zapore mednarodnih klicev, razen domov" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Odhodni mednarodni klici so blokirani" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon ni inicializiran" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ponovno izbiranje ..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Storitev ni dovoljena" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Samo klici v sili.\nZa dostop do omrežnih storitev vstavite kartico SIM" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Razdelitev ni uspela" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Razdelitev ni podprta" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Menjava ni uspela" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Menjava ni podprta" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Prenos ni uspel" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Prenos ni podprt" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Ni mogoče naložiti" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Ni na voljo" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Sproščeno" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Sprostitev ni podprta" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Uporabnik zaseden" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Preverite kartico SIM ali vnesite veljavno kartico SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Glasovni klic ni dovoljen med video klicem" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Čakanje je vključeno" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Napačna skupina" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Končaj zadržane klice (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Sprejemnik" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Zadrži aktivni klic" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ni dovolj pomnilnika. Izbrišite nekaj predmetov" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Kon.klic" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Storitev ni na voljo" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Snem." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Neznani klic je zavrnjen" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "v %d dneh" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Jutri" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Čez en teden" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Sprejmi klic, ko" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Zmanjšanje šuma je izključeno" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Zmanjšanje šuma je vključeno" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Funkcije za zmanjšanje šuma ni mogoče vključiti, če je omogočena dodatna glasnost" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Funkcije za zmanjšanje šuma ni mogoče vključiti, ko je priključena slušalka" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Funkcije za zmanjšanje šuma ni mogoče vključiti, ko je vključena slušalka Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Funkcije za zmanjšanje šuma ni mogoče izklopiti med širokopasovnimi klici" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Če želite uporabljati to funkcijo, morate potrditi polje za optimiranje izenačevalnika za mene v klicnih nastavitvah" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Izenačevalnika zvoka med klicem ni mogoče vključiti, ko je vključen zvočnik" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Izenačevalnika zvoka med klicem ni mogoče vključiti, ko so priključene slušalke" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Izenačevalnika zvoka med klicem ni mogoče vključiti, ko so priključene slušalke Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Če so priključene navadne ali BT slušalke, dodane glasnosti ni mogoče uporabiti" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Kličem ..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Izenačevalnika zvoka med klicem ni mogoče vključiti, ko je omogočena dodatna glasnost" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Izenačevalnika zvoka med klicem ni mogoče vključiti med širokopasovnimi klici" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Funkcije za zmanjšanje šuma ni mogoče vključiti, ko je vključen zvočnik" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Skupinski klic (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Shranjena slika" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Shranjen video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Slikaj" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Video v živo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Ogled stika" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d neodgovorjenih klicev" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Neodgovorjen klic" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Dodatna glasnost je omogočena" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Dodatna glasnost je onemogočena" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Odhodni klic je posredovan" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Odhodni klici so blokirani" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Posredovan klic" + diff --git a/ui/po/sr.po b/ui/po/sr.po new file mode 100755 index 0000000..6c52872 --- /dev/null +++ b/ui/po/sr.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Odbaci uz slanje poruke" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Prihvati" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Dodaj poz." + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakti" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Čekanje" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Pridruži" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Odbaci" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Zvučnik" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Obus.ček." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Odbaci poziv uz slanje poruke" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Završi sve pozive" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Prekini aktivne pozive (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Slušalice" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tastatura" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Isklj.ton" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Povezivanje..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Odbijeno" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Slanje..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Prebaci" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Stavljanje %s na čekanje" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Završavanje poziva uz %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Pojačaj niske ton." + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Pojačaj visoke ton." + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimizovan za levo uvo" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimizovan za desno uvo" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Organizuj konferencijsku vezu" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Zvuk" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Podeli" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Podeli fajl putem ChatON-a" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Podeli" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Poziv" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Pozvani broj nedost." + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Poziv završen" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Poziv odbačen" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Prekinuta veza" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Nema odgovora" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Broj promenjen" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Broj ne postoji" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Na ček." + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Ljudi" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Slušal." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferencijski poziv" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Greška sistema" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Svi dolazni pozivi zabranjeni" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Svi odlazni pozivi zabranjeni" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Poziv neuspešan" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Samo pozivi u hitnim slučajevima" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Poziv nije dozvoljen" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Poziv zabranjen" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Preusmeravanje poziva aktivno: Uvek" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Preusmeravanje poziva aktivno: Nema odgovora" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Preusmeravanje poziva aktivno: Broj nedostupan" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Preusmeravanje poziva aktivno: Kad je zauzet" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Poziv preusmeren" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Pogrešan broj" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Promeni Offline profil u neki drugi zbog pristupa mrežnim uslugama" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Biranje..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Slanje neuspešno. Probaj ponovo" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Pozivi u hitnim slučajevima" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Samo pozivi brojeva fiksnog biranja" + +msgid "IDS_CALL_POP_HELD" +msgstr "Zadržan" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Čekanje neuspešno" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Čekanje nije podržano" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Zabrana dolaznih poziva u romingu" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Nedovršeno" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Pridruživanje neuspešno" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Pridruživanje nije podržano" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Mreža zauzeta" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Mreža nedostupna" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Nema više kredita" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Nema prijema" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operacija odbijena" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Zabrani odlazne međunarodne pozive osim domovine" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Odlazni međunarodni pozivi zabranjeni" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon nije inicijalizovan" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Ponovno pozivanje..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Usluga nedozvoljena" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Samo SOS pozivi.\nUbaci SIM karticu za pristup mrežnim uslugama" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Razdvajanje neuspešno" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Razdvajanje nije podržano" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Zamena neuspešna" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Zamena nije podržana" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Prenos neuspešan" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Prenos nije podržan" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Nemoguće primiti" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Nedostupno" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Nezadržani" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Obustavljanje čekanja nije podržano" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Korisnik zauzet" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Potvrdi SIM ili ubaci važeći SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Govorni poziv nije dozvoljen u toku video poziva" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Čekanje aktivno" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Pogrešna grupa" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Prekini pozive na čekanju (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Prijemnik" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Akt. poz. na čekanje" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedovoljno memorije. Obriši neke od stavki" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Završi" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Usluga nedostupna" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Snimi" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Nepoznat poziv odbačen" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "za %d dana" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Sutra" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Za nedelju dana" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Prihvati poziv nakon" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Redukcija šuma isključena" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Redukcija šuma uključena" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nemoguće je uključiti redukciju šuma kada je omogućena dodatna jačina zvuka" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Nemoguće je uključiti redukciju šuma kada je povezana slušalica" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nemoguće je uključiti redukciju šuma kada je uključena Bluetooth slušalica" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Nemoguće je uključiti redukciju šuma tokom poziva preko širokopojasne veze" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Radi korišćenja ove funkcije, neophodna je provera optimizacije ekvil. za podešavanje opcije „razgovor u toku”" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Nije moguće omogućiti ekvilajzer zvuka za razgovor na drugom telefonu kada je zvučnik uključen" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Nije moguće omogućiti ekvilajzer zvuka za razgovor na drugom telefonu kada su slušalice povezane" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Nije moguće omogućiti ekvilajzer zvuka za razgovor na drugom telefonu kada je Bluetooth slušalica uključena" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Nije moguće koristiti raspon dodatne jačine zvuka kada su povezane slušalice ili BT" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Pozivanje..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Nije moguće omogućiti ekvilajzer zvuka za razgovor na drugom telefonu dok je omogućena dodatna jačina zvuka" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Nije moguće omogućiti ekvilajzer zvuka za razgovor preko širokopojasne veze" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Nemoguće je uključiti redukciju šuma kada je uključen zvučnik" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Grupni poziv (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Sačuvana slika" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Sačuvani video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Snimi fotografiju" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Video uživo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Prik. kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d propuštenih poziva" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Propušten poziv" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Omogućena je dodatna jačina zvuka" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Onemogućena je dodatna jačina zvuka" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Odlazni poziv prosleđen" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Odlazni pozivi zabranjeni" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Prosleđen poziv" + diff --git a/ui/po/sv.po b/ui/po/sv.po new file mode 100755 index 0000000..651a76f --- /dev/null +++ b/ui/po/sv.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Avvisa med meddelande" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Svara" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "L t samtal" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontakter" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Parkera" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Anslut" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Avvisa" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Högt." + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Återta" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Avvisa samtal med meddelande" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Avsluta alla samtal" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Avsluta aktiva samtal (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Hörlurar" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Knappsats" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Ljud av" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Ansluter..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Avvisat" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Sänder..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Växla" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Parkerar %s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Avsluta samtal med %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Förstärk låga toner" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Förstärk höga toner" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Optimerat för vänster öra" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Optimerat för höger öra" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Hantera gruppsamtal" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Ljud" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Dela" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Dela fil via ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Dela" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Samtal" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Ringd part otillgänglig" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Samtal avslutat" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Samtal avvisat" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Frånkopplad" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Inget svar" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Ändrat nummer" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numret finns inte" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Parkerat" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Personer" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Headset" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferenssamtal" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Systemfel" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Alla inkommande samtal spärrade" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Alla utgående samtal spärrade" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Samtalet kunde inte kopplas" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Endast nödsamtal" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Samtal inte tillåtet" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Samtal spärrat" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Vidarekoppling aktiv: Vid inget svar" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Vidarekoppling aktiv: Alltid" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Vidarekoppling aktiv: Vid Kan ej nås" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Vidarekoppling aktiv: Vid upptaget" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Samtalet vidarekopplat" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Fel nummer" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Avsluta Flightmode för nättjänster" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Ringer upp..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Sändning misslyckades. Försök igen" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Nödsamtal" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Endast FDN-samtal" + +msgid "IDS_CALL_POP_HELD" +msgstr "Parkerat" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Parkering misslyckades" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Parkering stöds inte" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Inkommande samtal spärrade vid roaming" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Ofullständigt" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Anslutning misslyckades" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Anslutning stöds inte" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Nätverket upptaget" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Nätverket ej tillgängligt" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Krediten slut" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Ej service" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Åtgärd nekad" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Utgående internationella samtal utom hem spärras" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Utgående utlandssamtal spärrade" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefonboken inte initierad" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Återuppringning..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Tjänsten är inte tillåten" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Endast SOS-samtal.\nSätt i SIM-kortet för att använda nättjänster" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Delning misslyckades" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Delning stöds inte" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Växla misslyckades" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Växla stöds inte" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Överföringsfel" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Överföring stöds inte" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Det går inte att hämta" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Ej tillgänglig" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Återta" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Återta stöds inte" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Upptaget" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Verifiera SIM eller sätt i giltigt SIM" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Röstsamtal inte tillåtet under videosamtal" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Vänta är aktiverat" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Fel grupp" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Avsluta parkerade samtal (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Mottagare" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Parkera akt. samtal" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Minnet räcker inte. Radera några objekt" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Avsl. samt." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Tjänst ej tillgänglig" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Insp." + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Okänt samtal avvisat" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "om %d dagar " + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Imorgon" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Om en vecka" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Ta emot samtal efter" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Brusreduktion av" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Brusreduktion är på" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Det går inte att aktivera brusreducering när extravolym är aktiverat" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Det går inte att aktivera brusreducering när hörlurarna är anslutna" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Kan inte aktivera brusreducering när Bluetooth-hörlurar är på" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Det går inte att aktivera brusreducering under bredbandssamtal" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Om du vill använda den här funktionen måste du markera att du vill optimera equalizer i samtalsinställningarna" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Det går inte att aktivera equalizer för samtal när högtalaren är på" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Det går inte att aktivera equalizer för samtal när hörlurarna är anslutna" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Det går inte att aktivera equalizer för samtal när Bluetooth-headsetet är på" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Det går inte att använda extravolymintervallet när hörlurar eller BT-headset är anslutna" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Ringer..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Det går inte att aktivera equalizer för samtal när extravolym är aktiverat" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Det går inte att aktivera equalizer för samtal under bredbandssamtal" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Det går inte att aktivera brusreducering när högtalaren är på" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Gruppsamtal (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Sparad bild" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Sparad video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Ta en bild" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Livevideo" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Visa kontakt" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d missade samtal" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Missat samtal" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Extravolym aktiverat" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Extravolym inaktiverat" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Utgående samtal vidarekopplat" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Utgående samtal spärrade" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Vidarebefordrat samtal" + diff --git a/ui/po/tr_TR.po b/ui/po/tr_TR.po new file mode 100755 index 0000000..5a4b260 --- /dev/null +++ b/ui/po/tr_TR.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Mesajla reddet" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Kabul et" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Çağrı ekle" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Rehber" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Beklet" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Katıl" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Reddet" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Hoparlör" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Bırak" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Aramayı mesajla reddet" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Tüm çağrıları sonlandır" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Aktif çağrıları sonlandır (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Kulaklıklar" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Tuşlar" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Sessiz" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Bağlanılıyor..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Reddedildi" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Gönderiliyor..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Kısayollar" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%s bekletiliyor" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "%s araması bitiriliyor" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Düşük tonları güçlendirin" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Yüksek tonları güçlendirin" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Sol kulak için optimum" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Sağ kulak için optimun" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Konferans görüşmesini yönet" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Ses" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Paylaşıma aç" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "ChatON ile dosya paylaş" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Paylaşıma aç" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Arama" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Aranan taraf yok" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Arama sonlandırıldı" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Arama reddedildi" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Bağlantı kesildi" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Cevap yok" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Numara değiştirildi" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Numara\nyok" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Beklemede" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Kişi" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Kulaklık" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferans görüşmesi" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Sistem hatası" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Gelen tüm aramalar engellendi" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Giden tüm aramalar engellendi" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Arama başarısız" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Yalnızca acil aramalar" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "İzin yok" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Arama engellendi" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Arama yönlendirme etkin: Her zaman" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Arama yönlendirme etkin: Cevap yokken" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Arama yönlendirme etkin: Ulaşılamadığında" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Arama yönlendirme etkin: Meşgulken" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Arama iletildi" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Yanlış numara" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Şebeke hizmetleri için Çevrimdışı profilinden çıkın" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Aranıyor..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Gönderim başarısız. Tekrar deneyin" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Acil arama" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "sadece FDN aramalar" + +msgid "IDS_CALL_POP_HELD" +msgstr "Beklemede" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Tutma başarısız" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Arama bekletme desteklenmiyor" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Geçiş yaparken gelen arama engelleme" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Tamamlanmadı" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Katılma başarısız" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Katılma desteklenmiyor" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Şebeke meşgul" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Bağlantı Yok" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Kredi yok" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Servis yok" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "İşlem reddedildi" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Yurt için hariç uluslar arası gideni engelle" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Giden uluslararası aramalar engellendi" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Telefon başlatılamadı" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Tekrar aranıyor..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Servise izin yok" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Yalnızca acil aramalar.\nŞebeke servislerine erişmek için SIM kartını takın" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Ayırma başarısız" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Ayırma desteklenmiyor" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Değişme başarısız" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Değişme desteklenmiyor" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Transfer başarısız" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Transfer desteklenmiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Alınamadı" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Mevcut değil" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Alındı" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Bırakma desteklenmiyor" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Kullanıcı meşgul" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM’i doğrula veya geçerli SIM tak" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Görüntülü çağrı sırasında sesli çağrıya izin verilmez" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Bekletme aktif" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Yanlış grup" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Tutulan çağrıları sonlandır (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Alıcı" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Aktif görüşme beklet" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Yeterli hafıza yok. Bazı öğeleri silin." + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Bitir" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Servis Kullanılamıyor" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Kayıt" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Bilinmeyen arama reddedildi" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d gün içinde" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Yarın" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Bir hafta içerisinde" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Aramayı sonra kabul et" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Parazit azaltma kapalı" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Parazit azaltma açık" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ekstra ses etkinken parazit azaltma açılamıyor" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Kulaklık takılıyken parazit azaltma açılamıyor" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth kulaklık açıkken parazit azaltma açılamıyor" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Geniş bant araması sırasında parazit azaltma açılamıyor" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Bu işlevi kullanmak için, Arama ayarları altında benim için EQ'yu optimize et seçeneğini işaretlemeniz gerekir" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Hoparlör açıkken Gelen arama sesi EQ etkinleştirilemiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Kulaklıklar takılıyken Gelen arama sesi EQ etkinleştirilemiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth kulaklık açıkken Gelen arama sesi EQ etkinleştirilemiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Kulaklıklar veya BT kulaklık takılı olduğunda ekstra ses düzeyi aralığı kullanılamıyor" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Arıyor..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ekstra ses etkinken gelen arama sesi EQ etkinleştirilemiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Geniş bant aramaları sırasında gelen arama sesi EQ etkinleştirilemiyor" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Hoparlör açıkken parazit azaltma açılamıyor" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Grup arama (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Kaydedilmiş resim" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Kaydedilmiş video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Resim çekin" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Canlı video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Kişiyi göster" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d Cevapsız arama" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Cevapsız arama" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Ekstra ses düzeyi etkin" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Ekstra ses düzeyi devre dışı" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Giden çağrılar iletildi" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Giden uluslararası aramalar engellendi" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Yönlendirilmiş arama" + diff --git a/ui/po/uk.po b/ui/po/uk.po new file mode 100755 index 0000000..90d4eda --- /dev/null +++ b/ui/po/uk.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Відхилити з повідомленням" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Прийняти" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Дод.виклик" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Контакти" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Утримання" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Об’єдн." + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Відхилити" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Динамік" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Знят.утр." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Відхилити виклик із повідомленням" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Завершити всі виклики" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Завершити активні виклики (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Навушники" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Клавіат." + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Вимк.звук" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "З'єднання..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Відхилено" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Відправлення..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Перекл." + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "Переведення абонента %s на утримання" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Завершення виклику з абонентом %s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Підс низькі тони" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Підс. високі тони" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Оптиміз. для лівого вуха" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "Оптиміз. для правого вуха" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Керування конференц-викликом" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Звук" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Дати доступ" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "Сп.д.до файла через ChatON" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Дати доступ" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Виклики" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Абонент недоступний" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Виклик завершено" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Виклик відхилено" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Роз'єднано" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Немає відповіді" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Номер змінено" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Номер не існує" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Утрим." + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Люди" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Гарніт." + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Конференц-зв'язок" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Помилка системи" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Всі вхідні виклики заборонено" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Всі вихідні виклики заборонені" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Збій виклику" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Лише екстрені виклики" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Виклик не дозволено" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Виклик заборонено" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Активувати переадресацію: завжди" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Активувати переадресацію: якщо немає відповіді" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Переадресація, якщо недосяжний" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Переадресація, якщо зайнято" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Дзвінок переадресовано" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Хибний номер" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Змініть режим без зв'язку на інший для використання мережі" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Набір..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Збій надсилання. Спробуйте ще" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Екстрений виклик" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Лише виклики FDN" + +msgid "IDS_CALL_POP_HELD" +msgstr "Утримано" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Збій утримання" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Утримання не підтримується" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Вхідні виклики в роумінгу заборонено" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Незавершено" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Збій об’єднання" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Об’єднання не підтримується" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Мережа зайнята" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Мережа недоступна" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Кредит вичерпано" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Немає мережі" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "В операції відмовлено" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Вихідні міжнародні виклики крім домашніх заборонені" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Міжнародні вихідні виклики заблоковано" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "Телефон не ініціалізовано" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Повторення набору..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Послуга заборонена" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Лише екстрений виклик.\nЩоб отримати доступ до послуг мережі, вставте SIM-картку" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Збій розділення" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Розділення не підтримується" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Збій переключення" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Переключення не підтримується" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Збій передачі" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Передача не підтримується" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Неможливо отримати" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Недоступно" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Відновлено" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Зняття з утримання не підтримується" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Абонент зайнятий" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "Перевірте SIM-картку або вставте припустиму SIM-картку" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Неможливо здійснити голосовий виклик під час відеовиклику" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Очікування активовано" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Хибна група" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Завершити утримувані виклики (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Приймач" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Утрим.активн.виклик" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Недостатньо пам’яті. Видаліть деякі об’єкти" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Зав.вик." + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Послуга недоступна" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "Запис" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Невідомий виклик відхилено" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "через %d днів" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Завтра" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Через тиждень" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Прийняти виклик після" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Зменшення шуму вимк." + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Зменшення шуму увімк." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Неможливо ввімкнути функцію зменшення шуму за ввімкненої функції додаткової гучності" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Неможливо ввімкнути функцію зменшення шуму, якщо підключено навушники" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Неможливо ввімкнути функцію зменшення шуму, якщо ввімкнено гарнітуру Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Неможливо ввімкнути функцію зменшення шуму під час здійснення широкосмугових викликів" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Щоб скористатися цією функцією, потрібно перевірити оптимізацію частот еквалайзера, щоб вони відповідали вашим потребам, у меню \"Установки виклику\"" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Неможливо ввімкнути еквалайзер звуків під час виклику за ввімкненого динаміка" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Неможливо ввімкнути еквалайзер звуків під час виклику за підключених навушників" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Неможливо ввімкнути еквалайзер звуків під час виклику за ввімкненої гарнітури Bluetooth" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Неможливо скористатися діапазоном додаткової гучності за підключених навушників або гарнітури Bluetooth" + +msgid "IDS_CALL_POP_CALLING" +msgstr "З'єднання..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Неможливо ввімкнути еквалайзер звуків під час виклику за ввімкненої додаткової гучності" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Неможливо ввімкнути еквалайзер під час виклику в разі здійснення широкосмугових викликів" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Неможливо ввімкнути функцію зменшення шуму, якщо ввімкнено динамік" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Виклик групі (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Збережене зображення" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Збережене відео" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Зробити знімок" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Відео наживо" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Перег. контакт" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d пропущених викликів" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Пропущений виклик" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Увімкнено додаткову гучність" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Додаткову гучність вимкнено" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Вихідний виклик переадресовано" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Вихідні виклики заборонені" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Переадресований виклик" + diff --git a/ui/po/uz.po b/ui/po/uz.po new file mode 100755 index 0000000..b4d62e9 --- /dev/null +++ b/ui/po/uz.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "Xabar orqali rad etish" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "Qabul qil" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "Qo‘n.qo‘sh" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "Kontaktlar" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "Kutish" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "Qo‘shil" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "Rad etish" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "Dinamik" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "Bekor/q." + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "Qo‘ng‘iroqni xabar bilan rad etish" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "Barcha qo‘ng‘iroqlarni tugatish" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "Faol qo‘ng‘iroqlarni yakunlash (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "Quloqliklar" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "Klaviatura" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "Ovozsiz" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "Ulanmoqda..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "Rad etildi" + +msgid "IDS_CALL_POP_SENDING" +msgstr "Yuborilmoqda..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "Almashtirish" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "%sni kutish rejimiga qo‘yish" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "Qo‘ng‘iroqni %s bilan qabul qilish" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "Past ohang ko‘tar" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "Yuq. ohang ko‘tar" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "Chap quloq uchun optimal" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "O‘ng quloq uchun optimal" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "Konferens qo‘ng‘iroqlarni boshqarish" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "Ohang" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "Ulashish" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "ChatON orq. fayl bah/ko‘r." + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "Ulashish" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "Qo‘ng‘iroq" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "Chaqirilayotgan abonent mavjud emas" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "Qo‘ng‘iroq yakunlandi" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "Qo‘ng‘iroq rad etildi" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "Uzilgan" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "Javob yo‘q" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "Raqam o‘zgartirildi" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "Raqam mavjud emas" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "Kutish" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "Foydalanuvchilar" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "Karnay" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "Konferensiya qo'ng'irog'i" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "Tizim xatosi" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "Barcha kiruvchi qo‘ng‘iroqlar taqiqlangan" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "Barcha chiquvchi qo‘ng‘iroqlar taqiqlangan" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "Qo‘ng‘iroq qilib bo‘lmadi" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "Faqat favqulodda qo‘ng‘iroqlar" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "Qo‘ng‘iroq ruxsat etilmagan" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "Qo‘ng‘iroq chegaralangan" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "Qo‘ng‘iroqlarni boshqa raqamga o‘tkazish: Har doim" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "Qo‘ng‘iroqlarni boshqa raqamga o‘tkazish: Javob yo‘q" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "Qo‘ng‘iroqlarni boshqa raqamga o‘tkazish: Xizmat doirasidan tashqarida" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "Qo‘ng‘iroqlarni boshqa raqamga o‘tkazish: Band bo‘lganda" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "Qo‘ng‘iroq boshqa raqamga o‘tkazildi" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "Noto‘g‘ri raqam" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "Tarmoq xizmatlari uchun, Offlayndan boshqa profilga o‘zgartiring" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "Terilmoqda..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "Yuborib bo‘lmadi. Qayta urinib ko‘ring" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "Favqulodda qo‘ng‘iroqlar" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "Faqat FDN qo‘ng‘iroqlar" + +msgid "IDS_CALL_POP_HELD" +msgstr "Ushlab turilgan" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "Ushlab turib bo‘lmadi" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "Ushlab turish qo‘llab-quvvatlanmagan" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "Rouming vaqtida kiruvchi qo‘ng‘iroqlar taqiqlangan" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "Tugallanmagan" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "Qo‘shilib bo‘lmadi" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "Qo‘shilish qo‘llab-quvvatlanmagan" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "Tarmoq band" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "Tarmoqdan foydalanib bo‘lmaydi" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "Qolgan kredit yo‘q" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "Xizmat yo‘q" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "Operatsiya rad etildi" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "Mamlakat ichidagi qo‘ng‘iroqlardan tashqari chiquvchi xalqaro qo‘ng‘iroqlar taqiqlangan" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "Chiquvchi xalqaro qo‘ng‘iroqlar taqiqlangan" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "telefon initisializatsiyalanmagan" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "Qayta terilmoqda..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "Xizmat ruxsat etilmagan" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "Faqat SOS qo‘ng‘irog‘i.\nTarmoq xizmatlaridan foydalanish uchun, SIM-karta qo'ying" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "Ajratib bo‘lmadi" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "Ajratish qo‘llab-quvvatlanmaydi" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "Almashish bajarilmadi" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "Almashish qo‘llab-quvvatlanmaydi" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "Uzatish bajarilmadi" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "Uzatish qo‘llab-quvvatlanmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "Olib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "Mavjud emas" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "Ushlab turilmadi" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "Bekor qilish qo‘llab-quvvatlanmaydi" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "Foydalanuvchi band" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "SIM-kartani tekshiring yoki to‘g‘ri SIM-kartani kiriting" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "Video qo‘ng‘iroq vaqtida ovozli qo‘n-ni amalga oshirib bo‘lmaydi" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "Kutish rejimi faol" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "Noto‘g‘ri guruh" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "Ushlab turilgan qo‘ng‘iroqlarni yakunlash (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "Oluvchi" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "Faol qo‘n-ni ush/tur" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Xotira yetarli emas. Ba’zi elementlarni o'chiring" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "Qo‘n. yakunlash" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "Xizmatdan foydalanib bo‘lmaydi" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "YOZ" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "Noma‘lum qo‘ng‘iroq rad etildi" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d kunda" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "Ertaga" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "Haftada" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "Qo‘ng‘iroqni quyidagidan keyin qabul qilish" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "Shovqinni pasaytirish o‘ch." + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "Shovqinni pasaytirish yoq." + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Ortiqcha ovoz balandligi yoqilganda, shovqinni pasaytirishni yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "Quloq karnaylari ulanganda shovqinni pasaytirish funksiyasini yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth quloq karnayi yoqilganda, shovqinni pasaytirish funksiyasini yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "Keng tasmali qo‘ng‘iroqlar mobaynida shovqinni pasaytirish funksiyasini yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "Ushbu funksiyadan foydalanish uchun, Qo‘ng‘iroq parametrlari tagida maning uchun EQni optimallashtirishni belgilashingiz lozim" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "Dinamik yoqilganida kiruvchi qo‘ng‘iroq ovozi EQni yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "Quloqliklar ulanganida kiruvchi qo‘ng‘iroq ovozi EQni yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "Bluetooth quloq karnaylari yoqilganida kiruvchi qo‘ng‘iroq ovozi EQni yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "Quloqliklar yoki BT karnaylari ulanganda, qo‘shimcha ovoz balandligidan foydalanib bo‘lmaydi" + +msgid "IDS_CALL_POP_CALLING" +msgstr "Qo‘ng‘iroq qilinmoqda..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "Qo‘shimcha ovoz balandligi yoqilganda kiruvchi qo‘ng‘iroq ovozi EQsini yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "Keng tasmali qo‘ng‘iroqlar mobaynida kiruvchi qo‘ng‘iroq ovozi EQni yoqib bo‘lmaydi" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "Dinamik yoqilganda shovqinni pasaytirish funksiyasini yoqib bo‘lmaydi" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "Guruh qo‘n. (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "Saqlangan tasvir" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "Saqlangan video" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "Suratga olish" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "Jonli video" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "Kontakt ko‘r." + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d qabul qilinmagan qo‘ng‘iroq" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "Qabul qilinmagan qo‘ng‘iroq" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "Qo‘shimcha ovoz balandligi yoqilgan" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "Qo‘shimcha ovoz balandligi o‘chirilgan" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "Chiquvchi qo‘ng‘iroq boshqaga yo‘naltirildi" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "Chiquvchi qo‘ng‘iroqlar taqiqlangan" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "Boshqaga yo‘naltirilgan qo‘ng‘iroq" + diff --git a/ui/po/zh_CN.po b/ui/po/zh_CN.po new file mode 100755 index 0000000..10d370a --- /dev/null +++ b/ui/po/zh_CN.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "拒绝并发送短信" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "添加通话" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "联系人" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保持" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒绝" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "扬声器" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "取消保持" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "拒接来电并发送短信" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "结束所有呼叫" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "结束当前通话 (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳机" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "键盘" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "静音" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "连接中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "被拒绝" + +msgid "IDS_CALL_POP_SENDING" +msgstr "发送中…" + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "切换" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "保持%s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "结束%s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "加强低音" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "加强高音" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "针对左耳优化" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "针对右耳优化" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "管理电话会议" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "声音" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "共享" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "通过 ChatON 共享文件" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "共享" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通话" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "被呼叫方不可用" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "已结束通话" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通话被拒绝" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已断开" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "无应答" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "号码已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "号码不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保持中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "人员" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "耳机" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "电话会议" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系统出错" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "禁止所有来电" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "禁止全部拨出电话" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通话失败" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "仅限紧急通话" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "禁止通话" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通话被限制" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "激活呼叫转移:始终" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "激活呼叫转移:无应答" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "激活呼叫转移:无法接通" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "激活呼叫转移:遇忙" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "呼叫已转移" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "错误号码" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "关闭飞行模式以使用网络服务" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "拨号中..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "发送失败。再试" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "紧急呼叫" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "仅限 FDN 呼叫" + +msgid "IDS_CALL_POP_HELD" +msgstr "保持" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "通话保持失败" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "通话保持不支持" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫游时呼入限制" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "不完整" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失败" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支持加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "网络繁忙" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "网络无法使用" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "无余额" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "无服务" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "拒绝操作" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "除本国外的国际呼出" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "禁止拨打国际长途" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "手机未初始化" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "重新拨号中..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "服务禁止" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "只能打SOS电话.请插入SIM卡以访问网络服务" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "断开失败" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "不支持断开" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切换失败" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支持切换" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "转换失败" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支持转换" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "无法取回" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不适用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "取消保持" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "取消保持不支持" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "用户繁忙" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "验证SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "视频通话期间不允许进行语音呼叫" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "等待启动" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "错误分组" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "结束保持通话 (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "听筒" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保持通话" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "存储空间不足。请删除部分项目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "结束通话" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "服务无法正常提供" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "录音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "已拒绝未知来电" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d 天内" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "明天" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "在一周里" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "接听来电" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "噪声降低关" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "噪声降低开" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "无法在启用超大音量时开启减噪" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "当连接耳机时,无法打开噪音降低" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "当蓝牙耳机启动时,无法打开噪音降低" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "宽带通话期间无法打开噪音降低" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "若要使用该功能,您必须在呼叫设置下勾选“优化我的 EQ”" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "当扬声器开启时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "当耳机连接时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "当蓝牙耳机开启时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "当耳机或蓝牙耳机连接时无法使用超大音量范围" + +msgid "IDS_CALL_POP_CALLING" +msgstr "正在呼叫..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "当超大音量启用时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "无法在宽带通话期间启用通话中声音效果" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "当扬声器启动时,无法打开噪音降低" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "群组通话 (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "已保存图片" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "已保存视频" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "拍照" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "实时视频" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "查看联系人" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d 个未接来电" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "未接来电" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "超大音量已启用" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "超大音量已禁用" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "呼出已转移" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "呼出限制" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "转移的呼叫" + diff --git a/ui/po/zh_HK.po b/ui/po/zh_HK.po new file mode 100755 index 0000000..575140f --- /dev/null +++ b/ui/po/zh_HK.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "發訊息拒絕" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "加入通話" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "聯絡人" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保留" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒絕" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "揚聲器" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "不保留" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "發訊息以拒絕來電" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "結束全部通話" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "結束啟動中的通話(%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳機" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "鍵盤" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "靜音" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "連接中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "已拒絕" + +msgid "IDS_CALL_POP_SENDING" +msgstr "正在發送..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "切換" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "保留與 %s 的通話" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "結束與 %s 的通話" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "加強低音" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "加強高音" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "已針對左耳優化" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "已針對右耳優化" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "管理電話會議" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "聲音" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "分享" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "透過 ChatON 分享檔案" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "共享" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通話" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "無法接通對方電話" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "通話已結束" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通話已拒絕" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已中斷連接" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "無人接聽" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "號碼已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "號碼不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保留中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "People" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "藍牙耳機" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "電話會議" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系統錯誤" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "已限制全部來電" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "已限制所有撥出電話" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通話失敗" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "只限緊急通話" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "通話不允許" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通話已限制" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "轉駁來電:全部轉駁" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "轉駁來電:無人接聽" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "來電轉駁:無法接通" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "來電轉駁:線路繁忙" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "通話已轉駁" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "號碼錯誤" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "由離線設定更改為其他設定以使用網絡服務" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "正在撥號..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "發送失敗。請重試" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "緊急通話" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "只限固定撥號通話" + +msgid "IDS_CALL_POP_HELD" +msgstr "已保留" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "保留失敗" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "保留通話不支援" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫遊時來電限制" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "未完成" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失敗" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支援加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "網絡繁忙" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "網絡不可用" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "無剩餘" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "無服務" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "操作已拒絕" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "限制撥出國際電話(本地除外)" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "已限制撥出國際長途電話" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "手機未初始化" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "正在重撥..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "服務不允許" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "只限 SOS 通話。\n請插入 SIM 卡以存取網絡服務" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分割失敗" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "不支援分割" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切換先敗" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支援切換" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "傳送失敗" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支援轉駁" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "無法取回" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不可用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "取消保留" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "不支援取消保留" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "用戶繁忙" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "確認SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "視像通話進行中不允許撥打語音通話" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "已啟動來電等待" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "錯誤群組" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "結束保留通話(%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "聽筒" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保留當前通話" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "記憶體不足。請刪除一些項目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "結束通話" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "無可用服務" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "錄音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "已拒絕不明來電" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "在 %d 天後" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "明天" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "一週內" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "稍後接聽來電" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "減少噪音關" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "減少噪音開" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "啟用最大音量時無法開啟減少噪音" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "耳機連接時無法開啟減少噪音" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "藍牙耳機啟用時無法開啟減少噪音" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "寬頻通話期間無法開啟減少噪音" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "欲使用此功能,必須檢查通話設定下的優化我的均衡器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "當揚聲器開啟時無法啟用來電音效均衡器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "當耳機連接時無法啟用來電音效均衡器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "當藍牙耳機開啟時無法啟用來電音效均衡器" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "當耳機或藍牙耳機已連接時無法使用增強音量" + +msgid "IDS_CALL_POP_CALLING" +msgstr "正在通話..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "額外音量啟用時無法啟用來電音效均衡器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "無法在寬頻通話期間啟用來電音效均衡器" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "揚聲器啟用時無法開啟減少噪音" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "群組通話(%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "儲存的圖像" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "儲存的視像" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "拍照" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "即時視像" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "檢視聯絡人" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d 個未接電話" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "未接電話" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "已啟用額外音量" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "已停用額外音量" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "撥出電話已轉接" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "撥出電話已限制" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "已轉接來電" + diff --git a/ui/po/zh_SG.po b/ui/po/zh_SG.po new file mode 100755 index 0000000..d5ceb10 --- /dev/null +++ b/ui/po/zh_SG.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "带讯息拒绝" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "添加呼叫" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "联系人" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保持" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒绝" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "扩音器" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "取消保持" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "拒接来电并发送简讯" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "结束所有呼叫" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "结束当前通话 (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳机" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "键盘" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "静音" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "连接中…" + +msgid "IDS_CALL_POP_REJECTED" +msgstr "被拒" + +msgid "IDS_CALL_POP_SENDING" +msgstr "发送中…" + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "切换" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "保持%s" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "结束呼叫与%s" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "加强低音" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "加强高音" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "已针对左耳优化" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "已针对右耳优化" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "管理电话会议" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "声音" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "共享" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "通过 ChatON 共享文件" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "共享" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通话" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "被呼叫方不可用" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "已结束通话" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "通话被拒" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已中断连接" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "无应答" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "号码已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "号码不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保持中" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "人员" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "耳机" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "多方通话" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系统出错" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "限制所有来电" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "限制所有拨出电话" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通话失败" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "仅限紧急通话" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "已不允许通话" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通话被限制" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "通话转移有效:无应答" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "通话转移有效:始终" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "通话转移有效:无法联系" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "通话转移有效:繁忙时" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "呼叫已转移" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "错误号码" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "从离线配置改变到其他配置以使用网络服务" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "拨号中…" + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "发送失败。再试" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "紧急号码" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "仅限 FDN 呼叫" + +msgid "IDS_CALL_POP_HELD" +msgstr "已保留" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "通话保持失败" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "不支持通话保持" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫游时呼入限制" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "不完整" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失败" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支持加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "网络繁忙" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "网络无法连接" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "无剩余金额" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "遗漏" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "运作被拒" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "除本国外的国际呼出" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "限制拨出国际电话" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "手机未初始化" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "重新拨号中..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "不允许服务" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "只限紧急通话。\n要使用网络服务,请插入 SIM 卡" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分开失败" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "不支持分开" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切换失败" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支持切换" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "转接失败" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支持转接" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "无法取回" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "不适用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "已解除保留" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "不支持解除通话保持" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "用户繁忙" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "验证SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "视频通话期间不允许进行语音呼叫" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "等待有效" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "错误群组" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "结束保持通话 (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "听筒" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保持通话" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "内存已满\n请删除项目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "结束" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "服务不适用" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "录音" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "未知的通话\n被拒" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "%d 天内" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "明天" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "在一周里" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "接听来电" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "噪声降低关" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "噪声降低开" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "无法在启用超大音量时开启减噪" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "当连接耳机时,无法打开噪音降低" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "当蓝牙耳机启动时,无法打开噪音降低" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "宽带通话期间无法打开噪音降低" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "若要使用该功能,您必须在呼叫设置下勾选“优化我的 EQ”" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "当扬声器开启时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "当耳机连接时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "当蓝牙耳机开启时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "当耳机或蓝牙耳机连接时无法使用超大音量范围" + +msgid "IDS_CALL_POP_CALLING" +msgstr "正在呼叫..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "当超大音量启用时无法启用来电声音 EQ" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "无法在宽带通话期间启用通话中声音" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "当扬声器启动时,无法打开噪音降低" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "群组通话 (%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "已保存图片" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "已保存视频" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "拍照" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "实时视频" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "查看联系人" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d 个未接来电" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "未接来电" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "超大音量已启用" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "超大音量已禁用" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "呼出已转移" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "呼出限制" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "前转的呼叫" + diff --git a/ui/po/zh_TW.po b/ui/po/zh_TW.po new file mode 100755 index 0000000..95d6bb7 --- /dev/null +++ b/ui/po/zh_TW.po @@ -0,0 +1,402 @@ +msgid "IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE" +msgstr "用訊息拒絕" + +msgid "IDS_CALL_BUTTON_ACCEPT" +msgstr "接受" + +msgid "IDS_CALL_BUTTON_ADD_CALL" +msgstr "新增通話" + +msgid "IDS_CALL_BUTTON_CONTACTS" +msgstr "聯絡人" + +msgid "IDS_CALL_BUTTON_HOLD" +msgstr "保留" + +msgid "IDS_CALL_BUTTON_JOIN" +msgstr "加入" + +msgid "IDS_CALL_BUTTON_REJECT" +msgstr "拒絕" + +msgid "IDS_CALL_BUTTON_SPEAKER" +msgstr "喇叭" + +msgid "IDS_CALL_BUTTON_UNHOLD" +msgstr "取消保留" + +msgid "IDS_CST_BODY_REJECT_CALL_WITH_MESSAGE" +msgstr "使用訊息拒絕來電" + +msgid "IDS_CALL_OPT_END_ALL_CALLS" +msgstr "結束所有通話" + +msgid "IDS_CALL_BODY_END_ACTIVE_CALLS_HPD" +msgstr "結束當前通話 (%d)" + +msgid "IDS_CALL_BUTTON_HEADPHONES" +msgstr "耳機" + +msgid "IDS_CALL_SK3_KEYPAD" +msgstr "鍵盤" + +msgid "IDS_CALL_BUTTON_MUTE_ABB" +msgstr "靜音" + +msgid "IDS_CALL_POP_CONNECTING" +msgstr "連線中..." + +msgid "IDS_CALL_POP_REJECTED" +msgstr "已拒絕" + +msgid "IDS_CALL_POP_SENDING" +msgstr "正在傳送..." + +msgid "IDS_CALL_OPT_SWITCH" +msgstr "開關" + +msgid "IDS_CALL_BODY_PUTTING_PS_ON_HOLD" +msgstr "保留與 %s 的通話" + +msgid "IDS_CALL_BODY_ENDING_CALL_WITH_PS" +msgstr "結束與 %s 的通話" + +msgid "IDS_CST_OPT_BOOST_LOW_TONES_ABB" +msgstr "加強低音" + +msgid "IDS_CST_OPT_BOOST_HIGH_TONES_ABB" +msgstr "加強高音" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_LEFT_EAR" +msgstr "最佳化左耳使用" + +msgid "IDS_CST_MBODY_OPTIMISED_FOR_RIGHT_EAR" +msgstr "最佳化右耳使用" + +msgid "IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL" +msgstr "管理電話會議" + +msgid "IDS_CALL_BUTTON_SOUND_ABB" +msgstr "音效" + +msgid "IDS_CALL_SK3_SHARE" +msgstr "分享" + +msgid "IDS_CALL_OPT_SHARE_FILE_VIA_CHATON_ABB" +msgstr "透過 ChatON 分享檔案" + +msgid "IDS_CALL_HEADER_SHARE_ABB" +msgstr "分享" + +msgid "IDS_CALL_HEADER_MY_CALL_SOUND_ABB" +msgstr "My call sound" + +msgid "IDS_CALL_BODY_CALL" +msgstr "通話" + +msgid "IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE" +msgstr "無法接通電話" + +msgid "IDS_CALL_BODY_CALLENDED" +msgstr "通話已結束" + +msgid "IDS_CALL_BODY_CALL_REJECTED" +msgstr "已拒接來電" + +msgid "IDS_CALL_BODY_DISCONNECTED" +msgstr "已中斷連線" + +msgid "IDS_CALL_BODY_NO_ANSWER" +msgstr "無人接聽" + +msgid "IDS_CALL_BODY_NUMBER_CHANGED" +msgstr "號碼已更改" + +msgid "IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST" +msgstr "號碼不存在" + +msgid "IDS_CALL_BODY_ON_HOLD_ABB" +msgstr "保留" + +msgid "IDS_CALL_BODY_PEOPLE" +msgstr "個聯絡人" + +msgid "IDS_CALL_BUTTON_HEADSET" +msgstr "耳機" + +msgid "IDS_CALL_OPT_CONFERENCE_CALL" +msgstr "電話會議" + +msgid "IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR" +msgstr "系統錯誤" + +msgid "IDS_CALL_POP_ALL_INCOMING_CALLS_BARRED" +msgstr "已限制所有來電" + +msgid "IDS_CALL_POP_ALL_OUTGOING_CALLS_BARRED" +msgstr "已阻止所有撥出電話" + +msgid "IDS_CALL_POP_CALLFAILED" +msgstr "通話失敗" + +msgid "IDS_CALL_POP_CALLING_EMERG_ONLY" +msgstr "僅限緊急通話" + +msgid "IDS_CALL_POP_CALLNOTCALLOWED" +msgstr "不允許通話" + +msgid "IDS_CALL_POP_CALL_BARRED" +msgstr "通話受限" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_ALWAYS" +msgstr "轉移呼叫:永遠" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_NO_ANSWER" +msgstr "轉移呼叫:無人接聽" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_UNREACHABLE" +msgstr "轉移呼叫:無法接通" + +msgid "IDS_CALL_POP_CALL_DIVERTING_ACTIVE_C_WHEN_BUSY" +msgstr "轉移呼叫:忙線時" + +msgid "IDS_CALL_POP_CALL_IS_DIVERTED" +msgstr "來電已轉移" + +msgid "IDS_CALL_POP_CAUSE_WRONG_NUMBER" +msgstr "號碼錯誤" + +msgid "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL" +msgstr "由離線更改為其他設定以使用網路服務" + +msgid "IDS_CALL_POP_DIALLING" +msgstr "正在撥號..." + +msgid "IDS_CALL_POP_DTMFSENDING_FAIL" +msgstr "傳送失敗。再試一次" + +msgid "IDS_CALL_POP_EMERGENCY_CALL" +msgstr "緊急電話" + +msgid "IDS_CALL_POP_FDNCALLONLY" +msgstr "僅限 FDN 通話" + +msgid "IDS_CALL_POP_HELD" +msgstr "已保留" + +msgid "IDS_CALL_POP_HOLD_FAILED" +msgstr "保留失敗" + +msgid "IDS_CALL_POP_HOLD_NOT_SUPPORTED" +msgstr "不支援保留通話" + +msgid "IDS_CALL_POP_INCOMING_CALLS_BARRED_WHEN_ROAMING" +msgstr "漫遊時限制來電" + +msgid "IDS_CALL_POP_INCOMPLETE" +msgstr "不完整" + +msgid "IDS_CALL_POP_JOIN_FAILED" +msgstr "加入失敗" + +msgid "IDS_CALL_POP_JOIN_NOT_SUPPORTED" +msgstr "不支援加入" + +msgid "IDS_CALL_POP_NETWORKBUSY" +msgstr "網路繁忙" + +msgid "IDS_CALL_POP_NETWORK_UNAVAILABLE" +msgstr "無可用網路" + +msgid "IDS_CALL_POP_NOCREDITLEFT" +msgstr "無剩餘點數" + +msgid "IDS_CALL_POP_NOSERVICE" +msgstr "無服務" + +msgid "IDS_CALL_POP_OPERATION_REFUSED" +msgstr "操作遭拒" + +msgid "IDS_CALL_POP_OUTGOING_INTERNATIONAL_CALLS_EXCEPT_HOME_BARRED" +msgstr "限制撥出國際電話(本國除外)" + +msgid "IDS_CALL_POP_OUTGOING_INTER_CALLS_BARRED" +msgstr "已限制撥出國際電話" + +msgid "IDS_CALL_POP_PHONE_NOT_INITIALISED" +msgstr "未初始化手機" + +msgid "IDS_CALL_POP_REDIALLING" +msgstr "正在重撥..." + +msgid "IDS_CALL_POP_SERVICE_NOT_ALLOWED" +msgstr "不允許的服務" + +msgid "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE" +msgstr "僅限 SOS 通話。\n請插入 SIM 卡以存取網路服務" + +msgid "IDS_CALL_POP_SPLIT_FAILED" +msgstr "分割失敗" + +msgid "IDS_CALL_POP_SPLIT_NOT_SUPPORTED" +msgstr "分割不受支援" + +msgid "IDS_CALL_POP_SWAP_FAILED" +msgstr "切換失敗" + +msgid "IDS_CALL_POP_SWAP_NOT_SUPPORTED" +msgstr "不支援切換" + +msgid "IDS_CALL_POP_TRANSFER_FAILED" +msgstr "傳輸失敗" + +msgid "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED" +msgstr "不支援轉移" + +msgid "IDS_CALL_POP_UNABLE_TO_RETRIEVE" +msgstr "無法擷取" + +msgid "IDS_CALL_POP_UNAVAILABLE" +msgstr "無法使用" + +msgid "IDS_CALL_POP_UNHELD" +msgstr "已取消保留" + +msgid "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED" +msgstr "不支援取消保留" + +msgid "IDS_CALL_POP_USER_BUSY" +msgstr "使用者忙碌" + +msgid "IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM" +msgstr "驗證SIM卡或插入有效SIM卡" + +msgid "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL" +msgstr "視訊通話進行中不允許撥打語音電話" + +msgid "IDS_CALL_POP_WAITING_ACTIVE" +msgstr "已啟動呼叫等待" + +msgid "IDS_CALL_POP_WRONG_GROUP" +msgstr "群組錯誤" + +msgid "IDS_CALL_BODY_END_HELD_CALLS_HPD" +msgstr "結束保留的通話 (%d)" + +msgid "IDS_CALL_BUTTON_RECEIVER" +msgstr "耳機" + +msgid "IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB" +msgstr "保留當前通話" + +msgid "IDS_CALL_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "記憶體不足。請刪除部分項目" + +msgid "IDS_CALL_SK3_END_CALL" +msgstr "結束通話" + +msgid "IDS_CALL_BODY_SERVICE_UNAVAILABLE" +msgstr "無法使用服務" + +msgid "IDS_CALL_SK_REC_ABB" +msgstr "錄影" + +msgid "IDS_CALL_POP_UNKNOWNREJECTED" +msgstr "已拒接不明來電" + +msgid "IDS_CALL_BODY_IN_PD_DAYS" +msgstr "在 %d 天後" + +msgid "IDS_CALL_BODY_TOMORROW" +msgstr "明天" + +msgid "IDS_CALL_POP_IN_A_WEEK" +msgstr "一週內" + +msgid "IDS_CALL_HEADER_ACCEPT_CALL_AFTER" +msgstr "稍後應答來電" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_OFF" +msgstr "關閉減少雜訊" + +msgid "IDS_CALL_OPT_NOISE_REDUCTION_ON" +msgstr "開啟減少雜訊" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "啟用最大音量時無法開啟減少雜訊" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_EARPHONE_CONNECTED" +msgstr "耳機連接時無法開啟減少雜訊功能" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "藍牙耳機啟用時無法開啟降噪功能" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_DURING_WIDEBAND_CALLS" +msgstr "寬頻通話期間無法開啟減少雜訊功能" + +msgid "IDS_CALL_POP_TO_USE_THIS_FUNCTION_YOU_HAVE_TO_CHECK_OPTIMISE_EQ_FOR_ME_UNDER_CALL_SETTINGS" +msgstr "欲使用此功能,必須檢查通話設定下的最佳化個人等化器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_SPEAKER_IS_ON" +msgstr "揚聲器開啟時無法啟用來電音效等化器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_EARPHONES_ARE_CONNECTED" +msgstr "耳機連接時無法啟用來電音效等化器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHEN_BLUETOOTH_HEADSET_IS_ON" +msgstr "藍牙耳機開啟時無法啟用來電音效等化器" + +msgid "IDS_CALL_POP_UNABLE_TO_USE_EXTRA_VOLUME_RANGE_WHEN_EARPHONES_OR_BT_HEADSET_ARE_CONNECTED" +msgstr "連接耳機或藍牙耳機時無法使用增強音量" + +msgid "IDS_CALL_POP_CALLING" +msgstr "正在通話..." + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_WHILE_EXTRA_VOLUME_IS_ENABLED" +msgstr "增強音量開啟時無法啟用來電音效等化器" + +msgid "IDS_CALL_POP_UNABLE_TO_ENABLE_IN_CALL_SOUND_EQ_DURING_WIDEBAND_CALLS" +msgstr "寬頻通話期間無法啟用來電音效等化器" + +msgid "IDS_CALL_POP_UNABLE_TO_TURN_ON_NOISE_REDUCTION_WHEN_SPEAKER_IS_ON" +msgstr "喇叭啟用時無法開啟減少雜訊功能" + +msgid "IDS_QP_BODY_GROUP_CALL_HPD_ABB" +msgstr "群組通話(%d)" + +msgid "IDS_CALL_OPT1_SAVED_IMAGE" +msgstr "儲存的圖像" + +msgid "IDS_CALL_OPT1_SAVED_VIDEO" +msgstr "儲存的視訊" + +msgid "IDS_CALL_OPT1_TAKE_A_PICTURE" +msgstr "拍照" + +msgid "IDS_CALL_BUTTON2_LIVE_VIDEO" +msgstr "即時視訊" + +msgid "IDS_CALL_BUTTON_VIEW_CONTACT" +msgstr "檢視聯絡人" + +msgid "IDS_CALL_HEADER_PD_MISSED_CALLS" +msgstr "%d 通未接電話" + +msgid "IDS_CALL_POP_CALLMISSED" +msgstr "未接電話" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_ENABLED" +msgstr "已啟用增強音量" + +msgid "IDS_CALL_POP_EXTRA_VOLUME_DISABLED" +msgstr "已停用增強音量" + +msgid "IDS_CALL_POP_OUTGOING_CALL_FORWARDED" +msgstr "撥出電話已轉接" + +msgid "IDS_CALL_POP_OUTGOING_CALLS_BARRED" +msgstr "已限制撥出電話" + +msgid "IDS_COM_BODY_FORWARDED_CALL" +msgstr "已前轉呼叫" + diff --git a/ui/src/include/vcui-app-data.h b/ui/src/include/vcui-app-data.h new file mode 100755 index 0000000..bc05ace --- /dev/null +++ b/ui/src/include/vcui-app-data.h @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_APP_DATA_H_ +#define _VCUI_APP_DATA_H_ + +#include +#include "voice-call-engine.h" +#include "vcui-doc-launch.h" + +#define TIME_END_START 1 +#define TIME_END_NO 0 +#define TIME_END_MAX_SHOW 8 + +#define MY_HANDLE 252 +#define ALL_HANDLE 253 +#define NO_HANDLE 254 +#define NO_STATUS 254 + +#define WIN_HIDE 0 +#define WIN_SHOW 1 + +typedef enum { + CALL_LOCK = 1, + CALL_UNLOCK +} vcui_app_lock_type_t; + +typedef enum { + CALL_OUTGOING = 1, + CALL_INCOMING +} vcui_app_call_dirction_t; + +typedef enum { + CALL_HOLD = 1, + CALL_UNHOLD +} vcui_app_call_status_t; + +typedef enum { + VIEW_DIALLING_VIEW = 0, + VIEW_INCOMING_LOCK_VIEW, + VIEW_INCALL_ONECALL_VIEW, + VIEW_INCALL_MULTICALL_SPLIT_VIEW, + VIEW_INCALL_MULTICALL_CONF_VIEW, + VIEW_INCALL_MULTICALL_LIST_VIEW, + VIEW_ENDCALL_VIEW, + VIEW_QUICKPANEL_VIEW, + VIEW_MAX +} vcui_app_call_view_id_t; + +typedef enum _vcui_snd_path_type_t { + VCUI_SND_PATH_NONE, + VCUI_SND_PATH_HEADSET, + VCUI_SND_PATH_RECEIVER_EARJACK, + VCUI_SND_PATH_SPEAKER, + VCUI_SND_PATH_MAX, +} vcui_snd_path_type_t; + +typedef enum _vcui_vol_type_t { + VCUI_VOL_RING, + VCUI_VOL_VOICE, + VCUI_VOL_HEADSET, + VCUI_VOL_MAX +} vcui_vol_type_t; + +typedef struct _appdata { + Evas *evas; + Evas_Object *win_main; + Evas_Object *win_conformant; + + int root_w; /** + +#include + +#ifndef Eina_Bool +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "vcui-app-data.h" +#include "vcui-doc-launch.h" +#include "voice-call-engine-msg.h" + +#include "vcui-document.h" +#include "vcui-view-choice.h" +#include "vcui-view-common.h" +#include "vcui-view-elements.h" +#include "vcui-view-popup.h" + +#include + +#include "libintl.h" + +#define DIALER_PKG "org.tizen.phone" +#define CONTACTS_PKG "org.tizen.contacts" +#define CALL_PKG "org.tizen.call" + +#if !defined(PACKAGE) +# define PACKAGE "call" +#endif + +#if !defined(LOCALEDIR) +# define LOCALEDIR "/usr/apps/org.tizen.call/res/locale" +#endif + +#if !defined(EDJDIR) +# define EDJDIR "/usr/apps/org.tizen.call/res/edje" +#endif + +#if !defined(IMGDIR) +# define IMGDIR "/usr/apps/org.tizen.call/res/images" +#endif + +#if !defined(MEDIADIR) +# define MEDIADIR "/usr/apps/org.tizen.call/res/media" +#endif + +#if !defined(ICONDIR) +# define ICONDIR "/usr/apps/org.tizen.call/res/icons/default/small" +#endif + +#define EDJ_NAME EDJDIR"/call.edj" +#define CALL_THEME EDJDIR"/call_theme.edj" + +#define GRP_MTVIEW "mt-view" +#define GRP_MOVIEW "mo-view" +#define GRP_INCALL "incall" +#define GRP_MTLOCK "mtlock" +#define GRP_KEYPAD "keypad" +#define GRP_MULTICALL_SPLIT "multicall-split" +#define GRP_MULTICALL_SPLIT2 "multicall-split2" +#define GRP_MULTICALL_CONF "multicall-conf" +#define GRP_MULTICALL "multicall-list" +#define GRP_REJECT_MSG "reject_with_msg" +#define GRP_UG_EFFECT "ug_effect" +#define GRP_END_SINGLECALL "end-singlecall" +#define GRP_END_CONFCALL "end-confcall" +#define GRP_QUICKPANEL "quickpanel" +#define GRP_QUICKPANEL_LSCAPE "quickpanel-lscape" +#define GRP_SEPARATOR_LAYOUT "separator-layout" +#define GRP_SEPARATOR_LAYOUT_3BUTTON "separator-layout-3button" +#define GRP_BUTTON_LAYOUT "button-layout" +#define GRP_CALLER_INFO "caller-info" +#define GRP_ALERTS_LAYOUT "sns-alerts-layout" +#define GRP_CALLER_ID_LAYOUT "caller-id-layout" + +#define GRP_LOCK_ACCEPT "lock_accept" +#define GRP_LOCK_REJECT "lock_reject" +#define GRP_LOCK_REJECT_WITH_MSG "lock_reject_with_msg" + +#define QP_NOIMG_ICON IMGDIR"/vc_qp_caller_ID.png" +#define QP_CONF_ICON IMGDIR"/vc_qp_caller_ID_group.png" +#define NOIMG_ICON IMGDIR"/vc_normal_caller_ID.png" +#define CONF_ICON IMGDIR"/vc_normal_caller_ID_group.png" +#define PRIVATE_ICON IMGDIR"/vc_conference_private.png" + +#define CONF_CALL_END_ICON IMGDIR"/vc_icon_conf_call_end.png" +#define BDAY_ICON IMGDIR"/vc_birthday_icon.png" +#define CALLER_INFO_ICON IMGDIR"/vc_caller_info_icon.png" +#define NOIMG_SPLIT_ICON IMGDIR"/vc_caller_ID_split.png" +#define CONF_SPLIT_ICON IMGDIR"/vc_caller_ID_split_group.png" + +#define HOLD_ICON IMGDIR"/vc_icon_hold_call.png" +#define UNHOLD_ICON IMGDIR"/vc_icon_unhold_call.png" +#define SWAP_ICON IMGDIR"/vc_icon_swap_call.png" + +#define VOLUME_ICON IMGDIR"/vc_volume_icon.png" +#define VOLUME_MUTE_ICON IMGDIR"/vc_volume_mute_icon.png" + +#define VOICE_CALL_ICON IMGDIR"/vc_voice_call_icon.png" +#define VIDEO_CALL_ICON IMGDIR"/vc_video_call_icon.png" +#define MESSAGE_ICON IMGDIR"/vc_msg_icon.png" + +#define REJ_MSG_CREATE_ICON IMGDIR"/vc_reject_create_icon.png" + +#define MORE_MANAGE_CONF_ICON IMGDIR"/vc_more_manage_conf.png" +#define MORE_ADD_CALL_ICON IMGDIR"/vc_more_add_call.png" +#define MORE_JOIN_ICON IMGDIR"/vc_more_join.png" +#define MORE_CONTACTS_ICON IMGDIR"/vc_more_contacts.png" + +#define QP_MUTE_ICON IMGDIR"/vc_qp_mute_on.png" + +#define NOTIFY_MISSED_CALL_ICON IMGDIR"/vc_notify_missed_call.png" +#define NOTIFY_SUB_MISSED_CALL_ICON IMGDIR"/vc_notify_sub_missed_call.png" + +#define INCOME_ANI IMGDIR"/vc_income" +#define OUTGOING_ANI IMGDIR"/vc_outgoing" + +#define MINI_CONTROLLER_WIDTH (480) +#define MINI_CONTROLLER_HEIGHT (42) + +#define MAIN_WIN_HD_W 720 +#define MAIN_WIN_HD_H 1280 +#define MAIN_WIN_WVGA_W 480 +#define MAIN_WIN_WVGA_H 800 + +#define QUICKPANEL_WIDTH (720) +#define LSCAPE_QUICKPANEL_WIDTH (1280) +#define QUICKPANEL_HEIGHT (170) + +#define MORE_MENU_CTXPOPUP_X 660 +#define MORE_MENU_CTXPOPUP_Y 175 + +#define DEF_BUF_LEN (128) +#define DEF_BUF_LEN_LONG (256) + +#define VAL_VOL_UP (1) +#define VAL_VOL_DOWN (0) + +#define RINGTONE_MIN (0) +#define RINGTONE_MAX (15) +#define VOICE_VOL_MIN (1) +#define VOICE_VOL_MAX (7) /* It must change to 6 later.. */ +#define BT_VOL_MIN (1) +#define BT_VOL_MAX (15) + +#define RINGTONE_LONGPRESS_MUTE_TIMEOUT 0.7 +#define VOLUME_KEY_LONG_PRESS_TIMEOUT 0.1 + +#define POPUP_TIMEOUT_SHORT (2.0) +#define POPUP_TIMEOUT_NORMAL (3.0) +#define POPUP_TIMEOUT_LONG (5.0) +#define POPUP_TIMEOUT_VERY_LONG (10.0) + +#define TIMER_TIMEOUT_0_1_SEC (0.1) +#define TIMER_TIMEOUT_0_3_SEC (0.3) +#define TIMER_TIMEOUT_0_5_SEC (0.5) +#define TIMER_TIMEOUT_1_SEC (1.0) +#define TIMER_TIMEOUT_2_SEC (2.0) +#define TIMER_TIMEOUT_4_SEC (4.0) + +#define BLUR_VALUE 30 +#define IMG_TYPE_FULL 1 +#define IMG_TYPE_WALLPAPER 2 +#define IMG_TYPE_BLUR 3 + +#ifndef EINA_TRUE +#define EINA_TRUE 1 +#endif + +#ifndef EINA_FALSE +#define EINA_FALSE 0 +#endif + +#ifdef CALL_DEBUG_ON_DLOG +#define VC_LOG_ERR LOG_ERROR +#define VC_LOG_WARN LOG_WARN +#define VC_LOG_DEBUG LOG_DEBUG +#else +#define VC_LOG_ERR +#define VC_LOG_WARN +#define VC_LOG_DEBUG +#endif + +#ifdef CALL_DEBUG_ON_DLOG +#define CALL_UI_DEBUG(level, frmt, args...) do { LOG(level, TAG_CALL, "[vcui] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#define CALL_UI_KPI(frmt, args...) do { LOG(LOG_DEBUG, TAG_CALL_LAUNCH, "[VC_KPI] [%s:%d] "frmt"\n", __func__, __LINE__, ##args); } while (0) +#else +#define CALL_UI_DEBUG(args...) +#endif + +#ifndef retv_if +#define retv_if(expr, val) do { \ + if (expr) { \ + CALL_UI_DEBUG(VC_LOG_WARN, "(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) +#endif + +#ifndef retvm_if +#define retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + CALL_UI_DEBUG(VC_LOG_WARN, fmt, ##arg); \ + CALL_UI_DEBUG(VC_LOG_WARN, "(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) +#endif + +#ifndef VCUI_RETURN_IF_FAIL +#define VCUI_RETURN_IF_FAIL(check_condition) \ + if (!(check_condition)) return; +#endif + +#ifndef VCUI_RETURN_FALSE_IF_FAIL +#define VCUI_RETURN_FALSE_IF_FAIL(check_condition) \ + if (!(check_condition)) return EINA_FALSE; +#endif + +#ifndef VCUI_RETURN_VALUE_IF_FAIL +#define VCUI_RETURN_VALUE_IF_FAIL(check_condition, value) \ + if (!(check_condition)) return value; +#endif + +#ifndef VCUI_RETURN_NULL_IF_FAIL +#define VCUI_RETURN_NULL_IF_FAIL(check_condition) \ + if (!(check_condition)) return NULL; +#endif + +#ifndef VCUI_RETURN_ZERO_IF_FAIL +#define VCUI_RETURN_ZERO_IF_FAIL(check_condition) \ + if (!(check_condition)) return 0; +#endif + +#ifndef VCUI_RETURN_INVALID_IF_FAIL +#define VCUI_RETURN_INVALID_IF_FAIL(check_condition) \ + if (!(check_condition)) return -1; +#endif + +#ifndef VCUI_RETURN_VALUE_IF_NOT_IN_RANGE +#define VCUI_RETURN_VALUE_IF_NOT_IN_RANGE(value, min_value, max_value, ret_val) \ + if ((value < min_value) || (value > max_value)) return ret_val; +#endif + +#ifndef _EDJ +#define _EDJ(obj) elm_layout_edje_get(obj) +#endif + +#define _EVAS_OBJ_DEL(obj) if (obj) \ + { \ + evas_object_del(obj); \ + obj = NULL; \ + } + +struct text_part { + char *part; + char *msgid; +}; + +typedef enum _voice_call_bg_type_t { + BG_HIDE, + BG_SHOW +} voice_call_bg_type_t; + +typedef enum { + CALL_END_TYPE_NONE = -1, + CALL_END_TYPE_SINGLE_CALL, + CALL_END_TYPE_CONF_CALL, +} voice_call_end_type_t; + +void _create_main_ui_set_flag(); +void _create_main_ui_real(); +void _vcui_show_main_ui_set_flag(); +void __vcui_hide_main_ui_set_flag(); + +void _vcui_determine_background_show_hide(); + +void _vcui_cache_flush(); +vcui_app_call_data_t *_vcui_get_app_data(); +int _vcui_is_idle_lock(); + +gboolean _vcui_is_gcf_mode(void); +gboolean _vcui_is_headset_conected(void); +gboolean _vcui_is_headset_switch_on(void); +gboolean _vcui_is_answering_mode_on(void); +gboolean _vcui_is_powerkey_mode_on(void); +gboolean _vcui_is_phonelock_status(void); + +void _vcui_add_calllog(contacts_phone_log_type_e type, call_data_t *data, int boutgoing_end); + +void _vcui_response_volume(int vol_alert_type, int vol_level); +void _vcui_set_volume(int key_status); + +void _vcui_raise_main_win(); +int _vcui_check_valid_eo(Evas_Object *eo, char *v_name); + +unsigned long _vcui_get_diff_now(time_t start_time); + +char *_vcui_get_endcause_string(int end_cause, char *data); + +Evas_Object *_vcui_load_edj(Evas_Object *parent, const char *file, const char *group); + +const char *_vcui_convert_service_error(int err); +const char *_vcui_convert_alarm_error(int err); + +#endif /* _VCUI_APPLICATION_H_ */ + diff --git a/ui/src/include/vcui-doc-launch.h b/ui/src/include/vcui-doc-launch.h new file mode 100755 index 0000000..9a71a1e --- /dev/null +++ b/ui/src/include/vcui-doc-launch.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_DOC_LAUNCH_H_ +#define _VCUI_DOC_LAUNCH_H_ + +#define PKGNAME_CONTACT_UG "contacts-list-efl" +#define PKGNAME_DIALER_UG "phone-tabui-efl" + +typedef enum { + VCUI_UG_TYPE_NOE = 0, + VCUI_UG_TYPE_CONTACT_LIST, + VCUI_UG_TYPE_ADD_CALL, + VCUI_UG_TYPE_ADD_TO_CONTACTS, + VCUI_UG_TYPE_VIEW_CONTACT, + VCUI_UG_TYPE_MAX +} vcui_ug_type; + +struct vcui_ugs_array { + int ug_count; + int last_ug_type; + Eina_List *ug_lists; +}; + +struct vcui_ug_priv_data { + void (*on_start_callback) (void *); + void (*on_destroy_callback) (void *); + void *destroy_callback_param; + void *need_navi; + void *need_parent; + void *need_layout; + void *need_ug; + void *need_ug_lists; +}; + +void _vcui_doc_launch_contact_list_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data); +void _vcui_doc_launch_phoneui_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data); +void _vcui_doc_launch_add_to_contacts_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data, void *data); +void _vcui_doc_launch_view_contact_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data, void *data); + +void _vcui_doc_launch_msg_composer(void *data, char *number); +void _vcui_doc_launch_destroy_ug_all(void *ugs_array_data); + +#endif diff --git a/ui/src/include/vcui-document.h b/ui/src/include/vcui-document.h new file mode 100755 index 0000000..f40600a --- /dev/null +++ b/ui/src/include/vcui-document.h @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_DOCUMENT_H_ +#define _VCUI_DOCUMENT_H_ + +typedef struct _call_data_t call_data_t; + +/** + * This function initializes the data structure pointers maintained in the document file + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_data_init(); + +/** + * This function allocates memory for the call data structure - call_data_t + * + * @return pointer to the memory allocated for call-data structure, or NULL if memory allocation fails + * @param[in] nothing +*/ +call_data_t *_vcui_doc_allocate_call_data_memory(void); + +/** + * This function retrieves the value of the call handle + * + * @return value of the call handle + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_handle(call_data_t *pcall_data); + +/** + * This function assigns the value of call handle for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] call_handle new value of the call handle +*/ +void _vcui_doc_set_call_handle(call_data_t *pcall_data, int call_handle); + +/** + * This function retrieves the value of the call number + * + * @return pointer to the call number string + * @param[in] pcall_data pointer to the call-data structure +*/ +char *_vcui_doc_get_call_number(call_data_t *pcall_data); + +/** + * This function assigns the value of call number for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] pnumber pointer to the call number string +*/ +void _vcui_doc_set_call_number(call_data_t *pcall_data, char *pnumber); + +/** + * This function retrieves the value of the call name (available from contact DB) + * + * @return pointer to the call name string + * @param[in] pcall_data pointer to the call-data structure +*/ +char *_vcui_doc_get_call_display_name(call_data_t *pcall_data); + +/** + * This function assigns the value of contact name for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] pname pointer to the call number string +*/ +void _vcui_doc_set_call_display_name(call_data_t *pcall_data, char *pname); + +/** + * This function retrieves the caller-ID file path (caller-ID for split screen) + * + * @return pointer to the caller-ID file path string + * @param[in] pcall_data pointer to the call-data structure +*/ +char *_vcui_doc_get_caller_id_file_path(call_data_t *pcall_data); + +/** + * This function assigns the value of caller-ID file-path for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] pfile_path pointer to the caller-ID file-path string +*/ +void _vcui_doc_set_caller_id_file_path(call_data_t *pcall_data, char *pfile_path); + +/** + * This function retrieves the value of the call start time + * + * @return value of the call start time + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_start_time(call_data_t *pcall_data); + +/** + * This function assigns the value of call start time for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure +*/ +void _vcui_doc_set_call_start_time(call_data_t *pcall_data); + +/** + * This function retrieves the value of the contact index + * + * @return value of the contact index + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_contact_index(call_data_t *pcall_data); + +/** + * This function assigns the value of contact index for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] contact_index value of the contact index +*/ +void _vcui_doc_set_contact_index(call_data_t *pcall_data, int contact_index); + +/** + * This function retrieves the value of the contact phone type + * + * @return value of the contact phone type + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_contact_phone_type(call_data_t *pcall_data); + +/** + * This function assigns the value of contact phone type for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] phone_type value of the contact phone type +*/ +void _vcui_doc_set_contact_phone_type(call_data_t *pcall_data, int phone_type); + +/** + * This function retrieves the value of the forwarded call state + * + * @return value of the forwarded call state + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_forwarded_call(call_data_t *pcall_data); + +/** + * This function assigns the value of forwarded call state for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] bfwded value of the forwarded call state +*/ +void _vcui_doc_set_forwarded_call(call_data_t *pcall_data, int bfwded); + +/** + * This function retrieves the value of the auto reject status + * + * @return value of the auto reject status + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_auto_reject_status(call_data_t *pcall_data); + +/** + * This function assigns the value of auto reject status for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] bauto_rejected value of the auto reject status +*/ +void _vcui_doc_set_auto_reject_status(call_data_t *pcall_data, gboolean bauto_rejected); + +/** + * This function retrieves if a call is MO or MT type + * + * @return value of the call type - MO or MT + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_type(call_data_t *pcall_data); + +/** + * This function assigns the value of call type for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] call_type type of call, MO or MT +*/ +void _vcui_doc_set_call_type(call_data_t *pcall_data, int call_type); + +/** + * This function retrieves the call status of a particular call data structure (HOLD/UNHOLD) + * + * @return value of the call status, HOLD/UNHOLD + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_status(call_data_t *pcall_data); + +/** + * This function assigns the value of call status for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] call_status status of call, active/held +*/ +void _vcui_doc_set_call_status(call_data_t *pcall_data, int call_status); + +/** + * This function retrieves the pointer to the most recent MO(outgoing) call data + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_mo_call_data(); + +/** + * This function assigns the pointer of the most recent MO(outgoing) call data + * to the pointer stored in the vcui-document file (recent_mo) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_set_mo_call_data(call_data_t *in); + +/** + * This function retrieves the pointer to the most recent MT(incoming) call data + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_mt_call_data(); + +/** + * This function assigns the pointer of the most recent MT(incoming) call data + * to the pointer stored in the vcui-document file (recent_mt) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_set_mt_call_data(call_data_t *in); + +/** + * This function retrieves the pointer to the most recent call data, either MT(incoming)/MO(outgoing) + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_recent_call_data(); + +/** + * This function assigns the pointer of the most recent MT(incoming)/MO(outgoing) call data + * to the pointer stored in the vcui-document file (recent_call) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_set_all_recent(call_data_t *in); + +/** + * This function adds the call data structure to the list of call data maintained in the + * vcui-document file (caller_list link list) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be added +*/ +void _vcui_doc_add_call_data(call_data_t *in); + +/** + * This function updates the call data structure contained in the list of call data maintained in the + * vcui-document file (caller_list link list) with the new call-data structure + * + * @return nothing + * @param[in] in pointer to the call-data structure to be updated +*/ +void _vcui_doc_update_call_data(call_data_t *in); + +/** + * This function checks if the call data pointer data is valid and present in the 'caller_list' list + * + * @return TRUE if the call-data is present and FALSE if there is no such call-data in the list + * @param[in] in pointer to the call-data structure +*/ +Eina_Bool _vcui_doc_is_valid_call_data(call_data_t *in); + +/** + * This function removes the call data structure from the list of call data maintained in the + * vcui-document file (caller_list link list) and frees the call data structure + * + * @return nothing + * @param[in] in pointer to the call-data structure to be added +*/ +void _vcui_doc_remove_call_data(call_data_t *in); + +/** + * This function removes the call data structure from the list of call data maintained in the + * vcui-document file (caller_list link list) + * + * @return a pointer to the call data structure which is passed + * @param[in] in pointer to the call-data structure to be added +*/ +call_data_t *_vcui_doc_remove_call_data_from_list(call_data_t *in); + +/** + * This function removes all the call data from list and frees the memory + * + * @return nothing + * @param[in] void +*/ +void _vcui_doc_remove_all_call_data(); + +/** + * This function retrieves the earliest call data based on the call status + * + * @return pointer to the call data structure + * @param[in] call_status value of the call status (hold/unhold) +*/ +call_data_t *_vcui_doc_get_call_data_by_call_status(int call_status); + +/** + * This function retrieves the most recent MO call data + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_call_data_mo_type(); + +/** + * This function retrieves the first call data in the list + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_first_call_data_from_list(); + +/** + * This function retrieves the first call data in the list which is of UNHOLD status + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_first_call_data_by_unhold_status(); + +/** + * This function retrieves the call data based on the given call handle + * + * @return pointer to the call data structure + * @param[in] handle value of the call handle +*/ +call_data_t *_vcui_doc_get_call_data_by_handle(int handle); + +/** + * This function retrieves the count of call data which are in HOLD status + * + * @return count of held call data + * @param[in] nothing +*/ +int _vcui_doc_get_hold_call_data_count(); + +/** + * This function retrieves the count of call data which are in UNHOLD status + * + * @return count of active call data + * @param[in] nothing +*/ +int _vcui_doc_get_unhold_call_data_count(); + +/** + * This function retrieves the count of call data which are in NO status (neither hold/unhold) + * + * @return count of 'no status' call data + * @param[in] nothing +*/ +int _vcui_doc_get_no_status_call_data_count(); + +/** + * This function retrieves the count of all call data in the list + * + * @return count of all call data + * @param[in] nothing +*/ +int _vcui_doc_get_all_call_data_count(); + +/** + * This function retrieves the call status of a group (greater than 1 member group) + * + * @return value of the call status (HOLD/UNHOLD) + * @param[in] nothing +*/ +int _vcui_doc_get_group_call_status(); + +/** + * This function retrieves the pointer to the list containing the call data with HOLD status + * + * @return pointer to the HOLD call data list + * @param[in] nothing +*/ +Eina_List *_vcui_doc_get_caller_list_with_hold_status(); + +/** + * This function retrieves the pointer to the list containing the call data with UNHOLD status + * + * @return pointer to the UNHOLD call data list + * @param[in] nothing +*/ +Eina_List *_vcui_doc_get_caller_list_with_unhold_status(); + +/** + * This function prints all the call data structure members + * + * @return nothing + * @param[in] msg_pos type of message +*/ +void _vcui_doc_print_all_call_data(char *msg_pos); + +/** + * This function assigns UNHOLD call status to all the call data in the list + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_set_all_call_data_to_unhold_status(); + +/** + * This function assigns HOLD call status to all the call data in the list + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_set_all_call_data_to_hold_status(); + +/** + * This function swaps the HOLD and UNHOLD calls in the call list + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_swap_all_call_data_status(); + +#endif + diff --git a/ui/src/include/vcui-view-callend.h b/ui/src/include/vcui-view-callend.h new file mode 100755 index 0000000..f15df66 --- /dev/null +++ b/ui/src/include/vcui-view-callend.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_CALLEND_H_ +#define _VCUI_VIEW_CALLEND_H_ + + +voice_call_view_data_t *_vcui_view_callend_new(vcui_app_call_data_t *ad); +int _vc_ui_view_callend_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_callend_get_layout(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_callend_get_button_layout(voice_call_view_data_t *vd); +void _vc_ui_view_callend_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur); +Evas_Object *_vc_ui_view_callend_get_caller_info(voice_call_view_data_t *vd); + +#endif diff --git a/ui/src/include/vcui-view-choice.h b/ui/src/include/vcui-view-choice.h new file mode 100755 index 0000000..435b3b7 --- /dev/null +++ b/ui/src/include/vcui-view-choice.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_CHOICE_H_ +#define _VCUI_VIEW_CHOICE_H_ + +void _vcui_view_change(vcui_app_call_view_id_t view_id, int param1, void *param2, void *param3); +void _vcui_view_auto_change(); +void _vcui_view_update(); +void _vcui_view_all_hide(); +void _vcui_view_destroy(vcui_app_call_view_id_t view_id); +void _vcui_view_quickpanel_change(); + +#endif /*_VCUI_VIEW_CHOICE_H_*/ diff --git a/ui/src/include/vcui-view-common.h b/ui/src/include/vcui-view-common.h new file mode 100755 index 0000000..dd21894 --- /dev/null +++ b/ui/src/include/vcui-view-common.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_COMMON_H_ +#define _VCUI_VIEW_COMMON_H_ + +#include + +#define TIME_BUF_LEN (16) +#define MIN_SEC (60) +#define HOUR_MIN (60) +#define DAY_HOUR (24) + +#define TB_W (480) +#define TB_H (90) + +typedef struct _vcui_view_common_t { + Ecore_Timer *tm; + Ecore_Timer *tm_end; + Ecore_Timer *tm_end_dialing; + Ecore_Timer *tm_end_force; + + int bredial; + + char sec, min, hour; + int timer_flag; + unsigned int call_time; + + int time_end_flag; + int time_count; + int end_type; + + time_t current_call_time; + time_t start_call_time; +} vcui_view_common_t; + +void _vcui_view_common_set_each_time(time_t starttime); + +void _vcui_view_common_timer_text_init(); + +void _vcui_view_common_set_text_time(char *time_dur); +void _vcui_view_common_init(); + +void _vcui_view_common_call_end_show(time_t start_time, int end_type); +void _vcui_view_common_call_end_show_dialing(int end_type, int bredial); +void _vcui_view_common_call_end_timer_reset(void); + +void _vcui_view_common_timer_destroy(); +void _vcui_view_common_timer_end_destroy(); +void _vcui_view_common_timer_end_dialing_destroy(); +void _vcui_view_common_timer_redial_reset(); + +int _vcui_view_common_call_terminate_or_view_change(void); + +void _vcui_view_common_update_mute_btn(void); +gboolean _vcui_view_common_is_emul_bin(void); +#endif + diff --git a/ui/src/include/vcui-view-dialing.h b/ui/src/include/vcui-view-dialing.h new file mode 100755 index 0000000..4e5046c --- /dev/null +++ b/ui/src/include/vcui-view-dialing.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_DIALING_H_ +#define _VCUI_VIEW_DIALING_H_ + + +voice_call_view_data_t *_vcui_view_dialing_new(vcui_app_call_data_t *ad); + +void _vcui_view_dialing_draw_txt_ended(voice_call_view_data_t *vd, int end_type); +int _vc_ui_view_dialing_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_dialing_get_layout(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_dialing_get_button_layout(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_dialing_get_caller_info(voice_call_view_data_t *vd); + +#endif diff --git a/ui/src/include/vcui-view-elements.h b/ui/src/include/vcui-view-elements.h new file mode 100755 index 0000000..df74dcf --- /dev/null +++ b/ui/src/include/vcui-view-elements.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_ELEMENTS_H_ +#define _VCUI_VIEW_ELEMENTS_H_ + + +void _vcui_swap_btn_cb(void *data, Evas_Object * obj, void *event_info); +void _vcui_conf_img_cb(void *data, Evas_Object * obj, void *event_info); + +#ifdef _VC_CONTACT_OPT_ +Evas_Object *_vcui_create_contact_button(void *data); +Evas_Object *_vcui_create_contact_button_disabled(void *data); +#endif /*_VC_CONTACT_OPT_*/ + +Evas_Object *_vcui_create_bottom_first_button(void *data); +Evas_Object *_vcui_create_bottom_first_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_second_button(void *data); +Evas_Object *_vcui_create_bottom_second_button_disabled(void *data); +Evas_Object *_vcui_create_top_end_button(void *data); +Evas_Object *_vcui_create_top_end_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_third_button(void *data); +Evas_Object *_vcui_create_bottom_third_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_fourth_button(void *data); +Evas_Object *_vcui_create_bottom_fourth_button_disabled(void *data); +Evas_Object *_vcui_create_bottom_fifth_button(void *data); +Evas_Object *_vcui_create_bottom_fifth_button_disabled(void *data); + +Evas_Object *_vcui_create_button_bigend(void *data); +Evas_Object *_vcui_create_button_bigend_disabled(void *data); + +Evas_Object *_vcui_create_conf_list_button_hold(void *data); + +void _vcui_delete_contact_image(Evas_Object *contents); +Evas_Object *_vcui_show_default_image(Evas_Object *contents, char *path); +Evas_Object *_vcui_show_caller_id(Evas_Object *contents, char *path); + +Evas_Object *_vcui_create_videocall_button(void *data, char *number); +Evas_Object *_vcui_create_voicecall_button(void *data, char *number); +Evas_Object *_vcui_create_message_button(void *data, char *number); +Evas_Object *_vcui_create_add_to_contacts_button(void *data, char *number); +Evas_Object *_vcui_create_view_contact_button(void *data, int ct_id); + +Evas_Object *_vcui_create_quickpanel_mute_button(void *data); +Evas_Object *_vcui_create_quickpanel_unhold_button(void *data); +Evas_Object *_vcui_create_quickpanel_end_button(void *data); + +Evas_Object *_vcui_create_hold_swap_button(void *data); +void _vcui_show_caller_info_name(void *data, const char *name, Eina_Bool bhold); +void _vcui_show_caller_info_number(void *data, const char *number, Eina_Bool bhold); +Evas_Object *_vcui_show_caller_info_icon(void *data, Eina_Bool bhold); +Evas_Object *_vcui_show_caller_info_status(void *data, const char *status, Eina_Bool bhold); +Evas_Object *_vcui_show_contact_image_split(Evas_Object *contents, const char *path, Eina_Bool bhold); +Evas_Object *_vcui_show_call_not_saved_bg_img(Evas_Object *contents); +void _vcui_elements_check_keypad_n_hide(void *data); +void _vcui_create_no_id_animation(Evas_Object *contents, char *path); +Evas_Object * _vcui_create_notify(Evas_Object *parent, char *string); + +#endif /* _VCUI_VIEW_ELEMENTS_H_ */ + diff --git a/ui/src/include/vcui-view-incoming-lock.h b/ui/src/include/vcui-view-incoming-lock.h new file mode 100755 index 0000000..9fcbaa2 --- /dev/null +++ b/ui/src/include/vcui-view-incoming-lock.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_INCOMING_LOCK_H_ +#define _VCUI_VIEW_INCOMING_LOCK_H_ + + +voice_call_view_data_t *_vcui_view_incoming_lock_new(vcui_app_call_data_t *ad); +int _vc_ui_view_incoming_lock_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_incoming_lock_get_caller_info(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_incoming_lock_get_layout(voice_call_view_data_t *vd); + +#endif diff --git a/ui/src/include/vcui-view-keypad.h b/ui/src/include/vcui-view-keypad.h new file mode 100755 index 0000000..b9b4b40 --- /dev/null +++ b/ui/src/include/vcui-view-keypad.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_KEYPAD_H_ +#define _VCUI_VIEW_KEYPAD_H_ + +#ifndef STRLEN +#define STRLEN(str) (((str) == NULL) ? 0 : strlen(str)) +#endif + +#define CURSOR_BEGIN -1 +#define CURSOR_END -2 + +#define MAX_DIAL_NUMBER_FONT_SIZE 94 +#define KEYPAD_STR_DEFINE_OPEN_SIZE 73 +#define KEYPAD_STR_DEFINE_CLOSE_SIZE 43 +#define KEYPAD_ENTRY_DISP_DATA_SIZE 1024 +#define KEYPAD_ENTRY_SET_DATA_SIZE (KEYPAD_STR_DEFINE_OPEN_SIZE + KEYPAD_STR_DEFINE_CLOSE_SIZE + KEYPAD_ENTRY_DISP_DATA_SIZE) + + +void _vcui_keypad_create_layout(void *data, Evas_Object *parent_ly); +Eina_Bool _vcui_keypad_get_show_status(void); +void _vcui_keypad_set_show_status(Eina_Bool bkeypad_status); +void _vcui_keypad_show_hide_effect(void *data, Evas_Object *parent_ly); +void _vcui_keypad_delete_layout(Evas_Object *parent_ly); +void _vcui_keypad_show_layout(void *data); + +#endif diff --git a/ui/src/include/vcui-view-layout-hd.h b/ui/src/include/vcui-view-layout-hd.h new file mode 100755 index 0000000..98dd347 --- /dev/null +++ b/ui/src/include/vcui-view-layout-hd.h @@ -0,0 +1,1780 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_LAYOUT_HD_H_ +#define _VCUI_VIEW_LAYOUT_HD_H_ + +#define COLOR_DEFAULT 0 0 0 255 +#define COLOR_BG_ALPHA 0 0 0 0 +#define COLOR_BG_FOR_HELD_CALL_DIM 0 0 0 150 + +#define FONT_SLP_Bold "SLP:style=Bold" +#define FONT_SLP_Medium "SLP:style=Medium" +#define FONT_SLP_Roman "SLP:style=Roman" +#define FONT_SLP_Light "SLP:style=Light" +#define FONT_SLP_Regular "SLP:style=Regular" + +#define TEXT_CLASS_SLP_BOLD "slp_bold" +#define TEXT_CLASS_SLP_MEDIUM "slp_medium" +#define TEXT_CLASS_SLP_ROMAN "slp_roman" +#define TEXT_CLASS_SLP_LIGHT "slp_light" +#define TEXT_CLASS_SLP_REGULAR "slp_regular" + +/* + * NBEAT-HD GUI Widget Dimensions + * In Portrait mode + */ +#define MAIN_SCREEN_W 720 +#define MAIN_SCREEN_H 1280 + +#define MAIN_LAYOUT_W 720 +#define MAIN_LAYOUT_H (MAIN_SCREEN_H-INDICATOR_HEIGHT) + +#define INDICATOR_HEIGHT 60 +#define NAVIFRAME_TITLE_HEIGHT 100 + +#define MAIN_NAVIFRAME_W MAIN_SCREEN_W +#define MAIN_NAVIFRAME_H (MAIN_SCREEN_H-INDICATOR_HEIGHT-NAVIFRAME_TITLE_HEIGHT) +#define NAVIFRAME_T_PAD INDICATOR_HEIGHT + +#define QP_WIN_W MAIN_SCREEN_W +#define QP_WIN_H 170 + +#define CALLER_INFO_L_PAD 0 +#define CALLER_INFO_WIDTH MAIN_SCREEN_W +#define CALLER_INFO_T_PAD 0 +#define CALLER_INFO_HEIGHT 160 + +#define CALLER_INFO_MAIN_WIDTH 680 +#define CALLER_INFO_MAIN_GAP 6 + +#define CALLER_INFO_NAME_L_PAD 24 +#define CALLER_INFO_NAME_WIDTH 600 +#define CALLER_INFO_NAME_T_PAD 22 +#define CALLER_INFO_NAME_HEIGHT 70 + +#define CALLER_INFO_VERT_SEP_L_PAD 600 +#define CALLER_INFO_VERT_SEP_WIDTH 2 +#define CALLER_INFO_VERT_SEP_T_PAD 22 +#define CALLER_INFO_VERT_SEP_HEIGHT 70 + +#define CALLER_INFO_ICON_L_PAD 626 +#define CALLER_INFO_ICON_WIDTH 70 +#define CALLER_INFO_ICON_T_PAD CALLER_INFO_NAME_T_PAD +#define CALLER_INFO_ICON_HEIGHT 70 + +#define CALLER_INFO_NUMBER_L_PAD CALLER_INFO_NAME_L_PAD +#define CALLER_INFO_NUMBER_WIDTH CALLER_INFO_MAIN_WIDTH +#define CALLER_INFO_NUMBER_T_PAD (CALLER_INFO_NAME_T_PAD+CALLER_INFO_NAME_HEIGHT+CALLER_INFO_MAIN_GAP) +#define CALLER_INFO_NUMBER_HEIGHT 46 + +#define CALLER_INFO_MIN_WIDTH 50 + + +#define ENDCALL_BTN_BG_L_PAD 0 +#define ENDCALL_BTN_BG_WIDTH MAIN_SCREEN_W +#define ENDCALL_BTN_BG_T_PAD VC_CALLER_ID_LAYOUT_HEIGHT +#define ENDCALL_BTN_BG_HEIGHT 502 + +#define VC_CALLER_ID_LAYOUT_L_PAD 0 +#define VC_CALLER_ID_LAYOUT_WIDTH MAIN_SCREEN_W +#define VC_CALLER_ID_LAYOUT_T_PAD 0 +#define VC_CALLER_ID_LAYOUT_HEIGHT 718 + +#define VC_CALLER_ID_THUMB_BG_L_PAD 166 +#define VC_CALLER_ID_THUMB_BG_WIDTH 388 +#define VC_CALLER_ID_THUMB_BG_T_PAD 182 +#define VC_CALLER_ID_THUMB_BG_HEIGHT 388 + +#define VC_CALLER_ID_THUMB_L_PAD 177 +#define VC_CALLER_ID_THUMB_WIDTH 366 +#define VC_CALLER_ID_THUMB_T_PAD 184 +#define VC_CALLER_ID_THUMB_HEIGHT 366 + +#define MT_NO_CALLER_ID_T_PAD 290 + +#define MTLOCK_REJECT_ICON_R_PAD 60 +#define MTLOCK_REJECT_ICON_WIDTH MTLOCK_ACCEPT_ICON_WIDTH +#define MTLOCK_REJECT_ICON_L_PAD (MAIN_SCREEN_W-MTLOCK_REJECT_ICON_R_PAD-MTLOCK_REJECT_ICON_WIDTH) +#define MTLOCK_REJECT_ICON_T_PAD MTLOCK_ACCEPT_ICON_T_PAD +#define MTLOCK_REJECT_ICON_HEIGHT MTLOCK_ACCEPT_ICON_HEIGHT + +#define MTLOCK_REJECT_MSG_BG_L_PAD 0 +#define MTLOCK_REJECT_MSG_BG_WIDTH MAIN_SCREEN_W +#define MTLOCK_REJECT_MSG_BG_HEIGHT 112 +#define MTLOCK_REJECT_MSG_BG_T_PAD (MAIN_LAYOUT_H-MTLOCK_REJECT_MSG_BG_HEIGHT) + +#define MTLOCK_REJECT_MSG_ARW_L_PAD 346 +#define MTLOCK_REJECT_MSG_ARW_WIDTH 28 +#define MTLOCK_REJECT_MSG_ARW_T_PAD MTLOCK_REJECT_MSG_BG_T_PAD +#define MTLOCK_REJECT_MSG_ARW_HEIGHT 36 + +#define MTLOCK_REJECT_MSG_TEXT_L_PAD 0 +#define MTLOCK_REJECT_MSG_TEXT_WIDTH MAIN_SCREEN_W +#define MTLOCK_REJECT_MSG_TEXT_T_PAD (MTLOCK_REJECT_MSG_BG_T_PAD+44) +#define MTLOCK_REJECT_MSG_TEXT_HEIGHT 68 + +#define MTLOCK_REJECT_MSG_ICON_WIDTH 80 +#define MTLOCK_REJECT_MSG_ICON_HEIGHT 80 + +#define MTLOCK_REJECT_MSG_PAD 20 + +#define MTLOCK_REJECT_MSG_LIST_L_PAD 0 +#define MTLOCK_REJECT_MSG_LIST_WIDTH MAIN_SCREEN_W +#define MTLOCK_REJECT_MSG_LIST_T_PAD MAIN_LAYOUT_H +#define MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT 112 +#define MTLOCK_REJECT_MSG_TWO_LINE_LIST_HEIGHT (MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT*2) +#define MTLOCK_REJECT_MSG_THREE_LINE_LIST_HEIGHT (MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT*3) +#define MTLOCK_REJECT_MSG_FOUR_LINE_LIST_HEIGHT (MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT*4) +#define MTLOCK_REJECT_MSG_FIVE_LINE_LIST_HEIGHT (MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT*5) +#define MTLOCK_REJECT_MSG_SIX_LINE_LIST_HEIGHT (MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT*6) + +#define MTLOCK_REJECT_MSG_TOOLBAR_WIDTH MAIN_SCREEN_W +#define MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT 98 +#define MTLOCK_REJECT_MSG_TOOLBAR_COLOR 248 246 239 255 +#define MTLOCK_REJECT_MSG_CREATE_BTN_W 182 +#define MTLOCK_REJECT_MSG_CREATE_BTN_H 70 +#define MTLOCK_REJECT_MSG_BACK_BTN_W 60 +#define MTLOCK_REJECT_MSG_BACK_BTN_H 60 + +#define SNS_ALERTS_LAYOUT_L_PAD 0 +#define SNS_ALERTS_LAYOUT_WIDTH MAIN_SCREEN_W +#define SNS_ALERTS_LAYOUT_T_PAD 536 +#define SNS_ALERTS_LAYOUT_SHIFT_T_PAD 646 +#define SNS_ALERTS_LAYOUT_HEIGHT 170 + +#define SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_T_PAD 444 +#define SNS_ALERTS_LAYOUT_EXPANDED_T_PAD 312 +#define SNS_ALERTS_LAYOUT_EXPANDED_HEIGHT 380 + +#define BIRTHDAY_ICON_L_PAD 20 +#define BIRTHDAY_ICON_WIDTH 55 +#define BIRTHDAY_ICON_T_PAD 0 +#define BIRTHDAY_ICON_HEIGHT 55 + +#define BIRTHDAY_TEXT_L_PAD (BIRTHDAY_ICON_L_PAD+BIRTHDAY_ICON_WIDTH+16) +#define BIRTHDAY_TEXT_WIDTH 609 +#define BIRTHDAY_TEXT_T_PAD (BIRTHDAY_ICON_T_PAD+20) +#define BIRTHDAY_TEXT_HEIGHT 42 + +#define SNS_STATUS_ICON_L_PAD 20 +#define SNS_STATUS_ICON_WIDTH 55 +#define SNS_STATUS_ICON_T_PAD (BIRTHDAY_ICON_T_PAD+BIRTHDAY_ICON_HEIGHT+22) +#define SNS_STATUS_ICON_HEIGHT 55 + +#define SNS_STATUS_TEXT_L_PAD BIRTHDAY_TEXT_L_PAD +#define SNS_STATUS_TEXT_WIDTH BIRTHDAY_TEXT_WIDTH +#define SNS_STATUS_TEXT_T_PAD (BIRTHDAY_TEXT_T_PAD+BIRTHDAY_TEXT_HEIGHT+24) +#define SNS_STATUS_TEXT_HEIGHT (42*2) + +#define SNS_STATUS_ARROW_WIDTH 52 +#define SNS_STATUS_ARROW_L_PAD (MAIN_SCREEN_W-20-SNS_STATUS_ARROW_WIDTH) +#define SNS_STATUS_ARROW_T_PAD (BIRTHDAY_TEXT_T_PAD+BIRTHDAY_TEXT_HEIGHT+38) +#define SNS_STATUS_ARROW_HEIGHT 52 + +#define SNS_STATUS_EXPANDED_TEXT_WIDTH (BIRTHDAY_TEXT_WIDTH-SNS_STATUS_ARROW_WIDTH-16) +#define SNS_STATUS_EXPANDED_TEXT_HEIGHT (42*7) + +#define ACCEPT_BTN_L_PAD 40 +#define ACCEPT_BTN_WIDTH 300 +#define ACCEPT_BTN_T_PAD 942 +#define ACCEPT_BTN_HEIGHT 112 + +#define REJECT_BTN_L_GAP 40 + +#define REJECT_BTN_L_PAD (ACCEPT_BTN_L_PAD+ACCEPT_BTN_WIDTH+REJECT_BTN_L_GAP) +#define REJECT_BTN_WIDTH ACCEPT_BTN_WIDTH +#define REJECT_BTN_T_PAD ACCEPT_BTN_T_PAD +#define REJECT_BTN_HEIGHT ACCEPT_BTN_HEIGHT + +#define REJECT_W_MSG_BTN_T_GAP 40 + +#define REJECT_W_MSG_BTN_L_PAD ACCEPT_BTN_L_PAD +#define REJECT_W_MSG_BTN_WIDTH 640 +#define REJECT_W_MSG_BTN_T_PAD (ACCEPT_BTN_T_PAD+ACCEPT_BTN_HEIGHT+REJECT_W_MSG_BTN_T_GAP) +#define REJECT_W_MSG_BTN_HEIGHT 90 + +#define INCALL_EXTRA_VOL_BTN_L_PAD 620 +#define INCALL_EXTRA_VOL_BTN_WIDTH 84 +#define INCALL_EXTRA_VOL_BTN_T_PAD 178 +#define INCALL_EXTRA_VOL_BTN_HEIGHT 84 + +#define INCALL_HOLD_BTN_L_PAD 622 +#define INCALL_HOLD_BTN_WIDTH 78 +#define INCALL_HOLD_BTN_T_PAD 632 +#define INCALL_HOLD_BTN_HEIGHT 78 + +#define INCALL_HOLD_TXT_L_PAD 452 +#define INCALL_HOLD_TXT_WIDTH 150 +#define INCALL_HOLD_TXT_T_PAD INCALL_HOLD_BTN_T_PAD +#define INCALL_HOLD_TXT_HEIGHT 78 + +#define INCALL_NOISE_ICN_L_PAD 18 +#define INCALL_NOISE_ICN_WIDTH 58 +#define INCALL_NOISE_ICN_T_PAD 644 +#define INCALL_NOISE_ICN_HEIGHT 58 + +#define INCALL_SOUND_EQ_ICN_L_PAD 78 +#define INCALL_SOUND_EQ_ICN_WIDTH 58 +#define INCALL_SOUND_EQ_ICN_T_PAD INCALL_NOISE_ICN_T_PAD +#define INCALL_SOUND_EQ_ICN_HEIGHT 58 + +#define INCALL_SHARE_BG_T_PAD 534 +#define INCALL_SHARE_BG_HEIGHT 654 + +#define KEYPAD_ENTRY_TXT_L_PAD 55 +#define KEYPAD_ENTRY_TXT_WIDTH 610 +#define KEYPAD_ENTRY_TXT_T_PAD 10 +#define KEYPAD_ENTRY_TXT_HEIGHT 114 + +#define KEYPAD_AREA_L_PAD 0 +#define KEYPAD_AREA_WIDTH MAIN_SCREEN_W +#define KEYPAD_AREA_T_PAD 0 +#define KEYPAD_AREA_HEIGHT 718 + +#define KEYPAD_BTNS_BG_L_PAD 35 +#define KEYPAD_BTNS_BG_WIDTH 650 +#define KEYPAD_BTNS_BG_T_PAD 140 +#define KEYPAD_BTNS_BG_HEIGHT 560 + +#define KEYPAD_EACH_BTN_WIDTH 212 +#define KEYPAD_EACH_BTN_HEIGHT 134 + +#define KEYPAD_COL1_BTN_L_PAD 35+5 +#define KEYPAD_COL2_BTN_L_PAD 254 +#define KEYPAD_COL3_BTN_L_PAD 468 + +#define KEYPAD_BTN_TXT_REGION_HEIGHT 112 + +#define KEYPAD_ROW1_BTN_T_PAD 145 +#define KEYPAD_ROW2_BTN_T_PAD 281 +#define KEYPAD_ROW3_BTN_T_PAD 417 +#define KEYPAD_ROW4_BTN_T_PAD 553 + +#define KP_LVERT_SEP1_L_PAD 212 +#define KP_RVERT_SEP1_L_PAD 426 +#define KP_ROW1_VERT_SEP_T_PAD 17 +#define KP_ROW2_VERT_SEP_T_PAD 153 +#define KP_ROW3_VERT_SEP_T_PAD 289 +#define KP_ROW4_VERT_SEP_T_PAD 425 + +#define KP_HORIZ_SEP_L_PAD 14 +#define KP_ROW1_HORIZ_SEP_T_PAD 138 +#define KP_ROW2_HORIZ_SEP_T_PAD 274 +#define KP_ROW3_HORIZ_SEP_T_PAD 410 + +#define KEYPAD_VERT_SEP_WIDTH 1 +#define KEYPAD_VERT_SEP_HEIGHT 108 +#define KEYPAD_HORIZ_SEP_WIDTH 612 +#define KEYPAD_HORIZ_SEP_HEIGHT 1 + +#define RIGHT_ICON_L_PAD 18 +#define RIGHT_ICON_WIDTH 70 +#define RIGHT_ICON_HEIGHT 36 + +#define LEFT_TXT_L_PAD 24 +#define LEFT_TXT_WIDTH 64 +#define RIGHT_TXT_TYPE1_L_PAD 18 +#define RIGHT_TXT_TYPE2_L_PAD 18 + +#define SPLIT_CID1_L_PAD 0 +#define SPLIT_CID1_WIDTH CALLER_INFO_WIDTH +#define SPLIT_CID1_T_PAD 0 +#define SPLIT_CID1_HEIGHT 359 + +#define CALLER_INFO_HOLD_T_PAD (CALLER_INFO_T_PAD+SPLIT_CID1_HEIGHT) + +#define SPLIT_CID2_L_PAD 0 +#define SPLIT_CID2_WIDTH CALLER_INFO_WIDTH +#define SPLIT_CID2_T_PAD CALLER_INFO_HOLD_T_PAD +#define SPLIT_CID2_HEIGHT 359 + +#define SPLIT_PLAY_L_PAD (SPLIT_CID2_L_PAD+12) +#define SPLIT_PLAY_WIDTH 40 +#define SPLIT_PLAY_HEIGHT 40 +#define SPLIT_PLAY_T_PAD (SPLIT_CID2_T_PAD+SPLIT_CID2_HEIGHT-8-SPLIT_PLAY_HEIGHT) + +#define SPLIT_NAME1_L_PAD 38 +#define SPLIT_NAME1_WIDTH 364 +#define SPLIT_NAME1_T_PAD 145 +#define SPLIT_NAME1_HEIGHT 58 + +#define SPLIT_NAME2_L_PAD (SPLIT_NAME1_L_PAD+SPLIT_NAME1_WIDTH+22) +#define SPLIT_NAME2_WIDTH 258 +#define SPLIT_NAME2_T_PAD 217 +#define SPLIT_NAME2_HEIGHT 40 + +#define SPLIT_EXTRA_VOL_T_PAD 600 + +#define SPLIT_TIMER_TXT_T_PAD 499 +#define SPLIT_TIMER_TXT_HEIGHT 46 + +#define SPLIT_MORE_BTN_WIDTH 40 +#define SPLIT_MORE_BTN_L_PAD (SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define SPLIT_ONHOLD_TXT_W_ICON_WIDTH (SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define SPLIT_ONHOLD_TXT_T_PAD 492 +#define SPLIT_ONHOLD_TXT_HEIGHT 40 + +#define SPLIT_SWAP_CID1_L_PAD 70 +#define SPLIT_SWAP_CID1_WIDTH 208 + +#define SPLIT_SWAP_PLAY_L_PAD (SPLIT_SWAP_CID1_L_PAD+12) +#define SPLIT_SWAP_PLAY_WIDTH 40 + +#define SPLIT_SWAP_CID2_L_PAD 336 +#define SPLIT_SWAP_CID2_WIDTH 304 + +#define SPLIT_SWAP_PAUSE_L_PAD (SPLIT_SWAP_CID2_L_PAD+8) +#define SPLIT_SWAP_PAUSE_WIDTH 62 + +#define SPLIT_SWAP_NAME1_L_PAD 38 +#define SPLIT_SWAP_NAME1_WIDTH 258 + +#define SPLIT_SWAP_NAME2_L_PAD (SPLIT_SWAP_NAME1_L_PAD+SPLIT_SWAP_NAME1_WIDTH+22) +#define SPLIT_SWAP_NAME2_WIDTH 364 + +#define SPLIT_SWAP_MORE_BTN_WIDTH 60 +#define SPLIT_SWAP_MORE_BTN_L_PAD (SPLIT_SWAP_CID2_L_PAD+SPLIT_SWAP_CID2_WIDTH-SPLIT_SWAP_MORE_BTN_WIDTH) +#define SPLIT_SWAP_MORE_BTN_T_PAD (SPLIT_TIMER_TXT_T_PAD-7) +#define SPLIT_SWAP_MORE_BTN_HEIGHT 60 +#define SPLIT_TIMER_TXT_W_ICON_WIDTH (SPLIT_SWAP_CID2_WIDTH-SPLIT_SWAP_MORE_BTN_WIDTH) + +#define MULTI_LIST_HEIGHT 1008 + +#define CONF_LIST_T_PAD 0 +#define CONF_LIST_HEIGHT 565 + +#define CONF_HOLD_WIDTH 78 +#define CONF_HOLD_L_PAD (MAIN_SCREEN_W-40-CONF_HOLD_WIDTH) +#define CONF_HOLD_T_PAD 674 +#define CONF_HOLD_HEIGHT 78 + +#define CONF_TIMER_T_PAD 674 +#define CONF_TIMER_HEIGHT 78 + +#define CONF_CALL_BIG_END_L_PAD 16 +#define CONF_CALL_BIG_END_T_PAD 870 +#define CONF_CALL_BIG_END_WIDTH 688 + +#define REJ_MSG_NEW_BTN_L_PAD 40 +#define REJ_MSG_NEW_BTN_WIDTH 640 +#define REJ_MSG_NEW_BTN_T_PAD 120 +#define REJ_MSG_NEW_BTN_HEIGHT 128 + +#define REJ_MSG_LIST_T_PAD 32 +#define REJ_MSG_LIST_HEIGHT 1096 + +#define SIX_BTN_LAYOUT_L_PAD 0 +#define SIX_BTN_LAYOUT_WIDTH MAIN_SCREEN_W +#define SIX_BTN_LAYOUT_T_PAD 718 +#define SIX_BTN_LAYOUT_HEIGHT 502 + +#define THREE_BTN_LAYOUT_WIDTH MAIN_SCREEN_W +#define THREE_BTN_LAYOUT_HEIGHT 222 + +#define BTN_LAYOUT_TOP_BTN_WIDTH 720 +#define BTN_LAYOUT_TOP_BTN_HEIGHT 304 + +#define BTN_LAYOUT_BOTTOM_BTN_WIDTH 144 +#define BTN_LAYOUT_BOTTOM_BTN_HEIGHT 198 + +#define BTN_LAYOUT_BOTTOM_FIRST_BTN_L_PAD 0 +#define BTN_LAYOUT_BOTTOM_SECOND_BTN_L_PAD (BTN_LAYOUT_BOTTOM_FIRST_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BTN_LAYOUT_BOTTOM_THIRD_BTN_L_PAD (BTN_LAYOUT_BOTTOM_SECOND_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BTN_LAYOUT_BOTTOM_FOURTH_BTN_L_PAD (BTN_LAYOUT_BOTTOM_THIRD_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BTN_LAYOUT_BOTTOM_FIFTH_BTN_L_PAD (BTN_LAYOUT_BOTTOM_FOURTH_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) + +#define BTN_LAYOUT_TOP_BTN_T_PAD 0 +#define BTN_LAYOUT_BOTTOM_BTN_T_PAD (BTN_LAYOUT_TOP_BTN_T_PAD+BTN_LAYOUT_TOP_BTN_HEIGHT) + +#define LEFT_VERT_SEP_L_PAD 236 +#define RIGHT_VERT_SEP_L_PAD 478 +#define TOP_VERT_SEP_T_PAD 20 +#define BOTTOM_VERT_SEP_T_PAD 262 +#define HORIZ_SEP_L_PAD 0 +#define TOP_HORIZ_SEP_T_PAD 237 +#define BOTTOM_HORIZ_SEP_T_PAD 338 +#define SEPARTOR_WIDTH 3 +#define VERT_SEP_HEIGHT 198 +#define HORIZ_SEP_WIDTH MAIN_SCREEN_W + +#define ENDCALL_LEFT_VERT_SEP_L_PAD 236 +#define ENDCALL_SEPARTOR_WIDTH 3 +#define ENDCALL_VERT_SEP_T_PAD 20 +#define ENDCALL_VERT_SEP_HEIGHT 198 +#define ENDCALL_RIGHT_VERT_SEP_L_PAD 478 + +#define CALL_BIG_END_L_PAD 40 +#define CALL_BIG_END_WIDTH 640 +#define CALL_BIG_END_T_PAD 1140 +#define CALL_BIG_END_HEIGHT 112 + +#define INCMG_CALL_BTN1_T_PAD 700 +#define INCMG_CALL_BTN_HEIGHT CALL_BIG_END_HEIGHT +#define INCMG_CALL_BTN2_T_PAD 838 +#define INCMG_CALL_BTN3_T_PAD 976 + +#define ENDCALL_VIDEO_BTN_L_PAD 0 +#define ENDCALL_VOICE_BTN_WIDTH 240 +#define ENDCALL_VOICE_BTN_T_PAD (VC_CALLER_ID_LAYOUT_HEIGHT+BTN_LAYOUT_TOP_BTN_HEIGHT) +#define ENDCALL_VOICE_BTN_HEIGHT BTN_LAYOUT_BOTTOM_BTN_HEIGHT +#define ENDCALL_VOICE_BTN_L_PAD (ENDCALL_VIDEO_BTN_L_PAD+ENDCALL_VOICE_BTN_WIDTH) +#define ENDCALL_MSG_BTN_L_PAD (ENDCALL_VOICE_BTN_L_PAD+ENDCALL_VOICE_BTN_WIDTH) + +#define ENDCALL_CONTACT_BTN_L_PAD 10 +#define ENDCALL_CONTACT_BTN_WIDTH 700 +#define ENDCALL_CONTACT_BTN_T_PAD (VC_CALLER_ID_LAYOUT_HEIGHT+164) +#define ENDCALL_CONTACT_BTN_HEIGHT 122 + +#define QP_CID_L_PAD 16 +#define QP_CID_WIDTH 105 +#define QP_CID_T_PAD 33 +#define QP_CID_HEIGHT 105 + +#define QP_MUTE_BTN_L_PAD 172 +#define QP_MUTE_BTN_WIDTH 256 +#define QP_MUTE_BTN_T_PAD 78 +#define QP_MUTE_BTN_HEIGHT 74 + +#define QP_END_BTN_L_PAD 448 +#define QP_END_BTN_WIDTH QP_MUTE_BTN_WIDTH +#define QP_END_BTN_T_PAD QP_MUTE_BTN_T_PAD +#define QP_END_BTN_HEIGHT QP_MUTE_BTN_HEIGHT + +#define QP_NAME_L_PAD QP_MUTE_BTN_L_PAD +#define QP_NAME_WIDTH 532 +#define QP_NAME_T_PAD 22 +#define QP_NAME_HEIGHT 36 + +#define QP_STR_MIN_WIDTH 50 +/* + * End of NBEAT-HD GUI Widget Dimensions + */ + + +/* + * Relative positions + * In Portrait mode + */ +/* Relative X & Y positions of widgets w.r.t. Full Screen */ +#define REL_W(x) ((x)/MAIN_SCREEN_W) +#define REL_H(y) ((y)/MAIN_LAYOUT_H) + +/* Relative X & Y positions of widgets w.r.t. Navi-frame layout */ +/*#define WL_NB_H 94*/ +#define REL_NAVIFRAME_W(x) ((x)/MAIN_NAVIFRAME_W) +#define REL_NAVIFRAME_H(y) ((y)/MAIN_NAVIFRAME_H) + +/* Relative X & Y positions of widgets w.r.t. ACC/REJ ICON layout */ +#define REL_LOCK_W(x) ((x)/483) +#define REL_LOCK_H(y) ((y)/198) +/* Relative X & Y positions of widgets w.r.t. REJ-W-MSG ICON layout */ +#define REL_LOCK_MSG_W(x) ((x)/348) +#define REL_LOCK_MSG_H(y) ((y)/200) + +/* Relative X & Y positions of widgets w.r.t. Keypad layout */ +#define REL_KEYPAD_W(x) ((x)/KEYPAD_AREA_WIDTH) +#define REL_KEYPAD_H(y) ((y)/KEYPAD_AREA_HEIGHT) + +/* Relative X & Y positions of widgets w.r.t. Keypad Buttons layout */ +#define REL_KEYPAD_BTNS_W(x) ((x)/KEYPAD_BTNS_BG_WIDTH) +#define REL_KEYPAD_BTNS_H(y) ((y)/KEYPAD_BTNS_BG_HEIGHT) + +/* Relative X & Y positions of widgets w.r.t. Quick-panel layout */ +#define REL_QP_W(x) ((x)/QP_WIN_W) +#define REL_QP_H(y) ((y)/QP_WIN_H) + +/* Relative X & Y positions of buttons w.r.t. Six-Button layout */ +#define REL_BTN_LY_W(x) ((x)/SIX_BTN_LAYOUT_WIDTH) +#define REL_BTN_LY_H(y) ((y)/SIX_BTN_LAYOUT_HEIGHT) + +/* Relative X & Y positions of buttons w.r.t. Three-Button layout of ENDCALL*/ +#define REL_THREE_BTN_LY_W(x) ((x)/THREE_BTN_LAYOUT_WIDTH) +#define REL_THREE_BTN_LY_H(y) ((y)/THREE_BTN_LAYOUT_HEIGHT) + +/* Relative X position of elements w.r.t. Keypad-Button layout */ +#define REL_KEYPAD_BTN_W(x) ((x)/KEYPAD_EACH_BTN_WIDTH) + +/*Relative Y postions of elements w.r.t. Caller info layout*/ +#define REL_CALLER_INFO_H(y) ((y)/CALLER_INFO_HEIGHT) + +/*Relative Y postions of elements w.r.t. Multi list layout*/ +#define REL_MULTI_LIST_H(y) ((y)/MULTI_LIST_HEIGHT) + +/*Relative X and Y positions of elements w.r.t. SNS-Alerts layout*/ +#define REL_ALERTS_LY_W(x) ((x)/SNS_ALERTS_LAYOUT_WIDTH) +#define REL_ALERTS_LY_H(y) ((y)/SNS_ALERTS_LAYOUT_HEIGHT) +#define REL_ALERTS_EXP_LY_H(y) ((y)/SNS_ALERTS_LAYOUT_EXPANDED_HEIGHT) + +/*Relative X & Y postions of elements w.r.t. Caller ID layout*/ +#define REL_CALLER_ID_W(x) ((x)/VC_CALLER_ID_LAYOUT_WIDTH) +#define REL_CALLER_ID_H(y) ((y)/VC_CALLER_ID_LAYOUT_HEIGHT) + +/*Relative Y postions of elements w.r.t. customised toolbar*/ +#define REL_TOOLBAR_H(y) ((y)/MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT) +/* + * End of Relative positions + */ + + +/* + * MO/Dialing view & MT/Incoming view + * In Portrait mode + */ + +#define DIALLING_CID_L REL_W(CALLER_ID_L_PAD) +#define DIALLING_CID_R REL_W(CALLER_ID_L_PAD+CALLER_ID_WIDTH) +#define DIALLING_CID_T REL_H(CALLER_ID_T_PAD) +#define DIALLING_CID_B REL_H(CALLER_ID_T_PAD+CALLER_ID_HEIGHT) + +#define DIALLING_CID_NOIMAGE_L REL_W(NOIMAGE_L_PAD) +#define DIALLING_CID_NOIMAGE_R REL_W(NOIMAGE_L_PAD+NOIMAGE_WIDTH) +#define DIALLING_CID_NOIMAGE_T REL_H(NOIMAGE_T_PAD) +#define DIALLING_CID_NOIMAGE_B REL_H(NOIMAGE_T_PAD+NOIMAGE_HEIGHT) + +#define DIALLING_BACKGROUND_CID_L REL_W(BACKGROUND_CID_L_PAD) +#define DIALLING_BACKGROUND_CID_R REL_W(BACKGROUND_CID_L_PAD+BACKGROUND_CID_WIDTH) +#define DIALLING_BACKGROUND_CID_T REL_H(BACKGROUND_CID_T_PAD) +#define DIALLING_BACKGROUND_CID_B REL_H(BACKGROUND_CID_T_PAD+BACKGROUND_CID_HEIGHT) + +#define VC_CALLER_ID_LAYOUT_L REL_W(VC_CALLER_ID_LAYOUT_L_PAD) +#define VC_CALLER_ID_LAYOUT_R REL_W(VC_CALLER_ID_LAYOUT_L_PAD+VC_CALLER_ID_LAYOUT_WIDTH) +#define VC_CALLER_ID_LAYOUT_T REL_H(VC_CALLER_ID_LAYOUT_T_PAD) +#define VC_CALLER_ID_LAYOUT_B REL_H(VC_CALLER_ID_LAYOUT_T_PAD+VC_CALLER_ID_LAYOUT_HEIGHT) + +/* accept - MT view */ +#define DIALLING_MT_BTN1_L REL_W(ACCEPT_BTN_L_PAD) +#define DIALLING_MT_BTN1_R REL_W(ACCEPT_BTN_L_PAD+ACCEPT_BTN_WIDTH) +#define DIALLING_MT_BTN1_T REL_H(ACCEPT_BTN_T_PAD) +#define DIALLING_MT_BTN1_B REL_H(ACCEPT_BTN_T_PAD+ACCEPT_BTN_HEIGHT) + +/* reject - MT view */ +#define DIALLING_MT_BTN2_L REL_W(REJECT_BTN_L_PAD) +#define DIALLING_MT_BTN2_R REL_W(REJECT_BTN_L_PAD+REJECT_BTN_WIDTH) +#define DIALLING_MT_BTN2_T REL_H(REJECT_BTN_T_PAD) +#define DIALLING_MT_BTN2_B REL_H(REJECT_BTN_T_PAD+REJECT_BTN_HEIGHT) + +/* reject with msg - MT view */ +#define DIALLING_MT_BTN3_L REL_W(REJECT_W_MSG_BTN_L_PAD) +#define DIALLING_MT_BTN3_R REL_W(REJECT_W_MSG_BTN_L_PAD+REJECT_W_MSG_BTN_WIDTH) +#define DIALLING_MT_BTN3_T REL_H(REJECT_W_MSG_BTN_T_PAD) +#define DIALLING_MT_BTN3_B REL_H(REJECT_W_MSG_BTN_T_PAD+REJECT_W_MSG_BTN_HEIGHT) + +#define DIALLING_MT_SNS_ALERTS_LAYOUT_L REL_W(SNS_ALERTS_LAYOUT_L_PAD) +#define DIALLING_MT_SNS_ALERTS_LAYOUT_R REL_W(SNS_ALERTS_LAYOUT_L_PAD+SNS_ALERTS_LAYOUT_WIDTH) +#define DIALLING_MT_SNS_ALERTS_LAYOUT_T REL_H(SNS_ALERTS_LAYOUT_T_PAD) +#define DIALLING_MT_SNS_ALERTS_LAYOUT_B REL_H(SNS_ALERTS_LAYOUT_T_PAD+SNS_ALERTS_LAYOUT_HEIGHT) + +#define DIALLING_MT_SNS_ALERTS_LAYOUT_EXPANDED_T REL_H(SNS_ALERTS_LAYOUT_EXPANDED_T_PAD) +#define DIALLING_MT_SNS_ALERTS_LAYOUT_EXPANDED_B REL_H(SNS_ALERTS_LAYOUT_EXPANDED_T_PAD+SNS_ALERTS_LAYOUT_EXPANDED_HEIGHT) + +#define DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_T REL_H(SNS_ALERTS_LAYOUT_SHIFT_T_PAD) +#define DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_B REL_H(SNS_ALERTS_LAYOUT_SHIFT_T_PAD+SNS_ALERTS_LAYOUT_HEIGHT) + +#define DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_T REL_H(SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_T_PAD) +#define DIALLING_MT_SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_B REL_H(SNS_ALERTS_LAYOUT_SHIFT_EXPANDED_T_PAD+SNS_ALERTS_LAYOUT_EXPANDED_HEIGHT) +/* + * End of MO/Dialing view & MT/Incoming view + */ + +/* + * MT LOCK View - check + * In Portrait mode + */ +#define INCOMING_LOCK_ACCEPT_BG_L REL_W(-273) +#define INCOMING_LOCK_ACCEPT_BG_R REL_W(210) +#define INCOMING_LOCK_ACCEPT_BG_T REL_H(945) +#define INCOMING_LOCK_ACCEPT_BG_B REL_H(1144) + +#define INCOMING_LOCK_ACCEPT_ICON_L REL_LOCK_W(303) +#define INCOMING_LOCK_ACCEPT_ICON_R REL_LOCK_W(408) +#define INCOMING_LOCK_ACCEPT_ICON_T REL_LOCK_H(37) +#define INCOMING_LOCK_ACCEPT_ICON_B REL_LOCK_H(149) + +#define INCOMING_LOCK_ACCEPT_TEXT_L REL_LOCK_W(45) +#define INCOMING_LOCK_ACCEPT_TEXT_R REL_LOCK_W(273) +#define INCOMING_LOCK_ACCEPT_TEXT_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_ACCEPT_TEXT_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_BG_L REL_W(510) +#define INCOMING_LOCK_REJECT_BG_R REL_W(993) +#define INCOMING_LOCK_REJECT_BG_T INCOMING_LOCK_ACCEPT_BG_T +#define INCOMING_LOCK_REJECT_BG_B INCOMING_LOCK_ACCEPT_BG_B + +#define INCOMING_LOCK_REJECT_ICON_L REL_LOCK_W(75) +#define INCOMING_LOCK_REJECT_ICON_R REL_LOCK_W(180) +#define INCOMING_LOCK_REJECT_ICON_T INCOMING_LOCK_ACCEPT_ICON_T +#define INCOMING_LOCK_REJECT_ICON_B INCOMING_LOCK_ACCEPT_ICON_B + +#define INCOMING_LOCK_REJECT_TEXT_L REL_LOCK_W(195) +#define INCOMING_LOCK_REJECT_TEXT_R REL_LOCK_W(423) +#define INCOMING_LOCK_REJECT_TEXT_T INCOMING_LOCK_REJECT_ICON_T +#define INCOMING_LOCK_REJECT_TEXT_B INCOMING_LOCK_REJECT_ICON_B + +#define INCOMING_LOCK_REJECT_WITH_MSG_BG_L REL_W(186) +#define INCOMING_LOCK_REJECT_WITH_MSG_BG_R REL_W(534) +#define INCOMING_LOCK_REJECT_WITH_MSG_BG_T REL_H(1208) +#define INCOMING_LOCK_REJECT_WITH_MSG_BG_B REL_H(1408) + +#define INCOMING_LOCK_REJECT_WITH_MSG_TEXT_L REL_LOCK_MSG_W(0) +#define INCOMING_LOCK_REJECT_WITH_MSG_TEXT_R REL_LOCK_MSG_W(348) +#define INCOMING_LOCK_REJECT_WITH_MSG_TEXT_T REL_LOCK_MSG_H(0) +#define INCOMING_LOCK_REJECT_WITH_MSG_TEXT_B REL_LOCK_MSG_H(72) + +#define MTLOCK_ACCEPT_INNER_CIRCLE_L REL_W(MTLOCK_ACCEPT_INNER_CIRCLE_BG_L_PAD) +#define MTLOCK_ACCEPT_INNER_CIRCLE_R REL_W(MTLOCK_ACCEPT_INNER_CIRCLE_BG_L_PAD+MTLOCK_ACCEPT_INNER_CIRCLE_BG_WIDTH) +#define MTLOCK_ACCEPT_INNER_CIRCLE_T REL_H(MTLOCK_ACCEPT_INNER_CIRCLE_BG_T_PAD) +#define MTLOCK_ACCEPT_INNER_CIRCLE_B REL_H(MTLOCK_ACCEPT_INNER_CIRCLE_BG_T_PAD+MTLOCK_ACCEPT_INNER_CIRCLE_BG_HEIGHT) + +#define MTLOCK_ACCEPT_ICON_L REL_W(MTLOCK_ACCEPT_ICON_L_PAD) +#define MTLOCK_ACCEPT_ICON_R REL_W(MTLOCK_ACCEPT_ICON_L_PAD+MTLOCK_ACCEPT_ICON_WIDTH) +#define MTLOCK_ACCEPT_ICON_T REL_H(MTLOCK_ACCEPT_ICON_T_PAD) +#define MTLOCK_ACCEPT_ICON_B REL_H(MTLOCK_ACCEPT_ICON_T_PAD+MTLOCK_ACCEPT_ICON_HEIGHT) + +#define MTLOCK_ACCEPT_OUTER_CIRCLE_L REL_W(MTLOCK_ACCEPT_OUTER_CIRCLE_BG_L_PAD) +#define MTLOCK_ACCEPT_OUTER_CIRCLE_R REL_W(MTLOCK_ACCEPT_OUTER_CIRCLE_BG_L_PAD+MTLOCK_ACCEPT_OUTER_CIRCLE_BG_WIDTH) +#define MTLOCK_ACCEPT_OUTER_CIRCLE_T REL_H(MTLOCK_ACCEPT_OUTER_CIRCLE_BG_T_PAD) +#define MTLOCK_ACCEPT_OUTER_CIRCLE_B REL_H(MTLOCK_ACCEPT_OUTER_CIRCLE_BG_T_PAD+MTLOCK_ACCEPT_OUTER_CIRCLE_BG_HEIGHT) + +#define MTLOCK_ACCEPT_ARROW1_L REL_W(MTLOCK_ACCEPT_ARROW1_L_PAD) +#define MTLOCK_ACCEPT_ARROW1_R REL_W(MTLOCK_ACCEPT_ARROW1_L_PAD+MTLOCK_ACCEPT_ARROW1_WIDTH) +#define MTLOCK_ACCEPT_ARROW1_T REL_H(MTLOCK_ACCEPT_ARROW1_T_PAD) +#define MTLOCK_ACCEPT_ARROW1_B REL_H(MTLOCK_ACCEPT_ARROW1_T_PAD+MTLOCK_ACCEPT_ARROW1_HEIGHT) + +#define MTLOCK_ACCEPT_ARROW2_L REL_W(MTLOCK_ACCEPT_ARROW2_L_PAD) +#define MTLOCK_ACCEPT_ARROW2_R REL_W(MTLOCK_ACCEPT_ARROW2_L_PAD+MTLOCK_ACCEPT_ARROW2_WIDTH) +#define MTLOCK_ACCEPT_ARROW2_T REL_H(MTLOCK_ACCEPT_ARROW2_T_PAD) +#define MTLOCK_ACCEPT_ARROW2_B REL_H(MTLOCK_ACCEPT_ARROW2_T_PAD+MTLOCK_ACCEPT_ARROW2_HEIGHT) + +#define MTLOCK_ACCEPT_ARROW3_L REL_W(MTLOCK_ACCEPT_ARROW3_L_PAD) +#define MTLOCK_ACCEPT_ARROW3_R REL_W(MTLOCK_ACCEPT_ARROW3_L_PAD+MTLOCK_ACCEPT_ARROW3_WIDTH) +#define MTLOCK_ACCEPT_ARROW3_T REL_H(MTLOCK_ACCEPT_ARROW3_T_PAD) +#define MTLOCK_ACCEPT_ARROW3_B REL_H(MTLOCK_ACCEPT_ARROW3_T_PAD+MTLOCK_ACCEPT_ARROW3_HEIGHT) + +#define MTLOCK_REJECT_INNER_CIRCLE_L REL_W(MTLOCK_REJECT_INNER_CIRCLE_BG_L_PAD) +#define MTLOCK_REJECT_INNER_CIRCLE_R REL_W(MTLOCK_REJECT_INNER_CIRCLE_BG_L_PAD+MTLOCK_REJECT_INNER_CIRCLE_BG_WIDTH) +#define MTLOCK_REJECT_INNER_CIRCLE_T REL_H(MTLOCK_REJECT_INNER_CIRCLE_BG_T_PAD) +#define MTLOCK_REJECT_INNER_CIRCLE_B REL_H(MTLOCK_REJECT_INNER_CIRCLE_BG_T_PAD+MTLOCK_REJECT_INNER_CIRCLE_BG_HEIGHT) + +#define MTLOCK_REJECT_ICON_L REL_W(MTLOCK_REJECT_ICON_L_PAD) +#define MTLOCK_REJECT_ICON_R REL_W(MTLOCK_REJECT_ICON_L_PAD+MTLOCK_REJECT_ICON_WIDTH) +#define MTLOCK_REJECT_ICON_T REL_H(MTLOCK_REJECT_ICON_T_PAD) +#define MTLOCK_REJECT_ICON_B REL_H(MTLOCK_REJECT_ICON_T_PAD+MTLOCK_REJECT_ICON_HEIGHT) + +#define MTLOCK_REJECT_OUTER_CIRCLE_L REL_W(MTLOCK_REJECT_OUTER_CIRCLE_BG_L_PAD) +#define MTLOCK_REJECT_OUTER_CIRCLE_R REL_W(MTLOCK_REJECT_OUTER_CIRCLE_BG_L_PAD+MTLOCK_REJECT_OUTER_CIRCLE_BG_WIDTH) +#define MTLOCK_REJECT_OUTER_CIRCLE_T REL_H(MTLOCK_REJECT_OUTER_CIRCLE_BG_T_PAD) +#define MTLOCK_REJECT_OUTER_CIRCLE_B REL_H(MTLOCK_REJECT_OUTER_CIRCLE_BG_T_PAD+MTLOCK_REJECT_OUTER_CIRCLE_BG_HEIGHT) + +#define MTLOCK_REJECT_ARROW1_L REL_W(MTLOCK_REJECT_ARROW1_L_PAD) +#define MTLOCK_REJECT_ARROW1_R REL_W(MTLOCK_REJECT_ARROW1_L_PAD+MTLOCK_REJECT_ARROW1_WIDTH) +#define MTLOCK_REJECT_ARROW1_T REL_H(MTLOCK_REJECT_ARROW1_T_PAD) +#define MTLOCK_REJECT_ARROW1_B REL_H(MTLOCK_REJECT_ARROW1_T_PAD+MTLOCK_REJECT_ARROW1_HEIGHT) + +#define MTLOCK_REJECT_ARROW2_L REL_W(MTLOCK_REJECT_ARROW2_L_PAD) +#define MTLOCK_REJECT_ARROW2_R REL_W(MTLOCK_REJECT_ARROW2_L_PAD+MTLOCK_REJECT_ARROW2_WIDTH) +#define MTLOCK_REJECT_ARROW2_T REL_H(MTLOCK_REJECT_ARROW2_T_PAD) +#define MTLOCK_REJECT_ARROW2_B REL_H(MTLOCK_REJECT_ARROW2_T_PAD+MTLOCK_REJECT_ARROW2_HEIGHT) + +#define MTLOCK_REJECT_ARROW3_L REL_W(MTLOCK_REJECT_ARROW3_L_PAD) +#define MTLOCK_REJECT_ARROW3_R REL_W(MTLOCK_REJECT_ARROW3_L_PAD+MTLOCK_REJECT_ARROW3_WIDTH) +#define MTLOCK_REJECT_ARROW3_T REL_H(MTLOCK_REJECT_ARROW3_T_PAD) +#define MTLOCK_REJECT_ARROW3_B REL_H(MTLOCK_REJECT_ARROW3_T_PAD+MTLOCK_REJECT_ARROW3_HEIGHT) + +#define MTLOCK_REJECT_MSG_BG_L REL_W(MTLOCK_REJECT_MSG_BG_L_PAD) +#define MTLOCK_REJECT_MSG_BG_R REL_W(MTLOCK_REJECT_MSG_BG_L_PAD+MTLOCK_REJECT_MSG_BG_WIDTH) +#define MTLOCK_REJECT_MSG_BG_T REL_H(MTLOCK_REJECT_MSG_BG_T_PAD) +#define MTLOCK_REJECT_MSG_BG_B REL_H(MTLOCK_REJECT_MSG_BG_T_PAD+MTLOCK_REJECT_MSG_BG_HEIGHT) + +#define MTLOCK_REJECT_MSG_ARW_L REL_W(MTLOCK_REJECT_MSG_ARW_L_PAD) +#define MTLOCK_REJECT_MSG_ARW_R REL_W(MTLOCK_REJECT_MSG_ARW_L_PAD+MTLOCK_REJECT_MSG_ARW_WIDTH) +#define MTLOCK_REJECT_MSG_ARW_T REL_H(MTLOCK_REJECT_MSG_ARW_T_PAD) +#define MTLOCK_REJECT_MSG_ARW_B REL_H(MTLOCK_REJECT_MSG_ARW_T_PAD+MTLOCK_REJECT_MSG_ARW_HEIGHT) + +#define MTLOCK_REJECT_MSG_TEXT_L REL_W(MTLOCK_REJECT_MSG_TEXT_L_PAD) +#define MTLOCK_REJECT_MSG_TEXT_R REL_W(MTLOCK_REJECT_MSG_TEXT_L_PAD+MTLOCK_REJECT_MSG_TEXT_WIDTH) +#define MTLOCK_REJECT_MSG_TEXT_T REL_H(MTLOCK_REJECT_MSG_TEXT_T_PAD) +#define MTLOCK_REJECT_MSG_TEXT_B REL_H(MTLOCK_REJECT_MSG_TEXT_T_PAD+MTLOCK_REJECT_MSG_TEXT_HEIGHT) + +#define MTLOCK_REJECT_MSG_LIST_L REL_W(MTLOCK_REJECT_MSG_LIST_L_PAD) +#define MTLOCK_REJECT_MSG_LIST_R REL_W(MTLOCK_REJECT_MSG_LIST_L_PAD+MTLOCK_REJECT_MSG_LIST_WIDTH) +#define MTLOCK_REJECT_MSG_LIST_T REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD) +#define MTLOCK_REJECT_MSG_ONE_LINE_LIST_B (REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD)+(MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT/MAIN_SCREEN_H)) +#define MTLOCK_REJECT_MSG_TWO_LINE_LIST_B (REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD)+(MTLOCK_REJECT_MSG_TWO_LINE_LIST_HEIGHT/MAIN_SCREEN_H)) +#define MTLOCK_REJECT_MSG_THREE_LINE_LIST_B (REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD)+(MTLOCK_REJECT_MSG_THREE_LINE_LIST_HEIGHT/MAIN_SCREEN_H)) +#define MTLOCK_REJECT_MSG_FOUR_LINE_LIST_B (REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD)+(MTLOCK_REJECT_MSG_FOUR_LINE_LIST_HEIGHT/MAIN_SCREEN_H)) +#define MTLOCK_REJECT_MSG_FIVE_LINE_LIST_B (REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD)+(MTLOCK_REJECT_MSG_FIVE_LINE_LIST_HEIGHT/MAIN_SCREEN_H)) +#define MTLOCK_REJECT_MSG_SIX_LINE_LIST_B (REL_H(MTLOCK_REJECT_MSG_LIST_T_PAD)+(MTLOCK_REJECT_MSG_SIX_LINE_LIST_HEIGHT/MAIN_SCREEN_H)) + +#define MTLOCK_REJECT_MSG_BACK_BTN_L REL_W(MTLOCK_REJECT_MSG_TOOLBAR_WIDTH-MTLOCK_REJECT_MSG_BACK_BTN_W-15) +#define MTLOCK_REJECT_MSG_BACK_BTN_R REL_W(MTLOCK_REJECT_MSG_TOOLBAR_WIDTH-15) +#define MTLOCK_REJECT_MSG_BACK_BTN_T REL_TOOLBAR_H((MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT-MTLOCK_REJECT_MSG_BACK_BTN_H)/2) +#define MTLOCK_REJECT_MSG_BACK_BTN_B REL_TOOLBAR_H((MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT-MTLOCK_REJECT_MSG_BACK_BTN_H)/2+MTLOCK_REJECT_MSG_BACK_BTN_H) + +#define MTLOCK_REJECT_MSG_CREATE_BTN_L REL_W((MTLOCK_REJECT_MSG_TOOLBAR_WIDTH-MTLOCK_REJECT_MSG_CREATE_BTN_W)/2) +#define MTLOCK_REJECT_MSG_CREATE_BTN_R REL_W((MTLOCK_REJECT_MSG_TOOLBAR_WIDTH-MTLOCK_REJECT_MSG_CREATE_BTN_W)/2+MTLOCK_REJECT_MSG_CREATE_BTN_W) +#define MTLOCK_REJECT_MSG_CREATE_BTN_T REL_TOOLBAR_H((MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT-MTLOCK_REJECT_MSG_CREATE_BTN_H)/2) +#define MTLOCK_REJECT_MSG_CREATE_BTN_B REL_TOOLBAR_H((MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT-MTLOCK_REJECT_MSG_CREATE_BTN_H)/2+MTLOCK_REJECT_MSG_CREATE_BTN_H) +/* + * End of MT LOCK View + */ + + +/* + * KEYPAD View + * In Portrait mode + */ +#define KEYPAD_AREA_L REL_W(KEYPAD_AREA_L_PAD) +#define KEYPAD_AREA_R REL_W(KEYPAD_AREA_WIDTH) +#define KEYPAD_AREA_T REL_H(KEYPAD_AREA_T_PAD) +#define KEYPAD_AREA_B REL_H(KEYPAD_AREA_T_PAD+KEYPAD_AREA_HEIGHT) + +#define KEYPAD_ENTRY_TEXT_L REL_KEYPAD_W(KEYPAD_ENTRY_TXT_L_PAD) +#define KEYPAD_ENTRY_TEXT_R REL_KEYPAD_W(KEYPAD_ENTRY_TXT_L_PAD+KEYPAD_ENTRY_TXT_WIDTH) +#define KEYPAD_ENTRY_TEXT_T REL_KEYPAD_H(KEYPAD_ENTRY_TXT_T_PAD) +#define KEYPAD_ENTRY_TEXT_B REL_KEYPAD_H(KEYPAD_ENTRY_TXT_T_PAD+KEYPAD_ENTRY_TXT_HEIGHT) + +#define KEYPAD_BTNS_BG_L REL_KEYPAD_W(KEYPAD_BTNS_BG_L_PAD) +#define KEYPAD_BTNS_BG_R REL_KEYPAD_W(KEYPAD_BTNS_BG_L_PAD+KEYPAD_BTNS_BG_WIDTH) +#define KEYPAD_BTNS_BG_T REL_KEYPAD_H(KEYPAD_BTNS_BG_T_PAD) +#define KEYPAD_BTNS_BG_B REL_KEYPAD_H(KEYPAD_BTNS_BG_T_PAD+KEYPAD_BTNS_BG_HEIGHT) + +#define KEYPAD_BTN_LEFT_TXT_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD) +#define KEYPAD_BTN_LEFT_TXT_R REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH) +#define KEYPAD_BTN_RIGHT_TXT_TYPE1_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_TXT_TYPE1_L_PAD) +#define KEYPAD_BTN_RIGHT_TXT_TYPE2_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_TXT_TYPE2_L_PAD) +#define KEYPAD_BTN_RIGHT_ICON_L REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_ICON_L_PAD) +#define KEYPAD_BTN_RIGHT_ICON_R REL_KEYPAD_BTN_W(LEFT_TXT_L_PAD+LEFT_TXT_WIDTH+RIGHT_ICON_L_PAD+RIGHT_ICON_WIDTH) + +#define KEYPAD_ROW1_LVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD) +#define KEYPAD_ROW1_LVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW1_LVERT_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW1_VERT_SEP_T_PAD) +#define KEYPAD_ROW1_LVERT_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW1_VERT_SEP_T_PAD+KEYPAD_VERT_SEP_HEIGHT) + +#define KEYPAD_ROW1_LVERT_SEP2_L KEYPAD_ROW1_LVERT_SEP1_R +#define KEYPAD_ROW1_LVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW1_LVERT_SEP2_T KEYPAD_ROW1_LVERT_SEP1_T +#define KEYPAD_ROW1_LVERT_SEP2_B KEYPAD_ROW1_LVERT_SEP1_B + +#define KEYPAD_ROW1_RVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD) +#define KEYPAD_ROW1_RVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW1_RVERT_SEP1_T KEYPAD_ROW1_LVERT_SEP1_T +#define KEYPAD_ROW1_RVERT_SEP1_B KEYPAD_ROW1_LVERT_SEP1_B + +#define KEYPAD_ROW1_RVERT_SEP2_L KEYPAD_ROW1_RVERT_SEP1_R +#define KEYPAD_ROW1_RVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW1_RVERT_SEP2_T KEYPAD_ROW1_LVERT_SEP1_T +#define KEYPAD_ROW1_RVERT_SEP2_B KEYPAD_ROW1_LVERT_SEP1_B + +#define KEYPAD_ROW2_LVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD) +#define KEYPAD_ROW2_LVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW2_LVERT_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW2_VERT_SEP_T_PAD) +#define KEYPAD_ROW2_LVERT_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW2_VERT_SEP_T_PAD+KEYPAD_VERT_SEP_HEIGHT) + +#define KEYPAD_ROW2_LVERT_SEP2_L KEYPAD_ROW2_LVERT_SEP1_R +#define KEYPAD_ROW2_LVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW2_LVERT_SEP2_T KEYPAD_ROW2_LVERT_SEP1_T +#define KEYPAD_ROW2_LVERT_SEP2_B KEYPAD_ROW2_LVERT_SEP1_B + +#define KEYPAD_ROW2_RVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD) +#define KEYPAD_ROW2_RVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW2_RVERT_SEP1_T KEYPAD_ROW2_LVERT_SEP1_T +#define KEYPAD_ROW2_RVERT_SEP1_B KEYPAD_ROW2_LVERT_SEP1_B + +#define KEYPAD_ROW2_RVERT_SEP2_L KEYPAD_ROW2_RVERT_SEP1_R +#define KEYPAD_ROW2_RVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW2_RVERT_SEP2_T KEYPAD_ROW2_LVERT_SEP1_T +#define KEYPAD_ROW2_RVERT_SEP2_B KEYPAD_ROW2_LVERT_SEP1_B + +#define KEYPAD_ROW3_LVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD) +#define KEYPAD_ROW3_LVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW3_LVERT_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW3_VERT_SEP_T_PAD) +#define KEYPAD_ROW3_LVERT_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW3_VERT_SEP_T_PAD+KEYPAD_VERT_SEP_HEIGHT) + +#define KEYPAD_ROW3_LVERT_SEP2_L KEYPAD_ROW3_LVERT_SEP1_R +#define KEYPAD_ROW3_LVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW3_LVERT_SEP2_T KEYPAD_ROW3_LVERT_SEP1_T +#define KEYPAD_ROW3_LVERT_SEP2_B KEYPAD_ROW3_LVERT_SEP1_B + +#define KEYPAD_ROW3_RVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD) +#define KEYPAD_ROW3_RVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW3_RVERT_SEP1_T KEYPAD_ROW3_LVERT_SEP1_T +#define KEYPAD_ROW3_RVERT_SEP1_B KEYPAD_ROW3_LVERT_SEP1_B + +#define KEYPAD_ROW3_RVERT_SEP2_L KEYPAD_ROW3_RVERT_SEP1_R +#define KEYPAD_ROW3_RVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW3_RVERT_SEP2_T KEYPAD_ROW3_LVERT_SEP1_T +#define KEYPAD_ROW3_RVERT_SEP2_B KEYPAD_ROW3_LVERT_SEP1_B + +#define KEYPAD_ROW4_LVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD) +#define KEYPAD_ROW4_LVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW4_LVERT_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW4_VERT_SEP_T_PAD) +#define KEYPAD_ROW4_LVERT_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW4_VERT_SEP_T_PAD+KEYPAD_VERT_SEP_HEIGHT) + +#define KEYPAD_ROW4_LVERT_SEP2_L KEYPAD_ROW4_LVERT_SEP1_R +#define KEYPAD_ROW4_LVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_LVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW4_LVERT_SEP2_T KEYPAD_ROW4_LVERT_SEP1_T +#define KEYPAD_ROW4_LVERT_SEP2_B KEYPAD_ROW4_LVERT_SEP1_B + +#define KEYPAD_ROW4_RVERT_SEP1_L REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD) +#define KEYPAD_ROW4_RVERT_SEP1_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW4_RVERT_SEP1_T KEYPAD_ROW4_LVERT_SEP1_T +#define KEYPAD_ROW4_RVERT_SEP1_B KEYPAD_ROW4_LVERT_SEP1_B + +#define KEYPAD_ROW4_RVERT_SEP2_L KEYPAD_ROW4_RVERT_SEP1_R +#define KEYPAD_ROW4_RVERT_SEP2_R REL_KEYPAD_BTNS_W(KP_RVERT_SEP1_L_PAD+2*KEYPAD_VERT_SEP_WIDTH) +#define KEYPAD_ROW4_RVERT_SEP2_T KEYPAD_ROW4_LVERT_SEP1_T +#define KEYPAD_ROW4_RVERT_SEP2_B KEYPAD_ROW4_LVERT_SEP1_B + +#define KEYPAD_ROW1_HORIZ_SEP1_L REL_KEYPAD_BTNS_W(KP_HORIZ_SEP_L_PAD) +#define KEYPAD_ROW1_HORIZ_SEP1_R REL_KEYPAD_BTNS_W(KP_HORIZ_SEP_L_PAD+KEYPAD_HORIZ_SEP_WIDTH) +#define KEYPAD_ROW1_HORIZ_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW1_HORIZ_SEP_T_PAD) +#define KEYPAD_ROW1_HORIZ_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW1_HORIZ_SEP_T_PAD+KEYPAD_HORIZ_SEP_HEIGHT) + +#define KEYPAD_ROW1_HORIZ_SEP2_L KEYPAD_ROW1_HORIZ_SEP1_L +#define KEYPAD_ROW1_HORIZ_SEP2_R KEYPAD_ROW1_HORIZ_SEP1_R +#define KEYPAD_ROW1_HORIZ_SEP2_T KEYPAD_ROW1_HORIZ_SEP1_B +#define KEYPAD_ROW1_HORIZ_SEP2_B REL_KEYPAD_BTNS_H(KP_ROW1_HORIZ_SEP_T_PAD+2*KEYPAD_HORIZ_SEP_HEIGHT) + +#define KEYPAD_ROW2_HORIZ_SEP1_L KEYPAD_ROW1_HORIZ_SEP1_L +#define KEYPAD_ROW2_HORIZ_SEP1_R KEYPAD_ROW1_HORIZ_SEP1_R +#define KEYPAD_ROW2_HORIZ_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW2_HORIZ_SEP_T_PAD) +#define KEYPAD_ROW2_HORIZ_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW2_HORIZ_SEP_T_PAD+KEYPAD_HORIZ_SEP_HEIGHT) + +#define KEYPAD_ROW2_HORIZ_SEP2_L KEYPAD_ROW1_HORIZ_SEP1_L +#define KEYPAD_ROW2_HORIZ_SEP2_R KEYPAD_ROW1_HORIZ_SEP1_R +#define KEYPAD_ROW2_HORIZ_SEP2_T KEYPAD_ROW2_HORIZ_SEP1_B +#define KEYPAD_ROW2_HORIZ_SEP2_B REL_KEYPAD_BTNS_H(KP_ROW2_HORIZ_SEP_T_PAD+2*KEYPAD_HORIZ_SEP_HEIGHT) + +#define KEYPAD_ROW3_HORIZ_SEP1_L KEYPAD_ROW1_HORIZ_SEP1_L +#define KEYPAD_ROW3_HORIZ_SEP1_R KEYPAD_ROW1_HORIZ_SEP1_R +#define KEYPAD_ROW3_HORIZ_SEP1_T REL_KEYPAD_BTNS_H(KP_ROW3_HORIZ_SEP_T_PAD) +#define KEYPAD_ROW3_HORIZ_SEP1_B REL_KEYPAD_BTNS_H(KP_ROW3_HORIZ_SEP_T_PAD+KEYPAD_HORIZ_SEP_HEIGHT) + +#define KEYPAD_ROW3_HORIZ_SEP2_L KEYPAD_ROW1_HORIZ_SEP1_L +#define KEYPAD_ROW3_HORIZ_SEP2_R KEYPAD_ROW1_HORIZ_SEP1_R +#define KEYPAD_ROW3_HORIZ_SEP2_T KEYPAD_ROW3_HORIZ_SEP1_B +#define KEYPAD_ROW3_HORIZ_SEP2_B REL_KEYPAD_BTNS_H(KP_ROW3_HORIZ_SEP_T_PAD+2*KEYPAD_HORIZ_SEP_HEIGHT) +/* + * End of KEYPAD View + */ + + +/* + * INCALL View + * In Portrait mode + */ +#define INCALL_BACKGROUND_CID_L REL_W(0) +#define INCALL_BACKGROUND_CID_R REL_W(MAIN_SCREEN_W) +#define INCALL_BACKGROUND_CID_T REL_H(0) +#define INCALL_BACKGROUND_CID_B REL_H(VC_CALLER_ID_LAYOUT_HEIGHT) + +#define INCALL_CID_L REL_W(VC_CALLER_ID_THUMB_BG_L_PAD) +#define INCALL_CID_R REL_W(VC_CALLER_ID_THUMB_BG_L_PAD+VC_CALLER_ID_THUMB_BG_WIDTH) +#define INCALL_CID_T REL_H(VC_CALLER_ID_THUMB_BG_T_PAD) +#define INCALL_CID_B REL_H(VC_CALLER_ID_THUMB_BG_T_PAD+VC_CALLER_ID_THUMB_BG_HEIGHT) + +#define INCALL_EXTRA_VOL_ICON_L REL_W(INCALL_EXTRA_VOL_BTN_L_PAD) +#define INCALL_EXTRA_VOL_ICON_R REL_W(INCALL_EXTRA_VOL_BTN_L_PAD+INCALL_EXTRA_VOL_BTN_WIDTH) +#define INCALL_EXTRA_VOL_ICON_T REL_H(INCALL_EXTRA_VOL_BTN_T_PAD) +#define INCALL_EXTRA_VOL_ICON_B REL_H(INCALL_EXTRA_VOL_BTN_T_PAD+INCALL_EXTRA_VOL_BTN_HEIGHT) + +#define INCALL_HOLD_L REL_W(INCALL_HOLD_BTN_L_PAD) +#define INCALL_HOLD_R REL_W(INCALL_HOLD_BTN_L_PAD+INCALL_HOLD_BTN_WIDTH) +#define INCALL_HOLD_T REL_H(INCALL_HOLD_BTN_T_PAD) +#define INCALL_HOLD_B REL_H(INCALL_HOLD_BTN_T_PAD+INCALL_HOLD_BTN_HEIGHT) + +#define INCALL_HOLD_TXT_L REL_W(INCALL_HOLD_TXT_L_PAD) +#define INCALL_HOLD_TXT_R REL_W(INCALL_HOLD_TXT_L_PAD+INCALL_HOLD_TXT_WIDTH) +#define INCALL_HOLD_TXT_T REL_H(INCALL_HOLD_TXT_T_PAD) +#define INCALL_HOLD_TXT_B REL_H(INCALL_HOLD_TXT_T_PAD+INCALL_HOLD_TXT_HEIGHT) + +#define INCALL_NOISE_ICON_L REL_W(INCALL_NOISE_ICN_L_PAD) +#define INCALL_NOISE_ICON_R REL_W(INCALL_NOISE_ICN_L_PAD+INCALL_NOISE_ICN_WIDTH) +#define INCALL_NOISE_ICON_T REL_H(INCALL_NOISE_ICN_T_PAD) +#define INCALL_NOISE_ICON_B REL_H(INCALL_NOISE_ICN_T_PAD+INCALL_NOISE_ICN_HEIGHT) + +#define INCALL_SOUND_EQ_ICON_L REL_W(INCALL_SOUND_EQ_ICN_L_PAD) +#define INCALL_SOUND_EQ_ICON_R REL_W(INCALL_SOUND_EQ_ICN_L_PAD+INCALL_SOUND_EQ_ICN_WIDTH) +#define INCALL_SOUND_EQ_ICON_T REL_H(INCALL_SOUND_EQ_ICN_T_PAD) +#define INCALL_SOUND_EQ_ICON_B REL_H(INCALL_SOUND_EQ_ICN_T_PAD+INCALL_SOUND_EQ_ICN_HEIGHT) + +#define INCALL_BACKGROUND_SHARE_L REL_W(0) +#define INCALL_BACKGROUND_SHARE_R REL_W(MAIN_SCREEN_W) +#define INCALL_BACKGROUND_SHARE_T REL_H(INCALL_SHARE_BG_T_PAD) +#define INCALL_BACKGROUND_SHARE_B REL_H(INCALL_SHARE_BG_T_PAD+INCALL_SHARE_BG_HEIGHT) +/* + * End of INCALL View + */ + + +/* + * MULTI-CALL SPLIT View + * In Portrait mode + */ +/* L[ACT] + R[HLD] */ +#define MULTICALL_SPLIT_BACKGROUND_CID_L INCALL_BACKGROUND_CID_L +#define MULTICALL_SPLIT_BACKGROUND_CID_R INCALL_BACKGROUND_CID_R +#define MULTICALL_SPLIT_BACKGROUND_CID_T INCALL_BACKGROUND_CID_T +#define MULTICALL_SPLIT_BACKGROUND_CID_B INCALL_BACKGROUND_CID_B + +#define MULTICALL_SPLIT_CID_1_L REL_W(SPLIT_CID1_L_PAD) +#define MULTICALL_SPLIT_CID_1_R REL_W(SPLIT_CID1_L_PAD+SPLIT_CID1_WIDTH) +#define MULTICALL_SPLIT_CID_1_T REL_H(SPLIT_CID1_T_PAD) +#define MULTICALL_SPLIT_CID_1_B REL_H(SPLIT_CID1_T_PAD+SPLIT_CID1_HEIGHT) + +#define MULTICALL_SPLIT_CID_2_L REL_W(SPLIT_CID2_L_PAD) +#define MULTICALL_SPLIT_CID_2_R REL_W(SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH) +#define MULTICALL_SPLIT_CID_2_T REL_H(SPLIT_CID2_T_PAD) +#define MULTICALL_SPLIT_CID_2_B REL_H(SPLIT_CID2_T_PAD+SPLIT_CID2_HEIGHT) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_L MULTICALL_SPLIT_CID_2_L +#define MULTICALL_SPLIT_ON_HOLD_TXT_R MULTICALL_SPLIT_CID_2_R +#define MULTICALL_SPLIT_ON_HOLD_TXT_T REL_H(SPLIT_ONHOLD_TXT_T_PAD) +#define MULTICALL_SPLIT_ON_HOLD_TXT_B REL_H(SPLIT_ONHOLD_TXT_T_PAD+SPLIT_ONHOLD_TXT_HEIGHT) + +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_L MULTICALL_SPLIT_CID_2_L +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_R REL_W(SPLIT_CID2_L_PAD+SPLIT_CID2_WIDTH-SPLIT_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_T MULTICALL_SPLIT_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_ON_HOLD_TXT_WITH_ICON_B MULTICALL_SPLIT_ON_HOLD_TXT_B + +/* + * End of MULTI-CALL SPLIT View + */ + +/* + * MULTI-CALL LIST View + * In Portrait mode + */ +#define MULTICALL_LIST_L REL_W(0) +#define MULTICALL_LIST_R REL_W(MAIN_SCREEN_W) +#define MULTICALL_LIST_T REL_MULTI_LIST_H(CONF_LIST_T_PAD) +#define MULTICALL_LIST_B REL_MULTI_LIST_H(CONF_LIST_T_PAD+CONF_LIST_HEIGHT) + +#define MULTICALL_LIST_HOLD_L REL_W(CONF_HOLD_L_PAD) +#define MULTICALL_LIST_HOLD_R REL_W(CONF_HOLD_L_PAD+CONF_HOLD_WIDTH) +#define MULTICALL_LIST_HOLD_T REL_MULTI_LIST_H(CONF_HOLD_T_PAD) +#define MULTICALL_LIST_HOLD_B REL_MULTI_LIST_H(CONF_HOLD_T_PAD+CONF_HOLD_HEIGHT) + +#define MULTICALL_LIST_TIMER_L REL_W(0) +#define MULTICALL_LIST_TIMER_R REL_W(MAIN_SCREEN_W) +#define MULTICALL_LIST_TIMER_T REL_MULTI_LIST_H(CONF_TIMER_T_PAD) +#define MULTICALL_LIST_TIMER_B REL_MULTI_LIST_H(CONF_TIMER_T_PAD+CONF_TIMER_HEIGHT) + +#define MULTICALL_LIST_BIG_END_L REL_W(CONF_CALL_BIG_END_L_PAD) +#define MULTICALL_LIST_BIG_END_R REL_W(CONF_CALL_BIG_END_L_PAD+CONF_CALL_BIG_END_WIDTH) +#define MULTICALL_LIST_BIG_END_T REL_MULTI_LIST_H(CONF_CALL_BIG_END_T_PAD) +#define MULTICALL_LIST_BIG_END_B REL_MULTI_LIST_H(CONF_CALL_BIG_END_T_PAD+CALL_BIG_END_HEIGHT) +/* + * End of MULTI-CALL LIST View + */ + + +/* + * Reject with MSG View + * In Portrait mode + */ +#define REJECT_W_MSG_CREATE_NEW_L REL_W(REJ_MSG_NEW_BTN_L_PAD) +#define REJECT_W_MSG_CREATE_NEW_R REL_W(REJ_MSG_NEW_BTN_L_PAD+REJ_MSG_NEW_BTN_WIDTH) +#define REJECT_W_MSG_CREATE_NEW_T REL_H(REJ_MSG_NEW_BTN_T_PAD) +#define REJECT_W_MSG_CREATE_NEW_B REL_H(REJ_MSG_NEW_BTN_T_PAD+REJ_MSG_NEW_BTN_HEIGHT) + +#define REJECT_W_MSG_LIST_L REL_NAVIFRAME_W(0) +#define REJECT_W_MSG_LIST_R REL_NAVIFRAME_W(MAIN_SCREEN_W) +#define REJECT_W_MSG_LIST_T REL_NAVIFRAME_H(REJ_MSG_LIST_T_PAD) +#define REJECT_W_MSG_LIST_B REL_NAVIFRAME_H(REJ_MSG_LIST_T_PAD+REJ_MSG_LIST_HEIGHT) +/* + * End of Reject with MSG View + */ + + +/* + * SIX BUTTON Layout + * In Portrait mode + */ + +#define TOP_BUTTON_L REL_BTN_LY_W(0) +#define TOP_BUTTON_R REL_BTN_LY_W(BTN_LAYOUT_TOP_BTN_WIDTH) +#define TOP_BUTTON_T REL_BTN_LY_H(BTN_LAYOUT_TOP_BTN_T_PAD) +#define TOP_BUTTON_B REL_BTN_LY_H(BTN_LAYOUT_TOP_BTN_T_PAD+BTN_LAYOUT_TOP_BTN_HEIGHT) + +#define BOTTOM_FIRST_BUTTON_L REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_FIRST_BTN_L_PAD) +#define BOTTOM_FIRST_BUTTON_R REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_FIRST_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BOTTOM_FIRST_BUTTON_T REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD) +#define BOTTOM_FIRST_BUTTON_B REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD+BTN_LAYOUT_BOTTOM_BTN_HEIGHT) + +#define BOTTOM_SECOND_BUTTON_L REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_SECOND_BTN_L_PAD) +#define BOTTOM_SECOND_BUTTON_R REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_SECOND_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BOTTOM_SECOND_BUTTON_T REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD) +#define BOTTOM_SECOND_BUTTON_B REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD+BTN_LAYOUT_BOTTOM_BTN_HEIGHT) + +#define BOTTOM_THIRD_BUTTON_L REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_THIRD_BTN_L_PAD) +#define BOTTOM_THIRD_BUTTON_R REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_THIRD_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BOTTOM_THIRD_BUTTON_T REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD) +#define BOTTOM_THIRD_BUTTON_B REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD+BTN_LAYOUT_BOTTOM_BTN_HEIGHT) + +#define BOTTOM_FOURTH_BUTTON_L REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_FOURTH_BTN_L_PAD) +#define BOTTOM_FOURTH_BUTTON_R REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_FOURTH_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BOTTOM_FOURTH_BUTTON_T REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD) +#define BOTTOM_FOURTH_BUTTON_B REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD+BTN_LAYOUT_BOTTOM_BTN_HEIGHT) + +#define BOTTOM_FIFTH_BUTTON_L REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_FIFTH_BTN_L_PAD) +#define BOTTOM_FIFTH_BUTTON_R REL_BTN_LY_W(BTN_LAYOUT_BOTTOM_FIFTH_BTN_L_PAD+BTN_LAYOUT_BOTTOM_BTN_WIDTH) +#define BOTTOM_FIFTH_BUTTON_T REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD) +#define BOTTOM_FIFTH_BUTTON_B REL_BTN_LY_H(BTN_LAYOUT_BOTTOM_BTN_T_PAD+BTN_LAYOUT_BOTTOM_BTN_HEIGHT) + +#define TOPLINE_LEFT_VERT_SEP_1_L REL_BTN_LY_W(LEFT_VERT_SEP_L_PAD) +#define TOPLINE_LEFT_VERT_SEP_1_R REL_BTN_LY_W(LEFT_VERT_SEP_L_PAD+SEPARTOR_WIDTH) +#define TOPLINE_LEFT_VERT_SEP_1_T REL_BTN_LY_H(TOP_VERT_SEP_T_PAD) +#define TOPLINE_LEFT_VERT_SEP_1_B REL_BTN_LY_H(TOP_VERT_SEP_T_PAD+VERT_SEP_HEIGHT) + +#define TOPLINE_LEFT_VERT_SEP_2_L TOPLINE_LEFT_VERT_SEP_1_R +#define TOPLINE_LEFT_VERT_SEP_2_R REL_BTN_LY_W(LEFT_VERT_SEP_L_PAD+2*SEPARTOR_WIDTH) +#define TOPLINE_LEFT_VERT_SEP_2_T TOPLINE_LEFT_VERT_SEP_1_T +#define TOPLINE_LEFT_VERT_SEP_2_B TOPLINE_LEFT_VERT_SEP_1_B + +#define TOPLINE_RIGHT_VERT_SEP_1_L REL_BTN_LY_W(RIGHT_VERT_SEP_L_PAD) +#define TOPLINE_RIGHT_VERT_SEP_1_R REL_BTN_LY_W(RIGHT_VERT_SEP_L_PAD+SEPARTOR_WIDTH) +#define TOPLINE_RIGHT_VERT_SEP_1_T TOPLINE_LEFT_VERT_SEP_1_T +#define TOPLINE_RIGHT_VERT_SEP_1_B TOPLINE_LEFT_VERT_SEP_1_B + +#define TOPLINE_RIGHT_VERT_SEP_2_L TOPLINE_RIGHT_VERT_SEP_1_R +#define TOPLINE_RIGHT_VERT_SEP_2_R REL_BTN_LY_W(RIGHT_VERT_SEP_L_PAD+2*SEPARTOR_WIDTH) +#define TOPLINE_RIGHT_VERT_SEP_2_T TOPLINE_RIGHT_VERT_SEP_1_T +#define TOPLINE_RIGHT_VERT_SEP_2_B TOPLINE_RIGHT_VERT_SEP_1_B + +#define BOTLINE_LEFT_VERT_SEP_1_L TOPLINE_LEFT_VERT_SEP_1_L +#define BOTLINE_LEFT_VERT_SEP_1_R TOPLINE_LEFT_VERT_SEP_1_R +#define BOTLINE_LEFT_VERT_SEP_1_T REL_BTN_LY_H(BOTTOM_VERT_SEP_T_PAD) +#define BOTLINE_LEFT_VERT_SEP_1_B REL_BTN_LY_H(BOTTOM_VERT_SEP_T_PAD+VERT_SEP_HEIGHT) + +#define BOTLINE_LEFT_VERT_SEP_2_L TOPLINE_LEFT_VERT_SEP_2_L +#define BOTLINE_LEFT_VERT_SEP_2_R TOPLINE_LEFT_VERT_SEP_2_R +#define BOTLINE_LEFT_VERT_SEP_2_T BOTLINE_LEFT_VERT_SEP_1_T +#define BOTLINE_LEFT_VERT_SEP_2_B BOTLINE_LEFT_VERT_SEP_1_B + +#define BOTLINE_RIGHT_VERT_SEP_1_L TOPLINE_RIGHT_VERT_SEP_1_L +#define BOTLINE_RIGHT_VERT_SEP_1_R TOPLINE_RIGHT_VERT_SEP_1_R +#define BOTLINE_RIGHT_VERT_SEP_1_T BOTLINE_LEFT_VERT_SEP_1_T +#define BOTLINE_RIGHT_VERT_SEP_1_B BOTLINE_LEFT_VERT_SEP_1_B + +#define BOTLINE_RIGHT_VERT_SEP_2_L BOTLINE_RIGHT_VERT_SEP_1_R +#define BOTLINE_RIGHT_VERT_SEP_2_R TOPLINE_RIGHT_VERT_SEP_2_R +#define BOTLINE_RIGHT_VERT_SEP_2_T BOTLINE_LEFT_VERT_SEP_1_T +#define BOTLINE_RIGHT_VERT_SEP_2_B BOTLINE_LEFT_VERT_SEP_1_B + +#define TOPLINE_HORIZ_SEP_1_L REL_BTN_LY_W(HORIZ_SEP_L_PAD) +#define TOPLINE_HORIZ_SEP_1_R REL_BTN_LY_W(HORIZ_SEP_L_PAD+HORIZ_SEP_WIDTH) +#define TOPLINE_HORIZ_SEP_1_T REL_BTN_LY_H(TOP_HORIZ_SEP_T_PAD) +#define TOPLINE_HORIZ_SEP_1_B REL_BTN_LY_H(TOP_HORIZ_SEP_T_PAD+SEPARTOR_WIDTH) + +#define TOPLINE_HORIZ_SEP_2_L TOPLINE_HORIZ_SEP_1_L +#define TOPLINE_HORIZ_SEP_2_R TOPLINE_HORIZ_SEP_1_R +#define TOPLINE_HORIZ_SEP_2_T TOPLINE_HORIZ_SEP_1_B +#define TOPLINE_HORIZ_SEP_2_B REL_BTN_LY_H(TOP_HORIZ_SEP_T_PAD+2*SEPARTOR_WIDTH) +/* + * End of SIX Button Layout + */ + +/* + * THREE BUTTON Layout for ENDCALL + * In Portrait mode + */ +#define ENDCALL_LEFT_VERT_SEP_1_L REL_THREE_BTN_LY_W(ENDCALL_LEFT_VERT_SEP_L_PAD) +#define ENDCALL_LEFT_VERT_SEP_1_R REL_THREE_BTN_LY_W(ENDCALL_LEFT_VERT_SEP_L_PAD+ENDCALL_SEPARTOR_WIDTH) +#define ENDCALL_LEFT_VERT_SEP_1_T REL_THREE_BTN_LY_H(ENDCALL_VERT_SEP_T_PAD) +#define ENDCALL_LEFT_VERT_SEP_1_B REL_THREE_BTN_LY_H(ENDCALL_VERT_SEP_T_PAD+ENDCALL_VERT_SEP_HEIGHT) + +#define ENDCALL_LEFT_VERT_SEP_2_L ENDCALL_LEFT_VERT_SEP_1_R +#define ENDCALL_LEFT_VERT_SEP_2_R REL_THREE_BTN_LY_W(ENDCALL_LEFT_VERT_SEP_L_PAD+2*ENDCALL_SEPARTOR_WIDTH) +#define ENDCALL_LEFT_VERT_SEP_2_T ENDCALL_LEFT_VERT_SEP_1_T +#define ENDCALL_LEFT_VERT_SEP_2_B ENDCALL_LEFT_VERT_SEP_1_B + +#define ENDCALL_RIGHT_VERT_SEP_1_L REL_THREE_BTN_LY_W(ENDCALL_RIGHT_VERT_SEP_L_PAD) +#define ENDCALL_RIGHT_VERT_SEP_1_R REL_THREE_BTN_LY_W(ENDCALL_RIGHT_VERT_SEP_L_PAD+ENDCALL_SEPARTOR_WIDTH) +#define ENDCALL_RIGHT_VERT_SEP_1_T ENDCALL_LEFT_VERT_SEP_1_T +#define ENDCALL_RIGHT_VERT_SEP_1_B ENDCALL_LEFT_VERT_SEP_1_B + +#define ENDCALL_RIGHT_VERT_SEP_2_L ENDCALL_RIGHT_VERT_SEP_1_R +#define ENDCALL_RIGHT_VERT_SEP_2_R REL_THREE_BTN_LY_W(ENDCALL_RIGHT_VERT_SEP_L_PAD+2*ENDCALL_SEPARTOR_WIDTH) +#define ENDCALL_RIGHT_VERT_SEP_2_T ENDCALL_LEFT_VERT_SEP_1_T +#define ENDCALL_RIGHT_VERT_SEP_2_B ENDCALL_LEFT_VERT_SEP_1_B +/* + * End of THREE Button Layout + */ + +/* + * General Button Layout + */ +#define SIX_BTN_LAYOUT_L REL_W(SIX_BTN_LAYOUT_L_PAD) +#define SIX_BTN_LAYOUT_R REL_W(SIX_BTN_LAYOUT_L_PAD+SIX_BTN_LAYOUT_WIDTH) +#define SIX_BTN_LAYOUT_T REL_H(SIX_BTN_LAYOUT_T_PAD) +#define SIX_BTN_LAYOUT_B REL_H(SIX_BTN_LAYOUT_T_PAD+SIX_BTN_LAYOUT_HEIGHT) + +#define SIX_BTN_BIG_END_L REL_W(CALL_BIG_END_L_PAD) +#define SIX_BTN_BIG_END_R REL_W(CALL_BIG_END_L_PAD+CALL_BIG_END_WIDTH) +#define SIX_BTN_BIG_END_T REL_H(CALL_BIG_END_T_PAD) +#define SIX_BTN_BIG_END_B REL_H(CALL_BIG_END_T_PAD+CALL_BIG_END_HEIGHT) + +#define SIX_BTN_INCOMING_1_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_1_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_1_T REL_H(INCMG_CALL_BTN1_T_PAD) +#define SIX_BTN_INCOMING_1_B REL_H(INCMG_CALL_BTN1_T_PAD+INCMG_CALL_BTN_HEIGHT) + +#define SIX_BTN_INCOMING_2_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_2_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_2_T REL_H(INCMG_CALL_BTN2_T_PAD) +#define SIX_BTN_INCOMING_2_B REL_H(INCMG_CALL_BTN2_T_PAD+INCMG_CALL_BTN_HEIGHT) + +#define SIX_BTN_INCOMING_3_L SIX_BTN_BIG_END_L +#define SIX_BTN_INCOMING_3_R SIX_BTN_BIG_END_R +#define SIX_BTN_INCOMING_3_T REL_H(INCMG_CALL_BTN3_T_PAD) +#define SIX_BTN_INCOMING_3_B REL_H(INCMG_CALL_BTN3_T_PAD+INCMG_CALL_BTN_HEIGHT) +/* + * End of SIX Button Layout + */ + + +/* + * Navigation bar layout + */ +#define CALL_NAVIGATION_BAR_T REL_H(NAVIFRAME_T_PAD) +#define CALL_NAVIGATION_BAR_B REL_H(MAIN_LAYOUT_H) +#define CALL_NAVIGATION_BAR_L REL_W(0) +#define CALL_NAVIGATION_BAR_R REL_W(MAIN_SCREEN_W) +/* + * End of Navigation bar layout + */ + + +/* + * END CALL View + * In Portrait mode + */ +#define ENDSINGLECALL_BTN_BG_L REL_W(ENDCALL_BTN_BG_L_PAD) +#define ENDSINGLECALL_BTN_BG_R REL_W(ENDCALL_BTN_BG_L_PAD+ENDCALL_BTN_BG_WIDTH) +#define ENDSINGLECALL_BTN_BG_T REL_H(ENDCALL_BTN_BG_T_PAD) +#define ENDSINGLECALL_BTN_BG_B REL_H(ENDCALL_BTN_BG_T_PAD+ENDCALL_BTN_BG_HEIGHT) + +#define ENDSINGLECALL_VIDEO_BTN_L REL_W(ENDCALL_VIDEO_BTN_L_PAD) +#define ENDSINGLECALL_VIDEO_BTN_R REL_W(ENDCALL_VIDEO_BTN_L_PAD+ENDCALL_VOICE_BTN_WIDTH) +#define ENDSINGLECALL_VIDEO_BTN_T REL_H(ENDCALL_VOICE_BTN_T_PAD) +#define ENDSINGLECALL_VIDEO_BTN_B REL_H(ENDCALL_VOICE_BTN_T_PAD+ENDCALL_VOICE_BTN_HEIGHT) + +#define ENDSINGLECALL_VOICE_BTN_L REL_W(ENDCALL_VOICE_BTN_L_PAD) +#define ENDSINGLECALL_VOICE_BTN_R REL_W(ENDCALL_VOICE_BTN_L_PAD+ENDCALL_VOICE_BTN_WIDTH) +#define ENDSINGLECALL_VOICE_BTN_T ENDSINGLECALL_VIDEO_BTN_T +#define ENDSINGLECALL_VOICE_BTN_B ENDSINGLECALL_VIDEO_BTN_B + +#define ENDSINGLECALL_MSG_BTN_L REL_W(ENDCALL_MSG_BTN_L_PAD) +#define ENDSINGLECALL_MSG_BTN_R REL_W(ENDCALL_MSG_BTN_L_PAD+ENDCALL_VOICE_BTN_WIDTH) +#define ENDSINGLECALL_MSG_BTN_T ENDSINGLECALL_VIDEO_BTN_T +#define ENDSINGLECALL_MSG_BTN_B ENDSINGLECALL_VIDEO_BTN_B + +#define ENDSINGLECALL_CONTACT_BTN_L REL_W(ENDCALL_CONTACT_BTN_L_PAD) +#define ENDSINGLECALL_CONTACT_BTN_R REL_W(ENDCALL_CONTACT_BTN_L_PAD+ENDCALL_CONTACT_BTN_WIDTH) +#define ENDSINGLECALL_CONTACT_BTN_T REL_H(ENDCALL_CONTACT_BTN_T_PAD) +#define ENDSINGLECALL_CONTACT_BTN_B REL_H(ENDCALL_CONTACT_BTN_T_PAD+ENDCALL_CONTACT_BTN_HEIGHT) +/* + * End of END CALL View + */ + + +/* + * QUICK-PANEL layout + * In Portrait mode + */ +#define CALL_QUICKPANEL_CID_L REL_QP_W(QP_CID_L_PAD) +#define CALL_QUICKPANEL_CID_R REL_QP_W(QP_CID_L_PAD+QP_CID_WIDTH) +#define CALL_QUICKPANEL_CID_T REL_QP_H(QP_CID_T_PAD) +#define CALL_QUICKPANEL_CID_B REL_QP_H(QP_CID_T_PAD+QP_CID_HEIGHT) + +#define CALL_QUICKPANEL_BTN_MUTE_L REL_QP_W(QP_MUTE_BTN_L_PAD) +#define CALL_QUICKPANEL_BTN_MUTE_R REL_QP_W(QP_MUTE_BTN_L_PAD+QP_END_BTN_WIDTH) +#define CALL_QUICKPANEL_BTN_MUTE_T REL_QP_H(QP_MUTE_BTN_T_PAD) +#define CALL_QUICKPANEL_BTN_MUTE_B REL_QP_H(QP_MUTE_BTN_T_PAD+QP_END_BTN_HEIGHT) + +#define CALL_QUICKPANEL_BTN_END_L REL_QP_W(QP_END_BTN_L_PAD) +#define CALL_QUICKPANEL_BTN_END_R REL_QP_W(QP_END_BTN_L_PAD+QP_END_BTN_WIDTH) +#define CALL_QUICKPANEL_BTN_END_T REL_QP_H(QP_END_BTN_T_PAD) +#define CALL_QUICKPANEL_BTN_END_B REL_QP_H(QP_END_BTN_T_PAD+QP_END_BTN_HEIGHT) + +#define CALL_QUICKPANEL_NAME_L REL_QP_W(QP_NAME_L_PAD) +#define CALL_QUICKPANEL_NAME_R REL_QP_W(QP_NAME_L_PAD+QP_NAME_WIDTH) +#define CALL_QUICKPANEL_NAME_T REL_QP_H(QP_NAME_T_PAD) +#define CALL_QUICKPANEL_NAME_B REL_QP_H(QP_NAME_T_PAD+QP_NAME_HEIGHT) +/* + * End of QUICK-PANEL layout + */ + + +/* + * NBEAT-HD GUI Widget Dimensions + * In Landscape mode + */ +#define MAIN_SCREEN_LSCAPE_W 1280 +#define MAIN_SCREEN_LSCAPE_H 720 + +#define LSCAPE_TITLE_T_PAD INDICATOR_HEIGHT +#define LSCAPE_TITLE_HEIGHT 100 + +#define LSCAPE_BODY_BG_T_PAD (LSCAPE_TITLE_T_PAD+LSCAPE_TITLE_HEIGHT) + +#define LSCAPE_SCROLLER_WIDTH (266*5+30*2) /*CID(266) Gap(30)*/ +#define LSCAPE_SCROLLER_HEIGHT 388 + +/*CID Data*/ +#define LSCAPE_CID_WIDTH 266 +#define LSCAPE_CID_HEIGHT 348 + +#define FIRST_CID_OUTER_BG_POS1_L_PAD 30 +#define FIRST_CID_OUTER_BG_POS2_L_PAD 108 +#define FIRST_CID_OUTER_BG_POS3_L_PAD 241 +#define FIRST_CID_OUTER_BG_POS4_L_PAD 374 +#define CID_OUTER_BG_WIDTH LSCAPE_CID_WIDTH +#define CID_OUTER_BG_T_PAD 30 +#define CID_OUTER_BG_HEIGHT LSCAPE_CID_HEIGHT + +#define CID_INNER_BG_L_PAD 20 +#define CID_INNER_BG_WIDTH 226 +#define CID_INNER_BG_T_PAD 0 +#define CID_INNER_BG_HEIGHT (CID_OUTER_BG_HEIGHT-20) + +#define CID_END_L_PAD (CID_OUTER_BG_WIDTH-60) +#define CID_END_WIDTH 60 +#define CID_END_T_PAD (-20) +#define CID_END_HEIGHT 60 + +#define CID_NAME_T_PAD 18 +#define CID_NAME_HEIGHT 40 + +#define CID_IMG_L_PAD 42 +#define CID_IMG_WIDTH 182 +#define CID_IMG_T_PAD 66 +#define CID_IMG_HEIGHT 182 + +#define CID_SPLIT_L_PAD 32 +#define CID_SPLIT_WIDTH 202 +#define CID_SPLIT_T_PAD 256 +#define CID_SPLIT_HEIGHT 60 + +#define LSCAPE_HOLD_L_PAD 24 +#define LSCAPE_HOLD_WIDTH 60 +#define LSCAPE_HOLD_T_PAD (LSCAPE_TITLE_T_PAD+LSCAPE_TITLE_HEIGHT+LSCAPE_SCROLLER_HEIGHT) +#define LSCAPE_HOLD_HEIGHT 60 + +#define LSCAPE_TIMER_WIDTH 1232 + +#define LSCAPE_BIG_END_T_PAD (LSCAPE_HOLD_T_PAD+LSCAPE_HOLD_HEIGHT+26) +#define LSCAPE_BIG_END_HEIGHT 80 + +#define LSCAPE_SPLIT_CID1_L_PAD 307 +#define LSCAPE_SPLIT_CID1_WIDTH 304 +#define LSCAPE_SPLIT_CID1_T_PAD 182 +#define LSCAPE_SPLIT_CID1_HEIGHT 304 + +#define LSCAPE_SPLIT_PAUSE_L_PAD (LSCAPE_SPLIT_CID1_L_PAD+8) +#define LSCAPE_SPLIT_PAUSE_WIDTH 62 +#define LSCAPE_SPLIT_PAUSE_HEIGHT 62 +#define LSCAPE_SPLIT_PAUSE_T_PAD (LSCAPE_SPLIT_CID1_T_PAD+LSCAPE_SPLIT_CID1_HEIGHT-8-LSCAPE_SPLIT_PAUSE_HEIGHT) + +#define LSCAPE_SPLIT_CID2_L_PAD (LSCAPE_SPLIT_CID1_L_PAD+LSCAPE_SPLIT_CID1_WIDTH+142) +#define LSCAPE_SPLIT_CID2_WIDTH 208 +#define LSCAPE_SPLIT_CID2_T_PAD 230 +#define LSCAPE_SPLIT_CID2_HEIGHT 208 + +#define LSCAPE_SPLIT_PLAY_L_PAD (LSCAPE_SPLIT_CID2_L_PAD+12) +#define LSCAPE_SPLIT_PLAY_WIDTH 40 +#define LSCAPE_SPLIT_PLAY_HEIGHT 40 +#define LSCAPE_SPLIT_PLAY_T_PAD (LSCAPE_SPLIT_CID2_T_PAD+LSCAPE_SPLIT_CID2_HEIGHT-12-LSCAPE_SPLIT_PLAY_HEIGHT) + +#define LSCAPE_SPLIT_NAME1_L_PAD (LSCAPE_SPLIT_CID1_L_PAD-37) +#define LSCAPE_SPLIT_NAME1_WIDTH 390 +#define LSCAPE_SPLIT_NAME1_T_PAD 108 +#define LSCAPE_SPLIT_NAME1_HEIGHT 58 + +#define LSCAPE_SPLIT_NAME2_L_PAD (LSCAPE_SPLIT_CID2_L_PAD-21) +#define LSCAPE_SPLIT_NAME2_WIDTH 250 +#define LSCAPE_SPLIT_NAME2_T_PAD 180 +#define LSCAPE_SPLIT_NAME2_HEIGHT 40 + +#define LSCAPE_SPLIT_TIMER_T_PAD 512 +#define LSCAPE_SPLIT_TIMER_HEIGHT 46 + +#define LSCAPE_SPLIT_MORE_BTN_WIDTH 40 +#define LSCAPE_SPLIT_MORE_BTN_L_PAD (LSCAPE_SPLIT_CID2_L_PAD+LSCAPE_SPLIT_CID2_WIDTH-LSCAPE_SPLIT_MORE_BTN_WIDTH) +#define LSCAPE_SPLIT_ONHOLD_TXT_W_ICON_WIDTH (LSCAPE_SPLIT_CID2_WIDTH-LSCAPE_SPLIT_MORE_BTN_WIDTH) +#define LSCAPE_SPLIT_ONHOLD_TXT_T_PAD 456 +#define LSCAPE_SPLIT_ONHOLD_TXT_HEIGHT 40 + +#define LSCAPE_SPLIT_SWAP_CID1_L_PAD 307 +#define LSCAPE_SPLIT_SWAP_CID1_WIDTH 208 + +#define LSCAPE_SPLIT_SWAP_PLAY_L_PAD (LSCAPE_SPLIT_SWAP_CID1_L_PAD+12) +#define LSCAPE_SPLIT_SWAP_PLAY_WIDTH 40 + +#define LSCAPE_SPLIT_SWAP_CID2_L_PAD (LSCAPE_SPLIT_SWAP_CID1_L_PAD+LSCAPE_SPLIT_SWAP_CID1_WIDTH+142) +#define LSCAPE_SPLIT_SWAP_CID2_WIDTH 304 + +#define LSCAPE_SPLIT_SWAP_PAUSE_L_PAD (LSCAPE_SPLIT_SWAP_CID2_L_PAD+8) +#define LSCAPE_SPLIT_SWAP_PAUSE_WIDTH 62 + +#define LSCAPE_SPLIT_SWAP_NAME1_L_PAD (LSCAPE_SPLIT_CID1_L_PAD-21) +#define LSCAPE_SPLIT_SWAP_NAME1_WIDTH 250 + +#define LSCAPE_SPLIT_SWAP_NAME2_L_PAD (LSCAPE_SPLIT_SWAP_CID2_L_PAD-37) +#define LSCAPE_SPLIT_SWAP_NAME2_WIDTH 390 + +#define LSCAPE_SPLIT_SWAP_MORE_BTN_WIDTH 60 +#define LSCAPE_SPLIT_SWAP_MORE_BTN_L_PAD (LSCAPE_SPLIT_SWAP_CID2_L_PAD+LSCAPE_SPLIT_SWAP_CID2_WIDTH-LSCAPE_SPLIT_SWAP_MORE_BTN_WIDTH) +#define LSCAPE_SPLIT_SWAP_MORE_BTN_T_PAD (LSCAPE_SPLIT_TIMER_T_PAD-7) +#define LSCAPE_SPLIT_SWAP_MORE_BTN_HEIGHT 60 +#define LSCAPE_SPLIT_TIMER_TXT_W_ICON_WIDTH (LSCAPE_SPLIT_SWAP_CID2_WIDTH-LSCAPE_SPLIT_SWAP_MORE_BTN_WIDTH) + +#define LSCAPE_SPLIT_JOIN_BTN_L_PAD 40 +#define LSCAPE_SPLIT_JOIN_BTN_WIDTH 584 +#define LSCAPE_SPLIT_JOIN_BTN_T_PAD 614 +#define LSCAPE_SPLIT_JOIN_BTN_HEIGHT 80 + +#define LSCAPE_SPLIT_BIG_END_BTN_L_PAD (LSCAPE_SPLIT_JOIN_BTN_L_PAD+LSCAPE_SPLIT_JOIN_BTN_WIDTH+32) +#define LSCAPE_SPLIT_BIG_END_BTN_WIDTH LSCAPE_SPLIT_JOIN_BTN_WIDTH + +#define LSCAPE_QP_WIN_W MAIN_SCREEN_LSCAPE_W +#define LSCAPE_QP_WIN_H 170 + +#define LSCAPE_QP_CID_L_PAD 20 +#define LSCAPE_QP_CID_WIDTH 105 +#define LSCAPE_QP_CID_T_PAD 32 +#define LSCAPE_QP_CID_HEIGHT 105 + +#define LSCAPE_QP_MUTE_BTN_L_PAD 338 +#define LSCAPE_QP_MUTE_BTN_WIDTH 368 +#define LSCAPE_QP_MUTE_BTN_T_PAD 78 +#define LSCAPE_QP_MUTE_BTN_HEIGHT 74 + +#define LSCAPE_QP_END_BTN_L_PAD 726 +#define LSCAPE_QP_END_BTN_WIDTH 367 +#define LSCAPE_QP_END_BTN_T_PAD LSCAPE_QP_MUTE_BTN_T_PAD +#define LSCAPE_QP_END_BTN_HEIGHT LSCAPE_QP_MUTE_BTN_HEIGHT + +#define LSCAPE_QP_NAME_L_PAD LSCAPE_QP_MUTE_BTN_L_PAD +#define LSCAPE_QP_NAME_WIDTH 922 +#define LSCAPE_QP_NAME_T_PAD 22 +#define LSCAPE_QP_NAME_HEIGHT 36 + +/* + * End of NBEAT-HD GUI Widget Dimensions + */ + + +/* + * Relative positions + * In Landscape mode + */ +#define REL_LSCAPE_W(x) ((x)/MAIN_SCREEN_LSCAPE_W) +#define REL_LSCAPE_H(y) ((y)/MAIN_SCREEN_LSCAPE_H) + +#define REL_SCROLLER_W(x) ((x)/LSCAPE_SCROLLER_WIDTH) +#define REL_SCROLLER_H(y) ((y)/LSCAPE_SCROLLER_HEIGHT) + +#define REL_LSCAPE_CID_W(x) ((x)/LSCAPE_CID_WIDTH) +#define REL_LSCAPE_CID_H(y) ((y)/LSCAPE_CID_HEIGHT) + +/* Relative X & Y positions of widgets w.r.t. Quick-panel layout */ +#define REL_LSCAPE_QP_W(x) ((x)/LSCAPE_QP_WIN_W) +#define REL_LSCAPE_QP_H(y) ((y)/LSCAPE_QP_WIN_H) + +/* + * End of Relative positions + */ + + +/* + * MULTI-CALL CONF View + * In Landscape mode + */ +#define INCALL_LANDSCAPE_TITLE_BG_L REL_LSCAPE_W(0) +#define INCALL_LANDSCAPE_TITLE_BG_R REL_LSCAPE_W(MAIN_SCREEN_LSCAPE_W) +#define INCALL_LANDSCAPE_TITLE_BG_T REL_LSCAPE_H(LSCAPE_TITLE_T_PAD) +#define INCALL_LANDSCAPE_TITLE_BG_B REL_LSCAPE_H(LSCAPE_TITLE_T_PAD+LSCAPE_TITLE_HEIGHT) + +#define INCALL_LANDSCAPE_TITLE_TXT_L INCALL_LANDSCAPE_TITLE_BG_L +#define INCALL_LANDSCAPE_TITLE_TXT_R INCALL_LANDSCAPE_TITLE_BG_R +#define INCALL_LANDSCAPE_TITLE_TXT_T INCALL_LANDSCAPE_TITLE_BG_T +#define INCALL_LANDSCAPE_TITLE_TXT_B INCALL_LANDSCAPE_TITLE_BG_B + +#define INCALL_LANDSCAPE_BODY_BG_L REL_LSCAPE_W(0) +#define INCALL_LANDSCAPE_BODY_BG_R REL_LSCAPE_W(MAIN_SCREEN_LSCAPE_W) +#define INCALL_LANDSCAPE_BODY_BG_T REL_LSCAPE_H(LSCAPE_BODY_BG_T_PAD) +#define INCALL_LANDSCAPE_BODY_BG_B REL_LSCAPE_H(MAIN_SCREEN_LSCAPE_H) + +#define INCALL_LANDSCAPE_SCROLLER_L REL_LSCAPE_W(0) +#define INCALL_LANDSCAPE_SCROLLER_R REL_LSCAPE_W(MAIN_SCREEN_LSCAPE_W) +#define INCALL_LANDSCAPE_SCROLLER_T INCALL_LANDSCAPE_BODY_BG_T +#define INCALL_LANDSCAPE_SCROLLER_B REL_LSCAPE_H(LSCAPE_BODY_BG_T_PAD+LSCAPE_SCROLLER_HEIGHT) + +/*LSCAPE: CID-1 BG initial position*/ +/*5 in conference*/ +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS1_L REL_SCROLLER_W(FIRST_CID_OUTER_BG_POS1_L_PAD) +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS1_R REL_SCROLLER_W(FIRST_CID_OUTER_BG_POS1_L_PAD+CID_OUTER_BG_WIDTH) +/*4 in conference*/ +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS2_L REL_LSCAPE_W(FIRST_CID_OUTER_BG_POS2_L_PAD) +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS2_R REL_LSCAPE_W(FIRST_CID_OUTER_BG_POS2_L_PAD+CID_OUTER_BG_WIDTH) +/*3 in conference*/ +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS3_L REL_LSCAPE_W(FIRST_CID_OUTER_BG_POS3_L_PAD) +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS3_R REL_LSCAPE_W(FIRST_CID_OUTER_BG_POS3_L_PAD+CID_OUTER_BG_WIDTH) +/*2 in conference*/ +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS4_L REL_LSCAPE_W(FIRST_CID_OUTER_BG_POS4_L_PAD) +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_POS4_R REL_LSCAPE_W(FIRST_CID_OUTER_BG_POS4_L_PAD+CID_OUTER_BG_WIDTH) +/*LSCAPE: CID-1 BG initial position*/ +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_T REL_SCROLLER_H(CID_OUTER_BG_T_PAD) +#define INCALL_LANDSCAPE_FIRST_CID_OUTER_BG_B REL_SCROLLER_H(CID_OUTER_BG_HEIGHT) + +#define INCALL_LANDSCAPE_CID_INNER_BG_L REL_LSCAPE_CID_W(CID_INNER_BG_L_PAD) +#define INCALL_LANDSCAPE_CID_INNER_BG_R REL_LSCAPE_CID_W(CID_INNER_BG_L_PAD+CID_INNER_BG_WIDTH) +#define INCALL_LANDSCAPE_CID_INNER_BG_T REL_LSCAPE_CID_H(CID_INNER_BG_T_PAD) +#define INCALL_LANDSCAPE_CID_INNER_BG_B REL_LSCAPE_CID_H(CID_INNER_BG_T_PAD+CID_INNER_BG_HEIGHT) + +#define INCALL_LANDSCAPE_CID_END_L REL_LSCAPE_CID_W(CID_END_L_PAD) +#define INCALL_LANDSCAPE_CID_END_R REL_LSCAPE_CID_W(CID_END_L_PAD+CID_END_WIDTH) +#define INCALL_LANDSCAPE_CID_END_T REL_LSCAPE_CID_H(CID_END_T_PAD) +#define INCALL_LANDSCAPE_CID_END_B REL_LSCAPE_CID_H(CID_END_T_PAD+CID_END_HEIGHT) + +#define INCALL_LANDSCAPE_CID_NAME_L INCALL_LANDSCAPE_CID_INNER_BG_L +#define INCALL_LANDSCAPE_CID_NAME_R INCALL_LANDSCAPE_CID_INNER_BG_R +#define INCALL_LANDSCAPE_CID_NAME_T REL_LSCAPE_CID_H(CID_NAME_T_PAD) +#define INCALL_LANDSCAPE_CID_NAME_B REL_LSCAPE_CID_H(CID_NAME_T_PAD+CID_NAME_HEIGHT) + +#define INCALL_LANDSCAPE_CID_IMG_L REL_LSCAPE_CID_W(CID_IMG_L_PAD) +#define INCALL_LANDSCAPE_CID_IMG_R REL_LSCAPE_CID_W(CID_IMG_L_PAD+CID_IMG_WIDTH) +#define INCALL_LANDSCAPE_CID_IMG_T REL_LSCAPE_CID_H(CID_IMG_T_PAD) +#define INCALL_LANDSCAPE_CID_IMG_B REL_LSCAPE_CID_H(CID_IMG_T_PAD+CID_IMG_HEIGHT) + +#define INCALL_LANDSCAPE_BTN_CID_SPLIT_L REL_LSCAPE_CID_W(CID_SPLIT_L_PAD) +#define INCALL_LANDSCAPE_BTN_CID_SPLIT_R REL_LSCAPE_CID_W(CID_SPLIT_L_PAD+CID_SPLIT_WIDTH) +#define INCALL_LANDSCAPE_BTN_CID_SPLIT_T REL_LSCAPE_CID_H(CID_SPLIT_T_PAD) +#define INCALL_LANDSCAPE_BTN_CID_SPLIT_B REL_LSCAPE_CID_H(CID_SPLIT_T_PAD+CID_SPLIT_HEIGHT) +/*LSCAPE: CID-1 Data*/ + +/*LSCAPE: Other CID Data*/ +#define INCALL_LANDSCAPE_OTHER_CID_OUTER_BG_L REL_LSCAPE_CID_W(CID_OUTER_BG_WIDTH) +#define INCALL_LANDSCAPE_OTHER_CID_OUTER_BG_R REL_LSCAPE_CID_W(CID_OUTER_BG_WIDTH*2) +#define INCALL_LANDSCAPE_OTHER_CID_OUTER_BG_T REL_LSCAPE_CID_H(0) +#define INCALL_LANDSCAPE_OTHER_CID_OUTER_BG_B REL_LSCAPE_CID_H(CID_OUTER_BG_HEIGHT) +/*LSCAPE: Other CID Data*/ + +#define INCALL_LANDSCAPE_HOLD_L REL_LSCAPE_W(LSCAPE_HOLD_L_PAD) +#define INCALL_LANDSCAPE_HOLD_R REL_LSCAPE_W(LSCAPE_HOLD_L_PAD+LSCAPE_HOLD_WIDTH) +#define INCALL_LANDSCAPE_HOLD_T REL_LSCAPE_H(LSCAPE_HOLD_T_PAD) +#define INCALL_LANDSCAPE_HOLD_B REL_LSCAPE_H(LSCAPE_HOLD_T_PAD+LSCAPE_HOLD_HEIGHT) + +#define INCALL_LANDSCAPE_TIMER_L INCALL_LANDSCAPE_HOLD_L +#define INCALL_LANDSCAPE_TIMER_R REL_LSCAPE_W(LSCAPE_HOLD_L_PAD+LSCAPE_TIMER_WIDTH) +#define INCALL_LANDSCAPE_TIMER_T INCALL_LANDSCAPE_HOLD_T +#define INCALL_LANDSCAPE_TIMER_B INCALL_LANDSCAPE_HOLD_B + +#define INCALL_LANDSCAPE_BIG_END_L INCALL_LANDSCAPE_HOLD_L +#define INCALL_LANDSCAPE_BIG_END_R INCALL_LANDSCAPE_TIMER_R +#define INCALL_LANDSCAPE_BIG_END_T REL_LSCAPE_H(LSCAPE_BIG_END_T_PAD) +#define INCALL_LANDSCAPE_BIG_END_B REL_LSCAPE_H(LSCAPE_BIG_END_T_PAD+LSCAPE_BIG_END_HEIGHT) +/* + * End of MULTI-CALL CONF View + */ + + +/* + * MULTI-CALL SPLIT View + * In Landscape mode + */ +/* L[ACT] + R[HLD] */ +#define MULTICALL_SPLIT_LANDSCAPE_BACKGROUND_CID_L REL_LSCAPE_W(0) +#define MULTICALL_SPLIT_LANDSCAPE_BACKGROUND_CID_R REL_LSCAPE_W(MAIN_SCREEN_LSCAPE_W) +#define MULTICALL_SPLIT_LANDSCAPE_BACKGROUND_CID_T REL_LSCAPE_H(0) +#define MULTICALL_SPLIT_LANDSCAPE_BACKGROUND_CID_B REL_LSCAPE_H(MAIN_SCREEN_LSCAPE_H) + +#define MULTICALL_SPLIT_LANDSCAPE_CID_1_L REL_LSCAPE_W(LSCAPE_SPLIT_CID1_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_CID_1_R REL_LSCAPE_W(LSCAPE_SPLIT_CID1_L_PAD+LSCAPE_SPLIT_CID1_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_CID_1_T REL_LSCAPE_H(LSCAPE_SPLIT_CID1_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_CID_1_B REL_LSCAPE_H(LSCAPE_SPLIT_CID1_T_PAD+LSCAPE_SPLIT_CID1_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_PAUSE_L REL_LSCAPE_W(LSCAPE_SPLIT_PAUSE_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_PAUSE_R REL_LSCAPE_W(LSCAPE_SPLIT_PAUSE_L_PAD+LSCAPE_SPLIT_PAUSE_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_PAUSE_T REL_LSCAPE_H(LSCAPE_SPLIT_PAUSE_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_PAUSE_B REL_LSCAPE_H(LSCAPE_SPLIT_PAUSE_T_PAD+LSCAPE_SPLIT_PAUSE_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_CID_2_L REL_LSCAPE_W(LSCAPE_SPLIT_CID2_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_CID_2_R REL_LSCAPE_W(LSCAPE_SPLIT_CID2_L_PAD+LSCAPE_SPLIT_CID2_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_CID_2_T REL_LSCAPE_H(LSCAPE_SPLIT_CID2_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_CID_2_B REL_LSCAPE_H(LSCAPE_SPLIT_CID2_T_PAD+LSCAPE_SPLIT_CID2_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_PLAY_L REL_LSCAPE_W(LSCAPE_SPLIT_PLAY_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_PLAY_R REL_LSCAPE_W(LSCAPE_SPLIT_PLAY_L_PAD+LSCAPE_SPLIT_PLAY_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_PLAY_T REL_LSCAPE_H(LSCAPE_SPLIT_PLAY_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_PLAY_B REL_LSCAPE_H(LSCAPE_SPLIT_PLAY_T_PAD+LSCAPE_SPLIT_PLAY_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_NAME_1_L REL_LSCAPE_W(LSCAPE_SPLIT_NAME1_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_NAME_1_R REL_LSCAPE_W(LSCAPE_SPLIT_NAME1_L_PAD+LSCAPE_SPLIT_NAME1_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_NAME_1_T REL_LSCAPE_H(LSCAPE_SPLIT_NAME1_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_NAME_1_B REL_LSCAPE_H(LSCAPE_SPLIT_NAME1_T_PAD+LSCAPE_SPLIT_NAME1_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_NAME_2_L REL_LSCAPE_W(LSCAPE_SPLIT_NAME2_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_NAME_2_R REL_LSCAPE_W(LSCAPE_SPLIT_NAME2_L_PAD+LSCAPE_SPLIT_NAME2_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_NAME_2_T REL_LSCAPE_H(LSCAPE_SPLIT_NAME2_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_NAME_2_B REL_LSCAPE_H(LSCAPE_SPLIT_NAME2_T_PAD+LSCAPE_SPLIT_NAME2_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_TIMER_L MULTICALL_SPLIT_LANDSCAPE_CID_1_L +#define MULTICALL_SPLIT_LANDSCAPE_TIMER_R MULTICALL_SPLIT_LANDSCAPE_CID_1_R +#define MULTICALL_SPLIT_LANDSCAPE_TIMER_T REL_LSCAPE_H(LSCAPE_SPLIT_TIMER_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_TIMER_B REL_LSCAPE_H(LSCAPE_SPLIT_TIMER_T_PAD+LSCAPE_SPLIT_TIMER_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_L MULTICALL_SPLIT_LANDSCAPE_CID_2_L +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_R MULTICALL_SPLIT_LANDSCAPE_CID_2_R +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_T REL_LSCAPE_H(LSCAPE_SPLIT_ONHOLD_TXT_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_B REL_LSCAPE_H(LSCAPE_SPLIT_ONHOLD_TXT_T_PAD+LSCAPE_SPLIT_ONHOLD_TXT_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_WITH_ICON_L MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_L +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_WITH_ICON_R REL_LSCAPE_W(LSCAPE_SPLIT_CID2_L_PAD+LSCAPE_SPLIT_ONHOLD_TXT_W_ICON_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_WITH_ICON_T MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_WITH_ICON_B MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_B + +#define MULTICALL_SPLIT_LANDSCAPE_MORE_ICON_L REL_LSCAPE_W(LSCAPE_SPLIT_MORE_BTN_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_MORE_ICON_R MULTICALL_SPLIT_LANDSCAPE_CID_2_R +#define MULTICALL_SPLIT_LANDSCAPE_MORE_ICON_T MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_LANDSCAPE_MORE_ICON_B MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_B +/* L[ACT] + R[HLD] */ + +/* L[HLD] + R[ACT] */ +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_1_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_CID1_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_1_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_CID1_L_PAD+LSCAPE_SPLIT_SWAP_CID1_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_1_T MULTICALL_SPLIT_LANDSCAPE_CID_2_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_1_B MULTICALL_SPLIT_LANDSCAPE_CID_2_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PLAY_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_PLAY_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PLAY_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_PLAY_L_PAD+LSCAPE_SPLIT_SWAP_PLAY_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PLAY_T MULTICALL_SPLIT_LANDSCAPE_PLAY_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PLAY_B MULTICALL_SPLIT_LANDSCAPE_PLAY_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_CID2_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_CID2_L_PAD+LSCAPE_SPLIT_SWAP_CID2_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_T MULTICALL_SPLIT_LANDSCAPE_CID_1_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_B MULTICALL_SPLIT_LANDSCAPE_CID_1_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PAUSE_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_PAUSE_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PAUSE_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_PAUSE_L_PAD+LSCAPE_SPLIT_SWAP_PAUSE_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PAUSE_T MULTICALL_SPLIT_LANDSCAPE_PAUSE_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_PAUSE_B MULTICALL_SPLIT_LANDSCAPE_PAUSE_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_1_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_NAME1_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_1_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_NAME1_L_PAD+LSCAPE_SPLIT_SWAP_NAME1_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_1_T MULTICALL_SPLIT_LANDSCAPE_NAME_2_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_1_B MULTICALL_SPLIT_LANDSCAPE_NAME_2_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_2_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_NAME2_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_2_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_NAME2_L_PAD+LSCAPE_SPLIT_SWAP_NAME2_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_2_T MULTICALL_SPLIT_LANDSCAPE_NAME_1_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_NAME_2_B MULTICALL_SPLIT_LANDSCAPE_NAME_1_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_ON_HOLD_TXT_L MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_1_L +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_ON_HOLD_TXT_R MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_1_R +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_ON_HOLD_TXT_T MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_ON_HOLD_TXT_B MULTICALL_SPLIT_LANDSCAPE_ON_HOLD_TXT_T + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_L MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_L +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_R MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_R +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_T MULTICALL_SPLIT_LANDSCAPE_TIMER_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_B MULTICALL_SPLIT_LANDSCAPE_TIMER_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_WITH_ICON_L MULTICALL_SPLIT_LANDSCAPE_SWAP_CID_2_L +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_WITH_ICON_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_CID2_L_PAD+LSCAPE_SPLIT_TIMER_TXT_W_ICON_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_WITH_ICON_T MULTICALL_SPLIT_LANDSCAPE_TIMER_T +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_TIMER_WITH_ICON_B MULTICALL_SPLIT_LANDSCAPE_TIMER_B + +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_MORE_ICON_L REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_MORE_BTN_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_MORE_ICON_R REL_LSCAPE_W(LSCAPE_SPLIT_SWAP_MORE_BTN_L_PAD+LSCAPE_SPLIT_SWAP_MORE_BTN_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_MORE_ICON_T REL_LSCAPE_H(LSCAPE_SPLIT_SWAP_MORE_BTN_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_SWAP_MORE_ICON_B REL_LSCAPE_H(LSCAPE_SPLIT_SWAP_MORE_BTN_T_PAD+LSCAPE_SPLIT_SWAP_MORE_BTN_HEIGHT) +/* L[HLD] + R[ACT] */ + +#define MULTICALL_SPLIT_LANDSCAPE_JOIN_L REL_LSCAPE_W(LSCAPE_SPLIT_JOIN_BTN_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_JOIN_R REL_LSCAPE_W(LSCAPE_SPLIT_JOIN_BTN_L_PAD+LSCAPE_SPLIT_JOIN_BTN_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_JOIN_T REL_LSCAPE_H(LSCAPE_SPLIT_JOIN_BTN_T_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_JOIN_B REL_LSCAPE_H(LSCAPE_SPLIT_JOIN_BTN_T_PAD+LSCAPE_SPLIT_JOIN_BTN_HEIGHT) + +#define MULTICALL_SPLIT_LANDSCAPE_BIG_END_L REL_LSCAPE_W(LSCAPE_SPLIT_BIG_END_BTN_L_PAD) +#define MULTICALL_SPLIT_LANDSCAPE_BIG_END_R REL_LSCAPE_W(LSCAPE_SPLIT_BIG_END_BTN_L_PAD+LSCAPE_SPLIT_BIG_END_BTN_WIDTH) +#define MULTICALL_SPLIT_LANDSCAPE_BIG_END_T MULTICALL_SPLIT_LANDSCAPE_JOIN_T +#define MULTICALL_SPLIT_LANDSCAPE_BIG_END_B MULTICALL_SPLIT_LANDSCAPE_JOIN_B +/* + * End of MULTI-CALL SPLIT View + */ + +/* + * QUICK-PANEL layout + * In Portrait mode + */ +#define LSCAPE_QUICKPANEL_CID_L REL_LSCAPE_QP_W(LSCAPE_QP_CID_L_PAD) +#define LSCAPE_QUICKPANEL_CID_R REL_LSCAPE_QP_W(LSCAPE_QP_CID_L_PAD+LSCAPE_QP_CID_WIDTH) +#define LSCAPE_QUICKPANEL_CID_T REL_LSCAPE_QP_H(LSCAPE_QP_CID_T_PAD) +#define LSCAPE_QUICKPANEL_CID_B REL_LSCAPE_QP_H(LSCAPE_QP_CID_T_PAD+LSCAPE_QP_CID_HEIGHT) + +#define LSCAPE_QUICKPANEL_BTN_MUTE_L REL_LSCAPE_QP_W(LSCAPE_QP_MUTE_BTN_L_PAD) +#define LSCAPE_QUICKPANEL_BTN_MUTE_R REL_LSCAPE_QP_W(LSCAPE_QP_MUTE_BTN_L_PAD+LSCAPE_QP_END_BTN_WIDTH) +#define LSCAPE_QUICKPANEL_BTN_MUTE_T REL_LSCAPE_QP_H(LSCAPE_QP_MUTE_BTN_T_PAD) +#define LSCAPE_QUICKPANEL_BTN_MUTE_B REL_LSCAPE_QP_H(LSCAPE_QP_MUTE_BTN_T_PAD+LSCAPE_QP_END_BTN_HEIGHT) + +#define LSCAPE_QUICKPANEL_BTN_END_L REL_LSCAPE_QP_W(LSCAPE_QP_END_BTN_L_PAD) +#define LSCAPE_QUICKPANEL_BTN_END_R REL_LSCAPE_QP_W(LSCAPE_QP_END_BTN_L_PAD+LSCAPE_QP_END_BTN_WIDTH) +#define LSCAPE_QUICKPANEL_BTN_END_T REL_LSCAPE_QP_H(LSCAPE_QP_END_BTN_T_PAD) +#define LSCAPE_QUICKPANEL_BTN_END_B REL_LSCAPE_QP_H(LSCAPE_QP_END_BTN_T_PAD+LSCAPE_QP_END_BTN_HEIGHT) + +#define LSCAPE_QUICKPANEL_NAME_L REL_LSCAPE_QP_W(LSCAPE_QP_NAME_L_PAD) +#define LSCAPE_QUICKPANEL_NAME_R REL_LSCAPE_QP_W(LSCAPE_QP_NAME_L_PAD+LSCAPE_QP_NAME_WIDTH) +#define LSCAPE_QUICKPANEL_NAME_T REL_LSCAPE_QP_H(LSCAPE_QP_NAME_T_PAD) +#define LSCAPE_QUICKPANEL_NAME_B REL_LSCAPE_QP_H(LSCAPE_QP_NAME_T_PAD+LSCAPE_QP_NAME_HEIGHT) + +/* + * Caller info layout + * In Portrait mode + */ + +#define CALLER_INFO_L REL_W(CALLER_INFO_L_PAD) +#define CALLER_INFO_R REL_W(CALLER_INFO_L_PAD+CALLER_INFO_WIDTH) +#define CALLER_INFO_T REL_H(CALLER_INFO_T_PAD) +#define CALLER_INFO_B REL_H(CALLER_INFO_T_PAD+CALLER_INFO_HEIGHT) + +#define CALLER_INFO_HOLD_L REL_W(CALLER_INFO_L_PAD) +#define CALLER_INFO_HOLD_R REL_W(CALLER_INFO_L_PAD+CALLER_INFO_WIDTH) +#define CALLER_INFO_HOLD_T REL_H(CALLER_INFO_HOLD_T_PAD) +#define CALLER_INFO_HOLD_B REL_H(CALLER_INFO_HOLD_T_PAD+CALLER_INFO_HEIGHT) + +#define CALLER_INFO_NAME_L REL_W(CALLER_INFO_NAME_L_PAD) +#define CALLER_INFO_NAME_R REL_W(CALLER_INFO_NAME_L_PAD+CALLER_INFO_NAME_WIDTH) +#define CALLER_INFO_NAME_T REL_CALLER_INFO_H(CALLER_INFO_NAME_T_PAD) +#define CALLER_INFO_NAME_B REL_CALLER_INFO_H(CALLER_INFO_NAME_T_PAD+CALLER_INFO_NAME_HEIGHT) + +#define CALLER_INFO_VERT_SEP_1_L REL_W(CALLER_INFO_VERT_SEP_L_PAD) +#define CALLER_INFO_VERT_SEP_1_R REL_W(CALLER_INFO_VERT_SEP_L_PAD+CALLER_INFO_VERT_SEP_WIDTH) +#define CALLER_INFO_VERT_SEP_1_T REL_CALLER_INFO_H(CALLER_INFO_VERT_SEP_T_PAD) +#define CALLER_INFO_VERT_SEP_1_B REL_CALLER_INFO_H(CALLER_INFO_VERT_SEP_T_PAD+CALLER_INFO_VERT_SEP_HEIGHT) +#define CALLER_INFO_VERT_SEP_2_L CALLER_INFO_VERT_SEP_1_R +#define CALLER_INFO_VERT_SEP_2_R REL_W(CALLER_INFO_VERT_SEP_L_PAD+2*CALLER_INFO_VERT_SEP_WIDTH) +#define CALLER_INFO_VERT_SEP_2_T CALLER_INFO_VERT_SEP_1_T +#define CALLER_INFO_VERT_SEP_2_B CALLER_INFO_VERT_SEP_1_B + +#define CALLER_INFO_ICON_L REL_W(CALLER_INFO_ICON_L_PAD) +#define CALLER_INFO_ICON_R REL_W(CALLER_INFO_ICON_L_PAD+CALLER_INFO_ICON_WIDTH) +#define CALLER_INFO_ICON_T REL_CALLER_INFO_H(CALLER_INFO_ICON_T_PAD) +#define CALLER_INFO_ICON_B REL_CALLER_INFO_H(CALLER_INFO_ICON_T_PAD+CALLER_INFO_ICON_HEIGHT) + +#define CALLER_INFO_NUMBER_L REL_W(CALLER_INFO_NUMBER_L_PAD) +#define CALLER_INFO_NUMBER_R REL_W(CALLER_INFO_NUMBER_L_PAD+CALLER_INFO_NUMBER_WIDTH) +#define CALLER_INFO_NUMBER_T REL_CALLER_INFO_H(CALLER_INFO_NUMBER_T_PAD) +#define CALLER_INFO_NUMBER_B REL_CALLER_INFO_H(CALLER_INFO_NUMBER_T_PAD+CALLER_INFO_NUMBER_HEIGHT) +/* + * End of Caller info layout + */ + +/* + * Ctxpoup layout + * In Portrait mode + */ + +#define MORE_MENU_CTXPOPUP_ROW_H 97 +#define MORE_MENU_CTXPOPUP_ROW_ICON_W 64 +#define MORE_MENU_CTXPOPUP_ROW_ICON_H 64 +#define MORE_MENU_CTXPOPUP_ROW_ICON_PAD 16 + +#define MORE_MENU_CTXPOPUP_SEPARATOR_W 478 +#define MORE_MENU_CTXPOPUP_SEPARATOR_H 1 + +#define MORE_MENU_CTXPOPUP_ARROW_W 42 +#define MORE_MENU_CTXPOPUP_ARROW_H 22 + +#define MORE_MENU_CTXPOPUP_SHADOW_PADDING 3 +#define MORE_MENU_CTXPOPUP_PADDING 10 + +/* + * End of Ctxpoup layout + */ + + +/* + * SNS alerts layout + */ +#define ALERTS_BDAY_ICON_L REL_ALERTS_LY_W(BIRTHDAY_ICON_L_PAD) +#define ALERTS_BDAY_ICON_R REL_ALERTS_LY_W(BIRTHDAY_ICON_L_PAD+BIRTHDAY_ICON_WIDTH) +#define ALERTS_BDAY_ICON_T REL_ALERTS_LY_H(BIRTHDAY_ICON_T_PAD) +#define ALERTS_BDAY_ICON_B REL_ALERTS_LY_H(BIRTHDAY_ICON_T_PAD+BIRTHDAY_ICON_HEIGHT) + +#define ALERTS_BDAY_ICON_EXPANDED_T REL_ALERTS_EXP_LY_H(BIRTHDAY_ICON_T_PAD) +#define ALERTS_BDAY_ICON_EXPANDED_B REL_ALERTS_EXP_LY_H(BIRTHDAY_ICON_T_PAD+BIRTHDAY_ICON_HEIGHT) + +#define ALERTS_BDAY_TEXT_L REL_ALERTS_LY_W(BIRTHDAY_TEXT_L_PAD) +#define ALERTS_BDAY_TEXT_R REL_ALERTS_LY_W(BIRTHDAY_TEXT_L_PAD+BIRTHDAY_TEXT_WIDTH) +#define ALERTS_BDAY_TEXT_T REL_ALERTS_LY_H(BIRTHDAY_TEXT_T_PAD) +#define ALERTS_BDAY_TEXT_B REL_ALERTS_LY_H(BIRTHDAY_TEXT_T_PAD+BIRTHDAY_TEXT_HEIGHT) + +#define ALERTS_BDAY_TEXT_EXPANDED_T REL_ALERTS_EXP_LY_H(BIRTHDAY_TEXT_T_PAD) +#define ALERTS_BDAY_TEXT_EXPANDED_B REL_ALERTS_EXP_LY_H(BIRTHDAY_TEXT_T_PAD+BIRTHDAY_TEXT_HEIGHT) + +#define ALERTS_SNS_ICON_L REL_ALERTS_LY_W(SNS_STATUS_ICON_L_PAD) +#define ALERTS_SNS_ICON_R REL_ALERTS_LY_W(SNS_STATUS_ICON_L_PAD+SNS_STATUS_ICON_WIDTH) +#define ALERTS_SNS_ICON_T REL_ALERTS_LY_H(SNS_STATUS_ICON_T_PAD) +#define ALERTS_SNS_ICON_B REL_ALERTS_LY_H(SNS_STATUS_ICON_T_PAD+SNS_STATUS_ICON_HEIGHT) + +#define ALERTS_SNS_ICON_EXPANDED_T REL_ALERTS_EXP_LY_H(SNS_STATUS_ICON_T_PAD) +#define ALERTS_SNS_ICON_EXPANDED_B REL_ALERTS_EXP_LY_H(SNS_STATUS_ICON_T_PAD+SNS_STATUS_ICON_HEIGHT) + +#define ALERTS_SNS_TEXT_L REL_ALERTS_LY_W(SNS_STATUS_TEXT_L_PAD) +#define ALERTS_SNS_TEXT_R REL_ALERTS_LY_W(SNS_STATUS_TEXT_L_PAD+SNS_STATUS_TEXT_WIDTH) +#define ALERTS_SNS_TEXT_T REL_ALERTS_LY_H(SNS_STATUS_TEXT_T_PAD) +#define ALERTS_SNS_TEXT_B REL_ALERTS_LY_H(SNS_STATUS_TEXT_T_PAD+SNS_STATUS_TEXT_HEIGHT) + +#define ALERTS_SNS_EXPANDED_TEXT_L REL_ALERTS_LY_W(SNS_STATUS_TEXT_L_PAD) +#define ALERTS_SNS_EXPANDED_TEXT_R REL_ALERTS_LY_W(SNS_STATUS_TEXT_L_PAD+SNS_STATUS_EXPANDED_TEXT_WIDTH) +#define ALERTS_SNS_EXPANDED_TEXT_T REL_ALERTS_EXP_LY_H(SNS_STATUS_TEXT_T_PAD) +#define ALERTS_SNS_EXPANDED_TEXT_B REL_ALERTS_EXP_LY_H(SNS_STATUS_TEXT_T_PAD+SNS_STATUS_EXPANDED_TEXT_HEIGHT) + +#define ALERTS_SNS_ARROW_L REL_ALERTS_LY_W(SNS_STATUS_ARROW_L_PAD) +#define ALERTS_SNS_ARROW_R REL_ALERTS_LY_W(SNS_STATUS_ARROW_L_PAD+SNS_STATUS_ARROW_WIDTH) +#define ALERTS_SNS_ARROW_T REL_ALERTS_LY_H(SNS_STATUS_ARROW_T_PAD) +#define ALERTS_SNS_ARROW_B REL_ALERTS_LY_H(SNS_STATUS_ARROW_T_PAD+SNS_STATUS_ARROW_HEIGHT) + +#define ALERTS_SNS_EXPANDED_ARROW_T REL_ALERTS_EXP_LY_H(SNS_STATUS_ARROW_T_PAD) +#define ALERTS_SNS_EXPANDED_ARROW_B REL_ALERTS_EXP_LY_H(SNS_STATUS_ARROW_T_PAD+SNS_STATUS_ARROW_HEIGHT) +/* + * End of SNS alerts layout + */ + +/* + * caller-ID layout + */ +#define VC_CALLER_ID_THUMB_BG_L REL_CALLER_ID_W(VC_CALLER_ID_THUMB_BG_L_PAD) +#define VC_CALLER_ID_THUMB_BG_R REL_CALLER_ID_W(VC_CALLER_ID_THUMB_BG_L_PAD+VC_CALLER_ID_THUMB_BG_WIDTH) +#define VC_CALLER_ID_THUMB_BG_T REL_CALLER_ID_H(VC_CALLER_ID_THUMB_BG_T_PAD) +#define VC_CALLER_ID_THUMB_BG_B REL_CALLER_ID_H(VC_CALLER_ID_THUMB_BG_T_PAD+VC_CALLER_ID_THUMB_BG_HEIGHT) + +#define VC_CALLER_ID_THUMB_L REL_CALLER_ID_W(VC_CALLER_ID_THUMB_L_PAD) +#define VC_CALLER_ID_THUMB_R REL_CALLER_ID_W(VC_CALLER_ID_THUMB_L_PAD+VC_CALLER_ID_THUMB_WIDTH) +#define VC_CALLER_ID_THUMB_T REL_CALLER_ID_H(VC_CALLER_ID_THUMB_T_PAD) +#define VC_CALLER_ID_THUMB_B REL_CALLER_ID_H(VC_CALLER_ID_THUMB_T_PAD+VC_CALLER_ID_THUMB_HEIGHT) + +/* + * End of caller ID layout + */ + +#endif /*_VCUI_VIEW_LAYOUT_HD_H_*/ diff --git a/ui/src/include/vcui-view-multi-call-conf.h b/ui/src/include/vcui-view-multi-call-conf.h new file mode 100755 index 0000000..5062456 --- /dev/null +++ b/ui/src/include/vcui-view-multi-call-conf.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_MULTI_CALL_CONF_H_ +#define _VCUI_VIEW_MULTI_CALL_CONF_H_ + + +voice_call_view_data_t *_vcui_view_multi_call_conf_new(vcui_app_call_data_t *ad); +int _vcui_view_multi_call_conf_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vcui_view_multi_call_conf_get_main_layout(voice_call_view_data_t *vd); +int _vcui_view_multi_call_conf_get_call_status(voice_call_view_data_t *vd); +void _vcui_view_multi_call_conf_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur); +Evas_Object *_vcui_view_multi_call_conf_get_button_layout(voice_call_view_data_t *vd); +Evas_Object *_vcui_view_multi_call_conf_get_cid_layout(voice_call_view_data_t *vd); +int _vcui_view_multi_call_conf_get_total_members(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_multi_call_conf_get_caller_info(voice_call_view_data_t *vd); + +#endif /*_VCUI_VIEW_MULTI_CALL_CONF_H_*/ + diff --git a/ui/src/include/vcui-view-multi-call-list.h b/ui/src/include/vcui-view-multi-call-list.h new file mode 100755 index 0000000..925907d --- /dev/null +++ b/ui/src/include/vcui-view-multi-call-list.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_MULTI_CALL_LIST_H_ +#define _VCUI_VIEW_MULTI_CALL_LIST_H_ + + +voice_call_view_data_t *_vcui_view_multi_call_list_new(vcui_app_call_data_t *ad); +int _vcui_view_multi_call_list_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vcui_view_multi_call_list_get_main_layout(voice_call_view_data_t *vd); +int _vcui_view_multi_call_list_get_call_status(voice_call_view_data_t *vd); +void _vcui_view_multi_call_list_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur); +int _vcui_view_multi_call_list_get_total_members(voice_call_view_data_t *vd); +#endif diff --git a/ui/src/include/vcui-view-multi-call-split.h b/ui/src/include/vcui-view-multi-call-split.h new file mode 100755 index 0000000..67b218c --- /dev/null +++ b/ui/src/include/vcui-view-multi-call-split.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_MULTI_CALL_SPLIT_H_ +#define _VCUI_VIEW_MULTI_CALL_SPLIT_H_ + + +voice_call_view_data_t *_vcui_view_multi_call_split_new(vcui_app_call_data_t *ad); +void _vcui_multi_view_split_rotation_with_resize(); +int _vcui_view_multi_call_split_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vcui_view_multi_call_split_get_layout(voice_call_view_data_t *vd); +Evas_Object *_vcui_view_multi_call_split_get_button_layout(voice_call_view_data_t *vd); +void _vcui_view_multi_call_split_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur); +Evas_Object *_vc_ui_view_multi_call_split_get_caller_info_hold(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_multi_call_split_get_caller_info_unhold(voice_call_view_data_t *vd); + +#endif + diff --git a/ui/src/include/vcui-view-popup.h b/ui/src/include/vcui-view-popup.h new file mode 100755 index 0000000..b806d67 --- /dev/null +++ b/ui/src/include/vcui-view-popup.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_POPUP_H_ +#define _VCUI_VIEW_POPUP_H_ + +typedef enum { + POPUP_BTN_OPT_OK = 1, + POPUP_BTN_OPT_CANCEL, + + POPUP_BTN_OPT_MAX, +}_popup_button_opt_t; + +void _vcui_view_popup_unload(Evas_Object *popup_eo); +void _vcui_view_popup_load(char *popup_msg, double time_out, int bterminate); +void _vcui_view_popup_replace(char *popup_msg, double time_out, int bterminate); +void _vcui_view_popup_vol_ringtone(int vol_level); +void _vcui_view_popup_vol_voice(int vol_level); +void _vcui_view_popup_vol_bt(int vol_level); +void _vcui_view_popup_load_reject_call(char *name, char *number, int end_app); +void _vcui_view_popup_load_endcall_time(call_data_t *cd); +void _vcui_view_popup_load_redial(void); +void _vcui_view_popup_load_with_delay(char *popup_msg, double delay_time); +void _vcui_view_popup_load_sending_dtmf(char *status_string, char *dtmf_num); +void _vcui_view_popup_unload_progress(vcui_app_call_data_t *ad); +void _vcui_view_popup_load_progress(char *display_string); +void _vcui_view_popup_load_snd_path(void *data); +void _vcui_view_create_ticker_noti(char *ticker_msg); +void _vcui_view_popup_load_share(void *data); +void _vcui_view_load_send_dtmf_popup_with_buttons(char *status_string, char *dtmf_num); + +void _vcui_view_popup_second_mtcall_load(char *title_text, int unhold_call_count, int hold_call_count); +void _vcui_view_popup_second_mtcall_unload(void *data); +void _vcui_view_set_second_mtcall_popup_data(void *p_popup_data); +void *_vcui_view_get_second_mtcall_popup_data(void); +void _vcui_view_popup_load_more_option(void *data); + +void _vcui_view_load_popup_flight_mode(Evas_Smart_Cb callback_fn); +void _vcui_view_load_popup_checking(char *status_string); +#endif + diff --git a/ui/src/include/vcui-view-quickpanel.h b/ui/src/include/vcui-view-quickpanel.h new file mode 100755 index 0000000..cbc5dcd --- /dev/null +++ b/ui/src/include/vcui-view-quickpanel.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VCUI_VIEW_QUICKPANEL_H_ +#define __VCUI_VIEW_QUICKPANEL_H_ + +voice_call_view_data_t *_vcui_view_qp_new(vcui_app_call_data_t * ad); +void _vcui_view_qp_update_text_status(voice_call_view_data_t *vd, char *txt_status); +void _vc_ui_view_qp_set_call_timer(Evas_Object *qp_layout, char *pcall_timer); +void _vcui_view_qp_install_window(voice_call_view_data_t *vd); +void _vcui_view_qp_uninstall_window(voice_call_view_data_t *vd); + +#endif /*__VCUI_VIEW_QUICKPANEL_H_*/ diff --git a/ui/src/include/vcui-view-single-call.h b/ui/src/include/vcui-view-single-call.h new file mode 100755 index 0000000..9d21a84 --- /dev/null +++ b/ui/src/include/vcui-view-single-call.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VCUI_VIEW_SINGLE_CALL_H_ +#define _VCUI_VIEW_SINGLE_CALL_H_ + + +voice_call_view_data_t *_vc_ui_view_single_call_new(vcui_app_call_data_t *ad); +int _vc_ui_view_single_call_check_valid_eo(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_single_call_get_layout(voice_call_view_data_t *vd); +Evas_Object *_vc_ui_view_single_call_get_button_layout(voice_call_view_data_t *vd); +int _vc_ui_view_single_call_get_call_status(voice_call_view_data_t *vd); +void _vc_ui_view_single_call_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur); +Evas_Object *_vc_ui_view_single_call_get_caller_info(voice_call_view_data_t *vd); + +#endif + diff --git a/ui/src/vcui-app-window.c b/ui/src/vcui-app-window.c new file mode 100755 index 0000000..d2a076e --- /dev/null +++ b/ui/src/vcui-app-window.c @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "vcui-app-window.h" +#include "vcui-view-quickpanel.h" + +static Eina_Bool __vcui_app_win_focus_in_cb(void *data, int type, void *event); +static Eina_Bool __vcui_app_win_focus_out_cb(void *data, int type, void *event); +static void __vcui_app_win_main_win_del_cb(void *data, Evas_Object *obj, void *event); +static Eina_Bool __vcui_app_win_hard_key_down_cb(void *data, int type, void *event); +static Eina_Bool __vcui_app_win_hard_key_up_cb(void *data, int type, void *event); +static Eina_Bool __vcui_app_win_mouse_down_cb(void *data, int type, void *event); +static Eina_Bool __vcui_app_win_volup_key_longpress_timer_cb(void *data); +static Eina_Bool __vcui_app_win_voldown_key_longpress_timer_cb(void *data); + +Evas_Object *_vcui_app_win_create_main(vcui_app_call_data_t *ad, const char *name) +{ + Evas_Object *eo = NULL;; + Evas_Object *conform = NULL; + + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + if (eo) { + elm_win_title_set(eo, name); + evas_object_smart_callback_add(eo, "delete,request", __vcui_app_win_main_win_del_cb, NULL); + system_info_get_value_int(SYSTEM_INFO_KEY_SCREEN_WIDTH, &ad->root_w); + system_info_get_value_int(SYSTEM_INFO_KEY_SCREEN_HEIGHT, &ad->root_h); + evas_object_resize(eo, ad->root_w, ad->root_h); + elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW); + conform = elm_conformant_add(eo); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(eo, conform); + evas_object_show(conform); + ad->win_conformant = conform; + } + + return eo; +} + +static Eina_Bool __vcui_app_win_focus_in_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + Ecore_X_Event_Window_Focus_In *ev = (Ecore_X_Event_Window_Focus_In *)event; + + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "ad == NULL"); + return ECORE_CALLBACK_CANCEL; + } + + if (ad->win_main!= NULL && ev->win == elm_win_xwindow_get(ad->win_main)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Uninstall quick-panel view"); + _vcui_view_qp_uninstall_window(ad->view_st[VIEW_QUICKPANEL_VIEW]); + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "__win_focus_in_cb leave"); + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool __vcui_app_win_focus_out_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + Ecore_X_Event_Window_Focus_Out *ev = (Ecore_X_Event_Window_Focus_Out *)event; + + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "ad == NULL"); + return ECORE_CALLBACK_CANCEL; + } + + if (ad->win_main != NULL && ev->win == elm_win_xwindow_get(ad->win_main)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "install quick-panel view"); + _vcui_view_qp_install_window(ad->view_st[VIEW_QUICKPANEL_VIEW]); + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "__win_focus_out_cb leave"); + + return ECORE_CALLBACK_PASS_ON; +} + +static void __vcui_app_win_main_win_del_cb(void *data, Evas_Object *obj, void *event) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + elm_exit(); +} + +static Eina_Bool __vcui_app_win_hard_key_down_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + Ecore_Event_Key *ev = event; + + retvm_if(ev == NULL, 0, "ERROR!!! ========= Event is NULL!!!"); + + if (ad->view_top == -1) { + CALL_UI_DEBUG(VC_LOG_WARN, "ad->view_top is -1."); +#ifdef SEND_END_TO_UG + if ((ad->contact_ug != NULL) && (!strcmp(ev->keyname, KEY_END))) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "send end key to contact ug."); + ug_send_key_event(UG_KEY_EVENT_END); + } +#endif + return EINA_FALSE; + } + + if (!strcmp(ev->keyname, KEY_VOLUMEUP)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[KEY]KEY_VOLUMEUP pressed"); + if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + vcall_engine_mute_alert(); + ad->bmute_ringtone = EINA_TRUE; + } else { + ad->vol_longpress_cnt = 0; + vcall_engine_device_control_lcd_state(VC_LCD_ON); + { + _vcui_set_volume(VAL_VOL_UP); + ad->volup_key_longpress_timer = ecore_timer_add(VOLUME_KEY_LONG_PRESS_TIMEOUT, __vcui_app_win_volup_key_longpress_timer_cb, ad); + } + } + } else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[KEY]KEY_VOLUMEDOWN pressed"); + if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + vcall_engine_mute_alert(); + ad->bmute_ringtone = EINA_TRUE; + } else { + ad->vol_longpress_cnt = 0; + vcall_engine_device_control_lcd_state(VC_LCD_ON); + { + _vcui_set_volume(VAL_VOL_DOWN); + ad->voldown_key_longpress_timer = ecore_timer_add(VOLUME_KEY_LONG_PRESS_TIMEOUT, __vcui_app_win_voldown_key_longpress_timer_cb, ad); + } + } + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "End.."); + return EINA_FALSE; +} + +static Eina_Bool __vcui_app_win_hard_key_up_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + gboolean bpowerkey_enabled = EINA_FALSE; + gboolean banswering_enabled = EINA_FALSE; + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + Ecore_Event_Key *ev = event; + + retvm_if(ev == NULL, 0, "ERROR!!! ========= Event is NULL!!!"); + + if (!strcmp(ev->keyname, KEY_POWER)) { + bpowerkey_enabled = _vcui_is_powerkey_mode_on(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[KEY]KEY_POWER pressed, bpowerkey_enabled(%d)", bpowerkey_enabled); + if (bpowerkey_enabled == EINA_TRUE) { + if (ad->view_st[ad->view_top]->type == VIEW_DIALLING_VIEW) { + if (ad->ball_view_hide) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "VCUI_RQST_REDIAL_STOP !!"); + vcall_engine_process_auto_redial(EINA_FALSE); + elm_exit(); + } else { + vcall_engine_cancel_call(); + } + } else if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + vcall_engine_reject_call(); + } else if ((ad->view_st[ad->view_top]->type >= VIEW_INCALL_ONECALL_VIEW) + && (ad->view_st[ad->view_top]->type <= VIEW_INCALL_MULTICALL_LIST_VIEW)) { + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_CALLS); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "nothing..."); + } + } + } else if (0 == strcmp(ev->keyname, KEY_VOLUMEDOWN)) { + if (ad->ringtone_longpress_mute_timer) { + ecore_timer_del(ad->ringtone_longpress_mute_timer); + ad->ringtone_longpress_mute_timer = NULL; + } + } else if (!strcmp(ev->keyname, KEY_SELECT)) { + banswering_enabled = _vcui_is_answering_mode_on(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[KEY]KEY_SELECT pressed"); + if (banswering_enabled == EINA_TRUE) { + if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + int unhold_call_count = _vcui_doc_get_unhold_call_data_count(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "Answering mode on and Home key pressed on MT screen"); + + if (_vcui_is_phonelock_status() == EINA_FALSE) { + vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + } + + if (unhold_call_count == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "No Call Or Held call - Accept"); + vcall_engine_answer_call(); + } else { + int hold_call_count = _vcui_doc_get_hold_call_data_count(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "Show popup - 2nd MT call - test volume popup"); + _vcui_view_popup_second_mtcall_load(_("IDS_CALL_HEADER_ACCEPT_CALL_AFTER"), unhold_call_count, hold_call_count); + } + } + } + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + return EINA_FALSE; +} + +static Eina_Bool __vcui_app_win_mouse_down_cb(void *data, int type, void *event) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + Ecore_Event_Mouse_Button *ev = event; + + ad->touch_x = ev->x; + ad->touch_y = ev->y; + return EINA_FALSE; +} + +void _vcui_app_win_key_grab(vcui_app_call_data_t *ad) +{ + int result = 0; + CALL_UI_KPI("_vcui_app_win_key_grab start"); + + /* Key Grab */ + ad->disp = ecore_x_display_get(); + ad->win = elm_win_xwindow_get(ad->win_main); + + result = utilx_grab_key(ad->disp, ad->win, KEY_VOLUMEUP, EXCLUSIVE_GRAB); + if (result) + CALL_UI_DEBUG(VC_LOG_WARN, "KEY_VOLUMEUP key grab failed"); + + result = utilx_grab_key(ad->disp, ad->win, KEY_VOLUMEDOWN, EXCLUSIVE_GRAB); + if (result) + CALL_UI_DEBUG(VC_LOG_WARN, "KEY_VOLUMEDOWN key grab failed"); + + if (ad->downkey_handler == NULL) + ad->downkey_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __vcui_app_win_hard_key_down_cb, ad); + if (ad->upkey_handler == NULL) + ad->upkey_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __vcui_app_win_hard_key_up_cb, ad); + if (ad->mouse_evnt_handler == NULL) + ad->mouse_evnt_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __vcui_app_win_mouse_down_cb, ad); /*for ctxpopup */ + if (ad->focus_in == NULL) + ad->focus_in = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, __vcui_app_win_focus_in_cb, ad); + if (ad->focus_out == NULL) + ad->focus_out = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, __vcui_app_win_focus_out_cb, ad); + + CALL_UI_KPI("_vcui_app_win_key_grab done"); +} + +static Eina_Bool __vcui_app_win_volup_key_longpress_timer_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + if ((ad->ringtone_val == RINGTONE_MAX) || (ad->bmute_ringtone == EINA_TRUE)) { + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else if (ad->headset_status == EINA_TRUE) { + if (ad->bt_vol_val == BT_VOL_MAX) { + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else { + if (ad->voice_vol_val == VOICE_VOL_MAX) { + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } + + ad->vol_longpress_cnt++; + + if ((ad->vol_longpress_cnt % 3) == 0) { + _vcui_set_volume(VAL_VOL_UP); + } + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __vcui_app_win_voldown_key_longpress_timer_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + if ((ad->ringtone_val == RINGTONE_MAX) || (ad->bmute_ringtone == EINA_TRUE)) { + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else if (ad->headset_status == EINA_TRUE) { + if (ad->bt_vol_val == BT_VOL_MIN) { + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } else { + if (ad->voice_vol_val == VOICE_VOL_MIN) { + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; + } + } + + ad->vol_longpress_cnt++; + + if ((ad->vol_longpress_cnt % 3) == 0) { + _vcui_set_volume(VAL_VOL_DOWN); + } + + return ECORE_CALLBACK_RENEW; +} + +void _vcui_app_win_set_noti_type(int bwin_noti) +{ + Ecore_X_Window xwin; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + /* Get x-window */ + xwin = elm_win_xwindow_get(ad->win_main); + + if (bwin_noti == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "window type: NORMAL"); + /* Set Normal window */ + ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NORMAL); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "window type: NOTI-HIGH"); + /* Set Notification window */ + ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION); + /* Set Notification's priority to LEVEL_HIGH */ + utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_HIGH); + } + return; +} diff --git a/ui/src/vcui-application.c b/ui/src/vcui-application.c new file mode 100755 index 0000000..81b49f8 --- /dev/null +++ b/ui/src/vcui-application.c @@ -0,0 +1,2651 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-app-window.h" +#include "vcui-app-data.h" +#include "vcui-document.h" + +#include "vcui-view-dialing.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-keypad.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-callend.h" +#include "vcui-view-quickpanel.h" +#include "vcui-view-popup.h" +#include +#ifdef SIGNAL_HANDLER +#include +#endif +#include "appsvc.h" +#include "voice-call-engine.h" +#include +#include + +static vcui_app_call_data_t global_ad; + +#ifdef SIGNAL_HANDLER +#define VCUI_SIG_NUM 12 +static struct sigaction vcui_app_sigact; +static struct sigaction vcui_app_sigoldact[VCUI_SIG_NUM]; +static int vcui_app_sig_to_handle[] = { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGQUIT, SIGSEGV, SIGSYS, SIGTRAP, SIGXCPU, SIGXFSZ, SIGTERM, SIGPIPE }; +#endif + +static gboolean g_avoid_multi_setup = EINA_FALSE; +static Eina_Bool __vcui_avoid_multi_setup_timer_cb(void *data); +static void __vcui_app_fm_popup_button_press_cb(void *data, Evas_Object *obj, void *event_info); +static Eina_Bool __vcui_flight_mode_checking_idler_cb(void *data); +static Eina_Bool __vcui_flight_mode_enabled_check_timer_cb(void *data); + +#define CISS_AUL_CMD "org.tizen.ciss" +#define CISS_MODE_OPT "REQ" +#define __VCUI_NOTIFICATION_CALL_GROUP_ID 1001 + +/* For Debug Information, Call Event name string constant */ +static char *gszcall_callback_msg[VC_ENGINE_MSG_MAX_TO_UI] = { + "VC_ENGINE_MSG_INCOM_TO_UI", + "VC_ENGINE_MSG_OUTGOING_TO_UI", + "VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI", + "VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI_TEST", + "VC_ENGINE_MSG_OUTGOING_ALERT_TO_UI", + "VC_ENGINE_MSG_CONNECTED_TO_UI", + "VC_ENGINE_MSG_NORMAL_END_TO_UI", + "VC_ENGINE_MSG_INCOM_END_TO_UI", + "VC_ENGINE_MSG_REJECTED_END_TO_UI", + "VC_ENGINE_MSG_OUTGOING_END_TO_UI", + "VC_ENGINE_MSG_OUTGOING_END_SIGNAL_PLAY_TO_UI", + "VC_ENGINE_MSG_OUTGOING_ABORTED_TO_UI", + "VC_ENGINE_MSG_OUTGOING_END_UI_DESTROY", + "VC_ENGINE_MSG_DTMF_ACK_TO_UI", + + "VC_ENGINE_MSG_SS_HELD_TO_UI", + "VC_ENGINE_MSG_SS_RETREIVED_TO_UI", + "VC_ENGINE_MSG_SS_SWAP_TO_UI", + "VC_ENGINE_MSG_SS_SETUP_CONF_TO_UI", + "VC_ENGINE_MSG_SS_SPLIT_CONF_TO_UI", + "VC_ENGINE_MSG_SS_TRANSFERRED_TO_UI", + "VC_ENGINE_MSG_SS_CONNECT_LINE_IND_TO_UI", + + "VC_ENGINE_MSG_IND_FORWARD_TO_UI", + "VC_ENGINE_MSG_IND_ACTIVATE_TO_UI", + "VC_ENGINE_MSG_IND_HOLD_TO_UI", + "VC_ENGINE_MSG_IND_TRANSFER_TO_UI", + "VC_ENGINE_MSG_IND_SETUPCONFERENCE_TO_UI", + "VC_ENGINE_MSG_IND_BARRING_TO_UI", + "VC_ENGINE_MSG_IND_WAITING_TO_UI", + "VC_ENGINE_MSG_IND_CUGINFO_TO_UI", + "VC_ENGINE_MSG_IND_SSNOTIFY_TO_UI", + "VC_ENGINE_MSG_IND_CALLINGNAMEINFO_TO_UI", + "VC_ENGINE_MSG_IND_REDIRECT_CNF_TO_UI", + "VC_ENGINE_MSG_IND_ACTIVATECCBS_CNF_TO_UI", + "VC_ENGINE_MSG_IND_ACTIVATECCBS_USERINFO_TO_UI", + "VC_ENGINE_MSG_IND_AOC_TO_UI", + + "VC_ENGINE_MSG_ERROR_OCCURED_TO_UI", + + "VC_ENGINE_MSG_ACTION_INCOM_FORCE_TO_UI", + "VC_ENGINE_MSG_ACTION_SAT_REQUEST_TO_UI", + "VC_ENGINE_MSG_ACTION_SAT_RESPONSE_TO_UI", + "VC_ENGINE_MSG_ACTION_CALL_END_HELD_RETREIVED_TO_UI", + "VC_ENGINE_MSG_ACTION_NO_ACTIVE_TASK_TO_UI", + + "VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI", + "VC_ENGINE_MSG_SET_VOLUME_FROM_BT_TO_UI", + "VC_ENGINE_MSG_HEADSET_STATUS_TO_UI", + "VC_ENGINE_MSG_EARJACK_STATUS_TO_UI", + + "VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI", + "VC_ENGINE_MSG_MESSAGE_BOX_TO_UI", + + "VC_ENGINE_MSG_REDIAL_TO_UI", + "VC_ENGINE_MSG_CREATE_NEWVOICEFILE_TO_UI", +}; + +static char *gszcall_error_msg[IDS_CALL_MAX] = { + "IDS_CALL_POP_CALL_IS_DIVERTED", + "IDS_CALL_POP_CALLFAILED", + "IDS_CALL_POP_CALLING_EMERG_ONLY", + "IDS_CALL_POP_CALLNOTCALLOWED", + "IDS_CALL_POP_CAUSE_WRONG_NUMBER", + "IDS_CALL_POP_CHANGEOFFLINEMODETOCALL", + "IDS_CALL_POP_DTMFSENDING_FAIL", + "IDS_CALL_POP_FDNCALLONLY", + "IDS_CALL_POP_HOLD_FAILED", + "IDS_CALL_POP_HOLD_NOT_SUPPORTED", + "IDS_CALL_POP_INCOMPLETE", + "IDS_CALL_POP_JOIN_FAILED", + "IDS_CALL_POP_JOIN_NOT_SUPPORTED", + "IDS_CALL_POP_OPERATION_REFUSED", + "IDS_CALL_POP_PHONE_NOT_INITIALISED", + "IDS_CALL_POP_REJECTED", + "IDS_CALL_POP_SENDING", + "IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE", + "IDS_CALL_POP_SPLIT_FAILED", + "IDS_CALL_POP_SPLIT_NOT_SUPPORTED", + "IDS_CALL_POP_SWAP_FAILED", + "IDS_CALL_POP_SWAP_NOT_SUPPORTED", + "IDS_CALL_POP_TRANSFER_FAILED", + "IDS_CALL_POP_TRANSFER_NOT_SUPPORTED", + "IDS_CALL_POP_UNABLE_TO_RETRIEVE", + "IDS_CALL_POP_UNAVAILABLE", + "IDS_CALL_POP_UNHOLD_NOT_SUPPORTED", + "IDS_CALL_POP_VOICE_CALL_IS_NOT_ALLOWED_DURING_VIDEO_CALL", + "IDS_CALL_POP_WAITING_ACTIVE", + "IDS_CALL_BODY_CALLENDED", + "Invalid DTMF", + "Sent", + "IDS_COM_BODY_VOICE_SERVICES_BLOCKED", + "", + "Flight mode is not disabled.", + "Disabling flight mode", +}; + +static char g_sz_error_dbg_msg[128] = {0,}; + +static int __vcui_launch_ciss(const char *number); +static void __vcui_cache_flush_set(Evas *e); +static void __vcui_init_view_register_function(vcui_app_call_data_t *app_data, vcui_app_call_view_id_t view_id, voice_call_view_data_t *(*view_new) ()); +static bool __vcui_app_create(void *data); +static void __vcui_app_pause(void *data); +static void __vcui_app_resume(void *data); +static void __vcui_app_terminate(void *data); +static void __vcui_fade_out_cb_routine(void); +static void __vcui_lang_changed_cb(void *data); +static void __vcui_low_mem_cb(void *data); +static void __vcui_low_bat_cb(void *data); +static void __vcui_rotate_cb(app_device_orientation_e rotate_mode, void *data); +static void __vcui_init(vcui_app_call_data_t *ad); +static void __vcui_app_callback(int event, void *pdata, void *puser_data); + +#ifdef SIGNAL_HANDLER +/** +* This function serves as the signal handler function for the SIGSEGV Signal +* +* @return nothing +* @param[in] signal_no Signal Number +* @param[in] signal_info Information associated with the generated signal +* @param[in] signal_context Signal Context Info +*/ +static void __vcui_exit_handler(void) +{ + printf("\n __vcui_app_exit_handler\n"); + /*syslog (LOG_INFO, "[VOICE-CALL] __vcui_app_exit_handler\n"); */ +} + +/** +* This function serves as the signal handler function for the SIGSEGV Signal +* +* @return nothing +* @param[in] signal_no Signal Number +* @param[in] signal_info Information associated with the generated signal +* @param[in] signal_context Signal Context Info +*/ +static void __vcui_sigsegv_handler(int signal_no) +{ + int i = 0; + + CALL_UI_DEBUG(VC_LOG_ERR, "SISEGV Received, Signal Number: :%d \n", signal_no); + + vcall_engine_force_reset(); + __vcui_fade_out_cb_routine(); + + for (i = 0; i < VCUI_SIG_NUM; i++) { + sigaction(vcui_app_sig_to_handle[i], &(vcui_app_sigoldact[i]), NULL); + } + + raise(signal_no); /*raise signal intentionally (pass the same signal) */ +} + +/** +* This function registers a user space signal handler for the signal SIGSEGV (Signal #11) +* +* @return nothing +*/ +static void __vcui_register_sigsegv_handler() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + int i = 0; + vcui_app_sigact.sa_flags = SA_NOCLDSTOP; + vcui_app_sigact.sa_handler = (void *)__vcui_sigsegv_handler; + sigemptyset(&vcui_app_sigact.sa_mask); + + for (; i < VCUI_SIG_NUM; i++) { + sigaction(vcui_app_sig_to_handle[i], &vcui_app_sigact, &(vcui_app_sigoldact[i])); + } + +} +#endif + +static int __vcui_launch_ciss(const char *number) +{ + bundle *kb; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "number(%s)"); + kb = bundle_create(); + bundle_add(kb, "CISS_LAUNCHING_MODE", CISS_MODE_OPT); + bundle_add(kb, "CISS_REQ_STRING", number); + aul_launch_app(CISS_AUL_CMD, kb); + bundle_free(kb); + return VC_NO_ERROR; +} + +const char *_vcui_convert_service_error(int err) +{ + memset(&g_sz_error_dbg_msg, 0, sizeof(g_sz_error_dbg_msg)); + switch(err) + { + case SERVICE_ERROR_NONE: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Successful"); + break; + case SERVICE_ERROR_INVALID_PARAMETER: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Invalid parameter"); + break; + case SERVICE_ERROR_OUT_OF_MEMORY: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Out of memory"); + break; + case SERVICE_ERROR_APP_NOT_FOUND: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "The application was not found"); + break; + case SERVICE_ERROR_KEY_NOT_FOUND: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Specified key not found"); + break; + case SERVICE_ERROR_KEY_REJECTED: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Not available key"); + break; + case SERVICE_ERROR_INVALID_DATA_TYPE: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Invalid data type"); + break; + default: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "Unknow Error : %d(0x%08x)", err, err); + break; + } + return g_sz_error_dbg_msg; +} + +const char *_vcui_convert_alarm_error(int err) +{ + memset(&g_sz_error_dbg_msg, 0, sizeof(g_sz_error_dbg_msg)); + switch(err) + { + case ALARM_ERROR_NONE: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Successful"); + break; + case ALARM_ERROR_INVALID_PARAMETER: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Invalid parameter"); + break; + case ALARM_ERROR_INVALID_TIME: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Invalid time"); + break; + case ALARM_ERROR_INVALID_DATE : + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Invalid date"); + break; + case ALARM_ERROR_CONNECTION_FAIL: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "The alarm service connection failed"); + break; + case ALARM_ERROR_OUT_OF_MEMORY : + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "%s", "Out of memory"); + break; + default: + g_snprintf(g_sz_error_dbg_msg, sizeof(g_sz_error_dbg_msg), "Unknow Error : %d(0x%08x)", err, err); + break; + } + return g_sz_error_dbg_msg; +} + +static void __vcui_app_lcd_status_cb(power_state_e state, void* user_data) +{ + vcui_app_call_data_t *ad = user_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + int result = 0; + + if (state == POWER_STATE_SCREEN_OFF) { + result = utilx_grab_key(ad->disp, ad->win, KEY_SELECT, TOP_POSITION_GRAB); + if (result) { + CALL_UI_DEBUG(VC_LOG_ERR, "KEY_SELECT key grab failed"); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "KEY_SELECT key grab success"); + } + } else { + result = utilx_ungrab_key(ad->disp, ad->win, KEY_SELECT); + if (result) { + CALL_UI_DEBUG(VC_LOG_ERR, "KEY_SELECT key ungrab failed"); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "KEY_SELECT key ungrab success"); + } + } +} + +static bool __vcui_app_create(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_app_create().."); + CALL_UI_KPI("__vcui_app_create start"); + vcui_app_call_data_t *ad = data; + int ret = 0; + + CALL_UI_KPI("__vcui_init start"); + __vcui_init(ad); + CALL_UI_KPI("__vcui_init done"); + + elm_theme_extension_add(NULL, CALL_THEME); + + CALL_UI_KPI("_vcui_app_win_create_main start"); + ad->win_main = (Evas_Object *)_vcui_app_win_create_main(ad, PACKAGE); + CALL_UI_KPI("_vcui_app_win_create_main done"); + if (ad->win_main == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "ERROR"); + return EINA_FALSE; + } + + UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE); + + __vcui_hide_main_ui_set_flag(); + + ad->evas = evas_object_evas_get(ad->win_main); + ad->scale_factor = elm_config_scale_get(); + + __vcui_cache_flush_set(ad->evas); + + ecore_init(); + ecore_x_init(NULL); + _vcui_app_win_key_grab(ad); + + _vcui_view_common_timer_text_init(); + + _vcui_app_win_set_noti_type(EINA_TRUE); + +#ifdef SIGNAL_HANDLER + __vcui_register_sigsegv_handler(); + atexit(__vcui_exit_handler); +#endif + + ret = power_set_changed_cb (__vcui_app_lcd_status_cb, ad); + + if (ret != POWER_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "power_set_changed_cb fail"); + return EINA_FALSE; + } + + sysman_inform_active(getpid()); /* Set oom_adj*/ + CALL_UI_KPI("__vcui_app_create done"); + return EINA_TRUE; +} + +static void __vcui_app_pause(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_app_pause().."); +} + +static void __vcui_app_service(service_h service, void *user_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + CALL_UI_KPI("__call_eq_app_service start"); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)user_data; + + char *launch_type = NULL; + char *tmp = NULL; + char *uri_bundle = NULL; + char *telnum = NULL; + int ret = 0; + + ret = service_clone(&(ad->service_handle), service); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "service_clone failed, [%d]", ret); + goto EXIT; + } + + ret = service_get_uri(ad->service_handle, &uri_bundle); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "service_get_uri failed, [%d]", ret); + } + + if (uri_bundle != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "tmp: [%s]", uri_bundle); + if ((strncmp(uri_bundle, "tel:MT", 6) == 0)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "It is incoming call type"); + } else if (strncmp(uri_bundle, "tel:", 4) == 0) { + telnum = (char *)uri_bundle + 4; + CALL_UI_DEBUG(VC_LOG_DEBUG, "number: [%s]", telnum); + + ret = service_get_extra_data(ad->service_handle, "calltype", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "calltype: [%s]", tmp); + if (!strncmp(tmp, "EMERGENCY", 9)) { + vcui_call_ecc_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", telnum); + vcall_engine_process_emergency_call(call_data.call_number); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "wrong calltype!"); + goto EXIT; + } + } else { + vcui_call_mo_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", telnum); + + ret = service_get_extra_data(ad->service_handle, "ctindex", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ctindex: [%s]", tmp); + call_data.ct_index = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + call_data.ct_index = -1; + } + + if ((vcall_engine_check_incall_ss_string(call_data.call_number) == EINA_TRUE) && (_vcui_doc_get_all_call_data_count() >= 1)) { + vcall_engine_process_incall_ss(call_data.call_number); + _vcui_view_auto_change(); + } else if (vcall_engine_check_ss_string(call_data.call_number) == EINA_TRUE) { +#if 0 /* CISS is not installed */ + __vcui_launch_ciss(call_data.call_number); + if (_vcui_doc_get_all_call_data_count() == 0) { + goto EXIT; + } +#else + _vcui_view_popup_load(_("IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE"), POPUP_TIMEOUT_LONG, EINA_TRUE); +#endif + } else { + vcall_engine_process_normal_call(call_data.call_number, call_data.ct_index, EINA_FALSE); + } + } + + goto RELEASE; + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "wrong type!"); + goto EXIT; + } + } + + /* URI is NULL.. Need to care the AUL call */ + ret = service_get_extra_data(ad->service_handle, "launch-type", &launch_type); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + + if (launch_type != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "launch type: [%s]", launch_type); + if (!strncmp(launch_type, "MO", 2)) { + + if (g_avoid_multi_setup == EINA_TRUE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Avoid multi touch setup"); + + goto RELEASE; + } + + ecore_timer_add(3.5, __vcui_avoid_multi_setup_timer_cb, ad); + g_avoid_multi_setup = EINA_TRUE; + + vcui_call_mo_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + + ret = service_get_extra_data(ad->service_handle, "number", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "number: [%s]", tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tmp); + + ret = service_get_extra_data(ad->service_handle, "ctindex", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ctindex: [%s]", tmp); + call_data.ct_index = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + call_data.ct_index = -1; + } + + if ((vcall_engine_check_incall_ss_string(call_data.call_number) == EINA_TRUE) && (_vcui_doc_get_all_call_data_count() >= 1)) { + vcall_engine_process_incall_ss(call_data.call_number); + _vcui_view_auto_change(); + } else if (vcall_engine_check_ss_string(call_data.call_number) == EINA_TRUE) { +#if 0 /* CISS is not installed */ + __vcui_launch_ciss(call_data.call_number); + if (_vcui_doc_get_all_call_data_count() == 0) { + goto EXIT; + } +#else + _vcui_view_popup_load(_("IDS_CALL_POP_SOS_CALL_ONLY_IN_NO_SIM_MODE"), POPUP_TIMEOUT_LONG, EINA_TRUE); +#endif + } else { + vcall_engine_process_normal_call(call_data.call_number, call_data.ct_index, EINA_FALSE); + } + } else if (!strncmp(launch_type, "MT", 2)) { + vcui_call_mt_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + + ret = service_get_extra_data(ad->service_handle, "handle", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "handle: [%s]", tmp); + call_data.call_handle = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + ret = service_get_extra_data(ad->service_handle, "calltype", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "calltype: [%s]", tmp); + call_data.call_type = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "calltype is NULL but NOT mendatory"); + call_data.call_type = 0; + } + + ret = service_get_extra_data(ad->service_handle, "cliindicator", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "cliindicator: [%s]", tmp); + call_data.cli_presentation_indicator = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "cliindicator is NULL but NOT mendatory"); + call_data.cli_presentation_indicator = 0; + } + + ret = service_get_extra_data(ad->service_handle, "number", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "number: [%s]", tmp); + vcall_engine_util_strcpy(call_data.call_num, VC_PHONE_NUMBER_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + /*return VC_NO_ERROR; *//*check clir mt call. */ + } + + ret = service_get_extra_data(ad->service_handle, "name_mode", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "name_mode: [%s]", tmp); + call_data.calling_name_mode = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "name_mode is NULL but NOT mendatory"); + call_data.calling_name_mode = -1; + } + + ret = service_get_extra_data(ad->service_handle, "name", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "name: [%s]", tmp); + vcall_engine_util_strcpy(call_data.calling_name, VC_PHONE_NAME_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL but NOT mendatory"); + } + + ret = service_get_extra_data(ad->service_handle, "rdnumber", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "rdnumber: [%s]", tmp); + vcall_engine_util_strcpy(call_data.redirected_number, VC_PHONE_NUMBER_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL but NOT mendatory"); + } + + ret = service_get_extra_data(ad->service_handle, "rdsubaddress", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "rdnumber: [%s]", tmp); + vcall_engine_util_strcpy(call_data.redirected_sub_address, VC_PHONE_SUBADDRESS_LENGTH_MAX, tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL but NOT mendatory"); + } + + ret = service_get_extra_data(ad->service_handle, "clicause", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "clicause: [%s]", tmp); + call_data.cli_cause = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + ret = service_get_extra_data(ad->service_handle, "fwded", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "fwded: [%s]", tmp); + call_data.bfwded = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + ret = service_get_extra_data(ad->service_handle, "activeline", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "activeline: [%s]", tmp); + call_data.active_line = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + vcall_engine_incoming_info_t mtcall_info; + + mtcall_info.call_handle = call_data.call_handle; + mtcall_info.call_type = call_data.call_type; + mtcall_info.cli_presentation_indicator = call_data.cli_presentation_indicator; + vcall_engine_util_strcpy(mtcall_info.call_num, sizeof(mtcall_info.call_num), call_data.call_num); + mtcall_info.calling_name_mode = call_data.calling_name_mode; + vcall_engine_util_strcpy(mtcall_info.calling_name, sizeof(mtcall_info.calling_name), call_data.calling_name); + vcall_engine_util_strcpy(mtcall_info.redirected_number, sizeof(mtcall_info.redirected_number), call_data.redirected_number); + vcall_engine_util_strcpy(mtcall_info.redirected_sub_address, sizeof(mtcall_info.redirected_sub_address), call_data.redirected_sub_address); + mtcall_info.cli_cause = call_data.cli_cause; + mtcall_info.bfwded = call_data.bfwded; + mtcall_info.active_line = call_data.active_line; + + vcall_engine_process_incoming_call(&mtcall_info); + } else if (!strncmp(launch_type, "EMERGENCY", 9)) { + vcui_call_ecc_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + + ret = service_get_extra_data(ad->service_handle, "number", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "number: [%s]", tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + } + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tmp); + vcall_engine_process_emergency_call(call_data.call_number); + } else if (!strncmp(launch_type, "SATSETUPCALL", 12)) { + vcui_call_sat_data_t sat_setup_call_info; + memset(&sat_setup_call_info, 0, sizeof(sat_setup_call_info)); + + ret = service_get_extra_data(ad->service_handle, "cmd_id", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "cmd_id: [%s]", tmp); + sat_setup_call_info.command_id = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + ret = service_get_extra_data(ad->service_handle, "cmd_qual", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "cmd_qual: [%s]", tmp); + sat_setup_call_info.command_qualifier = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + ret = service_get_extra_data(ad->service_handle, "disp_text", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "disp_text: [%s]", tmp); + vcall_engine_util_strcpy(sat_setup_call_info.disp_text, sizeof(sat_setup_call_info.disp_text), tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + } + + ret = service_get_extra_data(ad->service_handle, "call_num", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call_num: [%s]", tmp); + vcall_engine_util_strcpy(sat_setup_call_info.call_num, sizeof(sat_setup_call_info.call_num), tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + ret = service_get_extra_data(ad->service_handle, "dur", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + goto EXIT; + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "dur: [%s]", tmp); + sat_setup_call_info.duration = atoi(tmp); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "bundle val is NULL"); + goto EXIT; + } + + vcall_engine_sat_setup_call_info_t sat_setup_data; + memset(&sat_setup_data, 0, sizeof(sat_setup_data)); + sat_setup_data.command_id = sat_setup_call_info.command_id; + sat_setup_data.command_qualifier = sat_setup_call_info.command_qualifier; + sat_setup_data.duration = sat_setup_call_info.duration; + memcpy(sat_setup_data.disp_text, sat_setup_call_info.disp_text, sizeof(sat_setup_data.disp_text)); + memcpy(sat_setup_data.call_num, sat_setup_call_info.call_num, VC_PHONE_NUMBER_LENGTH_MAX); + + vcall_engine_process_sat_setup_call(&sat_setup_data); + } else if (!strncmp(launch_type, "ECCTEST", 7)) { + vcui_call_ecc_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + vcall_engine_process_emergency_call_test(call_data.call_number); + } else if (!strncmp(launch_type, "DOWNLOADCALL", 12)) { + vcui_call_mo_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + + ret = service_get_extra_data(ad->service_handle, "number", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "number: [%s]", tmp); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + } + + if (tmp != NULL) { + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tmp); + } else { + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", "116"); + } + vcall_engine_util_strcpy(call_data.call_number, sizeof(call_data.call_number), tmp); + vcall_engine_process_normal_call(call_data.call_number, call_data.ct_index, EINA_TRUE); + } else if (!strncmp(launch_type, "CALL_COMMAND", 12)) { + vcui_call_mo_data_t call_data; + memset(&call_data, 0, sizeof(call_data)); + + ret = service_get_extra_data(ad->service_handle, "value", &tmp); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_get_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + if (tmp) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "number: [%s]", tmp); + if (!strncmp(tmp, "REJECT_MT", 9)) { + vcall_engine_reject_call(); + } /* If need to add more command, add here. */ + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bundle val is NULL"); + } + } else if (!strncmp(launch_type, "MIN_MINDER", 10)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "This is a minute minder alarm!"); + vcall_engine_play_minute_minder(); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "unknown launch type"); + } + CALL_UI_KPI("__vcui_app_service done"); + + goto RELEASE; + } + + goto RELEASE; + +RELEASE: + if (uri_bundle) { + free(uri_bundle); + uri_bundle = NULL; + } + + if (tmp) { + free(tmp); + tmp = NULL; + } + + if (launch_type) { + free(launch_type); + launch_type = NULL; + } + + if(ad->service_handle) + service_destroy(ad->service_handle); + ad->service_handle = NULL; + return; + +EXIT: + if (uri_bundle) { + free(uri_bundle); + uri_bundle = NULL; + } + + if (tmp) { + free(tmp); + tmp = NULL; + } + + if (launch_type) { + free(launch_type); + launch_type = NULL; + } + + if(ad->service_handle) + service_destroy(ad->service_handle); + ad->service_handle = NULL; + elm_exit(); + return; +} + +static void __vcui_app_resume(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); +} + +static void __vcui_app_terminate(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_app_terminate().."); + + if (_vcui_doc_get_all_call_data_count() >= 1) { + CALL_UI_DEBUG(VC_LOG_WARN, "WARNING!! call exists. abnormal terminate!!"); + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_CALLS); + vcall_engine_set_to_default(); + } + + vcall_engine_deinit(); + sysman_inform_inactive(getpid()); + __vcui_fade_out_cb_routine(); +} + +static void __vcui_cache_flush_set(Evas *e) +{ +#ifdef _CACHE_FLUSH_ + evas_image_cache_set(e, 4096 * 1024); + evas_font_cache_set(e, 512 * 1024); + + edje_file_cache_set(0); + edje_collection_cache_set(0); +#endif +} + +static void __vcui_init_view_register_function(vcui_app_call_data_t *app_data, vcui_app_call_view_id_t view_id, voice_call_view_data_t *(*view_new) ()) +{ + app_data->func_new[view_id] = view_new; +} + +void _vcui_response_volume(int vol_alert_type, int vol_level) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (vol_alert_type == VCUI_VOL_VOICE) { + ad->voice_vol_val = vol_level; + _vcui_set_volume(ad->vol_key_status); + } else if (vol_alert_type == VCUI_VOL_HEADSET) { + ad->bt_vol_val = vol_level; + _vcui_set_volume(ad->vol_key_status); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "ERROR"); + } +} + +void _vcui_set_volume(int key_status) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (_vcui_doc_get_all_call_data_count() == 0) { + CALL_UI_DEBUG(VC_LOG_ERR, "ignore it"); + return; + } + + if (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW) { + int err_code = 0; + int settings_sound_status = EINA_FALSE; + + err_code = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &settings_sound_status); + if (settings_sound_status == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ringtone vol is ignored in sound off status."); + return; + } + + if (ad->bmute_ringtone == EINA_TRUE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "during mute ringtone, vol will not changed"); + return; + } + + if (ad->ringtone_val < RINGTONE_MIN) { + int vol_level = vcall_engine_get_volume_level(VCALL_ENGINE_VOL_TYPE_RINGTONE); + + if ((vol_level < RINGTONE_MIN) || (vol_level > RINGTONE_MAX)) { + CALL_UI_DEBUG(VC_LOG_ERR, "ERROR : ringtone vol:[%d]", vol_level); + return; + } + ad->ringtone_val = vol_level; + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "RINGTONE : Set Volume"); + if (key_status == VAL_VOL_DOWN && ad->ringtone_val > RINGTONE_MIN) { + ad->ringtone_val--; + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_RINGTONE, ad->ringtone_val); + } else if (key_status == VAL_VOL_UP && ad->ringtone_val < RINGTONE_MAX) { + ad->ringtone_val++; + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_RINGTONE, ad->ringtone_val); + } + _vcui_view_popup_vol_ringtone(ad->ringtone_val); + } else if (ad->headset_status == EINA_TRUE) { + if (ad->bt_vol_val < BT_VOL_MIN) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "BT VOL : Get Volume"); + ad->vol_key_status = key_status; + ad->bt_vol_val = vcall_engine_get_volume_level(VCALL_ENGINE_VOL_TYPE_HEADSET); + return; + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "BT VOL : Set Volume"); + if (key_status == VAL_VOL_DOWN && ad->bt_vol_val > BT_VOL_MIN) { /*Key Down */ + ad->bt_vol_val--; + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_HEADSET, ad->bt_vol_val); + } else if (key_status == VAL_VOL_UP && ad->bt_vol_val < BT_VOL_MAX) { /*Key Up */ + ad->bt_vol_val++; + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_HEADSET, ad->bt_vol_val); + } + _vcui_view_popup_vol_bt(ad->bt_vol_val); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "TAPI VOL : Get Volume"); + ad->vol_key_status = key_status; + ad->voice_vol_val = vcall_engine_get_volume_level(VCALL_ENGINE_VOL_TYPE_VOICE); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "TAPI VOL : Set Volume"); + if (key_status == VAL_VOL_DOWN && ad->voice_vol_val > VOICE_VOL_MIN) { /*Key Down */ + ad->voice_vol_val--; + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_VOICE, ad->voice_vol_val); + } else if (key_status == VAL_VOL_UP && ad->voice_vol_val < VOICE_VOL_MAX) { /*Key Up */ + ad->voice_vol_val++; + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_VOICE, ad->voice_vol_val); + } + _vcui_view_popup_vol_voice(ad->voice_vol_val); + } + +} + +static void __vcui_fade_out_cb_routine() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (ad->child_is == 1) { + /*system("killall dialer"); */ + } + if (ad->disp && ad->win) { + utilx_ungrab_key(ad->disp, ad->win, KEY_VOLUMEUP); + utilx_ungrab_key(ad->disp, ad->win, KEY_VOLUMEDOWN); + utilx_ungrab_key(ad->disp, ad->win, KEY_SELECT); + } + + if (ad->focus_in) { + ecore_event_handler_del(ad->focus_in); + ad->focus_in = NULL; + } + if (ad->focus_out) { + ecore_event_handler_del(ad->focus_out); + ad->focus_out = NULL; + } + + _vcui_doc_remove_all_call_data(); + _vcui_view_common_timer_destroy(); +} + +static void __vcui_lang_changed_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + _vcui_view_auto_change(); + _vcui_view_quickpanel_change(); +} + +static void __vcui_low_mem_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); +} + +static void __vcui_low_bat_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); +} + +static int __vcui_get_rotate_angle(app_device_orientation_e rotate_mode) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + int rotate_angle; + + switch (rotate_mode) { + case APP_DEVICE_ORIENTATION_0: + /**< Portrait mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_0"); + rotate_angle = 0; + break; + case APP_DEVICE_ORIENTATION_180: + /**< Portrait upside down mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_180"); + rotate_angle = 180; + break; + case APP_DEVICE_ORIENTATION_270: + /**< Left handed landscape mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_270"); + rotate_angle = 270; + break; + case APP_DEVICE_ORIENTATION_90: + /**< Right handed landscape mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_90"); + rotate_angle = 90; + break; + default: + rotate_angle = -1; + break; + } + + return rotate_angle; +} + +static void __vcui_ug_handle_rotate_event(const int rotate_angle, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + switch (rotate_angle) { + case 0: + /**< Portrait mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_0"); + ug_send_event(UG_EVENT_ROTATE_PORTRAIT); + break; + case 180: + /**< Portrait upside down mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_180"); + ug_send_event(UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN); + break; + case 270: + /**< Left handed landscape mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_270"); + ug_send_event(UG_EVENT_ROTATE_LANDSCAPE); + break; + case 90: + /**< Right handed landscape mode */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate mode is APP_DEVICE_ORIENTATION_90"); + ug_send_event(UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN); + break; + default: + break; + } + if ((rotate_angle >= 0) + && (ad->contact_ug == NULL)) { + elm_win_rotation_with_resize_set(ad->win_main, rotate_angle); + } +} + +#ifdef __LANDSCAPE_MODE_ +static Eina_Bool __vcui_handle_rotate_evnt_idle_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad == NULL) + return EINA_FALSE; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "Rotate on ad->view_top[%d]", ad->view_top); + _vcui_view_change(ad->view_top, 0, NULL, NULL); + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_handle_rotate_event(const int rotate_angle, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "ad is NULL"); + return; + } + + if (0 == rotate_angle || 180 == rotate_angle || 270 == rotate_angle || 90 == rotate_angle) { + ad->rotate_angle = rotate_angle; + ecore_idler_add(__vcui_handle_rotate_evnt_idle_cb, ad); + } + return; +} +#endif + +static void __vcui_rotate_cb(app_device_orientation_e rotate_mode, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_rotate_cb().."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int rotate_angle; + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "ad is NULL"); + return; + } + + rotate_angle = __vcui_get_rotate_angle(rotate_mode); + CALL_UI_DEBUG(VC_LOG_DEBUG, "rotate_angle [%d]", rotate_angle); + if (ad->contact_ug) + { + __vcui_ug_handle_rotate_event(rotate_angle, ad); + } +} + +static void __vcui_init(vcui_app_call_data_t *ad) +{ + CALL_UI_KPI("g_type_init start"); + g_type_init(); + CALL_UI_KPI("g_type_init done"); + _vcui_doc_data_init(); + _vcui_view_common_init(); + vcall_engine_init((vcall_engine_app_cb) __vcui_app_callback, ad); + + CALL_UI_KPI("__vcui_init_view_register_function for all views start"); + __vcui_init_view_register_function(ad, VIEW_DIALLING_VIEW, _vcui_view_dialing_new); + __vcui_init_view_register_function(ad, VIEW_INCOMING_LOCK_VIEW, _vcui_view_incoming_lock_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_ONECALL_VIEW, _vc_ui_view_single_call_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_MULTICALL_SPLIT_VIEW, _vcui_view_multi_call_split_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_MULTICALL_CONF_VIEW, _vcui_view_multi_call_conf_new); + __vcui_init_view_register_function(ad, VIEW_INCALL_MULTICALL_LIST_VIEW, _vcui_view_multi_call_list_new); + __vcui_init_view_register_function(ad, VIEW_ENDCALL_VIEW, _vcui_view_callend_new); + __vcui_init_view_register_function(ad, VIEW_QUICKPANEL_VIEW, _vcui_view_qp_new); + CALL_UI_KPI("__vcui_init_view_register_function for all views done"); + + ad->view_top = -1; + ad->view_before_top = -1; + ad->headset_status = (int)_vcui_is_headset_conected(); + ad->speaker_status = EINA_FALSE; + ad->mute_status = EINA_FALSE; + ad->child_is = -1; + ad->show_flag = WIN_HIDE; + ad->ringtone_val = -1; + ad->voice_vol_val = -1; + ad->bt_vol_val = -1; + ad->call_end_type = CALL_END_TYPE_NONE; + ad->wbamr_status= EINA_FALSE; +} + +char *_vcui_get_endcause_string(int end_cause, char *data) +{ + char *string_id = NULL; + CALL_UI_DEBUG(VC_LOG_DEBUG, "end type : %d", end_cause); + switch (end_cause) { + case VC_ENGINE_ENDCAUSE_USER_UNAVAILABLE: + string_id = _("IDS_CALL_BODY_CALLED_PARTY_UNAVAILABLE"); + break; + case VC_ENGINE_ENDCAUSE_UNASSIGNED_NUMBER: + string_id = _("IDS_CALL_BODY_NUMBER_DOES_NOT_EXIST"); + break; + case VC_ENGINE_ENDCAUSE_USER_DOESNOT_RESPOND: + string_id = _("IDS_CALL_BODY_NO_ANSWER"); + break; + case VC_ENGINE_ENDCAUSE_CALL_DISCONNECTED: + string_id = _("IDS_CALL_BODY_DISCONNECTED"); + break; + case VC_ENGINE_ENDCAUSE_CALL_ENDED: + string_id = _("IDS_CALL_BODY_CALLENDED"); + break; + case VC_ENGINE_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED: + string_id = _("IDS_CALL_POP_SERVICE_NOT_ALLOWED"); + break; + case VC_ENGINE_ENDCAUSE_CALL_BARRED: + string_id = _("IDS_CALL_POP_CALL_BARRED"); + break; + case VC_ENGINE_ENDCAUSE_NO_SERVICE: + string_id = _("IDS_CALL_POP_NOSERVICE"); + break; + case VC_ENGINE_ENDCAUSE_NW_BUSY: + string_id = _("IDS_CALL_POP_NETWORKBUSY"); + break; + case VC_ENGINE_ENDCAUSE_NW_FAILED: + string_id = _("IDS_CALL_POP_NETWORK_UNAVAILABLE"); + break; + case VC_ENGINE_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE: + string_id = _("IDS_CALL_BODY_SERVICE_UNAVAILABLE"); + break; + case VC_ENGINE_ENDCAUSE_NO_ANSWER: + string_id = _("IDS_CALL_BODY_NO_ANSWER"); + break; + case VC_ENGINE_ENDCAUSE_NO_CREDIT: + string_id = _("IDS_CALL_POP_NOCREDITLEFT"); + break; + case VC_ENGINE_ENDCAUSE_REJECTED: + string_id = _("IDS_CALL_BODY_CALL_REJECTED"); + break; + case VC_ENGINE_ENDCAUSE_USER_BUSY: + string_id = _("IDS_CALL_POP_USER_BUSY"); + break; + case VC_ENGINE_ENDCAUSE_WRONG_GROUP: + string_id = _("IDS_CALL_POP_WRONG_GROUP"); + break; + case VC_ENGINE_ENDCAUSE_INVALID_NUMBER_FORMAT: + string_id = _("IDS_CALL_POP_CAUSE_WRONG_NUMBER"); + break; + case VC_ENGINE_ENDCAUSE_CALL_NOT_ALLOWED: + string_id = _("IDS_CALL_POP_CALLNOTCALLOWED"); + break; + case VC_ENGINE_ENDCAUSE_TAPI_ERROR: + string_id = _("IDS_CALL_POP_AEESYS_SYSTEMFAILUREERROR"); + break; + case VC_ENGINE_ENDCAUSE_CALL_FAILED: + string_id = _("IDS_CALL_POP_CALLFAILED"); + break; + case VC_ENGINE_ENDCAUSE_NUMBER_CHANGED: + string_id = _("IDS_CALL_BODY_NUMBER_CHANGED"); + break; + case VC_ENGINE_ENDCAUSE_IMEI_REJECTED: + string_id = _("IDS_CALL_POP_VERIFY_SIM_OR_INSERT_VALID_SIM"); + break; + case VC_ENGINE_ENDCAUSE_FIXED_DIALING_NUMBER_ONLY: + string_id = _("IDS_CALL_POP_FDNCALLONLY"); + break; + case VC_ENGINE_ENDCAUSE_NO_USER_RESPONDING: /**< User not responding */ + case VC_ENGINE_ENDCAUSE_USER_ALERTING_NO_ANSWER: /**< User Alerting No Answer */ + default: + string_id = _("IDS_CALL_BODY_CALLENDED"); + break; + } + vcall_engine_util_strcpy(data, VC_DATA_LENGTH_MAX, string_id); + return data; +} + +void _vcui_cache_flush() +{ +#ifdef _CACHE_FLUSH_ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + evas_font_cache_flush(ad->evas); + evas_image_cache_flush(ad->evas); + + edje_file_cache_flush(); + edje_collection_cache_flush(); + + evas_render_idle_flush(ad->evas); +#endif +} + +int _vcui_is_idle_lock() +{ + int lock_state; + int ret = vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &(lock_state)); + if (ret == -1) { + CALL_UI_DEBUG(VC_LOG_WARN, "Cannot get vconf key"); + } + + if (lock_state == VCONFKEY_IDLE_LOCK) + return CALL_LOCK; + else + return CALL_UNLOCK; +} + +unsigned long _vcui_get_diff_now(time_t start_time) +{ + time_t curr_time; + unsigned long call_duration_in_sec = 0; + curr_time = time(&curr_time); + call_duration_in_sec = curr_time - start_time; + return call_duration_in_sec; +} + +gboolean _vcui_is_gcf_mode(void) +{ + gboolean bgcf_status = EINA_FALSE; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_ADMIN_GCF_TEST, &bgcf_status); + if (0 == ret) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bgcf_status = [%d]\n", bgcf_status); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "vconf_get_int failed..[%d]\n", ret); + } + + return bgcf_status; +} + +gboolean _vcui_is_headset_conected(void) +{ + int bt_connected = VCONFKEY_BT_DEVICE_NONE; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_int(VCONFKEY_BT_DEVICE, &bt_connected); + if (0 == ret) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bt_connected = [0x%x] ", bt_connected); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "vconf_get_int failed..[%d]", ret); + } + + return (VCONFKEY_BT_DEVICE_HEADSET_CONNECTED == (bt_connected & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED)) ? EINA_TRUE : EINA_FALSE; +} + +gboolean _vcui_is_headset_switch_on(void) +{ + int bt_status = VCONFKEY_BT_STATUS_OFF; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_int(VCONFKEY_BT_STATUS, &bt_status); + if (0 == ret) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bt_status = [0x%x] ", bt_status); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "vconf_get_int failed..[%d]", ret); + } + + return (VCONFKEY_BT_STATUS_ON == (bt_status & VCONFKEY_BT_STATUS_ON)) ? EINA_TRUE : EINA_FALSE; +} + +gboolean _vcui_is_answering_mode_on(void) +{ + gboolean bAnswerMode = EINA_FALSE; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_bool(VCONFKEY_CISSAPPL_ANSWERING_KEY_BOOL, &bAnswerMode); + if (0 == ret) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bAnswerMode = [%d] \n", bAnswerMode); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "vconf_get_int failed..[%d]\n", ret); + } + + return bAnswerMode; +} + +gboolean _vcui_is_powerkey_mode_on(void) +{ + gboolean bPowerkeyMode = EINA_FALSE; + Eina_Bool ret = EINA_FALSE; + + ret = vconf_get_bool(VCONFKEY_CISSAPPL_POWER_KEY_ENDS_CALL_BOOL, &bPowerkeyMode); + if (0 == ret) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bPowerkeyMode = [%d] \n", bPowerkeyMode); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "vconf_get_int failed..[%d]\n", ret); + } + + return bPowerkeyMode; +} + +gboolean _vcui_is_phonelock_status() +{ + gboolean b_phonelock = EINA_FALSE; + if (!vconf_get_bool(VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL, &b_phonelock)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "b_phonelock:[%d]", b_phonelock); + return b_phonelock; + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "get VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL failed.."); + return EINA_FALSE; + } +} + +static void __vcui_add_notification(int missed_cnt) +{ + contacts_query_h query = NULL; + contacts_filter_h filter = NULL; + contacts_list_h list = NULL; + contacts_record_h record = NULL; + contacts_error_e err = CONTACTS_ERROR_NONE; + + int noti_flags = 0; + char str_buf[1024] = { 0, }; + int log_cnt = 0; + notification_h noti = NULL; + notification_error_e noti_err = NOTIFICATION_ERROR_NONE; + + unsigned int projection[] = { + _contacts_phone_log.person_id, + _contacts_phone_log.address, + _contacts_phone_log.log_time, + }; + + noti = notification_new(NOTIFICATION_TYPE_NOTI, NOTIFICATION_GROUP_ID_NONE, NOTIFICATION_PRIV_ID_NONE); + if (noti == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to notification_create"); + return; + } + + noti_err = notification_delete_all_by_type(CALL_PKG, NOTIFICATION_TYPE_NOTI); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "notification_delete_all_by_type failed:[%d]", noti_err); + } + + noti_err = notification_set_pkgname(noti, CALL_PKG); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to noification_set_pkgname %d", noti_err); + } + + noti_err = notification_set_application(noti, DIALER_PKG); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to notification_set_application : %d", noti_err); + } + + bundle *args = bundle_create(); + + bundle_add(args, "logs", "missed_call"); + noti_err = notification_set_args(noti, args, NULL); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to notification_set_args : %d", noti_err); + } + bundle_free(args); + + if (missed_cnt == 1) { + strncpy(str_buf, _("IDS_CALL_POP_CALLMISSED"), sizeof(str_buf) - 1); + noti_err = notification_set_layout(noti, NOTIFICATION_LY_NOTI_EVENT_SINGLE); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to notification_set_layout : %d", noti_err); + } + } else { + char *temp = _("IDS_CALL_HEADER_PD_MISSED_CALLS"); + snprintf(str_buf, sizeof(str_buf), temp, missed_cnt); + noti_err = notification_set_layout(noti, NOTIFICATION_LY_NOTI_EVENT_MULTIPLE); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to notification_set_layout : %d", noti_err); + } + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "Notification string :[%s]", str_buf); + + noti_err = notification_set_text(noti, NOTIFICATION_TEXT_TYPE_TITLE, dgettext("sys_string", "IDS_COM_BODY_CALL"), NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to notification_set_text : %d", noti_err); + } + + noti_err = notification_set_text(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf, NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to notification_set_text : %d", noti_err); + } + + noti_err = notification_set_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, NOTIFY_MISSED_CALL_ICON); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to notification_set_image : %d", noti_err); + } + + if (contacts_query_create(_contacts_phone_log._uri, &query) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_create is error"); + } else if (contacts_filter_create(_contacts_phone_log._uri, &filter) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_create is error"); + } else if (contacts_filter_add_int(filter, _contacts_phone_log.log_type, + CONTACTS_MATCH_EQUAL, + CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_add_int is error"); + } else if (contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_add_operator is error"); + } else if (contacts_filter_add_int(filter, _contacts_phone_log.log_type, + CONTACTS_MATCH_EQUAL, + CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_add_int is error"); + } else if (contacts_query_set_filter(query, filter) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_set_filter is error"); + } else if (contacts_query_set_projection(query, projection, sizeof(projection)/sizeof(unsigned int)) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_set_projection is error"); + } else if (contacts_query_set_distinct(query, TRUE) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_set_distinct is error"); + } else if (contacts_query_set_sort(query, _contacts_phone_log.log_time, FALSE)) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_set_sort is error"); + } + + err = contacts_db_get_records_with_query(query, 0, 0, &list); + + if (CONTACTS_ERROR_NONE == err) { + contacts_list_first(list); + + while(CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) { + int person_id = 0; + int log_time = 0; + char *disp_str = NULL; + + log_cnt++; + + err = contacts_record_get_int(record, _contacts_phone_log.log_time, &log_time); + if (CONTACTS_ERROR_NONE != err) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to contacts_record_get_int : %d", err); + } + + if (log_cnt == 1) + notification_set_time_to_text(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, log_time); + else + notification_set_time_to_text(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, log_time); + + err = contacts_record_get_int(record, _contacts_phone_log.person_id, &person_id); + if (CONTACTS_ERROR_NONE != err) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to contacts_record_get_int : %d", err); + } + + if (person_id == 0) { + err = contacts_record_get_str(record, _contacts_phone_log.address, &disp_str); + if (CONTACTS_ERROR_NONE != err) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to contacts_record_get_str : %d", err); + } + } else { + contacts_record_h person_record = NULL; + err = contacts_db_get_record(_contacts_person_number._uri, person_id, &person_record); + if (CONTACTS_ERROR_NONE != err) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to contacts_db_get_record : %d", err); + } else { + err = contacts_record_get_str(person_record, _contacts_person_number.display_name, &disp_str); + if (CONTACTS_ERROR_NONE != err) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to contacts_record_get_str : %d", err); + } + } + } + + if (disp_str) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "person id : %d, disp_str : %s[%d]", person_id, disp_str, log_cnt); + if (log_cnt == 1) + notification_set_text(noti, NOTIFICATION_TEXT_TYPE_INFO_1, disp_str, NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + else + notification_set_text(noti, NOTIFICATION_TEXT_TYPE_INFO_2, disp_str, NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + free(disp_str); + } + + err = contacts_list_next(list); + if ((CONTACTS_ERROR_NONE != err) + || (log_cnt == 2)) + break; + } + + err = contacts_list_destroy(list, TRUE); + if (err != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Fail to contacts_list_destroy"); + } + } + + contacts_filter_destroy(filter); + contacts_query_destroy(query); + + noti_flags = NOTIFICATION_PROP_DISABLE_TICKERNOTI | NOTIFICATION_PROP_DISPLAY_ONLY_SIMMODE; + noti_err = notification_set_property(noti, noti_flags); + if(noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to notification_set_property : %d", noti_err); + } + + noti_err = notification_insert(noti, NULL); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to notification_insert"); + } + + noti_err = notification_free(noti); + if (noti_err != NOTIFICATION_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "Fail to notification_free"); + } +} + +void _vcui_add_calllog(contacts_phone_log_type_e type, call_data_t *data, int boutgoing_end) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "type = [0x%x] ", type); + + time_t current_time; + int log_ret = CONTACTS_ERROR_NONE; + int duration = 0; + + if (data == NULL) + return; + + current_time = time(NULL); + + log_ret = contacts_connect2(); + if (log_ret != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_connect2 is failed[%d]", log_ret); + } else { + contacts_record_h log_record = NULL; + + log_ret = contacts_record_create(_contacts_contact._uri, &log_record); + if ((type == CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN) + || (type == CONTACTS_PLOG_TYPE_VOICE_REJECT) + || (type == CONTACTS_PLOG_TYPE_VOICE_BLOCKED) + || (boutgoing_end == EINA_TRUE)) { + duration = 0; + } else { + duration = (int)_vcui_get_diff_now(_vcui_doc_get_call_start_time(data)); + } + + if (contacts_record_create(_contacts_phone_log._uri, &log_record) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_record_create is failed"); + } else if (contacts_record_set_str(log_record, _contacts_phone_log.address, _vcui_doc_get_call_number(data)) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_record_set_str(Number) is failed"); + } else if (contacts_record_set_int(log_record, _contacts_phone_log.log_time, current_time) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_record_set_int(Time) is failed"); + } else if (contacts_record_set_int(log_record, _contacts_phone_log.log_type, type) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_record_set_int(Type) is failed"); + } else if (contacts_record_set_int(log_record, _contacts_phone_log.extra_data1, duration) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_record_set_int(Duration) is failed"); + } else if (contacts_record_set_int(log_record, _contacts_phone_log.person_id, _vcui_doc_get_contact_index(data)) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_record_set_int(person id) is failed"); + } else if (contacts_db_insert_record(log_record, NULL) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_db_insert_record is failed"); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Call log is added successfully"); + } + + contacts_record_destroy(log_record, EINA_TRUE); + } + + /* vconf set & quickpanel noti (for missed call) */ + if (type == CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN) { + int missed_cnt = 0; + contacts_query_h query = NULL; + contacts_filter_h filter = NULL; + + if (contacts_query_create(_contacts_phone_log._uri, &query) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_create is error"); + } else if (contacts_filter_create(_contacts_phone_log._uri, &filter) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_create is error"); + } else if (contacts_filter_add_int(filter, _contacts_phone_log.log_type, + CONTACTS_MATCH_EQUAL, + CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_add_int is error"); + } else if (contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_add_operator is error"); + } else if (contacts_filter_add_int(filter, _contacts_phone_log.log_type, + CONTACTS_MATCH_EQUAL, + CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_filter_add_int is error"); + } else if (contacts_query_set_filter(query, filter) != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_query_set_filter is error"); + } + + log_ret = contacts_db_get_count_with_query(query, &missed_cnt); + if (log_ret != CONTACTS_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_ERR, "contacts_db_get_count_with_query is failed"); + } + + contacts_filter_destroy(filter); + contacts_query_destroy(query); + + __vcui_add_notification(missed_cnt); + } + contacts_disconnect2(); +} + +void _vcui_raise_main_win() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "App data is NULL"); + return; + } + if (ad->win_main == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "Main Window is NULL"); + return; + } + + elm_win_activate(ad->win_main); + _vcui_show_main_ui_set_flag(); + /*view_refresh_now(); */ + +} + +int _vcui_check_valid_eo(Evas_Object *eo, char *v_name) +{ + /*CALL_UI_DEBUG(VC_LOG_DEBUG, "eo addr:[%p], v_name:[%s]", eo, v_name); */ + const char *obj_name = evas_object_name_get(eo); + if (obj_name == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "obj_name is NULL!!. eo addr:[%p], v_name:[%s]", eo, v_name); + return VC_ERROR; + } + if (strncmp(obj_name, v_name, strlen(obj_name)) == 0) { + return VC_NO_ERROR; + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "different name !! "); + return VC_ERROR; + } +} + +vcui_app_call_data_t *_vcui_get_app_data() +{ + return &global_ad; +} + +void _vcui_show_main_ui_set_flag() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->show_flag == WIN_HIDE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "show_flag : WIN_SHOW"); + evas_object_show(ad->win_main); + ad->show_flag = WIN_SHOW; + } +} + +void __vcui_hide_main_ui_set_flag() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "show_flag: WIN_HIDE"); + evas_object_hide(ad->win_main); + ad->show_flag = WIN_HIDE; +} + +Evas_Object *_vcui_load_edj(Evas_Object *parent, const char *file, const char *group) +{ + Evas_Object *eo; + int r; + + eo = elm_layout_add(parent); + if (eo) { + r = elm_layout_file_set(eo, file, group); + if (!r) { + evas_object_del(eo); + CALL_UI_DEBUG(VC_LOG_WARN, "ERROR!!"); + return NULL; + } + + evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, eo); + } + + return eo; +} + +int main(int argc, char *argv[]) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "voice call ui main().."); + + app_event_callback_s event_callback = {0,}; + + memset(&global_ad, 0, sizeof(vcui_app_call_data_t)); + + event_callback.create = __vcui_app_create; + event_callback.terminate = __vcui_app_terminate; + event_callback.pause = __vcui_app_pause; + event_callback.resume = __vcui_app_resume; + event_callback.service = __vcui_app_service; + + event_callback.low_memory = __vcui_low_mem_cb; + event_callback.low_battery = __vcui_low_bat_cb; + event_callback.device_orientation = __vcui_rotate_cb; + event_callback.language_changed = __vcui_lang_changed_cb; + event_callback.region_format_changed = NULL; + + int ret = APP_ERROR_NONE; + + /* Later we can set the last parameter as global_ad pointer. */ + ret = app_efl_main(&argc, &argv, &event_callback, &global_ad); + + if (ret != APP_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "app_efl_main() is failed. err=%d", ret); + } + + return ret; +} + +static Eina_Bool __vcui_avoid_multi_setup_timer_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + g_avoid_multi_setup = EINA_FALSE; + + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_app_callback(int event, void *pdata, void *puser_data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)puser_data; + vc_engine_msg_type *msg = (vc_engine_msg_type *)pdata; + + if ((ad == NULL) || (msg == NULL)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR.NULL pointer"); + return; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "@@@ event:[%s], view_top:[%d], count:[%d] @@@ \n", gszcall_callback_msg[event], ad->view_top, _vcui_doc_get_all_call_data_count()); + + switch (event) { + case VC_ENGINE_MSG_INCOM_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_LOCK); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "num:[%s], name:[%s]", msg->incoming.call_num, msg->incoming.call_name); + + call_data_t *call_data = NULL; + call_data = _vcui_doc_allocate_call_data_memory(); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + _vcui_doc_set_call_handle(call_data, msg->incoming.call_handle); + _vcui_doc_set_contact_index(call_data, msg->incoming.contact_index); + _vcui_doc_set_contact_phone_type(call_data, msg->incoming.phone_type); + _vcui_doc_set_call_number(call_data, msg->incoming.call_num); + _vcui_doc_set_forwarded_call(call_data, msg->incoming.bfwded); + + if (msg->incoming.brestricted == EINA_TRUE) { + if (msg->incoming.bpayphone == EINA_TRUE) { + _vcui_doc_set_call_display_name(call_data, _("Payphone")); + } else { + _vcui_doc_set_call_display_name(call_data, dgettext("sys_string", "IDS_COM_BODY_UNKNOWN")); + } + } else { + _vcui_doc_set_call_display_name(call_data, msg->incoming.call_name); + } + + if ((strcmp((char *)msg->incoming.call_file_path, "default") == 0) || (strlen((char *)msg->incoming.call_file_path) == 0)) { + _vcui_doc_set_caller_id_file_path(call_data, NOIMG_ICON); + } else { + _vcui_doc_set_caller_id_file_path(call_data, msg->incoming.call_file_path); + } + + _vcui_doc_set_call_status(call_data, NO_STATUS); + _vcui_doc_set_call_type(call_data, CALL_INCOMING); + _vcui_doc_set_auto_reject_status(call_data, msg->incoming.brejected); + + _vcui_doc_set_mt_call_data(call_data); + _vcui_doc_add_call_data(call_data); + + { + /*Auto Reject Check */ + if (EINA_TRUE == msg->incoming.brejected) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "the call rejected and show reject popup"); + vcall_engine_reject_call(); + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_BLOCKED, call_data, EINA_FALSE); + + if (_vcui_doc_get_all_call_data_count() > 1) { + _vcui_view_popup_load_reject_call(_vcui_doc_get_call_display_name(call_data), _vcui_doc_get_call_number(call_data), EINA_FALSE); + } else { + _vcui_view_popup_load_reject_call(_vcui_doc_get_call_display_name(call_data), _vcui_doc_get_call_number(call_data), EINA_TRUE); + } + } else { + _vcui_view_change(VIEW_INCOMING_LOCK_VIEW, 0, NULL, NULL); + } + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_TO_UI: + { + call_data_t *call_data = NULL; + call_data = _vcui_doc_allocate_call_data_memory(); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + + _vcui_doc_set_call_handle(call_data, NO_HANDLE); + _vcui_doc_set_contact_index(call_data, msg->outgoing.contact_index); + _vcui_doc_set_contact_phone_type(call_data, msg->outgoing.phone_type); + _vcui_doc_set_call_number(call_data, msg->outgoing.call_num); + _vcui_doc_set_call_display_name(call_data, msg->outgoing.call_name); + + if ((strcmp((char *)msg->outgoing.call_file_path, "default") == 0) || (strlen((char *)msg->outgoing.call_file_path) == 0)) { + _vcui_doc_set_caller_id_file_path(call_data, NOIMG_ICON); + } else { + _vcui_doc_set_caller_id_file_path(call_data, msg->outgoing.call_file_path); + } + + _vcui_doc_set_call_status(call_data, NO_STATUS); + _vcui_doc_set_call_type(call_data, CALL_OUTGOING); + _vcui_doc_set_call_start_time(call_data); + + _vcui_doc_set_mo_call_data(call_data); + } + break; + + case VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_LOCK); + + vc_engine_outgoing_orig_type outgoing_orig = msg->outgoing_orig; + + call_data_t *call_data = _vcui_doc_get_mo_call_data(); + _vcui_doc_set_call_handle(call_data, outgoing_orig.call_handle); + + if (outgoing_orig.bemergency == EINA_TRUE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "it is emergency call"); + char *em_name = _("IDS_CALL_POP_EMERGENCY_CALL"); + _vcui_doc_set_call_display_name(call_data, em_name); + _vcui_doc_set_caller_id_file_path(call_data, NOIMG_ICON); + _vcui_doc_set_contact_phone_type(call_data, -1); + } + + _vcui_doc_add_call_data(call_data); + _vcui_view_change(VIEW_DIALLING_VIEW, 0, NULL, NULL); + + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + _vcui_view_qp_update_text_status(ad->view_st[VIEW_QUICKPANEL_VIEW], _("IDS_CALL_POP_CALLING")); + } + break; + + case VC_ENGINE_MSG_OUTGOING_ORIG_TO_UI_TEST: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_LOCK); + + vc_engine_outgoing_orig_type outgoing_orig = msg->outgoing_orig; + + call_data_t *call_data = _vcui_doc_get_mo_call_data(); + _vcui_doc_set_call_handle(call_data, 1); + + if (outgoing_orig.bemergency == EINA_TRUE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "it is emergency call"); + char *em_name = _("IDS_CALL_POP_EMERGENCY_CALL"); + _vcui_doc_set_call_display_name(call_data, em_name); + _vcui_doc_set_caller_id_file_path(call_data, NOIMG_ICON); + _vcui_doc_set_contact_phone_type(call_data, -1); + } + + _vcui_doc_add_call_data(call_data); + _vcui_view_change(VIEW_DIALLING_VIEW, 0, NULL, NULL); + + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + _vcui_view_qp_update_text_status(ad->view_st[VIEW_QUICKPANEL_VIEW], _("IDS_CALL_POP_CALLING")); + } + break; + + case VC_ENGINE_MSG_OUTGOING_ALERT_TO_UI: + { + call_data_t *call_data = _vcui_doc_get_mo_call_data(); + if (_vcui_doc_is_valid_call_data(call_data) == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error. check outgoing_orig msg."); + elm_exit(); + return; + } + + _vcui_view_qp_update_text_status(ad->view_st[VIEW_QUICKPANEL_VIEW], _("IDS_CALL_POP_CALLING")); + } + break; + + case VC_ENGINE_MSG_CONNECTED_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_connected_type connected = msg->connected; + int bstatus = EINA_FALSE; + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(connected.call_handle); + if (_vcui_doc_is_valid_call_data(call_data) == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + _vcui_doc_set_call_status(call_data, CALL_UNHOLD); + _vcui_doc_set_call_handle(call_data, connected.call_handle); + _vcui_doc_set_call_start_time(call_data); + /* When new call connected, if it's multiparty call, always show split1 first. */ + ad->bswapped = EINA_FALSE; + + /* check minute minder */ + if (vconf_get_bool(VCONFKEY_CISSAPPL_MINUTE_MINDER_BOOL, &bstatus)) { + CALL_UI_DEBUG(VC_LOG_WARN, "vconf_get_bool failed."); + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "bstatus(%d), ad->id_minute_minder(%d)", bstatus, ad->id_minute_minder); + if (bstatus) { + if (ad->id_minute_minder == 0) { + /* Create minute minder alarm */ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + service_h service; + int ret = 0; + int id_minute_minder = 0; + + ret = service_create(&service); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_create failed, [%s]", _vcui_convert_service_error(ret)); + } + + ret = service_set_operation(service, SERVICE_OPERATION_CALL); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_set_operation failed, [%s]", _vcui_convert_service_error(ret)); + } + + ret = service_set_package(service, CALL_PKG); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_set_package failed, [%s]", _vcui_convert_service_error(ret)); + } + + ret = service_add_extra_data(service, "launch-type", "MIN_MINDER"); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_add_extra_data failed, [%s]", _vcui_convert_service_error(ret)); + } + + ret = alarm_schedule_after_delay(service, 60, 60, &id_minute_minder); + if (ret != ALARM_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "alarm_schedule_after_delay failed, [%s]", _vcui_convert_alarm_error(ret)); + } + ad->id_minute_minder = id_minute_minder; + CALL_UI_DEBUG(VC_LOG_DEBUG, "id_minute_minder[%d]",ad->id_minute_minder); + + service_destroy(service); + } + } + + _vcui_view_auto_change(); + + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + + /* Call is connected. It means it's not a MO/MT status anymore.. */ + _vcui_doc_set_mo_call_data(NULL); + _vcui_doc_set_mt_call_data(NULL); + } + break; + + case VC_ENGINE_MSG_NORMAL_END_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_LOCK); + + vc_engine_normal_end_type normal_end = msg->normal_end; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "end_cause_type:[%d]", normal_end.end_cause_type); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + time_t start_time; + int call_type = -1; + + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(normal_end.call_handle); + if (_vcui_doc_is_valid_call_data(call_data) == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + call_type = _vcui_doc_get_call_type(call_data); + CALL_UI_DEBUG(VC_LOG_DEBUG, "call_type: %d", call_type); + if (call_type == CALL_OUTGOING) { + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_OUTGOING, call_data, EINA_FALSE); + } else if (call_type == CALL_INCOMING) { + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_INCOMMING, call_data, EINA_FALSE); + } + start_time = _vcui_doc_get_call_start_time(call_data); + + if (_vcui_doc_get_all_call_data_count() == 1 && ad->view_top == VIEW_INCALL_ONECALL_VIEW) { + ad->call_end_type = CALL_END_TYPE_SINGLE_CALL; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "ad->call_end_type[%d]", ad->call_end_type); + + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Show end screen - %d", ad->call_end_type); + _vcui_view_change(VIEW_ENDCALL_VIEW, -1, call_data, NULL); + ad->call_end_type = CALL_END_TYPE_NONE; + CALL_UI_DEBUG(VC_LOG_DEBUG, "Blink show: end call time"); + _vcui_view_common_call_end_show(start_time, normal_end.end_cause_type); + _vcui_doc_remove_call_data(call_data); + } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + if (_vcui_doc_get_all_call_data_count() == 1) { + ad->call_end_type = CALL_END_TYPE_NONE; + } else if (ad->view_top != VIEW_ENDCALL_VIEW) { + _vcui_view_change(VIEW_ENDCALL_VIEW, -1, call_data, NULL); + _vcui_view_common_call_end_show(start_time, normal_end.end_cause_type); + } + _vcui_doc_remove_call_data(call_data); + } else { + _vcui_doc_remove_call_data(call_data); + if ((ad->view_top == VIEW_INCALL_MULTICALL_LIST_VIEW) + && (_vcui_doc_get_all_call_data_count() > 1)) { + _vcui_view_update(); /* Remain multi call list */ + } else { + _vcui_view_common_call_terminate_or_view_change(); + } + } + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + } + break; + + case VC_ENGINE_MSG_INCOM_END_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_common_with_handle_type incom_end = msg->incom_end; + + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(incom_end.call_handle); + if (_vcui_doc_is_valid_call_data(call_data) == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN, call_data, EINA_FALSE); + _vcui_doc_remove_call_data(call_data); + _vcui_view_common_call_terminate_or_view_change(); + } + break; + + case VC_ENGINE_MSG_REJECTED_END_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_common_with_handle_type rejected_end = msg->rejected_end; + + call_data_t *pcall_data = _vcui_doc_get_call_data_by_handle(rejected_end.call_handle); + if (_vcui_doc_is_valid_call_data(pcall_data) == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + + if (_vcui_doc_get_auto_reject_status(pcall_data) == EINA_TRUE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "auto rejected."); + _vcui_doc_remove_call_data(pcall_data); + } else { + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_REJECT, pcall_data, EINA_FALSE); + _vcui_doc_remove_call_data(pcall_data); + _vcui_view_common_call_terminate_or_view_change(); + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_END_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_outgoing_end_type outgoing_end = msg->outgoing_end; + call_data_t *pcall_data = _vcui_doc_get_call_data_by_handle(outgoing_end.call_handle); + if (_vcui_doc_is_valid_call_data(pcall_data) == EINA_TRUE) { + if (outgoing_end.bauto_redial == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "show the call end screen"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (_vcui_doc_get_all_call_data_count() == 1 && ad->view_top == VIEW_DIALLING_VIEW) { + ad->call_end_type = CALL_END_TYPE_SINGLE_CALL; + _vcui_view_change(VIEW_ENDCALL_VIEW, -1, pcall_data, NULL); + _vcui_view_common_timer_destroy(); + } + } + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_END_UI_DESTROY: + { + vc_engine_outgoing_end_type outgoing_end = msg->outgoing_end; + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(outgoing_end.call_handle); + if (_vcui_doc_is_valid_call_data(call_data) == EINA_FALSE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "It is the case which call orig is not received."); + char data[VC_DATA_LENGTH_MAX] = { 0, }; + _vcui_view_popup_load(_vcui_get_endcause_string(outgoing_end.end_cause_type, data), POPUP_TIMEOUT_LONG, EINA_TRUE); + } else { + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_OUTGOING, call_data, EINA_TRUE); + if (outgoing_end.bauto_redial == EINA_TRUE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "bauto_redial is EINA_TRUE"); + _vcui_doc_remove_call_data_from_list(call_data); + } else { + _vcui_doc_remove_call_data(call_data); + } + _vcui_view_common_call_end_show_dialing(outgoing_end.end_cause_type, outgoing_end.bauto_redial); + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_END_SIGNAL_PLAY_TO_UI: + { + vc_engine_outgoing_end_signal_play_type outgoing_end_signal_play = msg->outgoing_end_signal_play; + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(outgoing_end_signal_play.call_handle); + if (call_data != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Updating the caller info text status field"); + char data[VC_DATA_LENGTH_MAX] = { 0, }; + + _vcui_get_endcause_string(outgoing_end_signal_play.end_cause_type, data); + _vc_ui_view_callend_set_call_timer(ad->view_st[ad->view_top], data); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "Check it whether call data exists. handle:[%d]", outgoing_end_signal_play.call_handle); + } + } + break; + + case VC_ENGINE_MSG_OUTGOING_ABORTED_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_common_with_handle_type outgoing_aborted = msg->outgoing_aborted; + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(outgoing_aborted.call_handle); + if (call_data == NULL) + call_data = _vcui_doc_get_mo_call_data(); + + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } + + _vcui_add_calllog(CONTACTS_PLOG_TYPE_VOICE_OUTGOING, call_data, EINA_TRUE); + + _vcui_doc_remove_call_data(call_data); + + _vcui_view_common_call_terminate_or_view_change(); + + } + break; + + case VC_ENGINE_MSG_DTMF_ACK_TO_UI: + { + + vc_engine_dtmf_ack_type dtmf_ack = msg->dtmf_progress; + + if (EINA_FALSE == dtmf_ack.bstatus) { + _vcui_view_popup_unload_progress(ad); + if ((dtmf_ack.string_id != -1) && (dtmf_ack.string_id != IDS_CALL_POP_DTMF_SENT)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "load popup window... Start"); + _vcui_view_popup_load(_(gszcall_error_msg[dtmf_ack.string_id]), POPUP_TIMEOUT_LONG, EINA_FALSE); + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "display_string:[%s], string_id:[%d]", dtmf_ack.display_string, dtmf_ack.string_id); + if (dtmf_ack.string_id == IDS_CALL_POP_UNAVAILABLE) { /*check for the ID when string is added */ + _vcui_view_load_send_dtmf_popup_with_buttons(_("Send DTMF tones?"), dtmf_ack.display_string); /*add the string */ + } else if (dtmf_ack.string_id == IDS_CALL_POP_SENDING) { + _vcui_view_popup_load_sending_dtmf(_(gszcall_error_msg[dtmf_ack.string_id]), dtmf_ack.display_string); + } + } + } + break; + + case VC_ENGINE_MSG_SS_HELD_TO_UI: + { + _vcui_doc_set_all_call_data_to_hold_status(); + _vcui_view_update(); + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + + } + break; + + case VC_ENGINE_MSG_SS_RETREIVED_TO_UI: + { + _vcui_doc_set_all_call_data_to_unhold_status(); + _vcui_view_update(); + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + + } + break; + + case VC_ENGINE_MSG_SS_SWAP_TO_UI: + { + _vcui_view_popup_unload(ad->popup_eo); + + if (ad->bholdisleft == EINA_TRUE) { + ad->bswapped = EINA_FALSE; + } else { + ad->bswapped = EINA_TRUE; + } + + _vcui_doc_swap_all_call_data_status(); + _vcui_view_auto_change(); + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + } + break; + + case VC_ENGINE_MSG_SS_SETUP_CONF_TO_UI: + { + _vcui_view_popup_unload(ad->popup_eo); + + _vcui_doc_set_all_call_data_to_unhold_status(); + _vcui_view_auto_change(); + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + } + break; + + case VC_ENGINE_MSG_SS_SPLIT_CONF_TO_UI: + { + vc_engine_common_with_handle_type ss_split_conf = msg->ss_split_conf; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "[UI]The handle is %d ", ss_split_conf.call_handle); + + call_data_t *call_data = _vcui_doc_get_call_data_by_handle(ss_split_conf.call_handle); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "Error"); + elm_exit(); + return; + } else { + _vcui_doc_set_all_call_data_to_hold_status(); + _vcui_doc_set_call_status(call_data, CALL_UNHOLD); + + _vcui_view_auto_change(); + /*Update the quick-panel window */ + _vcui_view_quickpanel_change(); + } + } + break; + + case VC_ENGINE_MSG_SS_TRANSFERRED_TO_UI: + break; + + case VC_ENGINE_MSG_SS_CONNECT_LINE_IND_TO_UI: + break; + + case VC_ENGINE_MSG_IND_FORWARD_TO_UI: + { + if (msg->ss_ind_forward.fwd_type == 0) + _vcui_view_popup_load(_("IDS_COM_BODY_FORWARDED_CALL"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + else + _vcui_view_popup_load(_("IDS_CALL_POP_OUTGOING_CALL_FORWARDED"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_ACTIVATE_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_UNHELD"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_HOLD_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_HELD"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_TRANSFER_TO_UI: + break; + + case VC_ENGINE_MSG_IND_SETUPCONFERENCE_TO_UI: + break; + + case VC_ENGINE_MSG_IND_BARRING_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_OUTGOING_CALLS_BARRED"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_WAITING_TO_UI: + { + _vcui_view_popup_load(_("IDS_CALL_POP_WAITING_ACTIVE"), POPUP_TIMEOUT_SHORT, EINA_FALSE); + } + break; + + case VC_ENGINE_MSG_IND_CUGINFO_TO_UI: + break; + + case VC_ENGINE_MSG_IND_SSNOTIFY_TO_UI: + break; + + case VC_ENGINE_MSG_IND_CALLINGNAMEINFO_TO_UI: + break; + + case VC_ENGINE_MSG_IND_REDIRECT_CNF_TO_UI: + break; + + case VC_ENGINE_MSG_IND_ACTIVATECCBS_CNF_TO_UI: + break; + + case VC_ENGINE_MSG_IND_ACTIVATECCBS_USERINFO_TO_UI: + break; + + case VC_ENGINE_MSG_GET_VOLUME_RESP_TO_UI: + { + vc_engine_vol_resp_type vol_resp = msg->vol_resp; + _vcui_response_volume(vol_resp.vol_alert_type, vol_resp.vol_level); + } + break; + + case VC_ENGINE_MSG_SET_VOLUME_FROM_BT_TO_UI: + { + vc_engine_vol_set_from_bt_type vol_set_from_bt = msg->vol_set_from_bt; + ad->bt_vol_val = vol_set_from_bt.vol_level; + _vcui_view_popup_vol_bt(ad->bt_vol_val); + } + break; + + case VC_ENGINE_MSG_ACTION_NO_ACTIVE_TASK_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ACTION_CALL_END_HELD_RETREIVED_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ACTION_SAT_RESPONSE_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ACTION_SAT_REQUEST_TO_UI: + { + + } + break; + + case VC_ENGINE_MSG_ERROR_OCCURED_TO_UI: + break; + + case VC_ENGINE_MSG_IND_AOC_TO_UI: + break; + + case VC_ENGINE_MSG_ACCEPT_CHOICE_BOX_TO_UI: + { + CALL_UI_DEBUG(VC_LOG_DEBUG, "not supported"); + } + break; + + case VC_ENGINE_MSG_HEADSET_STATUS_TO_UI: + { + vc_engine_headset_status_type headset_status = msg->headset_status; + ad->headset_status = headset_status.bstatus; + if (ad->headset_status == EINA_TRUE) { + ad->speaker_status = EINA_FALSE; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "Headset Status = %d", ad->headset_status); + CALL_UI_DEBUG(VC_LOG_DEBUG, "ad->view_top:[%d]", ad->view_top); + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + + } + break; + + case VC_ENGINE_MSG_EARJACK_STATUS_TO_UI: + { + vc_engine_earjack_status_type earjack_status = msg->earjack_status; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "earjack Status = %d", earjack_status.bstatus); + CALL_UI_DEBUG(VC_LOG_DEBUG, "ad->view_top:[%d]", ad->view_top); + + if (earjack_status.bstatus == EINA_TRUE) { + if (ad->ctxpopup_radio_group_eo != NULL) + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_RECEIVER_EARJACK); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_FALSE; + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + } else { + if (_vcui_is_headset_conected() == EINA_TRUE) { + if (ad->ctxpopup_radio_group_eo != NULL) + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_HEADSET); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_TRUE; + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + } else { + if (ad->ctxpopup_radio_group_eo != NULL) + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_RECEIVER_EARJACK); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_FALSE; + + if ((ad->view_top == VIEW_INCALL_ONECALL_VIEW) || (ad->view_top == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + || (ad->view_top == VIEW_INCALL_MULTICALL_CONF_VIEW) || (ad->view_top == VIEW_DIALLING_VIEW)) { + if (ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + } + } + } + } + break; + + case VC_ENGINE_MSG_ACTION_INCOM_FORCE_TO_UI: + { + call_data_t *call_data = _vcui_doc_get_mo_call_data(); + if (call_data != NULL && _vcui_doc_get_call_handle(call_data) == NO_HANDLE) { + _vcui_doc_remove_call_data_from_list(call_data); + _vcui_doc_set_mo_call_data(NULL); + } + } + break; + + case VC_ENGINE_MSG_MESSAGE_BOX_TO_UI: + { + vcall_engine_device_control_lcd_state(VC_LCD_ON_UNLOCK); + + vc_engine_msg_box_type msg_box = msg->msg_box; + if (msg_box.string_id == IDS_CALL_POP_FM_DISABLE_MSG) + _vcui_view_load_popup_flight_mode(__vcui_app_fm_popup_button_press_cb); + else + _vcui_view_popup_load(_(gszcall_error_msg[msg_box.string_id]), POPUP_TIMEOUT_LONG, EINA_TRUE); + } + break; + + case VC_ENGINE_MSG_REDIAL_TO_UI: + { + CALL_UI_DEBUG(VC_LOG_DEBUG, "not used"); + } + break; + + case VC_ENGINE_MSG_NOTI_WBAMR_TO_UI: + { + vc_engine_wbamr_status_type wbamr_status = msg->wbamr_status; + ad->wbamr_status = wbamr_status.bstatus; + } + break; + + default: + break; + } + + _vcui_doc_print_all_call_data(gszcall_callback_msg[event]); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "End.."); +} + +static void __vcui_app_fm_popup_button_press_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + int btn_opt = -1; + Eina_Bool check_state = EINA_FALSE; + + btn_opt = (int) evas_object_data_get(obj, "POPUP_BUTTON_KEY"); + CALL_UI_DEBUG(VC_LOG_DEBUG, "btn_opt : %d", btn_opt); + + check_state = elm_check_state_get(ad->popup_check); + CALL_UI_DEBUG(VC_LOG_DEBUG, "Check-state %d\n", check_state); + + if (btn_opt == POPUP_BTN_OPT_OK) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "OK"); + /*Initiate flight mode disabling request*/ + if (check_state) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "FM check ON"); + if (!vcall_engine_disable_flight_mode()) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Disable request initiation failed. Exit"); + _vcui_view_common_call_terminate_or_view_change(); + } else { + /*Start checking popup to show disabling flight mode*/ + ecore_idler_add(__vcui_flight_mode_checking_idler_cb, ad); + ecore_timer_add(0.5, __vcui_flight_mode_enabled_check_timer_cb, ad); + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "FM check OFF"); + _vcui_view_common_call_terminate_or_view_change(); + } + } else if (btn_opt == POPUP_BTN_OPT_CANCEL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "CANCEL.. Exit"); + _vcui_view_common_call_terminate_or_view_change(); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "invalid option...Exit"); + _vcui_view_common_call_terminate_or_view_change(); + } + + _vcui_view_popup_unload(ad->popup_eo); +} + +static Eina_Bool __vcui_flight_mode_checking_idler_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + _vcui_view_load_popup_checking(_(gszcall_error_msg[IDS_CALL_POP_FM_DISABLING])); + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool __vcui_flight_mode_enabled_check_timer_cb(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + call_data_t *pcall_data = NULL; + int network_status = -1; + + /*check if call network is enabled - to make call*/ + vcall_engine_get_network_status(&network_status); + CALL_UI_DEBUG(VC_LOG_DEBUG, "Network_status: %d", network_status); + + if (network_status == VCONFKEY_TELEPHONY_SVCTYPE_NONE || + network_status == VCONFKEY_TELEPHONY_SVCTYPE_NOSVC || + network_status == VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Cannot make call - check again"); + + return ECORE_CALLBACK_RENEW; + } + + _vcui_view_popup_unload(ad->popup_eo); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "Call is successfull"); + pcall_data = _vcui_doc_get_mo_call_data(); + + if (pcall_data) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Number %s", _vcui_doc_get_call_number(pcall_data)); + vcall_engine_process_normal_call(_vcui_doc_get_call_number(pcall_data), -1, EINA_FALSE); + } + + return ECORE_CALLBACK_CANCEL; +} diff --git a/ui/src/vcui-doc-launch.c b/ui/src/vcui-doc-launch.c new file mode 100755 index 0000000..7d97db4 --- /dev/null +++ b/ui/src/vcui-doc-launch.c @@ -0,0 +1,553 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include "vcui-application.h" + +#define MSG_COMPOSER_UG "msg-composer-efl" +#define MSG_PKG "org.tizen.message" +#define ADD_TO_CONTACTS_UG "contacts-details-efl" +#define VIEW_CONTACT_UG "contacts-details-efl" + +struct vcui_ug_priv_data *local_priv_data = NULL; + +#define COMMON_FUNCTIONS +#ifdef COMMON_FUNCTIONS +#if 0 +static void __vcui_doc_launch_ug_common_back_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *navi = data; + elm_naviframe_item_pop(navi); +} +#endif + +#ifdef _LOCAL_UG_EFFECT_ +static void __vcui_doc_launch_ug_common_hide_effect_finished(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + struct vcui_ug_priv_data *temp_priv_data = (struct vcui_ug_priv_data *)data; + + Evas_Object *base; + base = temp_priv_data->need_layout; + + if (temp_priv_data->need_ug != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_common_hide_effect_finished start"); + + if (base != NULL) + evas_object_hide(base); + + elm_object_part_content_unset(base, "elm.swallow.content"); + + if (temp_priv_data->on_destroy_callback != NULL) + temp_priv_data->on_destroy_callback(temp_priv_data->destroy_callback_param); + + ug_destroy((ui_gadget_h)(temp_priv_data->need_ug)); + + free(temp_priv_data); + local_priv_data = NULL; + + evas_object_del(base); + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_common_hide_effect_finished end"); + } +} +#endif + +static void __vcui_doc_launch_ug_common_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) +{ + Evas_Object *base, *win; + + if (!ug) + return; + + base = ug_get_layout(ug); + if (!base) + return; + +#ifdef _LOCAL_UG_EFFECT_ + Evas_Object *ly = elm_layout_add(temp_priv_data->need_parent); + win = ug_get_window(); + elm_win_resize_object_add(win, ly); + elm_layout_file_set(ly, EDJ_NAME, "ug_effect"); + elm_object_part_content_set(ly, "elm.swallow.content", base); + evas_object_show(ly); + temp_priv_data->need_layout = ly; + + edje_object_signal_callback_add(elm_layout_edje_get(ly), "elm,action,hide,finished", "", __vcui_doc_launch_ug_common_hide_effect_finished, temp_priv_data); + edje_object_signal_emit(elm_layout_edje_get(ly), "elm,state,show", ""); +#else + win = ug_get_window(); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, base); + evas_object_show(base); +#endif +} + +static void __vcui_doc_launch_ug_common_destroy_cb(ui_gadget_h ug, void *priv) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ""); + struct vcui_ug_priv_data *temp_priv_data = NULL; + if (priv != NULL) + temp_priv_data = (struct vcui_ug_priv_data *)priv; + else + temp_priv_data = local_priv_data; + +#ifdef _LOCAL_UG_EFFECT_ + if (temp_priv_data->need_navi != NULL) { + + if (ug != NULL) { + ug_destroy(ug); + + if (temp_priv_data->on_destroy_callback != NULL) + temp_priv_data->on_destroy_callback(temp_priv_data->destroy_callback_param); + + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)(temp_priv_data->need_ug_lists); + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_remove(pugs_array->ug_lists, temp_priv_data->need_ug); + pugs_array->ug_count = pugs_array->ug_count - 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + } + free(temp_priv_data); + local_priv_data = NULL; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_common_destroy_cb"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)(temp_priv_data->need_ug_lists); + CALL_UI_DEBUG(VC_LOG_DEBUG, "pugs_array(0x%x)"); + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_remove(pugs_array->ug_lists, temp_priv_data->need_ug); + pugs_array->ug_count = pugs_array->ug_count - 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + } + edje_object_signal_emit(elm_layout_edje_get(temp_priv_data->need_layout), "elm,state,hide", ""); + CALL_UI_DEBUG(VC_LOG_DEBUG, "Send Hide"); + } +#else + if (ug != NULL) { + ug_destroy(ug); + + if (temp_priv_data->on_destroy_callback != NULL) + temp_priv_data->on_destroy_callback(temp_priv_data->destroy_callback_param); + + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)(temp_priv_data->need_ug_lists); + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_remove(pugs_array->ug_lists, temp_priv_data->need_ug); + pugs_array->ug_count = pugs_array->ug_count - 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + } + free(temp_priv_data); + local_priv_data = NULL; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_common_destroy_cb"); +#endif +} +#endif + +static void __vcui_doc_launch_ug_contact_list_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) +{ + __vcui_doc_launch_ug_common_layout_cb(ug, mode, priv); + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_contact_list_layout_cb success"); +} + +static void __vcui_doc_launch_ug_contact_list_destroy_cb(ui_gadget_h ug, void *priv) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + __vcui_doc_launch_ug_common_destroy_cb(ug, priv); + ad->contact_ug = NULL; + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_contact_list_destroy_cb success"); +} + +static void __vcui_doc_launch_ug_contact_list_result_cb(ui_gadget_h ug, service_h result, void *priv) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_contact_list_result_cb nothing"); +} + +void _vcui_doc_launch_contact_list_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "_vcui_doc_launch_contact_list_ug start"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + service_h service; + + int ret = service_create(&service); + if (ret < 0) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_create() return error : %d", ret); + return; + } + + service_add_extra_data(service, "type", "1"); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_CONTACT_LIST) { + CALL_UI_DEBUG(VC_LOG_WARN, "launch exit because of same ug execution"); + service_destroy(service); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_contact_list_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_contact_list_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_contact_list_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "malloc error."); + service_destroy(service); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + ui_gadget_h ug = ug_create(parent_ui_gadget, PKGNAME_CONTACT_UG, UG_MODE_FULLVIEW, service, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG(VC_LOG_WARN, "_vcui_doc_launch_contact_list_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_CONTACT_LIST; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + ad->contact_ug = ug; + } + service_destroy(service); + CALL_UI_DEBUG(VC_LOG_DEBUG, "_vcui_doc_launch_contact_list_ug end"); +} + +static void __vcui_doc_launch_ug_phoneui_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) +{ + __vcui_doc_launch_ug_common_layout_cb(ug, mode, priv); + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_phoneui_layout_cb success"); +} + +static void __vcui_doc_launch_ug_phoneui_destroy_cb(ui_gadget_h ug, void *priv) +{ + __vcui_doc_launch_ug_common_destroy_cb(ug, priv); + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_phoneui_destroy_cb success"); +} + +static void __vcui_doc_launch_ug_phoneui_result_cb(ui_gadget_h ug, service_h result, void *priv) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_phoneui_result_cb nothing"); +} + +void _vcui_doc_launch_phoneui_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "launch_PHONEUI UG start"); + service_h service; + + int ret = service_create(&service); + if (ret < 0) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_create() return error : %d", ret); + return; + } + + service_add_extra_data(service, "type", "51"); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_ADD_CALL) { + CALL_UI_DEBUG(VC_LOG_WARN, "launch exit because of same ug execution"); + service_destroy(service); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_phoneui_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_phoneui_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_phoneui_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "malloc error."); + service_destroy(service); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + ui_gadget_h ug = ug_create(parent_ui_gadget, PKGNAME_DIALER_UG, UG_MODE_FULLVIEW, service, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG(VC_LOG_WARN, "_vcui_doc_launch_contact_list_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_ADD_CALL; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + } + service_destroy(service); + CALL_UI_DEBUG(VC_LOG_DEBUG, "_vcui_doc_launch_contact_list_ug end"); +} + +#if 0 +static void __vcui_doc_launch_render_flush_post_cb(void *data, Evas *e, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + if (!ad) + return; + + edje_object_signal_emit(_EDJ(ad->ly), "elm,state,show", ""); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, __vcui_doc_launch_render_flush_post_cb); +} +#endif + +void _vcui_doc_launch_msg_composer(void *data, char *number) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + service_h service; + int ret = SERVICE_ERROR_NONE; + + ret = service_create(&service); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_create() return error : %d", ret); + return; + } + + ret = service_set_operation(service, SERVICE_OPERATION_SEND_TEXT); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_set_operation() return error : %d", ret); + ret = service_destroy(service); + return; + } + + ret = service_set_package(service, MSG_PKG); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_set_package() return error : %d", ret); + ret = service_destroy(service); + return; + } + + ret = service_add_extra_data(service, SERVICE_DATA_TO, number); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_add_extra_data() return error : %d", ret); + ret = service_destroy(service); + return; + } + + ret = service_send_launch_request(service, NULL, NULL); + if (ret != SERVICE_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_send_launch_request() is failed : %d", ret); + } + + service_destroy(service); +} + +void _vcui_doc_launch_destroy_ug_all(void *ugs_array_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array != NULL) { + pugs_array->ug_lists = eina_list_free(pugs_array->ug_lists); + pugs_array->ug_count = 0; + pugs_array->last_ug_type = VCUI_UG_TYPE_NOE; + +#ifdef _LOCAL_UG_EFFECT_ + if (local_priv_data->need_ug != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_common_hide_effect_finished start"); + base = local_priv_data->need_layout; + + if (base != NULL) { + evas_object_hide(base); + elm_layout_content_unset(base, "elm.swallow.content"); + evas_object_del(base); + } + if (local_priv_data->on_destroy_callback != NULL) + local_priv_data->on_destroy_callback(local_priv_data->destroy_callback_param); + + ug_destroy_all(); + + if (ad->contact_ug != NULL) { + ad->contact_ug = NULL; + _vcui_view_common_call_terminate_or_view_change(); + } + + free(local_priv_data); + local_priv_data = NULL; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_common_hide_effect_finished end"); + } +#else + ug_destroy_all(); + + if (ad->contact_ug != NULL) { + ad->contact_ug = NULL; + _vcui_view_common_call_terminate_or_view_change(); + } + + if (local_priv_data != NULL) { + free(local_priv_data); + local_priv_data = NULL; + } +#endif + } +} + +static void __vcui_doc_launch_ug_contact_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) +{ + __vcui_doc_launch_ug_common_layout_cb(ug, mode, priv); + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_contact_layout_cb success"); +} + +static void __vcui_doc_launch_ug_contact_result_cb(ui_gadget_h ug, service_h result, void *priv) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_phoneui_result_cb nothing"); +} + +static void __vcui_doc_launch_ug_contact_destroy_cb(ui_gadget_h ug, void *priv) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_doc_launch_ug_contact_destroy_cb.."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + __vcui_doc_launch_ug_common_destroy_cb(ug, priv); + ad->contact_ug = NULL; + _vcui_view_common_call_terminate_or_view_change(); +} + +void _vcui_doc_launch_add_to_contacts_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "launch_ADD_TO_CONTACTS UG start"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + service_h service; + char buf[4] = {0,}; + + int ret = service_create(&service); + if (ret < 0) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_create() return error : %d", ret); + return; + } + + snprintf(buf, sizeof(buf), "%d", 22); + service_add_extra_data(service, "type", buf); + CALL_UI_DEBUG(VC_LOG_DEBUG, "number %s", (char *)data); + service_add_extra_data(service, "ct_num", (char *)data); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_ADD_TO_CONTACTS) { + CALL_UI_DEBUG(VC_LOG_WARN, "launch exit because of same ug execution"); + service_destroy(service); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_contact_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_contact_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_contact_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "malloc error."); + service_destroy(service); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + ui_gadget_h ug = ug_create(parent_ui_gadget, ADD_TO_CONTACTS_UG, UG_MODE_FULLVIEW, service, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG(VC_LOG_WARN, "_vcui_doc_launch_add_to_contacts_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_ADD_TO_CONTACTS; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + ad->contact_ug = ug; + } + service_destroy(service); + CALL_UI_DEBUG(VC_LOG_DEBUG, "_vcui_doc_launch_add_to_contacts_ug end"); +} + +void _vcui_doc_launch_view_contact_ug(void *parent_ui_gadget, void *navi, void *parent, void (*on_start_callback) (void *), void (*on_destroy_callback) (void *), void *callback_param, void *ugs_array_data, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "launch_VIEW_CONTACT UG start"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + service_h service; + char buf[4] = {0,}; + char personId[128] = {0,}; + + int ret = service_create(&service); + if (ret < 0) { + CALL_UI_DEBUG(VC_LOG_WARN, "service_create() return error : %d", ret); + return; + } + + snprintf(buf, sizeof(buf), "%d", 0); + service_add_extra_data(service, "type", buf); /*CT_UG_REQUEST_DETAIL*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "peron_id %d", (int)data); + snprintf(personId, sizeof(personId), "%d", (int)data); + service_add_extra_data(service, "person_id", personId); + + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + if (pugs_array->last_ug_type == VCUI_UG_TYPE_VIEW_CONTACT) { + CALL_UI_DEBUG(VC_LOG_WARN, "launch exit because of same ug execution"); + service_destroy(service); + return; + } + struct ug_cbs cbs = { 0, }; + cbs.layout_cb = __vcui_doc_launch_ug_contact_layout_cb; + cbs.destroy_cb = __vcui_doc_launch_ug_contact_destroy_cb; + cbs.result_cb = __vcui_doc_launch_ug_contact_result_cb; + + struct vcui_ug_priv_data *temp_priv_data = malloc(sizeof(struct vcui_ug_priv_data)); + if (temp_priv_data == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "malloc error."); + service_destroy(service); + return; + } + temp_priv_data->on_start_callback = on_start_callback; + temp_priv_data->on_destroy_callback = on_destroy_callback; + temp_priv_data->destroy_callback_param = callback_param; + temp_priv_data->need_navi = navi; + temp_priv_data->need_parent = parent; + temp_priv_data->need_ug_lists = ugs_array_data; + local_priv_data = cbs.priv = temp_priv_data; + + ui_gadget_h ug = ug_create(parent_ui_gadget, VIEW_CONTACT_UG, UG_MODE_FULLVIEW, service, &cbs); + temp_priv_data->need_ug = ug; + if (ug == NULL) { + free(temp_priv_data); + local_priv_data = NULL; + CALL_UI_DEBUG(VC_LOG_WARN, "_vcui_doc_launch_view_contact_ug fail"); + } else { + struct vcui_ugs_array *pugs_array = (struct vcui_ugs_array *)ugs_array_data; + pugs_array->ug_count = pugs_array->ug_count + 1; + pugs_array->last_ug_type = VCUI_UG_TYPE_VIEW_CONTACT; + pugs_array->ug_lists = eina_list_append(pugs_array->ug_lists, (void *)ug); + ad->contact_ug = ug; + } + service_destroy(service); + CALL_UI_DEBUG(VC_LOG_DEBUG, "_vcui_doc_launch_view_contact_ug end"); +} + diff --git a/ui/src/vcui-document.c b/ui/src/vcui-document.c new file mode 100755 index 0000000..b3143c2 --- /dev/null +++ b/ui/src/vcui-document.c @@ -0,0 +1,948 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-document.h" + +struct _call_data_t { + unsigned char call_handle; + int contact_id; + int contact_phone_type; + time_t start_time; + + char call_num[VC_PHONE_NUMBER_LENGTH_MAX]; + char call_display[VC_DISPLAY_NAME_LENGTH_MAX]; + char call_file_path[VC_IMAGE_PATH_LENGTH_MAX]; + + gboolean brejected; /* auto reject */ + gboolean bfwded; /* forwarded call */ + + /* The below 2 fields are required on UI side as well, even though we can get these values from engine data structure + * When call is ended, engine will clear the call object info and hence we cannot get these status at this moment + * So we have to maintain a copy in UI side as well */ + int call_type; /* whether MO or MT call*/ + int caller_status; /* HOLD/UNHOLD */ +}; + +static call_data_t *recent_mo; +static call_data_t *recent_mt; +static call_data_t *recent_call; +static Eina_List *caller_list; + +/** + * This function initializes the data structure pointers maintained in the document file + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_data_init() +{ + recent_mo = NULL; + recent_mt = NULL; + recent_call = NULL; + caller_list = NULL; +} + +/** + * This function allocates memory for the call data structure - call_data_t + * + * @return pointer to the memory allocated for call-data structure, or NULL if memory allocation fails + * @param[in] nothing +*/ +call_data_t *_vcui_doc_allocate_call_data_memory(void) +{ + call_data_t *pcall_data = NULL; + + pcall_data = (call_data_t *)calloc(1, sizeof(call_data_t)); + if (pcall_data == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "memory allocation failed..."); + } + return pcall_data; +} + +/** + * This function retrieves the value of the call handle + * + * @return value of the call handle + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_handle(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->call_handle; +} + +/** + * This function assigns the value of call handle for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] call_handle new value of the call handle +*/ +void _vcui_doc_set_call_handle(call_data_t *pcall_data, int call_handle) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->call_handle = call_handle; +} + +/** + * This function retrieves the value of the call number + * + * @return pointer to the call number string + * @param[in] pcall_data pointer to the call-data structure +*/ +char *_vcui_doc_get_call_number(call_data_t *pcall_data) +{ + VCUI_RETURN_NULL_IF_FAIL(pcall_data); + return (char *) pcall_data->call_num; +} + +/** + * This function assigns the value of call number for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] pnumber pointer to the call number string +*/ +void _vcui_doc_set_call_number(call_data_t *pcall_data, char *pnumber) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + memset(pcall_data->call_num, 0, sizeof(pcall_data->call_num)); + vcall_engine_util_strcpy(pcall_data->call_num, VC_PHONE_NUMBER_LENGTH_MAX, pnumber); +} + +/** + * This function retrieves the value of the call name (available from contact DB) + * + * @return pointer to the call name string + * @param[in] pcall_data pointer to the call-data structure +*/ +char *_vcui_doc_get_call_display_name(call_data_t *pcall_data) +{ + VCUI_RETURN_NULL_IF_FAIL(pcall_data); + return (char *) pcall_data->call_display; +} + +/** + * This function assigns the value of contact name for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] pname pointer to the call number string +*/ +void _vcui_doc_set_call_display_name(call_data_t *pcall_data, char *pname) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + memset(pcall_data->call_display, 0, sizeof(pcall_data->call_display)); + vcall_engine_util_strcpy(pcall_data->call_display, VC_DISPLAY_NAME_LENGTH_MAX, pname); +} + +/** + * This function retrieves the caller-ID file path (caller-ID for split screen) + * + * @return pointer to the caller-ID file path string + * @param[in] pcall_data pointer to the call-data structure +*/ +char *_vcui_doc_get_caller_id_file_path(call_data_t *pcall_data) +{ + VCUI_RETURN_NULL_IF_FAIL(pcall_data); + return (char *) pcall_data->call_file_path; +} + +/** + * This function assigns the value of caller-ID file-path for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] pfile_path pointer to the caller-ID file-path string +*/ +void _vcui_doc_set_caller_id_file_path(call_data_t *pcall_data, char *pfile_path) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + memset(pcall_data->call_file_path, 0, sizeof(pcall_data->call_file_path)); + vcall_engine_util_strcpy(pcall_data->call_file_path, VC_IMAGE_PATH_LENGTH_MAX, pfile_path); +} + +/** + * This function retrieves the value of the call start time + * + * @return value of the call start time + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_start_time(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->start_time; +} + +/** + * This function assigns the value of call start time for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure +*/ +void _vcui_doc_set_call_start_time(call_data_t *pcall_data) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + time(&(pcall_data->start_time)); +} + +/** + * This function retrieves the value of the contact index + * + * @return value of the contact index + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_contact_index(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->contact_id; +} + +/** + * This function assigns the value of contact index for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] contact_index value of the contact index +*/ +void _vcui_doc_set_contact_index(call_data_t *pcall_data, int contact_index) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->contact_id = contact_index; +} + +/** + * This function retrieves the value of the contact phone type + * + * @return value of the contact phone type + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_contact_phone_type(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->contact_phone_type; +} + +/** + * This function assigns the value of contact phone type for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] phone_type value of the contact phone type +*/ +void _vcui_doc_set_contact_phone_type(call_data_t *pcall_data, int phone_type) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->contact_phone_type = phone_type; +} + +/** + * This function retrieves the value of the forwarded call state + * + * @return value of the forwarded call state + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_forwarded_call(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->bfwded; +} + +/** + * This function assigns the value of forwarded call state for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] bfwded value of the forwarded call state +*/ +void _vcui_doc_set_forwarded_call(call_data_t *pcall_data, int bfwded) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->bfwded = bfwded; +} + +/** + * This function retrieves the value of the auto reject status + * + * @return value of the auto reject status + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_auto_reject_status(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->brejected; +} + +/** + * This function assigns the value of auto reject status for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] bauto_rejected value of the auto reject status +*/ +void _vcui_doc_set_auto_reject_status(call_data_t *pcall_data, gboolean bauto_rejected) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->brejected = bauto_rejected; +} + +/** + * This function retrieves if a call is MO or MT type + * + * @return value of the call type - MO or MT + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_type(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->call_type; +} + +/** + * This function assigns the value of call type for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] call_type type of call, MO or MT +*/ +void _vcui_doc_set_call_type(call_data_t *pcall_data, int call_type) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->call_type = call_type; +} + +/** + * This function retrieves the call status of a particular call data structure (HOLD/UNHOLD) + * + * @return value of the call status, HOLD/UNHOLD + * @param[in] pcall_data pointer to the call-data structure +*/ +int _vcui_doc_get_call_status(call_data_t *pcall_data) +{ + VCUI_RETURN_INVALID_IF_FAIL(pcall_data); + return pcall_data->caller_status; +} + +/** + * This function assigns the value of call status for a given pointer of the call-data structure + * + * @return nothing + * @param[in] pcall_data pointer to the call-data structure + * @param[in] call_status status of call, active/held +*/ +void _vcui_doc_set_call_status(call_data_t *pcall_data, int call_status) +{ + VCUI_RETURN_IF_FAIL(pcall_data); + pcall_data->caller_status = call_status; +} + +/** + * This function retrieves the pointer to the most recent MO(outgoing) call data + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_mo_call_data() +{ + return recent_mo; +} + +/** + * This function assigns the pointer of the most recent MO(outgoing) call data + * to the pointer stored in the vcui-document file (recent_mo) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_set_mo_call_data(call_data_t *in) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + if (in == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "set recent_mo to null"); + } + if (recent_mo != NULL && recent_mo->call_handle == NO_HANDLE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Set_recent 1"); + free(recent_mo); + recent_mo = NULL; + } + _vcui_doc_set_all_recent(in); + recent_mo = in; +} + +/** + * This function retrieves the pointer to the most recent MT(incoming) call data + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_mt_call_data() +{ + return recent_mt; +} + +/** + * This function assigns the pointer of the most recent MT(incoming) call data + * to the pointer stored in the vcui-document file (recent_mt) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_set_mt_call_data(call_data_t *in) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + if (in == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "set recent_mt to null"); + } + _vcui_doc_set_all_recent(in); + recent_mt = in; +} + +/** + * This function retrieves the pointer to the most recent call data, either MT(incoming)/MO(outgoing) + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_recent_call_data() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + if (recent_call == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "recent is NULL"); + if (recent_mo != NULL) { + recent_call = recent_mo; + CALL_UI_DEBUG(VC_LOG_DEBUG, "recent is mo"); + } else if (recent_mt != NULL) { + recent_call = recent_mt; + CALL_UI_DEBUG(VC_LOG_DEBUG, "recent is mt"); + } + } + return recent_call; +} + +/** + * This function assigns the pointer of the most recent MT(incoming)/MO(outgoing) call data + * to the pointer stored in the vcui-document file (recent_call) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_set_all_recent(call_data_t *in) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + if (in == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "set recent_call to null"); + } + recent_call = in; +} + +/** + * This function adds the call data structure to the list of call data maintained in the + * vcui-document file (caller_list link list) + * + * @return nothing + * @param[in] in pointer to the call-data structure to be copied/assigned +*/ +void _vcui_doc_add_call_data(call_data_t *in) +{ + if (in == NULL) + return; + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + return; + } + } + + caller_list = eina_list_append(caller_list, (void *)in); +} + +/** + * This function updates the call data structure contained in the list of call data maintained in the + * vcui-document file (caller_list link list) with the new call-data structure + * + * @return nothing + * @param[in] in pointer to the call-data structure to be updated +*/ +void _vcui_doc_update_call_data(call_data_t *in) +{ + if (in == NULL) + return; + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + *cd = *in; + return; + } + } +} + +/** + * This function checks if the call data pointer data is valid and present in the 'caller_list' list + * + * @return TRUE if the call-data is present and FALSE if there is no such call-data in the list + * @param[in] in pointer to the call-data structure +*/ +Eina_Bool _vcui_doc_is_valid_call_data(call_data_t *in) +{ + if (in == NULL) + return EINA_FALSE; + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + return EINA_TRUE; + } + } + + return EINA_FALSE; +} + +/** + * This function removes the call data structure from the list of call data maintained in the + * vcui-document file (caller_list link list) and frees the call data structure + * + * @return nothing + * @param[in] in pointer to the call-data structure to be added +*/ +void _vcui_doc_remove_call_data(call_data_t *in) +{ + if (in == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "Call data is Null"); + return; + } + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + if (in == _vcui_doc_get_mo_call_data()) + _vcui_doc_set_mo_call_data(NULL); + if (in == _vcui_doc_get_mt_call_data()) + _vcui_doc_set_mt_call_data(NULL); + + caller_list = eina_list_remove(caller_list, in); + free(in); + in = NULL; + CALL_UI_DEBUG(VC_LOG_DEBUG, "Call data removed"); + break; + } + + } + + if (_vcui_doc_get_all_call_data_count() == 0) { + eina_list_free(caller_list); + caller_list = NULL; + } + +} + +/** + * This function removes the call data structure from the list of call data maintained in the + * vcui-document file (caller_list link list) + * + * @return a pointer to the call data structure which is passed + * @param[in] in pointer to the call-data structure to be added +*/ +call_data_t *_vcui_doc_remove_call_data_from_list(call_data_t *in) +{ + if (in == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "Call data is Null"); + return NULL; + } + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd == in) { + caller_list = eina_list_remove(caller_list, in); + return in; + } + } + return NULL; +} + +/** + * This function removes all the call data from list and frees the memory + * + * @return nothing + * @param[in] void +*/ +void _vcui_doc_remove_all_call_data() +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + free(cd); + cd = NULL; + } + } + eina_list_free(caller_list); + caller_list = NULL; +} + +/** + * This function retrieves the earliest call data based on the call status + * + * @return pointer to the call data structure + * @param[in] call_status value of the call status (hold/unhold) +*/ +call_data_t *_vcui_doc_get_call_data_by_call_status(int call_status) +{ + + Eina_List *l = NULL; + call_data_t *fast_cd = NULL; + call_data_t *cd = NULL; + int i = 0; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == call_status) { + if (i == 0) { + fast_cd = cd; + i++; + continue; + } else { + if (fast_cd->start_time > cd->start_time) { + fast_cd = cd; + } + } + i++; + } + } + } + return fast_cd; +} + +/** + * This function retrieves the most recent MO call data + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_call_data_mo_type() +{ + + Eina_List *l = NULL; + call_data_t *last_cd = NULL; + call_data_t *cd = NULL; + int i = 0; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->call_type == CALL_OUTGOING) { + if (i == 0) { + last_cd = cd; + i++; + continue; + } else { + if (last_cd->start_time < cd->start_time) { + last_cd = cd; + } + } + i++; + } + } + } + return last_cd; +} + +/** + * This function retrieves the first call data in the list + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_first_call_data_from_list() +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + return cd; + } + } + return NULL; +} + +/** + * This function retrieves the first call data in the list which is of UNHOLD status + * + * @return pointer to the call data structure + * @param[in] nothing +*/ +call_data_t *_vcui_doc_get_first_call_data_by_unhold_status() +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_UNHOLD) { + return cd; + } + } + } + return NULL; +} + +/** + * This function retrieves the call data based on the given call handle + * + * @return pointer to the call data structure + * @param[in] handle value of the call handle +*/ +call_data_t *_vcui_doc_get_call_data_by_handle(int handle) +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->call_handle == handle) { + return cd; + } + } + } + return NULL; +} + +/** + * This function retrieves the count of call data which are in HOLD status + * + * @return count of held call data + * @param[in] nothing +*/ +int _vcui_doc_get_hold_call_data_count() +{ + int i = 0; + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + i++; + } + } + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "(%d)", i); + return i; +} + +/** + * This function retrieves the count of call data which are in UNHOLD status + * + * @return count of active call data + * @param[in] nothing +*/ +int _vcui_doc_get_unhold_call_data_count() +{ + int i = 0; + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_UNHOLD) { + i++; + } + } + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "(%d)", i); + return i; +} + +/** + * This function retrieves the count of call data which are in NO status (neither hold/unhold) + * + * @return count of 'no status' call data + * @param[in] nothing +*/ +int _vcui_doc_get_no_status_call_data_count() +{ + int i = 0; + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == NO_STATUS) { + i++; + } + } + } + return i; +} + +/** + * This function retrieves the count of all call data in the list + * + * @return count of all call data + * @param[in] nothing +*/ +int _vcui_doc_get_all_call_data_count() +{ + int i = eina_list_count(caller_list); + return i; +} + +/** + * This function retrieves the call status of a group (greater than 1 member group) + * + * @return value of the call status (HOLD/UNHOLD) + * @param[in] nothing +*/ +int _vcui_doc_get_group_call_status() +{ + if (_vcui_doc_get_all_call_data_count() > 1) { + if (_vcui_doc_get_hold_call_data_count() > 1) { + return CALL_HOLD; + } else { + return CALL_UNHOLD; + } + } else { + return CALL_UNHOLD; + } +} + +/** + * This function retrieves the pointer to the list containing the call data with HOLD status + * + * @return pointer to the HOLD call data list + * @param[in] nothing +*/ +Eina_List *_vcui_doc_get_caller_list_with_hold_status() +{ + if (_vcui_doc_get_all_call_data_count() == 0) + return NULL; + Eina_List *hold_list = NULL; + Eina_List *l = NULL; + call_data_t *cd = NULL; + + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + hold_list = eina_list_append(hold_list, cd); + } + } + } + return hold_list; +} + +/** + * This function retrieves the pointer to the list containing the call data with UNHOLD status + * + * @return pointer to the UNHOLD call data list + * @param[in] nothing +*/ +Eina_List *_vcui_doc_get_caller_list_with_unhold_status() +{ + if (_vcui_doc_get_all_call_data_count() == 0) + return NULL; + Eina_List *unhold_list = NULL; + Eina_List *l = NULL; + call_data_t *cd = NULL; + + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "_vcui_doc_get_caller_list_with_unhold_status"); + if (cd->caller_status == CALL_UNHOLD) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "find it"); + unhold_list = eina_list_append(unhold_list, cd); + } + } + } + return unhold_list; +} + +/** + * This function prints all the call data structure members + * + * @return nothing + * @param[in] msg_pos type of message +*/ +void _vcui_doc_print_all_call_data(char *msg_pos) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, " --------%s------------", msg_pos); + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, " call_handle %d", cd->call_handle); + CALL_UI_DEBUG(VC_LOG_DEBUG, " call_num %s", cd->call_num); + CALL_UI_DEBUG(VC_LOG_DEBUG, " call_display %s", cd->call_display); + CALL_UI_DEBUG(VC_LOG_DEBUG, " call_file_path %s", cd->call_file_path); + CALL_UI_DEBUG(VC_LOG_DEBUG, " call_time %d", (int)(cd->start_time)); + } + } + CALL_UI_DEBUG(VC_LOG_DEBUG, " --------------------------"); +} + +/** + * This function assigns UNHOLD call status to all the call data in the list + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_set_all_call_data_to_unhold_status() +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + cd->caller_status = CALL_UNHOLD; + } + } + } +} + +/** + * This function assigns HOLD call status to all the call data in the list + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_set_all_call_data_to_hold_status() +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_UNHOLD) { + cd->caller_status = CALL_HOLD; + } + } + } +} + +/** + * This function swaps the HOLD and UNHOLD calls in the call list + * + * @return nothing + * @param[in] nothing +*/ +void _vcui_doc_swap_all_call_data_status() +{ + Eina_List *l = NULL; + call_data_t *cd = NULL; + EINA_LIST_FOREACH(caller_list, l, cd) { + if (cd != NULL) { + if (cd->caller_status == CALL_HOLD) { + cd->caller_status = CALL_UNHOLD; + } else if (cd->caller_status == CALL_UNHOLD) { + cd->caller_status = CALL_HOLD; + } + } + } +} + diff --git a/ui/src/vcui-view-callend.c b/ui/src/vcui-view-callend.c new file mode 100755 index 0000000..909e5bb --- /dev/null +++ b/ui/src/vcui-view-callend.c @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-common.h" +#include "vcui-view-callend.h" +#include "vcui-view-elements.h" + +#define VCUI_VIEW_CALLEND_LAYOUT_ID "ENDCALLVIEW" +typedef struct { + Evas_Object *contents; + Evas_Object *caller_info; + Evas_Object *caller_id; + Evas_Object *btn_ly; + Evas_Object *ic; /* small size call image */ + vcui_app_call_status_t call_status; +} endcall_view_priv_t; + +static call_data_t *call_data = NULL; + +static int __vcui_view_callend_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_callend_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_callend_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_callend_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_callend_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_ENDCALL_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_callend_oncreate, + .onUpdate = __vcui_view_callend_onupdate, + .onHide = __vcui_view_callend_onhide, + .onShow = __vcui_view_callend_onshow, + .onDestroy = __vcui_view_callend_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_callend_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(endcall_view_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_WARN, "ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static void __vcui_view_callend_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + + /* ============ Check valid Evas Object ============= */ + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_CALLEND_LAYOUT_ID); + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_ERR, "[========== ENDCALLVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + char *file_path = NULL; + char *call_number = NULL; + char *call_name = NULL; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "CALL_END_TYPE_SINGLE_CALL type end screen"); + + file_path = _vcui_doc_get_caller_id_file_path(call_data); + call_number = _vcui_doc_get_call_number(call_data); + call_name = _vcui_doc_get_call_display_name(call_data); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "file_path: %s", file_path); + + if (strcmp(file_path, NOIMG_ICON) == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "no-img"); + edje_object_signal_emit(_EDJ(priv->caller_id), "show-no-cid-connected", "cid-img"); + } else { + _vcui_show_caller_id(priv->caller_id, file_path); + /*put blur effect on full-cid*/ + } + + _vcui_create_voicecall_button(vd, call_number); + if (_vcui_view_common_is_emul_bin() == EINA_FALSE) { + _vcui_create_videocall_button(vd, call_number); + _vcui_create_message_button(vd, call_number); + } + + /* call name (if nothing, call number) */ + if (strlen(call_name) == 0) { + _vcui_show_caller_info_name(vd, call_number, EINA_FALSE); + if (_vcui_view_common_is_emul_bin() == EINA_FALSE) { + _vcui_create_add_to_contacts_button(vd, call_number); + } + } else { + int ct_id = _vcui_doc_get_contact_index(call_data); + _vcui_show_caller_info_name(vd, call_name, EINA_FALSE); + _vcui_show_caller_info_number(vd, call_number, EINA_FALSE); + if (_vcui_view_common_is_emul_bin() == EINA_FALSE) { + _vcui_create_view_contact_button(vd, ct_id); + } + } + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data)); + } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "CALL_END_TYPE_CONF_CALL type end screen"); + char buf[DEF_BUF_LEN] = { 0, }; + + /* Conference image */ + priv->ic = _vcui_show_default_image(priv->contents, CONF_ICON); + if (priv->call_status == CALL_HOLD) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ad->root_w: %d ad->root_h: %d", ad->root_w, ad->root_h); + if (ad->root_w == MAIN_WIN_HD_W && ad->root_h == MAIN_WIN_HD_H) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_HD", "CID_HD"); + } else if (ad->root_w == MAIN_WIN_WVGA_W && ad->root_h == MAIN_WIN_WVGA_H) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_WVGA", "CID_WVGA"); + } + } else { + edje_object_signal_emit(_EDJ(priv->contents), "HIDE_DIM", "CID"); + } + _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_FALSE); + snprintf(buf, DEF_BUF_LEN, "%d %s", (_vcui_doc_get_hold_call_data_count() + _vcui_doc_get_unhold_call_data_count()), _("IDS_CALL_BODY_PEOPLE")); + _vcui_show_caller_info_number(vd, buf, EINA_FALSE); + + /*create a small button for Hold/Swap*/ + _vcui_create_hold_swap_button(vd); + + _vcui_create_bottom_first_button_disabled(vd); + _vcui_create_bottom_second_button_disabled(vd); + _vcui_create_top_end_button_disabled(vd); + _vcui_create_bottom_third_button_disabled(vd); + _vcui_create_bottom_fourth_button_disabled(vd); + _vcui_create_bottom_fifth_button_disabled(vd); + + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "invalid type... return"); + return; + } + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_callend_create_contents(void *data, char *grp_name) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo = NULL; + + eo = _vcui_load_edj(vd->layout, EDJ_NAME, grp_name); + + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_callend_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_WARN, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_callend_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "endcall view create"); + voice_call_view_data_t *vd = view_data; + vcui_app_call_data_t *ad = vd->app_data; + endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv; + Evas_Object *sep_ly = NULL; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "call_end_type[%d]", ad->call_end_type); + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + call_data = (call_data_t *)param2; + } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + priv->call_status = _vcui_doc_get_group_call_status(); + call_data = _vcui_doc_get_call_data_by_call_status(priv->call_status); + } + + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "call Data is NULL"); + return VC_ERROR; + } + + if (!vd->layout) { + + /* Create Main Layout */ + vd->layout = __vcui_view_callend_create_layout_main(vd->app_data->win_conformant); + if (vd->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "ERROR"); + return VC_ERROR; + } + elm_object_content_set(ad->win_conformant, view_data->layout); + + /* Create Contents */ + if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + priv->contents = __vcui_view_callend_create_contents(vd, GRP_END_SINGLECALL); + sep_ly = __vcui_view_callend_create_contents(vd, GRP_SEPARATOR_LAYOUT_3BUTTON); + elm_object_part_content_set(priv->contents, "btn_bg", sep_ly); + + priv->caller_id = __vcui_view_callend_create_contents(vd, GRP_CALLER_ID_LAYOUT); + elm_object_part_content_set(priv->contents, "caller_id", priv->caller_id); + } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) { + priv->contents = __vcui_view_callend_create_contents(vd, GRP_END_CONFCALL); + sep_ly = __vcui_view_callend_create_contents(vd, GRP_SEPARATOR_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_bg", sep_ly); + priv->btn_ly = __vcui_view_callend_create_contents(vd, GRP_BUTTON_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly); + } + priv->caller_info = __vcui_view_callend_create_contents(vd, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info", priv->caller_info); + edje_object_signal_emit(_EDJ(priv->caller_info), "set-end-caller_ifno", "end-screen"); + + elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents); + + evas_object_name_set(priv->contents, VCUI_VIEW_CALLEND_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== ENDCALLVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[UI]ad->layout_end call==NULL case "); + evas_object_show(vd->layout); + } + + __vcui_view_callend_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_callend_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "end call view update"); + + __vcui_view_callend_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_callend_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "end call view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_callend_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "end call view show"); + CALL_UI_KPI("__vcui_view_callend_onshow start"); + endcall_view_priv_t *priv = (endcall_view_priv_t *)view_data->priv; + + /*change the orientation to normal - 0 */ + elm_win_rotation_with_resize_set(view_data->app_data->win_main, 0); + elm_win_rotation_with_resize_set(view_data->app_data->popup_mw, 0); + + __vcui_view_callend_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_callend_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "endcall view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_ENDCALL_VIEW]; + endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + if (priv->caller_info) { + evas_object_del(priv->caller_info); + priv->caller_info = NULL; + } + + if (priv->caller_id) { + evas_object_del(priv->caller_id); + priv->caller_id = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_ENDCALL_VIEW] = NULL; + call_data = NULL; + ad->call_end_type = CALL_END_TYPE_NONE; + + _vcui_cache_flush(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "complete destroy one view"); + return VC_NO_ERROR; +} + +int _vc_ui_view_callend_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + endcall_view_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (endcall_view_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_CALLEND_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vc_ui_view_callend_get_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + endcall_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (endcall_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + +Evas_Object *_vc_ui_view_callend_get_button_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + endcall_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (endcall_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->btn_ly; +} + +void _vc_ui_view_callend_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur) +{ + endcall_view_priv_t *priv = NULL; + + VCUI_RETURN_IF_FAIL(vd); + priv = (endcall_view_priv_t *) vd->priv; + + VCUI_RETURN_IF_FAIL(priv); + edje_object_part_text_set(_EDJ(priv->caller_info), "txt_status", _(pcall_dur)); +} + +Evas_Object *_vc_ui_view_callend_get_caller_info(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + endcall_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (endcall_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info; +} + diff --git a/ui/src/vcui-view-choice.c b/ui/src/vcui-view-choice.c new file mode 100755 index 0000000..4a4e32c --- /dev/null +++ b/ui/src/vcui-view-choice.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-app-data.h" +#include "vcui-view-choice.h" +#include "vcui-view-dialing.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-keypad.h" +#include "vcui-view-callend.h" +static const char *vcui_view_name[] = { + "VIEW_DIALLING_VIEW", + "VIEW_INCOMING_LOCK_VIEW", + "VIEW_INCALL_ONECALL_VIEW", + "VIEW_INCALL_MULTICALL_SPLIT_VIEW", + "VIEW_INCALL_MULTICALL_CONF_VIEW", + "VIEW_INCALL_MULTICALL_LIST_VIEW", + "VIEW_ENDCALL_VIEW", + "VIEW_QUICKPANEL_VIEW", + "VIEW_MAX", +}; + +void _vcui_view_change(vcui_app_call_view_id_t view_id, int param1, void *param2, void *param3) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int valid = 0; + CALL_UI_DEBUG(VC_LOG_DEBUG, "view:[%d] -> [%d]", ad->view_top, view_id); + if (view_id >= VIEW_MAX) { + CALL_UI_DEBUG(VC_LOG_ERR, "[=========== ERROR!!!! Invalid View ID : %d =================]", view_id); + return; + } + ad->ball_view_hide = EINA_FALSE; +#ifdef _DESTROY_UG_ALL_FORCE_ + if (ad->ugs_array_data.ug_count != 0) + _vcui_doc_launch_destroy_ug_all(&(ad->ugs_array_data)); +#else + if (ad->ugs_array_data.ug_count != 0) { + Eina_List *l = NULL; + ui_gadget_h ug = NULL; + EINA_LIST_FOREACH(ad->ugs_array_data.ug_lists, l, ug) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Destroy UG due to _vcui_view_change"); + ug_destroy(ug); + } + ad->ugs_array_data.ug_lists = eina_list_free(ad->ugs_array_data.ug_lists); + ad->ugs_array_data.ug_count = 0; + ad->ugs_array_data.last_ug_type = VCUI_UG_TYPE_NOE; + ad->contact_ug = NULL; + } +#endif + if (ad->view_st[view_id]) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[============ Layout exists !! ============]"); + voice_call_view_data_t *vd = (voice_call_view_data_t *) ad->view_st[view_id]; + if (vd->layout) { + if (view_id == VIEW_DIALLING_VIEW) { + valid = _vc_ui_view_dialing_check_valid_eo(vd); + } else if (view_id == VIEW_INCOMING_LOCK_VIEW) { + valid = _vc_ui_view_incoming_lock_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_ONECALL_VIEW) { + valid = _vc_ui_view_single_call_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_MULTICALL_SPLIT_VIEW) { + valid = _vcui_view_multi_call_split_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_MULTICALL_CONF_VIEW) { + valid = _vcui_view_multi_call_conf_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_MULTICALL_LIST_VIEW) { + valid = _vcui_view_multi_call_list_check_valid_eo(vd); + } else if (view_id == VIEW_ENDCALL_VIEW) { + valid = _vc_ui_view_callend_check_valid_eo(vd); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "[============ BAD INPUT!!!! Check Input Layout!!!!! %d============]", view_id); + } + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_WARN, "[========== WARNING!! Invalid Evas Object ==========]"); + ad->view_st[view_id] = NULL; + /* free priv */ + } + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[============ Create Layout !! ============]"); + } + ad->view_before_top = ad->view_top; /* hold the current top window in the before_top pointer */ + ad->view_top = view_id; /* set the new top window to the view_id which is passed... this step enables in setting 00:00:00 as timer */ + if (view_id == VIEW_DIALLING_VIEW || view_id == VIEW_INCOMING_LOCK_VIEW) { + _vcui_raise_main_win(); + } + if ((ad->view_before_top != -1) && (ad->view_before_top != view_id)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "hide & destroy [%d]", ad->view_before_top); + CALL_UI_KPI("%s onHide start", vcui_view_name[ad->view_before_top]); + ad->view_st[ad->view_before_top]->onHide(ad->view_st[ad->view_before_top]); + CALL_UI_KPI("%s onHide done", vcui_view_name[ad->view_before_top]); + CALL_UI_KPI("%s onDestroy start", vcui_view_name[ad->view_before_top]); + ad->view_st[ad->view_before_top]->onDestroy(ad->view_st[ad->view_before_top]); + CALL_UI_KPI("%s onDestroy done", vcui_view_name[ad->view_before_top]); + } + if (ad->view_st[view_id] == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Create view data"); + voice_call_view_data_t *view_data = ad->func_new[view_id] (ad); + ad->view_st[view_id] = view_data; + } + if (ad->view_st[view_id]->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Create layout"); + CALL_UI_KPI("%s onCreate start", vcui_view_name[view_id]); + ad->view_st[view_id]->onCreate(ad->view_st[view_id], param1, param2, param3); + CALL_UI_KPI("%s onCreate done", vcui_view_name[view_id]); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Update layout"); + CALL_UI_KPI("%s onUpdate start", vcui_view_name[view_id]); + ad->view_st[view_id]->onUpdate(ad->view_st[view_id], param2, param3); + CALL_UI_KPI("%s onUpdate done", vcui_view_name[view_id]); + } + _vcui_show_main_ui_set_flag(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "End"); +} + +void _vcui_view_auto_change() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + void *data = _vcui_view_get_second_mtcall_popup_data(); + _vcui_view_popup_second_mtcall_unload(data); + + if (_vcui_doc_get_no_status_call_data_count() == 1) { + call_data_t *call_data = _vcui_doc_get_recent_call_data(); + int call_type = _vcui_doc_get_call_type(call_data); + if (call_type == CALL_OUTGOING) { + _vcui_view_change(VIEW_DIALLING_VIEW, 0, NULL, NULL); + } else if (call_type == CALL_INCOMING) { + _vcui_view_change(VIEW_INCOMING_LOCK_VIEW, 0, NULL, NULL); + } else { + CALL_UI_DEBUG(VC_LOG_WARN, "ERROR"); + } + } else if (_vcui_doc_get_all_call_data_count() > 1) { + if (_vcui_doc_get_unhold_call_data_count() == 0 || _vcui_doc_get_hold_call_data_count() == 0) { + _vcui_view_change(VIEW_INCALL_MULTICALL_CONF_VIEW, 0, NULL, NULL); + } else { + _vcui_view_change(VIEW_INCALL_MULTICALL_SPLIT_VIEW, 0, NULL, NULL); + } + } else { + _vcui_view_change(VIEW_INCALL_ONECALL_VIEW, 0, NULL, NULL); + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "End.."); +} + +void _vcui_view_all_hide() +{ + int i = 0; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + for (i = 0; i < VIEW_MAX; i++) { + if (ad->view_st[i] != NULL) { + ad->view_st[i]->onHide(ad->view_st[i]); + } + } + ad->ball_view_hide = EINA_TRUE; + _vcui_show_main_ui_set_flag(); +} + +void _vcui_view_update() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->view_top != -1 && ad->view_st[ad->view_top] != NULL) { + ad->view_st[ad->view_top]->onUpdate(ad->view_st[ad->view_top], NULL, NULL); + } + _vcui_show_main_ui_set_flag(); +} + +void _vcui_view_destroy(vcui_app_call_view_id_t view_id) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "view_id:[%d]", view_id); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->view_st[view_id]) { + ad->view_st[view_id]->onHide(ad->view_st[view_id]); + ad->view_st[view_id]->onDestroy(ad->view_st[view_id]); + } +} + +void _vcui_view_quickpanel_change() +{ +#ifdef _QUICKPANNEL_SUPPORT_ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + if (ad->win_quickpanel) { + if (_vcui_doc_get_all_call_data_count() < 1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "destroy quickpanel"); + ad->view_st[VIEW_QUICKPANEL_VIEW]->onHide(ad->view_st[VIEW_QUICKPANEL_VIEW]); + ad->view_st[VIEW_QUICKPANEL_VIEW]->onDestroy(ad->view_st[VIEW_QUICKPANEL_VIEW]); + ad->win_quickpanel = NULL; + } else { + if (ad->view_st[VIEW_QUICKPANEL_VIEW]->layout != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "update quickpanel"); + ad->view_st[VIEW_QUICKPANEL_VIEW]->onUpdate(ad->view_st[VIEW_QUICKPANEL_VIEW], NULL, NULL); + } + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "create quickpanel"); + if (ad->view_st[VIEW_QUICKPANEL_VIEW] == NULL) { + voice_call_view_data_t *view_data = ad->func_new[VIEW_QUICKPANEL_VIEW] (ad); + ad->view_st[VIEW_QUICKPANEL_VIEW] = view_data; + } + if (ad->view_st[VIEW_QUICKPANEL_VIEW]->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "create!!"); + ad->view_st[VIEW_QUICKPANEL_VIEW]->onCreate(ad->view_st[VIEW_QUICKPANEL_VIEW], 0, NULL, NULL); + } + } +#else + CALL_UI_DEBUG(VC_LOG_DEBUG, "Not applied yet"); +#endif +} diff --git a/ui/src/vcui-view-common.c b/ui/src/vcui-view-common.c new file mode 100755 index 0000000..a3dd02b --- /dev/null +++ b/ui/src/vcui-view-common.c @@ -0,0 +1,427 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "vcui-application.h" +#include "vcui-view-common.h" +#include "vcui-view-layout-hd.h" + +#include "vcui-view-dialing.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-keypad.h" +#include "vcui-view-callend.h" +#include "vcui-view-quickpanel.h" + +static vcui_view_common_t gincall_common_data; + +void _vcui_view_common_init() +{ + memset(&gincall_common_data, 0, sizeof(vcui_view_common_t)); +} + +static vcui_view_common_t *__vcui_view_common_get_common_data() +{ + return &gincall_common_data; +} + +static Eina_Bool __vcui_view_common_timer_cb(void *data) +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + char dur[TIME_BUF_LEN]; + static int end_count = 0; + + if (common_data->timer_flag == 1) { + if (common_data->time_end_flag == TIME_END_START) { + end_count = 0; + return 1; + } else if (common_data->time_end_flag == TIME_END_NO) { + end_count++; + if (end_count == 1) { + return 1; + } + } + } + common_data->current_call_time = time(NULL); + + if (common_data->timer_flag == 1) { + if (common_data->current_call_time > common_data->start_call_time) { + time_t call_time = common_data->current_call_time - common_data->start_call_time; + struct tm loctime; + + gmtime_r((const time_t *)&call_time, &loctime); + snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", loctime.tm_hour, loctime.tm_min, loctime.tm_sec); + + _vcui_view_common_set_text_time(dur); + } + } + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __vcui_view_common_timer_end_cb(void *data) +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + int end_type = common_data->end_type; + char dur[TIME_BUF_LEN]; + + if ((common_data->timer_flag == 1) && (common_data->time_end_flag == TIME_END_START)) { + snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", common_data->hour, common_data->min, common_data->sec); + if (common_data->time_count == 0) { + _vcui_view_common_set_text_time(dur); + } else if (common_data->time_count == 1) { + _vcui_view_common_set_text_time(_(" ")); + } else if (common_data->time_count == 2) { + _vcui_view_common_set_text_time(dur); + } else if (common_data->time_count == 3) { + _vcui_view_common_set_text_time(_(" ")); + } else if (common_data->time_count == 4) { + char data_txt[VC_DATA_LENGTH_MAX] = { 0, }; + _vcui_view_common_set_text_time(_vcui_get_endcause_string(end_type, data_txt)); + } + + common_data->time_count++; + if (common_data->time_count == TIME_END_MAX_SHOW) { + common_data->time_end_flag = TIME_END_NO; + common_data->time_count = 0; + + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + + _vcui_view_common_call_terminate_or_view_change(); + } + } + return 1; +} + +static Eina_Bool _vcui_view_common_call_end_initial_timer_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "..."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (common_data == NULL) { + CALL_UI_DEBUG(VC_LOG_ERR, "common_data = NULL"); + return ECORE_CALLBACK_CANCEL; + } + + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + common_data->tm_end = ecore_timer_add(TIMER_TIMEOUT_0_3_SEC, __vcui_view_common_timer_end_cb, NULL); + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool __vcui_view_common_timer_end_dialing_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } + + if (common_data->bredial == EINA_TRUE) { + vcall_engine_process_auto_redial(EINA_TRUE); + _vcui_view_popup_load_redial(); + } else { + _vcui_view_common_call_terminate_or_view_change(); + } + + return 1; +} + +static Eina_Bool __vcui_view_common_timer_end_force_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (common_data->tm_end_force) { + ecore_timer_del(common_data->tm_end_force); + common_data->tm_end_force = NULL; + } + + _vcui_view_common_call_terminate_or_view_change(); + + return 1; +} + +void _vcui_view_common_set_text_time(char *time_dur) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *data = ad->view_st[ad->view_top]; + + if (data != NULL) { + if (data->type == VIEW_INCALL_ONECALL_VIEW) { + _vc_ui_view_single_call_set_call_timer(data, time_dur); + } else if (data->type == VIEW_INCALL_MULTICALL_SPLIT_VIEW) { + _vcui_view_multi_call_split_set_call_timer(data, time_dur); + } else if (data->type == VIEW_INCALL_MULTICALL_CONF_VIEW) { + _vcui_view_multi_call_conf_set_call_timer(data, time_dur); + } else if (data->type == VIEW_INCALL_MULTICALL_LIST_VIEW) { + _vcui_view_multi_call_list_set_call_timer(data, time_dur); + } else if (data->type == VIEW_ENDCALL_VIEW) { + _vc_ui_view_callend_set_call_timer(data, time_dur); + } else { + /*to do nothing in case of other view. */ + } + } + + if (ad->win_quickpanel && ad->quickpanel_layout) { + _vc_ui_view_qp_set_call_timer(ad->quickpanel_layout, time_dur); + } +} + +void _vcui_view_common_set_each_time(time_t starttime) +{ + time_t curr_time; + unsigned long call_duration_in_sec = 0; + unsigned long sec = 0; + unsigned long min = 0; + unsigned long hr = 0; + + curr_time = time(&curr_time); + call_duration_in_sec = curr_time - starttime; + sec = call_duration_in_sec % 60; + min = (call_duration_in_sec / 60) % 60; + hr = call_duration_in_sec / 3600; + + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + /*set the start time for every call */ + common_data->start_call_time = starttime; + CALL_UI_DEBUG(VC_LOG_DEBUG, " common_data->start_call_time %lu", (unsigned long)common_data->start_call_time); + + CALL_UI_DEBUG(VC_LOG_DEBUG, " _vcui_view_common_set_each_time curr_time %d starttime %d", (int)curr_time, (int)starttime); + + common_data->sec = sec; + common_data->min = min; + common_data->hour = hr; + + char dur[TIME_BUF_LEN]; + snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", common_data->hour, common_data->min, common_data->sec); + if (common_data->timer_flag == 1) + _vcui_view_common_set_text_time(dur); + + CALL_UI_DEBUG(VC_LOG_DEBUG, " complete input time"); + +} + +void _vcui_view_common_timer_text_init() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (!common_data->tm) { + if (common_data->timer_flag == 0) { + common_data->sec = 0; + common_data->min = 0; + common_data->hour = 0; + common_data->timer_flag = 1; + } + common_data->tm = ecore_timer_add(TIMER_TIMEOUT_1_SEC, __vcui_view_common_timer_cb, NULL); + } +} + +void _vcui_view_common_timer_destroy() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + int ret = 0; + if (common_data->tm) { + ecore_timer_del(common_data->tm); + common_data->tm = NULL; + } + + if (ad->id_minute_minder != 0) { + ret = alarm_cancel(ad->id_minute_minder); + if (ret != ALARM_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_WARN, "alarm_schedule_after_delay failed, [%s]", _vcui_convert_alarm_error(ret)); + } + ad->id_minute_minder = 0; + } +} + +void _vcui_view_common_timer_end_destroy() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } +} + +void _vcui_view_common_timer_end_dialing_destroy() +{ + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } +} + +void _vcui_view_common_timer_redial_reset() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + _vcui_view_common_timer_end_destroy(); + _vcui_view_common_timer_end_dialing_destroy(); + common_data->time_end_flag = TIME_END_NO; +} + +void _vcui_view_common_call_end_show_dialing(int end_type, int bredial) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "end_type:[%d]", end_type); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + char data[VC_DATA_LENGTH_MAX] = { 0, }; + + if (ad->call_end_type == CALL_END_TYPE_NONE) { + _vcui_view_dialing_draw_txt_ended(ad->view_st[ad->view_top], end_type); + } else if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) { + common_data->time_end_flag = TIME_END_START; /*to stop timer from updating the call end screen */ + _vcui_view_common_set_text_time(_vcui_get_endcause_string(end_type, data)); + } + + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } + common_data->bredial = bredial; + common_data->tm_end_dialing = ecore_timer_add(TIMER_TIMEOUT_2_SEC, __vcui_view_common_timer_end_dialing_cb, NULL); +} + +void _vcui_view_common_call_end_show(time_t start_time, int end_type) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "end_type:[%d]", end_type); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + common_data->time_end_flag = TIME_END_START; + _vcui_view_common_set_each_time(start_time); + + common_data->end_type = end_type; + common_data->tm_end = ecore_timer_add(TIMER_TIMEOUT_2_SEC, _vcui_view_common_call_end_initial_timer_cb, NULL); +} + +void _vcui_view_common_call_end_timer_reset(void) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_common_t *common_data = __vcui_view_common_get_common_data(); + if (common_data->tm_end) { + ecore_timer_del(common_data->tm_end); + common_data->tm_end = NULL; + } + + if (common_data->tm_end_dialing) { + ecore_timer_del(common_data->tm_end_dialing); + common_data->tm_end_dialing = NULL; + } + + common_data->tm_end_force = ecore_timer_add(TIMER_TIMEOUT_2_SEC, __vcui_view_common_timer_end_force_cb, NULL); +} + +int _vcui_view_common_call_terminate_or_view_change(void) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (_vcui_doc_get_all_call_data_count() == 0) { + if (ad->contact_ug == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "EXIT - contact ug is closed"); + elm_exit(); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "show contact ug"); + CALL_UI_DEBUG(VC_LOG_DEBUG, "hide & destory [%d]", ad->view_top); + if (ad->view_top != -1) { + ad->view_st[ad->view_top]->onHide(ad->view_st[ad->view_top]); + ad->view_st[ad->view_top]->onDestroy(ad->view_st[ad->view_top]); + ad->view_top = -1; + } + evas_object_show((Evas_Object *)ug_get_layout(ad->contact_ug)); + } + } else { + _vcui_view_auto_change(); + } + return VC_NO_ERROR; +} + +void _vcui_view_common_update_mute_btn() +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + vcui_app_call_view_id_t view_id = ad->view_top; + voice_call_view_data_t *vd = ad->view_st[view_id]; + VCUI_RETURN_IF_FAIL(vd); + + int valid = 0; + + if (vd->layout) { + if (view_id == VIEW_DIALLING_VIEW) { + valid = _vc_ui_view_dialing_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_ONECALL_VIEW) { + valid = _vc_ui_view_single_call_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_MULTICALL_SPLIT_VIEW) { + valid = _vcui_view_multi_call_split_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_MULTICALL_CONF_VIEW) { + valid = _vcui_view_multi_call_conf_check_valid_eo(vd); + } else if (view_id == VIEW_INCALL_MULTICALL_LIST_VIEW) { + valid = _vcui_view_multi_call_list_check_valid_eo(vd); + } else { + CALL_UI_DEBUG(VC_LOG_ERR, "[============ BAD INPUT!!!! Check Input Layout!!!!! %d============]", view_id); + } + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_WARN, "[========== WARNING!! Invalid Evas Object ==========]"); + return; + } + } + + _vcui_create_bottom_fourth_button(vd); +} + +gboolean _vcui_view_common_is_emul_bin(void) +{ + char *model_str = NULL; + int ret = system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &model_str); + + if (ret != SYSTEM_INFO_ERROR_NONE) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "fail to call system_info_get_value_string"); + free(model_str); + return FALSE; + } + + if (model_str == NULL) { + return FALSE; + } + + if (strncmp("Emulator", model_str, 8) == 0) { + free(model_str); + return TRUE; + } else { + free(model_str); + return FALSE; + } +} + diff --git a/ui/src/vcui-view-dialing.c b/ui/src/vcui-view-dialing.c new file mode 100755 index 0000000..e7d675f --- /dev/null +++ b/ui/src/vcui-view-dialing.c @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-dialing.h" +#include "vcui-view-elements.h" +#include "vcui-view-common.h" +#include "vcui-app-window.h" +#include "vcui-view-keypad.h" + +#define VIEW_DIALING_LAYOUT_ID "DIALVIEW" +typedef struct { + Evas_Object *contents; + Evas_Object *caller_info; + Evas_Object *caller_id; + Evas_Object *btn_ly; + Evas_Object *ic; +} vcui_view_dialing_priv_t; + +static int __vcui_view_dialing_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_dialing_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_dialing_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_dialing_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_dialing_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_DIALLING_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_dialing_oncreate, + .onUpdate = __vcui_view_dialing_onupdate, + .onHide = __vcui_view_dialing_onhide, + .onShow = __vcui_view_dialing_onshow, + .onDestroy = __vcui_view_dialing_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_dialing_new(vcui_app_call_data_t *ad) +{ + + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_dialing_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!!!!!!!!!! "); + } + + return &s_view; +} + +void _vcui_view_dialing_draw_txt_ended(voice_call_view_data_t *vd, int end_type) +{ + /* ============ Check valid Evas Object ============= */ + if (vd == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "View Data is NULL"); + return; + } + + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + int valid = 0; + valid = _vcui_check_valid_eo(priv->contents, VIEW_DIALING_LAYOUT_ID); + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } else { + char data[VC_DATA_LENGTH_MAX] = { 0, }; + edje_object_part_text_set(_EDJ(priv->caller_info), "txt_status", _(_vcui_get_endcause_string(end_type, data))); + ad->quickpanel_text = data; + } + /* ============ Check valid Evas Object ============= */ +} + +static void __vcui_view_dialing_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + call_data_t *now_call_data = _vcui_doc_get_mo_call_data(); + + char *file_path = NULL; + int valid = 0; + + /* ============ Check valid Evas Object ============= */ + valid = _vcui_check_valid_eo(priv->contents, VIEW_DIALING_LAYOUT_ID); + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + if (now_call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Now Data is NULL"); + return; + } + + file_path = _vcui_doc_get_caller_id_file_path(now_call_data); + CALL_UI_DEBUG(VC_LOG_DEBUG, "file_path: %s", file_path); + + if (strcmp(file_path, NOIMG_ICON) == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "no-img"); + _vcui_create_no_id_animation(priv->caller_id, OUTGOING_ANI); + edje_object_signal_emit(_EDJ(priv->caller_id), "show-no-cid-connecting", "cid-img"); + } else { + _vcui_show_caller_id(priv->caller_id, file_path); + /*put blur effect on full-cid*/ + } + + char *call_number = _vcui_doc_get_call_number(now_call_data); + char *call_name = _vcui_doc_get_call_display_name(now_call_data); + /* call name (if nothing, call number) */ + if (strlen(call_name) == 0) { + _vcui_show_caller_info_name(vd, call_number, EINA_FALSE); + } else { + _vcui_show_caller_info_name(vd, call_name, EINA_FALSE); + _vcui_show_caller_info_number(vd, call_number, EINA_FALSE); + } + + _vcui_show_caller_info_icon(vd, EINA_FALSE); + _vcui_show_caller_info_status(vd, _("IDS_CALL_POP_CALLING"), EINA_FALSE); + + _vcui_create_bottom_first_button_disabled(vd); + _vcui_create_bottom_second_button(vd); + _vcui_create_top_end_button(vd); + _vcui_create_bottom_third_button(vd); + _vcui_create_bottom_fourth_button_disabled(vd); + + if (_vcui_view_common_is_emul_bin() == EINA_TRUE) { + _vcui_create_bottom_fifth_button_disabled(vd); + } else { + _vcui_create_bottom_fifth_button(vd); + } + + _vcui_elements_check_keypad_n_hide(vd); + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_dialing_create_contents(void *data, char *grpname) +{ + CALL_UI_KPI("__vcui_view_dialing_create_contents start"); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->layout, EDJ_NAME, grpname); + if (eo == NULL) + return NULL; + CALL_UI_KPI("__vcui_view_dialing_create_contents done"); + return eo; +} + +static Evas_Object *__vcui_view_dialing_create_layout_main(Evas_Object *parent) +{ + CALL_UI_KPI("__vcui_view_dialing_create_layout_main start"); + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + CALL_UI_KPI("__vcui_view_dialing_create_layout_main done"); + return ly; +} + +static int __vcui_view_dialing_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialling view create!!"); + + vcui_app_call_data_t *ad = view_data->app_data; + vcui_view_dialing_priv_t *priv = view_data->priv; + Evas_Object *sep_ly = NULL; + + if (!view_data->layout) { + + /* Create Main Layout */ + view_data->layout = __vcui_view_dialing_create_layout_main(ad->win_conformant); + + if (view_data->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + elm_object_content_set(ad->win_conformant, view_data->layout); + + /* Create Contents */ + priv->contents = __vcui_view_dialing_create_contents(view_data, GRP_MOVIEW); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + priv->caller_info = __vcui_view_dialing_create_contents(view_data, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info", priv->caller_info); + edje_object_signal_emit(_EDJ(priv->caller_info), "set-connecting-caller_info", "connecting-screen"); + + priv->caller_id = __vcui_view_dialing_create_contents(view_data, GRP_CALLER_ID_LAYOUT); + elm_object_part_content_set(priv->contents, "caller_id", priv->caller_id); + + sep_ly = __vcui_view_dialing_create_contents(view_data, GRP_SEPARATOR_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_bg", sep_ly); + + priv->btn_ly = __vcui_view_dialing_create_contents(view_data, GRP_BUTTON_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly); + + evas_object_name_set(priv->contents, VIEW_DIALING_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== DIALVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + } + + __vcui_view_dialing_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialling view update"); + vcui_view_dialing_priv_t *priv = view_data->priv; + + __vcui_view_dialing_draw_screen(priv->contents, view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialling view hide"); + + int valid = 0; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)view_data->priv; + valid = _vcui_check_valid_eo(priv->contents, VIEW_DIALING_LAYOUT_ID); + + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== DIALVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + } + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_KPI("__vcui_view_dialing_onshow start"); + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialling view show"); + + vcui_view_dialing_priv_t *priv = view_data->priv; + + __vcui_view_dialing_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + + if (_vcui_is_idle_lock() == CALL_LOCK) + _vcui_app_win_set_noti_type(EINA_TRUE); + else + _vcui_app_win_set_noti_type(EINA_FALSE); + + CALL_UI_KPI("__vcui_view_dialing_onshow done"); + + return VC_NO_ERROR; +} + +static int __vcui_view_dialing_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialling view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_DIALLING_VIEW]; + vcui_view_dialing_priv_t *priv = (vcui_view_dialing_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->btn_ly) { + evas_object_del(priv->btn_ly); + priv->btn_ly = NULL; + } + + if (priv->caller_info) { + evas_object_del(priv->caller_info); + priv->caller_info = NULL; + } + + if (priv->caller_id) { + evas_object_del(priv->caller_id); + priv->caller_id = NULL; + } + + /*Delete keypad layout*/ + _vcui_keypad_delete_layout(priv->contents); + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_DIALLING_VIEW] = NULL; + + _vcui_cache_flush(); + return VC_NO_ERROR; +} + +int _vc_ui_view_dialing_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_view_dialing_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (vcui_view_dialing_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VIEW_DIALING_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vc_ui_view_dialing_get_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_dialing_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_dialing_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + +Evas_Object *_vc_ui_view_dialing_get_button_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_dialing_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_dialing_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->btn_ly; +} + +Evas_Object *_vc_ui_view_dialing_get_caller_info(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_dialing_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_dialing_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info; +} + diff --git a/ui/src/vcui-view-elements.c b/ui/src/vcui-view-elements.c new file mode 100755 index 0000000..831bd77 --- /dev/null +++ b/ui/src/vcui-view-elements.c @@ -0,0 +1,1624 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-elements.h" +#include "vcui-view-dialing.h" +#include "vcui-view-single-call.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-keypad.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-callend.h" +#include "vcui-view-quickpanel.h" +#include "vcui-view-popup.h" +#include "vcui-view-layout-hd.h" + +static Eina_Bool __vcui_add_call_idler_cb(void *data); +static Eina_Bool __vcui_contact_idler_cb(void *data); +static void __vcui_hold_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_unhold_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_join_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_keypad_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_contacts_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_addcall_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_sound_path_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_spk_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_spk_press_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_mute_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_bigend_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_videocall_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_voicecall_btn_cb(void *data, Evas_Object *obj, void *event_info); +static void __vcui_msg_btn_cb(void *data, Evas_Object *obj, void *event_info); + +static Eina_Bool __vcui_add_call_idler_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_FALSE_IF_FAIL(vd != NULL); + + _vcui_doc_launch_phoneui_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data)); + + return EINA_FALSE; +} + +static Eina_Bool __vcui_contact_idler_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_FALSE_IF_FAIL(vd != NULL); + + _vcui_doc_launch_contact_list_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data)); + return EINA_FALSE; +} + +static void __vcui_hold_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcall_engine_process_hold_call(); +} + +static void __vcui_unhold_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcall_engine_process_hold_call(); +} + +void _vcui_swap_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + + ad->bholdisleft = ad->bswapped; + vcall_engine_process_hold_call(); +} + +static void __vcui_join_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + _vcui_create_bottom_first_button_disabled(data); + vcall_engine_join_call(); +} + +void _vcui_conf_img_cb(void *data, Evas_Object *obj, void *event_info) +{ /* for multicall list view */ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + _vcui_view_change(VIEW_INCALL_MULTICALL_LIST_VIEW, 0, 0, 0); +} + +static void __vcui_keypad_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *view_ly = NULL; + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + view_ly = _vc_ui_view_dialing_get_layout(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + view_ly = _vc_ui_view_single_call_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + view_ly = _vcui_view_multi_call_split_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + view_ly = _vcui_view_multi_call_conf_get_main_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "code should never reach here"); + return; + } + + if (_vcui_keypad_get_show_status() == EINA_FALSE) { /*show keypad region*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + /*Hide caller info area*/ + edje_object_signal_emit(_EDJ(view_ly), "HIDE", "CALL_AREA"); + edje_object_signal_emit(_EDJ(view_ly), "HIDE_NOISE_REDUCTIION", "NOISE_REDUCTIION"); + edje_object_signal_emit(_EDJ(view_ly), "HIDE_SOUND_EQ", "SOUND_EQ"); + + /*Show keypad layout - ON view*/ + edje_object_signal_emit(_EDJ(view_ly), "SHOW", "KEYPAD_BTN"); + + /*Actual show with animation*/ + _vcui_keypad_show_layout(vd); + + /*Set keypad-hide icon*/ + elm_object_style_set(obj, "style_call_sixbtn_keypad_hide"); + + /*set hide text*/ + elm_object_text_set(obj, dgettext("sys_string", "IDS_COM_SK_HIDE")); + + _vcui_keypad_set_show_status(EINA_TRUE); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + /*Hide animation on keypad*/ + _vcui_keypad_show_hide_effect(vd, view_ly); + + /*Set keypad icon*/ + elm_object_style_set(obj, "style_call_sixbtn_keypad"); + + /*Set keypad text*/ + elm_object_text_set(obj, _("IDS_CALL_SK3_KEYPAD")); + + /*Set keypad status flag*/ + _vcui_keypad_set_show_status(EINA_FALSE); + } +} + +static void __vcui_contacts_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + if (ad->beffect_show == EINA_TRUE) { + ad->bcontact_clicked = EINA_TRUE; + } else { + ecore_idler_add(__vcui_contact_idler_cb, vd); + } +} + +static void __vcui_addcall_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + if (ad->beffect_show == EINA_TRUE) { + ad->badd_call_clicked = EINA_TRUE; + } else { + ecore_idler_add(__vcui_add_call_idler_cb, vd); + } +} + +static void __vcui_sound_path_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + _vcui_view_popup_load_snd_path(data); +} + +/* #define RCS_TEST */ + +static void __vcui_spk_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type:[%d]", vd->type); + + vcall_engine_process_loudspeaker(EINA_TRUE); + + ad->speaker_status = EINA_TRUE; + _vcui_create_bottom_third_button(vd); +} + +static void __vcui_spk_press_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type:[%d]", vd->type); + + vcall_engine_process_loudspeaker(EINA_FALSE); + + ad->speaker_status = EINA_FALSE; + _vcui_create_bottom_third_button(vd); +} + +static void __vcui_mute_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type:[%d]", vd->type); + + vcall_engine_process_voice_mute(EINA_TRUE); + + ad->mute_status = EINA_TRUE; + if (vd->type == VIEW_QUICKPANEL_VIEW) { + _vcui_view_common_update_mute_btn(); + } else { + _vcui_create_bottom_fourth_button(vd); + } + _vcui_create_quickpanel_mute_button(vd); +} + +static void __vcui_mute_press_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type:[%d]", vd->type); + + vcall_engine_process_voice_mute(EINA_FALSE); + + ad->mute_status = EINA_FALSE; + + if (vd->type == VIEW_QUICKPANEL_VIEW) { + _vcui_view_common_update_mute_btn(); + } else { + _vcui_create_bottom_fourth_button(vd); + } + _vcui_create_quickpanel_mute_button(vd); +} + +static void __vcui_bigend_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type:[%d]", vd->type); + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + vcall_engine_cancel_call(); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + vcall_engine_release_call(); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + int call_status = -1; + call_status = _vcui_view_multi_call_conf_get_call_status(vd); + if (call_status == CALL_HOLD) + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_HELD_CALLS); + else if (call_status == CALL_UNHOLD) + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS); + ad->call_end_type = CALL_END_TYPE_CONF_CALL; + } + break; + case VIEW_INCALL_MULTICALL_LIST_VIEW: + { + int call_status = -1; + call_status = _vcui_view_multi_call_list_get_call_status(vd); + if (call_status == CALL_HOLD) + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_HELD_CALLS); + else if (call_status == CALL_UNHOLD) + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS); + int grp_count = 0; + vcall_engine_get_group_count(&grp_count); + CALL_UI_DEBUG(VC_LOG_DEBUG, "No. of groups - %d", grp_count); + if (grp_count == 1) + ad->call_end_type = CALL_END_TYPE_CONF_CALL; + else + ad->call_end_type = CALL_END_TYPE_NONE; + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return; + } +} + +Evas_Object *__vcui_create_button_style(void *data, Evas_Object **p_button, char *part_name) +{ + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + layout = _vc_ui_view_dialing_get_button_layout(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + layout = _vc_ui_view_single_call_get_button_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + layout = _vcui_view_multi_call_split_get_button_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + layout = _vcui_view_multi_call_conf_get_button_layout(vd); + } + break; + case VIEW_ENDCALL_VIEW: + { + layout = _vc_ui_view_callend_get_button_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + + sw = edje_object_part_swallow_get(_EDJ(layout), part_name); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + *p_button = elm_button_add(layout); + elm_object_part_content_set(layout, part_name, *p_button); + + return layout; +} + +/* Add-Call/Join button ENABLED*/ +Evas_Object *_vcui_create_bottom_first_button(void *data) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_NULL_IF_FAIL(ad != NULL); + Evas_Object *btn = NULL; + Eina_Bool bjoin = EINA_FALSE; + + if (vd->type == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + bjoin = EINA_TRUE; + + __vcui_create_button_style(data, &btn, "bottom_first_button"); + { + if (bjoin) { + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_join"); + elm_object_style_set(btn, "style_call_sixbtn_join"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_join"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_JOIN")); + evas_object_smart_callback_add(btn, "clicked", __vcui_join_btn_cb, vd); + } else { + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_add"); + elm_object_style_set(btn, "style_call_sixbtn_add"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_add"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_ADD_CALL")); + evas_object_smart_callback_add(btn, "clicked", __vcui_addcall_btn_cb, data); + } + } + return btn; +} + +/* Add-Call/Join Button DISABLED */ +Evas_Object *_vcui_create_bottom_first_button_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_first_button_disabled start"); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + Evas_Object *btn = NULL; + Eina_Bool bjoin = EINA_FALSE; + + if (vd->type == VIEW_INCALL_MULTICALL_SPLIT_VIEW) + bjoin = EINA_TRUE; + + __vcui_create_button_style(data, &btn, "bottom_first_button"); + { + if (bjoin) { + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled_join"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_join"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled_join"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_JOIN")); + } else { + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled_add"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_add"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled_add"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_ADD_CALL")); + } + } + + CALL_UI_KPI("_vcui_create_bottom_first_button_disabled done"); + + return btn; +} + +/* Keypad Button ENABLED */ +Evas_Object *_vcui_create_bottom_second_button(void *data) +{ + Evas_Object *btn = NULL; + Evas_Object *view_ly = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + __vcui_create_button_style(data, &btn, "bottom_second_button"); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_keypad"); + elm_object_style_set(btn, "style_call_sixbtn_keypad"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_keypad"); + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + view_ly = _vc_ui_view_dialing_get_layout(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + view_ly = _vc_ui_view_single_call_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + view_ly = _vcui_view_multi_call_split_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + view_ly = _vcui_view_multi_call_conf_get_main_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + + /*Create keypad layout*/ + _vcui_keypad_create_layout(vd, view_ly); + if (_vcui_keypad_get_show_status() == EINA_FALSE) { + elm_object_text_set(btn, _("IDS_CALL_SK3_KEYPAD")); + } else { + elm_object_text_set(btn, dgettext("sys_string", "IDS_COM_SK_HIDE")); + } + evas_object_smart_callback_add(btn, "clicked", __vcui_keypad_btn_cb, data); + + return btn; +} + +/* Keypad Button DISABLED */ +Evas_Object *_vcui_create_bottom_second_button_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_second_button_disabled start"); + Evas_Object *btn = NULL; + + __vcui_create_button_style(data, &btn, "bottom_second_button"); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled_keypad"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_keypad"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled_keypad"); + elm_object_text_set(btn, _("IDS_CALL_SK3_KEYPAD")); + CALL_UI_KPI("_vcui_create_bottom_second_button_disabled done"); + + return btn; +} + +/* End Call Button ENABLED */ +Evas_Object *_vcui_create_top_end_button(void *data) +{ + Evas_Object *btn = NULL; + + __vcui_create_button_style(data, &btn, "top_end_button"); + elm_object_style_set(btn, "style_call_sixbtn_end"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + evas_object_smart_callback_add(btn, "clicked", __vcui_bigend_btn_cb, data); + + return btn; +} + +/* End Call Button DISABLED */ +Evas_Object *_vcui_create_top_end_button_disabled(void *data) +{ + Evas_Object *btn = NULL; + + __vcui_create_button_style(data, &btn, "top_end_button"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_end"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + + return btn; +} + +/* Speaker Button ENABLED */ +Evas_Object *_vcui_create_bottom_third_button(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_third_button start"); + Evas_Object *btn = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_NULL_IF_FAIL(ad != NULL); + + __vcui_create_button_style(data, &btn, "bottom_third_button"); + if (EINA_TRUE == _vcui_is_headset_conected()) { + elm_object_style_set(btn, "style_call_sixbtn_speaker"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_SOUND_ABB")); + evas_object_smart_callback_add(btn, "clicked", __vcui_sound_path_btn_cb, vd); + } else { + elm_object_text_set(btn, _("IDS_CALL_BUTTON_SPEAKER")); + if (ad->speaker_status == EINA_FALSE) { + elm_object_style_set(btn, "style_call_sixbtn_speaker"); + evas_object_smart_callback_add(btn, "clicked", __vcui_spk_btn_cb, vd); + } else { + elm_object_style_set(btn, "style_call_sixbtn_speaker_on"); + evas_object_smart_callback_add(btn, "clicked", __vcui_spk_press_btn_cb, vd); + } + } + CALL_UI_KPI("_vcui_create_bottom_third_button done"); + + return btn; +} + +/* Speaker Button DISABLED */ +Evas_Object *_vcui_create_bottom_third_button_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_third_button_disabled start"); + Evas_Object *btn = NULL; + + __vcui_create_button_style(data, &btn, "bottom_third_button"); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled_speaker"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_speaker"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled_speaker"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_SPEAKER")); + CALL_UI_KPI("_vcui_create_bottom_third_button_disabled done"); + + return btn; +} + +/* Mute Button ENABLED */ +Evas_Object *_vcui_create_bottom_fourth_button(void *data) +{ + Evas_Object *btn = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_NULL_IF_FAIL(ad != NULL); + + __vcui_create_button_style(data, &btn, "bottom_fourth_button"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_MUTE_ABB")); + if (ad->mute_status == EINA_FALSE) { + elm_object_style_set(btn, "style_call_sixbtn_mute"); + evas_object_smart_callback_add(btn, "clicked", __vcui_mute_btn_cb, vd); + } else { + elm_object_style_set(btn, "style_call_sixbtn_mute_on"); + evas_object_smart_callback_add(btn, "clicked", __vcui_mute_press_btn_cb, vd); + } + + return btn; +} + +/* Mute Button DISABLED */ +Evas_Object *_vcui_create_bottom_fourth_button_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_fourth_button_disabled start"); + Evas_Object *btn = NULL; + + __vcui_create_button_style(data, &btn, "bottom_fourth_button"); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled_mute"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_mute"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled_mute"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_MUTE_ABB")); + CALL_UI_KPI("_vcui_create_bottom_fourth_button_disabled done"); + + return btn; +} + +/* Share/Contacts Button ENABLED */ +Evas_Object *_vcui_create_bottom_fifth_button(void *data) +{ + Evas_Object *btn; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_NULL_IF_FAIL(ad != NULL); + + __vcui_create_button_style(data, &btn, "bottom_fifth_button"); + + { + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_contacts"); + elm_object_style_set(btn, "style_call_sixbtn_contacts"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_contacts"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_CONTACTS")); + evas_object_smart_callback_add(btn, "clicked", __vcui_contacts_btn_cb, vd); + } + + return btn; +} + +/* Share/Contacts Button DISABLED */ +Evas_Object *_vcui_create_bottom_fifth_button_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_bottom_right_button_disabled start"); + Evas_Object *btn = NULL; + + __vcui_create_button_style(data, &btn, "bottom_fifth_button"); + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled"); + + { + CALL_UI_KPI("elm_object_style_set start :: style_call_sixbtn_disabled_contacts"); + elm_object_style_set(btn, "style_call_sixbtn_disabled_contacts"); + CALL_UI_KPI("elm_object_style_set done :: style_call_sixbtn_disabled_contacts"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_CONTACTS")); + } + + CALL_UI_KPI("_vcui_create_bottom_fifth_button_disabled done"); + + return btn; +} + +Evas_Object *_vcui_create_hold_swap_button(void *data) +{ + Evas_Object *btn = NULL; + Evas_Object *ic = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + int call_status = 0; + Eina_Bool bswap_button = EINA_FALSE; + Eina_Bool bhold_button = EINA_FALSE; + + switch (vd->type) { + case VIEW_INCALL_ONECALL_VIEW: + { + layout = _vc_ui_view_single_call_get_layout(vd); + call_status = _vc_ui_view_single_call_get_call_status(vd); + bhold_button = EINA_TRUE; + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + layout = _vcui_view_multi_call_conf_get_main_layout(vd); + call_status = _vcui_view_multi_call_conf_get_call_status(vd); + bhold_button = EINA_TRUE; + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + layout = _vcui_view_multi_call_split_get_layout(vd); + bswap_button = EINA_TRUE; + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd type:[%d], call_status:[%d]", vd->type, call_status); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_hold_swap"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_hold_swap", btn); + ic = elm_image_add(layout); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_image_resizable_set(ic, 1, 1); + elm_object_content_set(btn, ic); + + if (bhold_button) { + elm_object_style_set(btn, "style_normal_holdbtn"); + if (call_status == CALL_UNHOLD) { + elm_image_file_set(ic, HOLD_ICON, NULL); + edje_object_part_text_set(_EDJ(layout), "txt_hold_swap", _("IDS_CALL_BUTTON_HOLD")); + evas_object_smart_callback_add(btn, "clicked", __vcui_hold_btn_cb, vd); + } else { /* CALL_HOLD */ + elm_image_file_set(ic, UNHOLD_ICON, NULL); + edje_object_part_text_set(_EDJ(layout), "txt_hold_swap", _("IDS_CALL_BUTTON_UNHOLD")); + evas_object_smart_callback_add(btn, "clicked", __vcui_unhold_btn_cb, vd); + } + } else if (bswap_button) { + elm_object_style_set(btn, "style_normal_swapbtn"); + elm_image_file_set(ic, SWAP_ICON, NULL); + edje_object_part_text_set(_EDJ(layout), "txt_hold_swap", _("Swap")); + evas_object_smart_callback_add(btn, "clicked", _vcui_swap_btn_cb, vd); + } + + return layout; +} + +Evas_Object *_vcui_create_button_bigend(void *data) +{ + CALL_UI_KPI("_vcui_create_button_bigend start"); + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + layout = _vc_ui_view_dialing_get_layout(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + layout = _vc_ui_view_single_call_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + layout = _vcui_view_multi_call_split_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + layout = _vcui_view_multi_call_conf_get_main_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_LIST_VIEW: + { + layout = _vcui_view_multi_call_list_get_main_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_bigend"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_bigend", btn); + CALL_UI_KPI("elm_object_style_set start :: style_call_text_only_red"); + elm_object_style_set(btn, "style_call_text_only_red"); + CALL_UI_KPI("elm_object_style_set done :: style_call_text_only_red"); + elm_object_text_set(btn, _("IDS_CALL_OPT_END_ALL_CALLS")); + evas_object_smart_callback_add(btn, "clicked", __vcui_bigend_btn_cb, vd); + CALL_UI_KPI("_vcui_create_button_bigend done"); + return layout; +} + +Evas_Object *_vcui_create_button_bigend_disabled(void *data) +{ + CALL_UI_KPI("_vcui_create_button_bigend_disabled start"); + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + layout = _vc_ui_view_dialing_get_layout(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + layout = _vc_ui_view_single_call_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + layout = _vcui_view_multi_call_split_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + layout = _vcui_view_multi_call_conf_get_main_layout(vd); + } + break; + case VIEW_ENDCALL_VIEW: + { + layout = _vc_ui_view_callend_get_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_bigend"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_bigend", btn); + CALL_UI_KPI("elm_object_style_set start :: style_call_text_only_red_disabled"); + elm_object_style_set(btn, "style_call_text_only_red_disabled"); + CALL_UI_KPI("elm_object_style_set done :: style_call_text_only_red_disabled"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + CALL_UI_KPI("_vcui_create_button_bigend_disabled done"); + return layout; +} + +Evas_Object *_vcui_create_conf_list_button_hold(void *data) +{ + Evas_Object *btn = NULL; + Evas_Object *ic = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + int call_status = 0; + switch (vd->type) { + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + layout = _vcui_view_multi_call_conf_get_main_layout(vd); + call_status = _vcui_doc_get_group_call_status(); + } + break; + case VIEW_INCALL_MULTICALL_LIST_VIEW: + { + layout = _vcui_view_multi_call_list_get_main_layout(vd); + call_status = _vcui_doc_get_group_call_status(); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd type:[%d], call_status:[%d]", vd->type, call_status); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_hold"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + CALL_UI_KPI("elm_object_style_set start :: style_list_holdbtn"); + elm_object_style_set(btn, "style_list_holdbtn"); + CALL_UI_KPI("elm_object_style_set done :: style_list_holdbtn"); + elm_object_part_content_set(layout, "btn_hold", btn); + ic = elm_image_add(layout); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_image_resizable_set(ic, 1, 1); + elm_object_content_set(btn, ic); + + if (call_status == CALL_UNHOLD) { + elm_image_file_set(ic, HOLD_ICON, NULL); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_HOLD")); + + evas_object_smart_callback_add(btn, "clicked", __vcui_hold_btn_cb, vd); + } else { /* CALL_HOLD */ + elm_image_file_set(ic, UNHOLD_ICON, NULL); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_UNHOLD")); + + evas_object_smart_callback_add(btn, "clicked", __vcui_unhold_btn_cb, vd); + } + + return layout; +} + +Evas_Object *_vcui_show_caller_id(Evas_Object *contents, char *path) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *d_image = NULL; + char *part = NULL; + char *signal = NULL; + int width = 0; + int height = 0; + + d_image = elm_image_add(contents); + elm_image_file_set(d_image, path, NULL); + elm_image_object_size_get(d_image, &width, &height); + + if (width < 200 || height < 200) { + part = "swl_cid_thumbnail"; + signal = "show-thumb-cid"; + } else { + part = "swl_cid_full"; + signal = "show-full-cid"; + } + elm_object_part_content_set(contents, part, d_image); + edje_object_signal_emit(_EDJ(contents), signal, "cid-img"); + + return d_image; +} + +void _vcui_delete_contact_image(Evas_Object *contents) +{ + Evas_Object *sw = NULL; + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_cid"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } +} + +Evas_Object *_vcui_show_default_image(Evas_Object *contents, char *path) +{ + Evas_Object *sw = NULL; + Evas_Object *ic = NULL; + + sw = edje_object_part_swallow_get(_EDJ(contents), "swl_cid"); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } + + ic = elm_image_add(contents); + elm_object_part_content_set(contents, "swl_cid", ic); + elm_image_file_set(ic, path, NULL); + + return ic; +} + +static void __vcui_more_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_more_btn_cb.."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + _vcui_view_popup_load_more_option(data); +} + +static void __vcui_videocall_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_videocall_btn_cb.."); + char *tel_num = (char *)data; + + bundle *kb; + kb = bundle_create(); + bundle_add(kb, "KEY_CALL_TYPE", "MO"); + bundle_add(kb, "number", tel_num); + aul_launch_app("org.tizen.vtmain", kb); + bundle_free(kb); + + free(tel_num); + tel_num = NULL; + + _vcui_view_common_call_end_timer_reset(); + evas_object_smart_callback_del(obj, "clicked", __vcui_videocall_btn_cb); +} + +static void __vcui_voicecall_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_voicecall_btn_cb.."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + VCUI_RETURN_IF_FAIL(ad != NULL); + char *tel_num = (char *)data; + vcui_call_mo_data_t call_data; + + _vcui_view_common_timer_redial_reset(); + ad->speaker_status = EINA_FALSE; + ad->mute_status = EINA_FALSE; + ad->wbamr_status = EINA_FALSE; + + memset(&call_data, 0, sizeof(call_data)); + + snprintf(call_data.call_number, sizeof(call_data.call_number), "%s", tel_num); + call_data.ct_index = -1; + + vcall_engine_process_normal_call(call_data.call_number, call_data.ct_index, EINA_FALSE); + + free(tel_num); + tel_num = NULL; + + evas_object_smart_callback_del(obj, "clicked", __vcui_voicecall_btn_cb); +} + +static void __vcui_msg_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_msg_btn_cb.."); + char *tel_num = (char *)data; + + _vcui_doc_launch_msg_composer(NULL, tel_num); + + free(tel_num); + tel_num = NULL; + + _vcui_view_common_call_end_timer_reset(); + evas_object_smart_callback_del(obj, "clicked", __vcui_msg_btn_cb); +} + +static void __vcui_add_to_contacts_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + VCUI_RETURN_IF_FAIL(ad != NULL); + voice_call_view_data_t *vd = ad->view_st[VIEW_ENDCALL_VIEW]; + VCUI_RETURN_IF_FAIL(vd != NULL); + char *tel_num = (char *)data; + + _vcui_doc_launch_add_to_contacts_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data), tel_num); + + free(tel_num); + tel_num = NULL; + + evas_object_smart_callback_del(obj, "clicked", __vcui_add_to_contacts_btn_cb); +} + +static void __vcui_view_contact_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + VCUI_RETURN_IF_FAIL(ad != NULL); + voice_call_view_data_t *vd = ad->view_st[VIEW_ENDCALL_VIEW]; + VCUI_RETURN_IF_FAIL(vd != NULL); + + _vcui_doc_launch_view_contact_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data), data); + + evas_object_smart_callback_del(obj, "clicked", __vcui_view_contact_btn_cb); +} + +Evas_Object *_vcui_create_videocall_button(void *data, char *number) +{ + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + voice_call_view_data_t *vd = NULL; + char *tel_number = NULL; + + VCUI_RETURN_NULL_IF_FAIL((vd = (voice_call_view_data_t *)data) != NULL); + layout = _vc_ui_view_callend_get_layout(vd); + + tel_number = strdup(number); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_videocall"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_videocall", btn); + elm_object_style_set(btn, "style_call_end_video_call_button"); + + elm_object_text_set(btn, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL")); + evas_object_smart_callback_add(btn, "clicked", __vcui_videocall_btn_cb, tel_number); + + return layout; +} + +Evas_Object *_vcui_create_voicecall_button(void *data, char *number) +{ + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + voice_call_view_data_t *vd = NULL; + char *tel_number = NULL; + + VCUI_RETURN_NULL_IF_FAIL((vd = (voice_call_view_data_t *)data) != NULL); + layout = _vc_ui_view_callend_get_layout(vd); + + tel_number = strdup(number); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_voicecall"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_voicecall", btn); + elm_object_style_set(btn, "style_call_end_voice_call_button"); + + elm_object_text_set(btn, dgettext("sys_string", "IDS_COM_BODY_VOICE_CALL")); + evas_object_smart_callback_add(btn, "clicked", __vcui_voicecall_btn_cb, tel_number); + + return layout; +} + +Evas_Object *_vcui_create_message_button(void *data, char *number) +{ + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + voice_call_view_data_t *vd = NULL; + char *tel_number = NULL; + + VCUI_RETURN_NULL_IF_FAIL((vd = (voice_call_view_data_t *)data) != NULL); + layout = _vc_ui_view_callend_get_layout(vd); + + tel_number = strdup(number); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_message"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_message", btn); + elm_object_style_set(btn, "style_call_end_message_button"); + + elm_object_text_set(btn, dgettext("sys_string", "IDS_COM_BODY_MESSAGE")); + evas_object_smart_callback_add(btn, "clicked", __vcui_msg_btn_cb, tel_number); + + return layout; +} + +Evas_Object *_vcui_create_add_to_contacts_button(void *data, char *number) +{ + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + Evas_Object *sw = NULL; + char *tel_number = strdup(number); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + switch (vd->type) { + case VIEW_ENDCALL_VIEW: + { + layout = _vc_ui_view_callend_get_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + if (tel_number != NULL) { + free(tel_number); + tel_number = NULL; + } + return NULL; + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_contacts"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_contacts", btn); + elm_object_style_set(btn, "style_call_end_contact_button"); + elm_object_text_set(btn, dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS")); + evas_object_smart_callback_add(btn, "clicked", __vcui_add_to_contacts_btn_cb, tel_number); + + return layout; +} + +Evas_Object *_vcui_create_view_contact_button(void *data, int ct_id) +{ + Evas_Object *btn; + Evas_Object *layout; + Evas_Object *sw; + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_NULL_IF_FAIL(vd != NULL); + + switch (vd->type) { + case VIEW_ENDCALL_VIEW: + { + layout = _vc_ui_view_callend_get_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_contacts"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_contacts", btn); + elm_object_style_set(btn, "style_call_end_contact_button"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_VIEW_CONTACT")); + evas_object_smart_callback_add(btn, "clicked", __vcui_view_contact_btn_cb, (void *)ct_id); + + return layout; +} + +static void __qp_end_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + VCUI_RETURN_IF_FAIL(vd != NULL); + vcui_app_call_data_t *ad = vd->app_data; + VCUI_RETURN_IF_FAIL(ad != NULL); + + if (_vcui_doc_get_no_status_call_data_count() == 1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialing/connecting screen end"); + vcall_engine_cancel_call(); + } else if (_vcui_doc_get_all_call_data_count() > 1) { + if (_vcui_doc_get_unhold_call_data_count() == 0 || _vcui_doc_get_hold_call_data_count() == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "End active conference call"); + + int call_status = _vcui_doc_get_group_call_status(); + if (call_status == CALL_HOLD) + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_HELD_CALLS); + else + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS); + ad->call_end_type = CALL_END_TYPE_CONF_CALL; /* conf call end screen SHOW */ + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "End multi split active call"); + vcall_engine_release_call_by_type(VCALL_ENGINE_RELEASE_ALL_ACTIVE_CALLS); + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "End single active call"); + vcall_engine_release_call(); + } +} + +Evas_Object *_vcui_create_quickpanel_mute_button(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *btn, *layout, *sw; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type: %d", vd->type); + + layout = ad->quickpanel_layout; + VCUI_RETURN_NULL_IF_FAIL(layout); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_left"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + + elm_object_part_content_set(layout, "btn_left", btn); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_MUTE_ABB")); + + if (ad->mute_status == EINA_FALSE) { + elm_object_style_set(btn, "style_call_qp_text_only_normal"); + evas_object_smart_callback_add(btn, "clicked", __vcui_mute_btn_cb, vd); + } else { + Evas_Object *ic = elm_image_add(layout); + elm_image_file_set(ic, QP_MUTE_ICON, NULL); + elm_object_content_set(btn, ic); + + elm_object_style_set(btn, "style_call_small_text_with_icon"); + evas_object_smart_callback_add(btn, "clicked", __vcui_mute_press_btn_cb, vd); + } + + return layout; +} + +Evas_Object *_vcui_create_quickpanel_unhold_button(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *btn, *layout, *sw; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type: %d", vd->type); + + layout = ad->quickpanel_layout; + VCUI_RETURN_NULL_IF_FAIL(layout); + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_left"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_left", btn); + elm_object_style_set(btn, "style_call_qp_text_only_normal"); + + elm_object_text_set(btn, _("IDS_CALL_BUTTON_UNHOLD")); + evas_object_smart_callback_add(btn, "clicked", __vcui_hold_btn_cb, vd); + + return layout; +} + +Evas_Object *_vcui_create_quickpanel_end_button(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *btn, *layout, *sw; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + CALL_UI_DEBUG(VC_LOG_DEBUG, "vd->type: %d", vd->type); + + switch (vd->type) { + case VIEW_QUICKPANEL_VIEW: + { + layout = ad->quickpanel_layout; + } + break; + + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + return NULL; + } + + sw = edje_object_part_swallow_get(_EDJ(layout), "btn_right"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_right", btn); + elm_object_style_set(btn, "style_call_qp_text_only_end"); + elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL")); + evas_object_smart_callback_add(btn, "clicked", __qp_end_btn_cb, vd); + + return layout; +} + +static Evas_Object *__vcui_create_caller_info(void *data, Eina_Bool bhold) +{ + Evas_Object *caller_info = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + caller_info = _vc_ui_view_dialing_get_caller_info(vd); + } + break; + case VIEW_INCOMING_LOCK_VIEW: + { + caller_info = _vc_ui_view_incoming_lock_get_caller_info(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + caller_info = _vc_ui_view_single_call_get_caller_info(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + caller_info = _vc_ui_view_multi_call_conf_get_caller_info(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + if (bhold == EINA_TRUE) { + caller_info = _vc_ui_view_multi_call_split_get_caller_info_hold(vd); + } else { + caller_info = _vc_ui_view_multi_call_split_get_caller_info_unhold(vd); + } + } + break; + case VIEW_ENDCALL_VIEW: + { + caller_info = _vc_ui_view_callend_get_caller_info(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong vd type:[%d]", vd->type); + break; + } + + return caller_info; +} + + +/* Caller info name or number*/ +void _vcui_show_caller_info_name(void *data, const char *name, Eina_Bool bhold) +{ + Evas_Object *layout = NULL; + + layout = __vcui_create_caller_info(data, bhold); + edje_object_part_text_set(_EDJ(layout), "txt_call_name", name); +} + +/* Caller info number */ +void _vcui_show_caller_info_number(void *data, const char *number, Eina_Bool bhold) +{ + Evas_Object *layout = NULL; + + layout = __vcui_create_caller_info(data, bhold); + edje_object_part_text_set(_EDJ(layout), "txt_phone_num", number); +} + +/* Caller info icon*/ +Evas_Object *_vcui_show_caller_info_icon(void *data, Eina_Bool bhold) +{ + Evas_Object *sw = NULL; + Evas_Object *ic = NULL; + Evas_Object *btn = NULL; + Evas_Object *layout = NULL; + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + layout = __vcui_create_caller_info(data, bhold); + + sw = edje_object_part_swallow_get(_EDJ(layout), "caller_info_icon"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + if (vd->type == VIEW_DIALLING_VIEW || + vd->type == VIEW_INCOMING_LOCK_VIEW) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Call status icon"); + ic = elm_image_add(layout); + elm_image_file_set(ic, CALLER_INFO_ICON, NULL); + elm_object_part_content_set(layout, "caller_info_icon", ic); + + return ic; + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "More button"); + + edje_object_signal_emit(_EDJ(layout), "show_vert_separtor", "call-screen"); + + btn = elm_button_add(layout); + CALL_UI_KPI("elm_object_style_set start :: style_caller_info_morebtn"); + elm_object_style_set(btn, "style_caller_info_morebtn"); + CALL_UI_KPI("elm_object_style_set done :: style_caller_info_morebtn"); + elm_object_part_content_set(layout, "caller_info_icon", btn); + + evas_object_smart_callback_add(btn, "clicked", __vcui_more_btn_cb, vd); + + return btn; + } +} + +/* Caller info status*/ +Evas_Object *_vcui_show_caller_info_status(void *data, const char *status, Eina_Bool bhold) +{ + Evas_Object *layout = NULL; + + layout = __vcui_create_caller_info(data, bhold); + edje_object_part_text_set(_EDJ(layout), "txt_status", status); + + return layout; +} + +Evas_Object *_vcui_show_contact_image_split(Evas_Object *contents, const char *path, Eina_Bool bhold) +{ + Evas_Object *sw = NULL; + Evas_Object *img = NULL; + char *part = NULL; + + if (bhold) { + part = "swl_cid_hold"; + } else { + part = "swl_cid_unhold"; + } + + sw = edje_object_part_swallow_get(_EDJ(contents), part); + if (sw) { + edje_object_part_unswallow(_EDJ(contents), sw); + evas_object_del(sw); + } + + if (strcmp(path, CONF_SPLIT_ICON) == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Conf Image"); + img = elm_image_add(contents); + elm_image_file_set(img, CONF_SPLIT_ICON, NULL); + } else if ((strncmp(path, IMGDIR, strlen(IMGDIR)) == 0) || (strlen(path) == 0)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "No caller image"); + img = elm_image_add(contents); + elm_image_file_set(img, NOIMG_SPLIT_ICON, NULL); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Display : %s", path); + img = elm_bg_add(contents); + elm_bg_load_size_set(img, SPLIT_CID1_WIDTH, SPLIT_CID1_HEIGHT); + elm_bg_file_set(img, path, NULL); + evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(img, 0.5, 0.5); + evas_object_show(img); + } + + elm_object_part_content_set(contents, part, img); + return img; +} + +void _vcui_elements_check_keypad_n_hide(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *view_ly = NULL; + + switch (vd->type) { + case VIEW_DIALLING_VIEW: + { + view_ly = _vc_ui_view_dialing_get_layout(vd); + } + break; + case VIEW_INCALL_ONECALL_VIEW: + { + view_ly = _vc_ui_view_single_call_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_SPLIT_VIEW: + { + view_ly = _vcui_view_multi_call_split_get_layout(vd); + } + break; + case VIEW_INCALL_MULTICALL_CONF_VIEW: + { + view_ly = _vcui_view_multi_call_conf_get_main_layout(vd); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "code should never reach here"); + return; + } + + if (_vcui_keypad_get_show_status() == EINA_TRUE) { + /*Hide caller info area*/ + edje_object_signal_emit(_EDJ(view_ly), "HIDE", "CALL_AREA"); + } +} + +void _vcui_create_no_id_animation(Evas_Object *contents, char *path) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + Elm_Transit *transit = NULL; + Eina_List *images = NULL; + Evas_Object *img = NULL; + int i = 0; + + img = elm_icon_add(contents); + elm_object_part_content_set(contents, "swl_no_cid", img); + + for (i = 1; i < 9; ++i) { + char ani_path[DEF_BUF_LEN_LONG] = {}; + snprintf(ani_path, sizeof(ani_path), "%s_%02d.png", path, i); + images = eina_list_append(images, eina_stringshare_add(ani_path)); + } + + transit = elm_transit_add(); + elm_transit_object_add(transit, img); + elm_transit_effect_image_animation_add(transit, images); + elm_transit_repeat_times_set(transit, -1); + + elm_transit_duration_set(transit, 3); + elm_transit_go(transit); +} + +Evas_Object *_vcui_create_notify(Evas_Object *parent, char *string) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + Evas_Object *selectioninfo_layout = NULL; + Evas_Object *layout = NULL; + Evas_Object *selectioninfo = elm_notify_add(parent); + elm_notify_align_set(selectioninfo, ELM_NOTIFY_ALIGN_FILL, 0.93); + selectioninfo_layout = elm_layout_add(selectioninfo); + elm_object_content_set(selectioninfo, selectioninfo_layout); + + elm_notify_timeout_set(selectioninfo, 4.0); + layout = elm_object_content_get(selectioninfo); + + elm_layout_theme_set(layout, "standard", "selectioninfo", "center_text"); + evas_object_show(selectioninfo); + + elm_object_part_text_set(layout, "elm.text", string); + + return selectioninfo; +} + diff --git a/ui/src/vcui-view-incoming-lock.c b/ui/src/vcui-view-incoming-lock.c new file mode 100755 index 0000000..adb08b9 --- /dev/null +++ b/ui/src/vcui-view-incoming-lock.c @@ -0,0 +1,1188 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "vcui-application.h" +#include "vcui-app-window.h" +#include "vcui-view-incoming-lock.h" +#include "vcui-view-layout-hd.h" + +#define VCUI_REJECT_MSG_LENGTH_MAX (140+1) +#define REJ_MSG_GENLIST_DATA "reject_msg_genlist_data" +#define REJ_MSG_LIST_OPEN_STATUS_KEY "list_open_status_key" +#define REJ_MSG_GENLIST_INDEX "reject_msg_genlist_index" +#define VCUI_CST_REJECT_MSG_GET "cst_reject_msg_get" +#define VCUI_CST_SO_PATH "/usr/ug/lib/libug-setting-call-efl.so" +#define VIEW_INCOMING_LOCK_LAYOUT_ID "INCOMINGLOCKVIEW" + +typedef struct { + Evas_Object *contents; + Evas_Object *caller_info; + Evas_Object *caller_id; + Evas_Object *ic; + Evas_Object *lock_reject_with_msg; + Evas_Object *msg_glist; + Evas_Object *create_btn; + Evas_Object *back_btn; + Evas_Object *notify; + + double y_scale_factor; + + int reject_with_msg_start_y; + int reject_with_msg_cur_y; + + int msg_list_height; + + gboolean bmouse_down_pressed; /*Tracks the mouse-down, mouse-move and mouse-up events are executed in sequence*/ + + void *dl_handle; + Elm_Genlist_Item_Class *itc_reject_msg; + Evas_Coord y_momentum; + char *(*msg_func_ptr) (int); + char reject_msg[VCUI_REJECT_MSG_LENGTH_MAX]; +} incoming_lock_view_priv_t; + +static int __vcui_view_incoming_lock_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_incoming_lock_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_incoming_lock_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_incoming_lock_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_incoming_lock_ondestroy(voice_call_view_data_t *view_data); +static Evas_Object *__vcui_view_incoming_lock_create_contents(void *data, char *grpname); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCOMING_LOCK_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_incoming_lock_oncreate, + .onUpdate = __vcui_view_incoming_lock_onupdate, + .onHide = __vcui_view_incoming_lock_onhide, + .onShow = __vcui_view_incoming_lock_onshow, + .onDestroy = __vcui_view_incoming_lock_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_incoming_lock_new(vcui_app_call_data_t *ad) +{ + + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incoming_lock_view_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static Evas_Object *__vcui_view_incoming_lock_load_edj(Evas *evas, char *edjname, const char *grpname) +{ + Evas_Object *edj; + + edj = edje_object_add(evas); + if (!edje_object_file_set(edj, edjname, grpname)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!"); + return NULL; + } + + return edj; +} + +static void __vcui_view_incoming_lock_accept_cb(void *data, Evas_Object *obj, void *event_info) +{ + int all_call_count = 0; + int nostatus_call_count = 0; + int unhold_call_count = 0; + int hold_call_count = 0; + + if (_vcui_is_phonelock_status() == EINA_FALSE) + vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + + all_call_count = _vcui_doc_get_all_call_data_count(); + nostatus_call_count = _vcui_doc_get_no_status_call_data_count(); + unhold_call_count = _vcui_doc_get_unhold_call_data_count(); + hold_call_count = _vcui_doc_get_hold_call_data_count(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "all_call_count:%d >>>> nostatus_call_count:%d >>>> unhold_call_count:%d >>>> hold_call_count:%d", \ + all_call_count, nostatus_call_count, unhold_call_count, hold_call_count); + + if (unhold_call_count == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "No Call Or Held call - Accept"); + vcall_engine_answer_call(); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Show popup - 2nd MT call - test volume popup"); + _vcui_view_popup_second_mtcall_load(_("IDS_CALL_HEADER_ACCEPT_CALL_AFTER"), unhold_call_count, hold_call_count); + } +} + +static Evas_Object *__vcui_view_incoming_lock_create_accept_btn(Evas_Object *layout) +{ + Evas_Object *btn; + + Evas_Object *sw = edje_object_part_swallow_get(_EDJ(layout), "btn_accept"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_accept", btn); + elm_object_style_set(btn, "sweep"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_ACCEPT")); + evas_object_smart_callback_add(btn, "clicked", __vcui_view_incoming_lock_accept_cb, NULL); + + return btn; +} + +static void __vcui_view_incoming_lock_reject_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcall_engine_reject_call(); +} + +static Evas_Object *__vcui_view_incoming_lock_create_reject_btn(Evas_Object *layout) +{ + Evas_Object *btn; + + Evas_Object *sw = edje_object_part_swallow_get(_EDJ(layout), "btn_reject"); + if (sw) { + edje_object_part_unswallow(_EDJ(layout), sw); + evas_object_del(sw); + } + + btn = elm_button_add(layout); + elm_object_part_content_set(layout, "btn_reject", btn); + elm_object_style_set(btn, "sweep"); + elm_object_text_set(btn, _("IDS_CALL_BUTTON_REJECT")); + evas_object_smart_callback_add(btn, "clicked", __vcui_view_incoming_lock_reject_cb, NULL); + + return btn; +} + +static void __reject_msg_list_param_reset(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + priv->y_momentum = 0; + priv->reject_with_msg_start_y = 0; + priv->reject_with_msg_cur_y = 0; + priv->bmouse_down_pressed = EINA_FALSE; +} + +static void __reject_screen_transit_complete_cb(void *data, Elm_Transit *transit) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + if (EINA_FALSE == evas_object_data_get(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY)) { + edje_object_signal_emit(priv->lock_reject_with_msg, "show-up-arrow", "reject_msg"); + } else { + edje_object_signal_emit(priv->lock_reject_with_msg, "show-down-arrow", "reject_msg"); + } + + __reject_msg_list_param_reset(vd); + + return; +} + +static Eina_Bool __rej_msg_show_sliding_effect(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Object *screen_ly; + Elm_Transit *transit; + int xpos = 0; + int ypos = 0; + int width = 0; + int height = 0; + int transit_y = 0; + int max_height_limit = 0; + + screen_ly = priv->lock_reject_with_msg; + transit = elm_transit_add(); + elm_transit_object_add(transit, screen_ly); + + evas_object_geometry_get(priv->lock_reject_with_msg, &xpos, &ypos, &width, &height); + CALL_UI_DEBUG(VC_LOG_DEBUG, "reject_w_msg dimensions ---> x[%d] y[%d] w[%d] h[%d]", xpos, ypos, width, height); + CALL_UI_DEBUG(VC_LOG_DEBUG, "priv->y_momentum: %d", priv->y_momentum); + + /*Max height possible*/ + max_height_limit = (priv->msg_list_height) * (priv->y_scale_factor); + CALL_UI_DEBUG(VC_LOG_DEBUG, "max_height_limit: %d", max_height_limit); + + /* Delete notify layout */ + if (priv->notify) { + evas_object_hide(priv->notify); + priv->notify = NULL; + } + + if (EINA_FALSE == evas_object_data_get(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Close list... Check if opening is feasible"); + + if (priv->y_momentum) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Momentum..."); + + if (priv->y_momentum < -1500) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Huge Momentum... Move the layout"); + + /*effect to pull up the window.*/ + transit_y = -(max_height_limit + ypos); + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_TRUE); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Small Momentum.."); + + if (ypos != 0) { /*Reject msg layout is displaced from its original position*/ + if (-ypos < max_height_limit/2) { /*Layout position is lesser than half of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement L.T. HALF the height.."); + + /*effect to pull down the window.*/ + transit_y = -ypos; + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_FALSE); + } else if (-ypos >= max_height_limit/2 && -ypos <= max_height_limit) { /*Layout position is greater than half of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement G.T. HALF the height.."); + + /*effect to pull up the window.*/ + transit_y = -(max_height_limit + ypos); + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_TRUE); + } + } + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "NO Momentum... Dont open"); + + if (ypos != 0) { /*Reject msg layout is displaced from its original position*/ + if (-ypos < max_height_limit/2) { /*Layout position is lesser than half of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement L.T. HALF the height.."); + + /*effect to pull down the window.*/ + transit_y = -ypos; + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_FALSE); + } else if (-ypos >= max_height_limit/2 && -ypos <= max_height_limit) { /*Layout position is greater than half of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement G.T. HALF the height.."); + + /*effect to pull up the window.*/ + transit_y = -(max_height_limit + ypos); + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_TRUE); + } + } + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Open list... Check if closing is feasible"); + + if (priv->y_momentum) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Momentum..."); + + if (priv->y_momentum > 1500) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Huge Momentum... Move the layout"); + + /*effect to pull down the window.*/ + transit_y = -ypos; + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_FALSE); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Small Momentum.."); + + if (ypos != 0) { /*Reject msg layout is displaced from its original position*/ + if (-ypos < (max_height_limit * 0.8)) { /*Layout position is lesser than 80% of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement L.T. 80 percent of the height.."); + + /*effect to pull down the window.*/ + transit_y = -ypos; + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_FALSE); + } else if (-ypos >= (max_height_limit * 0.8) && -ypos <= max_height_limit) { /*Layout position is greater than half of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement G.T. 80 percent of the height.."); + + /*effect to pull up the window.*/ + transit_y = -(max_height_limit + ypos); + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_TRUE); + } + } + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "NO Momentum... Dont close"); + + if (ypos != 0) { /*Reject msg layout is displaced from its original position*/ + if (-ypos < (max_height_limit * 0.8)) { /*Layout position is lesser than 80% of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement L.T. 80 percent of the height.."); + + /*effect to pull down the window.*/ + transit_y = -ypos; + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_FALSE); + } else if (-ypos >= (max_height_limit * 0.8) && -ypos <= max_height_limit) { /*Layout position is greater than half of the height*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Movement G.T. 80 percent of the height.."); + + /*effect to pull up the window.*/ + transit_y = -(max_height_limit + ypos); + + elm_transit_effect_translation_add(transit, 0, 0, 0, transit_y); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_TRUE); + } + } + } + } + + elm_transit_del_cb_set(transit, __reject_screen_transit_complete_cb, vd); + + if (priv->y_momentum < 0) + priv->y_momentum = -priv->y_momentum; + + if (priv->y_momentum < 1500) { + elm_transit_duration_set(transit, 0.5); + } else if (priv->y_momentum >= 1500 && priv->y_momentum < 3000) { + elm_transit_duration_set(transit, 0.4); + } else if (priv->y_momentum >= 3000 && priv->y_momentum < 4500) { + elm_transit_duration_set(transit, 0.3); + } else if (priv->y_momentum >= 4500) { + elm_transit_duration_set(transit, 0.2); + } + evas_object_show(screen_ly); /*It must be called before elm_transit_go(). transit policy*/ + elm_transit_objects_final_state_keep_set(transit, EINA_TRUE); /*Keep the window position as end of effect.*/ + elm_transit_go(transit); + + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_incoming_lock_reject_with_msg_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Event_Mouse_Move *ev = event_info; + + priv->reject_with_msg_start_y = ev->cur.canvas.y; + priv->bmouse_down_pressed = EINA_TRUE; +} + +static void __vcui_view_incoming_lock_reject_with_msg_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Event_Mouse_Move *ev = event_info; + int diff_y = 0; + int max_height_limit = 0; + + /*Max height possible*/ + max_height_limit = (priv->msg_list_height) * (priv->y_scale_factor); + CALL_UI_DEBUG(VC_LOG_DEBUG, "max_height_limit: %d", max_height_limit); + + if (priv->bmouse_down_pressed) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "mouse down was pressed - handle move event"); + priv->reject_with_msg_cur_y = ev->cur.canvas.y; + + diff_y = (priv->reject_with_msg_cur_y - priv->reject_with_msg_start_y) * (priv->y_scale_factor); + CALL_UI_DEBUG(VC_LOG_DEBUG, "diff_y [<<< %d >>>>]", diff_y); + + if (EINA_FALSE == evas_object_data_get(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY)) { + if ((diff_y > -max_height_limit) && (diff_y <= 0)) { + /*Lies between 0 and msg-list layout height*/ + evas_object_move(priv->lock_reject_with_msg, 0, diff_y); + } else if (diff_y <= -max_height_limit) { + /*Special case - Move the max distance - msg-list height*/ + evas_object_move(priv->lock_reject_with_msg, 0, -max_height_limit); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_TRUE); + __reject_screen_transit_complete_cb(vd, NULL); + } + } else { + if ((diff_y >= 0) && (diff_y < max_height_limit)) { + /*Lies between 0 and msg-list layout height*/ + evas_object_move(priv->lock_reject_with_msg, 0, -(max_height_limit - diff_y)); + } else if (diff_y >= max_height_limit) { + /*Special case - Move the max distance - msg-list height*/ + evas_object_move(priv->lock_reject_with_msg, 0, 0); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, (const void *)EINA_FALSE); + __reject_screen_transit_complete_cb(vd, NULL); + } + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "mouse down was NOT pressed - DONT handle move event"); + } +} + +static void __vcui_view_incoming_lock_reject_with_msg_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + if (priv->bmouse_down_pressed) { + ecore_idle_enterer_before_add(__rej_msg_show_sliding_effect, vd); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "mouse down was NOT pressed - DONT handle up event"); + } +} + +static void __send_reject_msg_status_cb(msg_handle_t Handle, msg_struct_t pStatus, void *pUserParam) +{ + VCUI_RETURN_IF_FAIL(pStatus != NULL); + int status = MSG_NETWORK_SEND_FAIL; + + msg_get_int_value(pStatus, MSG_SENT_STATUS_NETWORK_STATUS_INT, &status); + CALL_UI_DEBUG(VC_LOG_DEBUG, "status:[%d]", status); + if (status != MSG_NETWORK_SEND_SUCCESS) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + _vcui_view_popup_replace(_("IDS_MSGC_POP_SENDINGFAILED"), POPUP_TIMEOUT_SHORT, EINA_TRUE); + } +} + +static Eina_Bool __send_reject_msg_on_idle(void *data) +{ + VCUI_RETURN_FALSE_IF_FAIL(data != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + call_data_t *call_data = NULL; + + msg_error_t err = MSG_SUCCESS; + msg_handle_t msgHandle = NULL; + + call_data = _vcui_doc_get_mt_call_data(); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return EINA_FALSE; + } + + err = msg_open_msg_handle(&msgHandle); + if (err != MSG_SUCCESS) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg_open_msg_handle()- failed [%d]", err); + return EINA_FALSE; + } + + err = msg_reg_sent_status_callback(msgHandle, &__send_reject_msg_status_cb, NULL); + if (err != MSG_SUCCESS) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg_reg_sent_status_callback()- failed [%d]", err); + msg_close_msg_handle(&msgHandle); + return EINA_FALSE; + } + msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO); + msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT); + msg_struct_t pReq = msg_create_struct(MSG_STRUCT_REQUEST_INFO); + + /* Set message type to SMS reject*/ + msg_set_int_value(msgInfo, MSG_MESSAGE_TYPE_INT, MSG_TYPE_SMS_REJECT); + + /* No setting send option */ + msg_set_bool_value(sendOpt, MSG_SEND_OPT_SETTING_BOOL, FALSE); + + /* Set message body */ + if (msg_set_str_value(msgInfo, MSG_MESSAGE_SMS_DATA_STR, priv->reject_msg, strlen(priv->reject_msg))!= MSG_SUCCESS) { + CALL_UI_DEBUG(VC_LOG_ERR, "msg_set_str_value() - failed"); + } else { + /* Create address list*/ + msg_struct_list_s *addr_list; + msg_get_list_handle(msgInfo, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); + msg_struct_t addr_info = addr_list->msg_struct_info[0]; + char *call_number = _vcui_doc_get_call_number(call_data); + + /* Set message address */ + msg_set_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, MSG_RECIPIENTS_TYPE_TO); + msg_set_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, call_number, strlen(call_number)); + addr_list->nCount = 1; + + /* Set message struct to Request*/ + msg_set_struct_handle(pReq, MSG_REQUEST_MESSAGE_HND, msgInfo); + msg_set_struct_handle(pReq, MSG_REQUEST_SENDOPT_HND, sendOpt); + + /* Send message */ + err = msg_sms_send_message(msgHandle, pReq); + if (err != MSG_SUCCESS) { + CALL_UI_DEBUG(VC_LOG_ERR, "msg_sms_send_message() - failed [%d]", err); + _vcui_view_popup_replace(_("IDS_MSGC_POP_SENDINGFAILED"), POPUP_TIMEOUT_SHORT, EINA_TRUE); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Sending..."); + } + } + msg_close_msg_handle(&msgHandle); + msg_release_struct(&pReq); + msg_release_struct(&msgInfo); + msg_release_struct(&sendOpt); + + return EINA_FALSE; +} + +static char *__reject_list_get_msg_by_index(void *data, int index) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + char *ret_str = NULL; + + if (priv->msg_func_ptr) { + ret_str = (char *) priv->msg_func_ptr(index); /* i : reject msg index(0 ~ 4)*/ + CALL_UI_DEBUG(VC_LOG_DEBUG, "ret_str(%s)", ret_str); + } + + return ret_str; +} + +static char *__reject_msg_gl_label_get_msg(void *data, Evas_Object *obj, const char *part) +{ + VCUI_RETURN_NULL_IF_FAIL(part != NULL); + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)evas_object_data_get(obj, REJ_MSG_GENLIST_DATA); + + int index = (int)data; + CALL_UI_DEBUG(VC_LOG_DEBUG, "index: %d", index); + char *entry_label = NULL; + char *msg_str = NULL; + + if (!strcmp(part, "elm.text")) { + if (index != -1) { + msg_str = __reject_list_get_msg_by_index(vd, index); + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg_str(%s)", msg_str); + + if (msg_str != NULL) { + entry_label = elm_entry_markup_to_utf8(msg_str); + if (entry_label == NULL) { + free(msg_str); + msg_str = NULL; + return NULL; + } + free(msg_str); + msg_str = NULL; + return entry_label; + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + msg_str = _("No message"); + return strdup(msg_str); + } + } + + return NULL; +} + +static void __reject_msg_send_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + VCUI_RETURN_IF_FAIL(data != NULL); + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + char *ret_str = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + int index = (int)evas_object_data_get(obj, REJ_MSG_GENLIST_INDEX); + + ret_str = __reject_list_get_msg_by_index(vd, index); + if (ret_str) { + snprintf(priv->reject_msg, sizeof(priv->reject_msg), "%s", ret_str); + free(ret_str); + } + + vcall_engine_reject_call(); + + ecore_timer_add(TIMER_TIMEOUT_0_3_SEC, __send_reject_msg_on_idle, vd); +} + +static Evas_Object *__reject_msg_gl_content_get_msg(void *data, Evas_Object *obj, const char *part) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + Evas_Object *button; + int index = (int)data; + CALL_UI_DEBUG(VC_LOG_DEBUG, "index: %d", index); + + if (!strcmp(part, "elm.icon")) { + if (index != -1) { + voice_call_view_data_t *vd = (voice_call_view_data_t *)evas_object_data_get(obj, REJ_MSG_GENLIST_DATA); + button = elm_button_add(obj); + evas_object_data_set(button, REJ_MSG_GENLIST_INDEX, data); + elm_object_text_set(button, dgettext("sys_string", "IDS_COM_SK_SEND")); + evas_object_propagate_events_set(button, EINA_FALSE); + evas_object_smart_callback_add(button, "clicked", __reject_msg_send_btn_cb, vd); + return button; + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "do nothing for index [%d]", index); + } + } + + return NULL; +} + +static void __reject_msg_gl_sel_msg(void *data, Evas_Object *obj, void *event_info) +{ + elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE); +} + +static Evas_Event_Flags __reject_msg_flick_gesture_move_event_cb(void *data, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "Flick_Gesture Move"); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Elm_Gesture_Line_Info *info = (Elm_Gesture_Line_Info *)event_info; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "*********************************************"); + CALL_UI_DEBUG(VC_LOG_DEBUG, "info->angle = %lf", info->angle); + CALL_UI_DEBUG(VC_LOG_DEBUG, "info->momentum.mx = %d, info->momentum.my = %d", info->momentum.mx, info->momentum.my); + CALL_UI_DEBUG(VC_LOG_DEBUG, "info->momentum.n = %d", info->momentum.n); + CALL_UI_DEBUG(VC_LOG_DEBUG, "info->momentum.tx = %d, info->momentum.ty = %d", info->momentum.tx, info->momentum.ty); + CALL_UI_DEBUG(VC_LOG_DEBUG, "info->momentum.x1 = %d, info->momentum.x2 = %d", info->momentum.x1, info->momentum.x2); + CALL_UI_DEBUG(VC_LOG_DEBUG, "info->momentum.y1 = %d, info->momentum.y2 = %d", info->momentum.y1, info->momentum.y2); + CALL_UI_DEBUG(VC_LOG_DEBUG, "*********************************************"); + + priv->y_momentum = info->momentum.my; + + return EVAS_EVENT_FLAG_NONE; +} + +static void __reject_msg_back_cb(void *data, Evas_Object *obj, void *event_info) +{ + VCUI_RETURN_IF_FAIL(data != NULL); + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + evas_object_move(priv->lock_reject_with_msg, 0, 0); + edje_object_signal_emit(priv->lock_reject_with_msg, "show-up-arrow", "reject_msg"); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, EINA_FALSE); +} + +static void __create_new_msg_cb(void *data, Evas_Object *obj, void *event_info) +{ + VCUI_RETURN_IF_FAIL(data != NULL); + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + char *tel_number = NULL; + call_data_t *call_data = NULL; + + vcall_engine_reject_call(); + + vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + + call_data = _vcui_doc_get_mt_call_data(); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return; + } + tel_number = _vcui_doc_get_call_number(call_data); + _vcui_doc_launch_msg_composer(vd, tel_number); +} + +static void __reject_msg_create_call_setting_handle(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + char *error = NULL; + + priv->dl_handle = dlopen(VCUI_CST_SO_PATH, RTLD_LAZY); + if (priv->dl_handle) { + priv->msg_func_ptr = dlsym(priv->dl_handle, VCUI_CST_REJECT_MSG_GET); + if ((error = dlerror()) != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "dlsym failed!!! error = %s", error); + priv->msg_func_ptr = NULL; + dlclose(priv->dl_handle); + priv->dl_handle = NULL; + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "failed to open libug-setting-call-efl.so"); + } +} + +static void __reject_msg_list_height_update(void *data, int msg_cnt) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg_cnt[%d]", msg_cnt); + + switch (msg_cnt) { + case 0: + case 1: + priv->msg_list_height = MTLOCK_REJECT_MSG_ONE_LINE_LIST_HEIGHT+MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + edje_object_signal_emit(priv->lock_reject_with_msg, "show-one-line", "reject-list"); + break; + case 2: + priv->msg_list_height = MTLOCK_REJECT_MSG_TWO_LINE_LIST_HEIGHT+MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + edje_object_signal_emit(priv->lock_reject_with_msg, "show-two-line", "reject-list"); + break; + case 3: + priv->msg_list_height = MTLOCK_REJECT_MSG_THREE_LINE_LIST_HEIGHT+MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + edje_object_signal_emit(priv->lock_reject_with_msg, "show-three-line", "reject-list"); + break; + case 4: + priv->msg_list_height = MTLOCK_REJECT_MSG_FOUR_LINE_LIST_HEIGHT+MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + edje_object_signal_emit(priv->lock_reject_with_msg, "show-four-line", "reject-list"); + break; + case 5: + priv->msg_list_height = MTLOCK_REJECT_MSG_FIVE_LINE_LIST_HEIGHT+MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + edje_object_signal_emit(priv->lock_reject_with_msg, "show-five-line", "reject-list"); + break; + case 6: + priv->msg_list_height = MTLOCK_REJECT_MSG_SIX_LINE_LIST_HEIGHT+MTLOCK_REJECT_MSG_TOOLBAR_HEIGHT; + edje_object_signal_emit(priv->lock_reject_with_msg, "show-six-line", "reject-list"); + break; + default: + break; + } +} + +static void __reject_msg_create_glist(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + int msg_cnt = 0; + int index = 0; + + /* msg count from setting */ + vconf_get_int(VCONFKEY_CISSAPPL_REJECT_CALL_MSG_INT, &msg_cnt); + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg_cnt: %d", msg_cnt); + + /* create gen list */ + if (priv->msg_glist) { + evas_object_del(priv->msg_glist); + priv->msg_glist = NULL; + } + + priv->msg_glist = elm_genlist_add(priv->lock_reject_with_msg); + evas_object_data_set(priv->msg_glist, REJ_MSG_GENLIST_DATA, (const void *)vd); + evas_object_size_hint_weight_set(priv->msg_glist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(priv->msg_glist, EVAS_HINT_FILL, EVAS_HINT_FILL); + edje_object_part_swallow(priv->lock_reject_with_msg, "swl_msglist", priv->msg_glist); + + if (priv->itc_reject_msg) { + elm_genlist_item_class_free(priv->itc_reject_msg); + priv->itc_reject_msg = NULL; + } + priv->itc_reject_msg = elm_genlist_item_class_new(); + + priv->itc_reject_msg->item_style = "1text.1icon"; + priv->itc_reject_msg->func.text_get = __reject_msg_gl_label_get_msg; + priv->itc_reject_msg->func.content_get = __reject_msg_gl_content_get_msg; + priv->itc_reject_msg->func.state_get = NULL; + priv->itc_reject_msg->func.del = NULL; + + if (msg_cnt == 0 ) { + index = -1; + elm_genlist_item_append(priv->msg_glist, priv->itc_reject_msg, (void *)index, NULL, ELM_GENLIST_ITEM_NONE, __reject_msg_gl_sel_msg, NULL); + } else { + for (index = 0; index < msg_cnt; index++) { + elm_genlist_item_append(priv->msg_glist, priv->itc_reject_msg, (void *)index, NULL, ELM_GENLIST_ITEM_NONE, __reject_msg_gl_sel_msg, NULL); + } + } + + /*Adjust the list height*/ + __reject_msg_list_height_update(vd, msg_cnt); +} + +static void __reject_msg_create_gesture_layer(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Object *rej_msg_gesture_layer = NULL; + Evas_Object *rej_msg_bg = NULL; + + rej_msg_bg = (Evas_Object *)edje_object_part_object_get(priv->lock_reject_with_msg, "reject_msg_bg"); + rej_msg_gesture_layer = elm_gesture_layer_add(priv->lock_reject_with_msg); + if (FALSE == elm_gesture_layer_attach(rej_msg_gesture_layer, (Evas_Object *)rej_msg_bg)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "elm_gesture_layer_attach failed !!"); + evas_object_del(rej_msg_gesture_layer); + rej_msg_gesture_layer = NULL; + } else { + elm_gesture_layer_cb_set(rej_msg_gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_MOVE, __reject_msg_flick_gesture_move_event_cb, vd); + } +} + +static void __reject_msg_create_toolbar(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + /* Back button */ + if (priv->back_btn) { + evas_object_del(priv->back_btn); + priv->back_btn = NULL; + } + priv->back_btn = elm_button_add(priv->lock_reject_with_msg); + elm_object_style_set(priv->back_btn, "naviframe/end_btn/default"); + evas_object_smart_callback_add(priv->back_btn, "clicked", __reject_msg_back_cb, data); + edje_object_part_swallow(priv->lock_reject_with_msg, "back_btn", priv->back_btn); + + /* Create the 'Create' button of the toolbar */ + if (priv->create_btn) { + evas_object_del(priv->create_btn); + priv->create_btn = NULL; + } + priv->create_btn = elm_button_add(priv->lock_reject_with_msg); + elm_object_text_set(priv->create_btn, "Create"); + evas_object_smart_callback_add(priv->create_btn, "clicked", __create_new_msg_cb, data); + elm_object_style_set(priv->create_btn, "naviframe/toolbar/default"); + edje_object_part_swallow(priv->lock_reject_with_msg, "create_btn", priv->create_btn); +} + +static Evas_Object *__vcui_view_incoming_lock_create_reject_msg_layout(void *data) +{ + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + Evas_Object *rej_msg_bg = NULL; + + if (priv->lock_reject_with_msg != NULL) { + evas_object_del(priv->lock_reject_with_msg); + priv->lock_reject_with_msg = NULL; + } + priv->lock_reject_with_msg = __vcui_view_incoming_lock_load_edj(evas_object_evas_get(ad->win_conformant), EDJ_NAME, GRP_LOCK_REJECT_WITH_MSG); + evas_object_resize(priv->lock_reject_with_msg, ad->root_w, ad->root_h); + + __reject_msg_create_call_setting_handle(vd); + + __reject_msg_create_glist(vd); + + __reject_msg_create_gesture_layer(vd); + + __reject_msg_create_toolbar(vd); + + rej_msg_bg = (Evas_Object *)edje_object_part_object_get(priv->lock_reject_with_msg, "reject_msg_bg"); + evas_object_event_callback_add(rej_msg_bg, EVAS_CALLBACK_MOUSE_DOWN, __vcui_view_incoming_lock_reject_with_msg_mouse_down_cb, vd); + evas_object_event_callback_add(rej_msg_bg, EVAS_CALLBACK_MOUSE_MOVE, __vcui_view_incoming_lock_reject_with_msg_mouse_move_cb, vd); + evas_object_event_callback_add(rej_msg_bg, EVAS_CALLBACK_MOUSE_UP, __vcui_view_incoming_lock_reject_with_msg_mouse_up_cb, vd); + + edje_object_part_text_set(priv->lock_reject_with_msg, "reject_msg_text", _("IDS_VCALL_BUTTON_REJECT_WITH_MESSAGE")); + edje_object_signal_emit(priv->lock_reject_with_msg, "show-up-arrow", "reject_msg"); + evas_object_data_set(priv->lock_reject_with_msg, REJ_MSG_LIST_OPEN_STATUS_KEY, EINA_FALSE); + + __reject_msg_list_param_reset(vd); + + evas_object_show(priv->lock_reject_with_msg); + + return priv->lock_reject_with_msg; +} + +static void __vcui_view_incoming_lock_draw_screen(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + Evas_Object *eo = priv->contents; + vcui_app_call_data_t *ad = vd->app_data; + char *file_path = NULL; + call_data_t *call_data = NULL; + + call_data = _vcui_doc_get_mt_call_data(); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return; + } + if (_vcui_doc_get_call_type(call_data) != CALL_INCOMING) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "it is not call_incoming."); + return; + } + + file_path = _vcui_doc_get_caller_id_file_path(call_data); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "file_path: %s", file_path); + + if (strcmp(file_path, NOIMG_ICON) == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "no-img"); + _vcui_create_no_id_animation(priv->caller_id, INCOME_ANI); + edje_object_signal_emit(_EDJ(priv->caller_id), "show-no-cid-connecting", "cid-img"); + } else { + _vcui_show_caller_id(priv->caller_id, file_path); + /*put blur effect on full-cid*/ + } + + char *call_number = _vcui_doc_get_call_number(call_data); + char *call_name = _vcui_doc_get_call_display_name(call_data); + /* call name (if nothing, call number) */ + if (strlen(call_name) == 0) { + _vcui_show_caller_info_name(vd, call_number, EINA_FALSE); + } else { + _vcui_show_caller_info_name(vd, call_name, EINA_FALSE); + _vcui_show_caller_info_number(vd, call_number, EINA_FALSE); + } + + _vcui_show_caller_info_icon(vd, EINA_FALSE); + _vcui_show_caller_info_status(vd, dgettext("sys_string", "IDS_COM_BODY_VOICE_CALL"), EINA_FALSE); + + __vcui_view_incoming_lock_create_accept_btn(priv->contents); + __vcui_view_incoming_lock_create_reject_btn(priv->contents); + + if (!(_vcui_is_phonelock_status() == EINA_TRUE)) { + if (strlen(call_number) > 0) { + __vcui_view_incoming_lock_create_reject_msg_layout(vd); + } + } + ad->beffect_needed = EINA_TRUE; + + evas_object_show(eo); + + if (_vcui_doc_get_forwarded_call(call_data)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "This is forwarded call"); + priv->notify = _vcui_create_notify(ad->win_conformant, _("IDS_COM_BODY_FORWARDED_CALL")); + } +} + +static Evas_Object *__vcui_view_incoming_lock_create_contents(void *data, char *grpname) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo; + + /* load edje */ + eo = _vcui_load_edj(vd->layout, EDJ_NAME, grpname); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_incoming_lock_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_incoming_lock_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "mt-lock view create!!"); + + vcui_app_call_data_t *ad = view_data->app_data; + incoming_lock_view_priv_t *priv = view_data->priv; + + evas_object_pointer_mode_set(ad->win_main, EVAS_OBJECT_POINTER_MODE_NOGRAB); + if (!view_data->layout) { + view_data->layout = __vcui_view_incoming_lock_create_layout_main(ad->win_conformant); + if (view_data->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + elm_object_content_set(ad->win_conformant, view_data->layout); + + priv->contents = __vcui_view_incoming_lock_create_contents(view_data, GRP_MTLOCK); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + priv->caller_info = __vcui_view_incoming_lock_create_contents(view_data, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info", priv->caller_info); + edje_object_signal_emit(_EDJ(priv->caller_info), "set-connecting-caller_info", "connecting-screen"); + + priv->caller_id = __vcui_view_incoming_lock_create_contents(view_data, GRP_CALLER_ID_LAYOUT); + elm_object_part_content_set(priv->contents, "caller_id", priv->caller_id); + + evas_object_name_set(priv->contents, VIEW_INCOMING_LOCK_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== INCOMINGLOCKVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + } + + __vcui_view_incoming_lock_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "mt-lock view update!!"); + + __vcui_view_incoming_lock_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "mt-lock view hide!!"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "mt-lock view show!!"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)view_data->priv; + int result = 0; + + /*change the orientation to normal - 0*/ + elm_win_rotation_with_resize_set(view_data->app_data->win_main, 0); + elm_win_rotation_with_resize_set(view_data->app_data->popup_mw, 0); + + if (ad->root_w == MAIN_WIN_HD_W && ad->root_h == MAIN_WIN_HD_H) { + priv->y_scale_factor = 1; + } else if (ad->root_w == MAIN_WIN_WVGA_W && ad->root_h == MAIN_WIN_WVGA_H) { + priv->y_scale_factor = (double) MAIN_WIN_WVGA_H/MAIN_WIN_HD_H; + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "y_scale_factor %f", priv->y_scale_factor); + + __vcui_view_incoming_lock_draw_screen(view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + _vcui_app_win_set_noti_type(EINA_TRUE); + + result = utilx_grab_key(ad->disp, ad->win, KEY_POWER, TOP_POSITION_GRAB); + if (result) + CALL_UI_DEBUG(VC_LOG_DEBUG, "KEY_VOLUMEUP key grab failed"); + + result = utilx_grab_key(ad->disp, ad->win, KEY_SELECT, TOP_POSITION_GRAB); + if (result) + CALL_UI_DEBUG(VC_LOG_DEBUG, "KEY_VOLUMEUP key grab failed"); + + return VC_NO_ERROR; +} + +static int __vcui_view_incoming_lock_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "mt-lock view destroy!!"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCOMING_LOCK_VIEW]; + incoming_lock_view_priv_t *priv = (incoming_lock_view_priv_t *)vd->priv; + + if (_vcui_is_idle_lock() == CALL_LOCK) + _vcui_app_win_set_noti_type(EINA_TRUE); + else + _vcui_app_win_set_noti_type(EINA_FALSE); + + ad->bmute_ringtone = EINA_FALSE; + if (priv != NULL) { + + if (priv->itc_reject_msg) { + elm_genlist_item_class_free(priv->itc_reject_msg); + priv->itc_reject_msg = NULL; + } + + if (priv->msg_glist) { + evas_object_del(priv->msg_glist); + priv->msg_glist = NULL; + } + + if (priv->create_btn) { + evas_object_del(priv->create_btn); + priv->create_btn = NULL; + } + + if (priv->back_btn) { + evas_object_del(priv->back_btn); + priv->back_btn = NULL; + } + + if (priv->lock_reject_with_msg) { + evas_object_del(priv->lock_reject_with_msg); + priv->lock_reject_with_msg = NULL; + } + + if (priv->caller_info) { + evas_object_del(priv->caller_info); + priv->caller_info = NULL; + } + + if (priv->caller_id) { + evas_object_del(priv->caller_id); + priv->caller_id = NULL; + } + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCOMING_LOCK_VIEW] = NULL; + + _vcui_cache_flush(); + + utilx_ungrab_key(ad->disp, ad->win, KEY_SELECT); + utilx_ungrab_key(ad->disp, ad->win, KEY_POWER); + + return VC_NO_ERROR; +} + +int _vc_ui_view_incoming_lock_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + incoming_lock_view_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (incoming_lock_view_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VIEW_INCOMING_LOCK_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vc_ui_view_incoming_lock_get_caller_info(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incoming_lock_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incoming_lock_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info; +} + +Evas_Object *_vc_ui_view_incoming_lock_get_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incoming_lock_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incoming_lock_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + diff --git a/ui/src/vcui-view-keypad.c b/ui/src/vcui-view-keypad.c new file mode 100755 index 0000000..340a8f4 --- /dev/null +++ b/ui/src/vcui-view-keypad.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-keypad.h" +#include "vcui-view-common.h" + +typedef struct _keypad_data_t { + Evas_Object *parent_ly; + Evas_Object *keypad_ly; + Evas_Object *separator_ly; + Evas_Object *entry; + int data_len; + char entry_disp_data[KEYPAD_ENTRY_DISP_DATA_SIZE+1]; + Eina_Bool bkeypad_show; +}keypad_data_t; + +static keypad_data_t *gkeypad_data; + +static void __vcui_keypad_create_entry(void *data); + +static Evas_Object *__vcui_keypad_create_contents(void *data, char *grp_name) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *eo; + + /* load edje */ + eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, grp_name); + if (eo == NULL) + return NULL; + + return eo; +} + +static keypad_data_t *__vcui_keypad_memory_alloc() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + VCUI_RETURN_VALUE_IF_FAIL(gkeypad_data == NULL, gkeypad_data); + + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + gkeypad_data = (keypad_data_t *) calloc(1, sizeof(keypad_data_t)); + if (gkeypad_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "keydata structure not allocated"); + return NULL; + } + memset(gkeypad_data, 0x00, sizeof(keypad_data_t)); + gkeypad_data->bkeypad_show = EINA_FALSE; + + return gkeypad_data; +} + +void _vcui_keypad_create_layout(void *data, Evas_Object *parent_ly) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + keypad_data_t *pkeypad_data = NULL; + + pkeypad_data = __vcui_keypad_memory_alloc(); + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + if (!pkeypad_data->keypad_ly) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + pkeypad_data->keypad_ly = __vcui_keypad_create_contents(vd, GRP_KEYPAD); + elm_object_part_content_set(parent_ly, "keypad_region", pkeypad_data->keypad_ly); + } + CALL_UI_DEBUG(VC_LOG_DEBUG, "keypad_ly :%p", pkeypad_data->keypad_ly); + + __vcui_keypad_create_entry(vd); +} + +Eina_Bool _vcui_keypad_get_show_status(void) +{ + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_FALSE_IF_FAIL(pkeypad_data != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "Get show status(%d)", pkeypad_data->bkeypad_show); + return pkeypad_data->bkeypad_show; +} + +void _vcui_keypad_set_show_status(Eina_Bool bkeypad_status) +{ + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "Set show status(%d)", bkeypad_status); + pkeypad_data->bkeypad_show = bkeypad_status; +} + +static void __vcui_keypad_on_key_down(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "source(%s)", source); + + char *entry_dest = NULL; + char *keypad_source = NULL; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + if (NULL == vd) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "data is null"); + return; + } + + if (source == NULL || strlen(source) == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Source value is not valid"); + return; + } + + if (strcmp(source, "star") == 0) { + keypad_source = "*"; + } else if (strcmp(source, "sharp") == 0) { + keypad_source = "#"; + } else { + keypad_source = (char *)source; + } + + const char *disp_str = elm_entry_entry_get(pkeypad_data->entry); + + if (disp_str == NULL) { + return; + } else if (strlen(disp_str) == 0) { + entry_dest = calloc(1, 2); + entry_dest[0] = keypad_source[0]; + } else { + int buf_size = strlen(disp_str) + 2; + entry_dest = calloc(1, buf_size); + snprintf(entry_dest, buf_size, "%s%c", disp_str, keypad_source[0]); + } + + elm_object_text_set(pkeypad_data->entry, entry_dest); + elm_entry_cursor_end_set(pkeypad_data->entry); + + if (entry_dest) { + free(entry_dest); + entry_dest = NULL; + } +} + +static void __vcui_keypad_entry_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + char dtmf_number[2]; + keypad_data_t *pkeypad_data = gkeypad_data; + const char *disp_str = elm_entry_entry_get(pkeypad_data->entry); + + if (disp_str == NULL || strlen(disp_str) == 0) + return; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "entry [%s]", disp_str); + + dtmf_number[0] = disp_str[(strlen(disp_str) - 1)]; + dtmf_number[1] = '\0'; + vcall_engine_send_dtmf_number(dtmf_number); +} + +static Evas_Object *__vcui_keypad_create_single_line_scrolled_entry(void *content) +{ + Evas_Object *en; + Elm_Entry_Filter_Accept_Set digits_filter_data; + + if (content == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "content is NULL!"); + return NULL; + } + + en = elm_entry_add(content); + elm_entry_scrollable_set(en, EINA_TRUE); + + elm_entry_select_all(en); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + + elm_scroller_bounce_set(en, EINA_FALSE, EINA_FALSE); + elm_entry_line_wrap_set(en, ELM_WRAP_WORD); + elm_entry_input_panel_enabled_set(en, EINA_FALSE); + elm_entry_single_line_set(en, EINA_TRUE); + + digits_filter_data.accepted = "0123456789+*#"; + digits_filter_data.rejected = NULL; + elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data); + + elm_entry_context_menu_disabled_set(en, EINA_TRUE); + elm_entry_magnifier_disabled_set(en, EINA_TRUE); + elm_entry_text_style_user_push(en, "DEFAULT='font_size=70 color=#FFFFFF shadow_color=#000000 style=outline_shadow'"); + + elm_entry_cursor_end_set(en); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(en); + + return en; +} + +static void __vcui_keypad_create_entry(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + if (!pkeypad_data->entry) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + pkeypad_data->entry = __vcui_keypad_create_single_line_scrolled_entry(pkeypad_data->keypad_ly); + memset(pkeypad_data->entry_disp_data, 0x0, sizeof(pkeypad_data->entry_disp_data)); + pkeypad_data->data_len = 0; + + evas_object_smart_callback_add(pkeypad_data->entry, "changed", __vcui_keypad_entry_changed_cb, NULL); + edje_object_signal_callback_add(_EDJ(pkeypad_data->keypad_ly), "pad_down", "*", __vcui_keypad_on_key_down, vd); + + edje_object_part_swallow(_EDJ(pkeypad_data->keypad_ly), "textblock/textarea", pkeypad_data->entry); + } +} + +void _vcui_keypad_delete_layout(Evas_Object *parent_ly) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + if (pkeypad_data->separator_ly) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + edje_object_part_unswallow(_EDJ(pkeypad_data->keypad_ly), pkeypad_data->separator_ly); + evas_object_del(pkeypad_data->separator_ly); + pkeypad_data->separator_ly = NULL; + } + + if (pkeypad_data->entry) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + edje_object_part_unswallow(_EDJ(pkeypad_data->keypad_ly), pkeypad_data->entry); + evas_object_del(pkeypad_data->entry); + pkeypad_data->entry = NULL; + } + + if (pkeypad_data->keypad_ly) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + edje_object_part_unswallow(_EDJ(parent_ly), pkeypad_data->keypad_ly); + evas_object_del(pkeypad_data->keypad_ly); + pkeypad_data->keypad_ly = NULL; + } + + pkeypad_data->parent_ly = NULL; + + free(pkeypad_data); + pkeypad_data = NULL; + gkeypad_data = NULL; +} + +void _vcui_keypad_delete_separator_layout(void) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + if (pkeypad_data->separator_ly) { + edje_object_part_unswallow(_EDJ(pkeypad_data->keypad_ly), pkeypad_data->separator_ly); + evas_object_del(pkeypad_data->separator_ly); + pkeypad_data->separator_ly = NULL; + } +} + +static void __vcui_keypad_hide_btn_effect_done(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + keypad_data_t *pkeypad_data = gkeypad_data; + Evas_Object *parent_ly = NULL; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + /*Reset the entry area and text*/ + memset(pkeypad_data->entry_disp_data, '\0', KEYPAD_ENTRY_DISP_DATA_SIZE+1); + pkeypad_data->data_len = 0; + elm_entry_entry_set(pkeypad_data->entry, ""); + elm_entry_cursor_end_set(pkeypad_data->entry); + + parent_ly = pkeypad_data->parent_ly; + VCUI_RETURN_IF_FAIL(parent_ly != NULL); + + /*Hide keypad layout - ON view*/ + edje_object_signal_emit(_EDJ(parent_ly), "HIDE", "KEYPAD_BTN"); + /*Show caller info area*/ + edje_object_signal_emit(_EDJ(parent_ly), "SHOW", "CALL_AREA"); + + if (ad->badd_call_clicked) { + _vcui_doc_launch_phoneui_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data)); + ad->badd_call_clicked = EINA_FALSE; + } else if (ad->bcontact_clicked) { + _vcui_doc_launch_contact_list_ug(NULL, NULL, vd->layout, NULL, NULL, NULL, &(vd->app_data->ugs_array_data)); + ad->bcontact_clicked = EINA_FALSE; + } + ad->beffect_show = EINA_FALSE; +} + +void _vcui_keypad_show_hide_effect(void *data, Evas_Object *parent_ly) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *) data; + vcui_app_call_data_t *ad = vd->app_data; + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + ad->beffect_show = EINA_TRUE; + + edje_object_signal_emit(_EDJ(pkeypad_data->keypad_ly), "HIDE", "KEYPADBTN"); + pkeypad_data->parent_ly = parent_ly; + edje_object_signal_callback_add(_EDJ(pkeypad_data->keypad_ly), "DONE", "HIDEKEYPAD", __vcui_keypad_hide_btn_effect_done, vd); +} + +void _vcui_keypad_show_layout(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + keypad_data_t *pkeypad_data = gkeypad_data; + + VCUI_RETURN_IF_FAIL(pkeypad_data != NULL); + + edje_object_signal_emit(_EDJ(pkeypad_data->keypad_ly), "SHOW", "KEYPADBTN"); +} diff --git a/ui/src/vcui-view-multi-call-conf.c b/ui/src/vcui-view-multi-call-conf.c new file mode 100755 index 0000000..13b6295 --- /dev/null +++ b/ui/src/vcui-view-multi-call-conf.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-document.h" +#include "vcui-view-common.h" +#include "vcui-view-elements.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-keypad.h" + +#define VCUI_VIEW_MULTICALL_CONF_LAYOUT_ID "MULTIVIEWCONF" +typedef struct { + Evas_Object *contents; + Evas_Object *caller_info; + Evas_Object *btn_ly; + Evas_Object *cid_ly; + Evas_Object *ic; + Evas_Object *record_btn; + vcui_app_call_status_t call_status; + int total_members; +} vcui_view_multi_call_conf_priv_t; + +static int __vcui_view_multi_call_conf_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_multi_call_conf_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_multi_call_conf_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_conf_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_conf_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_MULTICALL_CONF_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_multi_call_conf_oncreate, + .onUpdate = __vcui_view_multi_call_conf_onupdate, + .onHide = __vcui_view_multi_call_conf_onhide, + .onShow = __vcui_view_multi_call_conf_onshow, + .onDestroy = __vcui_view_multi_call_conf_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_multi_call_conf_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_multi_call_conf_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!!!!!!!!!! "); + } + + return &s_view; +} + +static void __vcui_view_multi_call_conf_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + char buf[DEF_BUF_LEN] = { 0, }; + call_data_t *call_data = NULL; + + priv->call_status = _vcui_doc_get_group_call_status(); + call_data = _vcui_doc_get_call_data_by_call_status(priv->call_status); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return; + } + priv->total_members = _vcui_doc_get_hold_call_data_count() + _vcui_doc_get_unhold_call_data_count(); + + elm_win_rotation_with_resize_set(ad->win_main, ad->rotate_angle); + elm_win_rotation_with_resize_set(ad->popup_mw, ad->rotate_angle); + + if (ad->rotate_angle == 0 || ad->rotate_angle == 180) { + CALL_UI_DEBUG(VC_LOG_DEBUG,"create portrait mode layout items"); + + priv->ic = _vcui_show_default_image(priv->contents, CONF_ICON); + if (priv->call_status == CALL_HOLD) { + if (ad->root_w == MAIN_WIN_HD_W && ad->root_h == MAIN_WIN_HD_H) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_HD", "CID_HD"); + } else if (ad->root_w == MAIN_WIN_WVGA_W && ad->root_h == MAIN_WIN_WVGA_H) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_WVGA", "CID_WVGA"); + } + edje_object_signal_emit(_EDJ(priv->caller_info), "set-hold-state", "call-screen"); + } else { + Evas_Object *txt_status = edje_object_part_swallow_get(_EDJ(priv->caller_info), "txt_status"); + if (txt_status) { + edje_object_part_unswallow(_EDJ(priv->caller_info), txt_status); + evas_object_del(txt_status); + } + edje_object_signal_emit(_EDJ(priv->contents), "HIDE_DIM", "CID"); + edje_object_signal_emit(_EDJ(priv->caller_info), "set-unhold-state", "call-screen"); + } + + _vcui_show_caller_info_status(data, _("IDS_CALL_BODY_ON_HOLD_ABB"), EINA_FALSE); + _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_FALSE); + snprintf(buf, DEF_BUF_LEN, "%d %s", priv->total_members, _("IDS_CALL_BODY_PEOPLE")); + _vcui_show_caller_info_number(vd, buf, EINA_FALSE); + + _vcui_show_caller_info_icon(vd, EINA_FALSE); + + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data)); + + { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + /*create a small button for Hold/Swap*/ + _vcui_create_hold_swap_button(vd); + + if (((_vcui_is_phonelock_status() == EINA_TRUE) && (_vcui_is_idle_lock() == EINA_TRUE)) + || (priv->call_status == CALL_HOLD)) { + _vcui_create_bottom_second_button_disabled(vd); + } else { + /*Delete keypad layout - before creating the keypad button again + * Since layout are created again in update_cb + * to handle rotation use-case*/ + _vcui_keypad_delete_layout(priv->contents); + + _vcui_create_bottom_second_button(vd); + } + _vcui_create_top_end_button(vd); + _vcui_create_bottom_third_button(vd); + _vcui_create_bottom_fourth_button(vd); + + { + if (_vcui_view_common_is_emul_bin() == EINA_TRUE) { + _vcui_create_bottom_first_button_disabled(vd); + _vcui_create_bottom_fifth_button_disabled(vd); + } else { + _vcui_create_bottom_first_button(vd); + _vcui_create_bottom_fifth_button(vd); + } + } + } + + ad->beffect_needed = EINA_FALSE; + } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "landscape mode not supported"); + } + + _vcui_elements_check_keypad_n_hide(vd); + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_multi_call_conf_create_contents(void *data, char *group) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *eo; + + /* load edje */ + eo = _vcui_load_edj(vd->layout, EDJ_NAME, group); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_multi_call_conf_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_multi_call_conf_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + voice_call_view_data_t *vd = view_data; + + if (!vd->layout) { + + /* Create Main Layout */ + vd->layout = __vcui_view_multi_call_conf_create_layout_main(vd->app_data->win_conformant); + if (vd->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[UI]ad->layout_multicallconf==NULL case "); + evas_object_show(vd->layout); + } + elm_object_content_set(vd->app_data->win_conformant, view_data->layout); + + __vcui_view_multi_call_conf_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-conf view update"); + + __vcui_view_multi_call_conf_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-conf view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-conf view show"); + + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)view_data->priv; + Evas_Object *sep_ly = NULL; + + vcui_app_call_data_t *ad = view_data->app_data; + /*if (priv->cid_ly) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + evas_object_del(priv->cid_ly); + priv->cid_ly = NULL; + } + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + }*/ + + if (ad->rotate_angle == 0 || ad->rotate_angle == 180) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "portrait mode layout"); + priv->contents = __vcui_view_multi_call_conf_create_contents(view_data, GRP_MULTICALL_CONF); + priv->caller_info = __vcui_view_multi_call_conf_create_contents(view_data, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info", priv->caller_info); + sep_ly = __vcui_view_multi_call_conf_create_contents(view_data, GRP_SEPARATOR_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_bg", sep_ly); + priv->btn_ly = __vcui_view_multi_call_conf_create_contents(view_data, GRP_BUTTON_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly); + } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "landscape mode not supported"); + } + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + evas_object_name_set(priv->contents, VCUI_VIEW_MULTICALL_CONF_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== MULTIVIEWCONF: priv->contents Addr : [%p] ==========]", priv->contents); + + __vcui_view_multi_call_conf_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_conf_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-conf view destroy"); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_CONF_VIEW]; + vcui_view_multi_call_conf_priv_t *priv = (vcui_view_multi_call_conf_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->cid_ly) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + evas_object_del(priv->cid_ly); + priv->cid_ly = NULL; + } + if (priv->btn_ly) { + evas_object_del(priv->btn_ly); + priv->btn_ly = NULL; + } + + /*Delete keypad layout*/ + _vcui_keypad_delete_layout(priv->contents); + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_MULTICALL_CONF_VIEW] = NULL; + + _vcui_cache_flush(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "complete destroy multi view conf"); + + return VC_NO_ERROR; +} + +int _vcui_view_multi_call_conf_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_view_multi_call_conf_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_MULTICALL_CONF_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vcui_view_multi_call_conf_get_main_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_conf_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + +int _vcui_view_multi_call_conf_get_call_status(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_conf_priv_t *priv = NULL; + int call_status = 0; + + VCUI_RETURN_INVALID_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_INVALID_IF_FAIL(priv); + if (priv->call_status == CALL_HOLD) { + call_status = CALL_HOLD; + } else { + call_status = CALL_UNHOLD; + } + + return call_status; +} + +void _vcui_view_multi_call_conf_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur) +{ + vcui_view_multi_call_conf_priv_t *priv = NULL; + + VCUI_RETURN_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_IF_FAIL(priv); + edje_object_part_text_set(_EDJ(priv->caller_info), "txt_timer", _(pcall_dur)); +} + +Evas_Object *_vcui_view_multi_call_conf_get_button_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_conf_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->btn_ly; +} + +Evas_Object *_vcui_view_multi_call_conf_get_cid_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_conf_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->cid_ly; +} + +int _vcui_view_multi_call_conf_get_total_members(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_conf_priv_t *priv = NULL; + + VCUI_RETURN_INVALID_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_INVALID_IF_FAIL(priv); + + return priv->total_members; +} + +Evas_Object *_vc_ui_view_multi_call_conf_get_caller_info(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_conf_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_multi_call_conf_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info; +} + diff --git a/ui/src/vcui-view-multi-call-list.c b/ui/src/vcui-view-multi-call-list.c new file mode 100755 index 0000000..25e1d9b --- /dev/null +++ b/ui/src/vcui-view-multi-call-list.c @@ -0,0 +1,515 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-elements.h" +#include "vcui-view-multi-call-list.h" + +static Elm_Genlist_Item_Class *itc_call; + +#define VCUI_VIEW_MULTICALL_LIST_LAYOUT_ID "MULTIVIEWLIST" +typedef struct { + Evas_Object *nf; + Evas_Object *contents; + Evas_Object *ic; + Evas_Object *record_btn; + vcui_app_call_status_t call_status; + Evas_Object *multibox_gl; + int total_members; +} vcui_view_multi_call_list_priv_t; + +static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_MULTICALL_LIST_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_multi_call_list_oncreate, + .onUpdate = __vcui_view_multi_call_list_onupdate, + .onHide = __vcui_view_multi_call_list_onhide, + .onShow = __vcui_view_multi_call_list_onshow, + .onDestroy = __vcui_view_multi_call_list_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_multi_call_list_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_multi_call_list_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR "); + } + + return &s_view; +} + +static void __vcui_view_multi_call_list_small_end_call_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + call_data_t *call_data = data; + int handle = _vcui_doc_get_call_handle(call_data); + vcall_engine_release_call_by_handle(handle); + ad->call_end_type = CALL_END_TYPE_NONE; + + _vcui_view_popup_load_endcall_time(call_data); +} + +static void __vcui_view_multi_call_list_split_call_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + call_data_t *call_data = data; + int handle = _vcui_doc_get_call_handle(call_data); + vcall_engine_split_call(handle); +} + +static void __vcui_view_multi_call_list_gl_sel_call(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + + elm_object_item_data_get(item); + elm_genlist_item_selected_set(item, 0); +} + +static void __vcui_view_multi_call_list_gl_del_call(void *data, Evas_Object *obj) +{ + + return; +} + +static Eina_Bool __vcui_view_multi_call_list_gl_state_get_call(void *data, Evas_Object *obj, const char *part) +{ + + return EINA_FALSE; +} + +static Evas_Object *__vcui_view_multi_call_list_gl_icon_get_call(void *data, Evas_Object *obj, const char *part) +{ + call_data_t *call_data = (call_data_t *)data; + + Evas_Object *icon = NULL; + Evas_Object *btn = NULL; + + if (strcmp(part, "elm.swallow.end") == 0) { + btn = elm_button_add(obj); + elm_object_style_set(btn, "style_call_icon_only_end"); + icon = elm_image_add(obj); + elm_image_file_set(icon, CONF_CALL_END_ICON, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_image_resizable_set(icon, 1, 1); + elm_object_content_set(btn, icon); + + evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_small_end_call_cb, call_data); + evas_object_propagate_events_set(btn, EINA_FALSE); + + return btn; + } else if (strcmp(part, "elm.swallow.private") == 0) { + if (_vcui_doc_get_hold_call_data_count() > 0) { + return NULL; + } + btn = elm_button_add(obj); + icon = elm_image_add(obj); + elm_image_file_set(icon, PRIVATE_ICON, NULL); + elm_object_style_set(btn, "style_call_icon_only_private"); + + elm_image_resizable_set(icon, 1, 1); + elm_object_content_set(btn, icon); + + evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_split_call_cb, call_data); + evas_object_propagate_events_set(btn, EINA_FALSE); + + return btn; + } + + return NULL; +} + +static char *__vcui_view_multi_call_list_gl_label_get_call(void *data, Evas_Object *obj, const char *part) +{ + char buf[DEF_BUF_LEN] = { 0, }; + call_data_t *call_data = (call_data_t *)data; + char *call_number = _vcui_doc_get_call_number(call_data); + char *call_name = _vcui_doc_get_call_display_name(call_data); + + if (strcmp(part, "elm.text") == 0) { + if (strlen(call_name) == 0) { + snprintf(buf, sizeof(buf), "%s", call_number); + } else { + snprintf(buf, sizeof(buf), "%s", call_name); + } + } + + return strdup(buf); +} + +static void __vcui_view_multi_call_list_genlist_init(void *data) +{ + itc_call = elm_genlist_item_class_new(); + + itc_call->item_style = "multicall_list"; + itc_call->func.text_get = __vcui_view_multi_call_list_gl_label_get_call; + itc_call->func.content_get = __vcui_view_multi_call_list_gl_icon_get_call; + itc_call->func.state_get = __vcui_view_multi_call_list_gl_state_get_call; + itc_call->func.del = __vcui_view_multi_call_list_gl_del_call; +} + +static void __vcui_view_multi_call_list_genlist_add(void *data) +{ + voice_call_view_data_t *vd = data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + Evas_Object *genlist = NULL; + + genlist = elm_genlist_add(priv->contents); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_object_part_content_set(priv->contents, "swl_calllist", genlist); + priv->multibox_gl = genlist; +} + +void __vcui_view_multi_call_list_genlist_item_append(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + Eina_List *list = NULL; + + if (priv->multibox_gl) { + elm_genlist_clear(priv->multibox_gl); + } + + if (priv->call_status == CALL_UNHOLD) { + list = _vcui_doc_get_caller_list_with_unhold_status(); + } else { + list = _vcui_doc_get_caller_list_with_hold_status(); + } + if (list == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "error"); + return; + } + + Eina_List *l = NULL; + call_data_t *call_data = NULL; + EINA_LIST_FOREACH(list, l, call_data) { + elm_genlist_item_append(priv->multibox_gl, itc_call, (void *)call_data, NULL, ELM_GENLIST_ITEM_NONE, __vcui_view_multi_call_list_gl_sel_call, data); + } + eina_list_free(list); +} + +static void __vcui_view_multi_call_list_back_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + _vcui_view_auto_change(); +} + +static void __vcui_view_multi_call_list_draw_screen(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + call_data_t *call_data = NULL; + + priv->total_members = _vcui_doc_get_hold_call_data_count() + _vcui_doc_get_unhold_call_data_count(); + priv->call_status = _vcui_doc_get_group_call_status(); + call_data = _vcui_doc_get_call_data_by_call_status(priv->call_status); + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return; + } + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data)); + + elm_win_rotation_with_resize_set(ad->win_main, ad->rotate_angle); + elm_win_rotation_with_resize_set(ad->popup_mw, ad->rotate_angle); + + if (ad->rotate_angle == 0 || ad->rotate_angle == 180) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "create portrait mode layout items"); + + __vcui_view_multi_call_list_genlist_item_append(vd); + + _vcui_create_conf_list_button_hold(vd); + _vcui_create_button_bigend(vd); + } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "landscape mode not supported"); + } + evas_object_show(priv->contents); +} + +static Evas_Object *__vcui_view_multi_call_list_create_naviframe(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *nf = elm_naviframe_add(parent); + retvm_if(nf == NULL, NULL, "Failed elm_naviframe_add."); + + elm_object_part_content_set(parent, "elm.swallow.content", nf); + evas_object_show(nf); + + return nf; +} + +static Evas_Object *__vcui_view_multi_call_list_create_contents(Evas_Object *parent, char *group) +{ + Evas_Object *eo; + + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + /* load edje */ + eo = _vcui_load_edj(parent, EDJ_NAME, group); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_multi_call_list_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_win_indicator_mode_set(ly, ELM_WIN_INDICATOR_SHOW); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-list view create"); + + voice_call_view_data_t *vd = view_data; + + if (!vd->layout) { + vd->layout = __vcui_view_multi_call_list_create_layout_main(vd->app_data->win_conformant); + if (vd->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[UI]ad->layout_multicall != NULL case "); + evas_object_show(vd->layout); + } + elm_object_content_set(vd->app_data->win_conformant, view_data->layout); + + __vcui_view_multi_call_list_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-list view update"); + + __vcui_view_multi_call_list_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-list view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-list view show"); + + vcui_app_call_data_t *ad = view_data->app_data; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)view_data->priv; + Evas_Object *back_btn = NULL; + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + if (priv->nf) { + evas_object_del(priv->nf); + priv->nf = NULL; + } + + /* Create naviframe layout */ + priv->nf = __vcui_view_multi_call_list_create_naviframe(view_data->layout); + + if (ad->rotate_angle == 0 || ad->rotate_angle == 180) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "portrait mode layout"); + priv->contents = __vcui_view_multi_call_list_create_contents(priv->nf, GRP_MULTICALL); + + __vcui_view_multi_call_list_genlist_add(view_data); + __vcui_view_multi_call_list_genlist_init(view_data); + + } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "landscape mode not supported"); + } + + back_btn = elm_button_add(priv->nf); + elm_object_style_set(back_btn, "naviframe/end_btn/default"); + evas_object_smart_callback_add(back_btn, "clicked", __vcui_view_multi_call_list_back_cb, view_data); + + elm_naviframe_item_push(priv->nf, _("IDS_CALL_OPT_CONFERENCE_CALL"), back_btn, NULL, priv->contents, NULL); + + evas_object_name_set(priv->contents, VCUI_VIEW_MULTICALL_LIST_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== MULTIVIEWLIST: priv->contents Addr : [%p] ==========]", priv->contents); + + __vcui_view_multi_call_list_draw_screen(view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multicall-list view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW]; + vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv; + + if (itc_call) + elm_genlist_item_class_free(itc_call); + + if (priv != NULL) { + if (priv->multibox_gl != NULL) { + elm_genlist_clear(priv->multibox_gl); + evas_object_del(priv->multibox_gl); + priv->multibox_gl = NULL; + } + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + if (priv->nf) { + evas_object_del(priv->nf); + priv->nf = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW] = NULL; + + _vcui_cache_flush(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "complete destroy multi view list"); + return VC_NO_ERROR; +} + +int _vcui_view_multi_call_list_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + vcui_view_multi_call_list_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_MULTICALL_LIST_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vcui_view_multi_call_list_get_main_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_list_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + +int _vcui_view_multi_call_list_get_call_status(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_list_priv_t *priv = NULL; + int call_status = 0; + + VCUI_RETURN_INVALID_IF_FAIL(vd); + priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + + VCUI_RETURN_INVALID_IF_FAIL(priv); + if (priv->call_status == CALL_HOLD) { + call_status = CALL_HOLD; + } else { + call_status = CALL_UNHOLD; + } + + return call_status; +} + +void _vcui_view_multi_call_list_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur) +{ + vcui_view_multi_call_list_priv_t *priv = NULL; + + VCUI_RETURN_IF_FAIL(vd); + priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + + VCUI_RETURN_IF_FAIL(priv); + edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(pcall_dur)); +} + +int _vcui_view_multi_call_list_get_total_members(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_view_multi_call_list_priv_t *priv = NULL; + + VCUI_RETURN_INVALID_IF_FAIL(vd); + priv = (vcui_view_multi_call_list_priv_t *) vd->priv; + + VCUI_RETURN_INVALID_IF_FAIL(priv); + + return priv->total_members; +} + diff --git a/ui/src/vcui-view-multi-call-split.c b/ui/src/vcui-view-multi-call-split.c new file mode 100755 index 0000000..1c57b99 --- /dev/null +++ b/ui/src/vcui-view-multi-call-split.c @@ -0,0 +1,445 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-document.h" +#include "vcui-view-elements.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-keypad.h" + +#define VCUI_VIEW_MULTICALL_SPLIT_LAYOUT_ID "MULTIVIEWSPLIT" +typedef struct { + Evas_Object *contents; + Evas_Object *caller_info_unhold; + Evas_Object *caller_info_hold; + Evas_Object *btn_ly; + + Evas_Object *record_btn; + +} incall_multi_view_split_priv_t; + +static int __vcui_view_multi_call_split_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_multi_call_split_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_multi_call_split_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_split_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_multi_call_split_ondestroy(voice_call_view_data_t *view_data); +static void __vcui_multi_view_split_rotation_with_resize(); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_MULTICALL_SPLIT_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_multi_call_split_oncreate, + .onUpdate = __vcui_view_multi_call_split_onupdate, + .onHide = __vcui_view_multi_call_split_onhide, + .onShow = __vcui_view_multi_call_split_onshow, + .onDestroy = __vcui_view_multi_call_split_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vcui_view_multi_call_split_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incall_multi_view_split_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static void __vcui_view_multi_call_split_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + call_data_t *hold_call_data = NULL; + call_data_t *unhold_call_data = NULL; + char buf[DEF_BUF_LEN] = { 0, }; + + hold_call_data = _vcui_doc_get_call_data_by_call_status(CALL_HOLD); + unhold_call_data = _vcui_doc_get_call_data_by_call_status(CALL_UNHOLD); + + if ((hold_call_data == NULL) || (unhold_call_data == NULL)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return; + } + + char *hold_file_path = _vcui_doc_get_caller_id_file_path(hold_call_data); + char *unhold_file_path = _vcui_doc_get_caller_id_file_path(unhold_call_data); + char *hold_call_number = _vcui_doc_get_call_number(hold_call_data); + char *hold_call_name = _vcui_doc_get_call_display_name(hold_call_data); + char *unhold_call_number = _vcui_doc_get_call_number(unhold_call_data); + char *unhold_call_name = _vcui_doc_get_call_display_name(unhold_call_data); + + if (_vcui_doc_get_unhold_call_data_count() == 1 && _vcui_doc_get_hold_call_data_count() == 1) { + /* in call */ + _vcui_show_contact_image_split(eo, unhold_file_path, EINA_FALSE); + + if (strlen(unhold_call_name) == 0) { + _vcui_show_caller_info_name(vd, unhold_call_number, EINA_FALSE); + _vcui_show_caller_info_number(vd, NULL, EINA_FALSE); + } else { + _vcui_show_caller_info_name(vd, unhold_call_name, EINA_FALSE); + _vcui_show_caller_info_number(vd, unhold_call_number, EINA_FALSE); + } + + /* on hold */ + _vcui_show_contact_image_split(eo, hold_file_path, EINA_TRUE); + if (strlen(hold_call_name) == 0) { + _vcui_show_caller_info_name(vd, hold_call_number, EINA_TRUE); + _vcui_show_caller_info_number(vd, NULL, EINA_TRUE); + } else { + _vcui_show_caller_info_name(vd, hold_call_name, EINA_TRUE); + _vcui_show_caller_info_number(vd, hold_call_number, EINA_TRUE); + } + + } else if (_vcui_doc_get_unhold_call_data_count() == 1 && _vcui_doc_get_hold_call_data_count() > 1) { + /* in call */ + _vcui_show_contact_image_split(eo, unhold_file_path, EINA_FALSE); + + if (strlen(unhold_call_name) == 0) { + _vcui_show_caller_info_name(vd, unhold_call_number, EINA_FALSE); + _vcui_show_caller_info_number(vd, NULL, EINA_FALSE); + } else { + _vcui_show_caller_info_name(vd, unhold_call_name, EINA_FALSE); + _vcui_show_caller_info_number(vd, unhold_call_number, EINA_FALSE); + } + + /* on hold */ + _vcui_show_contact_image_split(eo, CONF_SPLIT_ICON, EINA_TRUE); + _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_TRUE); + snprintf(buf, DEF_BUF_LEN, "%d %s", _vcui_doc_get_hold_call_data_count(), _("IDS_CALL_BODY_PEOPLE")); + _vcui_show_caller_info_number(vd, buf, EINA_TRUE); + + } else if (_vcui_doc_get_unhold_call_data_count() > 1 && _vcui_doc_get_hold_call_data_count() == 1) { + /* in call */ + _vcui_show_contact_image_split(eo, CONF_SPLIT_ICON, EINA_FALSE); + _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_FALSE); + snprintf(buf, DEF_BUF_LEN, "%d %s", _vcui_doc_get_unhold_call_data_count(), _("IDS_CALL_BODY_PEOPLE")); + _vcui_show_caller_info_number(vd, buf, EINA_FALSE); + + /* on hold */ + _vcui_show_contact_image_split(eo, hold_file_path, EINA_TRUE); + if (strlen(hold_call_name) == 0) { + _vcui_show_caller_info_name(vd, hold_call_number, EINA_TRUE); + _vcui_show_caller_info_number(vd, NULL, EINA_TRUE); + } else { + _vcui_show_caller_info_name(vd, hold_call_name, EINA_TRUE); + _vcui_show_caller_info_number(vd, hold_call_number, EINA_TRUE); + } + + /* enter conf list view */ + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[=========== ERROR : Invalid Status!!! ============]"); + return; + } + + _vcui_show_caller_info_status(vd, _("IDS_CALL_BODY_ON_HOLD_ABB"), EINA_TRUE); + + _vcui_show_caller_info_icon(vd, EINA_FALSE); + + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(unhold_call_data)); + + /*create a small button for Hold/Swap*/ + _vcui_create_hold_swap_button(vd); + + if ((_vcui_is_phonelock_status() == EINA_TRUE) && (_vcui_is_idle_lock() == EINA_TRUE)) { + _vcui_create_bottom_second_button_disabled(vd); + } else { + _vcui_create_bottom_second_button(vd); + } + + _vcui_create_top_end_button(vd); + _vcui_create_bottom_third_button(vd); + _vcui_create_bottom_fourth_button(vd); + + { + if ((_vcui_doc_get_unhold_call_data_count() == 5 && _vcui_doc_get_hold_call_data_count() == 1) + || (_vcui_doc_get_unhold_call_data_count() == 1 && _vcui_doc_get_hold_call_data_count() == 5)) { + _vcui_create_bottom_first_button_disabled(vd); + } else { + _vcui_create_bottom_first_button(vd); + } + if (_vcui_view_common_is_emul_bin() == EINA_TRUE) { + _vcui_create_bottom_fifth_button_disabled(vd); + } else { + _vcui_create_bottom_fifth_button(vd); + } + } + + ad->beffect_needed = EINA_FALSE; + + __vcui_multi_view_split_rotation_with_resize(); + + _vcui_elements_check_keypad_n_hide(vd); + + evas_object_show(eo); +} + +static Evas_Object *__vcui_view_multi_call_split_create_contents(void *data, char *group) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->layout, EDJ_NAME, group); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vcui_view_multi_call_split_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + return ly; +} + +static int __vcui_view_multi_call_split_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi-split view create"); + + voice_call_view_data_t *vd = view_data; + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)view_data->priv; + + if (!vd->layout) { + Evas_Object * sep_ly = NULL; + vd->layout = __vcui_view_multi_call_split_create_layout_main(vd->app_data->win_conformant); + if (vd->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + elm_object_content_set(vd->app_data->win_conformant, view_data->layout); + + priv->contents = __vcui_view_multi_call_split_create_contents(view_data, GRP_MULTICALL_SPLIT); + elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents); + + sep_ly = __vcui_view_multi_call_split_create_contents(view_data, GRP_SEPARATOR_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_bg", sep_ly); + + priv->btn_ly = __vcui_view_multi_call_split_create_contents(view_data, GRP_BUTTON_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly); + + priv->caller_info_unhold = __vcui_view_multi_call_split_create_contents(view_data, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info_unhold", priv->caller_info_unhold); + + priv->caller_info_hold = __vcui_view_multi_call_split_create_contents(view_data, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info_hold", priv->caller_info_hold); + + evas_object_name_set(priv->contents, VCUI_VIEW_MULTICALL_SPLIT_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== MULTIVIEWSPLIT: priv->contents Addr : [%p] ==========]", priv->contents); + + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[UI]ad->layout_incall==NULL case "); + evas_object_show(vd->layout); + } + + __vcui_view_multi_call_split_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi-split view update"); + + __vcui_view_multi_call_split_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi-split view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi-split view show"); + + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)view_data->priv; + + __vcui_view_multi_call_split_draw_screen(priv->contents, view_data); + + evas_object_hide(view_data->layout); + evas_object_show(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_multi_call_split_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi-split view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW]; + + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv; + if (priv != NULL) { + if (priv->btn_ly) { + evas_object_del(priv->btn_ly); + priv->btn_ly = NULL; + } + + if (priv->caller_info_hold) { + evas_object_del(priv->caller_info_hold); + priv->caller_info_hold = NULL; + } + + if (priv->caller_info_unhold) { + evas_object_del(priv->caller_info_unhold); + priv->caller_info_unhold = NULL; + } + + /*Delete keypad layout*/ + _vcui_keypad_delete_layout(priv->contents); + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW] = NULL; + + _vcui_cache_flush(); + + return VC_NO_ERROR; +} + +static void __vcui_multi_view_split_rotation_with_resize() +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW]; + incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv; + + elm_win_rotation_with_resize_set(ad->win_main, ad->rotate_angle); + elm_win_rotation_with_resize_set(ad->popup_mw, ad->rotate_angle); + + if (ad->rotate_angle == 0 || ad->rotate_angle == 180) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "portrait mode signal emit"); + edje_object_signal_emit(_EDJ(priv->contents), "set-portrait", "incall-split-view"); + } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "landscape mode not supported"); + } + + evas_object_show(vd->layout); +} + +int _vcui_view_multi_call_split_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + incall_multi_view_split_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (incall_multi_view_split_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_MULTICALL_SPLIT_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vcui_view_multi_call_split_get_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_multi_view_split_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_multi_view_split_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + +Evas_Object *_vcui_view_multi_call_split_get_button_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_multi_view_split_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_multi_view_split_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->btn_ly; +} + +void _vcui_view_multi_call_split_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur) +{ + incall_multi_view_split_priv_t *priv = NULL; + + VCUI_RETURN_IF_FAIL(vd); + priv = (incall_multi_view_split_priv_t *) vd->priv; + + VCUI_RETURN_IF_FAIL(priv); + edje_object_part_text_set(_EDJ(priv->caller_info_unhold), "txt_timer", _(pcall_dur)); +} + +Evas_Object *_vc_ui_view_multi_call_split_get_caller_info_hold(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_multi_view_split_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_multi_view_split_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info_hold; +} + +Evas_Object *_vc_ui_view_multi_call_split_get_caller_info_unhold(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_multi_view_split_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_multi_view_split_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info_unhold; +} + diff --git a/ui/src/vcui-view-popup.c b/ui/src/vcui-view-popup.c new file mode 100755 index 0000000..441fad9 --- /dev/null +++ b/ui/src/vcui-view-popup.c @@ -0,0 +1,1466 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-document.h" +#include "vcui-view-popup.h" +#include "vcui-view-multi-call-split.h" +#include "vcui-view-multi-call-conf.h" +#include "vcui-view-multi-call-list.h" +#include "vcui-view-single-call.h" +#include "vcui-view-common.h" +#define VCONFKEY_BT_HEADSET_NAME "memory/bluetooth/sco_headset_name" + +#define TICKER_TIMEOUT 2 + +#define POPUP_LIST_HD_W 610 +#define POPUP_LIST_ITEM_HD_H 113 + +typedef struct { + Evas_Object *glist; + Evas_Object *btn; + + Elm_Genlist_Item_Class *itc_option_list; + char *text_buffer[3]; +}_second_mtcall_popup_data_t; + +static _second_mtcall_popup_data_t *g_popup_data; + +static void __vcui_view_popup_response_cb_vol_voice(void *data, Evas_Object *obj, void *event_info); +static void __vcui_view_popup_response_cb_vol_ringtone(void *data, Evas_Object *obj, void *event_info); +static void __vcui_view_popup_response_cb_vol_bt(void *data, Evas_Object *obj, void *event_info); + +static void __vcui_view_popup_win_del(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "delete the popup main_win - if created..."); + if (ad->popup_mw != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "main_win is NOT null"); + evas_object_del(ad->popup_mw); + ad->popup_mw = NULL; + } +} + +void _vcui_view_popup_unload(Evas_Object *popup_eo) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (popup_eo) { + evas_object_hide(popup_eo); + evas_object_del(popup_eo); + popup_eo = NULL; + } + + __vcui_view_popup_win_del(ad); + _vcui_cache_flush(); + + return; +} + +static void __vcui_view_popup_response_cb_terminate(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "popup eo delete."); + evas_object_hide(ad->popup_eo); + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + } + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + + _vcui_view_common_call_terminate_or_view_change(); + + return; +} + +static void __vcui_view_popup_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "popup eo delete."); + evas_object_hide(ad->popup_eo); + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + } + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +/* create a separate main window for the popups with a high priority */ +/* this window will always be displayed on top, even on a lock screen */ +static Evas_Object *__vcui_view_popup_create_win(vcui_app_call_data_t *ad, const char *name) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Ecore_X_Window xwin; + Evas_Object *eo; + int w, h; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "create the popup main_win..."); + eo = elm_win_add(NULL, name, ELM_WIN_DIALOG_BASIC); + if (eo) { + elm_win_alpha_set(eo, EINA_TRUE); + elm_win_title_set(eo, name); + elm_win_raise(eo); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + evas_object_resize(eo, w, h); + + /* Set the popup window type as LEVEL-HIGH so it is always displayed on top */ + CALL_UI_DEBUG(VC_LOG_DEBUG, "...Set HIGH priority..."); + xwin = elm_win_xwindow_get(eo); + ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION); + utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_HIGH); + + elm_win_rotation_with_resize_set(eo, ad->rotate_angle); + evas_object_show(eo); + } + + return eo; +} + +void _vcui_view_popup_load(char *popup_msg, double time_out, int bterminate) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg:[%s], bterminate:[%d]", popup_msg, bterminate); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + char *markup_text = NULL; + + if (popup_msg == NULL) { + return; + } + + _vcui_view_popup_unload(ad->popup_eo); + +#ifdef CALL_MW + if (ad->bwin_top) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "parent window TOP"); + ad->popup_eo = elm_popup_add(ad->win_main); + _vcui_show_main_ui_set_flag(); + } else +#endif + { + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_eo = elm_popup_add(ad->popup_mw); + } + + markup_text = evas_textblock_text_utf8_to_markup(NULL, popup_msg); + if (markup_text) { + evas_object_size_hint_weight_set(ad->popup_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(ad->popup_eo, markup_text); + elm_popup_timeout_set(ad->popup_eo, time_out); + if (bterminate == 0) { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb, ad); + } else { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb_terminate, ad); + } + + elm_object_style_set(ad->popup_eo, "transparent"); + evas_object_show(ad->popup_eo); + free(markup_text); + markup_text = NULL; + } else { + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + __vcui_view_popup_win_del(ad); + return; + } +} + +void _vcui_view_popup_replace(char *popup_msg, double time_out, int bterminate) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg:[%s], bterminate:[%d]", popup_msg, bterminate); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + char *markup_text = NULL; + + if (ad->popup_eo == NULL) { + _vcui_view_popup_load(popup_msg, time_out, bterminate); + } else { + if (popup_msg == NULL) { + return; + } + + if (ad->view_top != -1) { +#ifdef CALL_MW + _vcui_raise_main_win(); +#else + if (ad->popup_mw != NULL) + elm_win_activate(ad->popup_mw); +#endif + } + + markup_text = evas_textblock_text_utf8_to_markup(NULL, popup_msg); + if (markup_text) { + elm_object_text_set(ad->popup_eo, markup_text); + elm_popup_timeout_set(ad->popup_eo, time_out); + if (bterminate == 0) { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb, ad); + } else { + evas_object_smart_callback_add(ad->popup_eo, "timeout", __vcui_view_popup_response_cb_terminate, ad); + } + evas_object_show(ad->popup_eo); + free(markup_text); + markup_text = NULL; + } else { + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + __vcui_view_popup_win_del(ad); + return; + } + } +} + +void _vcui_view_popup_load_reject_call(char *name, char *number, int end_app) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + char msg[DEF_BUF_LEN_LONG] = { 0, }; + + if (strlen(name) == 0) { + snprintf(msg, sizeof(msg), "%s\n%s", number, _("IDS_CALL_POP_REJECTED")); + } else if (strlen(number) == 0) { + snprintf(msg, sizeof(msg), "%s\n%s", name, _("IDS_CALL_POP_REJECTED")); + } else { + snprintf(msg, sizeof(msg), "%s\n%s\n%s", name, number, _("IDS_CALL_POP_REJECTED")); + } + + _vcui_view_popup_load(msg, POPUP_TIMEOUT_LONG, end_app); + +} + +void _vcui_view_popup_load_endcall_time(call_data_t *cd) +{ + unsigned long sec = 0; + unsigned long min = 0; + unsigned long hr = 0; + unsigned long call_duration_in_sec = _vcui_get_diff_now(_vcui_doc_get_call_start_time(cd)); + char buf[DEF_BUF_LEN] = { 0, }; + char msg[DEF_BUF_LEN_LONG] = { 0, }; + + sec = call_duration_in_sec % 60; + min = (call_duration_in_sec / 60) % 60; + hr = call_duration_in_sec / 3600; + snprintf(buf, sizeof(buf), "%c%c:%c%c:%c%c", (int)((hr / 10) + '0'), (int)((hr % 10) + '0'), (int)((min / 10) + '0'), (int)((min % 10) + '0'), (int)((sec / 10) + '0'), (int)((sec % 10) + '0')); + + snprintf(msg, sizeof(msg), "%s\n%s\n%s", _vcui_doc_get_call_display_name(cd), _vcui_doc_get_call_number(cd), buf); + + _vcui_view_popup_load(msg, POPUP_TIMEOUT_SHORT, EINA_FALSE); +} + +void _vcui_view_popup_load_redial(void) +{ + _vcui_view_popup_load(_("IDS_CALL_POP_REDIALLING"), POPUP_TIMEOUT_NORMAL, EINA_FALSE); +} + +static Eina_Bool __vcui_view_popup_timer_cb_vol_ringtone(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + __vcui_view_popup_response_cb_vol_ringtone(ad, ad->vol_ringtone_popup_eo, NULL); + + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_popup_vol_update_icon(int volume_level) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "..."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *icon = NULL; + + icon = edje_object_part_swallow_get(_EDJ(ad->popup_vol_ly), "volume_icon"); + if (icon) { + edje_object_part_unswallow(_EDJ(ad->popup_vol_ly), icon); + evas_object_del(icon); + } + + icon = elm_image_add(ad->popup_vol_ly); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_image_resizable_set(icon, 0, 0); + elm_object_part_content_set(ad->popup_vol_ly, "volume_icon", icon); + if (volume_level == 0) + elm_image_file_set(icon, VOLUME_MUTE_ICON, NULL); + else + elm_image_file_set(icon, VOLUME_ICON, NULL); +} + +static void __vcui_view_popup_vol_ringtone_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + double value; + + value = elm_slider_value_get(obj); + if (value > RINGTONE_MAX) + value = RINGTONE_MAX; + else if (value < RINGTONE_MIN) + value = RINGTONE_MIN; + + ad->ringtone_val = (int)value; + + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_RINGTONE, ad->ringtone_val); + + elm_slider_value_set(obj, ad->ringtone_val); + if (ad->vol_ringtone_popup_del_timer) { + ecore_timer_del(ad->vol_ringtone_popup_del_timer); + ad->vol_ringtone_popup_del_timer = NULL; + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, "ad->ringtone_val %d...", ad->ringtone_val); + __vcui_view_popup_vol_update_icon(ad->ringtone_val); + ad->vol_ringtone_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_ringtone, ad); +} + +static void __vcui_view_popup_response_cb_vol_ringtone(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->vol_ringtone_popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "vol_ringtone_popup_eo delete."); + evas_object_del(ad->vol_ringtone_popup_eo); + ad->vol_ringtone_popup_eo = NULL; + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + if (ad->vol_ringtone_popup_del_timer) { + ecore_timer_del(ad->vol_ringtone_popup_del_timer); + ad->vol_ringtone_popup_del_timer = NULL; + } + + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +void _vcui_view_popup_vol_ringtone(int vol_level) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "vol_level(%d)", vol_level); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup = NULL; + Evas_Object *slider = NULL; + + if (ad->vol_ringtone_popup_eo) { + __vcui_view_popup_vol_update_icon(vol_level); + elm_slider_value_set(ad->vol_ringtone_slider_eo, vol_level); + if (ad->vol_ringtone_popup_del_timer) { + ecore_timer_del(ad->vol_ringtone_popup_del_timer); + ad->vol_ringtone_popup_del_timer = NULL; + } + ad->vol_ringtone_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_ringtone, ad); + } else { +#ifdef CALL_MW + popup = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->vol_ringtone_popup_eo = popup = elm_popup_add(ad->popup_mw); +#endif + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", dgettext("sys_string", "IDS_COM_BODY_RINGTONE")); + + ad->popup_vol_ly = _vcui_load_edj(popup, EDJ_NAME, "volume"); + if (ad->popup_vol_ly == NULL) { + if (ad->vol_ringtone_popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "vol_ringtone_popup_eo delete."); + evas_object_del(ad->vol_ringtone_popup_eo); + ad->vol_ringtone_popup_eo = NULL; + } + __vcui_view_popup_win_del(ad); + return; + } + elm_object_content_set(popup, ad->popup_vol_ly); + __vcui_view_popup_vol_update_icon(vol_level); + + slider = elm_slider_add(popup); + elm_slider_horizontal_set(slider, EINA_TRUE); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%.0f"); + elm_object_part_content_set(ad->popup_vol_ly, "volume_slider", slider); + elm_slider_min_max_set(slider, 0, 15); + elm_slider_value_set(slider, vol_level); + evas_object_smart_callback_add(slider, "changed", __vcui_view_popup_vol_ringtone_changed_cb, ad); + ad->vol_ringtone_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_ringtone, ad); + evas_object_smart_callback_add(popup, "block,clicked", __vcui_view_popup_response_cb_vol_ringtone, ad); + + ad->vol_ringtone_slider_eo = slider; + elm_object_style_set(popup, "transparent"); + evas_object_show(popup); + } + +} + +static Eina_Bool __vcui_view_popup_timer_cb_vol_voice(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + __vcui_view_popup_response_cb_vol_voice(ad, ad->vol_voice_popup_eo, NULL); + + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_popup_vol_voice_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + double value; + + value = elm_slider_value_get(obj); + if (value > VOICE_VOL_MAX) + value = VOICE_VOL_MAX; + else if (value < VOICE_VOL_MIN) + value = VOICE_VOL_MIN; + ad->voice_vol_val = (int)value; + + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_VOICE, ad->voice_vol_val); + + elm_slider_value_set(obj, ad->voice_vol_val); + if (ad->vol_voice_popup_del_timer) { + ecore_timer_del(ad->vol_voice_popup_del_timer); + ad->vol_voice_popup_del_timer = NULL; + } + ad->vol_voice_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_voice, ad); +} + +static void __vcui_view_popup_response_cb_vol_voice(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->vol_voice_popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "vol_voice_popup_eo delete."); + evas_object_del(ad->vol_voice_popup_eo); + ad->vol_voice_popup_eo = NULL; + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + if (ad->vol_voice_popup_del_timer) { + ecore_timer_del(ad->vol_voice_popup_del_timer); + ad->vol_voice_popup_del_timer = NULL; + } + + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +void _vcui_view_popup_vol_voice(int vol_level) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup = NULL; + Evas_Object *slider = NULL; + + if (ad->vol_voice_popup_eo) { + elm_slider_value_set(ad->vol_voice_slider_eo, vol_level); + if (ad->vol_voice_popup_del_timer) { + ecore_timer_del(ad->vol_voice_popup_del_timer); + ad->vol_voice_popup_del_timer = NULL; + } + ad->vol_voice_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_voice, ad); + } else { +#ifdef CALL_MW + popup = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + popup = elm_popup_add(ad->popup_mw); +#endif + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", _("IDS_CALL_BODY_CALL")); + + ad->popup_vol_ly = _vcui_load_edj(popup, EDJ_NAME, "volume"); + if (ad->popup_vol_ly == NULL) { + if (popup) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "popup delete."); + evas_object_del(popup); + popup = NULL; + } + __vcui_view_popup_win_del(ad); + return; + } + elm_object_content_set(popup, ad->popup_vol_ly); + __vcui_view_popup_vol_update_icon(vol_level); + + slider = elm_slider_add(ad->popup_vol_ly); + elm_slider_horizontal_set(slider, EINA_TRUE); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%.0f"); + elm_object_part_content_set(ad->popup_vol_ly, "volume_slider", slider); + elm_slider_min_max_set(slider, 0, 7); + elm_slider_value_set(slider, vol_level); + evas_object_smart_callback_add(slider, "changed", __vcui_view_popup_vol_voice_changed_cb, ad); + ad->vol_voice_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_voice, ad); + evas_object_smart_callback_add(popup, "block,clicked", __vcui_view_popup_response_cb_vol_voice, ad); + + ad->vol_voice_slider_eo = slider; + ad->vol_voice_popup_eo = popup; + elm_object_style_set(popup, "transparent"); + evas_object_show(popup); + } +} + +static Eina_Bool __vcui_view_popup_timer_cb_vol_bt(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + __vcui_view_popup_response_cb_vol_bt(ad, ad->vol_bt_popup_eo, NULL); + + return ECORE_CALLBACK_CANCEL; +} + +static void __vcui_view_popup_vol_bt_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + double value; + + value = elm_slider_value_get(obj); + if (value > BT_VOL_MAX) + value = BT_VOL_MAX; + else if (value < BT_VOL_MIN) + value = BT_VOL_MIN; + + ad->bt_vol_val = (int)value; + + vcall_engine_set_volume_level(VCALL_ENGINE_VOL_TYPE_HEADSET, ad->bt_vol_val); + + elm_slider_value_set(obj, ad->bt_vol_val); + if (ad->vol_bt_popup_del_timer) { + ecore_timer_del(ad->vol_bt_popup_del_timer); + ad->vol_bt_popup_del_timer = NULL; + } + ad->vol_bt_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_bt, ad); +} + +static void __vcui_view_popup_response_cb_vol_bt(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->vol_bt_popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "vol_bt_popup_eo delete."); + evas_object_del(ad->vol_bt_popup_eo); + ad->vol_bt_popup_eo = NULL; + __vcui_view_popup_win_del(ad); + } + + ad->vol_longpress_cnt = 0; + + if (ad->volup_key_longpress_timer) { + ecore_timer_del(ad->volup_key_longpress_timer); + ad->volup_key_longpress_timer = NULL; + } + + if (ad->voldown_key_longpress_timer) { + ecore_timer_del(ad->voldown_key_longpress_timer); + ad->voldown_key_longpress_timer = NULL; + } + + if (ad->vol_bt_popup_del_timer) { + ecore_timer_del(ad->vol_bt_popup_del_timer); + ad->vol_bt_popup_del_timer = NULL; + } + + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +void _vcui_view_popup_vol_bt(int vol_level) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup = NULL; + Evas_Object *slider = NULL; + + if (ad->vol_bt_popup_eo) { + elm_slider_value_set(ad->vol_bt_slider_eo, vol_level); + if (ad->vol_bt_popup_del_timer) { + ecore_timer_del(ad->vol_bt_popup_del_timer); + ad->vol_bt_popup_del_timer = NULL; + } + ad->vol_bt_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_bt, ad); + } else { +#ifdef CALL_MW + popup = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + popup = elm_popup_add(ad->popup_mw); +#endif + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", _("IDS_CALL_BUTTON_HEADSET")); + + ad->popup_vol_ly = _vcui_load_edj(popup, EDJ_NAME, "volume"); + if (ad->popup_vol_ly == NULL) { + if (popup) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "popup delete."); + evas_object_del(popup); + popup = NULL; + } + __vcui_view_popup_win_del(ad); + return; + } + elm_object_content_set(popup, ad->popup_vol_ly); + __vcui_view_popup_vol_update_icon(vol_level); + + slider = elm_slider_add(popup); + elm_slider_horizontal_set(slider, EINA_TRUE); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%.0f"); + elm_object_part_content_set(ad->popup_vol_ly, "volume_slider", slider); + elm_slider_min_max_set(slider, 0, 15); + elm_slider_value_set(slider, vol_level); + evas_object_smart_callback_add(slider, "changed", __vcui_view_popup_vol_bt_changed_cb, ad); + ad->vol_bt_popup_del_timer = ecore_timer_add(POPUP_TIMEOUT_SHORT, __vcui_view_popup_timer_cb_vol_bt, ad); + evas_object_smart_callback_add(popup, "block,clicked", __vcui_view_popup_response_cb_vol_bt, ad); + + ad->vol_bt_slider_eo = slider; + ad->vol_bt_popup_eo = popup; + elm_object_style_set(popup, "transparent"); + evas_object_show(popup); + } + +} + +static Eina_Bool __vcui_view_popup_response_cb_delay(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + _vcui_view_popup_load((char *)data, POPUP_TIMEOUT_SHORT, EINA_FALSE); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + ecore_timer_del(ad->popup_delay); + ad->popup_delay = NULL; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "delay popup work"); + return EINA_FALSE; +} + +void _vcui_view_popup_load_with_delay(char *popup_msg, double delay_time) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + ad->popup_delay = ecore_timer_add(delay_time, __vcui_view_popup_response_cb_delay, popup_msg); + CALL_UI_DEBUG(VC_LOG_DEBUG, "delay popup"); +} + +void _vcui_view_popup_unload_progress(vcui_app_call_data_t *ad) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + if (ad->popup_progress_eo) { + evas_object_hide(ad->popup_progress_eo); + evas_object_del(ad->popup_progress_eo); + ad->popup_progress_eo = NULL; + } + __vcui_view_popup_win_del(ad); + + _vcui_cache_flush(); + + return; +} + +static void __vcui_view_popup_progressbar_set_label(char *status_string) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *label; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "popup_progress_set_label ..."); + + label = (Evas_Object *)evas_object_data_get(ad->popup_progress_eo, "progress_label"); + elm_object_text_set(label, status_string); +} + +static void __vcui_view_popup_progressbar_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "__vcui_view_popup_progressbar_response_cb callback=%d", (int)event_info); + + if (ad->popup_progress_eo) { + evas_object_del(ad->popup_progress_eo); + ad->popup_progress_eo = NULL; + } + + evas_object_del(obj); + __vcui_view_popup_win_del(ad); +} + +void _vcui_view_popup_load_progress(char *display_string) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *progressbar_eo; + Evas_Object *box, *label; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + if (NULL != ad->popup_progress_eo) { + __vcui_view_popup_progressbar_set_label(display_string); + return; + } +#ifdef CALL_MW + ad->popup_progress_eo = elm_popup_add(ad->win_main); +#else + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_progress_eo = elm_popup_add(ad->popup_mw); +#endif + + label = elm_label_add(ad->popup_progress_eo); + elm_object_text_set(label, display_string); + evas_object_show(label); + box = elm_box_add(ad->popup_progress_eo); + progressbar_eo = elm_progressbar_add(ad->popup_progress_eo); + elm_object_style_set(progressbar_eo, "list_progress"); + elm_progressbar_pulse(progressbar_eo, EINA_TRUE); + evas_object_size_hint_align_set(progressbar_eo, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(progressbar_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(progressbar_eo, EINA_TRUE); + evas_object_show(progressbar_eo); + elm_box_pack_end(box, label); + elm_box_pack_end(box, progressbar_eo); + evas_object_show(box); + elm_object_content_set(ad->popup_progress_eo, box); + evas_object_smart_callback_add(ad->popup_progress_eo, "timeout", __vcui_view_popup_progressbar_response_cb, NULL); + elm_object_style_set(ad->popup_progress_eo, "transparent"); + evas_object_show(ad->popup_progress_eo); + + evas_object_data_set(ad->popup_progress_eo, "progress_label", (void *)label); +} + +void _vcui_view_popup_load_sending_dtmf(char *status_string, char *dtmf_num) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + char msg[DEF_BUF_LEN_LONG] = { 0, }; + + snprintf(msg, DEF_BUF_LEN_LONG, "%s\n%s", status_string, dtmf_num); + + _vcui_view_popup_load_progress(msg); +} + +static void __vcui_view_popup_snd_path_bt_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_HEADSET); + + vcall_engine_change_sound_path(VCALL_ENGINE_AUDIO_HEADSET); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_TRUE; +} + +static void __vcui_view_popup_snd_path_earjack_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_RECEIVER_EARJACK); + + vcall_engine_change_sound_path(VCALL_ENGINE_AUDIO_RECEIVER_EARJACK); + + ad->speaker_status = EINA_FALSE; + ad->headset_status = EINA_FALSE; +} + +static void __vcui_view_popup_snd_path_speaker_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + elm_radio_value_set(ad->ctxpopup_radio_group_eo, VCUI_SND_PATH_SPEAKER); + + vcall_engine_change_sound_path(VCALL_ENGINE_AUDIO_SPEAKER); + + ad->speaker_status = EINA_TRUE; + ad->headset_status = EINA_FALSE; +} + +static void __vcui_view_popup_hide_snd_path_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } +} + +static void __vcui_view_popup_move_snd_path(Evas_Object *ctxpopup, Evas_Object *layout, Evas_Coord touch_x, Evas_Coord touch_y) +{ + evas_object_move(ctxpopup, touch_x, touch_y); +} + +void _vcui_view_popup_load_snd_path(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + int bearjack_status = EINA_FALSE; + + Evas_Object *ctxpopup = NULL; + Evas_Object *radio = NULL; + Evas_Object *group = NULL; + + int status = -1; + char *bt_name = NULL; + int snd_path; + + /* get bt name */ + bt_name = vconf_get_str(VCONFKEY_BT_HEADSET_NAME); + if (!bt_name) { + bt_name = _("IDS_CALL_BUTTON_HEADSET"); + } + + /* check earjack status */ + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &status)) { + if (status != VCONFKEY_SYSMAN_EARJACK_REMOVED) { + bearjack_status = EINA_TRUE; + } + } + + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } + + ctxpopup = elm_ctxpopup_add(vd->layout); + + evas_object_smart_callback_add(ctxpopup, "dismissed", __vcui_view_popup_hide_snd_path_cb, ad); + + __vcui_view_popup_move_snd_path(ctxpopup, vd->layout, ad->touch_x, ad->touch_y); + + /* bt headset */ + group = radio = elm_radio_add(ctxpopup); + elm_radio_state_value_set(radio, VCUI_SND_PATH_HEADSET); + evas_object_data_set(radio, "idx", (void *)(VCUI_SND_PATH_HEADSET)); + evas_object_show(radio); + elm_ctxpopup_item_append(ctxpopup, bt_name, radio, __vcui_view_popup_snd_path_bt_cb, ad); + + /* earjack or receiver */ + radio = elm_radio_add(ctxpopup); + elm_radio_state_value_set(radio, VCUI_SND_PATH_RECEIVER_EARJACK); + elm_radio_group_add(radio, group); + evas_object_data_set(radio, "idx", (void *)(VCUI_SND_PATH_RECEIVER_EARJACK)); + evas_object_show(radio); + if (bearjack_status) { + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_BUTTON_HEADPHONES"), radio, __vcui_view_popup_snd_path_earjack_cb, ad); + } else { + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_BUTTON_RECEIVER"), radio, __vcui_view_popup_snd_path_earjack_cb, ad); + } + + /* speaker */ + radio = elm_radio_add(ctxpopup); + elm_radio_state_value_set(radio, VCUI_SND_PATH_SPEAKER); + elm_radio_group_add(radio, group); + evas_object_data_set(radio, "idx", (void *)(VCUI_SND_PATH_SPEAKER)); + evas_object_show(radio); + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_BUTTON_SPEAKER"), radio, __vcui_view_popup_snd_path_speaker_cb, ad); + /* current sound path set */ + vcall_engine_get_sound_path(&snd_path); + switch (snd_path) { + case VCALL_ENGINE_AUDIO_SPEAKER: + { + elm_radio_value_set(group, VCUI_SND_PATH_SPEAKER); + } + break; + case VCALL_ENGINE_AUDIO_HEADSET: + { + elm_radio_value_set(group, VCUI_SND_PATH_HEADSET); + } + break; + case VCALL_ENGINE_AUDIO_RECEIVER_EARJACK: + { + elm_radio_value_set(group, VCUI_SND_PATH_RECEIVER_EARJACK); + } + break; + default: + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR - wrong type:[%d]", snd_path); + return; + break; + } + + evas_object_show(ctxpopup); + + ad->ctxpopup_eo = ctxpopup; + ad->ctxpopup_radio_group_eo = group; +} + +#if 0 +static Eina_Bool __vcui_view_ticker_response_cb(void *data) +{ + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + if (ad->ticker_tm) { + ecore_timer_del(ad->ticker_tm); + ad->ticker_tm = NULL; + } + + /* to be implemented */ + + return ECORE_CALLBACK_CANCEL; +} + +void _vcui_view_create_ticker_noti(char *ticker_msg) +{ + Evas_Object *ticker_noti = NULL; + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "load_ticker_noti_at_bottom enter"); + + ticker_noti = elm_tickernoti_add(NULL); + elm_object_style_set(ticker_noti, "info"); + elm_object_text_set(ticker_noti, ticker_msg); + elm_tickernoti_orient_set(ticker_noti, ELM_TICKERNOTI_ORIENT_BOTTOM); + elm_tickernoti_rotation_set(ticker_noti, ad->rotate_angle); + if (ad->ticker_tm) { + ecore_timer_del(ad->ticker_tm); + ad->ticker_tm = NULL; + } + ad->ticker_tm = ecore_timer_add(TICKER_TIMEOUT, __vcui_view_ticker_response_cb, ad); + evas_object_show(ticker_noti); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "load_ticker_noti_at_bottom over"); +} +#endif + +static Eina_Bool __vcui_view_send_dtmf_idler_cb(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + gboolean bok = (gboolean)data; + + if (bok == TRUE) { + vcall_engine_send_dtmf(bok); + } else { + vcall_engine_cancel_dtmf(); + } + + return EINA_FALSE; +} + +static void __vcui_view_dtmf_popup_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + gboolean bok = TRUE; + + if (strncmp(elm_object_text_get(obj), "Send", 4) == 0) { + bok = TRUE; + } else if (strncmp(elm_object_text_get(obj), "Cancel", 6) == 0) { + bok = FALSE; + } + + ecore_idler_add((Ecore_Task_Cb) __vcui_view_send_dtmf_idler_cb, (void *)bok); + if (ad->popup_eo) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "popup eo delete."); + evas_object_hide(ad->popup_eo); + evas_object_del(ad->popup_eo); + ad->popup_eo = NULL; + } + _vcui_cache_flush(); + __vcui_view_popup_win_del(ad); + return; +} + +void _vcui_view_load_send_dtmf_popup_with_buttons(char *status_string, char *dtmf_num) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + char popup_msg[DEF_BUF_LEN_LONG] = { 0, }; + Evas_Object *btn1 = NULL; + Evas_Object *btn2 = NULL; + + snprintf(popup_msg, DEF_BUF_LEN_LONG, "%s\n%s", status_string, dtmf_num); + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg:[%s]", popup_msg); + + _vcui_view_popup_unload_progress(ad); + _vcui_view_popup_unload(ad->popup_eo); + + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_eo = elm_popup_add(ad->popup_mw); + evas_object_size_hint_weight_set(ad->popup_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(ad->popup_eo, popup_msg); + btn1 = elm_button_add(ad->popup_eo); + elm_object_text_set(btn1, "Send"); + elm_object_part_content_set(ad->popup_eo, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", __vcui_view_dtmf_popup_response_cb, ad); + btn2 = elm_button_add(ad->popup_eo); + elm_object_text_set(btn2, "Cancel"); + elm_object_part_content_set(ad->popup_eo, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", __vcui_view_dtmf_popup_response_cb, ad); + elm_object_style_set(ad->popup_eo, "transparent"); + evas_object_show(ad->popup_eo); +} + +void _vcui_view_popup_second_mtcall_unload(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + _second_mtcall_popup_data_t *p_popup_data = (_second_mtcall_popup_data_t *) data; + int iter = 0; + + if (p_popup_data != NULL) { + + while (iter < 3) { + if (p_popup_data->text_buffer[iter] != NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Free the string %d buffer", iter); + free(p_popup_data->text_buffer[iter]); + p_popup_data->text_buffer[iter] = NULL; + } + iter++; + } + + if (p_popup_data->itc_option_list != NULL) { + elm_genlist_item_class_free(p_popup_data->itc_option_list); + p_popup_data->itc_option_list = NULL; + } + + free(p_popup_data); + p_popup_data = NULL; + + _vcui_view_set_second_mtcall_popup_data(NULL); + } + + _vcui_view_popup_unload(ad->popup_eo); +} + +static char *__second_mtcall_option_list_gl_label_get_option(void *data, Evas_Object *obj, const char *part) +{ + VCUI_RETURN_NULL_IF_FAIL(part != NULL); + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + _second_mtcall_popup_data_t *p_popup_data = (_second_mtcall_popup_data_t *) _vcui_view_get_second_mtcall_popup_data(); + char *list_text = NULL; + + list_text = p_popup_data->text_buffer[(int) data]; + CALL_UI_DEBUG(VC_LOG_DEBUG, "list_text: %s", list_text); + + if (strcmp(part, "elm.text") == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + if (list_text != NULL) { + return strdup(list_text); + } else { + return NULL; + } + } + + return NULL; +} + +static void __second_mtcall_option_list_gl_sel_option(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + int index = -1; + int unhold_call_count = 0; + int hold_call_count = 0; + + if (item != NULL) { + + index = (int) elm_object_item_data_get(item); + CALL_UI_DEBUG(VC_LOG_DEBUG, "index: %d", index); + + unhold_call_count = _vcui_doc_get_unhold_call_data_count(); + hold_call_count = _vcui_doc_get_hold_call_data_count(); + + if ((unhold_call_count >= 1) && (hold_call_count == 0)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active call OR 1 active conference call"); + if (index == 0) { + vcall_engine_answer_call_by_type(VCALL_ENGINE_ANSWER_HOLD_ACTIVE_AND_ACCEPT); + } else if (index == 1) { + vcall_engine_answer_call_by_type(VCALL_ENGINE_ANSWER_RELEASE_ACTIVE_AND_ACCEPT); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Wrong index.. Should never get here"); + } + } else if ((unhold_call_count == 1 && hold_call_count == 1) || (unhold_call_count > 1 && hold_call_count == 1) || \ + (unhold_call_count == 1 && hold_call_count > 1)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active call + 1 held call OR 1 active conf call + 1 held call OR 1 active call + 1 held conf call"); + if (index == 0) { + vcall_engine_answer_call_by_type(VCALL_ENGINE_ANSWER_RELEASE_ACTIVE_AND_ACCEPT); + } else if (index == 1) { + vcall_engine_answer_call_by_type(VCALL_ENGINE_ANSWER_RELEASE_HOLD_AND_ACCEPT); + } else if (index == 2) { + vcall_engine_answer_call_by_type(VCALL_ENGINE_ANSWER_RELEASE_ALL_AND_ACCEPT); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Wrong index.. Should never get here"); + } + } + } +} + +static void __second_mtcall_cancel_btn_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + _vcui_view_popup_second_mtcall_unload(data); + + _vcui_view_change(VIEW_INCOMING_LOCK_VIEW, -1, NULL, NULL); + + return; +} + +void _vcui_view_popup_second_mtcall_load(char *title_text, int unhold_call_count, int hold_call_count) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + _second_mtcall_popup_data_t *popup_data = NULL; + Evas_Object *box = NULL; + + call_data_t *hold_call_data = NULL; + call_data_t *unhold_call_data = NULL; + char *hold_call_number = NULL; + char *hold_call_name = NULL; + char *unhold_call_number = NULL; + char *unhold_call_name = NULL; + char *temp_str = NULL; + + int iter = 0; + + hold_call_data = _vcui_doc_get_call_data_by_call_status(CALL_HOLD); + unhold_call_data = _vcui_doc_get_call_data_by_call_status(CALL_UNHOLD); + + if (unhold_call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return; + } + + _vcui_view_popup_second_mtcall_unload(NULL); + + ad->popup_eo = elm_popup_add(ad->win_main); + evas_object_size_hint_weight_set(ad->popup_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_style_set(ad->popup_eo, "min_menustyle_transparent"); + elm_object_part_text_set(ad->popup_eo, "title,text", title_text); + + popup_data = (_second_mtcall_popup_data_t *) calloc(1, sizeof(_second_mtcall_popup_data_t)); + if (popup_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "memory allocation failed for popup data.. return"); + return; + } + _vcui_view_set_second_mtcall_popup_data(popup_data); + + popup_data->itc_option_list = elm_genlist_item_class_new(); + + popup_data->itc_option_list->item_style = "1text"; + popup_data->itc_option_list->func.text_get = __second_mtcall_option_list_gl_label_get_option; + popup_data->itc_option_list->func.content_get = NULL; + popup_data->itc_option_list->func.state_get = NULL; + popup_data->itc_option_list->func.del = NULL; + + box = elm_box_add(ad->popup_eo); + + popup_data->glist = elm_genlist_add(box); + evas_object_size_hint_weight_set(popup_data->glist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup_data->glist, EVAS_HINT_FILL, EVAS_HINT_FILL); + + for (iter = 0; iter < 3; iter++) { + popup_data->text_buffer[iter] = (char *) calloc(1, DEF_BUF_LEN); + memset(popup_data->text_buffer[iter], 0x00, DEF_BUF_LEN); + } + + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + if (hold_call_data != NULL) { + hold_call_number = _vcui_doc_get_call_number(hold_call_data); + hold_call_name = _vcui_doc_get_call_display_name(hold_call_data); + if (strlen(hold_call_name) == 0) + hold_call_name = hold_call_number; + } + + if (unhold_call_data != NULL) { + unhold_call_number = _vcui_doc_get_call_number(unhold_call_data); + unhold_call_name = _vcui_doc_get_call_display_name(unhold_call_data); + if (strlen(unhold_call_name) == 0) + unhold_call_name = unhold_call_number; + } + + if ((unhold_call_count == 1) && (hold_call_count == 0)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active call"); + + iter = 0; + temp_str = _("IDS_CALL_BODY_PUTTING_PS_ON_HOLD"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, unhold_call_name); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + temp_str = _("IDS_CALL_BODY_ENDING_CALL_WITH_PS"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, unhold_call_name); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + } else if ((unhold_call_count > 1) && (hold_call_count == 0)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active conference call"); + + iter = 0; + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, "%s (%d)", _("IDS_CALL_BODY_HOLD_ACTIVE_CALL_ABB"), unhold_call_count); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + temp_str = _("IDS_CALL_BODY_END_ACTIVE_CALLS_HPD"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, unhold_call_count); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + } else if ((unhold_call_count == 1) && (hold_call_count == 1)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active call + 1 held call"); + + iter = 0; + temp_str = _("IDS_CALL_BODY_ENDING_CALL_WITH_PS"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, unhold_call_name); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + temp_str = _("IDS_CALL_BODY_ENDING_CALL_WITH_PS"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, hold_call_name); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + strncpy(popup_data->text_buffer[iter], _("IDS_CALL_OPT_END_ALL_CALLS"), DEF_BUF_LEN - 1); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + } else if ((unhold_call_count > 1) && (hold_call_count == 1)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active conf call + 1 held call"); + + iter = 0; + temp_str = _("IDS_CALL_BODY_END_ACTIVE_CALLS_HPD"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, unhold_call_count); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + temp_str = _("IDS_CALL_BODY_ENDING_CALL_WITH_PS"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, hold_call_name); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + strncpy(popup_data->text_buffer[iter], _("IDS_CALL_OPT_END_ALL_CALLS"), DEF_BUF_LEN - 1); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + } else if ((unhold_call_count == 1) && (hold_call_count > 1)) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "1 active call + 1 held conf call"); + + iter = 0; + temp_str = _("IDS_CALL_BODY_ENDING_CALL_WITH_PS"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, unhold_call_name); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + temp_str = _("IDS_CALL_BODY_END_HELD_CALLS_HPD"); + snprintf(popup_data->text_buffer[iter], DEF_BUF_LEN, temp_str, hold_call_count); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + + iter++; + strncpy(popup_data->text_buffer[iter], _("IDS_CALL_OPT_END_ALL_CALLS"), DEF_BUF_LEN - 1); + elm_genlist_item_append(popup_data->glist, popup_data->itc_option_list, (void *)iter, NULL, ELM_GENLIST_ITEM_NONE, __second_mtcall_option_list_gl_sel_option, popup_data); + } + + popup_data->btn = elm_button_add(ad->popup_eo); + elm_object_text_set(popup_data->btn, dgettext("sys_string", "IDS_COM_POP_CANCEL")); + elm_object_part_content_set(ad->popup_eo, "button1", popup_data->btn); + evas_object_smart_callback_add(popup_data->btn, "clicked", __second_mtcall_cancel_btn_response_cb, popup_data); + + evas_object_size_hint_min_set(box, POPUP_LIST_HD_W * ad->scale_factor, ((POPUP_LIST_ITEM_HD_H * (iter + 1))) * ad->scale_factor); + evas_object_show(popup_data->glist); + elm_box_pack_end(box, popup_data->glist); + elm_object_content_set(ad->popup_eo, box); + evas_object_show(ad->popup_eo); + +} + +void _vcui_view_set_second_mtcall_popup_data(void *p_popup_data) +{ + g_popup_data = (_second_mtcall_popup_data_t *) p_popup_data; +} + +void *_vcui_view_get_second_mtcall_popup_data(void) +{ + return ((void *) g_popup_data); +} + +static void __vcui_view_popup_hide_more_option(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } +} + +static void __vcui_view_popup_move_more_option(Evas_Object *ctxpopup, Evas_Object *layout, Evas_Coord touch_x, Evas_Coord touch_y) +{ + evas_object_move(ctxpopup, touch_x, touch_y); +} + +static void __vcui_view_popup_manage_conf_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = (vcui_app_call_data_t *)data; + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } + + _vcui_view_change(VIEW_INCALL_MULTICALL_LIST_VIEW, 0, 0, 0); +} + +void _vcui_view_popup_load_more_option(void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + + Evas_Object *ctxpopup = NULL; + int hold_calls = _vcui_doc_get_hold_call_data_count(); + int active_calls = _vcui_doc_get_unhold_call_data_count(); + Evas_Object* icon = NULL; + + if (ad->ctxpopup_eo) { + evas_object_del(ad->ctxpopup_eo); + ad->ctxpopup_eo = NULL; + } + + ctxpopup = elm_ctxpopup_add(vd->layout); + elm_object_style_set(ctxpopup, "more_ctxpopup"); + + evas_object_smart_callback_add(ctxpopup, "dismissed", __vcui_view_popup_hide_more_option, ad); + + if ((active_calls > 1) + || ((active_calls == 0) && (hold_calls > 1))) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Manage conference (active:%d, hold:%d)", active_calls, hold_calls); + icon = elm_image_add(ctxpopup); + elm_image_file_set(icon, MORE_MANAGE_CONF_ICON, NULL); + elm_ctxpopup_item_append(ctxpopup, _("IDS_CALL_HEADER_MANAGE_CONFERENCE_CALL"), icon, __vcui_view_popup_manage_conf_cb, ad); + } + + elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_LEFT, + ELM_CTXPOPUP_DIRECTION_RIGHT, ELM_CTXPOPUP_DIRECTION_UP); + __vcui_view_popup_move_more_option(ctxpopup, vd->layout, MORE_MENU_CTXPOPUP_X, MORE_MENU_CTXPOPUP_Y); + evas_object_show(ctxpopup); + ad->ctxpopup_eo = ctxpopup; +} + +static void __vcui_view_fm_popup_check_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Eina_Bool state = elm_check_state_get(obj); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "Check %d\n", state); +} + +void _vcui_view_load_popup_flight_mode(Evas_Smart_Cb callback_fn) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + Evas_Object *popup_ly = NULL; + Evas_Object *check = NULL; + Evas_Object *btn1 = NULL; + Evas_Object *btn2 = NULL; + + _vcui_view_popup_unload(ad->popup_eo); + + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_eo = elm_popup_add(ad->popup_mw); + evas_object_size_hint_weight_set(ad->popup_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + popup_ly = _vcui_load_edj(ad->popup_eo, EDJ_NAME, "flight_mode_popup"); + if (popup_ly == NULL) { + _vcui_view_popup_unload(ad->popup_eo); + return; + } + elm_object_content_set(ad->popup_eo, popup_ly); + + edje_object_part_text_set(_EDJ(popup_ly), "text_msg", _("Unable to make " + "calls while \nFlight mode is enabled. \nDisable flight mode " + "and try \nagain.")); + + check = elm_check_add(popup_ly); + elm_check_state_set(check, EINA_FALSE); + elm_object_part_content_set(popup_ly, "check", check); + evas_object_smart_callback_add(check, "changed", + __vcui_view_fm_popup_check_clicked_cb, NULL); + + edje_object_part_text_set(_EDJ(popup_ly), "check_text", + _("Disable Flight mode")); + + ad->popup_vol_ly = popup_ly; + ad->popup_check = check; + + btn1 = elm_button_add(ad->popup_eo); + elm_object_text_set(btn1, "OK"); + elm_object_part_content_set(ad->popup_eo, "button1", btn1); + evas_object_data_set(btn1, "POPUP_BUTTON_KEY", (const void *)POPUP_BTN_OPT_OK); + evas_object_smart_callback_add(btn1, "clicked", callback_fn, ad); + + btn2 = elm_button_add(ad->popup_eo); + elm_object_text_set(btn2, "Cancel"); + elm_object_part_content_set(ad->popup_eo, "button2", btn2); + evas_object_data_set(btn2, "POPUP_BUTTON_KEY", (const void *)POPUP_BTN_OPT_CANCEL); + evas_object_smart_callback_add(btn2, "clicked", callback_fn, ad); + evas_object_show(ad->popup_eo); +} + +void _vcui_view_load_popup_checking(char *status_string) +{ + vcui_app_call_data_t *ad = _vcui_get_app_data(); + char popup_msg[DEF_BUF_LEN_LONG] = { 0, }; + Evas_Object *popup_ly = NULL; + Evas_Object *progressbar = NULL; + + snprintf(popup_msg, DEF_BUF_LEN_LONG, "%s", status_string); + CALL_UI_DEBUG(VC_LOG_DEBUG, "msg:[%s]", popup_msg); + + _vcui_view_popup_unload(ad->popup_eo); + + ad->popup_mw = __vcui_view_popup_create_win(ad, "base"); + ad->popup_eo = elm_popup_add(ad->popup_mw); + evas_object_size_hint_weight_set(ad->popup_eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + popup_ly = _vcui_load_edj(ad->popup_eo, EDJ_NAME, "checking_progress"); + if (popup_ly == NULL) { + _vcui_view_popup_unload(ad->popup_eo); + return; + } + elm_object_content_set(ad->popup_eo, popup_ly); + ad->popup_vol_ly = popup_ly; + + progressbar = elm_progressbar_add(ad->popup_eo); + elm_object_style_set(progressbar, "list_process"); + evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(progressbar, EINA_TRUE); + evas_object_show(progressbar); + + elm_object_part_content_set(popup_ly, "content", progressbar); + edje_object_part_text_set(_EDJ(popup_ly), "text", popup_msg); + + evas_object_show(ad->popup_eo); +} + diff --git a/ui/src/vcui-view-quickpanel.c b/ui/src/vcui-view-quickpanel.c new file mode 100755 index 0000000..4c85568 --- /dev/null +++ b/ui/src/vcui-view-quickpanel.c @@ -0,0 +1,469 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-elements.h" +#include "vcui-view-quickpanel.h" +#include + +#define VIEW_QUICKPANEL_LAYOUT_ID "QUICKPANELVIEW" +typedef struct { + Evas_Object *caller_id; + int rotate_angle; + Ecore_Event_Handler *client_msg_handler; +} vcui_view_qp_priv_t; + +static int __vcui_view_qp_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vcui_view_qp_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vcui_view_qp_onhide(voice_call_view_data_t *view_data); +static int __vcui_view_qp_onshow(voice_call_view_data_t *view_data); +static int __vcui_view_qp_ondestroy(voice_call_view_data_t *view_data); +static void __vcui_view_qp_caller_id_cb(void *data, Evas_Object *obj, void *event_info); +static Eina_Bool __vcui_qp_client_message_cb(void *data, int type, void *event); + +static voice_call_view_data_t s_view = { + .type = VIEW_QUICKPANEL_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vcui_view_qp_oncreate, + .onUpdate = __vcui_view_qp_onupdate, + .onHide = __vcui_view_qp_onhide, + .onShow = __vcui_view_qp_onshow, + .onDestroy = __vcui_view_qp_ondestroy, + .priv = NULL, +}; + +static Eina_Bool __vcui_qp_client_message_cb(void *data, int type, void *event) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + int new_angle = 0; + Ecore_X_Event_Client_Message *ev = (Ecore_X_Event_Client_Message *) event; + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv; + + CALL_UI_DEBUG(VC_LOG_DEBUG, "message_type: %d", ev->message_type); + if ((ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) + || (ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE)) { + new_angle = ev->data.l[0]; + CALL_UI_DEBUG(VC_LOG_DEBUG, "ROTATION: %d", new_angle); + priv->rotate_angle = new_angle; + elm_win_rotation_with_resize_set(ad->win_quickpanel, new_angle); + __vcui_view_qp_onshow(vd); + } + + return ECORE_CALLBACK_RENEW; +} + +static void __vcui_view_qp_caller_id_cb(void *data, Evas_Object *obj, void *event_info) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + + elm_win_raise(ad->win_main); +} + +voice_call_view_data_t *_vcui_view_qp_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(vcui_view_qp_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!!!!!!!!!! "); + } + + return &s_view; +} + +static void __vcui_view_qp_draw_contact_image(Evas_Object *eo, call_data_t *pcall_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = ad->view_st[VIEW_QUICKPANEL_VIEW]; + + vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv; + + if (pcall_data == NULL) + return; + + _vcui_delete_contact_image(eo); + char *file_path = _vcui_doc_get_caller_id_file_path(pcall_data); + if (strcmp(file_path, NOIMG_ICON) == 0) { + priv->caller_id = _vcui_show_default_image(eo, QP_NOIMG_ICON); + } else { + priv->caller_id = _vcui_show_default_image(eo, file_path); + } +} + +static void __vcui_view_qp_update_caller(Evas_Object *eo, call_data_t *pcall_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + if (pcall_data == NULL) + return; + + char *call_number = _vcui_doc_get_call_number(pcall_data); + char *call_name = _vcui_doc_get_call_display_name(pcall_data); + if (strlen(call_name) == 0) { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", call_number); + } else { + edje_object_part_text_set(_EDJ(eo), "txt_call_name", call_name); + } +} + +static void __vcui_view_qp_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv; + call_data_t *call_data = NULL; + char buf[DEF_BUF_LEN] = {0, }; + + int grp_count = 0; + + vcall_engine_get_group_count(&grp_count); + CALL_UI_DEBUG(VC_LOG_DEBUG, "No. of groups - %d", grp_count); + + if (_vcui_doc_get_no_status_call_data_count() == 1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "dialing/connecting view"); + call_data = _vcui_doc_get_call_data_mo_type(); + __vcui_view_qp_update_caller(eo, call_data); + __vcui_view_qp_draw_contact_image(eo, call_data); + + _vcui_view_qp_update_text_status(vd, _("IDS_CALL_POP_CALLING")); + } else if (_vcui_doc_get_all_call_data_count() > 1) { + if (_vcui_doc_get_unhold_call_data_count() == 0 || _vcui_doc_get_hold_call_data_count() == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi conf call"); + + int all_calls = _vcui_doc_get_all_call_data_count(); + char *temp = _("IDS_QP_BODY_GROUP_CALL_HPD_ABB"); + call_data = _vcui_doc_get_first_call_data_from_list(); + snprintf(buf, DEF_BUF_LEN, temp, all_calls); + edje_object_part_text_set(_EDJ(eo), "txt_call_name", buf); + priv->caller_id = _vcui_show_default_image(eo, QP_CONF_ICON); + + int caller_status = _vcui_doc_get_call_status(call_data); + if (caller_status == CALL_HOLD) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Hold call status"); + _vcui_create_quickpanel_unhold_button(vd); + } else { + _vcui_create_quickpanel_mute_button(vd); + } + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "multi split call"); + int active_calls = _vcui_doc_get_unhold_call_data_count(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "active_calls[%d]", active_calls); + if (active_calls > 1) { + char *temp = _("IDS_QP_BODY_GROUP_CALL_HPD_ABB"); + call_data = _vcui_doc_get_first_call_data_by_unhold_status(); + snprintf(buf, DEF_BUF_LEN, temp, active_calls); + edje_object_part_text_set(_EDJ(eo), "txt_call_name", buf); + priv->caller_id = _vcui_show_default_image(eo, QP_CONF_ICON); + } else if (active_calls == 1) { + call_data = _vcui_doc_get_first_call_data_by_unhold_status(); + __vcui_view_qp_update_caller(eo, call_data); + __vcui_view_qp_draw_contact_image(eo, call_data); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "invalid case"); + } + _vcui_create_quickpanel_mute_button(vd); + } + + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data)); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "single call"); + call_data = _vcui_doc_get_first_call_data_from_list(); + __vcui_view_qp_update_caller(eo, call_data); + __vcui_view_qp_draw_contact_image(eo, call_data); + + int caller_status = _vcui_doc_get_call_status(call_data); + if (caller_status == CALL_HOLD) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "Hold call status"); + _vcui_create_quickpanel_unhold_button(vd); + } else { + _vcui_create_quickpanel_mute_button(vd); + } + + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data)); + } + _vcui_create_quickpanel_end_button(vd); + evas_object_smart_callback_add(priv->caller_id, "clicked", __vcui_view_qp_caller_id_cb, vd); +} + +static Evas_Object *__vcui_view_qp_create_window(void) +{ + Evas_Object *win; + double scale = elm_config_scale_get(); + + win = minicontrol_win_add("voicecall-quickpanel"); + evas_object_resize(win, QUICKPANEL_WIDTH * scale, QUICKPANEL_HEIGHT * scale); + + return win; +} + +static Evas_Object *__vcui_view_qp_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "standard", "window", "integration"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, ly); + + edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm"); + edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm"); + + return ly; +} + +static Evas_Object *__vcui_view_qp_create_contents(void *data, char *group) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + vcui_app_call_data_t *ad = vd->app_data; + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(ad->win_quickpanel, EDJ_NAME, group); + + if (eo == NULL) + return NULL; + + return eo; +} + +static int __vcui_view_qp_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "quickpanel view create!!"); + + voice_call_view_data_t *vd = view_data; + vcui_app_call_data_t *ad = vd->app_data; + vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv; + + if (!vd->layout) { + ad->win_quickpanel = __vcui_view_qp_create_window(); + if (ad->win_quickpanel == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + priv->rotate_angle = elm_win_rotation_get(ad->win_quickpanel); + CALL_UI_DEBUG(VC_LOG_DEBUG, "current rotate angle(%d)", priv->rotate_angle); + + vd->layout = __vcui_view_qp_create_layout_main(ad->win_quickpanel); + if (vd->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + } + + if (priv->client_msg_handler == NULL) + priv->client_msg_handler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, __vcui_qp_client_message_cb, vd); + + __vcui_view_qp_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_qp_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "quickpanel view update!!"); + + __vcui_view_qp_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vcui_view_qp_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "quickpanel view hide!!"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vcui_view_qp_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "quickpanel view show!!"); + vcui_app_call_data_t *ad = view_data->app_data; + vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)view_data->priv; + + if (ad->quickpanel_layout) { + evas_object_del(ad->quickpanel_layout); + ad->quickpanel_layout = NULL; + } + + if (priv->rotate_angle == 0 || priv->rotate_angle == 180) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "portrait mode layout"); + evas_object_resize(ad->win_quickpanel, QUICKPANEL_WIDTH * ad->scale_factor, QUICKPANEL_HEIGHT * ad->scale_factor); + ad->quickpanel_layout = __vcui_view_qp_create_contents(view_data, GRP_QUICKPANEL); + } else if (priv->rotate_angle == 90 || priv->rotate_angle == 270) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "landscape mode layout"); + evas_object_resize(ad->win_quickpanel, LSCAPE_QUICKPANEL_WIDTH * ad->scale_factor, QUICKPANEL_HEIGHT * ad->scale_factor); + ad->quickpanel_layout = __vcui_view_qp_create_contents(view_data, GRP_QUICKPANEL_LSCAPE); + } + + elm_object_part_content_set(view_data->layout, "elm.swallow.content", ad->quickpanel_layout); + evas_object_name_set(ad->quickpanel_layout, VIEW_QUICKPANEL_LAYOUT_ID); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== QUICKPANEL:ad->quickpanel_layout Addr : [%p] ==========]", ad->quickpanel_layout); + + __vcui_view_qp_draw_screen(ad->quickpanel_layout, view_data); + + return VC_NO_ERROR; +} + +static int __vcui_view_qp_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "quickpanel view destroy!!"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + voice_call_view_data_t *vd = ad->view_st[VIEW_QUICKPANEL_VIEW]; + + vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->caller_id) { + evas_object_del(priv->caller_id); + priv->caller_id = NULL; + } + + if (priv->client_msg_handler != NULL) + ecore_event_handler_del(priv->client_msg_handler); + + free(priv); + priv = NULL; + } + + if (ad->quickpanel_layout) { + evas_object_del(ad->quickpanel_layout); + ad->quickpanel_layout = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_QUICKPANEL_VIEW] = NULL; + + if (ad->win_quickpanel) { + evas_object_del(ad->win_quickpanel); + ad->win_quickpanel = NULL; + } + + _vcui_cache_flush(); + return VC_NO_ERROR; +} + +void _vcui_view_qp_update_text_status(voice_call_view_data_t *vd, char *txt_status) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + vcui_app_call_data_t *ad = NULL; + int valid = 0; + + if (vd == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "View Data is NULL"); + return; + } + ad = vd->app_data; + + if (ad->win_quickpanel && ad->quickpanel_layout) { + valid = _vcui_check_valid_eo(ad->quickpanel_layout, VIEW_QUICKPANEL_LAYOUT_ID); + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== QUICKPANELVIEW : Invalid Evas Object, ad->quickpanel_layout : %p ==========]", ad->quickpanel_layout); + return; + } + edje_object_part_text_set(_EDJ(ad->quickpanel_layout), "txt_timer", txt_status); + } + +} + +void _vc_ui_view_qp_set_call_timer(Evas_Object *qp_layout, char *pcall_timer) +{ + int valid = -1; + + VCUI_RETURN_IF_FAIL(qp_layout); + valid = _vcui_check_valid_eo(qp_layout, VIEW_QUICKPANEL_LAYOUT_ID); + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== QUICKPANELVIEW : Invalid Evas Object, ad->quickpanel_layout : %p ==========]", qp_layout); + return; + } + if (!_vcui_doc_get_no_status_call_data_count()) + edje_object_part_text_set(_EDJ(qp_layout), "txt_timer", _(pcall_timer)); +} + +void _vcui_view_qp_install_window(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *win; + vcui_app_call_data_t *ad = NULL; + + if (vd == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "View Data is NULL"); + return; + } + + ad = vd->app_data; + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "app Data is NULL"); + return; + } + + win = ad->win_quickpanel; + if (ad->win_quickpanel == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "QP win is NULL"); + return; + } + evas_object_show(win); + evas_object_show(vd->layout); +} + +void _vcui_view_qp_uninstall_window(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + Evas_Object *win; + vcui_app_call_data_t *ad = NULL; + + if (vd == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "View Data is NULL"); + return; + } + + ad = vd->app_data; + if (ad == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "app Data is NULL"); + return; + } + + win = ad->win_quickpanel; + if (ad->win_quickpanel == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "QP win is NULL"); + return; + } + elm_win_quickpanel_set(win, 0); + + evas_object_hide(ad->win_quickpanel); + evas_object_hide(vd->layout); +} diff --git a/ui/src/vcui-view-single-call.c b/ui/src/vcui-view-single-call.c new file mode 100755 index 0000000..4c14753 --- /dev/null +++ b/ui/src/vcui-view-single-call.c @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vcui-application.h" +#include "vcui-view-common.h" +#include "vcui-view-single-call.h" +#include "vcui-view-keypad.h" +#include "vcui-view-elements.h" + +#define VIEW_SINGLE_CALL_LAYOUT_ID "ONEVIEW" +typedef struct { + Evas_Object *contents; + Evas_Object *caller_info; + Evas_Object *caller_id; + Evas_Object *btn_ly; + Evas_Object *ic; + Evas_Object *record_btn; +} incall_one_view_priv_t; + +static int __vc_ui_view_single_call_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3); +static int __vc_ui_view_single_call_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2); +static int __vc_ui_view_single_call_onhide(voice_call_view_data_t *view_data); +static int __vc_ui_view_single_call_onshow(voice_call_view_data_t *view_data); +static int __vc_ui_view_single_call_ondestroy(voice_call_view_data_t *view_data); +static Evas_Object *__vc_ui_view_single_call_create_contents(void *data, char *grpname); + +static voice_call_view_data_t s_view = { + .type = VIEW_INCALL_ONECALL_VIEW, + .app_data = NULL, + .layout = NULL, + .onCreate = __vc_ui_view_single_call_oncreate, + .onUpdate = __vc_ui_view_single_call_onupdate, + .onHide = __vc_ui_view_single_call_onhide, + .onShow = __vc_ui_view_single_call_onshow, + .onDestroy = __vc_ui_view_single_call_ondestroy, + .priv = NULL, +}; + +voice_call_view_data_t *_vc_ui_view_single_call_new(vcui_app_call_data_t *ad) +{ + s_view.app_data = ad; + s_view.priv = calloc(1, sizeof(incall_one_view_priv_t)); + + if (!s_view.priv) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR!!!!!!!!!!!"); + } + + return &s_view; +} + +static void __vc_ui_view_single_call_draw_screen(Evas_Object *eo, void *data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)vd->priv; + vcui_app_call_data_t *ad = vd->app_data; + call_data_t *call_data = _vcui_doc_get_first_call_data_from_list(); + char *file_path = NULL; + int valid = 0; + int caller_status = 0; + + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call Data is NULL"); + return; + } + + /* ============ Check valid Evas Object ============= */ + CALL_UI_KPI("_vcui_check_valid_eo ONEVIEW start"); + valid = _vcui_check_valid_eo(priv->contents, VIEW_SINGLE_CALL_LAYOUT_ID); + CALL_UI_KPI("_vcui_check_valid_eo ONEVIEW done"); + if (valid == -1) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== ONEVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents); + return; + } + /* ============ Check valid Evas Object ============= */ + + file_path = _vcui_doc_get_caller_id_file_path(call_data); + caller_status = _vcui_doc_get_call_status(call_data); + + CALL_UI_DEBUG(VC_LOG_DEBUG, "file_path: %s", file_path); + + if (strcmp(file_path, NOIMG_ICON) == 0) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "no-img"); + edje_object_signal_emit(_EDJ(priv->caller_id), "show-no-cid-connected", "cid-img"); + } else { + _vcui_show_caller_id(priv->caller_id, file_path); + /*put blur effect on full-cid*/ + } + + _vcui_show_caller_info_status(data, _("IDS_CALL_BODY_ON_HOLD_ABB"), EINA_FALSE); + if (caller_status == CALL_HOLD) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "=================HOLD====================== "); + edje_object_signal_emit(_EDJ(priv->caller_info), "set-hold-state", "call-screen"); + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "=================UNHOLD====================== "); + + edje_object_signal_emit(_EDJ(priv->caller_info), "set-unhold-state", "call-screen"); + } + + char *call_number = _vcui_doc_get_call_number(call_data); + char *call_name = _vcui_doc_get_call_display_name(call_data); + /* call name (if nothing, call number) */ + CALL_UI_KPI("edje_object_part_text_set start"); + if (strlen(call_name) == 0) { + _vcui_show_caller_info_name(vd, call_number, EINA_FALSE); + } else { + _vcui_show_caller_info_name(vd, call_name, EINA_FALSE); + _vcui_show_caller_info_number(vd, call_number, EINA_FALSE); + } + CALL_UI_KPI("edje_object_part_text_set done"); + + _vcui_show_caller_info_icon(vd, EINA_FALSE); + + CALL_UI_KPI("_vcui_view_common_set_each_time start"); + _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data)); + CALL_UI_KPI("_vcui_view_common_set_each_time done"); + + { + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + /*create a small button for Hold/Swap*/ + _vcui_create_hold_swap_button(vd); + + if (((_vcui_is_phonelock_status() == EINA_TRUE) && (_vcui_is_idle_lock() == EINA_TRUE)) + || (caller_status == CALL_HOLD)) { + CALL_UI_KPI("_vcui_create_bottom_second_button start"); + _vcui_create_bottom_second_button_disabled(vd); + CALL_UI_KPI("_vcui_create_bottom_second_button done"); + + } else { + CALL_UI_KPI("_vcui_create_bottom_second_button start"); + _vcui_create_bottom_second_button(vd); + CALL_UI_KPI("_vcui_create_bottom_second_button done"); + + } + + CALL_UI_KPI("_vcui_create_top_end_button start"); + _vcui_create_top_end_button(vd); + CALL_UI_KPI("_vcui_create_top_end_button done"); + + CALL_UI_KPI("_vcui_create_bottom_third_button start"); + _vcui_create_bottom_third_button(vd); + CALL_UI_KPI("_vcui_create_bottom_third_button done"); + + CALL_UI_KPI("_vcui_create_bottom_fourth_button start"); + _vcui_create_bottom_fourth_button(vd); + CALL_UI_KPI("_vcui_create_bottom_fourth_button done"); + { + if (_vcui_view_common_is_emul_bin() == EINA_TRUE) { + _vcui_create_bottom_first_button_disabled(vd); + _vcui_create_bottom_fifth_button_disabled(vd); + } else { + _vcui_create_bottom_first_button(vd); + _vcui_create_bottom_fifth_button(vd); + } + } + } + CALL_UI_KPI("edje_object_signal_emit effect start"); + if (ad->beffect_needed == EINA_TRUE) { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_EFFECT", "ALLBTN"); + ad->beffect_needed = EINA_FALSE; + } else { + edje_object_signal_emit(_EDJ(priv->contents), "SHOW_NO_EFFECT", "ALLBTN"); + } + CALL_UI_KPI("edje_object_signal_emit effect done"); + + _vcui_elements_check_keypad_n_hide(vd); + + CALL_UI_KPI("evas_object_show start"); + evas_object_show(eo); + CALL_UI_KPI("evas_object_show done"); +} + +static Evas_Object *__vc_ui_view_single_call_create_contents(void *data, char *grpname) +{ + if (data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + voice_call_view_data_t *vd = (voice_call_view_data_t *)data; + Evas_Object *eo = NULL; + + /* load edje */ + eo = _vcui_load_edj(vd->layout, EDJ_NAME, grpname); + if (eo == NULL) + return NULL; + + return eo; +} + +static Evas_Object *__vc_ui_view_single_call_create_layout_main(Evas_Object *parent) +{ + if (parent == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return NULL; + } + + Evas_Object *ly = NULL; + ly = elm_layout_add(parent); + retvm_if(ly == NULL, NULL, "Failed elm_layout_add."); + + elm_layout_theme_set(ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + return ly; +} + +static int __vc_ui_view_single_call_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "incall view create"); + voice_call_view_data_t *vd = view_data; + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)vd->priv; + call_data_t *call_data = _vcui_doc_get_first_call_data_from_list(); + Evas_Object *sep_ly = NULL; + + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return VC_ERROR; + } + + if (!vd->layout) { + + CALL_UI_KPI("__vc_ui_view_single_call_create_layout_main start"); + vd->layout = __vc_ui_view_single_call_create_layout_main(vd->app_data->win_conformant); + CALL_UI_KPI("__vc_ui_view_single_call_create_layout_main done"); + if (vd->layout == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "ERROR"); + return VC_ERROR; + } + elm_object_content_set(vd->app_data->win_conformant, view_data->layout); + + CALL_UI_KPI("__vc_ui_view_single_call_create_contents start"); + priv->contents = __vc_ui_view_single_call_create_contents(vd, GRP_INCALL); + elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents); + CALL_UI_KPI("__vc_ui_view_single_call_create_contents done"); + + sep_ly = __vc_ui_view_single_call_create_contents(vd, "separator-layout"); + elm_object_part_content_set(priv->contents, "btn_bg", sep_ly); + + priv->btn_ly = __vc_ui_view_single_call_create_contents(vd, GRP_BUTTON_LAYOUT); + elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly); + + priv->caller_info = __vc_ui_view_single_call_create_contents(vd, GRP_CALLER_INFO); + elm_object_part_content_set(priv->contents, "caller_info", priv->caller_info); + + priv->caller_id = __vc_ui_view_single_call_create_contents(vd, GRP_CALLER_ID_LAYOUT); + elm_object_part_content_set(priv->contents, "caller_id", priv->caller_id); + + CALL_UI_KPI("evas_object_name_set start"); + evas_object_name_set(priv->contents, VIEW_SINGLE_CALL_LAYOUT_ID); + CALL_UI_KPI("evas_object_name_set done"); + CALL_UI_DEBUG(VC_LOG_DEBUG, "[========== ONEVIEW: priv->contents Addr : [%p] ==========]", priv->contents); + + } else { + CALL_UI_DEBUG(VC_LOG_DEBUG, "[UI]ad->layout_incall==NULL case "); + evas_object_show(vd->layout); + } + + __vc_ui_view_single_call_onshow(view_data); + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "incall view update"); + + __vc_ui_view_single_call_onshow(view_data); + + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_onhide(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "incall view hide"); + + evas_object_hide(view_data->layout); + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_onshow(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "incall view show"); + CALL_UI_KPI("__vc_ui_view_single_call_onshow start"); + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)view_data->priv; + call_data_t *call_data = _vcui_doc_get_first_call_data_from_list(); + + /*change the orientation to normal - 0 */ + elm_win_rotation_with_resize_set(view_data->app_data->win_main, 0); + elm_win_rotation_with_resize_set(view_data->app_data->popup_mw, 0); + + if (call_data == NULL) { + CALL_UI_DEBUG(VC_LOG_DEBUG, "call data is null"); + return VC_ERROR; + } + CALL_UI_KPI("__vc_ui_view_single_call_draw_screen start"); + __vc_ui_view_single_call_draw_screen(priv->contents, view_data); + CALL_UI_KPI("__vc_ui_view_single_call_draw_screen done"); + + CALL_UI_KPI("incall-one-view hide start"); + evas_object_hide(view_data->layout); + CALL_UI_KPI("incall-one-view hide done"); + CALL_UI_KPI("incall-one-view show start"); + evas_object_show(view_data->layout); + CALL_UI_KPI("incall-one-view show done"); + CALL_UI_KPI("__vc_ui_view_single_call_onshow done"); + return VC_NO_ERROR; +} + +static int __vc_ui_view_single_call_ondestroy(voice_call_view_data_t *view_data) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, "incall view destroy"); + + vcui_app_call_data_t *ad = _vcui_get_app_data(); + + voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_ONECALL_VIEW]; + incall_one_view_priv_t *priv = (incall_one_view_priv_t *)vd->priv; + + if (priv != NULL) { + if (priv->btn_ly) { + evas_object_del(priv->btn_ly); + priv->btn_ly = NULL; + } + + if (priv->caller_info) { + evas_object_del(priv->caller_info); + priv->caller_info = NULL; + } + + if (priv->caller_id) { + evas_object_del(priv->caller_id); + priv->caller_id = NULL; + } + + /*Delete keypad layout*/ + _vcui_keypad_delete_layout(priv->contents); + + if (priv->contents) { + evas_object_del(priv->contents); + priv->contents = NULL; + } + + free(priv); + priv = NULL; + } + + if (vd->layout != NULL) { + evas_object_hide(vd->layout); + evas_object_del(vd->layout); + vd->layout = NULL; + } + + ad->view_st[VIEW_INCALL_ONECALL_VIEW] = NULL; + + _vcui_cache_flush(); + CALL_UI_DEBUG(VC_LOG_DEBUG, "complete destroy one view"); + return VC_NO_ERROR; +} + +int _vc_ui_view_single_call_check_valid_eo(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + + incall_one_view_priv_t *priv = NULL; + int valid = -1; + + VCUI_RETURN_VALUE_IF_FAIL(vd , -1); + priv = (incall_one_view_priv_t *) vd->priv; + + valid = _vcui_check_valid_eo(priv->contents, VIEW_SINGLE_CALL_LAYOUT_ID); + + return valid; +} + +Evas_Object *_vc_ui_view_single_call_get_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_one_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_one_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->contents; +} + +Evas_Object *_vc_ui_view_single_call_get_button_layout(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_one_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_one_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->btn_ly; +} + +int _vc_ui_view_single_call_get_call_status(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_one_view_priv_t *priv = NULL; + call_data_t *call_data = _vcui_doc_get_first_call_data_from_list(); + int call_status = 0; + + VCUI_RETURN_INVALID_IF_FAIL(vd); + priv = (incall_one_view_priv_t *) vd->priv; + + VCUI_RETURN_INVALID_IF_FAIL(call_data); + call_status = _vcui_doc_get_call_status(call_data); + return call_status; +} + +void _vc_ui_view_single_call_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur) +{ + incall_one_view_priv_t *priv = NULL; + + VCUI_RETURN_IF_FAIL(vd); + priv = (incall_one_view_priv_t *) vd->priv; + + VCUI_RETURN_IF_FAIL(priv); + edje_object_part_text_set(_EDJ(priv->caller_info), "txt_timer", _(pcall_dur)); +} + +Evas_Object *_vc_ui_view_single_call_get_caller_info(voice_call_view_data_t *vd) +{ + CALL_UI_DEBUG(VC_LOG_DEBUG, ".."); + incall_one_view_priv_t *priv = NULL; + + VCUI_RETURN_NULL_IF_FAIL(vd); + priv = (incall_one_view_priv_t *) vd->priv; + + VCUI_RETURN_NULL_IF_FAIL(priv); + return priv->caller_info; +} + diff --git a/ui/themes/bg/vc_button_callend_press.png b/ui/themes/bg/vc_button_callend_press.png new file mode 100644 index 0000000000000000000000000000000000000000..b68bd66ddb40f0994bb0f33d7ae1895e2f5e2f46 GIT binary patch literal 2959 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 R+{I=C107TCIxVN@{{z=wVOanG literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_button_conflist_hold_press.png b/ui/themes/bg/vc_button_conflist_hold_press.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7c9c2df9ff228c56932fe1d4a30a77fac5fef6 GIT binary patch literal 3764 zcmZvecRbXA|HnT@_R8K7*<5xucd|z~9odQ_*~*IU$QB{>yP*2op8rYpPq)B1^@thLjzsQzi#%gs3`vSlnMd9 zzeeq6U>gVkv@HLM1ju{M2>>+ao)E~LJ08A4zJVUTegcLNh=5;!ue;|XHvkBkMO(q4 zR$J^E#DycUaXjLcv9Bc?m4GEU3Bj5sA|Xi4WE3x0IKyVqarO3Xa-RNzc(RlfL^7L& z6kQ_CH07FLQA+gN_{4$JXO%Slx+Y>$T%$(fHOtmZt})mGH!!&?MV>N zNpL}Fw~VO}tble{3b+K&)+0fnb409w0&>84@V@IRa7P+&7Jarc4j|Acx#1*$-77&h zl7ciqfW<9d7w}L6Du?eT-Ue)L0<7-F-73JeG;q@p=57GIZv=37CfZtniVnDG5g#KC zkcR`#{X#+^!1G*yRqp_%{!_A=X;b2FQn|J2O~NX-k#q(1q{Qsa~rApXN|O%XME$= zyA55NY$RA$EtvgNbn}uA<%+K-fYZf$Zj4<%SXq=hCDU9~1l~W?BneNGE_1j~_RCn5 z$tDQ5LIi+=X5WslVpL=ZkLcy$;LCljbNzxF0K(lc-5&rPb%kZ119e(`Q~;n`fRuQz z!*kTZDTSlp?YJ`6L3`$`^c*bQ-3ev_(>y@%1~`jXMuEj*hu-r^ID@`w^C{pgJYqBa z7-TxFKQd_eG5&F(%I^?sK~j_J^i#382+qcnxF*^NrBHF?#+(Rt7?3k32@8CVXSKL) zoTg|XYnccYur}a3&2wcrebUYC`&M;=XZG%6C7yDbw2p{%}i*I^+J}hwGJem|pJp zcPq)76OQi>e+VXLM&8CzE0G6-1zh-b3~Wqn%%%;>1bBrNuFg^`Q;tb_N|jeq0+RhPYv{GEHTgB3HNgWr8nmmn|GN{b6*0?!hellMOzR5k6mB_k zI@WLVEa%G#p;r}C?}4idv6eL!ab+wDkMmT9qS+0Ni>rz<$GJT?Jcyn(--13}ozLVq z%N~J^4Q}aw%l<}o6ii1S%NE@i4;SM?aZ+-^xq>-sa!g9N#*?`Epf{CecXBp!8FPKD zZ6vS~PubE2Xflm5MKXCLK+y7vl8S{2TI)mWL1=2Zqg6z;p0&KyYB}}SER1yp`p%9O zj}^RJtt_qrUgitcdKYPXo76v?2|XC!Jbst-@aUqNqL%~;Ks(v-5B zYN#Gp%T#z3^AtAg2Dkf^?&ajSIU@2+d`lNXTQ~pkMu5(t=iYxxkM-$nDC+2hDF}3U zPW2u|e_wSzP#@u^1;n9C8&d3&>5{$tJgsR|{q2O_3q8hU&tCgg;Z^Tm@7}i}6e5Bm z#-`h*dwG_oO(o(bY9?wXeM4V{iiRe06;T?pQ*xWAP1F=>vC;Wn$UP}+8TO-_VeQ(z z65Bm&i%-lw729GP>w6A$dR6GE8Rr`^JpAiDt%#nZtSu1S zW|(PsT7DJFGAQ2diMB$G>%%$VO@Yye@kt5BQG+tsnldP!-ueF4HKU+oe~0C;v12r< z4%N9^MyT0S+Vk9tn|t#`;f;8{t$g4}S3hLQVtrJL_D$wZuf@tpbBH+--mobIx(`Z& zRZYEbEDo+9y6kgk{?ZJ1v#PnOuDl?(VC(cn8Q0j~IB4GGo9`5}2ze%S`QS3_aug^< z+#rFIB_MT>cBH2#VNV6yQ?yhGZog`0c6E{qnsnH7QlqM();p>MJ^H`DtP&({=HS!t zo(wT}BELA7h6%N7%QlX;YCK6~C10dF}C)mGW)^t6}$;0i(03@m&b zzTy64u+lB2_M*opsS(7VN%`5U?q%f_TWK0Bxa1r3p4gNGWi8wd=H5P(Frbo!$(J13 z{ZcnTc&Yq)|IOttb0_n1I<`307$(hUv(Z}lP^DJgKa@bT%63IE_AW)G`o~19g!hCw zW*3%S9oZ@pX6l7>>==mZXdv<0p|z%2kBQiso7#0Sw*lEMHn{wWMe}H~B_vj}5;(Hi zo=uC*g{t5RX7Hh(nXRW^yj#C}{OdLW zlszOyXpY80n%=gne{69p{fr+{(}KQ(9zp*=mG;Kw8(gMNd`9l4NvQcTGa^^TPInk-VRk}-u}CNWMgFKltK*Hsiv+lCq)LO*-XZbgk}zz>F#(V6IoNSWVr&V(Xt z_~w25;zLH?{ZC9m%VW1MlQz{_)bREPAA=5R3F|DdkFdNNRVVN5pl$VwjB)e6=GV=6 z)lK$ZO?zRj4dL#@EuMU3{QOaC=uh^`$%%XwjrrEYFkfO1@pzGaJ~BY`96#7R6D+z{ z)neY_bfmqjGXt5Ao6xemn48|8d-f0)TyQu#r%$Aai5|X4J5FVUTuIGM9gL-q-O0bD zsiLx?6>z?FRtgz@Ff5YKaZz+JSk1u>iaeRvnZl3ej231eWM{N{KP^7r#_e#`5PCa% z`P)8+$jdq&-96py2%Zb(+kd;rXukGT;F;K^$L|lvRwJdS8C)3|m*iwQhiCWYr3ruk zO@aFcmZks@b^`zq(E#xK@~>|Jz~h?$u?mMRaf z@=2YR%Ye}KpS=cNr+=XKZ%{;uH_ZAkyMewXM^cezjfwkn3ghhC^L1Kw~369m<8^q zSYIhU!*JkkNu7LxV9IDpU)Ju?C39S6!k^Ygq`8!Hfm_c0yg0+%eh#^MFk<<)^EDHc z%Mr!2q52?&TE}~-dQZzLdzlyCCl}DUxwcT;1Y7e7^!1=*7YO0hKf((Nw2P=Ze*J!PYO;jy zmY0)z{A2CMptxk1(rntH-wOHn_VX-iB#!#^U+FH9oBfk8si@z7boCaJL2`X z&ioJl4}SgshyDJ;PusgZBc^jjeoy(Cs+p$Kf!J_$0ZXpmpk(EwleC7VkUa1#TD?P! z7PROSt8GfsDARCFF^CtEuATP)kuEAKV;b^jd4vB)25IESmiEJuy?WOoCO&N4$FUpSA2|dD0sub79Aq8`i6SP85TXJuwHFly#y@lgL!PV6Pz# z?q?3o;r`!NHgLrPM^C+KZoM2IPzZZFbZ7iBq|r^^#d2ZhQOn1s+Fku!5Tb@-0QTf) zRYX*@8Z|tp;K+%AE%IVuq6kE#SX=gm+#acEZTiVRheXZZh-V?{#djXyOamxtwssUh Td6@n8EC7bL&2+25&Qbpd3z!h- literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_button_end_press.png b/ui/themes/bg/vc_button_end_press.png new file mode 100755 index 0000000000000000000000000000000000000000..70520268193615172efcfc93d70d6bb8c0174fac GIT binary patch literal 3657 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 literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_button_hold_swap_normal.png b/ui/themes/bg/vc_button_hold_swap_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..c95ea48dddebd0050b9f25149f3d14fc6afee129 GIT binary patch literal 1176 zcmaJ>TSyd97#=N3Eqll$Dud%#MA*({-HSW9R=cy-V!PS8kv^2o&Kz~vX3jWswjB+- zNEAi)D5-=fAA$m*zzBS>m!w{Li3lpF9;%0et`r4PXUtWJwt@N2IX~a`{g?A|4mZWu zmzFFpp(v^}xs!1I%0VSoo>prZb zs2Q}HY{4zDje?9cMshHWtr>((QFUut0VPrz! zWjL42`FP;-FuaEgcmk_{o8vi_ce9+|#dCt!FK|4V_-GQ%RN94v*f0@`oPu;G#)iPM z*=&}{)-cHIVEI5Gz;bTZ?RF7_%j(v#WV>{$DyJYqOEy<4IfqqLe}z9HdF6e@f7d zNm<>RXcK7|YfA>pGn`XW4j7C5AF64SXbUIcRKEWdwvycjWE0Rr8B-<~*Iwm>GK8=R zC5+4@LOXL^Z0bZ9S)IrL;bt$xgRQErpsY2HkHv(jZedB6VN?v#M1fINMex=51MZO5 zSL+T(cs|01d=X#BSL=_|itdI6znJ5SNX}?b$2qPt#r5aqI-{T&B(exibr)0`Or(MF zk_9z?E}p!46I>;KF5bLcmL$VE7d!2ub1pJH&USKa$zgKvp-!gVBx9Yj4!)(Rg1J#~ zUDAH??in9Huy(;dX-ur1UvhEyboiuEpugC@zuGQ3ai@6I*P<`W1`3x9-vF1*Gj|uw zX>M{WDhlZOdvM&oo0Z~ueM=@BKlsYCrW<;A;S4?1r}G!hqwLOc3?16oy#3IG5A literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_button_hold_swap_press.png b/ui/themes/bg/vc_button_hold_swap_press.png new file mode 100644 index 0000000000000000000000000000000000000000..c0250f69707732f853b96c8e68c5245a819ba72e GIT binary patch literal 1331 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 literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_conf_end_normal.png b/ui/themes/bg/vc_conf_end_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..fccdf654f309a9f1ce300d594da5009cc2c07079 GIT binary patch literal 1246 zcmeAS@N?(olHy`uVBq!ia0vp^JV5Nl!3HGzOSVn}Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^K*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>u&JJ*LU?9g zN`84USiP^Wm1kaYNn&1ds;7&s63_&_%*+%kBV$W917jx>3nOP!Lqk_XM>As!7b7P} zGZ%9US3`3%m|mCsATTymE-@G^|GP0?@)MA^6xV}cV!Qr`Cu8h{#s7bw%kS26W;dRPd7T1Rhy;u z`0murt8451e>6`%d)3S}Fm}J4vLv6wN9zfqLaj90R+RP4L9>h-!)jwN^7 zSGTNxbWz%O$JI3FO@_YlKX;$b6yN@=Tc~{2tV>(hzc|SK$>{B|s?9MI^R7*j))fB` z%d=SJa{MW|8RFmbC;Uie5@=vxQD9)?a9{v2{}>-gTc)&E;xF5b39g3%E}e8c-yInD z%TRICoylo7S&kfkmdNmPKD4={@GNXqYIXP1ZxeF%+JqihQ!G32taVZHm*nPdjgQl= zzT^vauIaje?oiCzxZqer{p{|h>(ggAcI8~R-BD~2u<}POhXKRdxrhGrfB(b+Dsenr L{an^LB{Ts5xtg~; literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_conf_end_press.png b/ui/themes/bg/vc_conf_end_press.png new file mode 100644 index 0000000000000000000000000000000000000000..09a990f9b352bae6da3d7be0f10907c7f9ba34d1 GIT binary patch literal 1276 zcmeAS@N?(olHy`uVBq!ia0vp^JV5Nl!3HGzOSVn}Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^K*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>u&JJ*LU?9g zN`84USiP^Wm1kaYNn&1ds;7&s63_&_%*+%kGc!{&XG=>H3nOP!Lqk_XM?+^zS5r3= zGh-J+BXdI&m|mCsATTyF!Z>HP&F&hfB-mlo}S0?P*k^F>Vi;2h`hAC}H%%v_GS>%Aov+a~{cgz@ zHC`cwx;f`GU#56iIZSFwVs_zUI3;9u-*8vdn|bfrm$*-s_S*ga#oWeSwhQKddd|nl zu_5wcUH#pxduDF8z9!jSVQ`TXIL#BW_Tb!&&l2U|9?4bPc;!*`k|VlVP4{)4v2N4& zC1quHZu7&%$@*%owT2q+QqpRb75Eq}|_284P~X+3Ynbn8{ex=))o#b}BA zJhN28()HZgR|1oEe@U74K22}h%$GHO>CbP@UzoW$D(C&Wwks_5pZ{1rSTeP+Vpod7 ps^rL%W_A)0Ih(V^|J1QaFf1-?z4h+EJ6}+F@D-zkmP$ literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_conf_split_normal.png b/ui/themes/bg/vc_conf_split_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..d320be9ed355032b4cd69568b48e2e65b103d7ba GIT binary patch literal 1143 zcmeAS@N?(olHy`uVBq!ia0vp^JV5Nk!3HFg)y;ncDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}mUbW};_k zVqj@vsiRh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*q`*i_F@Av`lL zCBM8Ftlrnx$}_LHBrz{J)zigR321^|W@d_&tGT&_xtoEBg^{zVp`ojxlZlg?i;;z; ztE-ENvy*`-Os`9Ra%paAUI|QZ3PP_bPQ9R{kXrz>*(J3ovn(~mttdZN0qkX~Ox$iU z!f757L*#bH6grAxROzlO$WZfy{IvJQHUVFMY zhE&{oGu@D@*+IZHotGo?h~EWiji_a34TUaA6|wOri6%)G^=?_|@_~b^EGb#^tdEgU z(nB-N=ZD=R?n`gG6ZqJINwsScbDiG}-ZI|#Uv98}ixD|Gl~06|BVOisr|o&>)0++$ z^qAZ7Fqg!#hlV;{Hj(sl7j1jU_b^(3Wy6$BI-a*KuV_(weaOeD$^ZI=R>}D+#k)QS z%`p7>Bu2!MMbJe6LbUAXu-&_{G;x`_;&S$#dS{-fEcsG(y>;f7blHMf@toUiORq>T zs?WXc6np)CX~MRGBR6!*jyBJ~VQn^BtZzC4GsC~Qm|pk BcVYkl literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_conf_split_press.png b/ui/themes/bg/vc_conf_split_press.png new file mode 100644 index 0000000000000000000000000000000000000000..e61325dce612199f37e059856861c3fd58e7afda GIT binary patch literal 1277 zcmeAS@N?(olHy`uVBq!ia0vp^JV5Nk!3HFg)y;ncDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}mUbW};_k zVqj@vsiRh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*q`*i_F@Av`lL zCBM8Ftlrnx$}_LHBrz{J)zigR321^|W@d_&vx||Dg^PuWg^{zVp`ojxqno*_ldGGV ztBZ?~tBaW{Os`9Ra%paAUI|QZ3PP_bPQ9R{kXrz>*(J3ovn(~mttdZN0qkX~Ox$iU z!f757L*#bH6grAxROzlO$WL^Eu--3aGvCz}S zF{I+wo9VWGhaCi3@2|N&`$p%Yj^rl{TTDdmFidGX)M&NH%Tavk0{>Q_POd`Us8w@V z7ykK?Kl9_QE+tkGt1j8hrFUn3@0}lWcEVOMp@$V#DwlV;XPjGD$|CAf)x7D4!#w-t zn?J5r@o4yvxNX6T$qKI+0(rQ21wt4CL^ed8dQmmg?q07)|MKf1<@YbVZr)|PK=$)< zK1PlWv4`tw?`6C*bG%cUWOs$Zg-_r#PsG}TGdrI>VtBjal~2;jqu(7mqpz^+k37Sh zGmqb-Btz?bTR-3286w{fF4!@7mZ6*D%2m!^!;c(m+>tnC^+q>K!JU4+?~?w)f86xV{yU7H2M>o}m7x vrTrT>TT_*+#*Jgv%%@|ELUm>CGx0F+Tx>mM_42G1s6g^`^>bP0l+XkKKOoI+ literal 0 HcmV?d00001 diff --git a/ui/themes/bg/vc_contact_btn.png b/ui/themes/bg/vc_contact_btn.png new file mode 100755 index 0000000000000000000000000000000000000000..71cf3908e74f6d696b6df687ecf9a93a6748620c GIT binary patch literal 3823 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 FV1iKtwA=sy literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_add_icon_press.png b/ui/themes/icon/vc_add_icon_press.png new file mode 100644 index 0000000000000000000000000000000000000000..c07e615566d8800efa50ed846536b7daf32aca54 GIT binary patch literal 3006 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 A(*OVf literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_contacts_icon.png b/ui/themes/icon/vc_contacts_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf5856cbb8cdb2a25f87d19872073bcc6120c55 GIT binary patch literal 3992 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_contacts_icon_dim.png b/ui/themes/icon/vc_contacts_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..30ed0163ed2384505150b81b7d9661a213575de6 GIT binary patch literal 3957 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 P00000NkvXXu0mjf%L7wj literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_contacts_icon_press.png b/ui/themes/icon/vc_contacts_icon_press.png new file mode 100644 index 0000000000000000000000000000000000000000..81913d4433acb8f466bcadac9d6d9ffc73999b19 GIT binary patch literal 3390 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_end_call_icon_dim.png b/ui/themes/icon/vc_end_call_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..13f6fb5c5964ebb78aaea8b49c96877b67bcbf45 GIT binary patch literal 3702 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 R_*-HC(APH6YS46!{vXxX+PVM$ literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_end_call_icon_press.png b/ui/themes/icon/vc_end_call_icon_press.png new file mode 100755 index 0000000000000000000000000000000000000000..49d4b21103524ae2d767cd5da74d5c91a3300537 GIT binary patch literal 22858 zcmX6^bx<75(_Y*O?ykYzA;3WhPH-oxYI~mUo|*0Lc_#Lw`Uf0L3QPb1aFi6~wO;$J|21^f*C(aXT-a-e;ihQl2>@7x z|7!?9Zax_RU}`wX$$k82@9O31Y47Srrz9sw=jP#R>)>ny0DhYV+IBkH$0Sm>JO4l` zF_3f>S1n?6IxSEfgeZlDogM>EIflMugIIF_|NVPp%JJeDq{Ku>Jh3Jx_7}``w4d~) zi4kQnUnU=a1eQ6i_TC=OJh!jCJF2@XXq`iYp<`z%3TO&Ju&Y5d_`4Bf!=pcba?6Ba zGPwbG=&jcDo==Pjz+H%>BnJZwtsg+}Tf#yIU}||VUaHS8Z%#ltCJ2y71ejNfs0uoS z2#^U#1XTbs3J8#bY!+>x7#T31va;L(cA)rpQ~%2Cf3|sFlH9eiaq#o!y7Dl{*kV#Y_}Omo z6HNcf`94JQzuW8G{ynBJe$%iI$alMg)BjYYk zu9VxG2MhGVfw#S37|62Y=!6#Zn=uHMUkn%%(MfZn?&t>;kqP3M=q6%_G#OM=zlDz_2qf_vjF)S(Fna&1$Ndp$@xtl%h$m4yh;h z+G?)Z7nvaJJq$w_*%w4-K_jbZplYDLu2@A!#UzNoi6Mf46sbAL%8*v2(#Fz_e?LrS z$srjqUBEh1f5BqNGw@Uz)K*VNYs*>(Kbis~dkigGN1TUVm}w z_`|QPUr7Iav2mh_BgSIv-je5$p^@2<`;s+gt5%RN#gUKc@QU!AW*_Ce$#K;+V282? z5vNRIW+-Q{WKgp6=v3EK)a=w?>0aqh=_FN~X$Lnb=n81>S7R(^*6P+2d_2{r)V8aZ zsQO%ESLLcB{WZk!DHhdmNOedV}idMBLPXzwtgVV35ZjUXTP zp6n;;o;azR>Jl+I0c8RGR;{aaTWPfYZ1=l-FLjKgx0P8}AzyZgF4*?iC@Tb2yZCHO zoN6+&G7V}KYc*>>oc0MfoK+T7^u6yfdcMjq`jfNU5Qyqq9!GN z-N0SrR8CpaBk%jorSd$xu-^<)sOnm|kNx5%)_`VpDZwIErxqL85QCf;GxWS?mtJPIByV?kx1XHii* zQ9IAoQtPT zhxWQe8HpK|8|WIDwkp&Y)HAR4)b~{4S9YnVsn-^++6^`Rg-$@LJII?3)=}XNP%t#u z!p@S^u4ANO=sc}2Ex0>4;YkV&=ko?`EwvGKh-aGzk+`1tPVQ{}xpeTzzszGEJA*mA zxpjekDB%>_utR}%-qHs*6-^5ku@xE$c+L-v%k63&EJ$M&W$-$EuM5$T(+IO`KVsyu;z`l3 zUu)_p_pQ0LxFCIZ^UkAa|J}Z%$PWLG;iqX4SjTwBl*W*2;istYa-obb)-M4s3qU1= z8Nm)IHcU3m81eBgAc+23qO>^N=B8!iOg6r_OO{wRDZD=XV4$Afe*AZGJ^k%b_H4?m z18&sEkYB6wXcmVSaYG^4tWlq%^rNK{-C_(V7WlG+d>6LlJip67$Y;v$A-`UmYy@EZg{Xo)eo^ew* z|B~6ke^Her)!YP};+Zn4G3uh}e`N94t4QLRFA05_6EXbs}mWak$sJ9tH- z_DnykA*7EbK+P%4Y+y2cpdG>K6iXNLAS(EDYwgTb!+^)|d%ML$bOGf%;@B?@L~zn9 z;?VWCTYd+WpIs-vD@#>To*xCZN+xQ=27Xf^;Wtew&wUQ^AT)XuMT!U8$((|dO~Bwg|2liuTU>a>1ZXb za-4p^9i#1kF1YaJ!V$*NO~@bJV|0`E|9O0i@%@$tM|{&KKCtcw+7hh~wH-B&BPjPW zS0PV3_tDtWxLafT-NNe0PQZU3;Iwb@1tksrm9KOr95#=`m(uJm=i&=83W7tp@3+k1 zrO?15tJ&|4Z(J|B@w|R4zJG~3lIWF~HM#8cx@>_T5bAg8=QfIe0-t!DNIs`6X^i#c z_vAKonK*Tw2lTZE+TI>h7K+Sn|LgPrOY*Y1QYa?1-FFq>dOLD^{heex#Dn!|cB*H? zm-W29SEKjSKbbSx4Y}>lE7Hc#Tk98Fp^h-$;;V(N54WgM5p&Ne*GX^WP?BMnU(ep98~^v0y`yd zgpUr6()3UG3GkWy(|bG{@ZIvIz9{?tM&oA?UFh2v`}^i=?fJ^bH1f2x7i6UDtN*M7 zxZtnxCY_a{mKp#AFarQ20s!t`Ui)JJ@a6@86LSC%&jtWe*VIoV3IL$)tt2n2#sA_yRD-k2Zgo|6<-M<5ql}Of5+VWtqLLzFZr7E`6(*G04oQ)TX&*`arO>x(mf<9yFF?!Ba3yaoKN>q-cT#gM zsgG!+O41jU>Hvpn? zd$j$C6}5+shMa5B10nr}MGw%^1$Cg%<=z^1{CKXvzSurJjBDHB^?Px4Rl1}jy7}oz zBTC*zXN};O>n8Mah{OqG-S(~=lv6<%Ao##OfC(rAU%GcBUmUuBl&Ohe#|nqLw9TbK z!H*$saA2yjMgB80t#;E!g{3gYBe$gSbn=c1~ul{j^O z{cHm9f;ay#AfXxy+ZWy4!smue0f`8A4*dp34g(~e zcQl`aq>F=&Voq?vPW5MucJDGc3HTZC`0DDpD-osv(Kj&MQ3F{K>}*@iZWoy~Z#=8i z2b8*Mud@YW-gX4^;IH>I&M!qKOF#Ww=uEBkw4dc01lQQ=SI3-+jo_N8P{6v!`?(@hn3}rmwoKRFy4M4M92G zX7v$zk#;MA#DmKyBSIKUq-0ePJto=je7m@9D#W!60nCmBdY=@sdx+KWNA5-fh$(PG zxInYbYfi>8t)o36*^b3tEM3CD;h-`Z)PcmppD!q%!um5$%lROw)o6_XyMS~DdERHG zaRFjuh!;+a@P`7@;dvj<)d~0(alG`Xb5K}{bcp)N?WW6k5>iu>q_k&Dw}!@-^mg+j z?7q%C>?L{j3|aO9M8+AERzg8BIdbF~6^Q(Z6A@+(gL{ANu2m_AUq76F7lWQo^h2N7 zhd#Y18zH(#KVlfiJ?O9K(W0mSRc;(FN5BnaO~lO%s@g7=*cw%5MP@&ZM&`+7Ro+=y)AD46sB; zKN=eM0WeN0=g$rm$&=O=zZ9@IM@yZp?8IPMco<*FW5wx9WqO4nJ9w%3_$hzxHe@1F&0!-sIVzop@WieK(#G<~x>#GoB=!=J_Nf zMa_VHyJHkUh0N=eeW=J%5Mhzah29s>bQLx#e&W$j^o>XTG}3ODU0Ct@N{Ylx*}nRd zV$jjRusa-JNpIPlwb~^rAx_n~*0jOOOhc=vXCA=X>zX}w zCh2y8wCiXfw%V{-(ZTC5p|}9_L1o-;s(1t&G$!_Wf4xeV-Cpnn5A+{846E9!f@SO5 z6zswIlm(g-jFhEZPS9sjcDyuKSK}`v$TH%EvWF8 zLN~hhhg%0e8%ZY;DI|-gt=}ztDe?#B(A5v{}Kliehj`-3+zI^^0nHw<9 zuMs+FHv~j-U#+N$n|mHsai7Ynnz#fyY{a2I)x7?B?~U-w$Va;+xo~fV-DWwDe1=`~Q*I@aMcDt6f3890+v>8vm|%1rWgMDjd)jbMl>NhjbF!$5e1-B^Y-n z9LM~P|8l}X^+wTF@DBi0f0>>{3qI{5tuP?^??UER>0IYK!yEX;q-I#EE&5%JYnURX!DxT@-j;II&awMr85?=iaCb}9# zROp49jLh9_k8bugGItU`N!V-%XzxC)J^ttEyX^Q~n)2b7Ve{~yv>m@8@YzePNX^c3 zUWi)Nip%E8_yb8*Wr5-Rv;w1*K|;I>++oR)NN8-rKC!?e|1qc!Q))nCmfXp0^aNVb z=w4w6ZP2HvFl?w?bjs&DihnJ3pd(l!g76g4|0Lc=;V!0!HBeURb7Z{;Xkx;Cz-w2! z=-up^o>YW;k|4&|0#Q2ROFHe`O(~$}0I3yr+FwX75CGiyK7l7CoV(Pr=(E15sd6-KQKlY350=` z8^}@ZyAzGtgN9xQy@#`BToehxz&=rrM%-CwZc!But;b#@xeYy&t7jG0IMCy~CO5ph;I#&kAfQWBZRg(u~12&i?O>__X;&NbG9@CDoSEpipou$(_jOJi7EutiW+;3m7+;nO9{wa_dAo7d+Y(q7ZVG z`L|EYmW5`?H)oLPQAVtO{nTGLM{6mspI0sD#b{42<&DK=*@$F+Y*e4j)99kHR?V2Rg`UgLE@0_)nPpL$@K}&r@5mmS~Fuf0m)T7(h=p%!hz~v`w}-C zMxXMW*-pc8Xw>hRHTz&oA%bvXJ^c!gjCSg7FzFy2Az#+pyCz&%36__|?%$Zlt*E*7 zLQdUAu*RAb{6i)wM~3QoCCA8ObAM~$^0Xf2ry?NIyk2(Eg^1fw6(R^K)9d+f0VMk} ze{!-v^fi{jd7Cb@?PF&mS7+j>z)0?w3){G-*Z{|zWPfWR#W9EjL-&=hj4DyvuuD6 z8DXbT=^_e~?qhU`SuIUa+ebQJF2vs38?1uRfsaWV$#o({%R%BgPbOhs(F(?@?m_|U zZ>&y%923FmnOQzIwHefSpnU=ZNkAuml76rGx+#qvlN4D4nPwlq7=<`VNLOP{XR4=V zu=^AK0TjxwF{>n~2`2$nY=a8syTFFsnxxHB&{{_$I z+wlzj%UR)uU`3_MJNFT~X5#^5vq8`kSMJ8YWhy5HyZPU<9&x&Dn_Ja&ksOLBC_o8$ zrv!r=ExsBR-#a?*$ZM`C9HzMW%a^Qc^MH|kj8)xs0E!JgT3F)Etfwojq-Jvz)Bo?!fqkNr=xb$4_rxvIBc#D~0RnS=U1X(u*YmPuwowCh7IAL?`f}4$ZRwTN8pv-9OIR_iY%R60u}hY~AZKRgavg{l&QxNhrh`{lB0>Eoc8G ze05v8iZ~PFsqy7|vqFBxoo;DRL0{q%4>u(f!P}QF35l1tJly@{w-2XMl`cRVPSpfp_XW#osTk_{QLK>JWoqgQ!!ab*VLTS)v{KF1)?7*A9%Gj)fw=rQh$u*GquRXCy4#Q_6PS7y`a~KV5{Z2vq@;q~Og(Gj^Hux~J zV=BE1;!mB9gOedGk!eMTNXfLSihK=+=Fyc53>+GbM|6WTs8Dp{kQ&#F;B<>GAlZ#> zWo#0n;iInN!4DWOQ%$Rl>_+X<&CjrFE|<%Cz2B?-UzZM6FwH_Nss-a?b5=T_dZKw2UPFqUgaS*PG-6;%T!}Ov$vB9c2?(}!vAoQX zH&n&wzB#fnZ$WcmqlR^PPjqyEowmFl{w>vKnIpS7(!RO4Mn&I-5px@CWoDIG#nb00 zX&`i($)Kuf2`NNC5}-2$-EU26UEY95bUK-YM92kqn9mw>smQHUj8T?dRs}l2endgC z8Cc<@wrqyT=Biqv_pZkQ;K!fUgonpqZ5}3y5{414`nlQO#m+o)*}w}4g4vP_Rdw#Z z+vVyt1PDG7D+FddktRFl$%&cElr`R&pmcI*q`;6%Y_5hi@gEE&jj0bdDr%Qjscw>+ zYVNre$F+_7T%Wg+F6%|~yE3M^%p&PM8_UIyQZ2&xN0aU7miGn4dx_PA9?oSUltYg3 z8U^C+ik{AlKghqezEPPFpVM^6MMXem=sxJt*6ykpY);&EMl)rxI@NMbBVnwXEY48BOYqef*-1z&QeLt5msfM{Nc)Q&ikku&qUoV zlN?LwkW7f{L`H5|flI89?SAS9B*@Bi>q*K7H|M+gzUlzgu1QzpnaRZ0%_9#`3?gyW~DHqdZ{cxLmv&FA5pw}K}2 za|G8)l^yFV2-*C~G8s?AOkQq*9BY?6<$M-`L1t8BV-s>&l#nl-Jo9~Y=g6sVHBY82 z6EjBr9pPIOa#vP_bNT`s2Rp@{q_GC50EAmjwttD{1eDVUdK{}b#&49afU9Eub0D->^B(nlqVs_7tY=eJ(uJ;=hB%6nVb&x%k>yg4fZ zdd;<%F4~opW_7n~OpAOY&ylZ*%9rJE4DRz=_mZVi(!&PDHODA353FB`rEU6wj1>d! zqJYT&$g=B(K_QP$g)IxnwM$|#7y&(70$CWc=cHJiar0vvavfZruXe(=6#5`AJEtLz0V^I{-MA&^Ji{~mV2EsxKrOr zESpSyr?($W`bG@*Rz;*e*ga6UVpxeF_x00QTX+;xlb9(13j>Qk0}=g~(_8150Rakw`UiO?>9&;+e5_T)Co( zqAjCLR?5IWBC}V5X;0XHq1p8$TH#r#(ukj%J3A9Aw0cf?YqoABhA8i~z5XkP+$6EN z2zgQl;xsTU7@wHl;6>HnCw3;)`O&F(Cli2r)$6@&;HKUE(!|W>JeJV19^;;D{EGCV zE>{sBQ@t!t07GKKw)ViZ>vFSG-17&c=H}41+^1zIHQqu-UHg0Qzzk7Lptl+GC}ckN z?}8-6iSzSgORDOocUx8~(!L3$alXV`paL`Nm~mrrr=M*mESxRD4zrpCq;D&+)DrK+|dM2Wrf6E=ERb$DWQU8Edhe4!5vhoT#u zFeC3twdGU{cD|{u3dg4^YRi)(rIJ&UGC6e5pyz)BOn*(X+ta6vRITg{pgduFvLYW< zazq^l$yi3mD#VVm)`c&~lnDNVr1QF{tT<_FqM6C`MX%1VdsNlm^F%i>>q(S+^iZN$ zi`rfTJ6Sthg!o!IVfbc+uhRTEbM6^Jp&Hu|;d|!;;R_YxaM6gr*6yt6o)NC|DP{7S zd5N@((&@|OsjH`QBd8%ysxGOX-J+>63UwqEf(7C!ldiD7W>HuKBcA`# z^Yfb}tqdn8z=RTFq>ogy<>lk$e%>}8_|!ne=Y+QH5F9jUT!*hSEH zXML$c`p>HKjMvXAKV~=RVr@A3e-O#0s!Fhqp-lNcm7Z$>C;JsJW7d7$1&(T80V~zn ztnNn=4K;2)SNIg~(63*}L9$TClLU#NtBk;$zK zQ;DYl;&dUaL0jvp7e4Mb$B;_`oUn4xCi|Lt@$xB2%&+L2vnBbKNw9gQM-Ny+0{mHp zP1|rgHK~rq&}gf=XP@bj+>1&N4Y5>Ym242&Jds|t-UXMG2(#vBz(1;97>Sa4s-a5L zX;^3i%!?%ZoEeE-pocYiy$L#vClzpLPHmm({1m9ZW@;110v>S0_EIP;tb6_Nfp+D1`s$Z{%hHpA8{5HC$%FL{pG`t>#2~tZ~cX1YH318 zJvynt zCu9WqgY{GAUSm~>6VKs~;LXXnRYFl}m~*|^1zCR-O|i<#shF6LN(;BOiHEg4a|gG* z`_%Z@$oaPJ>}>Tc%byu+wEIEUQS?l3glGT$Vmc>V1NX%j zc%9kxv~XLhT~<5tvK} zD7Wwd+k-ZagA#QB$l?zC#VhgqsOo$fN&o_UTtL#~LOR7XPDDVz z?%P+YnVQ;33$9uv3qa zmksRqiWlqM(Lg;v92A=~M%*s7*KBsPhB-4MHs>2B!F|u#*R;ODazHW10cH4PgYRQS z>p1H>xz4Qi5fIUEoax!SmHMraTh&enMiekv3s)XYz0?9wN>ZB7VXR)|O76*bnto ztwyS3=ik;9MqH_QMyUy>x@pXE-V!3tUnk}FnyigGf;U<-CbMhmopCM!Z|A@Rl7Y(C z^C7js2i9y*ra^mVgYIbBrjkrB#cWdnC41$jNVro4-Jn!C#q|OcbkTSovP(O^HNB_3 zwt*f%_JUJ(R(+#xRvu!osX4zLA*KH+;Cf-KO(`{3o6*Gu5_~32Z$9oq z9e?4YR#_Owax&x7G2vhSaS}vv?A4E=bn1k)OF2!!*h57}yDH#6{^p&aQnKH;qkr#0 zD?I_pOOA%5;sw-b&aq(ZeMOXoYYF=w%l$aPxwi>a&hAWmdVAc0u4FE$zsWtTjnC>0 z!1z=8RIQ7!lu55e!v3UN>Ew@X!EO5r8}q7_Q-_t{w!)2dhcbsLd9MA2FRLB>HXH~? z!b|S?`Ddc@-euRN3)0?R0(AlJCh)kJB31IEK4wJDvm%R(Me$yOe)%t4cbwRJBYvW5 zS(UkAPkF+%y4H>ta{OV10VQ%C@BoN3=G}v*n(8DW+BNwYZDT}JFSQ~R<6oDUfh#4V z2J;Q*SMb>#&Z3ng%&@ETU>;&^yyg@5tmo)}zB%ImAUV6V4)eF_GU71=$2`|Bw$fa0LjeYv&Z6+I)|dzh3P>BO zwoGhp{_qwFGtT3h$(hL5g19Nc(E(545hq5FePCDG_Kd&nM@Tg^9HNIO*@`s|b8k|1 zOC+p)iflfq&D9$)T-A}e;_kLONQJGEFtD{Fgs*IIwI>Tka|lu3gubT^BY3S4Quy-M zXoF{0|GlK+jn-Km%^gXmEz`IFkS?VBBbRnCm4!}loWsf*S?zMnoh|ZPcB>68_i(b) zW0u=RCS<~z@9+;sf#xwbaJteUtzAqU{U3_BI|L+sO6a4a8e)9O)ygk=h`czmXw*61In*kQ@n&r1rPIcOj-*^-{<5P_btaJ&Wf8e*0Q6`BWEaTZ1X`MT{lj8vD9AOVQaxX%}~E^Wow{#(`W|IPr{njOTH z>)wj`{wjw9f$P>`!)ej^!FO$kqScXY-lD2whd}bvpU={&pI#o;qS)OW#@v}yHsG=r z`IOr&3Vm-^Z6Pl5=x0W7?lS_(KyC<$vlWQ!qV=r#74ttiHRBM?r763IN(`ir?MePm zn){Bh`#rhTNn1K}bhp`(({7C7h6cBMxurJsFKNKhADvWs!&i1tQA0qOd zR^0_6NcAY_P+;9$1izmWFf9IEZS=0-bq@8_cV$?LMtI`4RY=8BDSa}Zk4O^1+JUS%N#=%);plByv=>ayQ%N3= z-LV-otWQ_RSW4VR2>jmL+G2@(hftz{UXtW0GxLZ2GpU(nX*af@FhO?{!Yrltpt>WQ zH~sKvA)l~e-p@gkr0g>rh3k%(l}}bWS)#un9Dv@>KQjK3Vv!e7<8VAP+@U1LIv;uE z`f_^vR4l8{c!w?nGuMc2Jih#M_T7w;ZZY;tHB=ZSZ}3Dbkhhu;9I$WX-Q&j}^wo?_ zSwv-%O*$DW-IV@#OY>=aF&LuDBD{crD%?R$HPH{qCmJ$xO6X^}V>IM~eluxV$!m(M#C55h&TK`|F8TS|BZ%&2#=GcOzQ!;RdI4ZtqmKBl^|Xk z2cRz6VT@TU9)`qJ=OkU4z`)>SqVFnTgDPQW`Yy?e9C*bxZ_wbh2n%2FEI6<+0x^G>W!> z#GEKWYLBDOwI|Ie?54HE;2&wxoae!7;w(5OPKNe0k26+WYj9-}^L^o%6-!5jt?A?m&K zgspNfePz`Mq{@Y-sNQmDR&|%Rp)a=#7;Y=+4#LO8eOYMELseSSS@BxEokxxOaF)C7 z#-@Y8QDGHC8>C8_g@9f%wqYmD-TQ~yhBd;MOf^NL4z(o!e`T-`j??MEUf}4I`-h)z zf`1cdsO}n3he!6W?M0BcOz->UyKh2Z|5j#onx*TmD76*_{cp=GY*HvAFyVN|3&b^R zrZn}47`>sw@8H;|6;+n~2W@=8+DX&*cq0~x&h>s)tH$#!WO zTSAnr`v$7qzl>wXmu(5Qcj^n(Ut(Idx8aSN%?cc0xXhwkkO(h)g)_05eQ8eBR6fFp z6n7~-K$MbPRNGxmMeInOu{K)vab7y9E*w0W!dGjc4e*fw^nJ|VQ32gb0bRg5T31ZH zuPSaP9w|vcPet&i!+VnGom0+?b%1uKv+!wu6}o}4_xhHo3zv;CV+|iU8w6??owtVY zx-SI8X+FK>I+0vAFg5qd6;|JDBhRJdJ($fdaYImr z{mZ!NRX-Oj$G12FG;M69HULUX7iWyU7@u302{a?exl&3hQ%NkO#mkCo`yfsW+e;HG zcywdN4DQ3NCAB{MmYDE)%%RnFhkY|mK1zZs)rfMpkikQp&k-F#S+1$TBwHeq*A7`^ zRKyKotMlh)zZZj?FSSAAQhw7kjyD%$V*rX(CPXk5-6YBOAF|&B1ks#3ynQWtS zzO87WAG>c_ZfPv)*w?-iY|6`Qx(V=RforD`u265WQs-(xou8U8%&CVzt?l-*$m7g( zc|EAp$2Z-%X6#}U@aono^8L-%Aj7ueN=b8$GCq3=gP3rm0kOomz+qez$j9BGtK742 zkD2fCS|O6yNc5*H0sKaNN$niM&~-^+``QpnjK{3jsR-Km0y|7 z)-#Ah{y%2)skoPlNM0W|m(|!|r!!4bOT77OtgpUBN=ZUm)$L~LDurYi2-f`MzqEIOFr=W0!q z3||o%K9~Gct-5zEsNBlmo_19sWV;njqdbTFwOskGWhO8ahncd8iV$UiIzS~0=H zVyK4sPyZm7K>EJ){Skg_meFrSqmH|JV<gmm-m|C5Vr#+Ul%CpziM#QV`{-cr5 z;5m)OhC>odCO^t(#mwzJ7)WK9sbAU{`3L^!NM|f#q$}+*3nPqgwqj&tJoAeE1;%T& z$rk#sw1!7GbZtd!zuq0>MpOxoM);YK=HTh9ewhIb@Gh0-nYw)#`HiG zTzM}KXXm!-y#WyiN+V`tu{k1KAWkgsI&FpmT91`8>20D;S63u7y$s?%Ab!R-;Ktgw zDx)hU+{bYp$3%5KII&NV7Cs_RHQa1|8ji|tn#MVGV`7&}Hs21kIz{ns)2Tq-h` z1(?sMVjWB-BLIZ18n1yZ|AV5!p^$M)dSVxZsc#+j%C`>?7lA5dCE^* z>ua3b2I`iqQorc<=;S@`M*Rf@fIn%kl@v|U0kXj00LR5(LM8R`YpQgx4R@#{rXb0W z9$hC7r9FrReDfqz@chk9wX(3UWJ*E$5ehoOkM6$a1q z*a-QRx<2V4-0{oaNcYtj$VwS+d-#wqe(QJeMqx?hbQG#sHy&WI5^hZBS!$g;nwZ-@ z3da13nRH@CbQw#$g2l9tlU!1DMb_ue(r6=aoLngBx}a~bhI3VSzb~jVjPbMt9IO8+ z6`E%it4nP3x(&ELqZ~!Vn9&NlK^sn8r>9jP_e2eUynblO!}mD zw5A<33j9w6oG=Uvd3Bl*4N44_Hx zEe(c*s3uxMw{>B-P_Kn#NBaQM@~P7{f9mC#2e&WNgxyt?O4tMZIrvdVo`==H&rENn zfRdIrkCKua+|PGZA|zH~&oQ;JRcezR$H~x2?h~c< zg)lai8Bgo?s-DOaZ}JjM+|)uZH#kQ_k7=>xH}w(BJw_Bob5_Jn2ho zd#(-=XPMhUpY*BNQweOCQNte+qBw(ra>86@;D@+G;&u-Yq{3k?^nNOIMg*~Q?e=^F zC!tx`tN*9cU<&KTmevq2sSa+TW6)UiJlKD|d&HUj{4-)RT>15$;;+}+HXJ&8XV$S0 z*n3hlbO!P1_Y6A$s0}H~<&}_kit>IzOipolj=lf63E1KN7vo2*2Bz)@rf2k2_D#vC) zLS2#UcH|0u`7CYo%-uWC{?$qp#^Xp3^WeaoGt(x%oWsBkf%&}9%E8`y|5 z_1^DC^!o&3wjb*N!*6D%Z;qjp?p<^{5t9k=GzYo;70eJd?;xA?B=N}e>7j}is_>eG z^dd$wC(gt~wj{(9{au2^DuOpq%j%d{UjmS|uJoMmic$Z=by6c2lCfXFUimP9jQ@#> zJXnk~tkk1vzr{eV9Dawal*)ub1VUR;y-_atS5tQE2!A{Eq@9bgTTMwyrElg=PG*%9 z`d1~C#rhg%8gSNN(-*cGT?R~utDD*wPw^6NZoEp zS{?zRHlEr#y0m|kTUhv^z${ycO^U)1LCZ`V-I90Sj8n=p#bt4DE$4ZN3fWh)RN(BMr9KE z)RR}H+$qhLt+S1qQtljLKl^w5=v`>94tt;9aXH#R*M3Ll)*Iv0*1^GFcktKg`aVnn zV<0Yfc#;71VW=XLO4Bq?;h-b_%UUnoWQqNiLeW^`Yx4b_D7W(&gUAt8;O*~$o3o`x z>B}yj-Yv1x6IHhSM}*j4_qC1Uk*_(&=Y}L?On^_M`Rx6G0i)`1TjVPLB(w@5q|@Vv zwQ(kTQ|r7fgN$GF$~H?8IIJ2xR7rRHF}SKHn&8m+yuH?aa;R9|xU&p4hxya~Dfukj zVVirXebIkzx|_&3HOMoBQD0t9nJ|*_mlR{y2x#kUE%`zby%O4OIPGb8hJKP~7cGXq z%IIt~t>n{X@X*|o)!Uu%TQR+}Neoxi*X{p`_|9;+)~M}KM~f1UUXl<5(GtB3BGH0G zZ$SgaNG1~a1fZj3QA?>^smz1RC=|JgtGTF<`Lvz~k1 z&$`#{!}_7^^GTK4p=|>yYFXk(KY3=FZA&dM1F#;xHvwq)>F#cM(+D+De$@8II{+nF zjkBTbVP!VUM)Vb;kb+8=`9medxb=Q=8m5nVxl-^PFBnL!cR%TQ`HGub#F78(j0 zpYhpy-`Mav@VP;xPTms8L0%zd&l4mcay~BCcvm=A$z3?OIn#oZL&ZwpIkX}soOKhp z4iMF88dIE~5ihSO7Y{7kd)0<-@_Qm92T?r@ik#SsOKL7%ZMYHf_Z%IUQ=e`S;tMz_ z^nUMD2lnI2EoN~ij#40^7*uWtcZP-%kK48?w%9y7Bz_m{{aWp{z!y#GzwBC)%;8e1 z02M#1$*e{A{R^xz2jeBvA*@iGpe9gw5 z{`cV!$tR1I7IZA~+Rn5RQ2uYF)opu>gIZe1Ux9OVfA|VY#JB7Goz+rOT^@jgqWwgh zuIdyQ7D@AI-qW2b&6Ry3-=mPd6K?+_H0aMWg-wBknaK@(`4F?IwIL_zmbIIG>vtgD z@Sh0Pc6u5%c6uKap5ZCG0}77@LqIRaVkZ7t)Z>-67D(9U)~`2o{~9vKl`wS}r=z&8 z=4V<~lMH??8YKHDM^|k5Fu*k;k;d(w%UF`3YNgFGeG>APw1)?*;koQRiu-I(n%{Oz z0B>#9WqLH8^3J-W;S_Ow%lhK8KA28oy+DL{QP^qW%Y{XJ(3MQd@9w6^~l z3f*Wca0zQ~h_u=I<^HGcM#}YZII^wws?1 zxJRgtv_|cg>vZ7STuIQ2uS6HMzB!&qaVu(B`G{ND#mCc!q4CZCScvqVx)qzScpMw$ zbGOB2S4_whRz6qHU{TI+bK(vVIVl$dOKG>5q(elq5w?_^u1vCZNDqM?r|}ehW$STA z^SdKz@0SG`R&=ukq1}hFl7n5??8#MgTLw`DPrXOa5S@-+izk>oN&WK#r0Usy z$rqlvAH4qc7u*%rt!Qk^uE<@I#Xs}-T~T#HHW*PN?I0s!Er5-Um8uPd2UrTyLq2AtmT1`)nq!ZH0lkF3%0qP{=d)Z68 z8r$U(-Ja`3{g+<9G}5Mz%%=u9K;kQH(#K1_9%IcESo1FMU6)1l%$oD`9<8)9K+X#Y z)6@A>4Q&0Kxf$FcbZp#T1%Fbky#bb706VK26^A+4iRSyDqpvq@3w@rhD9R|{-TGFh zEC_2RhcAsP%iBIPMcvT!;;jG_n&%}H(So1rtxIC@c`yy!fojQ_85kH4C5M~fYaGMj zNxth%httL_r?LAaXiE_K&CP>o3kW*sb<2=Q*HcwslQRCh#sE8s68>W)KwO|?AFMdR z4goA`sN^Z|-rm0?_j;47Z)BOK0&TSa12?Z%Ql0g#cirW^Na9&V|Hx|>wp(|xzFdfc z0{+w4UFuX09isMKgsI&0Q!k{JD&63MT-Y@@tY(Wuh_qef&WLUmgXeu`Hu0a-Jqn00 z>^ejtUpLz@EXYfDkn$hj z&W@_RrTZ0LR?Ux|irI4%Eo(i_Pz`nQzKIb~`kV3%D`_Gquu=9%{vPR33!Wb+k|&k% zxNa0D>lPQqtb^)XvQg5!>_U6xZ5Wn#h6p?R-Q>UgQ#}8?;#?~ zgcff5nwAojv_2xCcr@<6@sKeXtd{H}%CgI+`}`D#?V|#W+w6@g2(xylT$7XHjZ@ggIrYrN?YtRgxyRV`gYOTWwp5D zBN9)hlo>k+9$~jahTOS%Dk1Ba$C+uuRZ9sc36-5{&Or9qn7QIJ6-X>kt2KEn`d%s_ z>ia0J+-kB#@$K>$=KCf?##{3ojq%6V0V)})UVpl5m4DA3vRJTk5cn!|PAj1t?r-OR zxUYE;RpvMv)bH*+T@=ps^0$$;pCY{{B?&#f3;0aa@C^VnYTKG*aksP*ZME7sJjZzf zTgSZK4F?629sAdSqI_L|dV4(KqQO3MYf{Ko9rf|E>*W54_#{&Vj;b~GqC?W!pis6m zm~Q@1^%u_UwT_&IiB45`yae0-Zw3!Ou;-Eb3gOyS5aJ5{U>BaU>cthmbCQl(MaGM! zRhv6lY_tBjzXu`J3>Hq-M4hA&lSMcp)*fQVaYU01#x%j2V9f*lSAAFC9y zfT04OWVL_4O-u0{CiW3;wP=BQU_uFs04l09_4%R!Whs^OF#yEUFfCeXa+m&@V50P{ z`TOWSN(-UDycSFn&Ne90NKewtNwXt&v^y{)XlplL%+W+pnY8H;S$fJBddg$jpo-48C#mV#=WS11q2^qjW5ss6YSFYsDq4+cL5bSu@+IMUSlwiP`46K zy1m%gxH^^_o7pX+ziVETq*U+vk>i#AedyFLoPhOX^(p=;`<2I;haZ;RRxA{O00+|+ ztwVHjV?K$wfM3W^*yD}~>k_?^pF9XS6--C@l;J!u)1&yn_VeGdOP*lEWf(?Ef10rC z9JVzfC*FN9wG~lceDKi!*0qQZq&O2c_fYl1 ztW-OsH~8u2_!@o-$OhA6O)&i{{(RkQYjOL0*ps+DY)I(UDT27d2PU<*wuvAORBtk%XlNFUK6*r+H4~{veFq!59MdMC_bu&_&RxNH?bv${ z6i6?cab>y*B$^#*!#tLp95AKfu>S`;;s40@cua*Zv(S-#J?NA#FXV}|=q7=Mqdm_!x*=Iv!)p=*+K|}T&qo2Rpij zz8!$%NA&+mesbu{XBugIcf8xJGk=())52qU-zEynoVY0ZgtR`rNf)TEYq!)^0ROUr z2$eyXdj{Cv!~j8*gqbeq{*Uwn)-?$9&GBN6z%#(+zO6n1rdd2)r z(5IA4$NpAB6Za#}9Jd%k(X9Ug>o^i+%!*;C_a9#ycAd}0O$%{HLJ;gmuqsA@03jL@ z*Z&~mh^JxStSZ$5=8UMqW%yfJ12n~{s|F699V(x&Y9Ur_{{!AOZ}LaXMwEP!;zLbF zW^$}vj~{?OMON~~>^E_}lBl)*(x#AO_S3QMSd2|8`SOpV=Z^O`O;fE;t<)BMlh)Y6 z*0yUrj#sll%BO%gM)u6jPf9#h)G$$)P{R3@1hKl?_c9D07uG*)T)M)i>H5$p$BQQ- zzVZ6OH^E?71y4@Ja2AmA|9hqzT?%WOf@~{nzeX}zG5&yxAV^alCTvr>3$-tf#J@ua z0;&4V#AZrHed~a_Q*Bg5?3}8b`#YZwKW%Psu@MsyaECWNJ$(|k?H{_0TOd9BL?-l% zZNBSVsr!6P-|kvtGYng77j!(&3uBptU`V643?kV$;hIXRy`*nk)Lgb3trY74IjyZz zZg-|=b&_*M#x5X~5(Jfe^Og<}nUhW^Hfc=LF{yg{<-GCb){K=nBr71Ab`uN)Udbhte!-Pq$XJ(uml4=^WbSkjZNAFLls&1eUVbJll&_AO1Ii%!zbRdap$ zWm=<2!uke6o1{aa7-Tt4o;oWzRvaYK`D$X*5ZShBF^N)sIUC)~m|-)sMZfCPcNu`f zK^1AxC(V%4gy!0qrIJ@I-w%-m*Zth##~sIsb`8!=lQw5zcnDE~m5r@X=a)JaBOq<= zag;8q`wFNY6EgnXB?o=yymTuu;*jIIWCBE@pBZ1INvj*VF798wK2rA*Td}Dq85?j> zthdl}Hk&^^$kCovUXWg-3*9Pec0hH(fQUW!;3Ec5SpV2v=siTK5>ACyF#{4+w>Q;< zv&$6Kt2?(li_X@+sP8Yi2(ibvx(My}g}Xb|%#NE3@K}1WfTkL)?i*Kr;{0EAFzFnL z{Jl_Fkn;~G*B6WbCkK{=4_<%BJDtql$a~UI+{lkPL?tR6w~)2kTVvnH0$b$`>5)U;Pk%ZA%H+3JeRG#}@4jRNi8OA# z&*_Xf)ewG9wP>zH#l_$2-V9?mxAWU^2gP+?BD-NM)-CRVXb{@E8;?8(bp?+W;4R(f ztMbfMZ>mvnT8R#-BxPN#|`N#j}J*r`UB)piF9vskYx z|H0G^i&)E4+xpx9mCu)y`pMIb7H#5=o!Up92aEMw%_~=LKcyt85XVzs2RgYF`UuOJ zE^KXziXUKeG1cz6wIHu^Z$$Je?9#3)8H){+6oj)!+0(tO5eyOc?WbaN=ItmG7eyHD zbDICG|AviqqHt)O8-ePh&tjBS0qp1L`Qb`9ybpD|fLK+vz7dXj2PXcOAUyat@pjGw zKSvp2gc9@Go%%G%Uh9+=EhSm9)-_4kRY!P1uQ6d^cTt2Rj6G78eH#AdLU|X(ECW{W z3w}f0qz~e45_!*~lRDHNPxhd<@wkmruKQTDIxf0Nk1o2FQxpU2fu;l^$ zA=Vt1`qbUtywRbB*flu;`U1OboWHs~?+)S7)6*kClcED_8f}{smR?=9A)NIeMlr-E zdwtf>w#Ioo)>|&$^e~`DM8zTW=#yi@YANb-mfpq#x1Up&b_dR#;nU3r9J4&RVx{9c zp8n8W>${#3m{nXbLfZjxL_Ba7N8)Q~t8hIG`Mv&pVcfGWKmR~7`B!Iq⪙Ect*I= zGx4`VXB8{+pPa;KY{ltcJ6$vjCER3n`rGGFR&{PEE(fgN(Jq}fB(9c*5jjw1PWO?| z-33j#-qT^s!!FGeY&YaW*X1Ub*>*}kK#erbI>3A_c7T}uon>4;VeLu4Z&X45*;yUe zv`hh;%M+N{v}uP=kM|3;t;Oe59$T?HUlI=01tlUr>lS|-mVMzk;!pQHYXF8{+0 zjEdZEfFjkHZYTwH1Wc-QyEdxP3TTF0c`-ZQi<8RLb&I`}4#bf~R}|BGIeh=bZD+Kcmk+d+vyZE(|KPlsu&jScpwpW$&WUP&WNIp~#*d7@) z()1(%$#4%#EYh_|6i11_=z_$M2-&rBX!$x(Az5nzk-zS6D+fpccwPDc)m=@8mH}0- z!X`WQ+!G&>(qhk89ebVM>Xn4HR zq5&dm%P$vAaimQ!Dvwub$DrX6u!Z_yIhvT>*XHA^gqanLMNhw$)+eE*k-(;KS@J50 z%14!-$#p=yt*V%lXAC94tSL|4@Vv^($^kjl4Ye)oQlp+1`vKS#PQrU~tIKHtq&=I+0eM7_FVfZAu zlO@+`2Pl+R$S^;;FHnkbR`I8yGG z6A*CcE(%I+59ev$KMI~hS6F=CjJ6xLs(BtBX7&yd2frk-1(NWBLA1LkDJlC}Y8>wv z*%y);GB{OuEg+hgm4l=JCmy#_C@JkZt%Ze6e{XLj5mro|Xmq4W-W&vt+QAPN8&Ny( z7kycfP0l_uTXRByg;2 zdR&io-;O$)@0p1wYI~VkpEB0uLrE#~7=x;}RS2zdd?RGSq{1ZZ{vK>3EU3Wk(z02X zFJBA5ATe>VZ$>|x!mX{WdaYW0I8uBSV-ikJSv_M59lX8of+Q8CBW=XvfGWE1uO-fK zQ;?pxeI+RK_-1BB)cp&ZtAwJ!`#x_S$in%_`%X})!@@U)f2uQute(4(G{^JS&VlllRHGJwpRC++yK(kia{} nmbY9@_dS8PeRGQhA_=IV08^2FmmmrZs{`pgH_)uou#fy7SW6gm literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_hide_icon.png b/ui/themes/icon/vc_hide_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..88d3fa19b59b3b12f88053ad54485109911facbd GIT binary patch literal 5257 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 P00000NkvXXu0mjfZe#r_ literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_hide_icon_dim.png b/ui/themes/icon/vc_hide_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..03f7db66f40bbd928a08ae77ac8fddd48e366fe5 GIT binary patch literal 5206 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�zAFzliJ<>=b+{SZ%j94>0FLSEJuLs5ft#SDGE7yF8-JCCw^Kjm)34 zs5GD&IOaMVI;$wEI&?C1>Wb!^J~aJ8520(?>6^CZaTgoW?&we(CtF&l_K%Gp4l}zm zL*IoaU(4c=#C|2MV>V|F^KJE^k}{TB$sa2`ln?#*J9|&i$#k52d|q?|eP@KH-vwn@ zFs(t>Jc@mcxuNg5SkRvBhz&Nn{se4ny@6`LrdeGDO;A{F@lk!BxSwe2B^`FHP+g{TO_k{`4cQf%R-BcPxF(g)~|(Y^DO+i!z)4tF@-@GPIImo-fUC^H!*^ou z$$q!0%7G50y$7o3!sjGKo)=Dn+Ptj4Pyl<_0IOFWSM zqi6-+R!0<9O0iPmy~R1r=7a~5|IS*dQ}$c*$fZ&)p>b|%{CyVJJg^O1Uo=;oV` z9*OOOceC(@+*;D=am@G$(Xh&0ggN&YUc6=}2NTElqw&L%*>yz^Mh`x>3@@fVEc{t~ zdqCMoxt@Wph|x6RXExpLu6LDemhlc;B;26Jc@SfaTQBoA0nO_^t6O(qlG7O0%^9Ta z7H-))9MRhbaoZ;{BHW4&-Cz20@I=>C&}_BM<{}2gC`TQi&`7mNn?wC#o_i@^i!s)7 z_Q#qn=j`clZTAKU4O)W%r07Von6Zf^(-1ejI?JR zXB{rpFI&#!8{=#D&a*GwpET&Wdmju!r=Zt(Y^3Nf9W%4cQ?dwy)VT-ys-%PWdTvlZ z{rO2GNQ{yT2fnd+DFtrsoe`{_-6fG)c%Bqozm7M3?>Vy*v!E+1|2SWzz%c*P!q(!Q z?q|8lx$i4MSE`Hm$O^?|%mOt|5JN5tdlA!_PRHX(s4P@yn84p9>%}s3@Q&Tsswr=|Ni96C=(qoU0-})UlFK*p2d25pYTFT1(yWe-2o6Kq5!Op_Y{Kk&QZXJg~ z-EF~+XM2oA566~&cL)BWxt*IWl9XNUJ_+(X`*?P`O0yj1!*xA2()rb&>#(6qx6A6c z!hzyf_;T#5yv5DZ{LiHqt{DH4lgTC3Gu-IN@tgG1R5CbDYF_F{3`xv>(IYuY$#3#L z*Lzo0@NxTb&LY~IvYU}cS{lKy^V$6`W0Sd)r8&nrneW|0Dz3j{_UT_Q4)hJ&?HLLX z6}J3se0k98zvR#SvwW3IcQb_L1^2D<-#4d*6IGX)^qHBr*wEaQD?3sC#eaX3#ZJvY z8-O4V0FaRY{Js6hJpi5w0r1@#0I6I6XgxEmKB@qKQ>Ct?hzMBtQRwFUSeY)SxMr_V zEZbd4Gk;EVmfNy6KA?umE%QF%$^tSW2gx2G!K*>l#j-0%{VF12qRg~h@l{;w1)QQ* zTf2tevN_9j(zSr*0f+n3`i4_2fx&w_nk@p$qn6u0k^|S9f+g&?fA~6XU-q17l|`^% zc>J|}@tG9xCLn$Q_5X;$s^u-Vk{IBFcwikuw;@%VfwGVzyd%gFX%i70L$p_#!5s0U-=b-9HS11`O5IO%4P{Rwa1z{1c>vh((~AL$woP zP1-~fKz@$@wzUv~H3M|Py9!nm&;tYj!;S&$N3s&u@5{{n2KVm*g zcqRB6dWJPiYVEi{Dg*t2GY9;Q%{fGHnWoHj*}KrtVX1~w&W2NPMCHXXfh~qbX3~dW zk0X^V+z#DQnfNI_kh{a-E_wg;9oK4Xr107e{-PCUtgl^$&!-HN9yX!4qr?=|i7!Ir zx))F7yma1x6s&2Yv=BU>qW#k_LYaoP74PPI40hYpZiMg2h?T%kf9r;sad7$SHJfDX zY0TV3HsT1h&RzOiIvs~p�YaA9!@oOH}$Q>@Ibw@17)6Tm;cVQ$b>jv)jZ;7Y7#u zX@t4DC#87FOATrKDdAz-HNT-hZhWbj4UvlhN-PcP($4Z0=bh@Ez(H)7Xp@dXt$iDB z#T+eDi2`3<+-{)dJN;G)XPsXgmK6w10dTUMrw5%;r>c7+6b+>hz1*bJj_VO+Cnzp( zrMl=TzM3>1KZ((hOzz0O^*m@Qg+^IO&jESSjy5~iObcldadiv)(B2H3^FqGEQ<~Q< zDUWzsUNtgf3B2sdkDIp<5W`eZJTXBf6%k0gq6>2hmm*IIaUWTd3Y9;%BZaPNDly}Y zVGFP>N$OD~Fs$9J;qFO?^;niUS7GXXz;qpMK+**L4Rrt{K>N6Jkl>-t!h|k{*ScjV z@RtVGqkC_WUT3a%CQ93G`srF|&j;^!sWhBc8`OSNu@?72WURAV_ffc{$&AMsyELdi zct&^`HST%_te~L-xg++>^(`}l+fn lF8oUWt>v|Zk73APX>+JNpT>B_VSIZmC# zWHHxA>!I%0tEK4NKx^?M@}s*GWHN;H+1yu=6>^Q50jv4gGco3g1YUj0@#@LJq7x-; zE3mi0!!c62ew7HO-R6MngDJ;JK+1`_hj$|~fJjFP=j$XU3Cj|YcXAjFn=DTm>qn}Q zm7378h0J#wm;Dm)Hho$%N_Pj(k~;2*BDq-lf&xmzy8;o+qqHu#mCFIB*L$+4qZYm0 zT`PWGF3OHCrZqi3)fC8g*BhSy8_!_fj@-{V!J(XWG%xIn5BhR;tulT>%2N>&$>NM7 z;Yg3NcxmvV0?P~CMKdgut9icW{7XrXAfhDkh>W%YI~j(T9wNrilkZeGcivO1sW-&! zJdaCPp_|hs%39E~5VHD01Y%3OSDd_Ac(X}#+ta~MBR6MIi5$I$6fc9kVIl4*VMG5?o5M~26 zFMFPE(jg3tcn>scR=PC!&+hRZC`)nu?-DXA{9jh_oUVfQ literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_join_icon.png b/ui/themes/icon/vc_join_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c9205df94b2a5b0ff9b15d487f5dd18c1625bc40 GIT binary patch literal 4348 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_join_icon_dim.png b/ui/themes/icon/vc_join_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..15b25ec4effac2507650b18c91e11ab35685edd8 GIT binary patch literal 4350 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_join_icon_press.png b/ui/themes/icon/vc_join_icon_press.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc3ccde95a4abf9d3e3a3a79753060867e6869e GIT binary patch literal 3598 zcmV+p4)O7cP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009yNkl$ zW-F@Mr zDBe3~hnC{`%Af75}@4x9scQyBV9A!pvC12Y8|LK+W~n@~)(vz`>!&PT%# zBLMFb0h=)%kckkkUT#o!Xu5O&@Wa5hpGzGX$~IbZO(9$dsJc2a;lz2vd&f(r3)3BG z)h22vH#)a;UrTZ4^4b8VJs<`EUMv>czBtjU8*S`~#EP?Wy+%C3Ui+(ZV{|P5t5A-6 zj1R?)J9%xxjXN7@!{)ABUx-y%a;%jlrd=7DP8%l6m?rHs!zY*A`mdH}bAhX~L`(pz zq%G$(K*$q!aXp*^*m|C~aUEba>+a#^Ze1#FO#7aAf8mS#3gFp6fB}GGQ53$*0IQH$ zqwLJ&jzRQ?Oj=`nHztC+otfSf%Iv~VcyFoBGZ7hsX5>pbFqGQPMR+lQh39#PAt%o+ z6tX)54yo$DS9$M2v%bv4b&1Y}*#@Xn{~b{7`XvpyDbxV?jIs%=J(0~EgO>r=N?6&L zr8D$wxQ+!d>IttZZ(@rN)R^mR0}OlSJS#W$seoU@(vF~MfK{oYTslauv!y4LT^(yO z4N$c}P6b|S(RDUI-wMD;vCc~kE#>mDTvwN=Zj3L5vafK{Cch_B?=>cp>w39PcU#kx z10NOPnQkJiY7@{X%?T3@RCV7P4z{vf*jSGg;3aUg59ovg-_YG+T{0Gnsupkvq{Ok6q+3>3yB1UNi=v#E!#F2FAeYhDoG z@DP3_Ks{vy*sg8M0zQS^M(K2xat<8 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_keypad_icon.png b/ui/themes/icon/vc_keypad_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..75ce6ef1136e610021b75a682175732cbdf044ac GIT binary patch literal 5212 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 h--kdm-swHj0b^<3alJ-dF{|CzazO(=U literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_keypad_icon_press.png b/ui/themes/icon/vc_keypad_icon_press.png new file mode 100644 index 0000000000000000000000000000000000000000..a551ced55e9af446d48c9dc16a3843e54483af29 GIT binary patch literal 4048 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_live_video_icon.png b/ui/themes/icon/vc_live_video_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..092e622a4f3894ec8533c545f5603656ea73dfc4 GIT binary patch literal 3865 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≦0w9$E0FBpMn=VxVaFjKa6^#RCf6dCPGkDQLejnUTwv=ia zDYRVOgj(%95%3x1Gm9;sR$(NnUoKH@GpJcE>JXUNjtZ;P)!~jA;~}AMqD+THL%Erm zVrl*aeruC>OI@DcGHkt=vK7kk<6?1vYxr_2@PKIe7&98AoPolkOZ+!s|2I1DhmT({ z5hvl+;A7m64@ptV%^q2I8OK4@;TN35CtP_e=lO5#Xk7uv96D*xIjPTacJ}Gy)6W?+}SL9@`j597(%8B$VGGB6)-gA~9nl1a3B_;7M+$|o?; zRp#v08mT8LEnU9B&K-{F>{R}yNdYvKqSw2-ai7fLf+cv$0a3+-+pJvZ(!xT7$DAtR zjDM6VH>Iulq`=FBF8fGNR3JFOV(j&j!(Z0v_)gfL2SHwo zw~YZW^?MvY;uz@f_I`{6Qa&Ic-~t9(*iqNe-%41YdELK@4%*$9X!wwy^BMw`=BU9I#YPXh41?wwkJHO?~}cNrsm=`e}sQ z#v$hpK0fziQQcms%QPnr!iYQJWPD;JCLF@DvTrsvHiF$}GBfGO9N&+kB%YX077^s8 z6be)}vKY#ul8jkXqD>*>wr}-AS4w=AG-?=qRe4-{1-uHa|;>Fc&f4^q6TbM

Z8!%UQpEG z{fMf!*y9@2nOc)w$&ew#VdYug-rnXvJWZ{xs;cr+WxuPmC2V3ajEf8YRyyRv~fc)zoprN9xT%~0D F>VI{0G1dS8 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_live_video_icon_dim.png b/ui/themes/icon/vc_live_video_icon_dim.png new file mode 100755 index 0000000000000000000000000000000000000000..4de8fd1a8a78138ed77a28623607f602dba0a2ce GIT binary patch literal 3814 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_live_video_icon_press.png b/ui/themes/icon/vc_live_video_icon_press.png new file mode 100755 index 0000000000000000000000000000000000000000..3324efed876a0bdfff9a263234ea40e1e0d89807 GIT binary patch literal 3481 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

A~u~(H6%1zk!2j#Vkntk`!rDk#KN!0gYhgSc%0w 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 P)d=WlKGwjh*@pigEHpDn literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_msg_icon_press.png b/ui/themes/icon/vc_msg_icon_press.png new file mode 100755 index 0000000000000000000000000000000000000000..c31d5d0abf462fa834385427c7faa5c7d8a644e2 GIT binary patch literal 3649 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 LA_G-$`>_83u; literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_mute_icon.png b/ui/themes/icon/vc_mute_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7811cfc0f62201762c0c306370fc44c2686abd GIT binary patch literal 4795 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 V-`_@capeF2002ovPDHLkV1gVc1oZ#_ literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_mute_icon_dim.png b/ui/themes/icon/vc_mute_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a28b7362ed9dc4ade079f654b70185e720ac13 GIT binary patch literal 4828 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 F{vXh{E>r*j literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_mute_on_icon.png b/ui/themes/icon/vc_mute_on_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..780fd1af28704876b2b3b3e87ccbf6a66f02b99d GIT binary patch literal 6131 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 FV1ii?gb4ru literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_mute_on_icon_dim.png b/ui/themes/icon/vc_mute_on_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf810d9a8eefc0d4576eeb40e4e3f05b1e69fcd GIT binary patch literal 3690 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 b2@eFQ?czQ#G-J(e{~TMHAI3j9=pO!Wrl{qP literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_popup_arrow.png b/ui/themes/icon/vc_popup_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..74cd5e2ce0575785b6c31aef91e3c34be0fe1bdc GIT binary patch literal 1430 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 Cc9nSm literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_speaker_icon_dim.png b/ui/themes/icon/vc_speaker_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..1c68a0eb1e8b3577e451eda2b8e82160c3886f90 GIT binary patch literal 4047 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_speaker_on_icon.png b/ui/themes/icon/vc_speaker_on_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..28b462e20cee4b57da21584ed1df24cd30204220 GIT binary patch literal 5619 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 N002ovPDHLkV1n>*YGwcc literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_speaker_on_icon_dim.png b/ui/themes/icon/vc_speaker_on_icon_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..089dc1732877b49f216178778fc7a2dabd4b8485 GIT binary patch literal 3216 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 qPWzj0cR8eTSsbg`24+A#tS`v&2K;^BWe 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 literal 0 HcmV?d00001 diff --git a/ui/themes/icon/vc_voice_call_icon_press.png b/ui/themes/icon/vc_voice_call_icon_press.png new file mode 100755 index 0000000000000000000000000000000000000000..8ed30b08b6c3706e6a2b89652cf1d18ce33f7f79 GIT binary patch literal 5084 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 yk>uq415)8!Z~1qq<^jwDm