summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Begumisa <ben_g@users.sourceforge.net>2009-09-02 07:37:59 +0000
committerGerald Begumisa <ben_g@users.sourceforge.net>2009-09-02 07:37:59 +0000
commita019fc0e9e62ef7bed966a59ee2b2e81f72dce86 (patch)
tree67df5f7871c668c4fae841914f4a934ef3d20f46
parentcd04d40c89255b3004862f2106738b46ddd000dc (diff)
Adjusted recording strategy for Asterisk-DAHDI channels, to now obtain the remote party from the SIP BYE, as opposed to the INVITE as was originally the case.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@639 09dcff7a-b715-0410-9601-b79a96267cd0
-rw-r--r--orkaudio/audiocaptureplugins/voip/RtpSession.cpp136
-rw-r--r--orkaudio/audiocaptureplugins/voip/RtpSession.h11
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIp.cpp99
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp1
4 files changed, 172 insertions, 75 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp
index 3ac52f1..d60223c 100644
--- a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp
+++ b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp
@@ -1141,88 +1141,90 @@ bool RtpSession::AddRtpPacket(RtpPacketInfoRef& rtpPacket)
return true;
}
-
-void RtpSession::ReportSipInvite(SipInviteInfoRef& invite)
+void RtpSession::ReportSipBye(SipByeInfoRef& bye)
{
- if(m_invite.get() == NULL)
- {
- m_invite = invite;
- m_invitorIp = invite->m_fromRtpIp;
- memcpy(m_invitorMac, invite->m_senderMac, sizeof(m_invitorMac));
- }
- else
+ CStdString byeString;
+ CStdString logMsg;
+
+ bye->ToString(byeString);
+ if(DLLCONFIG.m_dahdiIntercept == true)
{
- CStdString inviteString;
- CStdString logMsg;
- invite->ToString(inviteString);
+ // With Xorcom interception, we update whichever party is currently
+ // set to "s" with the new party in either m_from or m_to of the
+ // BYE
- if(DLLCONFIG.m_dahdiIntercept == true)
+ if(m_localParty.CompareNoCase(CStdString("s")) == 0)
{
- // With Xorcom interception, we update whichever party is currently
- // set to "s" with the new party in either m_from or m_to of the
- // INVITE
-
- if(m_localParty.CompareNoCase(CStdString("s")) == 0)
+ if(m_remoteParty.CompareNoCase(bye->m_to) != 0)
{
- if(m_remoteParty.CompareNoCase(invite->m_to) != 0)
- {
- // remoteparty is set to m_from
- m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_to);
- logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from INVITE:%s", m_trackingId, m_localParty, inviteString);
- }
- else
- {
- // remoteparty is set to m_to
- m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_from);
- logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from INVITE:%s", m_trackingId, m_localParty, inviteString);
- }
-
- // Report Local party
- CaptureEventRef event(new CaptureEvent());
- event->m_type = CaptureEvent::EtLocalParty;
- event->m_value = m_localParty;
- g_captureEventCallBack(event, m_capturePort);
+ // remoteparty is set to m_from
+ m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_to);
+ logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from BYE:%s", m_trackingId, m_localParty, byeString);
}
- else if(m_remoteParty.CompareNoCase(CStdString("s")) == 0)
+ else
{
- CStdString translatedTo, translatedFrom;
+ // remoteparty is set to m_to
+ m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_from);
+ logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from BYE:%s", m_trackingId, m_localParty, byeString);
+ }
- translatedTo = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_to);
- translatedFrom = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_from);
+ // Report Local party
+ CaptureEventRef event(new CaptureEvent());
+ event->m_type = CaptureEvent::EtLocalParty;
+ event->m_value = m_localParty;
+ g_captureEventCallBack(event, m_capturePort);
+ }
+ else if(m_remoteParty.CompareNoCase(CStdString("s")) == 0)
+ {
+ CStdString translatedTo, translatedFrom;
- if(m_localParty.CompareNoCase(translatedTo) != 0)
- {
- // localparty is set to m_from
- m_remoteParty = invite->m_to;
- logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from INVITE:%s", m_trackingId, m_remoteParty, inviteString);
- }
- else
- {
- // localparty is set to m_to
- m_remoteParty = invite->m_from;
- logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from INVITE:%s", m_trackingId, m_remoteParty, inviteString);
- }
+ translatedTo = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_to);
+ translatedFrom = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_from);
- // Report remote party
- CaptureEventRef event(new CaptureEvent());
- event->m_type = CaptureEvent::EtRemoteParty;
- event->m_value = m_remoteParty;
- g_captureEventCallBack(event, m_capturePort);
+ if(m_localParty.CompareNoCase(translatedTo) != 0)
+ {
+ // localparty is set to m_from
+ m_remoteParty = bye->m_to;
+ logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from BYE:%s", m_trackingId, m_remoteParty, byeString);
}
else
{
- logMsg.Format("[%s] dahdiIntercept: ignoring INVITE:%s", m_trackingId, inviteString);
+ // localparty is set to m_to
+ m_remoteParty = bye->m_from;
+ logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from BYE:%s", m_trackingId, m_remoteParty, byeString);
}
- LOG4CXX_INFO(m_log, logMsg);
-
- return;
+ // Report remote party
+ CaptureEventRef event(new CaptureEvent());
+ event->m_type = CaptureEvent::EtRemoteParty;
+ event->m_value = m_remoteParty;
+ g_captureEventCallBack(event, m_capturePort);
}
else
{
- logMsg.Format("[%s] associating INVITE:%s", m_trackingId, inviteString);
- LOG4CXX_INFO(m_log, logMsg);
+ logMsg.Format("[%s] dahdiIntercept: ignoring BYE:%s", m_trackingId, byeString);
}
+
+ LOG4CXX_INFO(m_log, logMsg);
+ }
+}
+
+void RtpSession::ReportSipInvite(SipInviteInfoRef& invite)
+{
+ if(m_invite.get() == NULL)
+ {
+ m_invite = invite;
+ m_invitorIp = invite->m_fromRtpIp;
+ memcpy(m_invitorMac, invite->m_senderMac, sizeof(m_invitorMac));
+ }
+ else
+ {
+ CStdString inviteString;
+ CStdString logMsg;
+ invite->ToString(inviteString);
+
+ logMsg.Format("[%s] associating INVITE:%s", m_trackingId, inviteString);
+ LOG4CXX_INFO(m_log, logMsg);
}
m_invites.push_front(invite);
if(invite->m_telephoneEventPtDefined)
@@ -1610,15 +1612,17 @@ void RtpSessions::ReportSip200Ok(Sip200OkInfoRef info)
//}
}
-void RtpSessions::ReportSipBye(SipByeInfo bye)
+void RtpSessions::ReportSipBye(SipByeInfoRef& bye)
{
std::map<CStdString, RtpSessionRef>::iterator pair;
- pair = m_byCallId.find(bye.m_callId);
+ pair = m_byCallId.find(bye->m_callId);
if (pair != m_byCallId.end())
{
// Session found: stop it
RtpSessionRef session = pair->second;
+
+ session->ReportSipBye(bye);
Stop(session);
}
}
@@ -3145,6 +3149,6 @@ void SipByeInfo::ToString(CStdString& string)
char receiverIp[16];
ACE_OS::inet_ntop(AF_INET, (void*)&m_receiverIp, receiverIp, sizeof(receiverIp));
- string.Format("sender:%s rcvr:%s callid:%s", senderIp, receiverIp, m_callId);
+ string.Format("sender:%s rcvr:%s callid:%s from:%s to:%s fromDomain:%s toDomain:%s fromName:%s toName:%s", senderIp, receiverIp, m_callId, m_from, m_to, m_fromDomain, m_toDomain, m_fromName, m_toName);
}
diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.h b/orkaudio/audiocaptureplugins/voip/RtpSession.h
index 792156c..0d88d77 100644
--- a/orkaudio/audiocaptureplugins/voip/RtpSession.h
+++ b/orkaudio/audiocaptureplugins/voip/RtpSession.h
@@ -82,8 +82,14 @@ public:
CStdString m_callId;
struct in_addr m_senderIp;
struct in_addr m_receiverIp;
+ CStdString m_from;
+ CStdString m_to;
+ CStdString m_fromDomain;
+ CStdString m_toDomain;
+ CStdString m_fromName;
+ CStdString m_toName;
};
-
+typedef boost::shared_ptr<SipByeInfo> SipByeInfoRef;
class Sip200OkInfo
{
@@ -148,6 +154,7 @@ public:
void Stop();
void Start();
bool AddRtpPacket(RtpPacketInfoRef& rtpPacket);
+ void ReportSipBye(SipByeInfoRef& bye);
void ReportSipInvite(SipInviteInfoRef& invite);
void ReportSipErrorPacket(SipFailureMessageInfoRef& info);
void ReportRtcpSrcDescription(RtcpSrcDescriptionPacketInfoRef& rtcpInfo);
@@ -252,7 +259,7 @@ public:
void Stop(RtpSessionRef& session);
void StopAll();
void ReportSipInvite(SipInviteInfoRef& invite);
- void ReportSipBye(SipByeInfo bye);
+ void ReportSipBye(SipByeInfoRef& bye);
void ReportSkinnyCallInfo(SkCallInfoStruct*, IpHeaderStruct* ipHeader);
void ReportSkinnyStartMediaTransmission(SkStartMediaTransmissionStruct*, IpHeaderStruct* ipHeader);
void ReportSkinnyStopMediaTransmission(SkStopMediaTransmissionStruct*, IpHeaderStruct* ipHeader);
diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
index 97671d0..c88dda7 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp
+++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
@@ -1467,23 +1467,108 @@ bool TrySipBye(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, U
result = true;
int sipLength = ntohs(udpHeader->len);
char* sipEnd = (char*)udpPayload + sipLength;
- SipByeInfo info;
- char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd);
+ SipByeInfoRef info(new SipByeInfo());
+
+ char* fromField = memFindAfter("From:", (char*)udpPayload, sipEnd);
+ if(!fromField)
+ {
+ fromField = memFindAfter("\nf:", (char*)udpPayload, sipEnd);
+ }
+ char* toField = memFindAfter("To:", (char*)udpPayload, sipEnd);
+ if(!toField)
+ {
+ toField = memFindAfter("\nt:", (char*)udpPayload, sipEnd);
+ }
+ char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd);
if(!callIdField)
{
callIdField = memFindAfter("\ni:", (char*)udpPayload, sipEnd);
}
-
if(callIdField)
{
- GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info.m_callId);
+ GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info->m_callId);
}
- info.m_senderIp = ipHeader->ip_src;
- info.m_receiverIp = ipHeader->ip_dest;
+
+ if(fromField)
+ {
+ if(s_sipExtractionLog->isDebugEnabled())
+ {
+ CStdString from;
+ GrabLine(fromField, sipEnd, from);
+ LOG4CXX_DEBUG(s_sipExtractionLog, "from: " + from);
+ }
+
+ char* fromFieldEnd = memFindEOL(fromField, sipEnd);
+
+ GrabSipName(fromField, fromFieldEnd, info->m_fromName);
+
+ char* sipUser = memFindAfter("sip:", fromField, fromFieldEnd);
+ if(sipUser)
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(sipUser, fromFieldEnd, info->m_from);
+ }
+ else
+ {
+ GrabSipUriUser(sipUser, fromFieldEnd, info->m_from);
+ }
+ GrabSipUriDomain(sipUser, fromFieldEnd, info->m_fromDomain);
+ }
+ else
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(fromField, fromFieldEnd, info->m_from);
+ }
+ else
+ {
+ GrabSipUriUser(fromField, fromFieldEnd, info->m_from);
+ }
+ GrabSipUriDomain(fromField, fromFieldEnd, info->m_fromDomain);
+ }
+ }
+ if(toField)
+ {
+ CStdString to;
+ char* toFieldEnd = GrabLine(toField, sipEnd, to);
+ LOG4CXX_DEBUG(s_sipExtractionLog, "to: " + to);
+
+ GrabSipName(toField, toFieldEnd, info->m_toName);
+
+ char* sipUser = memFindAfter("sip:", toField, toFieldEnd);
+ if(sipUser)
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(sipUser, toFieldEnd, info->m_to);
+ }
+ else
+ {
+ GrabSipUriUser(sipUser, toFieldEnd, info->m_to);
+ }
+ GrabSipUriDomain(sipUser, toFieldEnd, info->m_toDomain);
+ }
+ else
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(toField, toFieldEnd, info->m_to);
+ }
+ else
+ {
+ GrabSipUriUser(toField, toFieldEnd, info->m_to);
+ }
+ GrabSipUriDomain(toField, toFieldEnd, info->m_toDomain);
+ }
+ }
+
+ info->m_senderIp = ipHeader->ip_src;
+ info->m_receiverIp = ipHeader->ip_dest;
CStdString logMsg;
- info.ToString(logMsg);
+ info->ToString(logMsg);
LOG4CXX_INFO(s_sipPacketLog, "BYE: " + logMsg);
if(callIdField && DLLCONFIG.m_sipIgnoreBye == false)
{
diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp
index e9d5a8a..03dea4f 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp
+++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp
@@ -389,6 +389,7 @@ void VoIpConfig::Validate()
m_sipAllowMultipleMediaAddresses = true;
m_rtpDetectOnOddPorts = true;
m_sipRequestUriAsLocalParty = false;
+ m_sipIgnoreBye = false;
}
}