///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2019 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.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__);
}