#include "./include/mgc_sess_ctl.h" MGC_SESS_REC mgcSess[MGC_SESS_RECORD]; void mgc_sess_rec_init(MGC_SESS_REC *pSess , int id) { if(pSess == NULL) return; memset(pSess , 0 , sizeof(MGC_SESS_REC)); pSess->status = MGC_SESS_STATUS_IDLE; pSess->id = id; return; } void mgc_sess_init(void) { MGC_SESS_REC *pSess; int i; for(i=0 ; istatus = status; } MGC_SESS_STATUS mgc_sess_get_status(MGC_SESS_REC *pSess) { if(pSess == NULL) return MGC_SESS_STATUS_UNDEF; return pSess->status; } MGC_SESS_REC *mgc_sess_get_unused(void) { int i; MGC_SESS_REC *pSess; for(i=0 ; ichnl , chnl) == FALSE) continue; return pSess; } return NULL; } BOOL mgc_sess_rec_chnl(MGC_SESS_REC *pSess ,CHNL chnl) { if(pSess == NULL) return FALSE; memcpy(&pSess->chnl , &chnl , sizeof(CHNL)); mgc_sess_set_status(pSess,MGC_SESS_STATUS_USED); return TRUE; } BOOL mgc_sess_rec_org_and_dst_chnl(CHNL orgChnl , CHNL destChnl) { MGC_SESS_REC *pOrgSess, *pDestSess; pOrgSess = mgc_sess_is_already_rec(orgChnl); pDestSess = mgc_sess_is_already_rec(destChnl); if(pOrgSess == NULL) { pOrgSess = mgc_sess_get_unused(); if(pOrgSess == NULL) return FALSE; } mgc_sess_rec_chnl(pOrgSess, orgChnl); if(pDestSess == NULL) { pDestSess = mgc_sess_get_unused(); if(pDestSess == NULL) return FALSE; } mgc_sess_rec_chnl(pDestSess, destChnl); return TRUE; } BOOL mgc_sess_is_media_info_same(MGC_SDP_TAG *pSdpTag , PUB_SDP_MSG *pSdp) { if((pSdpTag == NULL)||(pSdp == NULL)) return FALSE; if(pSdpTag->m.m.port != pSdp->medias.medias[0].m.port) return FALSE; if(strcmp(pSdpTag->c.addr , pSdp->c.addr) != 0) return FALSE; if(pSdpTag->m.m.payloads[0] != pSdp->medias.medias[0].m.payloads[0]) return FALSE; return TRUE; } BOOL mgc_sess_is_chnl_need_update(CHNL chnl, MGCP_PARA *pPara) { PUB_SDP_MSG *pSdp; MGC_SDP_TAG *pSdpTag; MGC_SESS_REC *pSess; pSess = mgc_sess_is_already_rec(chnl); if((pSess == NULL)||(pPara == NULL)) return TRUE; pSdp = &pPara->sdp; pSdpTag = &pSess->sdpTag; if(pSdpTag->mode!= pPara->m.mode) { pSdpTag->mode = pPara->m.mode; memcpy(&pSdpTag->c, &pSdp->c , sizeof(PUB_SDP_C)); memcpy(&pSdpTag->m, &(pSdp->medias.medias[0]) , sizeof(PUB_SDP_MEDIA)); return TRUE; } if((pPara->flag & MGCP_PARA_FLAG_SDP) != MGCP_PARA_FLAG_SDP) return TRUE; if(mgc_sess_is_media_info_same(&pSess->sdpTag , &(pPara->sdp)) == TRUE) { return FALSE; } pSdpTag->mode = pPara->m.mode; memcpy(&pSdpTag->c, &pSdp->c , sizeof(PUB_SDP_C)); memcpy(&pSdpTag->m, &(pSdp->medias.medias[0]) , sizeof(PUB_SDP_MEDIA)); return TRUE; }