blob: 23d2794b871110502a9dfe9e2a8e0ce47b534c62 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#include "session_info_parser.h"
#include "oscl_string_utils.h"
#include "rtsp_time_formats.h"
#include "sdp_info.h"
#include "oscl_str_ptr_len.h"
#include "rtsp_range_utils.h"
#include "oscl_string_containers.h"
SDP_ERROR_CODE parseSDPSessionInfo(const char *sdp_text, int length, SDPInfo *sdp)
{
sessionDescription *session = sdp->getSessionInfo();
bool o_field_found = false;
bool s_field_found = false;
bool a_control_found = false;
bool a_range_found = false;
bool t_field_found = false;
bool u_field_found = false;
const char *end = sdp_text + length;
const char *current_start = sdp_text;
const char *line_start_ptr, *line_end_ptr;
OsclMemoryFragment memFrag;
// setup the known attribute fields here
StrPtrLen author("a=author:");
StrPtrLen version("a=version:");
StrPtrLen copyright("a=copyright:");
StrPtrLen rating("a=rating:");
StrPtrLen range("a=range:");
StrPtrLen wmf_version("a=X-wmfversion:");
StrPtrLen allowrecord("a=X-allowrecord");
StrPtrLen random_access("a=random_access_denied");
StrPtrLen control("a=control:");
StrPtrLen creation_date("a=creation_date:");
StrPtrLen video_only_allowed_true("a=video_only_allowed:true");
StrPtrLen video_only_allowed_false("a=video_only_allowed:false");
StrPtrLen etag("a=etag:");
//StrPtrLen security("a=X-security_flag:");
StrPtrLen random_filler("a=X-random_filler:");
StrPtrLen digital_signature("a=X-digital_signature:");
StrPtrLen end_of_clip("a=X-end_of_clip:");
StrPtrLen launch_URL("a=X-launch_URL:");
StrPtrLen app_specific_string("a=X-app_specific_string:");
StrPtrLen pause_denied("a=X-pause_denied");
StrPtrLen qoe_metrics("a=3GPP-QoE-Metrics:");
StrPtrLen sdp_int_key("a=3GPP-Integrity-Key:");
StrPtrLen sdp_auth("a=3GPP-SDP-Auth:");
StrPtrLen alt_gp("a=alt-group:");
StrPtrLen asset_info("a=3GPP-Asset-Information:");
// added for RM
StrPtrLen sdpplinversion("a=SdpplinVersion:");
StrPtrLen flags("a=Flags:");
StrPtrLen isrealdatatype("a=IsRealDataType:");
StrPtrLen streamcount("a=StreamCount:");
StrPtrLen title("a=Title:");
StrPtrLen keywords("a=Keywords:");
StrPtrLen abstract("a=Abstract:");
StrPtrLen ASMrulebook("a=ASMRuleBook");
while (get_next_line(current_start, end,
line_start_ptr, line_end_ptr))
{
// check for line type
switch (*line_start_ptr)
{
case 'v':
{
uint32 version;
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
if (PV_atoi(line_start_ptr + 2, 'd', line_end_ptr - line_start_ptr - 2, version) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
if (version)
return SDP_BAD_SESSION_FORMAT;
session->setProtocolVersion(version);
break;
}
case 'o':
{
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
o_field_found = true;
// parse through each field
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
// get the username
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setOUsername(memFrag);
// get the sessionID
sptr = skip_whitespace(eptr, line_end_ptr);
//o=- -1586996066 -1586996066 IN IP4 172.31.105.21
//workaround for server found during IOT. 12/12/06
while ((*sptr < '0') || (*sptr > '9'))
{
sptr++;
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
uint64 sessionId64;
if (!PV_atoi(sptr, 'd', eptr - sptr, sessionId64)) // session ID should be numeric
return SDP_BAD_SESSION_FORMAT;
uint32 sessionId =
Oscl_Int64_Utils::get_uint64_lower32(sessionId64);
session->setOSessionID(sessionId);
// get the version
sptr = skip_whitespace(eptr, line_end_ptr);
//o=- -1586996066 -1586996066 IN IP4 172.31.105.21
//workaround for server found during IOT. 12/12/06
while ((*sptr < '0') || (*sptr > '9'))
{
sptr++;
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
uint64 version64;
if (!PV_atoi(sptr, 'd', eptr - sptr, version64))
return SDP_BAD_SESSION_FORMAT;
uint32 version =
Oscl_Int64_Utils::get_uint64_lower32(version64);
session->setOVersion(version);
// get the network type
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setONetworkType(memFrag);
// get the address type
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setOAddressType(memFrag);
// get the orginator address
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setOAddress(memFrag);
break;
}
case 's':
{
// the session Name is a string which can contain whitespace
if (s_field_found) // only one s field allowed at session level
return SDP_BAD_SESSION_FORMAT;
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
s_field_found = true;
// parse through each field
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
// get the session name
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setSessionName(memFrag);
break;
}
case 'u':
{
// the session Name is a string which can contain whitespace
if (u_field_found) // only one s field allowed at session level
return SDP_BAD_SESSION_FORMAT;
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
u_field_found = true;
// parse through each field
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
// get the session name
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setSessionURI(memFrag);
break;
}
case 'i':
{
// the session info is a string which can contain whitespace
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
// parse through each field
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
// get the session name
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setSessionInformation(memFrag);
break;
}
case 'c':
{
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
session->setCFieldStatus(true);
// parse through each field
const char *sptr, *eptr;
// get the connection network type
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setCNetworkType(memFrag);
// get the address type
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setCAddressType(memFrag);
uint32 len = OSCL_MIN((uint32)(eptr - sptr), oscl_strlen("IP6"));
if (oscl_strncmp(sptr, "IP6", len) == 0)
{
//TBD
break;
}
// get the address
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr < sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setCAddress(memFrag);
uint32 address;
const char *addrend = sptr;
for (; *addrend != '.'; ++addrend);
PV_atoi(sptr, 'd', addrend - sptr, address);
if (address >= 224 && address <= 239) //multicast address look for TTL
{
for (; (*sptr != '/') && (sptr < eptr); ++sptr);
if (sptr == eptr)
return SDP_BAD_SESSION_FORMAT; // no TTL found in multicast address.
else
{
uint32 ttl;
sptr = sptr + 1;
if (!PV_atoi(sptr, 'd', eptr - sptr, ttl))
return SDP_BAD_SESSION_FORMAT;
if (!(ttl <= 255))
return SDP_BAD_SESSION_FORMAT; // ttl out of range.
}
}
else // unicast address
{
for (; (*sptr != '/') && (sptr < eptr); ++sptr);
if (!oscl_strncmp(sptr, "/", 1))
return SDP_BAD_SESSION_FORMAT; //unicast address can not have TTL.
}
if (eptr < line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
break;
}
case 't':
{
uint64 start_time, stop_time;
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
t_field_found = true;
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
if (PV_atoi(sptr, 'd', (eptr - sptr), start_time) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
session->setSessionStartTime(start_time);
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
if (PV_atoi(sptr, 'd', (eptr - sptr), stop_time) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
session->setSessionStopTime(stop_time);
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setExpiryDate(memFrag);
break;
}
case 'r':
{
uint32 repeat_interval, active_duration;
char convert_to_sec = NULL_TERM_CHAR;
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
int size = 0;
if (!oscl_strncmp((eptr - 1), "d", 1) || !oscl_strncmp((eptr - 1), "h", 1) || !oscl_strncmp((eptr - 1), "m", 1) || !oscl_strncmp((eptr - 1), "s", 1))
{
convert_to_sec = *(eptr - 1);
size = eptr - 1 - sptr;
}
else
size = eptr - sptr;
if (PV_atoi(sptr, 'd', size, repeat_interval) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
if (convert_to_sec == 'd')
{
repeat_interval = repeat_interval * 24 * 3600;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 'h')
{
repeat_interval = repeat_interval * 3600;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 'm')
{
repeat_interval = repeat_interval * 60;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 's')
{
convert_to_sec = NULL_TERM_CHAR; // already in seconds.
}
session->setRepeatInterval(repeat_interval);
eptr = skip_whitespace(eptr, line_end_ptr);
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
if (!oscl_strncmp((eptr - 1), "d", 1) || !oscl_strncmp((eptr - 1), "h", 1) || !oscl_strncmp((eptr - 1), "m", 1) || !oscl_strncmp((eptr - 1), "s", 1))
{
convert_to_sec = *(eptr - 1);
size = eptr - 1 - sptr;
}
else
size = eptr - sptr;
if (PV_atoi(sptr, 'd', size, active_duration) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
if (convert_to_sec == 'd')
{
active_duration = active_duration * 24 * 3600;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 'h')
{
active_duration = active_duration * 3600;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 'm')
{
active_duration = active_duration * 60;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 's')
{
convert_to_sec = NULL_TERM_CHAR;
}
session->setActiveDuration(active_duration);
while (sptr < line_end_ptr)
{
uint32 offset;
sptr = skip_whitespace(eptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
if (!oscl_strncmp((eptr - 1), "d", 1) || !oscl_strncmp((eptr - 1), "h", 1) || !oscl_strncmp((eptr - 1), "m", 1) || !oscl_strncmp((eptr - 1), "s", 1))
{
size = eptr - 1 - sptr;
convert_to_sec = *(eptr - 1);
}
else
size = eptr - sptr;
if (PV_atoi(sptr, 'd', size, offset) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
if (convert_to_sec == 'd')
{
offset = offset * 24 * 3600;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 'h')
{
offset = offset * 3600;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 'm')
{
offset = offset * 60;
convert_to_sec = NULL_TERM_CHAR;
}
else if (convert_to_sec == 's')
{
convert_to_sec = NULL_TERM_CHAR;
}
session->addOffset(offset);
sptr = eptr;
}
break;
}
case 'b':
{
if (!oscl_strncmp(line_start_ptr, "b=AS:", oscl_strlen("b=AS:")))
{
const char *sptr;
sptr = line_start_ptr + oscl_strlen("b=AS:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
uint32 bitRate;
if (PV_atoi(sptr, 'd', (line_end_ptr - sptr), bitRate) == true)
{
session->setBitrate(1000*bitRate);
}
else
{
return SDP_BAD_SESSION_FORMAT;
}
}
else if (!oscl_strncmp(line_start_ptr, "b=RS:", oscl_strlen("b=RS:")))
{
const char *sptr;
sptr = line_start_ptr + oscl_strlen("b=AS:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
uint32 rtcpBWSender;
if (PV_atoi(sptr, 'd', (line_end_ptr - sptr), rtcpBWSender) == true)
{
session->setRTCPSenderBitRate(rtcpBWSender);
}
else
{
return SDP_BAD_SESSION_FORMAT;
}
}
else if (!oscl_strncmp(line_start_ptr, "b=RR:", oscl_strlen("b=RR:")))
{
const char *sptr;
sptr = line_start_ptr + oscl_strlen("b=AS:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
uint32 rtcpBWReceiver;
if (PV_atoi(sptr, 'd', (line_end_ptr - sptr), rtcpBWReceiver) == true)
{
session->setRTCPReceiverBitRate(rtcpBWReceiver);
}
else
{
return SDP_BAD_SESSION_FORMAT;
}
}
else if (!oscl_strncmp(line_start_ptr, "b=TIAS:", oscl_strlen("b=TIAS:")))
{
const char *sptr;
sptr = line_start_ptr + oscl_strlen("b=TIAS:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
uint32 bMod;
if (PV_atoi(sptr, 'd', (line_end_ptr - sptr), bMod) == true)
{
session->setBWtias(1000 * bMod);
}
else
{
return SDP_BAD_SESSION_FORMAT;
}
}
break;
}
case 'k':
{
const char *sptr, *eptr;
if (!oscl_strncmp(line_start_ptr, "k=clear:", oscl_strlen("k=clear:")))
{
sptr = line_start_ptr + oscl_strlen("k=clear:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setEncryptionKey(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, "k=base64:", oscl_strlen("k=base64:")))
{
sptr = line_start_ptr + oscl_strlen("k=base64:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setEncryptionKey(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, "k=uri:", oscl_strlen("k=uri:")))
{
sptr = line_start_ptr + oscl_strlen("k=uri:");
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setEncryptionKey(memFrag);
}
else
{
sptr = line_start_ptr;
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
}
break;
}
case 'a':
{
// check to see if it is a known attribute -- otherwise ignore it.
const char *sptr, *eptr;
if (!oscl_strncmp(line_start_ptr, author.c_str(), author.length()))
{
sptr = skip_whitespace(line_start_ptr + author.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setAuthor(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, version.c_str(),
version.length()))
{
sptr = skip_whitespace(line_start_ptr + version.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setVersion(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, copyright.c_str(),
copyright.length()))
{
sptr = skip_whitespace(line_start_ptr + copyright.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setCopyright(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, rating.c_str(), rating.length()))
{
sptr = skip_whitespace(line_start_ptr + rating.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setRating(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, range.c_str(), range.length()))
{
RtspRangeType rangeVal;
if (parseRtspRange((line_start_ptr + range.length()), (line_end_ptr - line_start_ptr - range.length()),
rangeVal))
{
session->setRange(rangeVal);
a_range_found = true;
}
}
else if (!oscl_strncmp(line_start_ptr, wmf_version.c_str(),
wmf_version.length()))
{
sptr = skip_whitespace(line_start_ptr + wmf_version.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setWmfVersion(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, allowrecord.c_str(),
allowrecord.length()))
{
session->setAllowRecord(true);
}
else if (!oscl_strncmp(line_start_ptr, random_access.c_str(),
random_access.length()))
{
session->setRandomAccessDenied(true);
}
else if (!oscl_strncmp(line_start_ptr, control.c_str(),
control.length()))
{
sptr = skip_whitespace(line_start_ptr + control.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
OSCL_HeapString<SDPParserAlloc> control_str(sptr, eptr - sptr);
session->setControlURL(control_str);
a_control_found = true;
}
else if (!oscl_strncmp(line_start_ptr, creation_date.c_str(),
creation_date.length()))
{
sptr = skip_whitespace(line_start_ptr + creation_date.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setCreationDate(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, video_only_allowed_true.c_str(),
video_only_allowed_true.length()))
{
session->setVideoOnlyAllowed(ALLOWED);
}
else if (!oscl_strncmp(line_start_ptr, video_only_allowed_false.c_str(),
video_only_allowed_false.length()))
{
session->setVideoOnlyAllowed(NOT_ALLOWED);
}
else if (!oscl_strncmp(line_start_ptr, etag.c_str(), etag.length()))
{
sptr = skip_whitespace(line_start_ptr + etag.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setETag(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, random_filler.c_str(), random_filler.length()))
{
sptr = skip_whitespace(line_start_ptr + random_filler.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setRandomFiller(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, digital_signature.c_str(),
digital_signature.length()))
{
sptr = skip_whitespace(line_start_ptr + digital_signature.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setDigitalSignature(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, launch_URL.c_str(), launch_URL.length()))
{
sptr = skip_whitespace(line_start_ptr + launch_URL.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setLaunchURL(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, end_of_clip.c_str(), end_of_clip.length()))
{
sptr = skip_whitespace(line_start_ptr + end_of_clip.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
//uint32 action = 0;
StrPtrLen nothing("NOTHING");
StrPtrLen close("CLOSE");
StrPtrLen launch("LAUNCH");
if (!oscl_strncmp(nothing.c_str(), sptr, nothing.length()))
{
session->setEndOfClipAction(DEFAULT);
}
else if (!oscl_strncmp(close.c_str(), sptr, close.length()))
{
session->setEndOfClipAction(CLOSE_PLAYER);
}
else if (!oscl_strncmp(launch.c_str(), sptr, launch.length()))
{
session->setEndOfClipAction(LAUNCH_URL);
}
}
// added for RM
else if (!oscl_strncmp(line_start_ptr, sdpplinversion.c_str(),
sdpplinversion.length()))
{
uint32 version;
sptr = skip_whitespace(line_start_ptr + sdpplinversion.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
if (PV_atoi(sptr, 'd', (eptr - sptr), version) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
session->setSdpplinVersion(version);
}
else if (!oscl_strncmp(line_start_ptr, flags.c_str(),
flags.length()))
{
uint32 flag;
sptr = skip_whitespace(line_start_ptr + flags.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
if (PV_atoi(sptr, 'd', (eptr - sptr), flag) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
session->setFlags(flag);
}
else if (!oscl_strncmp(line_start_ptr, streamcount.c_str(),
streamcount.length()))
{
uint32 count;
sptr = skip_whitespace(line_start_ptr + streamcount.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
if (PV_atoi(sptr, 'd', (eptr - sptr), count) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
session->setStreamCount(count);
}
else if (!oscl_strncmp(line_start_ptr, isrealdatatype.c_str(),
isrealdatatype.length()))
{
uint32 isrealdata;
sptr = skip_whitespace(line_start_ptr + isrealdatatype.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_whitespace(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
if (PV_atoi(sptr, 'd', (eptr - sptr), isrealdata) == false)
{
return SDP_BAD_SESSION_FORMAT;
}
session->setIsRealDataType(isrealdata);
}
else if (!oscl_strncmp(line_start_ptr, "a=Author:", author.length()))
{
sptr = skip_whitespace(line_start_ptr + author.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setAuthor(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, "a=Copyright:", copyright.length()))
{
sptr = skip_whitespace(line_start_ptr + copyright.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setCopyright(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, title.c_str(),
title.length()))
{
sptr = skip_whitespace(line_start_ptr + title.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
memFrag.ptr = (void*)(sptr + 1);
memFrag.len = ((eptr - 2) - sptr);
session->setTitle(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, keywords.c_str(),
keywords.length()))
{
sptr = skip_whitespace(line_start_ptr + keywords.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
memFrag.ptr = (void*)(sptr + 1);
memFrag.len = ((eptr - 2) - sptr);
session->setKeywords(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, abstract.c_str(),
abstract.length()))
{
sptr = skip_whitespace(line_start_ptr + abstract.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
memFrag.ptr = (void*)(sptr + 1);
memFrag.len = ((eptr - 2) - sptr);
session->setAbstract(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, ASMrulebook.c_str(),
ASMrulebook.length()))
{
sptr = skip_whitespace(line_start_ptr + ASMrulebook.length(),
line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
// return SDP_BAD_SESSION_FORMAT;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
for (; *sptr != ';'; sptr++);
sptr = sptr + 1;
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setASMRuleBook(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, app_specific_string.c_str(), app_specific_string.length()))
{
sptr = skip_whitespace(line_start_ptr + app_specific_string.length(), line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setAppSpecificString(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, pause_denied.c_str(),
pause_denied.length()))
{
session->setPauseDenied(true);
}
else if (!oscl_strncmp(line_start_ptr, qoe_metrics.c_str(),
qoe_metrics.length()))
{
const char *sptr;
sptr = line_start_ptr + qoe_metrics.length();
QoEMetricsType qMetrics;
oscl_memset(qMetrics.name, 0, 7);
qMetrics.rateFmt = QoEMetricsType::VAL;
qMetrics.rateVal = 0;
qMetrics.paramFmt = QoEMetricsType::IDIGIT;
qMetrics.paramExtIdigit = 0;
if (!parseQoEMetrics(sptr, line_end_ptr, qMetrics))
return SDP_BAD_SESSION_FORMAT;
session->setQoEMetrics(qMetrics);
}
else if (!oscl_strncmp(line_start_ptr, sdp_int_key.c_str(),
sdp_int_key.length()))
{
const char *sptr = line_start_ptr + sdp_int_key.length();
const char *eptr = sptr;
bool found_OMADRMv2_keyMethod = false;
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
if (oscl_strncmp(sptr, "OMADRMv2:", oscl_strlen("OMADRMv2:")))
{
for (; *eptr != ':' ; ++eptr);
session->setKeyMethod(sptr, eptr - sptr);
}
else
{
found_OMADRMv2_keyMethod = true;
eptr = sptr + oscl_strlen("OMADRMv2:");
session->setKeyMethod(sptr, eptr - sptr);
}
sptr = eptr ;
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
else if (sptr == line_end_ptr)
break;
if (!found_OMADRMv2_keyMethod)
{
session->setKeyData(sptr, line_end_ptr - sptr);
break;
}
eptr = sptr;
for (; *eptr != ','; ++eptr);
session->setKeyData(sptr, (eptr - sptr));
sptr = eptr + 1;
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
if (oscl_strncmp(sptr, "\"", 1))
return SDP_BAD_SESSION_FORMAT;
else
sptr = sptr + 1;
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
eptr = sptr;
for (; *eptr != '\"'; ++eptr);
session->setKeyContentIdURI(sptr , (eptr - sptr));
sptr = eptr + 1;
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
if (oscl_strncmp(sptr, ",", 1))
return SDP_BAD_SESSION_FORMAT;
sptr = sptr + 1;
if (oscl_strncmp(sptr, "\"", 1))
return SDP_BAD_SESSION_FORMAT;
else
sptr = sptr + 1;
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
eptr = sptr;
for (; *eptr != '"'; ++eptr);
session->setKeyRightIssuerURI(sptr , ((eptr - 1) - sptr));
sptr = eptr + 1;
sptr = skip_whitespace(sptr, line_end_ptr);
if (sptr > line_end_ptr)
return SDP_BAD_SESSION_FORMAT;
session->setKeyFreshToken(sptr, (line_end_ptr - sptr));
}
else if (!oscl_strncmp(line_start_ptr, sdp_auth.c_str(),
sdp_auth.length()))
{
const char *sptr = line_start_ptr + sdp_auth.length();
memFrag.ptr = (void *)sptr;
memFrag.len = line_end_ptr - sptr;
session->setSdpAuthTag(memFrag);
}
else if (!oscl_strncmp(line_start_ptr, asset_info.c_str(),
asset_info.length()))
{
const char *sptr = line_start_ptr + asset_info.length();
AssetInfoType assetInfo;
if (!parseAssetInfo(sptr, line_end_ptr, assetInfo))
return SDP_BAD_SESSION_FORMAT;
session->setAssetInfo(assetInfo);
}
else if (!oscl_strncmp(line_start_ptr, alt_gp.c_str(),
alt_gp.length()))
{
const char *sptr = line_start_ptr + alt_gp.length();
sptr = skip_whitespace(sptr, line_end_ptr);
if (!oscl_strncmp(sptr, "BW", oscl_strlen("BW")))
session->setAltGroupBW(sptr, line_end_ptr - sptr);
else if (!oscl_strncmp(sptr, "LANG", oscl_strlen("LANG")))
session->setAltGroupLANG(sptr, line_end_ptr - sptr);
else
return SDP_BAD_SESSION_FORMAT;
}
if (!oscl_strncmp(line_start_ptr, "a=maxprate:", oscl_strlen("a=maxprate:")))
{
line_start_ptr += oscl_strlen("a=maxprate:");
OsclFloat rate;
if (!PV_atof(line_start_ptr, line_end_ptr - line_start_ptr, rate))
return SDP_BAD_SESSION_FORMAT;
session->setMaxprate(rate);
}
break;
}
case 'e':
{
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setEmail(memFrag);
break;
}
case 'p':
{
if (*(line_start_ptr + 1) != '=')
{
return SDP_BAD_SESSION_FORMAT;
}
const char *sptr, *eptr;
sptr = skip_whitespace(line_start_ptr + 2, line_end_ptr);
if (sptr >= line_end_ptr)
{
break;
}
eptr = skip_to_line_term(sptr, line_end_ptr);
if (eptr <= sptr)
{
return SDP_BAD_SESSION_FORMAT;
}
memFrag.ptr = (void*)sptr;
memFrag.len = (eptr - sptr);
session->setPhoneNumber(memFrag);
break;
}
}
current_start = line_end_ptr;
}
return SDP_SUCCESS;
}