summaryrefslogtreecommitdiff
path: root/orkaudio/audiocaptureplugins/voip/VoIp.cpp
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-12-21 19:23:00 +0000
committerHenri Herscher <henri@oreka.org>2006-12-21 19:23:00 +0000
commitbb260e148f9b5427761d690781c81b26c1ffa611 (patch)
tree95776222e8ca4cb860a18bf48466e0fb8a48681c /orkaudio/audiocaptureplugins/voip/VoIp.cpp
parent99c3dbf70cb598675a988a5124629796a6d10632 (diff)
SIP field extraction now supports missing whitespace between semicolon and field data.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@374 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkaudio/audiocaptureplugins/voip/VoIp.cpp')
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIp.cpp56
1 files changed, 40 insertions, 16 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
index 9f16836..0a1db63 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp
+++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
@@ -132,15 +132,27 @@ char* memFindEOL(char* start, char* limit)
return start;
}
+
// Grabs a string in memory until encountering null char, a space a CR or LF chars
-void GrabToken(char* in, CStdString& out)
+void GrabToken(char* in, char* limit, CStdString& out)
{
- for(char* c = in; *c != '\0' && *c != 0x20 && *c != 0x0D && *c != 0x0A; c = c+1)
+ for(char* c = in; *c != '\0' && *c != 0x20 && *c != 0x0D && *c != 0x0A && c<limit; c = c+1)
{
out += *c;
}
}
+// Same as GrabToken but skipping leading whitespaces
+void GrabTokenSkipLeadingWhitespaces(char* in, char* limit, CStdString& out)
+{
+ char* c = in;
+ while(*c == 0x20 && (*c != '\0' && *c != 0x0D && *c != 0x0A) && c<limit)
+ {
+ c = c+1;
+ }
+ GrabToken(c, limit, out);
+}
+
void GrabAlphaNumToken(char * in, char* limit, CStdString& out)
{
// Look for first alphanum character
@@ -159,6 +171,18 @@ void GrabAlphaNumToken(char * in, char* limit, CStdString& out)
}
}
+// Same as GrabAlphaNumToken but skipping leading whitespaces
+void GrabAlphaNumTokenSkipLeadingWhitespaces(char* in, char* limit, CStdString& out)
+{
+ char* c = in;
+ while(*c == 0x20 && (*c != '\0' && *c != 0x0D && *c != 0x0A) && c < limit)
+ {
+ c = c+1;
+ }
+ GrabAlphaNumToken(c, limit, out);
+}
+
+
void GrabString(char* start, char* stop, CStdString& out)
{
char* c = start;
@@ -250,10 +274,10 @@ bool TrySipBye(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, U
int sipLength = ntohs(udpHeader->len);
char* sipEnd = (char*)udpPayload + sipLength;
SipByeInfo info;
- char* callIdField = memFindAfter("Call-ID: ", (char*)udpPayload, sipEnd);
+ char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd);
if(callIdField)
{
- GrabToken(callIdField, info.m_callId);
+ GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info.m_callId);
}
LOG4CXX_INFO(s_sipPacketLog, "BYE: callid:" + info.m_callId);
if(callIdField)
@@ -277,9 +301,9 @@ bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader
SipInviteInfoRef info(new SipInviteInfo());
- char* fromField = memFindAfter("From: ", (char*)udpPayload, sipEnd);
- char* toField = memFindAfter("To: ", (char*)udpPayload, sipEnd);
- char* callIdField = memFindAfter("Call-ID: ", (char*)udpPayload, sipEnd);
+ char* fromField = memFindAfter("From:", (char*)udpPayload, sipEnd);
+ char* toField = memFindAfter("To:", (char*)udpPayload, sipEnd);
+ char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd);
char* audioField = NULL;
char* connectionAddressField = NULL;
@@ -297,11 +321,11 @@ bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader
char* sipUser = memFindAfter("sip:", fromField, fromFieldEnd);
if(sipUser)
{
- GrabAlphaNumToken(sipUser, fromFieldEnd, info->m_from);
+ GrabAlphaNumTokenSkipLeadingWhitespaces(sipUser, fromFieldEnd, info->m_from);
}
else
{
- GrabAlphaNumToken(fromField, fromFieldEnd, info->m_from);
+ GrabAlphaNumTokenSkipLeadingWhitespaces(fromField, fromFieldEnd, info->m_from);
}
}
if(toField)
@@ -313,27 +337,27 @@ bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader
char* sipUser = memFindAfter("sip:", toField, toFieldEnd);
if(sipUser)
{
- GrabAlphaNumToken(sipUser, toFieldEnd, info->m_to);
+ GrabAlphaNumTokenSkipLeadingWhitespaces(sipUser, toFieldEnd, info->m_to);
}
else
{
- GrabAlphaNumToken(toField, toFieldEnd, info->m_to);
+ GrabAlphaNumTokenSkipLeadingWhitespaces(toField, toFieldEnd, info->m_to);
}
}
if(callIdField)
{
- GrabToken(callIdField, info->m_callId);
+ GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info->m_callId);
audioField = memFindAfter("m=audio ", callIdField, sipEnd);
connectionAddressField = memFindAfter("c=IN IP4 ", callIdField, sipEnd);
}
if(audioField)
{
- GrabToken(audioField, info->m_fromRtpPort);
+ GrabToken(audioField, sipEnd, info->m_fromRtpPort);
}
if(connectionAddressField)
{
CStdString connectionAddress;
- GrabToken(connectionAddressField, connectionAddress);
+ GrabToken(connectionAddressField, sipEnd, connectionAddress);
struct in_addr fromIp;
if(connectionAddress.size())
{
@@ -441,9 +465,9 @@ void HandleSkinnyMessage(SkinnyHeaderStruct* skinnyHeader, IpHeaderStruct* ipHea
// Extract Calling and Called number.
CStdString callingParty;
char* parties = (char*)(&ccm5CallInfo->parties);
- GrabToken(parties, callingParty);
+ GrabToken(parties, parties+SKINNY_CCM5_PARTIES_BLOCK_SIZE, callingParty);
CStdString calledParty;
- GrabToken(parties+callingParty.size()+1, calledParty);
+ GrabToken(parties+callingParty.size()+1, parties+SKINNY_CCM5_PARTIES_BLOCK_SIZE, calledParty);
// Emulate a regular CCM CallInfo message
SkCallInfoStruct callInfo;