From 78efb87ddd8c0cb0c82fe03d43cf26ac0971d15b Mon Sep 17 00:00:00 2001 From: Gerald Begumisa Date: Fri, 15 May 2009 15:45:30 +0000 Subject: Added support for setting the SIP request URI as local party. If the SIP request URI differs from the SIP URI in the "To:" header field, then the local party is set to the SIP request URI, remote party to the "From:" header field, direction to "in", Local entry point to the "To:" header field. This behaviour may be turned off by setting the configuration parameter SipRequestUriAsLocalParty to "false" under the VoIpPlugin section of config.xml. git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@611 09dcff7a-b715-0410-9601-b79a96267cd0 --- orkaudio/audiocaptureplugins/voip/RtpSession.cpp | 54 +++++++++++++++++++++--- orkaudio/audiocaptureplugins/voip/RtpSession.h | 2 + orkaudio/audiocaptureplugins/voip/VoIp.cpp | 46 ++++++++++++++++++++ orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 2 + orkaudio/audiocaptureplugins/voip/VoIpConfig.h | 1 + 5 files changed, 98 insertions(+), 7 deletions(-) diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp index 107e003..9c69bab 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp @@ -329,8 +329,19 @@ bool RtpSession::IsInSkinnyReportingList(CStdString item) void RtpSession::ProcessMetadataSipIncoming() { - m_remoteParty = m_invite->m_from; - m_localParty = m_invite->m_to; + if((DLLCONFIG.m_sipRequestUriAsLocalParty == true) && (m_invite->m_requestUri.CompareNoCase(m_invite->m_to) != 0)) + { + m_localParty = m_invite->m_requestUri; + m_remoteParty = m_invite->m_from; + m_direction = CaptureEvent::DirIn; + m_localEntryPoint = m_invite->m_to; + } + else + { + m_remoteParty = m_invite->m_from; + m_localParty = m_invite->m_to; + m_direction = CaptureEvent::DirIn; + } m_remotePartyName = m_invite->m_fromName; m_localPartyName = m_invite->m_toName; @@ -344,7 +355,6 @@ void RtpSession::ProcessMetadataSipIncoming() m_localPartyName = m_localParty; } - m_direction = CaptureEvent::DirIn; char szInviteeIp[16]; ACE_OS::inet_ntop(AF_INET, (void*)&m_inviteeIp, szInviteeIp, sizeof(szInviteeIp)); //m_capturePort.Format("%s,%d", szInviteeIp, m_inviteeTcpPort); @@ -357,8 +367,19 @@ void RtpSession::ProcessMetadataSipIncoming() void RtpSession::ProcessMetadataSipOutgoing() { - m_remoteParty = m_invite->m_to; - m_localParty = m_invite->m_from; + if((DLLCONFIG.m_sipRequestUriAsLocalParty == true) && (m_invite->m_requestUri.CompareNoCase(m_invite->m_to) != 0)) + { + m_localParty = m_invite->m_requestUri; + m_remoteParty = m_invite->m_from; + m_direction = CaptureEvent::DirIn; + m_localEntryPoint = m_invite->m_to; + } + else + { + m_remoteParty = m_invite->m_to; + m_localParty = m_invite->m_from; + m_direction = CaptureEvent::DirOut; + } m_remotePartyName = m_invite->m_toName; m_localPartyName = m_invite->m_fromName; @@ -444,8 +465,18 @@ void RtpSession::UpdateMetadataSip(RtpPacketInfoRef& rtpPacket, bool sourceRtpAd invite->m_validated = true; // Update session metadata with INVITE info - m_remoteParty = invite->m_from; - m_localParty = invite->m_to; + if((DLLCONFIG.m_sipRequestUriAsLocalParty == true) && (m_invite->m_requestUri.CompareNoCase(m_invite->m_to) != 0)) + { + m_localParty = m_invite->m_requestUri; + m_remoteParty = m_invite->m_from; + m_direction = CaptureEvent::DirIn; + m_localEntryPoint = m_invite->m_to; + } + else + { + m_remoteParty = invite->m_from; + m_localParty = invite->m_to; + } m_remotePartyName = m_invite->m_fromName; m_localPartyName = m_invite->m_toName; @@ -693,6 +724,15 @@ void RtpSession::ReportMetadata() g_captureEventCallBack(event, m_capturePort); m_remotePartyReported = true; + // Report local entry point + if(m_localEntryPoint.size()) + { + event.reset(new CaptureEvent()); + event->m_type = CaptureEvent::EtLocalEntryPoint; + event->m_value = m_localEntryPoint; + g_captureEventCallBack(event, m_capturePort); + } + if(DLLCONFIG.m_sipReportNamesAsTags == true) { CStdString key, value; diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.h b/orkaudio/audiocaptureplugins/voip/RtpSession.h index 6742a58..765b803 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.h +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.h @@ -39,6 +39,7 @@ public: CStdString m_from; CStdString m_to; CStdString m_callId; + CStdString m_requestUri; bool m_validated; // true when an RTP stream has been seen for the INVITE bool m_attrSendonly; // true if the SDP has a:sendonly std::map m_extractedFields; @@ -167,6 +168,7 @@ public: ProtocolEnum m_protocol; CStdString m_localParty; CStdString m_remoteParty; + CStdString m_localEntryPoint; CStdString m_localPartyName; CStdString m_remotePartyName; bool m_localPartyReported; diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp index f9c5fb6..0d5c8aa 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp @@ -2081,6 +2081,52 @@ bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader char* attribSendonly = memFindAfter("a=sendonly", (char*)udpPayload, sipEnd); char* rtpmapAttribute = memFindAfter("\na=rtpmap:", (char*)udpPayload, sipEnd); + if(DLLCONFIG.m_sipRequestUriAsLocalParty == true) + { + char* sipUriAttribute = memFindAfter("INVITE ", (char*)udpPayload, sipEnd); + + if(sipUriAttribute) + { + if(s_sipExtractionLog->isDebugEnabled()) + { + CStdString uri; + GrabLine(sipUriAttribute, sipEnd, uri); + LOG4CXX_DEBUG(s_sipExtractionLog, "uri: " + uri); + } + + char* sipUriAttributeEnd = memFindEOL(sipUriAttribute, sipEnd); + char* sipUser = memFindAfter("sip:", sipUriAttribute, sipUriAttributeEnd); + + if(sipUser) + { + if(DLLCONFIG.m_sipReportFullAddress) + { + GrabSipUserAddress(sipUser, sipUriAttributeEnd, info->m_requestUri); + } + else + { + GrabSipUriUser(sipUser, sipUriAttributeEnd, info->m_requestUri); + } + } + else + { + if(DLLCONFIG.m_sipReportFullAddress) + { + GrabSipUserAddress(sipUriAttribute, sipUriAttributeEnd, info->m_requestUri); + } + else + { + GrabSipUriUser(sipUriAttribute, sipUriAttributeEnd, info->m_requestUri); + } + } + + if(s_sipExtractionLog->isDebugEnabled()) + { + LOG4CXX_DEBUG(s_sipExtractionLog, "extracted uri: " + info->m_requestUri); + } + } + } + if(fromField) { if(s_sipExtractionLog->isDebugEnabled()) diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp index d2ca3e2..9e65141 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp @@ -48,6 +48,7 @@ VoIpConfig::VoIpConfig() m_sipDynamicMediaAddress = false; m_sipIgnoreBye = false; m_sipReportNamesAsTags = false; + m_sipRequestUriAsLocalParty = true; m_rtcpDetect = false; m_inInMode = false; @@ -118,6 +119,7 @@ void VoIpConfig::Define(Serializer* s) s->IpRangesValue("SipIgnoredMediaAddresses", m_sipIgnoredMediaAddresses); s->BoolValue("SipIgnoreBye", m_sipIgnoreBye); s->BoolValue("SipReportNamesAsTags", m_sipReportNamesAsTags); + s->BoolValue("SipRequestUriAsLocalParty", m_sipRequestUriAsLocalParty); s->BoolValue("RtcpDetect", m_rtcpDetect); s->BoolValue("InInMode", m_inInMode); diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h index f7225e9..a809023 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h @@ -85,6 +85,7 @@ public: IpRanges m_sipIgnoredMediaAddresses; bool m_sipIgnoreBye; bool m_sipReportNamesAsTags; + bool m_sipRequestUriAsLocalParty; bool m_rtcpDetect; bool m_inInMode; -- cgit v1.2.3