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

Enhance SDP support

parent cb54f9be
Loading
Loading
Loading
Loading
+280 −49
Original line number Diff line number Diff line
@@ -190,6 +190,22 @@ int sip_codec_headers::encode_headers(const LibSip__SIPTypesAndValues::MessageHe
    }
  }
  
  // PAccessNetworkInfo
  if (p_msg_header.pAccessNetworkInfo().is_present()) {
    if (encode_p_access_network_info_header(p_msg_header.pAccessNetworkInfo(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_headers::encode_headers: Faile to encode PAccessNetworkInfo header");
      return -1;
    }
  }
  
  // RSeq
  if (p_msg_header.rSeq().is_present()) {
    if (encode_r_seq_header(p_msg_header.rSeq(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_headers::encode_headers: Faile to encode RSeq header");
      return -1;
    }
  }

  // Supported
  if (p_msg_header.supported().is_present()) {
    if (encode_supported_header(p_msg_header.supported(), &p_sip_message) == -1) {
@@ -198,10 +214,10 @@ int sip_codec_headers::encode_headers(const LibSip__SIPTypesAndValues::MessageHe
    }
  }
  
  // PAccessNetworkInfo
  if (p_msg_header.pAccessNetworkInfo().is_present()) {
    if (encode_p_access_network_info_header(p_msg_header.pAccessNetworkInfo(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_headers::encode_headers: Faile to encode PAccessNetworkInfo header");
  // UserAgent
  if (p_msg_header.userAgent().is_present()) {
    if (encode_user_agent_header(p_msg_header.userAgent(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_headers::encode_headers: Faile to encode UserAgent header");
      return -1;
    }
  }
@@ -213,9 +229,10 @@ int sip_codec_headers::encode_headers(const LibSip__SIPTypesAndValues::MessageHe
  loggers::get_instance().log("Unknown headers count: %d\n", size);
  while (pos < size) {
    const osip_header_t* header = (const osip_header_t*)osip_list_get(p, pos++);
    loggers::get_instance().log("%p: hname=%s : hvalue=%s\n", header, header->hname, header->hvalue);
    loggers::get_instance().log("sip_codec_headers::encode_headers: %p: hname='%s' : hvalue='%s'\n", header, header->hname, header->hvalue);
  } // End of 'while' statement

  loggers::get_instance().log("<<< sip_codec_headers::encode_headers");
  return 0;
} // End of method encode_headers

@@ -395,11 +412,13 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  
  p_headers.organization().set_to_omit();
  

  // TODO
  LibSip__SIPTypesAndValues::PAccessNetworkInfo p_access_network_info_header;
  decode_p_access_network_info_header(p_sip_message, p_access_network_info_header);
  if (p_access_network_info_header.is_value()) {
    p_headers.pAccessNetworkInfo() = p_access_network_info_header;
  } else {
    p_headers.pAccessNetworkInfo().set_to_omit();


  }

  p_headers.pAssertedID().set_to_omit();
  p_headers.pAssertedService().set_to_omit();
@@ -413,13 +432,20 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  p_headers.pPreferredID().set_to_omit();
  p_headers.pPreferredService().set_to_omit();
  p_headers.priority().set_to_omit();
  
  LibSip__SIPTypesAndValues::Privacy privacy_header;
  decode_privacy_header(p_sip_message, privacy_header);
  if (privacy_header.is_value()) {
    p_headers.privacy() = privacy_header;
  } else {
    p_headers.privacy().set_to_omit();
  }
  
  p_headers.proxyAuthenticate().set_to_omit();
  p_headers.proxyAuthorization().set_to_omit();
  p_headers.proxyRequire().set_to_omit();
  p_headers.pVisitedNetworkID().set_to_omit();
  p_headers.rAck().set_to_omit();
  p_headers.rSeq().set_to_omit();
  p_headers.reason().set_to_omit();
  p_headers.recordRoute().set_to_omit();
  p_headers.recvInfo().set_to_omit();
@@ -430,6 +456,14 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  p_headers.replaces().set_to_omit();
  p_headers.replyTo().set_to_omit();
  p_headers.require().set_to_omit();
  
  LibSip__SIPTypesAndValues::RSeq r_seq_header;
  decode_r_seq_header(p_sip_message, r_seq_header);
  if (r_seq_header.is_value()) {
    p_headers.rSeq() = r_seq_header;
  } else {
    p_headers.rSeq().set_to_omit();
  }
  p_headers.retryAfter().set_to_omit();
  
  LibSip__SIPTypesAndValues::Route route_header;
@@ -471,7 +505,14 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  p_headers.timestamp__().set_to_omit();
  p_headers.unsupported().set_to_omit();
  p_headers.userToUser().set_to_omit();
  
  LibSip__SIPTypesAndValues::UserAgent user_agent_header;
  decode_user_agent_header(p_sip_message, user_agent_header);
  if (user_agent_header.is_value()) {
    p_headers.userAgent() = user_agent_header;
  } else {
    p_headers.userAgent().set_to_omit();
  }
  p_headers.warning().set_to_omit();
  p_headers.wwwAuthenticate().set_to_omit();
  p_headers.resourcePriority().set_to_omit();
@@ -482,10 +523,13 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  p_headers.undefinedHeader__List().set_to_omit();
  
  // List unprocessed headers
  int i = 0;
  osip_header_t* h_;
  while (::osip_message_get_header(p_sip_message, i++, &h_) == 0) {
    loggers::get_instance().warning("sip_codec_headers::decode_headers: '%s'/'%s' was not processed", h_->hname, h_->hvalue);
  const osip_list_t* p = &(p_sip_message->headers);
  unsigned int pos = 0;
  unsigned int size = ::osip_list_size(p);
  loggers::get_instance().log("Unknown headers count: %d\n", size);
  while (pos < size) {
    const osip_header_t* header = (const osip_header_t*)osip_list_get(p, pos++);
    loggers::get_instance().log("sip_codec_headers::decode_headers: %p: hname='%s' : hvalue='%s'\n", header, header->hname, header->hvalue);
  } // End of 'while' statement
  
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_headers: ", p_headers);
@@ -995,6 +1039,7 @@ int sip_codec_headers::encode_min_se_header(const OPTIONAL<LibSip__SIPTypesAndVa
          value += static_cast<const char*>(v.quotedString());
        }
      }
      i += 1;
    } while (i < l.lengthof());
  }
  ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Min-SE", value.c_str());
@@ -1002,6 +1047,72 @@ int sip_codec_headers::encode_min_se_header(const OPTIONAL<LibSip__SIPTypesAndVa
  return 0;
}

int sip_codec_headers::encode_p_access_network_info_header(const OPTIONAL<LibSip__SIPTypesAndValues::PAccessNetworkInfo>& p_p_access_network_info_header, osip_message_t** p_sip_message) {
  loggers::get_instance().log_msg(">>> sip_codec_headers::encode_p_access_network_info_header", p_p_access_network_info_header);

  const LibSip__SIPTypesAndValues::PAccessNetworkInfo& p_access_network_info_header = static_cast<const LibSip__SIPTypesAndValues::PAccessNetworkInfo&>(*p_p_access_network_info_header.get_opt_value());
  // accessType
  std::string value(static_cast<const char*>(p_access_network_info_header.accessType()));
  // Generic parameters
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& p_access_network_info_param = p_access_network_info_header.genericParams(); // TODO Create a methid to fill an std::string with SemicolonParam__List
  if (p_access_network_info_param.is_present()) {
    const LibSip__Common::SemicolonParam__List& l = static_cast<const LibSip__Common::SemicolonParam__List&>(*p_access_network_info_param.get_opt_value());
    int i = 0;
    do {
      value += ";";
      const LibSip__Common::GenericParam& g = l[i];
      value+= static_cast<const char*>(g.id());
      if (g.paramValue().is_present()) {
        value += "=";
        const LibSip__Common::GenValue& v = static_cast<const LibSip__Common::GenValue&>(*g.paramValue().get_opt_value());
        if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) {
          value += static_cast<const char*>(v.tokenOrHost());
        } else {
          value += static_cast<const char*>(v.quotedString());
        }
      }
      i += 1;
    } while (i < l.lengthof());
  }
  ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"P-Access-Network-Info", value.c_str());
  
  return 0;
} // End of method encode_p_access_network_info_header

int sip_codec_headers::encode_privacy_header(const OPTIONAL<LibSip__SIPTypesAndValues::Privacy>& p_privacy_header, osip_message_t** p_sip_message) {
  loggers::get_instance().log_msg(">>> sip_codec_headers::encode_privacy_header", p_privacy_header);

  const LibSip__SIPTypesAndValues::Privacy& privacy_header = static_cast<const LibSip__SIPTypesAndValues::Privacy&>(*p_privacy_header.get_opt_value());
  
  const LibSip__SIPTypesAndValues::PrivacyValue__List& m = privacy_header.privValueList();
  if (m.lengthof() == 0) {
    return 0;
  }
  
  std::string str(static_cast<const char*>(m[0]));
  if (m.lengthof() > 1) {
    int i = 1;
    do {
      str += ",";
      str += static_cast<const char*>(m[i++]);
    } while (i < m.lengthof());
  }
  ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"Privacy", str.c_str());
  
  loggers::get_instance().log("<<< sip_codec_headers::encode_privacy_header");
  return 0;
} // End of method encode_privacy_header

int sip_codec_headers::encode_r_seq_header(const OPTIONAL<LibSip__SIPTypesAndValues::RSeq>& p_r_seq, osip_message_t** p_sip_message)
{
  loggers::get_instance().log(">>> sip_codec_headers::encode_r_seq_header", p_r_seq);

  const LibSip__SIPTypesAndValues::RSeq& r_seq = static_cast<const LibSip__SIPTypesAndValues::RSeq&>(*p_r_seq.get_opt_value());
  ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"RSeq", static_cast<const char*>(std::to_string(r_seq.responseNum()).c_str()));
  
  return 0;
} // End of method encode_r_seq_header

int sip_codec_headers::encode_session_expires_header(const OPTIONAL<LibSip__SIPTypesAndValues::SessionExpires>& p_session_expires, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_session_expires_header");

@@ -1049,41 +1160,26 @@ int sip_codec_headers::encode_supported_header(const OPTIONAL<LibSip__SIPTypesAn
  if (!tags.is_present()) {
    return 0;
  }
  if (encode_option_tag_list(static_cast<const LibSip__SIPTypesAndValues::OptionTag__List&>(*tags.get_opt_value()), p_sip_message) == -1) {
  if (encode_option_tag_list(static_cast<const LibSip__SIPTypesAndValues::OptionTag__List&>(*tags.get_opt_value()), "Supported", p_sip_message) == -1) {
    return -1;
  }
  
  return 0;
}

int sip_codec_headers::encode_p_access_network_info_header(const OPTIONAL<LibSip__SIPTypesAndValues::PAccessNetworkInfo>& p_access_network_info, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_p_access_network_info_header");
int sip_codec_headers::encode_user_agent_header(const OPTIONAL<LibSip__SIPTypesAndValues::UserAgent>& p_user_agent, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_user_agent_header");

  if (!p_access_network_info.is_present()) {
  if (!p_user_agent.is_present()) {
    return 0;
  }
  
  // pAccessNetworkInfo := { fieldName := P_ACCESS_NETWORK_INFO_E (65), accessType := "IEEE-802.11a", genericParams := { { id := "extension-access-info", paramValue := { tokenOrHost := "192.1.1.20" } } } }
  // Encode AccessType
  // TODO Try to get the P-Access-Network-Info header
  
  /*osip_header_t* p_access_network_info_;
  ::osip_header_init(&p_access_network_info_);
  osip_header_set_name (p_access_network_info_, "P-Access-Network-Info";
  // Encode generic params
  const LibSip__SIPTypesAndValues::PAccessNetworkInfo& pa = static_cast<const LibSip__SIPTypesAndValues::PAccessNetworkInfo&>(*p_access_network_info.get_opt_value());
  if (pa.genericParams().is_present()) {
    osip__t* params;
    ::osip_list_init(&params);
    encode_semi_colon_params(static_cast<const LibSip__Common::SemicolonParam__List>(pa.genericParams()), &params);
    
    osip_header_set_value(p_access_network_info_, value);
    //p_access_network_info_->hvalue = 
  const LibSip__SIPTypesAndValues::UserAgent& user_agent = static_cast<const LibSip__SIPTypesAndValues::UserAgent&>(*p_user_agent.get_opt_value());
  const LibSip__SIPTypesAndValues::ServerVal__List& s = user_agent.userAgentBody();
  if (encode_server_val_list(s, "User-Agent", p_sip_message) == -1) {
    return -1;
  }
  
  osip_message_set_header(p_sip_message, "P-Access-Network-Info", p_access_network_info_);
  ::osip_header_free(p_access_network_info_);*/
  
  return 0;
}

@@ -1185,6 +1281,8 @@ int sip_codec_headers::encode_semi_colon_params(const LibSip__Common::SemicolonP
          loggers::get_instance().log_msg("sip_codec_headers::encode_semi_colon_params: quotedString: ", v.quotedString());
          ::osip_generic_param_add(p_sip_list, (char*)static_cast<const char*>(param.id()), (char*)static_cast<const char*>(v.quotedString()));
        }
      } else {
        ::osip_generic_param_add(p_sip_list, (char*)::strdup(static_cast<const char*>(param.id())), (char*)::strdup(""));
      }
    } // End of 'for' statement
  } else {
@@ -1288,7 +1386,7 @@ void sip_codec_headers::decode_ampersand_params(const osip_list_t& p_sip_list, O
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_ampersand_params: ", p_list);
} // End of method decode_ampersand_params

int sip_codec_headers::encode_option_tag_list(const LibSip__SIPTypesAndValues::OptionTag__List& p_options_tags, osip_message_t** p_sip_message) {
int sip_codec_headers::encode_option_tag_list(const LibSip__SIPTypesAndValues::OptionTag__List& p_options_tags, const std::string& p_field_name, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_option_tag_list");

  if (p_options_tags.size_of() != 0) {
@@ -1296,9 +1394,9 @@ int sip_codec_headers::encode_option_tag_list(const LibSip__SIPTypesAndValues::O
    for (int i = 1; i < p_options_tags.size_of() - 1; i++) {
      str += "," + std::string(static_cast<const char*>(*static_cast<const CHARSTRING*>(p_options_tags.get_at(i))));
    } // End of 'for' statement
    osip_message_set_supported(*p_sip_message, str.c_str());
    ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), str.c_str());
  } else {
    osip_message_set_supported(*p_sip_message, "");
    ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), "");
  }
  return 0;
}
@@ -1316,11 +1414,11 @@ void sip_codec_headers::decode_option_tag_list(const char* p_list, OPTIONAL<LibS
    } else {
      int idx = 0;
      while(i != std::string::npos) {
        l[idx++] = CHARSTRING(str.substr(0, i - 1).c_str());
        l[idx++] = CHARSTRING(str.substr(0, i).c_str());
        str = str.substr(i + 1);
        loggers::get_instance().log("sip_codec_headers::decode_option_tag_list: New str: %s", str.c_str());
        i = str.find(",");
        loggers::get_instance().log("sip_codec_headers::decode_option_tag_list: New i: %d /%d", i, std::string::npos);
        loggers::get_instance().log("sip_codec_headers::decode_option_tag_list: New i: %d", i);
      } // End of 'while' statement
      l[idx] = CHARSTRING(str.c_str());
    }
@@ -1332,6 +1430,48 @@ void sip_codec_headers::decode_option_tag_list(const char* p_list, OPTIONAL<LibS
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_option_tag_list: ", p_options_tags);
} // End of method decode_option_tag_list

int sip_codec_headers::encode_server_val_list(const LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals, const std::string& p_field_name, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_server_val_list");

  if (p_server_vals.size_of() != 0) {
    std::string str(static_cast<const char*>(*static_cast<const CHARSTRING*>(p_server_vals.get_at(0))));
    for (int i = 1; i < p_server_vals.size_of() - 1; i++) {
      str += "," + std::string(static_cast<const char*>(*static_cast<const CHARSTRING*>(p_server_vals.get_at(i))));
    } // End of 'for' statement
    ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), str.c_str());
  } else {
    ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), "");
  }
  return 0;
}

void sip_codec_headers::decode_server_val_list(const char* p_list, LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals)
{
  loggers::get_instance().log(">>> sip_codec_headers::decode_server_val_list: %s", p_list);
  
  if (p_list != nullptr) {
    std::string str(p_list);
    std::size_t i = str.find(","); // See RFC 3261 - Page 231 / LibSip__SIPTypesAndValues::ServerVal__List
    if (i == std::string::npos) { // Only on item
      p_server_vals[0] = CHARSTRING(p_list);
    } else {
      int idx = 0;
      while(i != std::string::npos) {
        p_server_vals[idx++] = CHARSTRING(str.substr(0, i).c_str());
        str = str.substr(i + 1);
        loggers::get_instance().log("sip_codec_headers::decode_server_val_list: New str: %s", str.c_str());
        i = str.find(" ");
        loggers::get_instance().log("sip_codec_headers::decode_server_val_list: New i: %d", i);
      } // End of 'while' statement
      p_server_vals[idx] = CHARSTRING(str.c_str());
    }
  } else {
    p_server_vals[0] = CHARSTRING("");
  }

  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_server_val_list: ", p_server_vals);
} // End of method decode_server_val_list

void sip_codec_headers::decode_host_port(const char* p_host, const char* p_port, LibSip__SIPTypesAndValues::HostPort& p_host_port) {
  loggers::get_instance().log(">>> sip_codec_headers::decode_host_port");
  
@@ -1977,6 +2117,62 @@ void sip_codec_headers::decode_min_se_header(const osip_message_t* p_sip_message
  }
} // End of method decode_min_se_header

void sip_codec_headers::decode_p_access_network_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::PAccessNetworkInfo& p_p_access_network_info_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_p_access_network_info_header");

  // Sanity checks
  osip_header_t *dest = nullptr;
  osip_message_header_get_byname((osip_message_t*)p_sip_message,(const char *)"p-access-network-info", 0, &dest); // TODO Create osip_message_[g|s]et_p_access_network_info
  if (dest == nullptr) {
    return;
  }
  
  // FieldName
  p_p_access_network_info_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("P_ACCESS_NETWORK_INFO_E"));
  std::string fisrt_parameter;
  LibSip__Common::SemicolonParam__List others_params;
  decode_semi_colon_params(dest->hvalue, fisrt_parameter, others_params);
  p_p_access_network_info_header.accessType() = CHARSTRING(fisrt_parameter.c_str());
  if (others_params.is_bound()) {
    p_p_access_network_info_header.genericParams() = OPTIONAL<LibSip__Common::SemicolonParam__List>(others_params);
  } else {
    p_p_access_network_info_header.genericParams().set_to_omit();
  }
} // End of method decode_p_access_network_info_header

void sip_codec_headers::decode_privacy_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Privacy& p_privacy_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_privacy_header");

  // Sanity checks
  osip_header_t *dest = nullptr;
  osip_message_header_get_byname((osip_message_t*)p_sip_message,(const char *)"privacy", 0, &dest); // TODO Create osip_message_[g|s]et_privacy
  if (dest == nullptr) {
    return;
  }
  
  // FieldName
  p_privacy_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("PRIVACY_E"));
  // Privacy list
  loggers::get_instance().log("sip_codec_headers::decode_allow_header: value: %s", dest->hvalue);
  if ((dest->hvalue == nullptr) || (strlen(dest->hvalue) == 0)) {
    p_privacy_header.privValueList().set_to_omit();
  } else {
    LibSip__SIPTypesAndValues::PrivacyValue__List m;
    std::string str(dest->hvalue);
    std::vector<std::string> output = converter::get_instance().split(str, ",");
    unsigned int i = 0;
    while (i < output.size()) {
      m[i] = CHARSTRING(output[i].c_str());
      i += 1;
    } // End of 'while' statement
    p_privacy_header.privValueList() = OPTIONAL<LibSip__SIPTypesAndValues::PrivacyValue__List>(m);
  }

  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_privacy_header: ", p_privacy_header);
}

void sip_codec_headers::decode_route_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Route& p_route_header) {
  loggers::get_instance().log("sip_codec_headers::decode_route_header");
  // Sanity check
@@ -2017,6 +2213,22 @@ void sip_codec_headers::decode_route_header(const osip_message_t* p_sip_message,
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_route_header: ", p_route_header);
} // End of method decode_route_header

void sip_codec_headers::decode_r_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::RSeq& p_r_seq_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_r_seq_header");

  // Sanity checks
  osip_header_t *dest = nullptr;
  osip_message_header_get_byname((osip_message_t*)p_sip_message,(const char *)"rseq", 0, &dest); // TODO Create osip_message_[g|s]et_rseq
  if (dest == nullptr) {
    return;
  }
  
  // FieldName
  p_r_seq_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("RSEQ_E"));
  p_r_seq_header.responseNum() = INTEGER(std::stoi(dest->hvalue));
}

void sip_codec_headers::decode_session_expires_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::SessionExpires& p_session_expires_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_session_expires_header");
@@ -2079,6 +2291,25 @@ void sip_codec_headers::decode_supported_header(const osip_message_t* p_sip_mess
  decode_option_tag_list(dest->hvalue, l);
} // End of method decode_supported_header

void sip_codec_headers::decode_user_agent_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::UserAgent& p_user_agent_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_user_agent_header");

  // Sanity checks
  osip_header_t *dest = nullptr;
  osip_message_get_user_agent(p_sip_message, 0, &dest);
  if (dest == nullptr) {
    return;
  }
  
  // FieldName
  p_user_agent_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("USER_AGENT_E"));
  // UserAgent body
  loggers::get_instance().log("sip_codec_headers::decode_user_agent_header: got it: %s:%s", dest->hname, dest->hvalue);
  LibSip__SIPTypesAndValues::ServerVal__List& l = p_user_agent_header.userAgentBody();
  decode_server_val_list(dest->hvalue, l);
} // End of method decode_user_agent_header

void sip_codec_headers::decode_to_header(const osip_to_t* p_sip_to, LibSip__SIPTypesAndValues::To& p_to_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_to_header");
@@ -2116,7 +2347,7 @@ void sip_codec_headers::decode_to_header(const osip_to_t* p_sip_to, LibSip__SIPT

void sip_codec_headers::decode_via_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Via& p_via_header)
{
  loggers::get_instance().log(">>> sip_codec_headers::decode_via_header: %p", p_sip_message->vias);
  loggers::get_instance().log(">>> sip_codec_headers::decode_via_header");

  // Sanity checks
  osip_via_t *sip_via = nullptr;
+19 −7

File changed.

Preview size limit exceeded, changes collapsed.

+79 −6

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -58,8 +58,8 @@ system.httpPort.params := "HTTP(codecs=held:held_codec;html:html_codec;json:json
#TestCodec_Invite.tc_invite_request_1
#TestCodec_Invite.tc_invite_request_2
TestCodec_Invite.tc_invite_request_3
TestCodec_Responses.tc_100_trying_1
#TestCodec_Responses.tc_100_trying_1
#TestCodec_Responses.tc_180_ringing_1
#TestCodec_HttpRequest.tc_http_get_1
#TestCodec_HttpResponse.tc_http_200_ok_1
#TestCodec_HttpPort.tc_http_map_1
+47 −13

File changed.

Preview size limit exceeded, changes collapsed.

Loading