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"
26 * This function processes the current io wait states if available
29 * @return if wait states are processed, FALSE otherwise
30 * @param[in] pcall_agent handle to voicecall agent structure
32 static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent);
35 * This function requests the TAPI for the ppm value for callcost
39 * @param[in] pcall_agent handle to voicecall agent structure
41 static void __call_vc_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent);
42 static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata);
43 static gboolean __call_vc_download_call_timer_cb(gpointer pdata);
46 * This function retreives the voicecall engine specific end cause type for the given TAPI end cause type
48 * @return Returns TRUE on success and FALSE on failure
49 * @param[in] type TAPI event type
50 * @param[in] cause TAPI call end cause
51 * @param[out] end_cause_type voicecall engine end cause
53 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)
55 VOICECALL_RETURN_IF_FAIL(end_cause_type != NULL);
57 CALL_ENG_DEBUG(ENG_DEBUG, "EventType:[%s],EndCause:%d", noti_id, cause);
59 if (strcmp(noti_id, TAPI_NOTI_VOICE_CALL_STATUS_IDLE) == 0) {
61 case TAPI_CC_CAUSE_NORMAL_UNSPECIFIED:
62 *end_cause_type = VC_ENDCAUSE_CALL_DISCONNECTED;
64 case TAPI_CC_CAUSE_FACILITY_REJECTED:
65 *end_cause_type = VC_ENDCAUSE_CALL_FAILED;
67 case TAPI_CC_CAUSE_QUALITY_OF_SERVICE_UNAVAILABLE:
68 case TAPI_CC_CAUSE_ACCESS_INFORMATION_DISCARDED:
69 case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_AUTHORISED:
70 case TAPI_CC_CAUSE_BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE:
71 case TAPI_CC_CAUSE_SERVICE_OR_OPTION_NOT_AVAILABLE:
72 case TAPI_CC_CAUSE_BEARER_SERVICE_NOT_IMPLEMENTED:
73 case TAPI_CC_CAUSE_PROTOCOL_ERROR_UNSPECIFIED:
75 *end_cause_type = VC_ENDCAUSE_CALL_ENDED;
78 case TAPI_CC_CAUSE_REQUESTED_FACILITY_NOT_SUBSCRIBED:
79 *end_cause_type = VC_ENDCAUSE_CALL_SERVICE_NOT_ALLOWED;
82 case TAPI_CC_CAUSE_OPERATOR_DETERMINED_BARRING:
83 *end_cause_type = VC_ENDCAUSE_CALL_BARRED;
85 case TAPI_REJECT_CAUSE_MM_REJ_NO_SERVICE:
86 *end_cause_type = VC_ENDCAUSE_NO_SERVICE;
89 case TAPI_REJECT_CAUSE_CONGESTTION:
90 case TAPI_REJECT_CAUSE_CNM_REJ_NO_RESOURCES:
91 case TAPI_CC_CAUSE_SWITCHING_EQUIPMENT_CONGESTION: /* Match as NW_BUSY*/
92 *end_cause_type = VC_ENDCAUSE_NW_BUSY;
95 case TAPI_REJECT_CAUSE_NETWORK_FAILURE:
96 case TAPI_REJECT_CAUSE_MSC_TEMPORARILY_NOT_REACHABLE:
97 *end_cause_type = VC_ENDCAUSE_NW_FAILED;
100 case TAPI_REJECT_CAUSE_IMEI_NOT_ACCEPTED:
102 unsigned long mcc = 0;
104 _vc_core_util_get_mcc(&mcc);
106 if (mcc == CALL_NETWORK_MCC_UK) {
107 *end_cause_type = VC_ENDCAUSE_IMEI_REJECTED; /*Display "Please verify SIM or insert valid SIM"*/
109 *end_cause_type = VC_ENDCAUSE_NW_FAILED; /*Display Network unavailable*/
114 case TAPI_CC_CAUSE_NO_ROUTE_TO_DEST:
115 case TAPI_CC_CAUSE_TEMPORARY_FAILURE:
116 case TAPI_CC_CAUSE_NETWORK_OUT_OF_ORDER:
117 case TAPI_CC_CAUSE_REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE:
118 case TAPI_CC_CAUSE_NO_CIRCUIT_CHANNEL_AVAILABLE:
119 case TAPI_CC_CAUSE_DESTINATION_OUT_OF_ORDER:
120 *end_cause_type = VC_ENDCAUSE_SERVICE_TEMP_UNAVAILABLE;
122 case TAPI_CC_CAUSE_NO_USER_RESPONDING:
123 case TAPI_CC_CAUSE_USER_ALERTING_NO_ANSWER:
124 *end_cause_type = VC_ENDCAUSE_USER_DOESNOT_RESPOND;
127 case TAPI_CC_CAUSE_ACM_GEQ_ACMMAX:
128 *end_cause_type = VC_ENDCAUSE_NO_CREDIT;
131 case TAPI_CC_CAUSE_CALL_REJECTED:
132 if (pcall_agent->barring_ind_type == VC_BARR_IND_ALL)
133 *end_cause_type = VC_ENDCAUSE_CALL_BARRED;
135 *end_cause_type = VC_ENDCAUSE_USER_UNAVAILABLE;
137 pcall_agent->barring_ind_type = VC_BARR_IND_NONE;
140 case TAPI_CC_CAUSE_USER_BUSY:
141 *end_cause_type = VC_ENDCAUSE_USER_BUSY;
144 case TAPI_CC_CAUSE_USER_NOT_MEMBER_OF_CUG:
145 *end_cause_type = VC_ENDCAUSE_WRONG_GROUP;
148 case TAPI_CC_CAUSE_INVALID_NUMBER_FORMAT:
150 *end_cause_type = VC_ENDCAUSE_INVALID_NUMBER_FORMAT;
153 case TAPI_CC_CAUSE_UNASSIGNED_NUMBER:
154 *end_cause_type = VC_ENDCAUSE_UNASSIGNED_NUMBER;
157 case TAPI_CC_CAUSE_NUMBER_CHANGED:
158 *end_cause_type = VC_ENDCAUSE_NUMBER_CHANGED;
161 case TAPI_CALL_END_NO_CAUSE:
163 *end_cause_type = VC_ENDCAUSE_CALL_ENDED;
165 CALL_ENG_DEBUG(ENG_ERR, "Call Ended or Default Cause Value: %d", cause);
169 *end_cause_type = VC_ENDCAUSE_CALL_FAILED;
170 CALL_ENG_DEBUG(ENG_DEBUG, "Invalid call end cause or error !!");
173 CALL_ENG_DEBUG(ENG_DEBUG, "Engine End Cause: %d", (int)*end_cause_type);
176 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)
178 #ifdef _CPHS_DEFINED_
179 if (_vc_core_svcall_cphs_csp_get_status(pcall_agent, VC_CPHS_CSP_ALS)) {
180 TelCallActiveLine_t activeLine = callInfo->ActiveLine;
182 if (activeLine == TAPI_CALL_ACTIVE_LINE1) {
183 pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE1;
184 } else if (activeLine == TAPI_CALL_ACTIVE_LINE2) {
185 pcallobject_info->alsLine = VC_CALL_CPHS_ALS_LINE2;
187 CALL_ENG_DEBUG(ENG_DEBUG, "undefined currentLine=%d", activeLine);
192 _vc_core_util_strcpy(pcallobject_info->calling_name, sizeof(pcallobject_info->calling_name), callInfo->CallingNameInfo.szNameData);
193 pcallobject_info->bcalling_namemode = callInfo->CallingNameInfo.NameMode;
195 /* If BCD number exists, number should be shown even though number restriction is set */
196 if (strlen(callInfo->szCallingPartyNumber) > 0) {
197 pcallobject_info->brestricted_namemode = FALSE;
199 if (callInfo->szCallingPartyNumber[0] == '*') {
200 pcallobject_info->bccbs_call = TRUE;
201 _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber + 1);
203 _vc_core_util_strcpy(pcallobject_info->tel_number, sizeof(pcallobject_info->tel_number), callInfo->szCallingPartyNumber);
206 /* check callInfo->name_mode if override category isn't supported.*/
207 } else { /* If BCD number doesn't exist, cause_of_no_cli value should be checked to decide its presentation */
209 pcallobject_info->brestricted_namemode = TRUE;
211 /*code clean: #ifndef _ARM_SP*/
212 pcallobject_info->name_mode = callInfo->CliCause;
214 CALL_ENG_DEBUG(ENG_DEBUG, "no_cli_cause = %d, name_mode = %d...", callInfo->CliCause, pcallobject_info->name_mode);
219 * This function handles the incoming event
221 * @return Returns TRUE on success and FALSE on failure
222 * @param[in] pcall_agent Pointer to the call agent state
223 * @param[in] call_handle Incoming call handle
224 * @param[in] callInfo Incoming call info associated with the incoming call
226 gboolean _vc_core_tapi_event_handle_incoming_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallIncomingCallInfo_t *callInfo)
228 call_vc_call_objectinfo_t callobject_info;
231 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
233 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, number = %s..", call_handle, callInfo->szCallingPartyNumber);
235 /* setting the new member info */
236 _vc_core_cm_clear_call_object(&callobject_info);
238 callobject_info.call_handle = call_handle;
239 callobject_info.call_id = _vc_core_cm_get_new_callId(&pcall_agent->call_manager);
240 callobject_info.bincoming_call_is_fwded = callInfo->fwded;
242 /* setting the incom call telephone number */
243 CALL_ENG_DEBUG(ENG_DEBUG, "[callobject_info.call_handle=%d], FWDED Call: %d", callobject_info.call_handle, callobject_info.bincoming_call_is_fwded);
245 /*Copy Incoming call data in to the callobject */
246 _vc_core_tapi_event_copy_incoming_call_data(pcall_agent, callInfo, &callobject_info);
248 /*Change the Call Object Call State*/
249 _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_INCOME);
251 /*Add the newly created callobject to the Call Manager*/
252 callIndex = _vc_core_cm_add_call_object(&pcall_agent->call_manager, &callobject_info);
253 if (callIndex != -1) {
254 /*Set the Call Manager's MT Call Index as CallObject Index*/
255 if (FALSE == _vc_core_cm_set_incoming_call(&pcall_agent->call_manager, callIndex)) {
256 CALL_ENG_DEBUG(ENG_ERR, "Problem in accpeting the incoming call, Current Call Details");
257 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
261 CALL_ENG_DEBUG(ENG_ERR, "Problem in adding the call to the call manager");
262 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
265 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_START);
271 * This function handles TAPI alert event
273 * @return Returns TRUE on success and FALSE on failure
274 * @param[in] pcall_agent Pointer to the call agent state
275 * @param[in] call_handle Call Handle associated with the alert event
277 gboolean _vc_core_tapi_event_handle_alert_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle)
279 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
281 /* Verify call handle */
282 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle);
284 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
285 CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error");
289 _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ALERT);
291 /* Change Inout state to "wait connected" before sending event to client so the same state is
292 reflected in client side also */
293 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED);
295 /*Send Alert Event to Client*/
296 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ALERT, call_handle, 0, NULL);
301 * This function handles TAPI origination event
303 * @return Returns TRUE on success and FALSE on failure
304 * @param[in] pcall_agent Pointer to the call agent state
305 * @param[in] call_handle Call Handle associated with the alert event
307 gboolean _vc_core_tapi_event_handle_originated_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle)
309 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
310 VOICECALL_RETURN_FALSE_IF_FAIL(call_handle > 0);
312 /* Verify call handle */
313 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d", call_handle);
315 _vc_core_cm_change_call_object_state(&pcall_agent->call_manager, call_handle, VC_CALL_STATE_OUTGOING_ORIG);
317 /* Send Alert Event to Client */
318 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ORIG, call_handle, 0, NULL);
320 /* Change Inout state to "wait Alert" */
321 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ALERT);
323 /* send response here.. not connected ind. Disable checking gcf status. */
324 #ifndef _vc_core_ca_send_sat_response_ORIG
325 if (TRUE == _vc_core_util_check_gcf_status())
328 call_vc_call_objectinfo_t callobject_info;
330 _vc_core_cm_clear_call_object(&callobject_info);
332 /*Process Connected Event*/
333 /* Get the member info and chage info */
334 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
336 if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) {
337 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS);
345 * This function handles the call end event
347 * @return Returns TRUE on success and FALSE on failure
348 * @param[in] pcall_agent Pointer to the call agent state
349 * @param[in] type TAPI Event Type
350 * @param[in] handle Call Handle of the call being ended
351 * @param[in] cause TAPI End Cause
353 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)
355 gboolean active_call = FALSE;
356 gboolean held_call = FALSE;
358 call_vc_call_objectinfo_t callobject_info;
359 voicecall_call_state_t prev_callstate;
361 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
363 _vc_core_cm_get_call_object(&pcall_agent->call_manager, handle, &callobject_info);
365 prev_callstate = callobject_info.state;
367 _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_ENDED);
369 /* set end cause text*/
370 _vc_core_tapi_event_get_end_cause_type(pcall_agent, noti_id, cause, &callobject_info.end_cause_type);
372 /*Set the modified CallObject to the Call Manager*/
373 _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
375 /*All calls are disconnected, so stop call timer*/
376 if (_vc_core_cm_isexists_connected_call(&pcall_agent->call_manager) == FALSE) {
377 CALL_ENG_DEBUG(ENG_DEBUG, "No Connected Call Exist");
380 active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager);
381 held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager);
383 switch (pcall_agent->callagent_state) {
384 case CALL_VC_CA_STATE_WAIT_JOIN:
385 if ((FALSE == active_call) || (FALSE == held_call)) {
386 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
389 case CALL_VC_CA_STATE_WAIT_HOLD:
390 if (FALSE == active_call) {
391 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
394 case CALL_VC_CA_STATE_WAIT_UNHOLD:
395 if (FALSE == held_call) {
396 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
399 case CALL_VC_CA_STATE_WAIT_SWAP:
400 if ((FALSE == active_call) || (FALSE == held_call)) {
401 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
404 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_ACTIVECALL:
405 #ifdef AUTO_RETREIVE_HELD_CALL
406 if (FALSE == active_call) {
407 /* todo call: IF Ear MIC is Inserted && */
408 if ((TRUE == held_call) && (pcall_agent->io_state == VC_INOUT_STATE_NONE) && \
409 (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) {
410 _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager);
412 _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL);
414 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD);
416 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
420 if (FALSE == active_call) {
421 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
423 CALL_ENG_DEBUG(ENG_DEBUG, "Still Active Calls are available");
427 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_HOLDCALL:
428 if (FALSE == held_call) {
429 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
432 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS:
433 if ((active_call == FALSE) && (held_call == FALSE)) {
434 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
437 case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL:
438 CALL_ENG_DEBUG(ENG_DEBUG, "Retrieve held call on active call end");
439 if (FALSE == active_call) {
440 if ((TRUE == held_call) && (TRUE == _vc_core_tapi_rqst_retrieve_call(pcall_agent))) {
441 _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager);
442 _vc_core_ca_send_event_to_client(pcall_agent, VC_ACTION_CALL_END_HELD_RETREIVED, handle, 0, NULL);
443 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD);
445 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
449 case CALL_VC_CA_STATE_WAIT_DROP:
450 if (VC_CALL_STATE_RELEASE_WAIT == prev_callstate) {
451 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
456 case CALL_VC_CA_STATE_SPLIT_CALLBOX:
457 case CALL_VC_CA_STATE_DROP_CALLBOX:
458 case CALL_VC_CA_STATE_SENDMSG_CALLBOX:
459 case CALL_VC_CA_STATE_SAVE_TO_CONTACT_CALLBOX:
460 case CALL_VC_CA_STATE_VIEW_CONTACT_DETAIL_CALLBOX:
461 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
463 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SWITCH_TO_VIDEO_CALL:
464 if ((FALSE == active_call) && (FALSE == held_call)) {
465 char tel_number[VC_PHONE_NUMBER_LENGTH_MAX];
467 memset(tel_number, 0, VC_PHONE_NUMBER_LENGTH_MAX);
470 case CALL_VC_CA_STATE_WAIT_RELEASE_ALL_CALLS_TO_SETUP:
472 if ((active_call == FALSE) && (held_call == FALSE)) {
473 call_vc_call_objectinfo_t callInfo;
474 call_vc_handle call_handle = VC_TAPI_INVALID_CALLHANDLE;
476 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
477 if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) {
478 if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callInfo)) {
479 /*Send response only if call type is sat */
480 if (callInfo.call_type == VC_CALL_ORIG_TYPE_SAT) {
481 CALL_ENG_DEBUG(ENG_DEBUG, "SAT_CALL fail to setup call");
482 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_UNABLE_TO_PROCESS_COMMAND);
488 /*Update CallManager State */
489 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG);
490 call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager);
491 CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", call_handle);
493 /*Inform Client about the Deferred Outgoing */
494 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, call_handle, 0, NULL);
498 case CALL_VC_CA_STATE_WAIT_TRANSFER_CNF:
500 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
501 CALL_ENG_DEBUG(ENG_DEBUG, "Waiting transfer canceled!");
505 CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this call agent state:%d", pcall_agent->callagent_state);
508 /* if waiting call end for mtc */
509 switch (pcall_agent->io_state) {
510 case VC_INOUT_STATE_INCOME_WAIT_HOLD:
512 if (active_call == FALSE) {
513 CALL_ENG_DEBUG(ENG_DEBUG, "call to hold is disconnected..proceed to answer call");
514 /*It will be better to show end of call
515 _vc_core_tapi_rqst_answer_call( pcall_agent);*/
520 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVECALL:
521 if (active_call == FALSE) {
522 /*_vc_core_tapi_rqst_answer_call( pcall_agent);*/
525 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL:
526 if (held_call == FALSE) {
527 CALL_ENG_DEBUG(ENG_DEBUG, "Answering call after ending held calls");
529 /*Change the state to Income box, so the answer API will process it */
530 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX);
532 /* end held call and then accept incoming call */
533 _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_HOLD_ACTIVE_AND_ACCEPT, &error_code);
536 #ifdef RELEASE_ALL_AND_ACCEPT_SUPPORT
537 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_HOLDCALL_FOR_ALL_RELEASE:
538 if (held_call == FALSE) {
539 CALL_ENG_DEBUG(ENG_DEBUG, "Answering(rel and accept) call after ending held calls");
541 /*Change the state to Income box, so the answer API will process it */
542 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_BOX);
544 /* end held call and then accept incoming call */
545 _vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_RELEASE_ACTIVE_AND_ACCEPT, &error_code);
549 case VC_INOUT_STATE_OUTGOING_WAIT_HOLD:
550 _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager);
551 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED);
554 CALL_ENG_DEBUG(ENG_DEBUG, "No Actions defined for IO State: %d", pcall_agent->io_state);
557 if (VC_CALL_ORIG_TYPE_SAT == callobject_info.call_type) {
558 if (pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data != NULL) {
559 free(pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data);
560 pcall_agent->call_manager.setupcall_info.satcall_setup_info.psat_rgb_data = NULL;
567 static gboolean __call_vc_process_wait_state_success_events(call_vc_callagent_state_t *pcall_agent)
569 CALL_ENG_DEBUG(ENG_DEBUG, "..");
570 switch (pcall_agent->io_state) {
571 case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED:
574 call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE;
576 if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) {
577 CALL_ENG_DEBUG(ENG_DEBUG, "Separate HOLD_CNF event not arrived for HOLD and ACCEPT request, holding the call in the CONNECTED event");
578 grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager);
580 if (-1 == grp_index) {
581 CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index);
585 _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle);
587 _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD);
589 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
591 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, active_handle, 0, NULL);
593 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED);
598 #ifdef _INCOME_WAIT_CONNECTED_
599 /*currently not applied, Fix to change the group state to hold, if the second call is connected before getting the holdcnf resp from tapi */
600 case VC_INOUT_STATE_INCOME_WAIT_CONNECTED:
602 /*Check for incoming call exists */
603 if (VC_INVALID_CALL_INDEX == pcall_agent->call_manager.mtcall_index) {
604 CALL_ENG_DEBUG(ENG_DEBUG, "No Incoming call exists");
608 if (0 == _vc_core_cm_get_connected_member_count_ingroup(&pcall_agent->call_manager, 0)) {
609 CALL_ENG_DEBUG(ENG_DEBUG, "No Previous Connected Members");
613 /*Connected Event for the incoming call is arrived, when waiting for hold confirmation
614 So change the active call state to hold before processing the connected indication */
615 if (CALL_VC_CA_STATE_WAIT_HOLD == pcall_agent->callagent_state) {
617 /*call_vc_handle active_handle =TAPI_INVALID_CALLHANDLE;*/
618 grp_index = _vc_core_cm_get_active_group_index(&pcall_agent->call_manager);
620 if (-1 == grp_index) {
621 CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index);
624 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
625 /*_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager,&active_handle);*/
626 _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_HOLD);
627 } else if (CALL_VC_CA_STATE_WAIT_UNHOLD == pcall_agent->callagent_state) {
629 call_vc_handle held_handle = VC_TAPI_INVALID_CALLHANDLE;
630 grp_index = _vc_core_cm_get_held_group_index(&pcall_agent->call_manager);
631 if (-1 == grp_index) {
632 CALL_ENG_DEBUG(ENG_DEBUG, " ERROR:No Active Grp Index :grp_index = %d, Active state has been already held, check io state", grp_index);
635 _vc_core_cm_get_first_held_call_handle(&pcall_agent->call_manager, &held_handle);
636 _vc_core_cm_set_group_state(&pcall_agent->call_manager, grp_index, CALL_VC_GROUP_STATE_ACTIVE);
642 case VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED:
644 call_vc_handle active_handle = VC_TAPI_INVALID_CALLHANDLE;;
645 CALL_ENG_DEBUG(ENG_DEBUG, "VC_INOUT_STATE_INCOME_WAIT_RELEASE_ACTIVE_CONNECTED");
646 _vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_handle);
647 CALL_ENG_DEBUG(ENG_DEBUG, "Active Call Handle = %d", active_handle);
649 /*_vc_core_tapi_event_handle_call_end_event(pcall_agent, TAPI_EVENT_CALL_END, active_handle, TAPI_CALL_END_NO_CAUSE);*/
653 CALL_ENG_DEBUG(ENG_DEBUG, "Action not defined for this wait io state: %d", pcall_agent->io_state);
660 * This function handles the TAPI call connect event
662 * @return Returns TRUE on success and FALSE on failure
663 * @param[in] pcall_agent Pointer to the call agent state
664 * @param[in] call_handle call handle assoicated with the call being connected
666 gboolean _vc_core_tapi_event_handle_call_connect_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle)
668 call_vc_call_objectinfo_t callobject_info;
670 int connectednum = 0;
672 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
674 /* Verify call handle */
675 CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle);
677 _vc_core_cm_clear_call_object(&callobject_info);
678 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
679 CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error");
683 /*First Process the wait state events before processing the connect event */
684 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
685 __call_vc_process_wait_state_success_events(pcall_agent);
686 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
688 /*Process Connected Event*/
689 /* Get the member info and chage info */
690 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
693 ** Reqeust from SAT. When GCF field is ON, send response when get a setup confirm.
694 ** To send response to SAT faster...
696 #ifndef _vc_core_ca_send_sat_response_ORIG
697 if (FALSE == _vc_core_util_check_gcf_status()) {
698 if (callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) {
699 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_ME_RET_SUCCESS);
704 _vc_core_cm_change_call_state(&callobject_info, VC_CALL_STATE_CONNECTED);
706 VOICECALL_RETURN_FALSE_IF_FAIL(callobject_info.call_id != VC_INVALID_CALL_ID);
708 index = _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
709 VOICECALL_RETURN_FALSE_IF_FAIL(index != -1);
711 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);
712 CALL_ENG_DEBUG(ENG_DEBUG, "Connected Member Num before adding Connected call to group is :%d", connectednum);
714 /*If any previous calls are not cleared after end, clear it here so makes provision to add one more call to the call manager */
715 _vc_core_cm_clear_endcall_member(&pcall_agent->call_manager);
717 /*Add the conneted call to the active group */
718 if (FALSE == _vc_core_cm_add_call_member_togroup(&pcall_agent->call_manager, index)) {
719 CALL_ENG_DEBUG(ENG_ERR, "Call Object not added to the Group, [PROBLEM] !!!");
722 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
724 /* Send Connected Event to the Client */
725 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_CONNECTED, callobject_info.call_handle, 0, NULL);
727 /* Once the Call is connected, change the InOut state to None */
728 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE);
730 /*Getting AOC PPM Value is delayed to make the current flow faster by adding it to g_idle_add */
731 g_idle_add(__call_vc_get_aoc_ppm_value_idle_cb, pcall_agent);
733 if (_vc_core_engine_status_get_download_call(pcall_agent) == TRUE) {
734 g_timeout_add(9000, __call_vc_download_call_timer_cb, pcall_agent);
736 _vc_core_util_download_test_call("downloadcall_success");
743 * This function handles call hold event
745 * @return Returns TRUE on success and FALSE on failure
746 * @param[in] pcall_agent Pointer to the call agent state
747 * @param[in] call_handle call handle assoicated with the call being held
748 * @param[in] status TAPI cause incase of hold failed
750 gboolean _vc_core_tapi_event_handle_call_held_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
752 call_vc_call_objectinfo_t callobject_info;
754 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
756 CALL_ENG_DEBUG(ENG_DEBUG, "");
758 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
760 /* Verify call handle */
761 CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d, status = %d", call_handle, status);
763 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
764 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
768 if (TAPI_CAUSE_SUCCESS != status) {
769 switch (pcall_agent->io_state) {
770 case VC_INOUT_STATE_OUTGOING_WAIT_HOLD:
772 /* Recover and reset related state variable */
773 if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info) == FALSE) {
774 CALL_ENG_DEBUG(ENG_DEBUG, "Outgoing call info does not exist");
778 if ((callobject_info.call_type == VC_CALL_ORIG_TYPE_SAT) && \
779 ((pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \
780 TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD) || \
781 (pcall_agent->call_manager.setupcall_info.satcall_setup_info.satengine_setupcall_data.calltype == \
782 TAPI_SAT_SETUP_CALL_PUT_ALL_OTHER_CALLS_ON_HOLD_WITH_REDIAL))) {
784 /* Terminal Response for Option B */
785 /* _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND); */
786 /* Terminal Response for Option A */
787 _vc_core_ca_send_sat_response(pcall_agent, SAT_RQST_SETUP_CALL, CALL_VC_NETWORK_UNABLE_TO_PROCESS_COMMAND_WITHOUT_CAUSE);
790 _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager);
792 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING_ABORTED, VC_ENDCAUSE_CALL_ENDED, 0, NULL);
794 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_NONE);
798 case VC_INOUT_STATE_INCOME_WAIT_HOLD:
801 case VC_INOUT_STATE_NONE:
805 CALL_ENG_DEBUG(ENG_DEBUG, "_vc_core_tapi_event_handle_call_held_event(fail): Not allowed io_state=%d", pcall_agent->io_state);
809 switch (pcall_agent->callagent_state) {
811 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
813 /* Reset the Agent State */
814 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
815 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL);
819 case CALL_VC_CA_STATE_WAIT_SWAP:
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);
826 case CALL_VC_CA_STATE_WAIT_HOLD:
828 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
829 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_HOLD_FAILED, 0, NULL);
832 case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL:
834 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
837 case CALL_VC_CA_STATE_NORMAL:
838 default: /*Fall Through */
839 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
847 /* Get the Group Index */
848 index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle);
849 grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index);
851 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, grp_state);
853 switch (pcall_agent->io_state) {
854 case VC_INOUT_STATE_OUTGOING_WAIT_HOLD:
856 /* Change the Group State */
857 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
858 CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index);
860 /* Send Call Held Event to the Client */
861 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL);
863 if (_vc_core_tapi_rqst_setup_call(pcall_agent) == FALSE) {
864 _vc_core_cm_clear_outgoing_call(&pcall_agent->call_manager);
865 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_ABORTED);
867 call_vc_handle outgoing_call_handle = VC_TAPI_INVALID_CALLHANDLE;
869 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_OUTGOING_WAIT_ORIG);
870 outgoing_call_handle = _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager);
871 CALL_ENG_DEBUG(ENG_DEBUG, "Deffered Outgoing Call Handle = %d", outgoing_call_handle);
872 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_OUTGOING, outgoing_call_handle, 0, NULL);
875 if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD)
876 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
880 case VC_INOUT_STATE_INCOME_WAIT_HOLD:
884 /*Change the Group State*/
885 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
886 CALL_ENG_DEBUG(ENG_DEBUG, "Gropu Index: %d , set to GROUP_STATE_HOLD", index);
888 if (_vc_core_tapi_rqst_answer_call(pcall_agent, VC_ANSWER_NORMAL, &error_code)) {
889 CALL_ENG_DEBUG(ENG_DEBUG, "Voicecall Answered");
890 /*TODO: Inform client to update ui */
892 if (pcall_agent->callagent_state == CALL_VC_CA_STATE_WAIT_HOLD) {
893 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
897 case VC_INOUT_STATE_INCOME_WAIT_HOLD_CONNECTED:
899 CALL_ENG_DEBUG(ENG_DEBUG, "Hold arrived for Hold and Accept Event, Current IO State:%d", pcall_agent->io_state);
900 /*Change state to wait_connected */
901 _vc_core_ca_change_inout_state(pcall_agent, VC_INOUT_STATE_INCOME_WAIT_CONNECTED);
904 case VC_INOUT_STATE_NONE:
905 default: /*Fall Through */
906 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed io_state=%d", pcall_agent->io_state);
910 switch (pcall_agent->callagent_state) {
912 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
914 int held_call_num = 0;
915 int act_call_num = 0;
917 held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager);
918 act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager);
919 if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) {
920 if (CALL_VC_GROUP_STATE_HOLD != grp_state) {
921 /* Set the State to HOLD and inform client */
922 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
923 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, 0, 0, NULL);
925 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
927 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP);
932 case CALL_VC_CA_STATE_WAIT_SWAP:
934 /*Always reset the agent state as the event for this wait state is arrived */
935 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
937 /*Swap the state only if the group state of the given call handle is not in hold state already
938 as this is a hold confirmation event */
939 if (CALL_VC_GROUP_STATE_HOLD != grp_state) {
940 _vc_core_cm_swap_group_state(&pcall_agent->call_manager);
941 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL);
945 case CALL_VC_CA_STATE_WAIT_HOLD:
947 /* Change the Group State */
948 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_HOLD);
949 CALL_ENG_DEBUG(ENG_DEBUG, "Group Index: %d , set to GROUP_STATE_HOLD", index);
951 /* Change Call Agent State */
952 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
954 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_HELD, call_handle, 0, NULL);
957 case CALL_VC_CA_STATE_SS_WAIT_RELEASE_ALL_ACTIVECALL:
959 gboolean active_call = _vc_core_cm_isexists_active_call(&pcall_agent->call_manager);
960 gboolean held_call = _vc_core_cm_isexists_held_call(&pcall_agent->call_manager);
962 /*Upon waiting for the success event for hold request,
963 Other calls might have been released during this time, so the held call need to retrieved */
964 if ((active_call == FALSE) && (held_call == TRUE)) {
965 CALL_ENG_DEBUG(ENG_DEBUG, "Unhold call");
966 if (_vc_core_tapi_rqst_retrieve_call(pcall_agent) == TRUE) {
967 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_UNHOLD);
972 case CALL_VC_CA_STATE_NORMAL:
973 default: /*Fall Through */
974 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
984 * This function handles TAPI call activate/retrieve event
986 * @return Returns TRUE on success and FALSE on failure
987 * @param[in] pcall_agent Pointer to the call agent state
988 * @param[in] call_handle call handle associated with the call being retrieved
989 * @param[in] status TAPI cause in case of retrieve failed
991 gboolean _vc_core_tapi_event_handle_call_retrieve_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
993 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
995 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status);
997 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
998 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
1002 if (TAPI_CAUSE_SUCCESS != status) {
1003 switch (pcall_agent->callagent_state) {
1005 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
1007 /*Reset the Agent State*/
1008 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1009 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SWAP_FAILED, 0, NULL);
1013 case CALL_VC_CA_STATE_WAIT_SWAP:
1015 /*Reset the Call 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);
1020 case CALL_VC_CA_STATE_WAIT_UNHOLD:
1022 /*Reset the Agent State*/
1023 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1024 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_RETREIVE_FAILED, 0, NULL);
1028 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
1035 int cur_grp_state = 0;
1037 /*Get the Group Index and current group status */
1038 index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle);
1039 cur_grp_state = _vc_core_cm_get_group_state(&pcall_agent->call_manager, index);
1041 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, GP_Index:%d, Cur Gp State: %d", call_handle, index, cur_grp_state);
1043 switch (pcall_agent->callagent_state) {
1045 case CALL_VC_CA_STATE_WAIT_SWAP_HOLD_OR_ACTIVATE:
1047 int held_call_num = 0;
1048 int act_call_num = 0;
1050 held_call_num = _vc_core_cm_get_held_call_count(&pcall_agent->call_manager);
1051 act_call_num = _vc_core_cm_get_active_call_count(&pcall_agent->call_manager);
1052 if ((held_call_num > 0 && act_call_num <= 0) || (act_call_num > 0 && held_call_num <= 0)) {
1053 if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) {
1054 /* Set the State ACTIVE and inform client */
1055 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE);
1056 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, 0, 0, NULL);
1058 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1060 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_WAIT_SWAP);
1065 case CALL_VC_CA_STATE_WAIT_SWAP:
1067 /* Always reset the agent state as the event for the wait state is arrived */
1068 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1070 /*Change the state only when the current state of the given handle is not in ACTIVE state */
1071 if (CALL_VC_GROUP_STATE_ACTIVE != cur_grp_state) {
1072 _vc_core_cm_swap_group_state(&pcall_agent->call_manager);
1073 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SWAP, call_handle, 0, NULL);
1077 case CALL_VC_CA_STATE_WAIT_UNHOLD:
1080 /* get the member info and chage info */
1081 index = _vc_core_cm_get_group_index(&pcall_agent->call_manager, call_handle);
1082 _vc_core_cm_set_group_state(&pcall_agent->call_manager, index, CALL_VC_GROUP_STATE_ACTIVE);
1084 _vc_core_ca_change_agent_state(pcall_agent, CALL_VC_CA_STATE_NORMAL);
1086 /*Send Call Retreived Event to Client*/
1087 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_RETREIVED, call_handle, 0, NULL);
1091 CALL_ENG_DEBUG(ENG_DEBUG, "Not allowed callagent_state=%d", pcall_agent->callagent_state);
1092 /*return FALSE if the event is not handled here, because end call memeber will be unnecessarily cleared if returned TRUE */
1103 * This function handles call join/conference event
1105 * @return Returns TRUE on success and FALSE on failure
1106 * @param[in] pcall_agent Pointer to the call agent state
1107 * @param[in] call_handle call handle assoicated with the call being joined
1108 * @param[in] status tapi cause incase of join failed
1110 gboolean _vc_core_tapi_event_handle_call_join_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
1112 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1114 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status);
1116 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1117 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
1121 if (TAPI_CAUSE_SUCCESS != status) {
1122 CALL_ENG_DEBUG(ENG_DEBUG, "Join fail and return..");
1123 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SETUP_CONF_FAILED, 0, NULL);
1127 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
1129 /* get the member info and chage info */
1130 _vc_core_cm_join_group(&pcall_agent->call_manager);
1132 CALL_VC_DUMP_CALLDETAILS(&pcall_agent->call_manager);
1134 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SETUP_CONF, 0, 0, NULL);
1139 * This function handles call split/private call event
1141 * @return Returns TRUE on success and FALSE on failure
1142 * @param[in] pcall_agent Pointer to the call agent state
1143 * @param[in] call_handle call handle associated with the call being made as private call
1144 * @param[in] status TAPI cause in case of split failed
1146 gboolean _vc_core_tapi_event_handle_call_split_event(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallCause_t status)
1148 call_vc_call_objectinfo_t callobject_info;
1150 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1152 CALL_ENG_DEBUG(ENG_DEBUG, "Call Handle = %d, status = %d", call_handle, status);
1154 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1155 CALL_ENG_DEBUG(ENG_DEBUG, "INVALID_CALLHANDLE Error");
1156 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL);
1160 if (TAPI_CAUSE_SUCCESS != status) {
1161 CALL_ENG_DEBUG(ENG_DEBUG, "Split fail and return..");
1162 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, ERROR_VOICECALL_SPLIT_CONF_FAILED, 0, NULL);
1166 /* get the member info and chage info */
1167 _vc_core_cm_clear_call_object(&callobject_info);
1168 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
1170 _vc_core_cm_split_group(&pcall_agent->call_manager, call_handle);
1172 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_SPLIT_CONF, call_handle, 0, NULL); /* Added Call handle */
1177 * This function handles the call transfer event
1179 * @return Returns TRUE on success and FALSE on failure
1180 * @param[in] pcall_agent Pointer to the call agent state
1181 * @param[in] status TAPI cause in case of hold failed
1183 gboolean _vc_core_tapi_event_handle_call_transfer_event(call_vc_callagent_state_t *pcall_agent, TelCallCause_t status)
1185 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1187 CALL_ENG_DEBUG(ENG_DEBUG, "Started, status = %d", status);
1189 if (TAPI_CAUSE_SUCCESS != status) {
1191 CALL_ENG_DEBUG(ENG_DEBUG, "TapiTransfer Failed");
1192 if (VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_incoming_call_handle(&pcall_agent->call_manager)
1193 && VC_TAPI_INVALID_CALLHANDLE == _vc_core_cm_get_outgoing_call_handle(&pcall_agent->call_manager)) {
1194 err_cause = ERROR_VOICECALL_TRANSFER_FAILED;
1197 if (_vc_core_cm_isexists_incoming_call(&pcall_agent->call_manager)) {
1198 err_cause = ERROR_VOICECALL_TRANSFER_FAILED;
1199 } else if (VC_INOUT_STATE_OUTGOING_WAIT_CONNECTED == pcall_agent->io_state) {
1200 err_cause = ERROR_VOICECALL_TRANSFER_FAILED;
1204 _vc_core_ca_send_event_to_client(pcall_agent, VC_ERROR_OCCURED, err_cause, 0, NULL);
1205 CALL_ENG_DEBUG(ENG_DEBUG, "Transfer failed and return..");
1209 CALL_ENG_DEBUG(ENG_DEBUG, "Transfer success!");
1210 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_SS_TRANSFERRED, 0, 0, NULL);
1212 /*todo ss: Check Updating flag gbpsh_voicecall_command_transfer*/
1217 * This function handles the TAPI connected line indication handle
1219 * @return Returns TRUE on success and FALSE on failure
1220 * @param[in] pcall_agent Pointer to the call agent state
1221 * @param[in] call_handle TAPI Call Handle associated with connected line indication
1222 * @param[in] connected_number_info Connected Number Details
1224 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)
1226 call_vc_call_objectinfo_t callobject_info;
1227 call_vc_handle active_call_handle = VC_TAPI_INVALID_CALLHANDLE;
1228 gboolean bConnectedCall = FALSE;
1230 CALL_ENG_DEBUG(ENG_DEBUG, ":Number(%s)", connected_number_info->number);
1232 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1234 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1235 CALL_ENG_DEBUG(ENG_ERR, " INVALID_CALLHANDLE Error");
1239 _vc_core_cm_clear_call_object(&callobject_info);
1241 if (_vc_core_cm_get_outgoing_call_info(&pcall_agent->call_manager, &callobject_info)) {
1242 if (callobject_info.call_handle != call_handle) {
1243 CALL_ENG_DEBUG(ENG_ERR, "It is not outging call(Call Handle = %d, MO Call Handle =%d)", call_handle, callobject_info.call_handle);
1247 if (_vc_core_cm_get_first_active_call_handle(&pcall_agent->call_manager, &active_call_handle) == -1) {
1248 CALL_ENG_DEBUG(ENG_ERR, "No Active Calls(Call Handle = %d)", call_handle);
1252 if (active_call_handle != call_handle) {
1253 CALL_ENG_DEBUG(ENG_ERR, "Call Handle Mismatch(Call Handle = %d)", call_handle);
1257 _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info);
1258 bConnectedCall = TRUE;
1261 switch (connected_number_info->name_mode) {
1262 case TAPI_CALL_NAME_AVAIL: /*if sznumber of the callInfo is null, set Anoymous*/
1264 if (0 == strlen(connected_number_info->number)) {
1265 /*Forwarded Call number is unknown*/
1266 memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber));
1268 _vc_core_util_strcpy(callobject_info.connected_telnumber, sizeof(callobject_info.connected_telnumber), connected_number_info->number);
1273 case TAPI_CALL_NAME_RESTRICTED:
1274 case TAPI_CALL_NAME_AVAIL_RESTRICTED: /*withheld*/
1275 /*Forwarded Call number is unknown*/
1276 memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber));
1279 case TAPI_CALL_NAME_UNAVAIL: /*Anoymous*/
1281 /*Forwarded Call number is unknown*/
1282 memset(callobject_info.connected_telnumber, 0, sizeof(callobject_info.connected_telnumber));
1286 /*Set the modified call object to call manager*/
1287 _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
1289 /*Send Event to the Client*/
1290 _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);
1296 * This function handles the AOC Event
1298 * @return Returns TRUE on success and FALSE on failure
1299 * @param[in] pcall_agent Pointer to the call agent state
1300 * @param[in] call_handle Call Handle
1301 * @param[in] ptapi_aoc_info AOC info associated with the AOC Event
1303 gboolean _vc_core_tapi_event_handle_aoc(call_vc_callagent_state_t *pcall_agent, call_vc_handle call_handle, TelCallAocInfo_t *ptapi_aoc_info)
1305 call_vc_call_objectinfo_t callobject_info;
1307 VOICECALL_RETURN_FALSE_IF_FAIL(pcall_agent != NULL);
1309 CALL_ENG_DEBUG(ENG_DEBUG, "Started, Call Handle = %d", call_handle);
1310 if (call_handle == VC_TAPI_INVALID_CALLHANDLE) {
1311 CALL_ENG_DEBUG(ENG_ERR, "INVALID_CALLHANDLE Error");
1315 /* get the member info and chage info */
1316 _vc_core_cm_clear_call_object(&callobject_info);
1317 if (FALSE == _vc_core_cm_get_call_object(&pcall_agent->call_manager, call_handle, &callobject_info)) {
1318 CALL_ENG_DEBUG(ENG_ERR, "Call Object Not available");
1322 /* Store the call cost TAPI info */
1323 callobject_info.aoc_ccm = ptapi_aoc_info->CCM;
1324 memcpy((void *)callobject_info.aoc_currency, (const void *)ptapi_aoc_info->szCurrency, VC_AOC_CURRENCY_CODE_LEN_MAX);
1326 /* Set the modified call object to the Call Mangaer */
1327 _vc_core_cm_set_call_object(&pcall_agent->call_manager, &callobject_info);
1329 _vc_core_ca_send_event_to_client(pcall_agent, VC_CALL_IND_AOC, call_handle, 0, &callobject_info);
1334 static gboolean __call_vc_get_aoc_ppm_value_idle_cb(gpointer pdata)
1336 call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata;
1337 __call_vc_get_aoc_ppm_value(pcall_agent);
1341 static gboolean __call_vc_download_call_timer_cb(gpointer pdata)
1343 call_vc_callagent_state_t *pcall_agent = (call_vc_callagent_state_t *)pdata;
1344 _vc_core_ca_end_all_calls(pcall_agent);
1348 static void __call_vc_get_aoc_ppm_value(call_vc_callagent_state_t *pcall_agent)
1350 TapiResult_t tapi_error = TAPI_API_SUCCESS;
1352 CALL_ENG_DEBUG(ENG_DEBUG, "..");
1354 if (pcall_agent->aoc_ppm == VC_INVALID_PPM) {
1355 tapi_error = tel_get_ss_aoc_info(pcall_agent->tapi_handle, TAPI_SS_AOC_TYPE_PUC, _vc_core_engine_get_aoc_info_cb, NULL);
1357 if (tapi_error != TAPI_API_SUCCESS) {
1358 CALL_ENG_DEBUG(ENG_ERR, "TAPI Error: %x", tapi_error);