CAF: Leg Creation Samples

From TBwiki
Revision as of 14:08, 22 October 2009 by Mathieu St-Jean (Talk | contribs)
Jump to: navigation, search

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.

Personal tools