Files
svc.ems/plat/bicc/src.old/bicc_ipbcp.c
2024-09-27 15:39:34 +08:00

363 lines
7.6 KiB
C

#include <stdio.h>
#include <string.h>
#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);
}