Commit d9c926cc authored by Yann Garcia's avatar Yann Garcia
Browse files

Enhance SDP decoding

parent 65affd1f
Loading
Loading
Loading
Loading
+135 −18
Original line number Diff line number Diff line
@@ -339,9 +339,12 @@ int sip_codec_request::encode_request_message_body(const LibSip__MessageBodyType
    sdp_message_t* sdp_body;
    ::sdp_message_init(&sdp_body);

    // Encode mandatory fields
    // Version
    INTEGER version = sdp.protocol__version();
    ::sdp_message_v_version_set(sdp_body, (char*)::strdup(std::to_string(static_cast<const int>(version)).c_str()));
    LibSip__SDPTypes::SDP__Origin origin = sdp.origin();
    // Origin
    loggers::get_instance().log_msg("sip_codec_request::encode_request_message_body: origin: ", origin);
    ::sdp_message_o_origin_set(
                               sdp_body,
@@ -352,6 +355,9 @@ int sip_codec_request::encode_request_message_body(const LibSip__MessageBodyType
                               (char*)::strdup(static_cast<const char*>(origin.addr__type())),
                               (char*)::strdup(static_cast<const char*>(origin.addr()))
                               );
    // Session name
    ::sdp_message_s_name_set(sdp_body, (char*)::strdup(static_cast<const char*>(sdp.session__name())));
    // Time, t
    ::sdp_message_s_name_set(sdp_body, (char*)::strdup(static_cast<const char*>(sdp.session__name())));
    loggers::get_instance().log_msg("sip_codec_request::encode_request_message_body: times: ", sdp.times());
    for (int i = 0; i < sdp.times().lengthof(); i++) {
@@ -374,9 +380,42 @@ int sip_codec_request::encode_request_message_body(const LibSip__MessageBodyType
      }
    } // End of 'for' statement
    
    // Encode optional fields
    // email, e
    loggers::get_instance().log_msg("sip_codec_request::encode_request_message_body: emails: ", sdp.emails());
    if (sdp.emails().is_present()) {
      const LibSip__SDPTypes::SDP__email__list& l = static_cast<const LibSip__SDPTypes::SDP__email__list&>(*sdp.emails().get_opt_value());
      for (int i = 0; i < l.lengthof(); i++) {
        const LibSip__SDPTypes::SDP__contact& e = l[i];
        std::string str;
        if (e.disp__name().is_present()) {
          str = static_cast<const char*>(static_cast<const CHARSTRING&>(*e.disp__name().get_opt_value()));
          str += " ";
        }
        str += static_cast<const char*>(e.addr__or__phone());
        ::sdp_message_e_email_add (sdp_body, ::strdup(str.c_str()));
      } // End of 'for' statement
    }
    // Information, i
    loggers::get_instance().log_msg("sip_codec_request::encode_request_message_body: information: ", sdp.information());
    if (sdp.information().is_present()) {
      ::sdp_message_i_info_set(sdp_body, 0, ::strdup(static_cast<const CHARSTRING&>(*sdp.information().get_opt_value())));
    }
    // Media list, m
    loggers::get_instance().log_msg("sip_codec_request::encode_request_message_body: medias: ", sdp.media__list());
    if (sdp.media__list().is_present()) {
      const LibSip__SDPTypes::SDP__media__desc__list& l = static_cast<const LibSip__SDPTypes::SDP__media__desc__list&>(*sdp.media__list().get_opt_value());
      int i = 0;
      for ( ; i < l.lengthof(); i++) {
        const LibSip__SDPTypes::SDP__media__desc m = l[i];
        loggers::get_instance().log_msg("sip_codec_request::encode_request_message_body: media: ", m);
        //::sdp_message_m_media_add(sdp_body, char *media, char *port, char *number_of_port, char *proto);
      } // End of 'for' statement
      ::sdp_message_endof_media(sdp_body, i);
    }
    // TODO To be continued
    
    loggers::get_instance().log("sip_codec_request::encode_message_body: SDP decoded");
    loggers::get_instance().log("sip_codec_request::encode_message_body: SDP encoded");
    
    char* buff = nullptr;
    ::sdp_message_to_str(sdp_body, &buff);
@@ -1367,6 +1406,8 @@ void sip_codec_request::decode_message_body(const osip_message_t* p_sip_message,
    p_request.messageBody().set_to_omit();
    return;
  }
  // TODO Align the body the content_length

  osip_content_type_t* content_type = ::osip_message_get_content_type(p_sip_message);
  osip_body_t* body;
  int result = ::osip_message_get_body(p_sip_message, 0, &body);
@@ -1383,25 +1424,29 @@ void sip_codec_request::decode_message_body(const osip_message_t* p_sip_message,
      LibSip__SDPTypes::SDP__Message sdp_header;
      sdp_message_t* sdp;
      ::sdp_message_init(&sdp);
      loggers::get_instance().log("sip_codec_request::decode_message_body: Parsing SDP on %s", body->body);
      if (::sdp_message_parse(sdp, body->body) == 0) {
        char *hvalue = sdp_message_v_version_get(sdp);
        // Mandatroy fields
        // Version, v
        char *hvalue = ::sdp_message_v_version_get(sdp);
        if (hvalue != nullptr) {
          sdp_header.protocol__version() = std::stoi(hvalue);
        }
        // Origin, o
        sdp_header.origin() = LibSip__SDPTypes::SDP__Origin(
                                                            sdp_message_o_username_get(sdp),
                                                            sdp_message_o_sess_version_get(sdp),
                                                            sdp_message_o_sess_version_get(sdp),
                                                            sdp_message_o_nettype_get(sdp),
                                                            sdp_message_o_addrtype_get(sdp),
                                                            sdp_message_o_addr_get(sdp)
                                                            ::sdp_message_o_username_get(sdp),
                                                            ::sdp_message_o_sess_version_get(sdp),
                                                            ::sdp_message_o_sess_version_get(sdp),
                                                            ::sdp_message_o_nettype_get(sdp),
                                                            ::sdp_message_o_addrtype_get(sdp),
                                                            ::sdp_message_o_addr_get(sdp)
                                                            );
        if ((hvalue = sdp_message_s_name_get(sdp)) != nullptr) {
        // Session name, s
        if ((hvalue = ::sdp_message_s_name_get(sdp)) != nullptr) {
          sdp_header.session__name() = CHARSTRING(hvalue);
        }
        // Time, t
        int i = 0;
        if ((hvalue = sdp_message_t_start_time_get(sdp, i)) != nullptr) {
        if ((hvalue = ::sdp_message_t_start_time_get(sdp, i)) != nullptr) {
          LibSip__SDPTypes::SDP__time__list l;
          do {
            LibSip__SDPTypes::SDP__time t;
@@ -1411,24 +1456,96 @@ void sip_codec_request::decode_message_body(const osip_message_t* p_sip_message,
            t.time__field() = tf;
            t.time__repeat().set_to_omit(); // TODO
            l[i] = t;
            i += 1;
          } while ((hvalue = ::sdp_message_t_start_time_get(sdp, i)) != nullptr);
          sdp_header.times() = l;
        } else {
          loggers::get_instance().warning("sip_codec_request::decode_message_body: No start time in sdp");
        }
        // Optional fields
        // Emails, e
        i = 0;
        if ((hvalue = ::sdp_message_e_email_get(sdp, i)) != nullptr) {
          LibSip__SDPTypes::SDP__email__list l;
          do {
            LibSip__SDPTypes::SDP__contact e;
            e.addr__or__phone() = CHARSTRING(hvalue);
            e.disp__name().set_to_omit(); // TODO To be refined
            l[i] = e;
            i += 1;
          } while ((hvalue = ::sdp_message_e_email_get(sdp, i)) != nullptr);
          sdp_header.emails() = OPTIONAL<LibSip__SDPTypes::SDP__email__list>(l);
        } else {
          loggers::get_instance().warning("sip_codec_request::decode_message_body: No emails in sdp");
          sdp_header.emails().set_to_omit();
        }
        // Information, i
        i = 0;
        if ((hvalue = ::sdp_message_i_info_get(sdp, i)) != nullptr) {
          sdp_header.information() = OPTIONAL<CHARSTRING>(CHARSTRING(hvalue));
        } else {
          loggers::get_instance().warning("sip_codec_request::decode_message_body: No information in sdp");
          sdp_header.information().set_to_omit();
        }
        // Media, m
        i = 0;
        if ((hvalue = ::sdp_message_m_media_get(sdp, i)) != nullptr) {
          LibSip__SDPTypes::SDP__media__desc__list l;
          do {
            // Media description
            LibSip__SDPTypes::SDP__media__field f;
            f.media() = CHARSTRING(hvalue);
            LibSip__SDPTypes::SDP__media__port p;
            hvalue = ::sdp_message_m_port_get(sdp, i);
            p.port__number() = std::stoi(hvalue);
            if ((hvalue = ::sdp_message_m_number_of_port_get(sdp, i)) == nullptr) {
              p.num__of__ports().set_to_omit();
            } else {
              p.num__of__ports() = OPTIONAL<INTEGER>(std::stoi(hvalue));
            }
            f.ports() = p;
            f.transport() = CHARSTRING(::sdp_message_m_proto_get(sdp, i));
            LibSip__SDPTypes::SDP__fmt__list fl;
            int j = 0;
            while ((hvalue = ::sdp_message_m_payload_get(sdp, i, j)) != nullptr) {
              fl[j++] = CHARSTRING(hvalue);
            } // End of 'for' statement
            f.fmts() = fl;
            LibSip__SDPTypes::SDP__media__desc m;
            m.media__field() = f;
            // TODO
            // Media attributes
            m.attributes().set_to_omit();
            m.bandwidth().set_to_omit();
            m.information().set_to_omit();
            m.connections().set_to_omit();
            m.key().set_to_omit();
            l[i] = m;
            i += 1;
          } while ((hvalue = sdp_message_t_start_time_get(sdp, i)) != nullptr);
          } while ((hvalue = ::sdp_message_m_media_get(sdp, i)) != nullptr);
          sdp_header.media__list() = OPTIONAL<LibSip__SDPTypes::SDP__media__desc__list>(l);
        } else {
          loggers::get_instance().warning("sip_codec_request::decode_message_body: Not start time in sdp");
          loggers::get_instance().warning("sip_codec_request::decode_message_body: No media in sdp");
          sdp_header.media__list().set_to_omit();
        }
        
        // TODO
        loggers::get_instance().warning("sip_codec_request::decode_message_body: Optional SDP not supported yet");
        sdp_header.information().set_to_omit();
        sdp_header.uri().set_to_omit();
        sdp_header.emails().set_to_omit();
        sdp_header.phone__numbers().set_to_omit();
        sdp_header.connection().set_to_omit();
        // Bandwidth
        //        sdp_bandwidth_t* b = ::sdp_message_bandwidth_get(sdp, i, j);
        sdp_header.bandwidth().set_to_omit();

        sdp_header.timezone__adjustments().set_to_omit();
        sdp_header.key().set_to_omit();

        // Attribute
        //        sdp_attribute_t* a = ::sdp_message_attribute_get(sdp, i, j);
        sdp_header.attributes().set_to_omit();
        sdp_header.media__list().set_to_omit();

        // Set message body
        m.sdpMessageBody() = sdp_header;
        loggers::get_instance().log_msg("sip_codec_request::decode_message_body: sdp:", m.sdpMessageBody());
      } else {