blob: f96e03bfb7527f195f808c075c6c508cd51de112 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2016 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
///////////////////////////////////////////////////////////////////////////////
//
// File: SDP_EncDec.cc
// Rev: R14C
// Prodnr: CNL 113 353
// Updated: 2012-02-07
// Contact: http://ttcn.ericsson.se
// Reference: ITU-T SDP
#include "SDP_Types.hh"
// function to encode SDP contact (email or telephone no)
namespace SDP__Types{
CHARSTRING enc_Message (const SDP__Message& message, bool RFC822Name = false)
{
SDP__Message message2 = message;
if(message2.emails().ispresent())
{
SDP__email__list& emails = message2.emails();
for(int i = 0; i < emails.size_of(); i++)
{
if(emails[i].disp__name().ispresent())
{
if(!RFC822Name)
{
//encode e=mjh@isi.edu (Mark Handley)
CHARSTRING& disp_name = emails[i].disp__name();
disp_name = " (" + disp_name + ")";
}
else
{
//encode e=Mark Handley <mjh@isi.edu> by swapping the fields
CHARSTRING tmp = emails[i].addr__or__phone();
CHARSTRING& addr_or_phone = emails[i].addr__or__phone();
addr_or_phone = emails[i].disp__name();
CHARSTRING& disp_name = emails[i].disp__name();
disp_name = " <" + tmp + ">";
}
}
}
}
if(message.phone__numbers().ispresent())
{
SDP__phone__list& phone_numbers = message2.phone__numbers();
for(int i = 0; i < phone_numbers.size_of(); i++)
{
if(phone_numbers[i].disp__name().ispresent())
{
if(!RFC822Name)
{
//encode e=mjh@isi.edu (Mark Handley)
CHARSTRING& disp_name = phone_numbers[i].disp__name();
disp_name = " (" + disp_name + ")";
}
else
{
//encode e=Mark Handley <mjh@isi.edu> by swapping the fields
CHARSTRING tmp = phone_numbers[i].addr__or__phone();
CHARSTRING& addr_or_phone = phone_numbers[i].addr__or__phone();
addr_or_phone = phone_numbers[i].disp__name();
CHARSTRING& disp_name = phone_numbers[i].disp__name();
disp_name = " <" + tmp + ">";
}
}
}
}
TTCN_Buffer bb;
message2.encode(SDP__Message_descr_ , bb, TTCN_EncDec::CT_TEXT);
return CHARSTRING (bb.get_len(),(char *)bb.get_data());
}
CHARSTRING f__SDP__enc__Message__RFC822Name (const SDP__Message& message)
{
return enc_Message (message, true);
}
CHARSTRING f__SDP__enc__Message (const SDP__Message& message)
{
return enc_Message (message, false);
}
SRTP__Crypto f__SDP__dec__SRTP__Crypto(const CHARSTRING& input)
{
if (TTCN_Logger::log_this_event(TTCN_Logger::DEBUG_ENCDEC)) {
TTCN_Logger::begin_event(TTCN_Logger::DEBUG_ENCDEC);
TTCN_Logger::log_event_str("f_SDP_dec_SRTP_Crypto(): Stream before decoding: ");
input.log();
TTCN_Logger::end_event();
}
TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_DEFAULT);
TTCN_EncDec::clear_error();
TTCN_Buffer ttcn_buffer(input);
SRTP__Crypto ret_val;
ret_val.decode(SRTP__Crypto_descr_, ttcn_buffer, TTCN_EncDec::CT_TEXT);
if (TTCN_Logger::log_this_event(TTCN_Logger::DEBUG_ENCDEC)) {
TTCN_Logger::begin_event(TTCN_Logger::DEBUG_ENCDEC);
TTCN_Logger::log_event_str("f_SDP_dec_SRTP_Crypto(): Decoded @SDP_Types.SRTP_Crypto: ");
ret_val.log();
TTCN_Logger::end_event();
}
if (TTCN_EncDec::get_last_error_type() == TTCN_EncDec::ET_NONE) {
if (ttcn_buffer.get_pos() < ttcn_buffer.get_len()-1 && TTCN_Logger::log_this_event(TTCN_WARNING)) {
ttcn_buffer.cut();
CHARSTRING remaining_stream;
ttcn_buffer.get_string(remaining_stream);
TTCN_Logger::begin_event(TTCN_WARNING);
TTCN_Logger::log_event_str("f_SDP_dec_SRTP_Crypto(): Warning: Data remained at the end of the stream after successful decoding: ");
remaining_stream.log();
TTCN_Logger::end_event();
}
}
return ret_val;
}
TTCN_Module SDPEncDec("SDPEncDec", __DATE__, __TIME__);
}