CAF: Leg Creation Samples
From TBwiki
Revision as of 14:08, 22 October 2009 by Mathieu St-Jean (Talk | contribs)
Contents |
Creating a Standalone Outgoing Call
PTRCTBCMC_CALL_LEG_ATTRIBUTE ptrOutgoingLegAttribute; ptrOutgoingLegAttribute = tbnew CTBCMC_CALL_LEG_ATTRIBUTE(); ptrOutgoingLegAttribute->GetCalledNumber() = "123-4567"; ptrOutgoingLegAttribute->GetCallingNumber() = "987-6543"; ptrOutgoingLegAttribute->GetNetworkAccessPoint() = "NAP_SS7_MONTREAL"; PCTBCMCLeg pCallLeg = tbnew CTBCMCLeg( ++mun32LegId, ptrOutgoingLegAttribute, this, 0, &mLegMutex ); pCallLeg->CreateCall();
Bridging an Incoming Call (manual method)
TBX_VOID CTBCAFMediaGateway::OnCallLegPresent
(
IN TBCMC_LEG_ID in_LegId,
IN CTBCMC_CALL_LEG_ATTRIBUTE_COMMON & in_IncomingCallLegAttribute,
IN CTBCMC_PROTOCOL_ATTRIBUTE & in_ProtocolAttribute
)
{
TBCAF_MUTEX_GET_SCOPE_BEGIN( &mMutex )
PCTBCMC_CALL_LEG_ATTRIBUTE pCallLegAttribute;
PTRCTBCMC_CALL_LEG_ATTRIBUTE ptrIncomingCallLegAttribute;
PTRCTBCMC_CALL_LEG_ATTRIBUTE ptrOutgoingLegAttribute;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CAFCODE( CTBCAFMediaGateway::OnCallLegPresent )
{
pCallLegAttribute = in_CallLegAttribute.GetCallLegAttribute();
ptrIncomingCallLegAttribute = tbnew CTBCMC_CALL_LEG_ATTRIBUTE(*pCallLegAttribute);
ptrOutgoingLegAttribute = tbnew CTBCMC_CALL_LEG_ATTRIBUTE();
PCTBCMCLeg pIncomingCallLeg = tbnew CTBCMCLeg( ++mun32LegId, ptrIncomingCallLegAttribute, this, 0, &mLegMutex );
pFirstCallLeg->CreateCall();
ptrOutgoingLegAttribute->GetCalledNumber() = ptrIncomingCallLegAttribute->GetCallingNumber();
ptrOutgoingLegAttribute->GetCallingNumber() = ptrIncomingCallLegAttribute->GetCalledNumber();
ptrOutgoingLegAttribute->GetNetworkAccessPoint() = ptrIncomingCallLegAttribute->GetNetworkAccessPoint();
PCTBCMCLeg pOutgoingCallLeg = tbnew CTBCMCLeg( ++mun32LegId, ptrOutgoingLegAttribute, this, 0, &mLegMutex );
pSecondCallLeg->CreateCall();
TBX_EXIT_SUCCESS( TBX_RESULT_OK );
}
/*---------------------------------------------------------------------------------------------------------------------------
| Exception handling section
*--------------------------------------------------------------------------------------------------------------------------*/
CAF_EXCEPTION_HANDLING
/*---------------------------------------------------------------------------------------------------------------------------
| Error handling section
*--------------------------------------------------------------------------------------------------------------------------*/
CAF_ERROR_HANDLING( CAF_VERBOSE )
{
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CAF_CLEANUP
{
}
RETURN_VOID;
TBCAF_MUTEX_GET_SCOPE_END( &mMutex )
}
Bridging an Incoming Call (using CTBCAFBridge )
PTRCTBCMC_CALL_LEG_ATTRIBUTE ptrIncomingCallLegAttribute; PTRCTBCMC_CALL_LEG_ATTRIBUTE ptrOutgoingCallLegAttribute; PITBCAFCallFlow pCallFlow; ptrOutgoingCallLegAttribute = tbnew CTBCMC_CALL_LEG_ATTRIBUTE(); ptrIncomingCallLegAttribute = tbnew CTBCMC_CALL_LEG_ATTRIBUTE(*pCallLegAttribute); ptrOutgoingLegAttribute->GetCalledNumber() = ptrIncomingCallLegAttribute->GetCallingNumber(); ptrOutgoingLegAttribute->GetCallingNumber() = ptrIncomingCallLegAttribute->GetCalledNumber(); ptrOutgoingLegAttribute->GetNetworkAccessPoint() = ptrIncomingCallLegAttribute->GetNetworkAccessPoint(); pCallFlow = tbnew CTBCAFBridge( mun32AccountId, this ); TBCAF_EXIT_ON_NULL( pCallFlow, TBX_RESULT_FAIL, "Failed to allocate call." ); Result = pCallFlow->AddIncoming( mun32LegId, ptrIncomingCallLegAttribute ); TBCAF_EXIT_ON_ERROR(Result, "AddIncoming Failed." ); Result = pCallFlow->AddOutgoing( ptrOutgoingCallLegAttribute ); TBCAF_EXIT_ON_ERROR(Result, "AddOutgoing Failed." ); // Start the call Result = pCallFlow->InitCall( &pCallFlow );
Creating a Media-only Leg
If you are using a nap of type NAP_MEDIA_TDM:
PTRCTBCMC_MEDIA_ONLY_LEG_ATTRIBUTE ptrLegAttribute;
PTBCMC_MEDIA_DESCRIPTION pMediaDesc;
ptrLegAttribute = tbnew CTBCMC_MEDIA_ONLY_LEG_ATTRIBUTE();
pMediaDesc = &ptrLegAttribute->GetProfile()->MediaDescription;
ptrLegAttribute->GetNetworkAccessPoint() = "NAP_SS7_MONTREAL";
pMediaDesc->Type = TBCMC_MEDIA_TYPE_AUDIO;
pMediaDesc->Transport = TBCMC_MEDIA_TRANSPORT_TDM;
pMediaDesc->Settings.TdmAudio.Type = TBCMC_MEDIA_SETTINGS_TYPE_TDM_AUDIO;
pMediaDesc->Settings.TdmAudio.un8Timeslot = 5;
Strncpy
(
pMediaDesc->Settings.TdmAudio.szTrunkName,
"TRUNK_TORONTO_1",
sizeof(pMediaDesc->Settings.TdmAudio.szTrunkName)
);
PCTBCMCLeg pCallLeg = tbnew CTBCMCLeg( ++mun32LegId, ptrLegAttribute, this, 0, &mLegMutex );
pCallLeg->CreateCall();
If you are using a nap of type NAP_MEDIA_VOIP:
TBX_RESULT Result;
TBX_SDP_INFO SdpInfo;
PTRCTBCMC_MEDIA_ONLY_LEG_ATTRIBUTE ptrLegAttribute;
PTBCMC_MEDIA_DESCRIPTION pMediaDesc;
ptrLegAttribute = tbnew CTBCMC_MEDIA_ONLY_LEG_ATTRIBUTE();
pMediaDesc = &ptrLegAttribute->GetProfile()->MediaDescription;
ptrLegAttribute->GetNetworkAccessPoint() = "NAP_SS7_MONTREAL";
pMediaDesc->Type = TBCMC_MEDIA_TYPE_AUDIO;
pMediaDesc->Transport = TBCMC_MEDIA_TRANSPORT_IP;
pMediaDesc->Settings.PacketAudio.Type = TBCMC_MEDIA_SETTINGS_TYPE_PACKET_AUDIO;
// Set Local SDP
Result = BuildSdpInfo("", 0, SdpInfo); // No IP specified, Toolpack will choose one
TBCAF_EXIT_ON_ERROR( Result, "BuildSdpInfo failed." );
ptrLegAttribute->SetLocalSDP(&SdpInfo);
// Set Peer SDP
Result = BuildSdpInfo("10.0.0.15", 5000, SdpInfo); // Using peer IP address and port
TBCAF_EXIT_ON_ERROR( Result, "BuildSdpInfo failed." );
ptrLegAttribute->SetPeerSDP(&SdpInfo);
PCTBCMCLeg pCallLeg = tbnew CTBCMCLeg( ++mun32LegId, ptrLegAttribute, this, 0, &mLegMutex );
pCallLeg->CreateCall();
To see how to fill a TBX_SDP_INFO structure (implementation of BuildSdpInfo()), refer to Filling an SDP Structure.