1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCallInfo.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,590 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "CSFLog.h" 1.9 + 1.10 +#include "CC_Common.h" 1.11 + 1.12 +#include "CC_SIPCCCallInfo.h" 1.13 +#include "CC_SIPCCLine.h" 1.14 + 1.15 +extern "C" 1.16 +{ 1.17 +#include "ccapi_call.h" 1.18 +#include "ccapi_call_info.h" 1.19 +#include "fsmdef_states.h" 1.20 +} 1.21 + 1.22 +static const char* logTag = "CC_SIPCCCallInfo"; 1.23 + 1.24 +using namespace std; 1.25 +using namespace CSF; 1.26 + 1.27 +CC_SIPCCCallInfo::CC_SIPCCCallInfo (cc_callinfo_ref_t callinfo) : callinfo_ref(callinfo) 1.28 +{ 1.29 + CCAPI_Call_retainCallInfo(callinfo); 1.30 +} 1.31 + 1.32 +CSF_IMPLEMENT_WRAP(CC_SIPCCCallInfo, cc_callinfo_ref_t); 1.33 + 1.34 +CC_SIPCCCallInfo::~CC_SIPCCCallInfo() 1.35 +{ 1.36 + CCAPI_Call_releaseCallInfo(callinfo_ref); 1.37 +} 1.38 + 1.39 +bool CC_SIPCCCallInfo::hasCapability (CC_CallCapabilityEnum::CC_CallCapability capability) 1.40 +{ 1.41 + generateCapabilities(); 1.42 + return (caps.find(capability) != caps.end()); 1.43 +} 1.44 + 1.45 +set<CC_CallCapabilityEnum::CC_CallCapability> CC_SIPCCCallInfo::getCapabilitySet() 1.46 +{ 1.47 + generateCapabilities(); 1.48 + set<CC_CallCapabilityEnum::CC_CallCapability> callCaps(caps); 1.49 + return callCaps; 1.50 +} 1.51 + 1.52 +/* 1.53 +CC_LinePtr CC_SIPCCCallInfo::getLine () 1.54 +{ 1.55 +} 1.56 +*/ 1.57 + 1.58 +cc_call_state_t CC_SIPCCCallInfo::getCallState() 1.59 +{ 1.60 + return CCAPI_CallInfo_getCallState(callinfo_ref); 1.61 +} 1.62 + 1.63 +fsmdef_states_t CC_SIPCCCallInfo::getFsmState() const 1.64 +{ 1.65 + return CCAPI_CallInfo_getFsmState(callinfo_ref); 1.66 +} 1.67 + 1.68 +std::string CC_SIPCCCallInfo::fsmStateToString (fsmdef_states_t state) const 1.69 +{ 1.70 + return fsmdef_state_name(state); 1.71 +} 1.72 + 1.73 +std::string CC_SIPCCCallInfo::callStateToString (cc_call_state_t state) 1.74 +{ 1.75 + std::string statestr = ""; 1.76 + 1.77 + switch(state) { 1.78 + case OFFHOOK: 1.79 + statestr = "OFFHOOK"; 1.80 + break; 1.81 + case ONHOOK: 1.82 + statestr = "ONHOOK"; 1.83 + break; 1.84 + case RINGOUT: 1.85 + statestr = "RINGOUT"; 1.86 + break; 1.87 + case RINGIN: 1.88 + statestr = "RINGIN"; 1.89 + break; 1.90 + case PROCEED: 1.91 + statestr = "PROCEED"; 1.92 + break; 1.93 + case CONNECTED: 1.94 + statestr = "CONNECTED"; 1.95 + break; 1.96 + case HOLD: 1.97 + statestr = "ONHOOK"; 1.98 + break; 1.99 + case REMHOLD: 1.100 + statestr = "REMHOLD"; 1.101 + break; 1.102 + case RESUME: 1.103 + statestr = "RESUME"; 1.104 + break; 1.105 + case BUSY: 1.106 + statestr = "BUSY"; 1.107 + break; 1.108 + case REORDER: 1.109 + statestr = "REORDER"; 1.110 + break; 1.111 + case CONFERENCE: 1.112 + statestr = "CONFERENCE"; 1.113 + break; 1.114 + case DIALING: 1.115 + statestr = "DIALING"; 1.116 + break; 1.117 + case REMINUSE: 1.118 + statestr = "REMINUSE"; 1.119 + break; 1.120 + case HOLDREVERT: 1.121 + statestr = "HOLDREVERT"; 1.122 + break; 1.123 + case WHISPER: 1.124 + statestr = "WHISPER"; 1.125 + break; 1.126 + case PRESERVATION: 1.127 + statestr = "PRESERVATION"; 1.128 + break; 1.129 + case WAITINGFORDIGITS: 1.130 + statestr = "WAITINGFORDIGITS"; 1.131 + break; 1.132 + case CREATEOFFERSUCCESS: 1.133 + statestr = "CREATEOFFERSUCCESS"; 1.134 + break; 1.135 + case CREATEANSWERSUCCESS: 1.136 + statestr = "CREATEANSWERSUCCESS"; 1.137 + break; 1.138 + case CREATEOFFERERROR: 1.139 + statestr = "CREATEOFFERERROR"; 1.140 + break; 1.141 + case CREATEANSWERERROR: 1.142 + statestr = "CREATEANSWERERROR"; 1.143 + break; 1.144 + case SETLOCALDESCSUCCESS: 1.145 + statestr = "SETLOCALDESCSUCCESS"; 1.146 + break; 1.147 + case SETREMOTEDESCSUCCESS: 1.148 + statestr = "SETREMOTEDESCSUCCESS"; 1.149 + break; 1.150 + case UPDATELOCALDESC: 1.151 + statestr = "UPDATELOCALDESC"; 1.152 + break; 1.153 + case SETLOCALDESCERROR: 1.154 + statestr = "SETLOCALDESCERROR"; 1.155 + break; 1.156 + case SETREMOTEDESCERROR: 1.157 + statestr = "SETREMOTEDESCERROR"; 1.158 + break; 1.159 + case REMOTESTREAMADD: 1.160 + statestr = "REMOTESTREAMADD"; 1.161 + break; 1.162 + case ADDICECANDIDATE: 1.163 + statestr = "ADDICECANDIDATE"; 1.164 + break; 1.165 + case ADDICECANDIDATEERROR: 1.166 + statestr = "ADDICECANDIDATEERROR"; 1.167 + break; 1.168 + default: 1.169 + break; 1.170 + } 1.171 + 1.172 + return statestr; 1.173 +} 1.174 + 1.175 +std::string CC_SIPCCCallInfo::callEventToString (ccapi_call_event_e callEvent) 1.176 +{ 1.177 + std::string statestr = ""; 1.178 + 1.179 + switch(callEvent) { 1.180 + case CCAPI_CALL_EV_CREATED: 1.181 + statestr = "CCAPI_CALL_EV_CREATED"; 1.182 + break; 1.183 + case CCAPI_CALL_EV_STATE: 1.184 + statestr = "CCAPI_CALL_EV_STATE"; 1.185 + break; 1.186 + case CCAPI_CALL_EV_CALLINFO: 1.187 + statestr = "CCAPI_CALL_EV_CALLINFO"; 1.188 + break; 1.189 + case CCAPI_CALL_EV_ATTR: 1.190 + statestr = "CCAPI_CALL_EV_ATTR"; 1.191 + break; 1.192 + case CCAPI_CALL_EV_SECURITY: 1.193 + statestr = "CCAPI_CALL_EV_SECURITY"; 1.194 + break; 1.195 + case CCAPI_CALL_EV_LOG_DISP: 1.196 + statestr = "CCAPI_CALL_EV_LOG_DISP"; 1.197 + break; 1.198 + case CCAPI_CALL_EV_PLACED_CALLINFO: 1.199 + statestr = "CCAPI_CALL_EV_PLACED_CALLINFO"; 1.200 + break; 1.201 + case CCAPI_CALL_EV_STATUS: 1.202 + statestr = "CCAPI_CALL_EV_STATUS"; 1.203 + break; 1.204 + case CCAPI_CALL_EV_SELECT: 1.205 + statestr = "CCAPI_CALL_EV_SELECT"; 1.206 + break; 1.207 + case CCAPI_CALL_EV_LAST_DIGIT_DELETED: 1.208 + statestr = "CCAPI_CALL_EV_LAST_DIGIT_DELETED"; 1.209 + break; 1.210 + case CCAPI_CALL_EV_GCID: 1.211 + statestr = "CCAPI_CALL_EV_GCID"; 1.212 + break; 1.213 + case CCAPI_CALL_EV_XFR_OR_CNF_CANCELLED: 1.214 + statestr = "CCAPI_CALL_EV_XFR_OR_CNF_CANCELLED"; 1.215 + break; 1.216 + case CCAPI_CALL_EV_PRESERVATION: 1.217 + statestr = "CCAPI_CALL_EV_PRESERVATION"; 1.218 + break; 1.219 + case CCAPI_CALL_EV_CAPABILITY: 1.220 + statestr = "CCAPI_CALL_EV_CAPABILITY"; 1.221 + break; 1.222 + case CCAPI_CALL_EV_VIDEO_AVAIL: 1.223 + statestr = "CCAPI_CALL_EV_VIDEO_AVAIL"; 1.224 + break; 1.225 + case CCAPI_CALL_EV_VIDEO_OFFERED: 1.226 + statestr = "CCAPI_CALL_EV_VIDEO_OFFERED"; 1.227 + break; 1.228 + case CCAPI_CALL_EV_RECEIVED_INFO: 1.229 + statestr = "CCAPI_CALL_EV_RECEIVED_INFO"; 1.230 + break; 1.231 + case CCAPI_CALL_EV_RINGER_STATE: 1.232 + statestr = "CCAPI_CALL_EV_RINGER_STATE"; 1.233 + break; 1.234 + case CCAPI_CALL_EV_CONF_PARTICIPANT_INFO: 1.235 + statestr = "CCAPI_CALL_EV_CONF_PARTICIPANT_INFO"; 1.236 + break; 1.237 + case CCAPI_CALL_EV_MEDIA_INTERFACE_UPDATE_BEGIN: 1.238 + statestr = "CCAPI_CALL_EV_MEDIA_INTERFACE_UPDATE_BEGIN"; 1.239 + break; 1.240 + case CCAPI_CALL_EV_MEDIA_INTERFACE_UPDATE_SUCCESSFUL: 1.241 + statestr = "CCAPI_CALL_EV_MEDIA_INTERFACE_UPDATE_SUCCESSFUL"; 1.242 + break; 1.243 + case CCAPI_CALL_EV_MEDIA_INTERFACE_UPDATE_FAIL: 1.244 + statestr = "CCAPI_CALL_EV_MEDIA_INTERFACE_UPDATE_FAIL"; 1.245 + break; 1.246 + default: 1.247 + break; 1.248 + } 1.249 + 1.250 + return statestr; 1.251 +} 1.252 + 1.253 +bool CC_SIPCCCallInfo::getRingerState() 1.254 +{ 1.255 + if (CCAPI_CallInfo_getRingerState(callinfo_ref)) 1.256 + { 1.257 + return true; 1.258 + } 1.259 + else 1.260 + { 1.261 + return false; 1.262 + } 1.263 +} 1.264 + 1.265 +cc_call_attr_t CC_SIPCCCallInfo::getCallAttr() 1.266 +{ 1.267 + return CCAPI_CallInfo_getCallAttr(callinfo_ref); 1.268 +} 1.269 + 1.270 +cc_call_type_t CC_SIPCCCallInfo::getCallType() 1.271 +{ 1.272 + return CCAPI_CallInfo_getCallType(callinfo_ref); 1.273 +} 1.274 + 1.275 +string CC_SIPCCCallInfo::getCalledPartyName() 1.276 +{ 1.277 + return CCAPI_CallInfo_getCalledPartyName(callinfo_ref); 1.278 +} 1.279 + 1.280 +string CC_SIPCCCallInfo::getCalledPartyNumber() 1.281 +{ 1.282 + return CCAPI_CallInfo_getCalledPartyNumber(callinfo_ref); 1.283 +} 1.284 + 1.285 +string CC_SIPCCCallInfo::getCallingPartyName() 1.286 +{ 1.287 + return CCAPI_CallInfo_getCallingPartyName(callinfo_ref); 1.288 +} 1.289 + 1.290 +string CC_SIPCCCallInfo::getCallingPartyNumber() 1.291 +{ 1.292 + return CCAPI_CallInfo_getCallingPartyNumber(callinfo_ref); 1.293 +} 1.294 + 1.295 +string CC_SIPCCCallInfo::getAlternateNumber() 1.296 +{ 1.297 + return CCAPI_CallInfo_getAlternateNumber(callinfo_ref); 1.298 +} 1.299 + 1.300 +CC_LinePtr CC_SIPCCCallInfo::getline () 1.301 +{ 1.302 + cc_lineid_t lineId = CCAPI_CallInfo_getLine(callinfo_ref); 1.303 + return CC_SIPCCLine::wrap(lineId).get(); 1.304 +} 1.305 + 1.306 +string CC_SIPCCCallInfo::getOriginalCalledPartyName() 1.307 +{ 1.308 + return CCAPI_CallInfo_getOriginalCalledPartyName(callinfo_ref); 1.309 +} 1.310 + 1.311 +string CC_SIPCCCallInfo::getOriginalCalledPartyNumber() 1.312 +{ 1.313 + return CCAPI_CallInfo_getOriginalCalledPartyNumber(callinfo_ref); 1.314 +} 1.315 + 1.316 +string CC_SIPCCCallInfo::getLastRedirectingPartyName() 1.317 +{ 1.318 + return CCAPI_CallInfo_getLastRedirectingPartyName(callinfo_ref); 1.319 +} 1.320 + 1.321 +string CC_SIPCCCallInfo::getLastRedirectingPartyNumber() 1.322 +{ 1.323 + return CCAPI_CallInfo_getLastRedirectingPartyNumber(callinfo_ref); 1.324 +} 1.325 + 1.326 +string CC_SIPCCCallInfo::getPlacedCallPartyName() 1.327 +{ 1.328 + return CCAPI_CallInfo_getPlacedCallPartyName(callinfo_ref); 1.329 +} 1.330 + 1.331 +string CC_SIPCCCallInfo::getPlacedCallPartyNumber() 1.332 +{ 1.333 + return CCAPI_CallInfo_getPlacedCallPartyNumber(callinfo_ref); 1.334 +} 1.335 + 1.336 +cc_int32_t CC_SIPCCCallInfo::getCallInstance() 1.337 +{ 1.338 + return CCAPI_CallInfo_getCallInstance(callinfo_ref); 1.339 +} 1.340 + 1.341 +string CC_SIPCCCallInfo::getStatus() 1.342 +{ 1.343 + return CCAPI_CallInfo_getStatus(callinfo_ref); 1.344 +} 1.345 + 1.346 +cc_call_security_t CC_SIPCCCallInfo::getSecurity() 1.347 +{ 1.348 + return CCAPI_CallInfo_getSecurity(callinfo_ref); 1.349 +} 1.350 + 1.351 +cc_int32_t CC_SIPCCCallInfo::getSelectionStatus() 1.352 +{ 1.353 + return CCAPI_CallInfo_getSelectionStatus(callinfo_ref); 1.354 +} 1.355 + 1.356 +string CC_SIPCCCallInfo::getGCID() 1.357 +{ 1.358 + return CCAPI_CallInfo_getGCID(callinfo_ref); 1.359 +} 1.360 + 1.361 +bool CC_SIPCCCallInfo::getIsRingOnce() 1.362 +{ 1.363 + return (CCAPI_CallInfo_getIsRingOnce(callinfo_ref) != 0); 1.364 +} 1.365 + 1.366 +int CC_SIPCCCallInfo::getRingerMode() 1.367 +{ 1.368 + return CCAPI_CallInfo_getRingerMode(callinfo_ref); 1.369 +} 1.370 + 1.371 +cc_int32_t CC_SIPCCCallInfo::getOnhookReason() 1.372 +{ 1.373 + return CCAPI_CallInfo_getOnhookReason(callinfo_ref); 1.374 +} 1.375 + 1.376 +bool CC_SIPCCCallInfo::getIsConference() 1.377 +{ 1.378 + return (CCAPI_CallInfo_getIsConference(callinfo_ref) != 0); 1.379 +} 1.380 + 1.381 +set<cc_int32_t> CC_SIPCCCallInfo::getStreamStatistics() 1.382 +{ 1.383 + CSFLogError(logTag, "CCAPI_CallInfo_getCapabilitySet() NOT IMPLEMENTED IN PSIPCC."); 1.384 + set<cc_int32_t> stats; 1.385 + return stats; 1.386 +} 1.387 + 1.388 +bool CC_SIPCCCallInfo::isCallSelected() 1.389 +{ 1.390 + return (CCAPI_CallInfo_isCallSelected(callinfo_ref) != 0); 1.391 +} 1.392 + 1.393 +string CC_SIPCCCallInfo::getINFOPack() 1.394 +{ 1.395 + return CCAPI_CallInfo_getINFOPack(callinfo_ref); 1.396 +} 1.397 + 1.398 +string CC_SIPCCCallInfo::getINFOType() 1.399 +{ 1.400 + return CCAPI_CallInfo_getINFOType(callinfo_ref); 1.401 +} 1.402 + 1.403 +string CC_SIPCCCallInfo::getINFOBody() 1.404 +{ 1.405 + return CCAPI_CallInfo_getINFOBody(callinfo_ref); 1.406 +} 1.407 + 1.408 +cc_calllog_ref_t CC_SIPCCCallInfo::getCallLogRef() 1.409 +{ 1.410 + return CCAPI_CallInfo_getCallLogRef(callinfo_ref); 1.411 +} 1.412 + 1.413 +cc_sdp_direction_t CC_SIPCCCallInfo::getVideoDirection() 1.414 +{ 1.415 + return CCAPI_CallInfo_getVideoDirection(callinfo_ref); 1.416 +} 1.417 + 1.418 +int CC_SIPCCCallInfo::getVolume() 1.419 +{ 1.420 + if( pMediaData != nullptr) 1.421 + { 1.422 + return pMediaData->volume; 1.423 + } 1.424 + else 1.425 + { 1.426 + return -1; 1.427 + } 1.428 +} 1.429 + 1.430 +bool CC_SIPCCCallInfo::isAudioMuted() 1.431 +{ 1.432 + return (CCAPI_CallInfo_isAudioMuted(callinfo_ref) != 0); 1.433 +} 1.434 + 1.435 +bool CC_SIPCCCallInfo::isVideoMuted() 1.436 +{ 1.437 + return (CCAPI_CallInfo_isVideoMuted(callinfo_ref) != 0); 1.438 +} 1.439 + 1.440 +string CC_SIPCCCallInfo::getSDP() 1.441 +{ 1.442 + return CCAPI_CallInfo_getSDP(callinfo_ref); 1.443 +} 1.444 + 1.445 +cc_int32_t CC_SIPCCCallInfo::getStatusCode() 1.446 +{ 1.447 + return CCAPI_CallInfo_getStatusCode(callinfo_ref); 1.448 +} 1.449 + 1.450 +MediaStreamTable* CC_SIPCCCallInfo::getMediaStreams() const 1.451 +{ 1.452 + return CCAPI_CallInfo_getMediaStreams(callinfo_ref); 1.453 +} 1.454 + 1.455 +Timecard *CC_SIPCCCallInfo::takeTimecard() 1.456 +{ 1.457 + return CCAPI_CallInfo_takeTimecard(callinfo_ref); 1.458 +} 1.459 + 1.460 +std::string CC_SIPCCCallInfo::getCandidate() 1.461 +{ 1.462 + return CCAPI_CallInfo_getCandidate(callinfo_ref); 1.463 +} 1.464 + 1.465 +bool CC_SIPCCCallInfo::isMediaStateAvailable() 1.466 +{ 1.467 + // for softphone it will always be possible to query the mute state and video direction 1.468 + return true; 1.469 +} 1.470 + 1.471 + 1.472 +#define PRINT_IF_CC_CAP_TRUE(cap) ((hasFeature(cap)) ? string(#cap) + ",": "") 1.473 +void CC_SIPCCCallInfo::generateCapabilities() 1.474 +{ 1.475 + // If caps are already generated, no need to repeat the exercise. 1.476 + if(!caps.empty()) 1.477 + return; 1.478 +/* 1.479 + CSFLogDebugS( logTag, "generateCapabilities() state=" << getCallState() << 1.480 + " underlyingCaps=" << 1.481 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_NEWCALL) << 1.482 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_ANSWER) << 1.483 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_ENDCALL) << 1.484 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_HOLD) << 1.485 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_RESUME) << 1.486 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_CALLFWD) << 1.487 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_DIAL) << 1.488 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_BACKSPACE) << 1.489 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_SENDDIGIT) << 1.490 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_TRANSFER) << 1.491 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_CONFERENCE) << 1.492 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_SWAP) << 1.493 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_REDIAL) << 1.494 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_JOIN) << 1.495 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_SELECT) << 1.496 + PRINT_IF_CC_CAP_TRUE(CCAPI_CALL_CAP_RMVLASTPARTICIPANT) ); 1.497 +*/ 1.498 + switch(getCallState()) 1.499 + { 1.500 + case OFFHOOK: 1.501 + if(hasFeature(CCAPI_CALL_CAP_NEWCALL)) { 1.502 + caps.insert(CC_CallCapabilityEnum::canOriginateCall); 1.503 + } 1.504 + if(hasFeature(CCAPI_CALL_CAP_ENDCALL)) { 1.505 + caps.insert(CC_CallCapabilityEnum::canEndCall); 1.506 + } 1.507 + break; 1.508 + case ONHOOK: 1.509 + break; 1.510 + case DIALING: 1.511 + case PROCEED: 1.512 + case RINGOUT: 1.513 + if(hasFeature(CCAPI_CALL_CAP_ENDCALL)) { 1.514 + caps.insert(CC_CallCapabilityEnum::canEndCall); 1.515 + } 1.516 + if(hasFeature(CCAPI_CALL_CAP_SENDDIGIT)) caps.insert(CC_CallCapabilityEnum::canSendDigit); 1.517 + break; 1.518 + case RINGIN: 1.519 + if(hasFeature(CCAPI_CALL_CAP_ANSWER)) caps.insert(CC_CallCapabilityEnum::canAnswerCall); 1.520 + break; 1.521 + case CONNECTED: 1.522 + if(hasFeature(CCAPI_CALL_CAP_ENDCALL)) { 1.523 + caps.insert(CC_CallCapabilityEnum::canEndCall); 1.524 + } 1.525 + caps.insert(CC_CallCapabilityEnum::canSendDigit); 1.526 + if(hasFeature(CCAPI_CALL_CAP_HOLD)) caps.insert(CC_CallCapabilityEnum::canHold); 1.527 + 1.528 + caps.insert(CC_CallCapabilityEnum::canSetVolume); 1.529 + if(isAudioMuted()) 1.530 + { 1.531 + caps.insert(CC_CallCapabilityEnum::canUnmuteAudio); 1.532 + } 1.533 + else 1.534 + { 1.535 + caps.insert(CC_CallCapabilityEnum::canMuteAudio); 1.536 + } 1.537 + 1.538 + if ((CCAPI_CallInfo_getVideoDirection(callinfo_ref) == CC_SDP_DIRECTION_SENDRECV) || 1.539 + (CCAPI_CallInfo_getVideoDirection(callinfo_ref) == CC_SDP_DIRECTION_SENDONLY)) 1.540 + { 1.541 + // sending video so video mute is possible 1.542 + if (isVideoMuted()) 1.543 + { 1.544 + caps.insert(CC_CallCapabilityEnum::canUnmuteVideo); 1.545 + } 1.546 + else 1.547 + { 1.548 + caps.insert(CC_CallCapabilityEnum::canMuteVideo); 1.549 + } 1.550 + } 1.551 + caps.insert(CC_CallCapabilityEnum::canUpdateVideoMediaCap); 1.552 + break; 1.553 + case HOLD: 1.554 + case REMHOLD: 1.555 + caps.insert(CC_CallCapabilityEnum::canResume); 1.556 + break; 1.557 + 1.558 + case BUSY: 1.559 + case REORDER: 1.560 + if(hasFeature(CCAPI_CALL_CAP_ENDCALL)) { 1.561 + caps.insert(CC_CallCapabilityEnum::canEndCall); 1.562 + } 1.563 + break; 1.564 + case PRESERVATION: 1.565 + if(hasFeature(CCAPI_CALL_CAP_ENDCALL)) { 1.566 + caps.insert(CC_CallCapabilityEnum::canEndCall); 1.567 + } 1.568 + break; 1.569 + 1.570 + // Not worrying about these states yet. 1.571 + case RESUME: 1.572 + case CONFERENCE: 1.573 + case REMINUSE: 1.574 + case HOLDREVERT: 1.575 + case WHISPER: 1.576 + case WAITINGFORDIGITS: 1.577 + default: 1.578 + CSFLogError( logTag, "State %d not handled in generateCapabilities()", 1.579 + getCallState()); 1.580 + break; 1.581 + } 1.582 +} 1.583 + 1.584 +bool CC_SIPCCCallInfo::hasFeature(ccapi_call_capability_e cap) 1.585 +{ 1.586 + return (CCAPI_CallInfo_hasCapability(callinfo_ref, (cc_int32_t) cap) != 0); 1.587 +} 1.588 + 1.589 +void CC_SIPCCCallInfo::setMediaData(CC_SIPCCCallMediaDataPtr pMediaData) 1.590 +{ 1.591 + this-> pMediaData = pMediaData; 1.592 +} 1.593 +