#include #include #include "./include/ipbcp.h" int sdp_decode_orig(SdpOrig_struct *dst_ptr, char *src_ptr) { char *token; unsigned char field_id = 0; while((token = strsep(&src_ptr, " ")) != NULL) { switch(++field_id) { case 1: sprintf(dst_ptr->username, token); strcat(dst_ptr->username, "\0"); break; case 2: sprintf(dst_ptr->session_id, token); strcat(dst_ptr->session_id, "\0"); break; case 3: sprintf(dst_ptr->version, token); strcat(dst_ptr->version, "\0"); break; case 4: sprintf(dst_ptr->network_type, token); strcat(dst_ptr->network_type, "\0"); break; case 5: sprintf(dst_ptr->address_type, token); strcat(dst_ptr->address_type, "\0"); break; case 6: sprintf(dst_ptr->address, token); strcat(dst_ptr->address, "\0"); break; default: return 0; } } if(field_id != 6) return 0; else return 1; } int sdp_decode_conn(SdpConn_struct *dst_ptr, char *src_ptr) { char *token; unsigned char field_id = 0; while((token = strsep(&src_ptr, " ")) != NULL) { switch(++field_id) { case 1: sprintf(dst_ptr->network_type, token); strcat(dst_ptr->network_type, "\0"); break; case 2: sprintf(dst_ptr->address_type, token); strcat(dst_ptr->address_type, "\0"); break; case 3: sprintf(dst_ptr->address, token); strcat(dst_ptr->address, "\0"); break; default: return 0; } } if(field_id != 3) return 0; else return 1; } int sdp_decode_time(SdpTime_struct *dst_ptr, char *src_ptr) { char *token; unsigned char field_id = 0; while((token = strsep(&src_ptr, " ")) != NULL) { switch(++field_id) { case 1: sprintf(dst_ptr->start, token); strcat(dst_ptr->start, "\0"); break; case 2: sprintf(dst_ptr->stop, token); strcat(dst_ptr->stop, "\0"); break; default: return 0; } } if(field_id != 2) return 0; else return 1; } int sdp_decode_attrib(SdpAttrib_struct *dst_ptr, char *src_ptr) { char *token; unsigned char field_id = 0; if(strstr(src_ptr, "ipbcp:") != src_ptr) return 0; src_ptr += strlen("ipbcp:"); while((token = strsep(&src_ptr, " ")) != NULL) { switch(++field_id) { case 1: sprintf(dst_ptr->version, token); strcat(dst_ptr->version, "\0"); break; case 2: sprintf(dst_ptr->type, token); strcat(dst_ptr->type, "\0"); break; default: return 0; } } if(field_id != 2) return 0; else return 1; } int sdp_decode_mediaAnn(SdpMediaAnn_struct *dst_ptr, char *src_ptr) { char *token; unsigned char field_id = 0; while((token = strsep(&src_ptr, " ")) != NULL) { switch(++field_id) { case 1: sprintf(dst_ptr->media, token); strcat(dst_ptr->media, "\0"); break; case 2: sprintf(dst_ptr->port, token); strcat(dst_ptr->port, "\0"); break; case 3: sprintf(dst_ptr->transport, token); strcat(dst_ptr->transport, "\0"); strcpy(dst_ptr->fmt_list, src_ptr); strcat(dst_ptr->fmt_list, "\0"); break; case 4: // sprintf(dst_ptr->fmt_list, token); break; default: break; } } if(field_id < 4) return 0; else return 1; } int sdp_decode_mediaAtt(SdpMediaAtt_struct *dst_ptr, char *src_ptr) { char *token; unsigned char field_id = 0; if(strstr(src_ptr, "rtpmap:") != src_ptr) return 0; src_ptr += strlen("rtpmap:"); while((token = strsep(&src_ptr, " /")) != NULL) { switch(++field_id) { case 1: sprintf(dst_ptr->payload, token); strcat(dst_ptr->payload, "\0"); break; case 2: sprintf(dst_ptr->encoding_name, token); strcat(dst_ptr->encoding_name, "\0"); break; case 3: sprintf(dst_ptr->clock_rate, token); strcat(dst_ptr->clock_rate, "\0"); break; case 4: // sprintf(dst_ptr->p_time, token); field_id --;//to avoid 4 fields break; default: return 0; } } if(field_id != 3) return 0; else return 1; } int sdp_decode_ptime(char* p_time, char *src_ptr) { char *token; if((token = strstr(src_ptr, "ptime:")) == NULL) return 0; token = strtok(token, ":"); token = strtok(NULL, ":"); // p_time = token; // if(strlen(token)<8) if(token) { sprintf(p_time, token); strcat(p_time, "\0"); } return 1; } int ipbcp_decode(IPBCP_struct *ipbcp_ptr, const char *ptr) { char *token; unsigned char field_id = 0; char temp_ipbcp[200]; char *temp_ptr; strncpy(temp_ipbcp, ptr, 200); temp_ptr = temp_ipbcp; memset(ipbcp_ptr, 0, sizeof(IPBCP_struct)); while((token = strsep(&temp_ptr, "\r\n")) != NULL) { if(strlen(token) == 0) continue; switch(++field_id) { case 1: if((token[0] != 'v') || (token[1] != '=')) return 0; sprintf(ipbcp_ptr->proto_ver, token+2); strcat(ipbcp_ptr->proto_ver, "\0"); break; case 2: if((token[0] != 'o') || (token[1] != '=')) return 0; if(!sdp_decode_orig(&ipbcp_ptr->orig, token+2)) return 0; break; case 3: if((token[0] != 's') || (token[1] != '=')) return 0; sprintf(ipbcp_ptr->session_name, token+2); strcat(ipbcp_ptr->session_name, "\0"); break; case 4: if((token[0] != 'c') || (token[1] != '=')) return 0; if(!sdp_decode_conn(&ipbcp_ptr->conn_data, token+2)) return 0; break; case 5: if((token[0] != 't') || (token[1] != '=')) return 0; if(!sdp_decode_time(&ipbcp_ptr->time, token+2)) return 0; break; case 6: if((token[0] != 'a') || (token[1] != '=')) return 0; if(!sdp_decode_attrib(&ipbcp_ptr->attrib, token+2)) return 0; break; case 7: if((token[0] != 'm') || (token[1] != '=')) return 0; if(!sdp_decode_mediaAnn(&ipbcp_ptr->m_ann, token+2)) return 0; break; case 8: if((token[0] != 'a') || (token[1] != '=')) return 0; if(sdp_decode_mediaAtt(&ipbcp_ptr->m_att, token+2)) // return 0; ; else if(!sdp_decode_ptime(ipbcp_ptr->ptime, token+2)) return 0; break; case 9: if((token[0] != 'a') || (token[1] != '=')) return 0; if(!sdp_decode_ptime(ipbcp_ptr->ptime, token+2)) return 0; default: break; } } return 1; } int ipbcp_encode(char *ptr, const IPBCP_struct *ipbcp_ptr) { char tmp_buf[128]; sprintf(ptr, "v=%s\r\n", ipbcp_ptr->proto_ver); sprintf(tmp_buf, "o=%s %s %s %s %s %s\r\n", ipbcp_ptr->orig.username, ipbcp_ptr->orig.session_id, ipbcp_ptr->orig.version, ipbcp_ptr->orig.network_type, ipbcp_ptr->orig.address_type, ipbcp_ptr->orig.address); strcat(ptr, tmp_buf); sprintf(tmp_buf, "s=%s\r\n", ipbcp_ptr->session_name); strcat(ptr, tmp_buf); sprintf(tmp_buf, "c=%s %s %s\r\n", ipbcp_ptr->conn_data.network_type, ipbcp_ptr->conn_data.address_type, ipbcp_ptr->conn_data.address); strcat(ptr, tmp_buf); sprintf(tmp_buf, "t=%s %s\r\n", ipbcp_ptr->time.start, ipbcp_ptr->time.stop); strcat(ptr, tmp_buf); sprintf(tmp_buf, "a=ipbcp:%s %s\r\n", ipbcp_ptr->attrib.version, ipbcp_ptr->attrib.type); strcat(ptr, tmp_buf); sprintf(tmp_buf, "m=%s %s %s %s\r\n", ipbcp_ptr->m_ann.media, ipbcp_ptr->m_ann.port, ipbcp_ptr->m_ann.transport, ipbcp_ptr->m_ann.fmt_list); strcat(ptr, tmp_buf); if(strlen(ipbcp_ptr->m_att.payload) != 0) { sprintf(tmp_buf, "a=rtpmap:%s %s/%s\r\n", ipbcp_ptr->m_att.payload, ipbcp_ptr->m_att.encoding_name, ipbcp_ptr->m_att.clock_rate); strcat(ptr, tmp_buf); } //ipbcp_ptr->ptime[7]='\0'; if((ipbcp_ptr->ptime[0] != '\0') && (strlen(ipbcp_ptr->ptime)<8)) { sprintf(tmp_buf, "a=ptime:%s\r\n", ipbcp_ptr->ptime); strcat(ptr, tmp_buf); } return strlen(ptr); }