Commit 41ca61bb authored by YannGarcia's avatar YannGarcia
Browse files

Add codec for SIP headers Event & Expires

parent 32dcd903
Loading
Loading
Loading
Loading
+147 −0
Original line number Diff line number Diff line
@@ -181,6 +181,22 @@ int sip_codec_headers::encode_headers(const LibSip__SIPTypesAndValues::MessageHe
  ::osip_cseq_free(cseq_header);
  osip_free(hvalue);

  // Event
  if (p_msg_header.event().is_present()) {
    if (encode_event_header(p_msg_header.event(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Event header");
      return -1;
    }
  }

  // Expires
  if (p_msg_header.expires().is_present()) {
    if (encode_expires_header(p_msg_header.expires(), &p_sip_message) == -1) {
      loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Expires header");
      return -1;
    }
  }

  // Geolocation
  if (p_msg_header.geolocation().is_present()) {
    if (encode_geolocation_header(p_msg_header.geolocation(), &p_sip_message) == -1) {
@@ -471,6 +487,22 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  p_headers.infoPackage().set_to_omit();
  p_headers.inReplyTo().set_to_omit();

  LibSip__SIPTypesAndValues::Event event_header;
  decode_event_header(p_sip_message, event_header);
  if (event_header.is_value()) {
    p_headers.event() = event_header;
  } else {
    p_headers.event().set_to_omit();
  }

  LibSip__SIPTypesAndValues::Expires expires_header;
  decode_expires_header(p_sip_message, expires_header);
  if (expires_header.is_value()) {
    p_headers.expires() = expires_header;
  } else {
    p_headers.expires().set_to_omit();
  }

  LibSip__SIPTypesAndValues::MaxForwards max_forwards_header;
  decode_max_forwards_header(p_sip_message, max_forwards_header);
  if (max_forwards_header.is_value()) {
@@ -1056,6 +1088,62 @@ int sip_codec_headers::encode_c_seq_header(const LibSip__SIPTypesAndValues::CSeq
  return 0;
} // End of method encode_c_seq_header

int sip_codec_headers::encode_event_header(const OPTIONAL<LibSip__SIPTypesAndValues::Event>& p_event, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_event_header");

  if (!p_event.is_present()) {
    return 0;
  }
  const LibSip__SIPTypesAndValues::Event& event = static_cast<const LibSip__SIPTypesAndValues::Event&>(*p_event.get_opt_value());

  // eventType
  std::string value(static_cast<const char*>(event.eventType()));
  loggers::get_instance().log("sip_codec_headers::encode_event_header: eventType: %s", value.c_str());

  // eventParam
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& event_param = event.eventParams(); // TODO Create a method to fill an std::string with SemicolonParam__List
  if (event_param.is_present()) {
    const LibSip__Common::SemicolonParam__List& l = static_cast<const LibSip__Common::SemicolonParam__List&>(*event_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());
  }
  loggers::get_instance().log("sip_codec_headers::encode_event_header: %s", value.c_str());
  ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Event", value.c_str());

  return 0;
}

int sip_codec_headers::encode_expires_header(const OPTIONAL<LibSip__SIPTypesAndValues::Expires>& p_expires, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_expires_header");

  if (!p_expires.is_present()) {
    return 0;
  }
  const LibSip__SIPTypesAndValues::Expires& expires = static_cast<const LibSip__SIPTypesAndValues::Expires&>(*p_expires.get_opt_value());

  // deltaSec
  std::string value(static_cast<const char*>(expires.deltaSec()));

  loggers::get_instance().log("sip_codec_headers::encode_expires_header: %s", value.c_str());
  ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Expires", value.c_str());

  return 0;
}

int sip_codec_headers::encode_from_header(const LibSip__SIPTypesAndValues::From& p_from, osip_from_t** p_from_header) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_from_header");
  
@@ -2448,6 +2536,65 @@ void sip_codec_headers::decode_contact_header(const osip_message_t* p_sip_messag
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_contact_header: ", p_contact_header);
} // End of method decode_contact_header

void sip_codec_headers::decode_event_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Event& p_event_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_event_header");

  // Sanity checks
  osip_header_t *dest = nullptr;
  ::osip_message_header_get_byname(p_sip_message, (const char *)"Event", 0, &dest); // TODO Create osip_message_[g|s]et_event
  if (dest == nullptr) {
    loggers::get_instance().warning("sip_codec_headers::decode_event_header: Not found");
    return;
  }
  loggers::get_instance().log("sip_codec_headers::decode_event_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue);

  // FieldName
  p_event_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("EVENT_E"));
  // EventType
  std::string str(dest->hvalue);
  size_t p1 = str.find("<");
  size_t p2 = str.find(">");
  size_t p3 = str.find(";");
  std::string u = str.substr(p1 + 1, p2 - p1 - 1);
  loggers::get_instance().log("sip_codec_headers::decode_event_header: u='%s'\n", u.c_str());
  p_event_header.eventType() = CHARSTRING(u.c_str());
  // eventParam
  if (p3 != std::string::npos) {
    std::string p = str.substr(p3 + 1);
    loggers::get_instance().log("sip_codec_headers::decode_event_header: p='%s'\n", p.c_str());
    LibSip__Common::SemicolonParam__List params;
    decode_semi_colon_params(p.c_str(), params);
    if (params.is_bound()) {
      p_event_header.eventParams() = OPTIONAL<LibSip__Common::SemicolonParam__List>(params);
    } else {
      p_event_header.eventParams().set_to_omit();
    }
  } else {
    p_event_header.eventParams().set_to_omit();
  }
} // End of method decode_event_header

void sip_codec_headers::decode_expires_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Expires& p_expires_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_expires_header");

  // Sanity checks
  osip_header_t *dest = nullptr;
  ::osip_message_header_get_byname(p_sip_message, (const char *)"Expires", 0, &dest); // TODO Create osip_message_[g|s]et_expires
  if (dest == nullptr) {
    loggers::get_instance().warning("sip_codec_headers::decode_expires_header: Not found");
    return;
  }
  loggers::get_instance().log("sip_codec_headers::decode_expires_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue);

  // FieldName
  p_expires_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("EXPIRES_E"));
  // DeltaSec
  std::string str(dest->hvalue);
  p_expires_header.deltaSec() = CHARSTRING(str.c_str());
} // End of method decode_expires_header

void sip_codec_headers::decode_from_header(const osip_from_t* p_sip_from, LibSip__SIPTypesAndValues::From& p_from_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_from_header");
+6 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ namespace LibSip__SIPTypesAndValues {
  class ContentLength;
  class ContentType;
  class CSeq;
  class Event;
  class Expires;
  class From;
  class Geolocation;
  class GeolocationRouting;
@@ -52,6 +54,8 @@ public:
  virtual int encode_content_length_header(const LibSip__SIPTypesAndValues::ContentLength& p_contact, osip_content_length_t** p_content_length_header);
  virtual int encode_content_type_header(const LibSip__SIPTypesAndValues::ContentType& p_contact, osip_content_type_t** p_content_type_header);
  virtual int encode_c_seq_header(const LibSip__SIPTypesAndValues::CSeq& p_c_seq, osip_cseq_t** p_c_seq_header);
  virtual int encode_event_header(const OPTIONAL<LibSip__SIPTypesAndValues::Event>& p_event, osip_message_t** p_sip_message);
  virtual int encode_expires_header(const OPTIONAL<LibSip__SIPTypesAndValues::Expires>& p_expires, osip_message_t** p_sip_message);
  virtual int encode_from_header(const LibSip__SIPTypesAndValues::From& p_from, osip_from_t** p_from_header);
  virtual int encode_geolocation_header(const OPTIONAL<LibSip__SIPTypesAndValues::Geolocation>& p_geolocation, osip_message_t** p_sip_message);
  virtual int encode_geolocation_routing_header(const OPTIONAL<LibSip__SIPTypesAndValues::GeolocationRouting>& p_geolocation, osip_message_t** p_sip_message);
@@ -87,6 +91,8 @@ public:
  virtual void decode_content_type_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentType& p_content_type_header);
  virtual void decode_c_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CSeq& p_c_seq_header);
  virtual void decode_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Contact& p_contact_header);
  virtual void decode_event_header(const osip_message_t* p_sip_event, LibSip__SIPTypesAndValues::Event& p_event_header);
  virtual void decode_expires_header(const osip_message_t* p_sip_expires, LibSip__SIPTypesAndValues::Expires& p_expires_header);
  virtual void decode_from_header(const osip_from_t* p_sip_from, LibSip__SIPTypesAndValues::From& p_from_header);
  virtual void decode_geolocation_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Geolocation& p_geolocation_header);
  virtual void decode_geolocation_routing_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::GeolocationRouting& p_geolocation_routing_header);
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ module AtsLIS_Pics {
  /**
   * @desc HTTP post URI for LIS protocol
   */
  modulepar charstring PICS_LIS_URI := "/";
  modulepar charstring PICS_PSAP_LIS_URI := "/";

  
  /**
+20 −0
Original line number Diff line number Diff line
@@ -48,6 +48,26 @@ module AtsPSAP_Pics {
   */
  modulepar boolean PICS_PSAP_S_HTTP_DEQUEUE_REGISTRATION := true;
  
  /**
   * @desc Does the IUT support HELD protocol
   */
  modulepar boolean PICS_PSAP_S_HELD := true;
  
  /**
   * @desc Does the IUT support LoST protocol
   */
  modulepar boolean PICS_PSAP_S_LoST := true;
  
  /**
   * @desc HTTP post URI for LIS protocol
   */
  modulepar charstring PICS_PSAP_LIS_URI := "/";

  /**
   * @desc HTTP post URI for LIS protocol
   */
  modulepar charstring PICS_PSAP_LoST_URI := "/";

  /**
   * @desc URI to ESRP Dequeue Registration web service
   */
+111 −23
Original line number Diff line number Diff line
@@ -886,23 +886,14 @@ module AtsPSAP_TestCases {
                                                                                                m_presence(
                                                                                                           PX_PRESENCE_USER,
                                                                                                           { //tuple_list
              	                                                                                            {      
                                                                                                              m_tuple(      
                                                                                                                      "0ehvxv4kxwrzzbp",
                                                                                                                      {
                                                                                                                        omit,
                                                                                                                        m_geopriv({ point := m_point(PX_PRESENCE_USER_POS, PX_SRS_NAME) }, m_LocPolicyType),	                
                                                                                                                        { }
                                                                                                              },
                                                                                                              {},
                                                                                                              omit,
                                                                                                              {},
                                                                                                              omit
                                                                                                                      }
                                                                                
                                                                                                            //  m_tuple(
                                                                                                            //          "fclnzj22sbtoxpj",
                                                                                                            //          { basic := omit, elem_list := { v_location_info } }
                                                                                                            //          )
                                                                                                                      )
          		                                                                                              }
                                                                                                           )
                                                                                                )
@@ -2463,7 +2454,7 @@ module AtsPSAP_TestCases {
                                                                                            ))))) -> value v_response {
            tc_ac.stop;

            log("*** " & testcasename() & ": INFO: IUT successfully registers to ESRP dequeue successfully ***");
            log("*** " & testcasename() & ": INFO: IUT successfully registers to ESRP dequeue ***");
            f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_success);
          }
          [] tc_ac.timeout {
@@ -2567,7 +2558,7 @@ module AtsPSAP_TestCases {
                                                                                              ))))) -> value v_response {
              tc_ac.stop;
  
              log("*** " & testcasename() & ": INFO: IUT successfully registers to ESRP dequeue successfully ***");
              log("*** " & testcasename() & ": INFO: IUT successfully registers to ESRP dequeue ***");
              f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_success);
            }
            [] tc_ac.timeout {
@@ -2728,7 +2719,7 @@ module AtsPSAP_TestCases {
                                                                                            ))))) -> value v_response {
            tc_ac.stop;

            log("*** " & testcasename() & ": INFO: IUT successfully de-registers from ESRP dequeue successfully ***");
            log("*** " & testcasename() & ": INFO: IUT successfully de-registers from ESRP dequeue ***");
            f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
          }
          [] tc_ac.timeout {
@@ -2745,10 +2736,107 @@ module AtsPSAP_TestCases {
  
  group HELD {
    
     testcase TC_PSAP_HELD_BV_01() runs on HttpComponent system TestAdapter {
      // Local variables
      var HttpMessage v_request;

      // Test control
      if ((not PICS_PSAP_S_HELD)) {
        log("*** " & testcasename() & ": PICS_PSAP_S_HELD required for executing the TC ***");
        setverdict(inconc);
          stop;
      }
        
      // Test component configuration
      f_cf_01_http_up();
        
      // Test adapter configuration
      
      // Preamble
      f_checkUserInfo("Trigger HELD request", 30.0);
      f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);

      // Test Body
      tc_ac.start;
      alt {
        [] httpPort.receive(
                            mw_http_request(
                                            mw_http_request_post(
                                                                 PICS_PSAP_LIS_URI,
                                                                 ?,
                                                                 mw_http_message_body_xml(
                                                                                          mw_body_xml_location_request
                                                                                          )))) -> value v_request {
          var HttpMessage v_response;

          tc_ac.stop;

          // TODO Send response
          
          
          log("*** " & testcasename() & ": INFO: IUT successfully sends LIS request ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
        }
        [] tc_ac.timeout {
          log("*** " & testcasename() & ": INCONC: Expected message not received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);          
        }
      }
    }
    
 } // End of group HELD
  
  group LoST {
    
     testcase TC_PSAP_LoST_BV_01() runs on HttpComponent system TestAdapter {
      // Local variables
      var HttpMessage v_request;

      // Test control
      if ((not PICS_PSAP_S_LoST)) {
        log("*** " & testcasename() & ": PICS_PSAP_S_LoST required for executing the TC ***");
        setverdict(inconc);
          stop;
      }
        
      // Test component configuration
      f_cf_01_http_up();
        
      // Test adapter configuration
      
      // Preamble
      f_checkUserInfo("Trigger LoST request", 30.0);
      f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);

      // Test Body
      tc_ac.start;
      alt {
        [] httpPort.receive(
                            mw_http_request(
                                            mw_http_request_post(
                                                                 PICS_PSAP_LoST_URI,
                                                                 ?,
                                                                 mw_http_message_body_xml(
                                                                                          mw_body_xml_find_service_request(
                                                                                                                           mw_find_service_request
                                                                                                                           ))))) -> value v_request {
          var HttpMessage v_response;

          tc_ac.stop;

          // TODO Send response
          
          
          log("*** " & testcasename() & ": INFO: IUT successfully sends LoST request ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
        }
        [] tc_ac.timeout {
          log("*** " & testcasename() & ": INCONC: Expected message not received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);          
        }
      }
    }

  } // End of group LoST
  
  group Security {
Loading