Commit 3daa4678 authored by Yann Garcia's avatar Yann Garcia
Browse files

Add Geolocation header support

parent ec79c944
Loading
Loading
Loading
Loading
+147 −7
Original line number Diff line number Diff line
@@ -174,6 +174,14 @@ int sip_codec_headers::encode_headers(const LibSip__SIPTypesAndValues::MessageHe
  ::osip_cseq_free(cseq_header);
  osip_free(hvalue);

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

  // MaxForwards
  if (p_msg_header.maxForwards().is_present()) {
    if (encode_max_forwards_header(p_msg_header.maxForwards(), &p_sip_message) == -1) {
@@ -385,7 +393,15 @@ void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibS
  p_headers.event().set_to_omit();
  p_headers.expires().set_to_omit();
  p_headers.featureCaps().set_to_omit();

  LibSip__SIPTypesAndValues::Geolocation geolocation_header;
  decode_geolocation_header(p_sip_message, geolocation_header);
  if (geolocation_header.is_value()) {
    p_headers.geolocation() = geolocation_header;
  } else {
    p_headers.geolocation().set_to_omit();
  }

  p_headers.geolocationRouting().set_to_omit();
  p_headers.historyInfo().set_to_omit();
  p_headers.infoPackage().set_to_omit();
@@ -1002,6 +1018,55 @@ int sip_codec_headers::encode_from_header(const LibSip__SIPTypesAndValues::From&
  return 0;
} // End of method encode_from_header

int sip_codec_headers::encode_geolocation_header(const OPTIONAL<LibSip__SIPTypesAndValues::Geolocation>& p_geolocation, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_geolocation_header");

  if (!p_geolocation.is_present()) {
    return 0;
  }

  // addrSpec
  const LibSip__SIPTypesAndValues::Geolocation& geolocation = static_cast<const LibSip__SIPTypesAndValues::Geolocation&>(*p_geolocation.get_opt_value());
  const LibSip__SIPTypesAndValues::SipUrl& addr = geolocation.addrSpec();
  osip_uri_t* uri = nullptr;
  if (encode_sip_url(addr, &uri) == -1) {
    loggers::get_instance().warning("sip_codec_headers::encode_geolocation_header: Failed to encode SipUrl");
    return -1;
  }
  char *buff = nullptr;
  if (::osip_uri_to_str(uri, &buff) != 0) {
   loggers::get_instance().warning("sip_codec_headers::encode_geolocation_header: Failed to convert SipUrl");
    return -1;
  }
  std::string value(buff);
  osip_free(buff);
  loggers::get_instance().log("sip_codec_headers::encode_geolocation_header: addrSpec: %s", value.c_str());
  // geolocParam
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& geoloc_param = geolocation.geolocParam(); // TODO Create a method to fill an std::string with SemicolonParam__List
  if (geoloc_param.is_present()) {
    const LibSip__Common::SemicolonParam__List& l = static_cast<const LibSip__Common::SemicolonParam__List&>(*geoloc_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 *)"Geolocation", value.c_str());

  return 0;
}

int sip_codec_headers::encode_max_forwards_header(const OPTIONAL<LibSip__SIPTypesAndValues::MaxForwards>& p_max_forwards, osip_message_t** p_sip_message) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_max_forwards_header");

@@ -1022,7 +1087,7 @@ int sip_codec_headers::encode_min_se_header(const OPTIONAL<LibSip__SIPTypesAndVa
  // deltaSec
  std::string value(static_cast<const char*>(min_se.deltaSec()));
  // seParam
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& se_param = min_se.minSeParam(); // TODO Create a methid to fill an std::string with SemicolonParam__List
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& se_param = min_se.minSeParam(); // TODO Create a method to fill an std::string with SemicolonParam__List
  if (se_param.is_present()) {
    const LibSip__Common::SemicolonParam__List& l = static_cast<const LibSip__Common::SemicolonParam__List&>(*se_param.get_opt_value());
    int i = 0;
@@ -1054,7 +1119,7 @@ int sip_codec_headers::encode_p_access_network_info_header(const OPTIONAL<LibSip
  // 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
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& p_access_network_info_param = p_access_network_info_header.genericParams(); // TODO Create a method 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;
@@ -1124,7 +1189,7 @@ int sip_codec_headers::encode_session_expires_header(const OPTIONAL<LibSip__SIPT
  // deltaSec
  std::string value(static_cast<const char*>(session_expires.deltaSec()));
  // seParam
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& se_param = session_expires.seParam(); // TODO Create a methid to fill an std::string with SemicolonParam__List
  const OPTIONAL<LibSip__Common::SemicolonParam__List>& se_param = session_expires.seParam(); // TODO Create a method to fill an std::string with SemicolonParam__List
  if (se_param.is_present()) {
    const LibSip__Common::SemicolonParam__List& l = static_cast<const LibSip__Common::SemicolonParam__List&>(*se_param.get_opt_value());
    int i = 0;
@@ -1328,15 +1393,49 @@ void sip_codec_headers::decode_semi_colon_params(const std::string& p_params, st
    LibSip__Common::SemicolonParam__List l;
    for (unsigned int i = 1; i < output.size(); i++) {
      std::vector<std::string> o = converter::get_instance().split(output[i], "=");
      if (o.size() == 2) {
        LibSip__Common::GenValue g;
        g.tokenOrHost() = CHARSTRING(o[1].c_str());
        p_others_params[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g);
      } else {
        p_others_params[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), OPTIONAL<LibSip__Common::GenValue>(OMIT_VALUE));
      }
    } // End of 'for' statement
  }
  loggers::get_instance().log("<<< sip_codec_headers::decode_semi_colon_params: %s", p_first_param.c_str());
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_semi_colon_params: ", p_others_params);
}

void sip_codec_headers::decode_semi_colon_params(const std::string& p_params, LibSip__Common::SemicolonParam__List& p_params_list) {
  loggers::get_instance().log(">>> sip_codec_headers::decode_semi_colon_params: %s", p_params.c_str());

  std::size_t idx = p_params.find(";");
  if (idx == std::string::npos) {
      std::vector<std::string> o = converter::get_instance().split(p_params, "=");
      if (o.size() == 2) {
        LibSip__Common::GenValue g;
        g.tokenOrHost() = CHARSTRING(o[1].c_str());
        p_params_list[0] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g);
      } else {
    	  p_params_list[0] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), OPTIONAL<LibSip__Common::GenValue>(OMIT_VALUE));
      }
  } else {
    std::vector<std::string> output = converter::get_instance().split(p_params, ";");
    LibSip__Common::SemicolonParam__List l;
    for (unsigned int i = 0; i < output.size(); i++) {
      std::vector<std::string> o = converter::get_instance().split(output[i], "=");
      if (o.size() == 2) {
        LibSip__Common::GenValue g;
        g.tokenOrHost() = CHARSTRING(o[1].c_str());
        p_params_list[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g);
      } else {
    	  p_params_list[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), OPTIONAL<LibSip__Common::GenValue>(OMIT_VALUE));
      }
    } // End of 'for' statement
  }
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_semi_colon_params: ", p_params_list);
}

int sip_codec_headers::encode_ampersand_params(const LibSip__Common::AmpersandParam__List& p_list, osip_list_t** p_sip_list) {
  loggers::get_instance().log(">>> sip_codec_headers::encode_ampersand_params");

@@ -2073,6 +2172,47 @@ void sip_codec_headers::decode_from_header(const osip_from_t* p_sip_from, LibSip
  loggers::get_instance().log_msg("<<< sip_codec_headers::decode_from_header: ", p_from_header);
} // End of method decode_from_header

void sip_codec_headers::decode_geolocation_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Geolocation& p_geolocation_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_geolocation_header");

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

  // FieldName
  p_geolocation_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("GEOLOCATION_E"));
  // addrSpec
  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_geolocation_header: u='%s'\n", u.c_str());
  osip_uri_t *uri = nullptr;
  ::osip_uri_init(&uri);
  ::osip_uri_parse(uri, u.c_str());
  decode_uri(p_geolocation_header.addrSpec(), uri);
  // geolocParam
  if (p3 != std::string::npos) {
    std::string p = str.substr(p3 + 1);
    loggers::get_instance().log("sip_codec_headers::decode_geolocation_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_geolocation_header.geolocParam() = OPTIONAL<LibSip__Common::SemicolonParam__List>(params);
    } else {
      p_geolocation_header.geolocParam().set_to_omit();
    }
  } else {
    p_geolocation_header.geolocParam().set_to_omit();
  }
} // End of method decode_geolocation_header

void sip_codec_headers::decode_max_forwards_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MaxForwards& p_max_forwards_header)
{
  loggers::get_instance().log("sip_codec_headers::decode_max_forwards_header");
+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ public:
  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_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_max_forwards_header(const OPTIONAL<LibSip__SIPTypesAndValues::MaxForwards>& p_max_forwards, osip_message_t** p_sip_message);
  virtual int encode_min_se_header(const OPTIONAL<LibSip__SIPTypesAndValues::MinSE>& p_min_se, osip_message_t** p_sip_message);
  virtual int encode_p_access_network_info_header(const OPTIONAL<LibSip__SIPTypesAndValues::PAccessNetworkInfo>& p_p_access_network_info_header, osip_message_t** p_sip_message);
@@ -77,6 +78,7 @@ public:
  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_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_max_forwards_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MaxForwards& p_max_forwards_header);
  virtual void decode_min_se_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MinSE& p_min_se_header);
  virtual void decode_p_access_network_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::PAccessNetworkInfo& p_p_access_network_info_header);
@@ -97,6 +99,7 @@ private:
  int encode_server_val_list(const LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals, const std::string& p_field_name, osip_message_t** p_sip_message);

  void decode_host_port(const char* p_host, const char* p_port, LibSip__SIPTypesAndValues::HostPort& p_host_port);
  void decode_semi_colon_params(const std::string& p_params, LibSip__Common::SemicolonParam__List& p_params_list);
  void decode_semi_colon_params(const std::string& p_params, std::string& p_first_param, LibSip__Common::SemicolonParam__List& p_others_params);
  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);
+4 −0
Original line number Diff line number Diff line
@@ -435,6 +435,10 @@ void sip_codec_message_body::decode_message_body(const osip_message_t* p_sip_mes
  if (body->content_type != nullptr) {
    loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body content-type: '%s'/'%s'/%p", body->content_type->type, body->content_type->subtype, body->content_type->gen_params.node);
  }
  if (::osip_list_size(body->headers) != 0) {
    loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body header is present");
    // TODO Process Content-ID and other headers
  }
  LibSip__MessageBodyTypes::MessageBody msg_body;
  if (content_type != nullptr) {
    loggers::get_instance().log("sip_codec_message_body::decode_message_body: content-type.type: '%s'/'%s'/%p", content_type->type, content_type->subtype, content_type->gen_params.node);
+3 −3
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ 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_Invite.tc_invite_request_4
TestCodec_Invite.tc_invite_request_4
#TestCodec_Responses.tc_100_trying_1
#TestCodec_Responses.tc_180_ringing_1
#TestCodec_HttpRequest.tc_http_get_1
@@ -67,8 +67,8 @@ system.httpPort.params := "HTTP(codecs=held:held_codec;html:html_codec;json:json
#TestCodec_Xsd.tc_linear_ring_1
#TestCodec_Xsd.tc_test_vendor_response_1
#TestCodec_Xsd.tc_test_vendor_response_2
TestCodec_Regexp.tc_regexp_1
TestCodec_Regexp.tc_regexp_2
#TestCodec_Regexp.tc_regexp_1
#TestCodec_Regexp.tc_regexp_2

[GROUPS]
# In this section you can specify groups of hosts. These groups can be used inside the
+13 −2
Original line number Diff line number Diff line
@@ -1031,7 +1031,7 @@ module TestCodec_Invite {
      //var charstring v_invite := "INVITE urn:service:sos SIP/2.0\r\nSupported: timer,100rel,precondition\r\nAllow: INVITE,ACK,OPTIONS,CANCEL,BYE,UPDATE,INFO,REFER,NOTIFY,MESSAGE,PRACK\r\nUser-Agent: testIMS /OK2 5.1.1\r\nAccept-Contact: *;+g.3gpp.icsi-ref=\"urn:urn-7:3gpp-service.ims.icsi.mmtel\";video\r\nP-Access-Network-Info: 3GPP-E-UTRAN-FDD;utran-cell-id-3gpp=0010100010000000\r\nSession-Expires: 1800;refresher=uac\r\nMin-SE: 90\r\nContent-Type: multipart/mixed; boundary=boundary1\r\nAccept: application/sdp,application/3gpp-ims+xml,application/pidf+xml\r\nRoute: <sip:[2001:0:0:3::2]:5060;lr>\r\nP-Preferred-Identity: <sip:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>\r\nFrom: <sip:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>;tag=414344133\r\nTo: \"123\" <urn:service:sos>\r\nCall-ID: 1800855744@2001:0:0:3::1\r\nCSeq: 1 INVITE\r\nMax-Forwards: 70\r\nContact: <sip:001010123456789@[2001:0:0:3::1]:5060;transport=UDP>;+g.3gpp.icsi-ref=\"urn:urn-7:3gpp-service.ims.icsi.mmtel\";video;+g.3gpp.mid-call;+g.3gpp.srvcc-alerting;+g.3gpp.ps2cs-srvcc-orig-pre-alerting;+sip.instance=\"<urn:gsma:imei:35609506-513511-0>\"\r\nVia: SIP/2.0/TCP [2001:0:0:3::1]:5060;branch=z9hG4bK2071720670smg;transport=TCP;rport\r\nContent-Length: 1564\r\n\r\n--boundary1\r\nContent-Type: application/sdp\r\n\r\nv=0\r\no=user1 53655765 2353687637 IN IP4 128.3.4.5\r\ns=Mbone Audio\r\ni=Discussion of Mbone Engineering Issuese=mbone@somewhere.com\r\nc=IN IP4 224.2.0.1/127\r\nt=0 0\r\nm=audio 3456 RTP/AVP 0\r\na=rtpmap:0 PCMU/8000\r\na=maxptime:240\r\n--boundary1\r\nContent-Type: application/resource-lists+xml\r\nContent-Disposition: recipient-list\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n   <presence\r\n      xmlns=\"urn:ietf:params:xml:ns:pidf\"\r\n      xmlns:gp=\"urn:ietf:params:xml:ns:pidf:geopriv10\"\r\n      xmlns:gbp=\"urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy\"\r\n      xmlns:cl=\"urn:ietf:params:xml:ns:pidf:geopriv10:civicAddr\"\r\n      xmlns:gml=\"http://www.opengis.net/gml\"\r\n      xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\"\r\n      entity=\"pres:alice@atlanta.example.com\">\r\n    <dm:device id=\"target123-1\">\r\n      <gp:geopriv>\r\n        <gp:location-info>\r\n          <gml:location>\r\n            <gml:Point srsName=\"urn:ogc:def:crs:EPSG::4326\">\r\n              <gml:pos>32.86726 -97.16054</gml:pos>\r\n            </gml:Point>\r\n         </gml:location>\r\n        </gp:location-info>\r\n        <gp:usage-rules>\r\n          <gbp:retransmission-allowed>false\r\n          </gbp:retransmission-allowed>\r\n          <gbp:retention-expiry>2010-11-14T20:00:00Z\r\n          </gbp:retention-expiry>\r\n        </gp:usage-rules>\r\n        <gp:method>802.11</gp:method>\r\n      </gp:geopriv>\r\n      <dm:deviceID>mac:1234567890ab</dm:deviceID>\r\n      <dm:timestamp>2010-11-04T20:57:29Z</dm:timestamp>\r\n    </dm:device>\r\n  </presence>\r\n--boundary1--\r\n\r\n";
//0         1         2         3         4         5         6         7         8         9        0         1          2         3         4        5
//012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
      var charstring v_invite := "INVITE urn:service:sos SIP/2.0\r\nSupported: timer,100rel,precondition\r\nAllow: INVITE,ACK,OPTIONS,CANCEL,BYE,UPDATE,INFO,REFER,NOTIFY,MESSAGE,PRACK\r\nUser-Agent: testIMS /OK2 5.1.1\r\nAccept-Contact: *;+g.3gpp.icsi-ref=\"urn:urn-7:3gpp-service.ims.icsi.mmtel\";video\r\nP-Access-Network-Info: 3GPP-E-UTRAN-FDD;utran-cell-id-3gpp=0010100010000000\r\nSession-Expires: 1800;refresher=uac\r\nMin-SE: 90\r\nContent-Type: multipart/mixed; boundary=boundary1\r\nAccept: application/sdp,application/3gpp-ims+xml,application/pidf+xml\r\nRoute: <sip:[2001:0:0:3::2]:5060;lr>\r\nP-Preferred-Identity: <sip:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>\r\nFrom: <sip:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>;tag=414344133\r\nTo: \"123\" <urn:service:sos>\r\nCall-ID: 1800855744@2001:0:0:3::1\r\nCSeq: 1 INVITE\r\nMax-Forwards: 70\r\nContact: <sip:001010123456789@[2001:0:0:3::1]:5060;transport=UDP>;+g.3gpp.icsi-ref=\"urn:urn-7:3gpp-service.ims.icsi.mmtel\";video;+g.3gpp.mid-call;+g.3gpp.srvcc-alerting;+g.3gpp.ps2cs-srvcc-orig-pre-alerting;+sip.instance=\"<urn:gsma:imei:35609506-513511-0>\"\r\nVia: SIP/2.0/TCP [2001:0:0:3::1]:5060;branch=z9hG4bK2071720670smg;transport=TCP;rport\r\nContent-Length: 1735\r\n\r\n--boundary1\r\nContent-Type: application/sdp\r\n\r\nv=0\r\no=user1 53655765 2353687637 IN IP4 128.3.4.5\r\ns=Mbone Audio\r\ni=Discussion of Mbone Engineering Issuese=mbone@somewhere.com\r\nc=IN IP4 224.2.0.1/127\r\nt=0 0\r\nm=audio 3456 RTP/AVP 0\r\na=rtpmap:0 PCMU/8000\r\na=maxptime:240\r\n--boundary1\r\nContent-Type: application/resource-lists+xml\r\nContent-Disposition: recipient-list\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n   <presence\r\n      xmlns=\"urn:ietf:params:xml:ns:pidf\"\r\n      xmlns:gp=\"urn:ietf:params:xml:ns:pidf:geopriv10\"\r\n      xmlns:gbp=\"urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy\"\r\n      xmlns:cl=\"urn:ietf:params:xml:ns:pidf:geopriv10:civicAddr\"\r\n      xmlns:gml=\"http://www.opengis.net/gml\"\r\n      xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\"\r\n      entity=\"pres:alice@atlanta.example.com\">\r\n    <dm:device id=\"target123-1\">\r\n      <gp:geopriv>\r\n        <gp:location-info>\r\n          <gml:location>\r\n            <gml:Point srsName=\"urn:ogc:def:crs:EPSG::4326\">\r\n              <gml:pos>32.86726 -97.16054</gml:pos>\r\n            </gml:Point>\r\n         </gml:location>\r\n        </gp:location-info>\r\n        <gp:usage-rules>\r\n          <gbp:retransmission-allowed>false\r\n          </gbp:retransmission-allowed>\r\n          <gbp:retention-expiry>2010-11-14T20:00:00Z\r\n          </gbp:retention-expiry>\r\n        </gp:usage-rules>\r\n        <gp:method>802.11</gp:method>\r\n      </gp:geopriv>\r\n      <dm:deviceID>mac:1234567890ab</dm:deviceID>\r\n      <dm:timestamp>2010-11-04T20:57:29Z</dm:timestamp>\r\n    </dm:device>\r\n  </presence>\r\n--boundary1--\r\n\r\n";
      var charstring v_invite := "INVITE urn:service:sos SIP/2.0\r\nSupported: timer,100rel,precondition\r\nAllow: INVITE,ACK,OPTIONS,CANCEL,BYE,UPDATE,INFO,REFER,NOTIFY,MESSAGE,PRACK\r\nUser-Agent: testIMS /OK2 5.1.1\r\nGeolocation: <cid:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>\r\nAccept-Contact: *;+g.3gpp.icsi-ref=\"urn:urn-7:3gpp-service.ims.icsi.mmtel\";video\r\nP-Access-Network-Info: 3GPP-E-UTRAN-FDD;utran-cell-id-3gpp=0010100010000000\r\nSession-Expires: 1800;refresher=uac\r\nMin-SE: 90\r\nContent-Type: multipart/mixed; boundary=boundary1\r\nAccept: application/sdp,application/3gpp-ims+xml,application/pidf+xml\r\nRoute: <sip:[2001:0:0:3::2]:5060;lr>\r\nP-Preferred-Identity: <sip:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>\r\nFrom: <sip:001010123456789@ims.mnc01.mcc001.3gppnetwork.org>;tag=414344133\r\nTo: \"123\" <urn:service:sos>\r\nCall-ID: 1800855744@2001:0:0:3::1\r\nCSeq: 1 INVITE\r\nMax-Forwards: 70\r\nContact: <sip:001010123456789@[2001:0:0:3::1]:5060;transport=UDP>;+g.3gpp.icsi-ref=\"urn:urn-7:3gpp-service.ims.icsi.mmtel\";video;+g.3gpp.mid-call;+g.3gpp.srvcc-alerting;+g.3gpp.ps2cs-srvcc-orig-pre-alerting;+sip.instance=\"<urn:gsma:imei:35609506-513511-0>\"\r\nVia: SIP/2.0/TCP [2001:0:0:3::1]:5060;branch=z9hG4bK2071720670smg;transport=TCP;rport\r\nContent-Length: 1735\r\n\r\n--boundary1\r\nContent-Type: application/sdp\r\n\r\nv=0\r\no=user1 53655765 2353687637 IN IP4 128.3.4.5\r\ns=Mbone Audio\r\ni=Discussion of Mbone Engineering Issuese=mbone@somewhere.com\r\nc=IN IP4 224.2.0.1/127\r\nt=0 0\r\nm=audio 3456 RTP/AVP 0\r\na=rtpmap:0 PCMU/8000\r\na=maxptime:240\r\n--boundary1\r\nContent-Type: application/resource-lists+xml\r\nContent-Disposition: recipient-list\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n   <presence\r\n      xmlns=\"urn:ietf:params:xml:ns:pidf\"\r\n      xmlns:gp=\"urn:ietf:params:xml:ns:pidf:geopriv10\"\r\n      xmlns:gbp=\"urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy\"\r\n      xmlns:cl=\"urn:ietf:params:xml:ns:pidf:geopriv10:civicAddr\"\r\n      xmlns:gml=\"http://www.opengis.net/gml\"\r\n      xmlns:dm=\"urn:ietf:params:xml:ns:pidf:data-model\"\r\n      entity=\"pres:alice@atlanta.example.com\">\r\n    <dm:device id=\"target123-1\">\r\n      <gp:geopriv>\r\n        <gp:location-info>\r\n          <gml:location>\r\n            <gml:Point srsName=\"urn:ogc:def:crs:EPSG::4326\">\r\n              <gml:pos>32.86726 -97.16054</gml:pos>\r\n            </gml:Point>\r\n         </gml:location>\r\n        </gp:location-info>\r\n        <gp:usage-rules>\r\n          <gbp:retransmission-allowed>false\r\n          </gbp:retransmission-allowed>\r\n          <gbp:retention-expiry>2010-11-14T20:00:00Z\r\n          </gbp:retention-expiry>\r\n        </gp:usage-rules>\r\n        <gp:method>802.11</gp:method>\r\n      </gp:geopriv>\r\n      <dm:deviceID>mac:1234567890ab</dm:deviceID>\r\n      <dm:timestamp>2010-11-04T20:57:29Z</dm:timestamp>\r\n    </dm:device>\r\n  </presence>\r\n--boundary1--\r\n\r\n";
      var bitstring v_enc_message := oct2bit(char2oct(v_invite));
      var octetstring v_enc_msg;
      var INVITE_Request v_decoded_invite;
@@ -1240,7 +1240,18 @@ module TestCodec_Invite {
              }
          }
        },
        geolocation := omit,
        geolocation := { 
          fieldName := GEOLOCATION_E, 
          addrSpec := { 
            scheme := "cid", 
            components := { 
              other := "cid:001010123456789@ims.mnc01.mcc001.3gppnetwork.org" 
            }, 
            urlParameters := omit, 
            headers := omit 
          }, 
          geolocParam := omit 
        },
        geolocationRouting := omit,
        historyInfo := omit,
        infoPackage := omit,