int msrp_frame_get_first_from_path(msrp_frame_t *mf, str *sres) { str s = {0}; msrp_hdr_t *hdr; str_array_t *sar; if(msrp_parse_hdr_from_path(mf)<0) return -1; hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return -1; sar = (str_array_t*)hdr->parsed.data; s = sar->list[sar->size-1]; trim(&s); *sres = s; return 0; }
int pv_get_msrp(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) { msrp_frame_t *mf; msrp_hdr_t *hdr; str_array_t *sar; msrp_uri_t uri; str s; char *p; mf = msrp_get_current_frame(); if(mf==NULL || param==NULL) return -1; sar = NULL; hdr = NULL; switch(param->pvn.u.isname.name.n) { case 1: s.s = mf->buf.s; s.len = mf->buf.len; return pv_get_strval(msg, param, res, &s); case 2: if(mf->mbody.s==NULL) return pv_get_null(msg, param, res); s.s = mf->mbody.s; s.len = mf->mbody.len; return pv_get_strval(msg, param, res, &s); case 3: if(mf->fline.msgtypeid==MSRP_REQUEST) return pv_get_null(msg, param, res); return pv_get_intstrval(msg, param, res, MSRP_RPL_CODE(mf->fline.rtypeid), &mf->fline.rtype); case 4: if(mf->hbody.s==NULL) return pv_get_null(msg, param, res); s.s = mf->hbody.s; s.len = mf->hbody.len; return pv_get_strval(msg, param, res, &s); case 5: hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_MESSAGE_ID); if(hdr==NULL) return pv_get_null(msg, param, res); s.s = hdr->body.s; s.len = hdr->body.len; trim(&s); return pv_get_strval(msg, param, res, &s); case 6: if(mf->fline.msgtypeid==MSRP_REPLY) return pv_get_null(msg, param, res); return pv_get_strintval(msg, param, res, &mf->fline.rtype, mf->fline.rtypeid); case 7: return pv_get_uintval(msg, param, res, mf->buf.len); case 8: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[0]; trim(&s); if(msrp_parse_uri(s.s, s.len, &uri)<0 || uri.session.len<=0) return pv_get_null(msg, param, res); s = uri.session; trim(&s); return pv_get_strval(msg, param, res, &s); case 9: if(mf->fline.msgtypeid==MSRP_REQUEST || mf->fline.rtext.s==NULL) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &mf->fline.rtext); case 10: return pv_get_uintval(msg, param, res, mf->mbody.len); case 11: s = mf->fline.transaction; trim(&s); return pv_get_strval(msg, param, res, &s); case 12: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[0]; trim(&s); return pv_get_strval(msg, param, res, &s); case 13: if(msrp_parse_hdr_from_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[0]; trim(&s); return pv_get_strval(msg, param, res, &s); case 14: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; if(sar->size<2) return pv_get_null(msg, param, res); s = sar->list[1]; trim(&s); return pv_get_strval(msg, param, res, &s); case 15: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[sar->size-1]; trim(&s); return pv_get_strval(msg, param, res, &s); case 16: if(msrp_parse_hdr_from_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; s = sar->list[sar->size-1]; trim(&s); return pv_get_strval(msg, param, res, &s); case 17: if(msrp_parse_hdr_from_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_FROM_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; return pv_get_uintval(msg, param, res, sar->size); case 18: if(msrp_parse_hdr_to_path(mf)<0) return pv_get_null(msg, param, res); hdr = msrp_get_hdr_by_id(mf, MSRP_HDR_TO_PATH); if(hdr==NULL) return pv_get_null(msg, param, res); sar = (str_array_t*)hdr->parsed.data; return pv_get_uintval(msg, param, res, sar->size-1); case 19: if(pv_get_buffer_size()<100) return pv_get_null(msg, param, res); s.s = pv_get_buffer(); p = s.s; if(mf->tcpinfo->rcv->proto==PROTO_TLS) { memcpy(p, "msrps://", 8); p+=8; } else { memcpy(p, "msrp://", 7); p+=7; } strcpy(p, ip_addr2a(&mf->tcpinfo->rcv->src_ip)); strcat(p, ":"); strcat(p, int2str(mf->tcpinfo->rcv->src_port, NULL)); s.len = strlen(s.s); return pv_get_strval(msg, param, res, &s); case 20: return pv_get_strval(msg, param, res, &mf->tcpinfo->rcv->bind_address->sock_str); case 21: if(mf->tcpinfo->con==NULL) return pv_get_null(msg, param, res); return pv_get_sintval(msg, param, res, mf->tcpinfo->con->id); default: return pv_get_null(msg, param, res); } return 0; }