2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "vc-core-tapi-evnt.h"
21 #include "vc-core-callmanager.h"
22 #include "vc-core-util.h"
23 #include "vc-core-tapi-rqst.h"
25 static int barring_ind_type = VC_BARR_IND_NONE;
28 * This function processes the current io wait states if available
31 * @return if wait states are processed, FALSE otherwise
32 * @param[in] pcall_agent handle to voicecall agent structure
34 static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent);
37 * This function requests the TAPI for the ppm value for callcost
41 * @param[in] pcall_agent handle to voicecall agent structure
43 static void __call_vc_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent);
44 static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata);
45 static gboolean __call_vc_download_call_timer_cb(gpointer pdata);
48 * This function retreives the voicecall engine specific end cause type for the given TAPI end cause type
50 * @return Returns TRUE on success and FALSE on failure
51 * @param[in] type TAPI event type
52 * @param[in] cause TAPI call end cause
53 * @param[out] end_cause_type voicecall engine end cause
55 void _vc_core_tapi_event_get_end_cause_type(int type, TelTapiEndCause_t cause, voice_call_end_cause_type_t *end_cause_type)
57 VOICECALL_RETURN_IF_FAIL(end_cause_type != NULL);
59 CALL_ENG_DEBUG(ENG_DEBUG, "EventType:[0x%x],EndCause:%d", type, cause);
62 case TAPI_EVENT_CALL_END_IND:
63 /*case TAPI_EVENT_ERR:*/
65 case TAPI_CC_CAUSE_NORMAL_UNSPECIFIED:
66 *end_cause_type = VC_ENDCAUSE_CALL_DISCONNECTED;
68 case TAPI_CC_CAUSE_FACILITY_REJECTED:
69 *end_cause_type = VC_ENDCAUSE_CALL_FAILED;
71 case TAPI_CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE:
72 case TAPI_CC_CAUSE_ACCESS_INFORMATION_DISCARDED:
73 case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED:
74 case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE:
75 case TAPI_CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE:
76 case TAPI_CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED:
77 case TAPI_CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED:
79 *end_cause_type = VC_ENDCAUSE_CALL_ENDED;
82 case TAPI_CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED:
83 *end_cause_type = VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED;
86 case TAPI_CC_CAUSE_OPERATOR_DETERMINED_BARRING:
87 *end_cause_type = VC_ENDCAUSE_CALL_BARRED;
89 case TAPI_REJECT_CAUSE_MM_REJ_NO_SERVICE:
90 *end_cause_type = VC_ENDCAUSE_NO_SERVICE;
93 case TAPI_REJECT_CAUSE_CONGESTTION:
94 case TAPI_REJECT_CAUSE_CNM_REJ_NO_RESOURCES:
95 case TAPI_CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION: /*Match as NW_BUSY*/
96 *end_cause_type = VC_ENDCAUSE_NW_BUSY;
99 case TAPI_REJECT_CAUSE_NETWORK_FAILURE:
100 case TAPI_REJECT_CAUSE_MSC_TEMPORARILY_NOT_REACHABLE:
101 *end_cause_type = VC_ENDCAUSE_NW_FAILED;
104 case TAPI_REJECT_CAUSE_IMEI_NOT_ACCEPTED:
106 unsigned long mcc = 0;
108 _vc_core_util_get_mcc(&mcc);
110 if (mcc == CALL_NETWORK_MCC_UK) {
111 *end_cause_type = VC_ENDCAUSE_IMEI_REJECTED; /*Display "Please verify SIM or insert valid SIM"*/
113 *end_cause_type = VC_ENDCAUSE_NW_FAILED; /*Display Network unavailable*/
118 case TAPI_CC_CAUSE_NO_ROUTE_TO_DEST:
119 case TAPI_CC_CAUSE_TEMPORARY_FAILURE:
120 case TAPI_CC_CAUSE_NETWORK_OUT_OF_ORDER:
121 case TAPI_CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE:
122 case TAPI_CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE:
123 case TAPI_CC_CAUSE_DESTINATION_OUT_OF_ORDER:
124 *end_cause_type = VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE;
127 case TAPI_CC_CAUSE_NO_USER_RESPONDING:
128 case TAPI_CC_CAUSE_USER_ALERTING_NO_ANSWER:
129 *end_cause_type = VC_ENDCAUSE_USER_DOESNOT_RESPOND;
132 case TAPI_CC_CAUSE_ACM_GEQ_ACMMAX:
133 *end_cause_type = VC_ENDCAUSE_NO_CREDIT;
136 case TAPI_CC_CAUSE_CALL_REJECTED:
137 if (barring_ind_type == VC_BARR_IND_ALL)
138 *end_cause_type = VC_ENDCAUSE_CALL_BARRED;
140 *end_cause_type = VC_ENDCAUSE_USER_UNAVAILABLE;
142 barring_ind_type = VC_BARR_IND_NONE;
145 case TAPI_CC_CAUSE_USER_BUSY:
146 *end_cause_type = VC_ENDCAUSE_USER_BUSY;
149 case TAPI_CC_CAUSE_USER_NOT_MEMBER_OF_CUG:
150 *end_cause_type = VC_ENDCAUSE_WRONG_GROUP;
153 case TAPI_CC_CAUSE_INVALID_NUMBER_FORMAT:
155 *end_cause_type = VC_ENDCAUSE_INVALID_NUMBER_FORMAT;
158 case TAPI_CC_CAUSE_UNASSIGNED_NUMBER:
159 *end_cause_type = VC_ENDCAUSE_UNASSIGNED_NUMBER;
162 case TAPI_CC_CAUSE_NUMBER_CHANGED:
163 *end_cause_type = VC_ENDCAUSE_NUMBER_CHANGED;
166 case TAPI_CALL_END_NO_CAUSE:
168 *end_cause_type = VC_ENDCAUSE_CALL_ENDED;
170 CALL_ENG_DEBUG(ENG_ERR, "Call Ended or Default Cause Value: %d", cause);
175 *end_cause_type = VC_ENDCAUSE_CALL_FAILED;
176 CALL_ENG_DEBUG(ENG_DEBUG, "Invalid call end cause or error !!");
180 CALL_ENG_DEBUG(ENG_DEBUG, "Engine End Cause: %d", (int)*end_cause_type);
183 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)
185 #ifdef _CPHS_DEFINED_
186 if (_vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_ALS)) {
187 TelCallActiveLine_t activeLine = callInfo->ActiveLine;
189 if (activeLine == TAPI_CALL_ACTIVE_LINE1) {
190 pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE1;
191 } else if (activeLine == TAPI_CALL_ACTIVE_LINE2) {
192 pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE2;
194 CALL_ENG_DEBUG(ENG_DEBUG, "undefined currentLine=%d", activeLine);
199 _vc_core_util_strcpy(pcallobject_info->calling_name, sizeof(pcallobject_info->calling_name), callInfo->CallingNameInfo.szNameData);
200 pcallobject_info->bcalling_namemode = callInfo->CallingNameInfo.NameMode;
202 /* If BCD number exists, number should be shown even though number restriction is set */
203 if (strlen(callInfo->szCallingPartyNumber) > 0) {
204 pcallobject_info->brestricted_namemode = FALSE;
206 if (callInfo->szCallingPartyNumber[0] == '*') {
207 pcallobject_info->bccbs_call = TRUE;
208 _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber + 1);
210 _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber);
213 /*mkjung_2007.12.19: check callInfo->name_mode if override category isn't supported.*/
214 } else { /* If BCD number doesn't exist, cause_of_no_cli value should be checked to decide its presentation */
216 pcallobject_info->brestricted_namemode = TRUE;
218 pcallobject_info->name_mode = callInfo->CliCause;
220 CALL_ENG_DEBUG(ENG_DEBUG, "no_cli_cause = %d, name_mode = %d...", callInfo->CliCause, pcallobject_info->name_mode);
225 * This function handles the incoming event
227 * @return Returns TRUE on success and FALSE on failure
228 * @param[in] pcall_agent Pointer to the call agent state
229 * @param[in] call_handle Incoming call handle
230 * @param[in] callInfo Incoming call info associated with the incoming call
232 gboolean _vc_core_tapi_event_handle_incoming_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallIncomingCallInfo_t *callInfo)
234 call_vc_call_objectinfo_t callobject_info;
237 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
239 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, number = %s..", call_handle, callInfo->szCallingPartyNumber);
241 /* setting the new member info */
242 _vc_core_cm_clear_call_object(&callobject_info);
244 callobject_info.call_handle = call_handle;
245 callobject_info.call_id = _vc_core_cm_get_new_callId(&pcall_agent->call_manager);
246 callobject_info.bincoming_call_is_fwded = callInfo->fwded;
248 /* setting the incom call telephone number */
249 CALL_ENG_DEBUG(ENG_DEBUG, "[callobject_info.call_handle=%d], FWDED Call: %d", callobject_info.call_handle, callobject_info.bincoming_call_is_fwded);
251 /*Copy Incoming call data in to the callobject */
252 _vc_core_tapi_event_copy_incoming_call_data(pcall_agent, callInfo, &callobject_info);
254 /*Change the Call Object Call State*/
255 _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_INCOME);
257 /*Add the newly created callobject to the Call Manager*/
258 callIndex = _vc_core_cm_add_call_object(&pcall_agent->call_manager, &callobject_info);
259 if (callIndex != -1) {
260 /*Set the Call Manager's MT Call Index as CallObject Index*/
261 if (FALSE == _vc_core_cm_set_incoming_call(&pcall_agent->call_manager, callIndex)) {
262 CALL_ENG_DEBUG(ENG_ERR, "Problem in accpeting the incoming call, Current Call Details");
263 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
267 CALL_ENG_DEBUG(ENG_ERR, "Problem in adding the call to the call manager");
268 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
271 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_START);
277 * This function handles TAPI alert event
279 * @return Returns TRUE on success and FALSE on failure
280 * @param[in] pcall_agent Pointer to the call agent state
281 * @param[in] call_handle Call Handle associated with the alert event
283 gboolean _vc_core_tapi_event_handle_alert_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle)
285 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
287 /* Verify call handle */
288 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle);
290 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
291 CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error");
295 _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ALERT);
297 /* Change Inout state to "wait connected" before sending event to client so the same state is
298 reflected in client side also */
299 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED);
301 /*Send Alert Event to Client*/
302 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ALERT, call_handle, 0, NULL);
307 * This function handles TAPI origination event
309 * @return Returns TRUE on success and FALSE on failure
310 * @param[in] pcall_agent Pointer to the call agent state
311 * @param[in] call_handle Call Handle associated with the alert event
313 gboolean _vc_core_tapi_event_handle_originated_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle)
315 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
316 VOICECALL_RETURN_FALSE_IF_FAIL(call_handle > 0);
318 /* Verify call handle */
319 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle);
321 _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ORIG);
323 /* Send Alert Event to Client */
324 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ORIG, call_handle, 0, NULL);
326 /* Change Inout state to "wait Alert" */
327 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ALERT);
329 /* SAT's request... send response here.. not connected ind.
330 Disable checking gcf status. 20090806*/
331 #ifndef _vc_core_ca_send_sat_response_ORIG
332 if (TRUE == _vc_core_util_check_gcf_status())
335 call_vc_call_objectinfo_t callobject_info;
337 _vc_core_cm_clear_call_object(&callobject_info);
339 /*Process Connected Event*/
340 /* Get the member info and chage info */
341 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
343 if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) {
344 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS);
352 * This function handles the call end event
354 * @return Returns TRUE on success and FALSE on failure
355 * @param[in] pcall_agent Pointer to the call agent state
356 * @param[in] type TAPI Event Type
357 * @param[in] handle Call Handle of the call being ended
358 * @param[in] cause TAPI End Cause
360 gboolean _vc_core_tapi_event_handle_call_end_event(call_vc_callagent_state_t *pcall_agent, int type, call_vc_handle handle, TelTapiEndCause_t cause)
362 gboolean active_call = FALSE;
363 gboolean held_call = FALSE;
365 call_vc_call_objectinfo_t callobject_info;
366 voicecall_call_state_t prev_callstate;
368 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
370 _vc_core_cm_get_call_object(&pcall_agent->call_manager, handle, &callobject_info);
372 prev_callstate = callobject_info.state;
374 _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_ENDED);
376 /* set end cause text*/
377 _vc_core_tapi_event_get_end_cause_type(type, cause, &callobject_info.end_cause_type);
379 /*Set the modified CallObject to the Call Manager*/
380 _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
382 /*All calls are disconnected, so stop call timer*/
383 if (_vc_core_cm_isexists_connected_call(&pcall_agent->call_manager) == FALSE) {
384 CALL_ENG_DEBUG(ENG_DEBUG, "No Connected Call Exist");
387 active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager);
388 held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager);
390 switch (pcall_agent->callagent_state) {
391 case CALL_VC_CA_STATE_WAIT_JOIN:
392 if ((FALSE == active_call) || (FALSE == held_call)) {
393 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
396 case CALL_VC_CA_STATE_WAIT_HOLD:
397 if (FALSE == active_call) {
398 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
401 case CALL_VC_CA_STATE_WAIT_UNHOLD:
402 if (FALSE == held_call) {
403 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
406 case CALL_VC_CA_STATE_WAIT_SWAP:
407 if ((FALSE == active_call) || (FALSE == held_call)) {
408 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
411 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL:
412 #ifdef AUTO_RETREIVE_HELD_CALL
413 if (FALSE == active_call) {
414 /* todo call: IF Ear MIC is Inserted && */
415 if ((TRUE == held_call) && (pcall_agent->io_state == VC_INOUT_STATE_NONE) && \
416 (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) {
417 _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager);
419 _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL);
421 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD);
423 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
427 if (FALSE == active_call) {
428 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
430 CALL_ENG_DEBUG(ENG_DEBUG, "Still Active Calls are available");
434 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL:
435 if (FALSE == held_call) {
436 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
439 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS:
440 if ((active_call == FALSE) && (held_call == FALSE)) {
441 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
444 case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL:
445 CALL_ENG_DEBUG(ENG_DEBUG, "Retrieve held call on active call end");
446 if (FALSE == active_call) {
447 if ((TRUE == held_call) && (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) {
448 _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager);
449 _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL);
450 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD);
452 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
456 case CALL_VC_CA_STATE_WAIT_DROP:
457 if (VC_CALL_STATE_RELEASE_WAIT == prev_callstate) {
458 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
463 case CALL_VC_CA_STATE_SPLIT_CALLBOX:
464 case CALL_VC_CA_STATE_DROP_CALLBOX:
465 case CALL_VC_CA_STATE_SENDMSG_CALLBOX:
466 case CALL_VC_CA_STATE_SAVE_TO_CONTACT_CALLBOX:
467 case CALL_VC_CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX:
468 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
470 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL:
471 if ((FALSE == active_call) && (FALSE == held_call)) {
472 char tel_number[VC_PHONE_NUMBER_LENGTH_MAX];
474 memset(tel_number, 0, VC_PHONE_NUMBER_LENGTH_MAX);
477 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP:
479 if ((active_call == FALSE) && (held_call == FALSE)) {
480 call_vc_call_objectinfo_t callInfo;
481 call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE;
483 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
484 if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) {
485 if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callInfo)) {
486 /*Send response only if call type is sat */
487 if (callInfo.call_type == VC_CALL_ORIG_TYPE_SAT) {
488 CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call");
489 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND);
495 /*Update CallManager State */
496 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG);
497 call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager);
498 CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", call_handle);
500 /*Inform Client about the Deferred Outgoing */
501 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, call_handle, 0, NULL);
505 case CALL_VC_CA_STATE_WAIT_TRANSFER_CNF:
507 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
508 CALL_ENG_DEBUG(ENG_DEBUG, "Waiting transfer canceled!");
512 CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this call agent state:%d", pcall_agent->callagent_state);
515 /* if waiting call end for mtc */
516 switch (pcall_agent->io_state) {
517 case VC_INOUT_STATE_INCOME_WAIT_HOLD:
519 if (active_call == FALSE) {
520 CALL_ENG_DEBUG(ENG_DEBUG, "call to hold is disconnected..proceed to answer call");
521 /*It will be better to show end of call
522 _vc_core_tapi_rqst_answer_call( pcall_agent);*/
527 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVECALL:
528 if (active_call == FALSE) {
529 /*_vc_core_tapi_rqst_answer_call( pcall_agent);*/
532 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL:
533 if (held_call == FALSE) {
534 CALL_ENG_DEBUG(ENG_DEBUG, "Answering call after ending held calls");
536 /*Change the state to Income box, so the answer API will process it */
537 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX);
539 /* end held call and then accept incoming call */
540 _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT, &error_code);
543 #ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT
544 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE:
545 if (held_call == FALSE) {
546 CALL_ENG_DEBUG(ENG_DEBUG, "Answering(rel and accept) call after ending held calls");
548 /*Change the state to Income box, so the answer API will process it */
549 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX);
551 /* end held call and then accept incoming call */
552 _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, &error_code);
556 case VC_INOUT_STATE_OUTGOING_WAIT_HOLD:
557 _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager);
558 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED);
561 CALL_ENG_DEBUG(ENG_DEBUG, "No Actions defined for IO State: %d", pcall_agent->io_state);
564 if (VC_CALL_ORIG_TYPE_SAT == callobject_info.call_type) {
565 if (pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data != NULL) {
566 free(pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data);
567 pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data = NULL;
574 static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent)
576 CALL_ENG_DEBUG(ENG_DEBUG, "..");
577 switch (pcall_agent->io_state) {
578 case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED:
581 call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE;
583 if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) {
584 CALL_ENG_DEBUG(ENG_DEBUG, "Separate HOLD_CNF event not arrived for HOLD and ACCEPT request, holding the call in the CONNECTED event");
585 grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager);
587 if (-1 == grp_index) {
588 CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index);
592 _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle);
594 _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD);
596 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
598 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, active_handle, 0, NULL);
600 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED);
605 #ifdef _INCOME_WAIT_CONNECTED_
606 /*currently not applied, Fix to change the group state to hold, if the second call is connected before getting the holdcnf resp from tapi */
607 case VC_INOUT_STATE_INCOME_WAIT_CONNECTED:
609 /*Check for incoming call exists */
610 if (VC_INVALID_CALL_INDEX == pcall_agent->call_manager.mtcall_index) {
611 CALL_ENG_DEBUG(ENG_DEBUG, "No Incoming call exists");
615 if (0 == _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 0)) {
616 CALL_ENG_DEBUG(ENG_DEBUG, "No Previous Connected Members");
620 /*Connected Event for the incoming call is arrived, when waiting for hold confirmation
621 So change the active call state to hold before processing the connected indication */
622 if (CALL_VC_CA_STATE_WAIT_HOLD == pcall_agent->callagent_state) {
624 /*call_vc_handle active_handle =TAPI_INVALID_CALLHANDLE;*/
625 grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager);
627 if (-1 == grp_index) {
628 CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index);
631 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
632 /*_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager,&active_handle);*/
633 _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD);
635 else if (CALL_VC_CA_STATE_WAIT_UNHOLD == pcall_agent->callagent_state) {
637 call_vc_handle held_handle = VC_TAPI_INVALID_CALLHANDLE;
638 grp_index = _vc_core_cm_get_held_group_index(&pcall_agent->call_manager);
639 if (-1 == grp_index) {
640 CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index);
643 _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_handle);
644 _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_ACTIVE);
650 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED:
652 call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE;;
653 CALL_ENG_DEBUG(ENG_DEBUG, "VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED");
654 _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle);
655 CALL_ENG_DEBUG(ENG_DEBUG, "Active Call Handle = %d", active_handle);
657 /*_vc_core_tapi_event_handle_call_end_event(pcall_agent, TAPI_EVENT_CALL_END, active_handle, TAPI_CALL_END_NO_CAUSE);*/
661 CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this wait io state: %d", pcall_agent->io_state);
668 * This function handles the TAPI call connect event
670 * @return Returns TRUE on success and FALSE on failure
671 * @param[in] pcall_agent Pointer to the call agent state
672 * @param[in] call_handle call handle assoicated with the call being connected
674 gboolean _vc_core_tapi_event_handle_call_connect_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle)
676 call_vc_call_objectinfo_t callobject_info;
678 int connectednum = 0;
680 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
682 /* Verify call handle */
683 CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle);
685 _vc_core_cm_clear_call_object(&callobject_info);
686 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
687 CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error");
691 /*First Process the wait state events before processing the connect event */
692 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
693 __call_vc_process_wait_state_success_events(pcall_agent);
694 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
696 /*Process Connected Event*/
697 /* Get the member info and chage info */
698 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
701 ** Reqeust from SAT. When GCF field is ON, send response when get a setup confirm.
702 ** To send response to SAT faster...
704 #ifndef _vc_core_ca_send_sat_response_ORIG
705 if (FALSE == _vc_core_util_check_gcf_status()) {
706 if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) {
707 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS);
712 _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_CONNECTED);
714 VOICECALL_RETURN_FALSE_IF_FAIL(callobject_info.call_id != VC_INVALID_CALL_ID);
716 index = _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
717 VOICECALL_RETURN_FALSE_IF_FAIL(index != -1);
719 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);
720 CALL_ENG_DEBUG(ENG_DEBUG, "Connected Member Num before adding Connected call to group is :%d", connectednum);
722 /*If any previous calls are not cleared after end, clear it here so makes provision to add one more call to the call manager */
723 _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager);
725 /*Add the conneted call to the active group */
726 if (FALSE == _vc_core_cm_add_call_member_togroup(&pcall_agent->call_manager, index)) {
727 CALL_ENG_DEBUG(ENG_ERR, "Call Object not added to the Group, [PROBLEM] !!!");
730 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
732 /* Send Connected Event to the Client */
733 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_CONNECTED, callobject_info.call_handle, 0, NULL);
735 /* Once the Call is connected, change the InOut state to None */
736 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE);
738 /*Getting AOC PPM Value is delayed to make the current flow faster by adding it to g_idle_add */
739 g_idle_add(__call_vc_get_aoc_ppm_value_idle_cb, pcall_agent);
741 if (_vc_core_engine_status_get_download_call(pcall_agent) == TRUE) {
742 g_timeout_add(9000, __call_vc_download_call_timer_cb, pcall_agent);
744 _vc_core_util_download_test_call("downloadcall_success");
751 * This function handles call hold event
753 * @return Returns TRUE on success and FALSE on failure
754 * @param[in] pcall_agent Pointer to the call agent state
755 * @param[in] call_handle call handle assoicated with the call being held
756 * @param[in] status TAPI cause incase of hold failed
758 gboolean _vc_core_tapi_event_handle_call_held_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
760 call_vc_call_objectinfo_t callobject_info;
762 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
764 CALL_ENG_DEBUG(ENG_DEBUG, "");
766 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
768 /* Verify call handle */
769 CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d, status = %d", call_handle, status);
771 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
772 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
776 if (TAPI_CAUSE_SUCCESS != status) {
777 switch (pcall_agent->io_state) {
778 case VC_INOUT_STATE_OUTGOING_WAIT_HOLD:
780 /* Recover and reset related state variable */
781 if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) {
782 CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist");
786 if ((callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) && \
787 ((pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \
788 TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD) || \
789 (pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \
790 TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL))) {
792 /*SAT Test Case(27.22.4.13.1/7), Terminal Response for Option B */
793 /* _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); */
794 /*SAT Test Case(27.22.4.13.1/7), Terminal Response for Option A */
795 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND_WITHOUT_CAUSE);
798 _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager);
800 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ABORTED, VC_ENDCAUSE_CALL_ENDED, 0, NULL);
802 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE);
806 case VC_INOUT_STATE_INCOME_WAIT_HOLD:
809 case VC_INOUT_STATE_NONE:
813 CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_event_handle_call_held_event(fail): Not allowed io_state=%d", pcall_agent->io_state);
817 switch (pcall_agent->callagent_state) {
819 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
821 /* Reset the Agent State */
822 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
823 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL);
827 case CALL_VC_CA_STATE_WAIT_SWAP:
829 /* Reset the Agent State */
830 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
831 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL);
834 case CALL_VC_CA_STATE_WAIT_HOLD:
836 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
837 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_HOLD_FAILED, 0, NULL);
840 case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL:
842 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
845 case CALL_VC_CA_STATE_NORMAL:
846 default: /*Fall Through */
847 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
855 /* Get the Group Index */
856 index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle);
857 grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index);
859 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, grp_state);
861 switch (pcall_agent->io_state) {
862 case VC_INOUT_STATE_OUTGOING_WAIT_HOLD:
864 /* Change the Group State */
865 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
866 CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index);
868 /* Send Call Held Event to the Client */
869 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL);
871 if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) {
872 _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager);
873 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED);
875 call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE;
877 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG);
878 call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager);
879 CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", call_handle);
880 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, call_handle, 0, NULL);
883 if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD)
884 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
888 case VC_INOUT_STATE_INCOME_WAIT_HOLD:
892 /*Change the Group State*/
893 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
894 CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index);
896 if (_vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_NORMAL, &error_code)) {
897 CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Answered");
898 /*TODO: Inform client to update ui */
900 if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) {
901 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
905 case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED:
907 CALL_ENG_DEBUG(ENG_DEBUG, "Hold arrived for Hold and Accept Event, Current IO State:%d", pcall_agent->io_state);
908 /*Change state to wait_connected */
909 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED);
912 case VC_INOUT_STATE_NONE:
913 default: /*Fall Through */
914 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed io_state=%d", pcall_agent->io_state);
918 switch (pcall_agent->callagent_state) {
920 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
922 int held_call_num = 0;
923 int act_call_num = 0;
925 held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager);
926 act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager);
927 if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) {
928 if (CALL_VC_GROUP_STATE_HOLD != grp_state) {
929 /* Set the State to HOLD and inform client */
930 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
931 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, 0, 0, NULL);
933 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
935 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP);
940 case CALL_VC_CA_STATE_WAIT_SWAP:
942 /*Always reset the agent state as the event for this wait state is arrived */
943 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
945 /*Swap the state only if the group state of the given call handle is not in hold state already
946 as this is a hold confirmation event */
947 if (CALL_VC_GROUP_STATE_HOLD != grp_state) {
948 _vc_core_cm_swap_group_state(&pcall_agent->call_manager);
949 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL);
953 case CALL_VC_CA_STATE_WAIT_HOLD:
955 /* Change the Group State */
956 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
957 CALL_ENG_DEBUG(ENG_DEBUG, "Group Index: %d , set to GROUP_STATE_HOLD", index);
959 /* Change Call Agent State */
960 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
962 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL);
965 case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL:
967 gboolean active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager);
968 gboolean held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager);
970 /*Upon waiting for the success event for hold request,
971 Other calls might have been released during this time, so the held call need to retrieved */
972 if ((active_call == FALSE) && (held_call == TRUE)) {
973 CALL_ENG_DEBUG(ENG_DEBUG, "Unhold call");
974 if (_vc_core_tapi_rqst_retrieve_call(pcall_agent) == TRUE) {
975 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD);
980 case CALL_VC_CA_STATE_NORMAL:
981 default: /*Fall Through */
982 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
992 * This function handles TAPI call activate/retrieve event
994 * @return Returns TRUE on success and FALSE on failure
995 * @param[in] pcall_agent Pointer to the call agent state
996 * @param[in] call_handle call handle associated with the call being retrieved
997 * @param[in] status TAPI cause in case of retrieve failed
999 gboolean _vc_core_tapi_event_handle_call_retrieve_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
1001 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1003 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status);
1005 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1006 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
1010 if (TAPI_CAUSE_SUCCESS != status) {
1011 switch (pcall_agent->callagent_state) {
1013 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
1015 /*Reset the Agent State*/
1016 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1017 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL);
1021 case CALL_VC_CA_STATE_WAIT_SWAP:
1023 /*Reset the Call Agent State*/
1024 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1025 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL);
1028 case CALL_VC_CA_STATE_WAIT_UNHOLD:
1030 /*Reset the Agent State*/
1031 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1032 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_RETREIVE_FAILED, 0, NULL);
1036 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
1043 int cur_grp_state = 0;
1045 /*Get the Group Index and current group status */
1046 index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle);
1047 cur_grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index);
1049 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, cur_grp_state);
1051 switch (pcall_agent->callagent_state) {
1053 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
1055 int held_call_num = 0;
1056 int act_call_num = 0;
1058 held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager);
1059 act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager);
1060 if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) {
1061 if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) {
1062 /* Set the State ACTIVE and inform client */
1063 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE);
1064 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, 0, 0, NULL);
1066 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1068 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP);
1073 case CALL_VC_CA_STATE_WAIT_SWAP:
1075 /* Always reset the agent state as the event for the wait state is arrived */
1076 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1078 /*Change the state only when the current state of the given handle is not in ACTIVE state */
1079 if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) {
1080 _vc_core_cm_swap_group_state(&pcall_agent->call_manager);
1081 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL);
1085 case CALL_VC_CA_STATE_WAIT_UNHOLD:
1088 /* get the member info and chage info */
1089 index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle);
1090 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE);
1092 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1094 /*Send Call Retreived Event to Client*/
1095 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, call_handle, 0, NULL);
1099 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
1100 /*return FALSE if the event is not handled here, because end call memeber will be unnecessarily cleared if returned TRUE */
1111 * This function handles call join/conference event
1113 * @return Returns TRUE on success and FALSE on failure
1114 * @param[in] pcall_agent Pointer to the call agent state
1115 * @param[in] call_handle call handle assoicated with the call being joined
1116 * @param[in] status tapi cause incase of join failed
1118 gboolean _vc_core_tapi_event_handle_call_join_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
1120 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1122 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status);
1124 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1125 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
1129 if (TAPI_CAUSE_SUCCESS != status) {
1130 CALL_ENG_DEBUG(ENG_DEBUG, "Join fail and return..");
1131 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SETUP_CONF_FAILED, 0, NULL);
1135 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
1137 /* get the member info and chage info */
1138 _vc_core_cm_join_group(&pcall_agent->call_manager);
1140 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
1142 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SETUP_CONF, 0, 0, NULL);
1147 * This function handles call split/private call event
1149 * @return Returns TRUE on success and FALSE on failure
1150 * @param[in] pcall_agent Pointer to the call agent state
1151 * @param[in] call_handle call handle associated with the call being made as private call
1152 * @param[in] status TAPI cause in case of split failed
1154 gboolean _vc_core_tapi_event_handle_call_split_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
1156 call_vc_call_objectinfo_t callobject_info;
1158 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1160 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status);
1162 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1163 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
1164 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL);
1168 if (TAPI_CAUSE_SUCCESS != status) {
1169 CALL_ENG_DEBUG(ENG_DEBUG, "Split fail and return..");
1170 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL);
1174 /* get the member info and chage info */
1175 _vc_core_cm_clear_call_object(&callobject_info);
1176 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
1178 _vc_core_cm_split_group(&pcall_agent->call_manager, call_handle);
1180 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SPLIT_CONF, call_handle, 0, NULL); /* Added Call handle for Aqilla */
1185 * This function handles the call transfer event
1187 * @return Returns TRUE on success and FALSE on failure
1188 * @param[in] pcall_agent Pointer to the call agent state
1189 * @param[in] status TAPI cause in case of hold failed
1191 gboolean _vc_core_tapi_event_handle_call_transfer_event(call_vc_callagent_state_t *pcall_agent, TelCallCause_t status)
1193 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1195 CALL_ENG_DEBUG(ENG_DEBUG, "Started, status = %d", status);
1197 if (TAPI_CAUSE_SUCCESS != status) {
1199 CALL_ENG_DEBUG(ENG_DEBUG, "TapiTransfer Failed");
1200 if (VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager)
1201 && VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager)) {
1202 err_cause = ERROR_VOICECALL_TRANSFER_FAILED;
1205 if (_vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager)) {
1206 err_cause = ERROR_VOICECALL_TRANSFER_FAILED;
1207 } else if (VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pcall_agent->io_state) {
1208 err_cause = ERROR_VOICECALL_TRANSFER_FAILED;
1212 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, err_cause, 0, NULL);
1213 CALL_ENG_DEBUG(ENG_DEBUG, "Transfer failed and return..");
1217 CALL_ENG_DEBUG(ENG_DEBUG, "Transfer success!");
1218 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_TRANSFERRED, 0, 0, NULL);
1220 /*todo ss : Check Updating flag gbpsh_voicecall_command_transfer*/
1225 * This function handles the TAPI connected line indication handle
1227 * @return Returns TRUE on success and FALSE on failure
1228 * @param[in] pcall_agent Pointer to the call agent state
1229 * @param[in] call_handle TAPI Call Handle associated with connected line indication
1230 * @param[in] connected_number_info Connected Number Details
1232 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)
1234 call_vc_call_objectinfo_t callobject_info;
1235 call_vc_handle active_call_handle = VC_TAPI_INVALID_CALLHANDLE;
1236 gboolean bConnectedCall = FALSE;
1238 CALL_ENG_DEBUG(ENG_DEBUG, ":Number(%s)", connected_number_info->number);
1240 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1242 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1243 CALL_ENG_DEBUG(ENG_ERR, " INVALID_CALLHANDLE Error");
1247 _vc_core_cm_clear_call_object(&callobject_info);
1249 if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info)) {
1250 if (callobject_info.call_handle != call_handle) {
1251 CALL_ENG_DEBUG(ENG_ERR, "It is not outging call(Call Handle = %d, MO Call Handle =%d)", call_handle, callobject_info.call_handle);
1255 if (_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call_handle) == -1) {
1256 CALL_ENG_DEBUG(ENG_ERR, "No Active Calls(Call Handle = %d)", call_handle);
1260 if (active_call_handle != call_handle) {
1261 CALL_ENG_DEBUG(ENG_ERR, "Call Handle Mismatch(Call Handle = %d)", call_handle);
1265 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
1266 bConnectedCall = TRUE;
1269 switch (connected_number_info->name_mode) {
1270 case TAPI_CALL_NAME_AVAIL: /*if sznumber of the callInfo is null, set Anoymous*/
1272 if (0 == strlen(connected_number_info->number)) {
1273 /*Forwarded Call number is unknown*/
1274 memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber));
1276 _vc_core_util_strcpy(callobject_info.connected_telnumber, sizeof(callobject_info.connected_telnumber), connected_number_info->number);
1281 case TAPI_CALL_NAME_RESTRICTED:
1282 case TAPI_CALL_NAME_AVAIL_RESTRICTED: /*withheld*/
1283 /*Forwarded Call number is unknown*/
1284 memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber));
1287 case TAPI_CALL_NAME_UNAVAIL: /*Anoymous*/
1289 /*Forwarded Call number is unknown*/
1290 memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber));
1294 /*Set the modified call object to call manager*/
1295 _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
1297 /*Send Event to the Client*/
1298 _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);
1304 * This function handles different type of TAPI indications given in tapi_event_type
1306 * @return Returns TRUE on success and FALSE on failure
1307 * @param[in] pcall_agent Pointer to the call agent state
1308 * @param[in] tapi_event_type TAPI Event Type
1309 * @param[in] param2 sub param associated with tapi_event_type
1311 gboolean _vc_core_tapi_event_handle_notification(call_vc_callagent_state_t *pcall_agent, int tapi_event_type, int param2)
1313 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1315 CALL_ENG_DEBUG(ENG_DEBUG, "eventType = %d", tapi_event_type);
1317 /* set the notify message string as the event type */
1318 switch (tapi_event_type) {
1319 case TAPI_EVENT_CALL_FORWARD_IND:
1320 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_FORWARD, VC_FRWD_IND_INCOM_IS_FRWD, 0, NULL);
1323 case TAPI_EVENT_CALL_COND_FORWARDING_IND:
1324 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_COND_FORWARDING_IND");
1325 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SSNOTIFY, VC_SSNOTIFY_IND_ALL_COND_FORWARDING, 0, NULL);
1328 case TAPI_EVENT_CALL_UNCOND_FORWARDING_IND:
1329 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_UNCOND_FORWARDING_IND");
1330 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SSNOTIFY, VC_SSNOTIFY_IND_CFU, 0, NULL);
1333 case TAPI_EVENT_CALL_RETRIEVE_IND:
1334 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_ACTIVATE_IND");
1335 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_ACTIVATE, 0, 0, NULL);
1338 case TAPI_EVENT_CALL_HOLD_IND:
1339 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_HOLD_IND");
1340 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_HOLD, 0, 0, NULL);
1343 case TAPI_EVENT_CALL_TRANSFER_IND:
1344 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_TRANSFER_IND");
1345 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_TRANSFER, 0, 0, NULL);
1348 case TAPI_EVENT_CALL_SETUPCONFERENCE_IND:
1349 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_SETUPCONFERENCE_IND");
1350 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SETUPCONFERENCE, 0, 0, NULL);
1353 case TAPI_EVENT_CALL_BARRING_IND:
1355 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_BARRING_IND, cause = %d", param2);
1357 barring_ind_type = VC_BARR_IND_ALL;
1361 case TAPI_EVENT_CALL_WAITING_IND:
1362 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_WAITING_IND");
1363 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_WAITING, 0, 0, NULL);
1366 case TAPI_EVENT_CALL_CUGINFO_IND:
1367 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_CUGINFO_IND");
1368 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_CUGINFO, 0, 0, NULL);
1371 case TAPI_EVENT_CALL_SSNOTIFY_IND:
1373 voicecall_ssnotify_ind_type_t ssnotify_ind_type;
1374 CALL_ENG_DEBUG(ENG_DEBUG, " TAPI_EVENT_CALL_SSNOTIFY_IND");
1376 case TAPI_SSCODE_CFU:
1377 ssnotify_ind_type = VC_SSNOTIFY_IND_CFU;
1380 case TAPI_SSCODE_CFB:
1381 ssnotify_ind_type = VC_SSNOTIFY_IND_CFB;
1384 case TAPI_SSCODE_CFNRY:
1385 ssnotify_ind_type = VC_SSNOTIFY_IND_CFNRY;
1388 case TAPI_SSCODE_CFNRC:
1389 ssnotify_ind_type = VC_SSNOTIFY_IND_CFNRC;
1392 case TAPI_SSCODE_CLIR:
1393 ssnotify_ind_type = VC_SSNOTIFY_IND_CLIR;
1396 case TAPI_SSCODE_ALL_COND_FORWARDING:
1397 ssnotify_ind_type = VC_SSNOTIFY_IND_ALL_COND_FORWARDING;
1400 case TAPI_SSCODE_BARRING_OF_OUTGOING:
1401 ssnotify_ind_type = VC_SSNOTIFY_IND_BARRING_OF_OUTGOING;
1405 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_SSNOTIFY_IND ], No Action defined for sub type:%d", param2);
1410 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_SSNOTIFY, ssnotify_ind_type, 0, NULL);
1414 case TAPI_EVENT_CALL_REDIRECT_CNF:
1415 CALL_ENG_DEBUG(ENG_DEBUG, "TAPI_EVENT_CALL_REDIRECT_CNF");
1416 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_REDIRECT_CNF, 0, 0, NULL);
1419 case TAPI_EVENT_CALL_CALLINGNAMEINFO_IND:
1420 CALL_ENG_DEBUG(ENG_DEBUG, " TAPI_EVENT_CALL_CALLINGNAMEINFO_IND");
1421 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_CALLINGNAMEINFO, 0, 0, NULL);
1425 CALL_ENG_DEBUG(ENG_DEBUG, "default eventType = %d", tapi_event_type);
1432 * This function handles the AOC Event
1434 * @return Returns TRUE on success and FALSE on failure
1435 * @param[in] pcall_agent Pointer to the call agent state
1436 * @param[in] call_handle Call Handle
1437 * @param[in] ptapi_aoc_info AOC info associated with the AOC Event
1439 gboolean _vc_core_tapi_event_handle_aoc(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallAocInfo_t *ptapi_aoc_info)
1441 call_vc_call_objectinfo_t callobject_info;
1443 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1445 CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle);
1446 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1447 CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error");
1451 /* get the member info and chage info */
1452 _vc_core_cm_clear_call_object(&callobject_info);
1453 if (FALSE == _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info)) {
1454 CALL_ENG_DEBUG(ENG_ERR, "Call Object Not available");
1458 /* Store the call cost TAPI info */
1459 callobject_info.aoc_ccm = ptapi_aoc_info->CCM;
1460 memcpy((void *)callobject_info.aoc_currency, (const void *)ptapi_aoc_info->szCurrency, VC_AOC_CURRENCY_CODE_LEN_MAX);
1462 /* Set the modified call object to the Call Mangaer */
1463 _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
1465 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_AOC, call_handle, 0, &callobject_info);
1470 static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata)
1472 call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata;
1473 __call_vc_get_aoc_ppm_value(pcall_agent);
1477 static gboolean __call_vc_download_call_timer_cb(gpointer pdata)
1479 call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata;
1480 _vc_core_ca_end_all_calls(pcall_agent);
1484 static void __call_vc_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent)
1486 TapiResult_t tapi_error = TAPI_API_SUCCESS;
1487 int ReqId = VC_RQSTID_DEFAULT;
1489 CALL_ENG_DEBUG(ENG_DEBUG, "..");
1491 if (pcall_agent->aoc_ppm == VC_INVALID_PPM) {
1492 tapi_error = tel_get_ss_aoc_info(TAPI_SS_AOC_TYPE_PUC, &ReqId);
1494 if (tapi_error != TAPI_API_SUCCESS) {
1495 CALL_ENG_DEBUG(ENG_ERR, "TAPI Error: %x", tapi_error);