sdp_message_t * eXosip_get_sdp_info (osip_message_t * message) { osip_content_type_t *ctt; sdp_message_t *sdp; osip_body_t *oldbody; int pos; if (message == NULL) return NULL; /* get content-type info */ ctt = osip_message_get_content_type (message); if (ctt == NULL) return NULL; /* previous message was not correct or empty */ if (ctt->type == NULL || ctt->subtype == NULL) return NULL; if (osip_strcasecmp (ctt->type, "multipart") == 0) { /* probably within the multipart attachement */ } else if (osip_strcasecmp (ctt->type, "application") != 0 || osip_strcasecmp (ctt->subtype, "sdp") != 0) return NULL; pos = 0; while (!osip_list_eol (&message->bodies, pos)) { int i; oldbody = (osip_body_t *) osip_list_get (&message->bodies, pos); pos++; sdp_message_init (&sdp); i = sdp_message_parse (sdp, oldbody->body); if (i == 0) return sdp; sdp_message_free (sdp); sdp = NULL; } return NULL; }
static int sip_get_address(osip_message_t *msg, u_int *host, u_short *port) { osip_content_type_t *ctt; sdp_message_t *sdp; char *tmp; int i; int j; if (NULL == (ctt = osip_message_get_content_type(msg))) return 0; if ((NULL == ctt->type) || (NULL == ctt->subtype)) return 0; if (osip_strcasecmp(ctt->type, "application")) return 0; if (osip_strcasecmp(ctt->subtype, "sdp")) return 0; for (i = 0; !osip_list_eol(msg->bodies, i); ++i) { sdp = NULL; sdp_message_init(&sdp); tmp = ((osip_body_t *)osip_list_get(msg->bodies, i))->body; if (sdp_message_parse(sdp, tmp)) { sdp_message_free(sdp); continue; } for (j = 0; NULL != sdp_message_m_media_get(sdp, j); ++j) { if (NULL == (tmp = sdp_message_m_port_get(sdp, j))) continue; *port = atoi(tmp); if (NULL == (tmp = sdp_message_c_addr_get(sdp, -1, 0))) if (NULL == (tmp = sdp_message_c_addr_get(sdp, j, 0))) continue; *host = (u_int)inet_addr(tmp); sdp_message_free(sdp); return 1; } sdp_message_free(sdp); } return 0; }
/* * Processing. * */ int PLUGIN_PROCESS(int stage, sip_ticket_t *ticket){ /* stage contains the PLUGIN_* value - the stage of SIP processing. */ int sts; char *buff; size_t buflen; osip_body_t *body; sdp_message_t *sdp; int content_length; osip_content_type_t *content_type; char clen[8]; /* content length: probably never more than 7 digits !*/ // // check that we have the expected payload "application/sdp" // // get content length content_length=0; if (ticket->sipmsg && ticket->sipmsg->content_length && ticket->sipmsg->content_length->value) { sts=sscanf(ticket->sipmsg->content_length->value, "%i", &content_length); } // check if we have a content type defined and that payload length >0 content_type=osip_message_get_content_type(ticket->sipmsg); if ((content_length == 0) || (content_type == NULL) || (content_type->type == NULL) || (content_type->subtype == NULL)) { DEBUGC(DBCLASS_PLUGIN, "%s: no content", name); return STS_SUCCESS; } // check content type: must be "application/sdp" if ((strncmp(content_type->type, "application", sizeof("application")) != 0) || (strncmp(content_type->subtype, "sdp", sizeof("sdp")) != 0)) { DEBUGC(DBCLASS_PLUGIN, "%s: unsupported content-type %s/%s", name, content_type->type, content_type->subtype); return STS_SUCCESS; } DEBUGC(DBCLASS_PLUGIN, "%s: content-type %s/%s, size=%i", name, content_type->type, content_type->subtype, content_length); // // parse the payload // // get a pointer to the payload of the SIP packet sts = osip_message_get_body(ticket->sipmsg, 0, &body); if (sts != 0) { DEBUGC(DBCLASS_PLUGIN, "%s: no body found in message", name); return STS_SUCCESS; } // dump it into a buffer sts = sip_body_to_str(body, &buff, &buflen); if (sts != 0) { WARN("%s: unable to sip_body_to_str", name); return STS_SUCCESS; } // and parse it into an SDP structure sts = sdp_message_init(&sdp); sts = sdp_message_parse (sdp, buff); if (sts != 0) { WARN("%s: unable to sdp_message_parse() body", name); DUMP_BUFFER(-1, buff, buflen); osip_free(buff); buff=NULL; sdp_message_free(sdp); return STS_SUCCESS; } osip_free(buff); buff=NULL; // // now do the codec filtering magic... sdp_filter_codec(sdp); // // replace the original payload with the new modified payload // // remove old body from SIP packet sts = osip_list_remove(&(ticket->sipmsg->bodies), 0); osip_body_free(body); body=NULL; // dump new body to buffer sdp_message_to_str(sdp, &buff); buflen=strlen(buff); // free sdp structure (no longer needed) sdp_message_free(sdp); sdp=NULL; // put new body into SIP message sts=sip_message_set_body(ticket->sipmsg, buff, buflen); if (sts != 0) { ERROR("%s: unable to sip_message_set_body body", name); DUMP_BUFFER(-1, buff, buflen); buflen=0; } // free buffer osip_free(buff); buff=NULL; // // set new content length // // remove old content leght field osip_content_length_free(ticket->sipmsg->content_length); ticket->sipmsg->content_length=NULL; // set new content length sprintf(clen,"%ld",(long)buflen); sts = osip_message_set_content_length(ticket->sipmsg, clen); return STS_SUCCESS; }