From bb260e148f9b5427761d690781c81b26c1ffa611 Mon Sep 17 00:00:00 2001 From: Henri Herscher Date: Thu, 21 Dec 2006 19:23:00 +0000 Subject: 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 --- orkaudio/audiocaptureplugins/voip/VoIp.cpp | 56 +++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 16 deletions(-) (limited to 'orkaudio/audiocaptureplugins/voip/VoIp.cpp') 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 && clen); 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; -- cgit v1.2.3