修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

SipRegister.cpp 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "StdAfx.h"
  2. #include "SipRegister.h"
  3. #include "Config.h"
  4. #include "DevVoip.h"
  5. CSipRegister::CSipRegister(CDevVoip* pParent, int AccountId) : m_pParent(pParent), m_SerialNo(0)
  6. {
  7. ASSERT(pParent != NULL);
  8. m_pAccount = CConfig::sipAccount().getAccount(AccountId);
  9. ASSERT(m_pAccount != NULL);
  10. m_RegTimer.SetTimedEvent(this, &CSipRegister::__regTimerFunc);
  11. }
  12. CSipRegister::~CSipRegister(void)
  13. {
  14. m_RegTimer.StopSafely();
  15. }
  16. /*****************************************************************
  17. **【函数名称】 __regTimerFunc
  18. **【函数功能】 SIP注册定时器函数
  19. **【参数】
  20. **【返回值】
  21. ****************************************************************/
  22. void CSipRegister::__regTimerFunc( void )
  23. {
  24. regist();
  25. }
  26. /*****************************************************************
  27. **【函数名称】 regist
  28. **【函数功能】 注册
  29. **【参数】
  30. **【返回值】
  31. ****************************************************************/
  32. bool CSipRegister::regist( bool IsUnreg /*= false*/ )
  33. {
  34. if(m_pAccount == NULL || !m_pAccount->IsReg)
  35. return false;
  36. SIP_REGISTER sSipRegister;
  37. memset(&sSipRegister, 0, sizeof(sSipRegister));
  38. // 填充RegisterId信息
  39. sSipRegister.RegisterId.ucIsxNo = m_pParent->nodeNo(); // 节点号
  40. sSipRegister.RegisterId.ucBrdNo = m_pParent->boardNo(); // SIP 板号
  41. m_SerialNo = m_pParent->makeSerialNo();
  42. sSipRegister.RegisterId.ulSerialNo = m_SerialNo; // 序列号,有效范围 0~4095
  43. #pragma region To头域
  44. //填充To信息
  45. ISXSIP_IE_TO* pTo = &(sSipRegister.To);
  46. pTo->Valid = 1;
  47. pTo->Addr.Valid = 1;
  48. pTo->Addr.AddType = ISXSIP_ADDTYPE_URL;
  49. lstrcpy(pTo->Addr.u.AddrUrl.User, m_pAccount->Account);
  50. lstrcpy(pTo->Addr.u.AddrUrl.Host, m_pAccount->Proxy);
  51. pTo->Addr.u.AddrUrl.PortNum = m_pAccount->ProxyPort; // 端口号;如果为0xFFFF,地址域中没有端口号部分;
  52. pTo->Addr.u.AddrUrl.IsSecure = 0; // 是否使用安全SIP,如果为0,未使用TLS,如果为1,使用TLS。
  53. pTo->Addr.u.AddrUrl.MethodType = 0xFF; // SIP方法的类型,如果为0xFF,地址中没有SIP方法类型。
  54. pTo->Addr.u.AddrUrl.TransportType = ISXSIP_TRANSPORT_UDP; // 传输类型,如果为0xFF,地址信息中没有传输类型信息。
  55. pTo->Addr.u.AddrUrl.LrType = 0xFF; // 松散路由的类型;如果为0xFF,地址域中没有LrType部分;LrType可以为:
  56. pTo->Addr.u.AddrUrl.Ttl = 0xFFFF; // TTL值;如果为0xFFFF,地址域中没有TTL部分;
  57. // lstrcpy(pTo->Tag , "ehang"); //to头域中的tag部分,如果为空字符串,表示没有tag部分;
  58. // lstrcpy(pTo->DisplayName , "ehang"); //to 头域中的 display-name 部分,如果为空字符串,表示没有 display-name 部分;
  59. /* 如果reg.To.Addr.AddType = =0;则将填充下列字段
  60. lstrcpy(reg.To.Addr.u.AddrUri.Identifier,"+1234567");//URI地址中的Identifier,如URI为"tel:+1234567",identifier为+1234567
  61. lstrcpy(reg.To.Addr.u.AddrUri.Scheme ,"tel");//URI地址中的scheme,如URI为"tel:+1234567",scheme为tel;
  62. */
  63. #pragma endregion
  64. #pragma region From头域
  65. //填充From信息
  66. ISXSIP_IE_FROM* pFrom = &(sSipRegister.From);
  67. pFrom->Valid = 1;
  68. pFrom->Addr.Valid = 1;
  69. pFrom->Addr.AddType = ISXSIP_ADDTYPE_URL;
  70. lstrcpy(pFrom->Addr.u.AddrUrl.User, m_pAccount->Account);
  71. lstrcpy(pFrom->Addr.u.AddrUrl.Host, m_pAccount->Proxy);
  72. pFrom->Addr.u.AddrUrl.PortNum = m_pAccount->ProxyPort;
  73. pFrom->Addr.u.AddrUrl.IsSecure = 0;
  74. pFrom->Addr.u.AddrUrl.MethodType = 0xFF;
  75. pFrom->Addr.u.AddrUrl.TransportType = ISXSIP_TRANSPORT_UDP;
  76. pFrom->Addr.u.AddrUrl.LrType = 0xFF;
  77. pFrom->Addr.u.AddrUrl.Ttl = 0xFFFF;
  78. #pragma endregion
  79. #pragma region RegAddr
  80. //填充RegAddr信息
  81. sSipRegister.RegAddr.Valid = 1;
  82. sSipRegister.RegAddr.AddType = ISXSIP_ADDTYPE_URL;
  83. // lstrcpy(sSipRegister.RegAddr.u.AddrUrl.User, m_pAccount->Account) ; 此处如果赋值在注册时会得到400的错误码
  84. lstrcpy(sSipRegister.RegAddr.u.AddrUrl.Host, m_pAccount->Proxy);
  85. sSipRegister.RegAddr.u.AddrUrl.PortNum = m_pAccount->ProxyPort;
  86. sSipRegister.RegAddr.u.AddrUrl.IsSecure = 0;
  87. sSipRegister.RegAddr.u.AddrUrl.MethodType = 0xFF;
  88. sSipRegister.RegAddr.u.AddrUrl.LrType = 0xFF;
  89. sSipRegister.RegAddr.u.AddrUrl.TransportType = 0xFF;
  90. sSipRegister.RegAddr.u.AddrUrl.Ttl = 0xFFFF;
  91. #pragma endregion
  92. #pragma region Contact
  93. //填充Contact信息
  94. CHAR IpAddr[IP_PORT_LEN] = { 0 };
  95. ISX_sr_getnet2cfg(m_pParent->nodeNo(), m_pParent->boardNo(), BT_SIP, IpAddr, NULL);
  96. ISXSIP_IE_CONTACT* pContact = &(sSipRegister.Contact);
  97. pContact->Valid = 1;
  98. pContact->IsStar = 0;
  99. pContact->Action = ISXSIP_CONTACT_ACTION_PROXY;
  100. pContact->Addr.Valid = 1;
  101. pContact->Addr.AddType = ISXSIP_ADDTYPE_URL;
  102. lstrcpy(pContact->Addr.u.AddrUrl.User, m_pAccount->Account);
  103. lstrcpy(pContact->Addr.u.AddrUrl.Host, IpAddr);
  104. pContact->Addr.u.AddrUrl.PortNum = 0xFFFF;
  105. pContact->Addr.u.AddrUrl.MethodType = 0xFF;
  106. pContact->Addr.u.AddrUrl.TransportType = 0xFF;
  107. pContact->Addr.u.AddrUrl.LrType = 0xFF;
  108. pContact->Addr.u.AddrUrl.IsSecure = 0;
  109. pContact->Addr.u.AddrUrl.Ttl = 0xFFFF;
  110. //下面是Contact头域中的超时部分,如果无效,表示contact头域中没有超时部分;
  111. pContact->Expires.Valid = 1;
  112. pContact->Expires.Type = ISXSIP_IE_EXPIRES_DELTA; // 0为Delta second,1为Date;
  113. if(IsUnreg)
  114. pContact->Expires.u.DeltaSeconds = 0; // 0 for unregister
  115. else
  116. pContact->Expires.u.DeltaSeconds = m_pAccount->RegInterval;
  117. #pragma endregion
  118. #pragma region Auth
  119. //填充u信息用于注册论证 AuthInfo:发送Register消息时使用该域;Author:接收到Register消息时使用该域
  120. char* pUser = sSipRegister.u.LongAuthInfo.AuthStr;
  121. lstrcpy(pUser, m_pAccount->AuthAccount);
  122. char *pPwd = pUser + strlen(pUser) + 1;
  123. lstrcpy(pPwd, m_pAccount->Password);
  124. #pragma endregion
  125. return ISXE_gc_SIPSendRegister(EV_ASYNC, &sSipRegister) == 0;
  126. }
  127. /*****************************************************************
  128. **【函数名称】 onRegSent
  129. **【函数功能】 处理REG发送结果
  130. **【参数】
  131. **【返回值】
  132. ****************************************************************/
  133. void CSipRegister::onRegSent( SEND_SIPREG_RET* pSent )
  134. {
  135. ASSERT(pSent != NULL);
  136. m_RegTimer.StopSafely();
  137. if(pSent->sRetVal == 0)
  138. {
  139. #ifdef _DEBUG
  140. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{SipReg}: SIP板[%d-%d]账号[%d]发送注册消息成功"),
  141. pSent->RegisterId.ucIsxNo, pSent->RegisterId.ucBrdNo, m_pAccount->Id);
  142. #endif
  143. }
  144. else
  145. {
  146. m_RegTimer.Start(DEVICE_SIP_RETRY_INTERVAL * 1000, false, true);
  147. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{SipReg}: SIP板[%d-%d]账号[%d]发送注册消息失败, %d秒后重试"),
  148. pSent->RegisterId.ucIsxNo, pSent->RegisterId.ucBrdNo, m_pAccount->Id, DEVICE_SIP_RETRY_INTERVAL);
  149. }
  150. }
  151. /*****************************************************************
  152. **【函数名称】 processRegResult
  153. **【函数功能】 处理REG结果
  154. **【参数】
  155. **【返回值】
  156. ****************************************************************/
  157. void CSipRegister::processRegResult( SIP_REGISTER_ACK* pAck )
  158. {
  159. ASSERT(pAck != NULL);
  160. m_RegTimer.StopSafely();
  161. if(pAck->usCause == IPEC_SIPReasonStatus200OK)
  162. {
  163. m_RegTimer.Start(m_pAccount->RegInterval * 1000, false, true);
  164. #ifdef _DEBUG
  165. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{SipReg}: SIP板[%d-%d]账号[%d]注册成功"),
  166. pAck->RegisterId.ucIsxNo, pAck->RegisterId.ucBrdNo, m_pAccount->Id);
  167. #endif
  168. }
  169. else
  170. {
  171. m_RegTimer.Start(DEVICE_SIP_RETRY_INTERVAL * 1000, false, true);
  172. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{SipReg}: SIP板[%d-%d]账号[%d]注册失败, %d秒后重试, Cause = %d"),
  173. pAck->RegisterId.ucIsxNo, pAck->RegisterId.ucBrdNo, m_pAccount->Id, DEVICE_SIP_RETRY_INTERVAL, pAck->usCause);
  174. }
  175. }