#define AST_SIP_X_AST_TXP "x-ast-txp"
#define AST_SIP_X_AST_TXP_LEN 9
+/*! Common media types used throughout res_pjsip and pjproject */
+extern pjsip_media_type pjsip_media_type_application_json;
+extern pjsip_media_type pjsip_media_type_application_media_control_xml;
+extern pjsip_media_type pjsip_media_type_application_pidf_xml;
+extern pjsip_media_type pjsip_media_type_application_xpidf_xml;
+extern pjsip_media_type pjsip_media_type_application_cpim_xpidf_xml;
+extern pjsip_media_type pjsip_media_type_application_rlmi_xml;
+extern pjsip_media_type pjsip_media_type_application_simple_message_summary;
+extern pjsip_media_type pjsip_media_type_application_sdp;
+extern pjsip_media_type pjsip_media_type_multipart_alternative;
+extern pjsip_media_type pjsip_media_type_multipart_mixed;
+extern pjsip_media_type pjsip_media_type_multipart_related;
+extern pjsip_media_type pjsip_media_type_text_plain;
+
+/*!
+ * \brief Compare pjsip media types
+ *
+ * \param pjsip_media_type a
+ * \param pjsip_media_type b
+ * \retval 1 Media types are equal
+ * \retval 0 Media types are not equal
+ */
+int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b);
+
+/*!
+ * \brief Check if a media type is in a list of others
+ *
+ * \param a pjsip_media_type to search for
+ * \param ... one or more pointers to pjsip_media_types the last of which must be "SENTINEL"
+ * \retval 1 Media types are equal
+ * \retval 0 Media types are not equal
+ */
+int ast_sip_is_media_type_in(pjsip_media_type *a, ...) attribute_sentinel;
+
/*!
* \brief Initialize an auth vector with the configured values.
*
return res;
}
+int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b)
+{
+ int rc = 0;
+ if (a != NULL && b != NULL) {
+ rc = pjsip_media_type_cmp(a, b, 0) ? 0 : 1;
+ }
+ return rc;
+}
+
+int ast_sip_is_media_type_in(pjsip_media_type *a, ...)
+{
+ int rc = 0;
+ pjsip_media_type *b = NULL;
+ va_list ap;
+
+ ast_assert(a != NULL);
+ va_start(ap, a);
+
+ while ((b = va_arg(ap, pjsip_media_type *)) != (pjsip_media_type *)SENTINEL) {
+ if (pjsip_media_type_cmp(a, b, 0) == 0) {
+ rc = 1;
+ break;
+ }
+ }
+ va_end(ap);
+
+ return rc;
+}
int ast_sip_is_content_type(pjsip_media_type *content_type, char *type, char *subtype)
{
pjmedia_strerror(0, NULL, 0);
}
+/* Definitions of media types declared "extern" in res_pjsip.h */
+pjsip_media_type pjsip_media_type_application_json;
+pjsip_media_type pjsip_media_type_application_media_control_xml;
+pjsip_media_type pjsip_media_type_application_pidf_xml;
+pjsip_media_type pjsip_media_type_application_xpidf_xml;
+pjsip_media_type pjsip_media_type_application_cpim_xpidf_xml;
+pjsip_media_type pjsip_media_type_application_rlmi_xml;
+pjsip_media_type pjsip_media_type_application_simple_message_summary;
+pjsip_media_type pjsip_media_type_application_sdp;
+pjsip_media_type pjsip_media_type_multipart_alternative;
+pjsip_media_type pjsip_media_type_multipart_mixed;
+pjsip_media_type pjsip_media_type_multipart_related;
+pjsip_media_type pjsip_media_type_text_plain;
+
static int load_module(void)
{
struct ast_threadpool_options options;
ast_log(LOG_WARNING, "Failed to register pjmedia error codes. Codes will not be decoded.\n");
}
+ /* Initialize common media types */
+ pjsip_media_type_init2(&pjsip_media_type_application_json, "application", "json");
+ pjsip_media_type_init2(&pjsip_media_type_application_media_control_xml, "application", "media_control+xml");
+ pjsip_media_type_init2(&pjsip_media_type_application_pidf_xml, "application", "pidf+xml");
+ pjsip_media_type_init2(&pjsip_media_type_application_xpidf_xml, "application", "xpidf+xml");
+ pjsip_media_type_init2(&pjsip_media_type_application_cpim_xpidf_xml, "application", "cpim-xpidf+xml");
+ pjsip_media_type_init2(&pjsip_media_type_application_rlmi_xml, "application", "rlmi+xml");
+ pjsip_media_type_init2(&pjsip_media_type_application_sdp, "application", "sdp");
+ pjsip_media_type_init2(&pjsip_media_type_application_simple_message_summary, "application", "simple-message-summary");
+ pjsip_media_type_init2(&pjsip_media_type_multipart_alternative, "multipart", "alternative");
+ pjsip_media_type_init2(&pjsip_media_type_multipart_mixed, "multipart", "mixed");
+ pjsip_media_type_init2(&pjsip_media_type_multipart_related, "multipart", "related");
+ pjsip_media_type_init2(&pjsip_media_type_text_plain, "text", "plain");
+
+
if (ast_sip_initialize_system()) {
ast_log(LOG_ERROR, "Failed to initialize SIP 'system' configuration section. Aborting load\n");
goto error;
pjsip_ctype_hdr *ctype_hdr = rdata->msg_info.ctype;
if (body && ctype_hdr &&
- !pj_stricmp2(&ctype_hdr->media.type, "multipart") &&
- (!pj_stricmp2(&ctype_hdr->media.subtype, "mixed") ||
- !pj_stricmp2(&ctype_hdr->media.subtype, "alternative"))) {
+ ast_sip_is_media_type_in(&ctype_hdr->media, &pjsip_media_type_multipart_mixed,
+ &pjsip_media_type_multipart_alternative, SENTINEL)) {
pjsip_multipart_part *part = pjsip_multipart_get_first_part(body);
while (part != NULL) {
if (check_content_disposition_in_multipart(part)) {
/* SDP produced by us directly will never be multipart */
if (!transport_state || hook || !tdata->msg->body ||
- !ast_sip_is_content_type(&tdata->msg->body->content_type, "application", "sdp") ||
+ !ast_sip_are_media_types_equal(&tdata->msg->body->content_type, &pjsip_media_type_application_sdp) ||
ast_strlen_zero(transport->external_media_address)) {
return;
}