Commit 2f4ca8d5 authored by Yann Garcia's avatar Yann Garcia
Browse files

Add SIP response support

parent fb1a1209
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -86,5 +86,17 @@ namespace LibSip__Interface {

  } // End of user_stop method

  void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::INVITE__Request& send_par, const Address4SIP *destination_address)
  {
    loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par);
    loggers::get_instance().log(">>> SipPort::outgoing_send: %s", destination_address);

    float duration;
    loggers::get_instance().set_start_time(_time_key);
    params params;
    static_cast<sip_layer*>(_layer)->sendMsg(send_par, params);
    loggers::get_instance().set_stop_time(_time_key, duration);
  } // End of outgoing_send
  
}
+1 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ namespace LibSip__Interface {
  protected:
    virtual void outgoing_send(const LibSip__SIPTypesAndValues::Request& send_par, const Address4SIP *destination_address) { };
    virtual void outgoing_send(const LibSip__SIPTypesAndValues::REGISTER__Request& send_par, const Address4SIP *destination_address) { };
    virtual void outgoing_send(const LibSip__SIPTypesAndValues::INVITE__Request& send_par, const Address4SIP *destination_address) { };
    void outgoing_send(const LibSip__SIPTypesAndValues::INVITE__Request& send_par, const Address4SIP *destination_address);
    virtual void outgoing_send(const LibSip__SIPTypesAndValues::OPTIONS__Request& send_par, const Address4SIP *destination_address) { };
    virtual void outgoing_send(const LibSip__SIPTypesAndValues::BYE__Request& send_par, const Address4SIP *destination_address) { };
    virtual void outgoing_send(const LibSip__SIPTypesAndValues::CANCEL__Request& send_par, const Address4SIP *destination_address) { };
+112 −50
Original line number Diff line number Diff line
@@ -50,8 +50,6 @@ int sip_codec_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValue
    return -1;
  }

  TRACE_INITIALIZE(TRACE_LEVEL7, NULL);
  
  osip_message_t* sip_message;
  ::parser_init();
  int result = ::osip_message_init(&sip_message);
@@ -70,7 +68,7 @@ int sip_codec_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValue
  decode_request_line(sip_message, msg);

  // Fill Headers
  decode_headers(sip_message, msg);
  decode_request_headers(sip_message, msg);

  // Fill MessageBody
  decode_message_body(sip_message, msg);
@@ -173,7 +171,10 @@ int sip_codec_request::encode_request_headers(const LibSip__SIPTypesAndValues::M
  ::osip_via_free(via_header);
  osip_free(hvalue);

  // Decode Optional fields
  // Encode Optional fields
  loggers::get_instance().log("sip_codec_request::encode_request_headers: Encode Optional fields");
  // Authorization
  if (p_msg_header.authorization().is_present()) {
    osip_authorization_t* authorization_header = nullptr;
    if (encode_authorization_header(p_msg_header.authorization(), &authorization_header) == -1) {
      loggers::get_instance().warning("sip_codec_request::encode_request_headers: Faile to encode Authorization header");
@@ -185,7 +186,10 @@ int sip_codec_request::encode_request_headers(const LibSip__SIPTypesAndValues::M
    loggers::get_instance().log("sip_codec_request::encode_request_headers: SIP Authorization: %p - %d", p_sip_message->authorizations, result);
    ::osip_authorization_free(authorization_header);
    osip_free(hvalue);
  }
  
  // CallId
  if (p_msg_header.callId().is_present()) {
    osip_call_id_t* call_id_header;
    if (encode_call_id_header(p_msg_header.callId(), &call_id_header) == -1) {
      loggers::get_instance().warning("sip_codec_request::encode_request_headers: Faile to encode Call_Id header");
@@ -193,11 +197,14 @@ int sip_codec_request::encode_request_headers(const LibSip__SIPTypesAndValues::M
    }
    ::osip_call_id_to_str(call_id_header, &hvalue);
    loggers::get_instance().log("sip_codec_request::encode_request_headers: Call_Id:%s", hvalue);
  result = ::osip_message_set_call_id(p_sip_message, hvalue);
    int result = ::osip_message_set_call_id(p_sip_message, hvalue);
    loggers::get_instance().log("sip_codec_request::encode_request_headers: SIP Call_Id: %p - %d", p_sip_message->call_id, result);
    ::osip_call_id_free(call_id_header);
    osip_free(hvalue);
  }
  
  // ContactHeader
  if (p_msg_header.contact().is_present()) {
    osip_contact_t* contact_header;
    if (encode_contact_header(p_msg_header.contact(), &contact_header) == -1) {
      loggers::get_instance().warning("sip_codec_request::encode_request_headers: Faile to encode Contact header");
@@ -205,11 +212,13 @@ int sip_codec_request::encode_request_headers(const LibSip__SIPTypesAndValues::M
    }
    ::osip_contact_to_str(contact_header, &hvalue);
    loggers::get_instance().log("sip_codec_request::encode_request_headers: Contact: %s", hvalue);
  result = ::osip_message_set_contact(p_sip_message, hvalue);
    int result = ::osip_message_set_contact(p_sip_message, hvalue);
    loggers::get_instance().log("sip_codec_request::encode_request_headers: SIP Contact: %p - %d", p_sip_message->contacts, result);
    ::osip_contact_free(contact_header);
    osip_free(hvalue);
  }
  
  // CSeq
  osip_cseq_t* cseq_header = nullptr;
  if (encode_c_seq_header(p_msg_header.cSeq(), &cseq_header) == -1) {
    loggers::get_instance().warning("sip_codec_request::encode_request_headers: Faile to encode CSeq header");
@@ -222,18 +231,34 @@ int sip_codec_request::encode_request_headers(const LibSip__SIPTypesAndValues::M
  osip_free(hvalue);

  // MaxForwards
  if (p_msg_header.maxForwards().is_present()) {
    if (encode_max_forwards_header(p_msg_header.maxForwards(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_request::encode_request_headers: Faile to encode MaxForwards header");
      return -1;
    }
  }
  
  // Supported
  if (p_msg_header.supported().is_present()) {
    if (encode_supported_header(p_msg_header.supported(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_request::encode_request_headers: Faile to encode Supported header");
      return -1;
    }
  }
  
  // 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_request::encode_request_headers: Faile to encode PAccessNetworkInfo header");
      return -1;
    }
  }
  // TODO continue

  int i = 0;
  osip_header_t* h_;
  while (::osip_message_get_header(p_sip_message, i++, &h_) == 0) {
    loggers::get_instance().warning("sip_codec_request::encode_request_headers (1): '%s'/'%s' was not processed", h_->hname, h_->hvalue);
  } // End of 'while' statement
  
  return 0;
} // End of method encode_request_headers
@@ -611,6 +636,37 @@ int sip_codec_request::encode_supported_header(const OPTIONAL<LibSip__SIPTypesA
  return 0;
}

int sip_codec_request::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_request::encode_p_access_network_info_header");

  if (!p_access_network_info.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 = 
  }
  
  osip_message_set_header(p_sip_message, "P-Access-Network-Info", p_access_network_info_);
  ::osip_header_free(p_access_network_info_);*/
  
  return 0;
}

int sip_codec_request::encode_to_header(const LibSip__SIPTypesAndValues::To& p_to, osip_to_t** p_to_header) {
  loggers::get_instance().log(">>> sip_codec_request::encode_to_header");
  
@@ -701,9 +757,9 @@ int sip_codec_request::encode_via_header(const LibSip__SIPTypesAndValues::Via& p


 
void sip_codec_request::decode_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request)
void sip_codec_request::decode_request_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request)
{
  loggers::get_instance().log(">>> sip_codec_request::decode_headers");
  loggers::get_instance().log(">>> sip_codec_request::decode_request_headers");
  
  LibSip__SIPTypesAndValues::MessageHeader headers;
  // Decode mandatory fields
@@ -868,7 +924,13 @@ void sip_codec_request::decode_headers(const osip_message_t* p_sip_message, LibS
  headers.minExpires().set_to_omit();
  headers.minSE().set_to_omit();
  headers.organization().set_to_omit();


  // TODO
  headers.pAccessNetworkInfo().set_to_omit();


  
  headers.pAssertedID().set_to_omit();
  headers.pAssertedService().set_to_omit();
  headers.pAssociatedURI().set_to_omit();
@@ -939,11 +1001,11 @@ void sip_codec_request::decode_headers(const osip_message_t* p_sip_message, LibS
  int i = 0;
  osip_header_t* h_;
  while (::osip_message_get_header(p_sip_message, i++, &h_) == 0) {
    loggers::get_instance().warning("sip_codec_request::decode_header (1): '%s'/'%s' was not processed", h_->hname, h_->hvalue);
    loggers::get_instance().warning("sip_codec_request::decode_request_headers: '%s'/'%s' was not processed", h_->hname, h_->hvalue);
  } // End of 'while' statement
  
  loggers::get_instance().log_msg("<<< sip_codec_request::decode_headers: ", p_request);
} // End of method decode_headers
  loggers::get_instance().log_msg("<<< sip_codec_request::decode_request_headers: ", p_request);
} // End of method decode_request_headers

void sip_codec_request::decode_message_body(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request)
{
+6 −4
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ namespace LibSip__SIPTypesAndValues {
  class ContentType;
  class CSeq;
  class PreGenRecordOf;
  class PAccessNetworkInfo;
  //  class OptionTag__List;
}

@@ -65,6 +66,7 @@ private: //! \todo Move this section into a sip_codec_helper class, need to deco
  int encode_supported_header(const OPTIONAL<LibSip__SIPTypesAndValues::Supported>& p_supported, osip_message_t** p_sip_message);
  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_p_access_network_info_header(const OPTIONAL<LibSip__SIPTypesAndValues::PAccessNetworkInfo>& p_access_network_info, osip_message_t** p_sip_message);
  
  int encode_sip_url(const LibSip__SIPTypesAndValues::SipUrl& p_sip_uri, osip_uri_t** p_uri);

@@ -73,7 +75,7 @@ private: //! \todo Move this section into a sip_codec_helper class, need to deco
  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);
  void decode_request_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);
+1823 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading