Commit 4650fa6f authored by garciay's avatar garciay
Browse files

LIS validation against real equipment - SIP Codec

parent 1f2a55c1
Loading
Loading
Loading
Loading
+106 −45
Original line number Diff line number Diff line
@@ -3,14 +3,66 @@
#include "LibSip_XMLTypes.hh"

#include "sip_codec_register_request.hh"
#include "sip_codec_invite_request.hh"

#include "loggers.hh"

namespace LibSip__EncdecDeclarations {

    BITSTRING fx__enc__Request(const LibSip__SIPTypesAndValues::Request& p) { return BITSTRING(); }
    BITSTRING fx__enc__REGISTER__Request(const LibSip__SIPTypesAndValues::REGISTER__Request& p) { return BITSTRING(); }
    BITSTRING fx__enc__INVITE__Request(const LibSip__SIPTypesAndValues::INVITE__Request& p) { return BITSTRING(); }
  BITSTRING fx__enc__Request(const LibSip__SIPTypesAndValues::Request& p) {
    loggers::get_instance().log_msg(">>> fx__enc__Request: ", p);

    float duration;
    std::string tag("fx__enc__Request");
    loggers::get_instance().set_start_time(tag);

    OCTETSTRING os;
    sip_codec_request codec;
    if (codec.encode(p, os) == -1) {
      loggers::get_instance().warning("fx__enc__Request -1 result code was returned");
      return int2bit(0, 1);
    }
    loggers::get_instance().set_stop_time(tag, duration);
    
    return oct2bit(os);
  }
  
  BITSTRING fx__enc__REGISTER__Request(const LibSip__SIPTypesAndValues::REGISTER__Request& p) {
    loggers::get_instance().log_msg(">>> fx__enc__REGISTER__Request: ", p);

    float duration;
    std::string tag("fx__enc__REGISTER__Request");
    loggers::get_instance().set_start_time(tag);

    OCTETSTRING os;
    sip_codec_register_request codec;
    if (codec.encode(p, os) == -1) {
      loggers::get_instance().warning("fx__enc__REGISTER__Request: -1 result code was returned");
      return int2bit(0, 1);
    }
    loggers::get_instance().set_stop_time(tag, duration);
    
    return oct2bit(os);
  }
  
  BITSTRING fx__enc__INVITE__Request(const LibSip__SIPTypesAndValues::INVITE__Request& p) {
    loggers::get_instance().log_msg(">>> fx__enc__INVITE__Request: ", p);

    float duration;
    std::string tag("fx__enc__INVITE__Request");
    loggers::get_instance().set_start_time(tag);

    OCTETSTRING os;
    sip_codec_invite_request codec;
    if (codec.encode(p, os) == -1) {
      loggers::get_instance().warning("fx__enc__INVITE__Request: -1 result code was returned");
      return int2bit(0, 1);
    }
    loggers::get_instance().set_stop_time(tag, duration);
    
    return oct2bit(os);
  }
  
  BITSTRING fx__enc__OPTIONS__Request(const LibSip__SIPTypesAndValues::OPTIONS__Request& p) { return BITSTRING(); }
  BITSTRING fx__enc__BYE__Request(const LibSip__SIPTypesAndValues::BYE__Request& p) { return BITSTRING(); }
  BITSTRING fx__enc__CANCEL__Request(const LibSip__SIPTypesAndValues::CANCEL__Request& p) { return BITSTRING(); }
@@ -39,7 +91,16 @@ namespace LibSip__EncdecDeclarations {
    return 0;
  }

    INTEGER fx__dec__INVITE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::INVITE__Request& p) { return INTEGER(0); }
  INTEGER fx__dec__INVITE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::INVITE__Request& p) {
    loggers::get_instance().log_msg(">>> fx__dec__INVITE__Request: ", pdu);

    OCTETSTRING os = bit2oct(pdu);
    sip_codec_invite_request codec;
    codec.decode(os, p);

    return 0;
  }
  
  INTEGER fx__dec__OPTIONS__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::OPTIONS__Request& p) { return INTEGER(0); }
  INTEGER fx__dec__BYE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::BYE__Request& p) { return INTEGER(0); }
  INTEGER fx__dec__CANCEL__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::CANCEL__Request& p) { return INTEGER(0); }
+16 −3
Original line number Diff line number Diff line
@@ -131,8 +131,18 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
    const LibItsHttp__MessageBodyTypes::HttpMessageBody& body = static_cast<const LibItsHttp__MessageBodyTypes::HttpMessageBody&>(*v.get_opt_value());
    loggers::get_instance().log_msg("http_codec::encode_request: body: ", body);
    if (encode_body(body, os) == -1) {
      loggers::get_instance().warning("http_codec::encode_request: Failed to encode HTTP body");
      _ec.length = 0;
      _ec.is_content_length_present = 0x00;
    } else {
      _ec.length = os.lengthof();
      _ec.is_content_length_present = 0x01;
    }
    loggers::get_instance().log("http_codec::encode_request: length=%d", _ec.length);
  } else {
    loggers::get_instance().log("http_codec::encode_request: HTTP body field not present");
    _ec.length = 0;
    _ec.is_content_length_present = 0x00;
  }

  // Encode generic part
@@ -151,13 +161,15 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
    loggers::get_instance().log_msg("http_codec::encode_request: Processing header ", header.header__name());
    p_encoding_buffer.put_cs(header.header__name());
    p_encoding_buffer.put_cs(": ");
    if (std::string(static_cast<const char*>(header.header__name())).compare("Content-Length") == 0) {
    if (std::string(static_cast<const char*>(header.header__name())).compare("Content-length") == 0) {
      if (_ec.length != 0) {
        p_encoding_buffer.put_cs(int2str(_ec.length + 2/*Stand for the last CRLF*/));
        _ec.is_content_length_present = 0x01;
      } else {
        p_encoding_buffer.put_cs("0");
        _ec.is_content_length_present = 0x00;
      }
      _ec.is_content_length_present = 0x01;
      loggers::get_instance().log("http_codec::encode_request: Content-length: %d - %x", _ec.length, _ec.is_content_length_present);
    } else {
      const OPTIONAL<LibItsHttp__TypesAndValues::charstring__list>& o = header.header__value();
      if (o.ispresent()) {
@@ -179,7 +191,8 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
  } // End of 'for' statement

  p_encoding_buffer.put_cs("\r\n");
  if (_ec.length != 0) {
  if (_ec.is_content_length_present == 0x01) {
    loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os);
    p_encoding_buffer.put_os(os);
    p_encoding_buffer.put_cs("\r\n");
  }
+1 −1
Original line number Diff line number Diff line
@@ -7,12 +7,12 @@ int sip_codec_register_request::encode (const LibSip__SIPTypesAndValues::REGISTE
{
  loggers::get_instance().log_msg(">>> sip_codec_register_request::encode: ", (const Base_Type&)msg);

  loggers::get_instance().log_msg("<<< sip_codec_register_request::encode: data=", data);
  if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) {
    loggers::get_instance().warning("sip_codec_register_request::encode: Failed to encode message");
    return -1;
  }
  
  loggers::get_instance().log_msg("<<< sip_codec_register_request::encode: data=", data);
  return 0;
}

+781 −529

File changed.

Preview size limit exceeded, changes collapsed.

+55 −21
Original line number Diff line number Diff line
@@ -11,11 +11,24 @@ class TTCN_Buffer;

namespace LibSip__SIPTypesAndValues {
  class Request;
  class RequestLine;
  class MessageHeader;
  class Payload;
  class HostPort;
  class Authorization;
  class From;
  class To;
  class Via;
  class CallId;
  class ContentLength;
  class ContentType;
  class CSeq;
  class PreGenRecordOf;
  //  class OptionTag__List;
}

namespace LibSip__MessageBodyTypes {
  class MessageBody;
}

namespace LibSip__Common {
@@ -36,27 +49,48 @@ public:
  virtual int encode (const LibSip__SIPTypesAndValues::Request& msg, OCTETSTRING& data);
  virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::Request& msg, params* p_params = NULL);
private: //! \todo Move this section into a sip_codec_helper class, need to decode Response too
  void fill_message_body(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request);
  void fill_payload(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request);
  void fill_uri(LibSip__SIPTypesAndValues::SipUrl& p_sip_url, const osip_uri_t* p_uri);
  void fill_request_line(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& msg);
  void fill_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& msg);


  void fill_accept_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Accept& p_accept_header);
  void fill_accept_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptContact& p_accept_contact_header);
  void fill_accept_encoding_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptEncoding& p_accept_encoding_header);
  void fill_accept_language_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptLanguage& p_accept_language_header);
  void fill_alert_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AlertInfo& p_alert_info_header);
  void fill_allow_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Allow& p_allow_header);
  void fill_allow_events_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AllowEvents& p_allow_events_header);
  void fill_authorization_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Authorization& p_authorization_header);
  void fill_from_header(const osip_from_t* p_sip_from, LibSip__SIPTypesAndValues::From& p_from_header);
  void fill_to_header(const osip_to_t* p_sip_to, LibSip__SIPTypesAndValues::To& p_to_header);
  void fill_via_header(const osip_message_t* p_sip_via_list, LibSip__SIPTypesAndValues::Via& p_via_header);
  
  void fill_host_port(const char* p_host, const char* p_port, LibSip__SIPTypesAndValues::HostPort& p_host_port);
  void fill_semi_colon_params(const osip_list_t& p_sip_list, OPTIONAL<LibSip__Common::SemicolonParam__List>& p_list);
  void fill_ampersand_params(const osip_list_t& p_sip_list, OPTIONAL<LibSip__Common::AmpersandParam__List>& p_list);
  int encode_request(const LibSip__SIPTypesAndValues::Request& p_request, osip_message_t* p_sip_message);
  int encode_request_line(const LibSip__SIPTypesAndValues::RequestLine& p_request_line, osip_message_t* p_sip_message);
  int encode_request_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message);
  int encode_request_message_body(const LibSip__MessageBodyTypes::MessageBody& p_message_body, osip_message_t* p_sip_message);
  int encode_request_payload(const LibSip__SIPTypesAndValues::Payload& p_payload, osip_message_t* p_sip_message);
  int encode_from_header(const LibSip__SIPTypesAndValues::From& p_from, osip_from_t* p_from_header);
  int encode_to_header(const LibSip__SIPTypesAndValues::To& p_to, osip_to_t* p_to_header);
  int encode_via_header(const LibSip__SIPTypesAndValues::Via& p_via, osip_via_t* p_via_header);

  int encode_sip_url(const LibSip__SIPTypesAndValues::SipUrl& p_sip_uri, osip_uri_t** p_uri);
  void encode_host_port(const LibSip__SIPTypesAndValues::HostPort& p_host_port, std::string& p_host, std::string& p_port);

private: //! \todo Move this section into a sip_codec_helper class, need to decode Response too
  void decode_message_body(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request);
  void decode_payload(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request);
  void decode_uri(LibSip__SIPTypesAndValues::SipUrl& p_sip_url, const osip_uri_t* p_uri);
  void decode_request_line(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& msg);
  void decode_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& msg);

  // TODO Replace const osip_message_t* p_sip_message by header specific type using osip_parser.h/macros such as osip_message_get_accept/osip_accept_t
  void decode_accept_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Accept& p_accept_header);
  void decode_accept_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptContact& p_accept_contact_header);
  void decode_accept_encoding_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptEncoding& p_accept_encoding_header);
  void decode_accept_language_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptLanguage& p_accept_language_header);
  void decode_alert_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AlertInfo& p_alert_info_header);
  void decode_allow_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Allow& p_allow_header);
  void decode_allow_events_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AllowEvents& p_allow_events_header);
  void decode_authorization_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Authorization& p_authorization_header);
  void decode_call_id_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CallId& p_call_id_header);
  void decode_content_length_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentLength& p_content_length_header);
  void decode_content_type_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentType& p_content_type_header);
  void decode_c_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CSeq& p_c_seq_header);
  
  void decode_from_header(const osip_from_t* p_sip_from, LibSip__SIPTypesAndValues::From& p_from_header);
  void decode_max_forwards_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MaxForwards& p_max_forwards_header);
  void decode_supported_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Supported& p_supported_header);
  void decode_to_header(const osip_to_t* p_sip_to, LibSip__SIPTypesAndValues::To& p_to_header);
  void decode_via_header(const osip_message_t* p_sip_via_list, LibSip__SIPTypesAndValues::Via& p_via_header);
  
  void decode_host_port(const char* p_host, const char* p_port, LibSip__SIPTypesAndValues::HostPort& p_host_port);
  void decode_semi_colon_params(const osip_list_t& p_sip_list, OPTIONAL<LibSip__Common::SemicolonParam__List>& p_list);
  void decode_ampersand_params(const osip_list_t& p_sip_list, OPTIONAL<LibSip__Common::AmpersandParam__List>& p_list);
  void decode_option_tag_list(const char* p_list, OPTIONAL<LibSip__SIPTypesAndValues::OptionTag__List>& p_options_tags);

}; // End of class sip_codec_request
Loading