/* Compare media descriptor */ PJ_DEF(pj_status_t) pjmedia_sdp_media_cmp( const pjmedia_sdp_media *sd1, const pjmedia_sdp_media *sd2, unsigned option) { unsigned i; pj_status_t status; PJ_ASSERT_RETURN(sd1 && sd2 && option==0, PJ_EINVAL); PJ_UNUSED_ARG(option); /* Compare media type. */ if (pj_strcmp(&sd1->desc.media, &sd2->desc.media) != 0) return PJMEDIA_SDP_EMEDIANOTEQUAL; /* Compare port number. */ if (sd1->desc.port != sd2->desc.port) return PJMEDIA_SDP_EPORTNOTEQUAL; /* Compare port count. */ if (sd1->desc.port_count != sd2->desc.port_count) return PJMEDIA_SDP_EPORTNOTEQUAL; /* Compare transports. */ if (pj_strcmp(&sd1->desc.transport, &sd2->desc.transport) != 0) return PJMEDIA_SDP_ETPORTNOTEQUAL; /* For zeroed port media, stop comparing here */ if (sd1->desc.port == 0) return PJ_SUCCESS; /* Compare number of formats. */ if (sd1->desc.fmt_count != sd2->desc.fmt_count) return PJMEDIA_SDP_EFORMATNOTEQUAL; /* Compare formats, in order. */ for (i=0; i<sd1->desc.fmt_count; ++i) { if (pj_strcmp(&sd1->desc.fmt[i], &sd2->desc.fmt[i]) != 0) return PJMEDIA_SDP_EFORMATNOTEQUAL; } /* Compare connection line, if they exist. */ if (sd1->conn) { if (!sd2->conn) return PJMEDIA_SDP_EMEDIANOTEQUAL; status = compare_conn(sd1->conn, sd2->conn); } else { if (sd2->conn) return PJMEDIA_SDP_EMEDIANOTEQUAL; } /* Compare attributes. */ status = compare_attr(sd1->attr_count, sd1->attr, sd2->attr_count, sd2->attr); if (status != PJ_SUCCESS) return status; /* Looks equal */ return PJ_SUCCESS; }
PJ_DEF(pj_status_t) pjmedia_sdp_conn_cmp(const pjmedia_sdp_conn *conn1, const pjmedia_sdp_conn *conn2, unsigned option) { PJ_UNUSED_ARG(option); return compare_conn(conn1, conn2); }
/* * Compare two SDP session for equality. */ PJ_DEF(pj_status_t) pjmedia_sdp_session_cmp( int inst_id, const pjmedia_sdp_session *sd1, const pjmedia_sdp_session *sd2, unsigned option) { unsigned i; pj_status_t status; PJ_ASSERT_RETURN(sd1 && sd2 && option==0, PJ_EINVAL); PJ_UNUSED_ARG(option); /* Compare the origin line. */ if (pj_strcmp(&sd1->origin.user, &sd2->origin.user) != 0) return PJMEDIA_SDP_EORIGINNOTEQUAL; if (sd1->origin.id != sd2->origin.id) return PJMEDIA_SDP_EORIGINNOTEQUAL; if (sd1->origin.version != sd2->origin.version) return PJMEDIA_SDP_EORIGINNOTEQUAL; if (pj_strcmp(&sd1->origin.net_type, &sd2->origin.net_type) != 0) return PJMEDIA_SDP_EORIGINNOTEQUAL; if (pj_strcmp(&sd1->origin.addr_type, &sd2->origin.addr_type) != 0) return PJMEDIA_SDP_EORIGINNOTEQUAL; if (pj_strcmp(&sd1->origin.addr, &sd2->origin.addr) != 0) return PJMEDIA_SDP_EORIGINNOTEQUAL; /* Compare the subject line. */ if (pj_strcmp(&sd1->name, &sd2->name) != 0) return PJMEDIA_SDP_ENAMENOTEQUAL; /* Compare connection line, when they exist */ if (sd1->conn) { if (!sd2->conn) return PJMEDIA_SDP_ECONNNOTEQUAL; status = compare_conn(sd1->conn, sd2->conn); if (status != PJ_SUCCESS) return status; } else { if (sd2->conn) return PJMEDIA_SDP_ECONNNOTEQUAL; } /* Compare time line. */ if (sd1->time.start != sd2->time.start) return PJMEDIA_SDP_ETIMENOTEQUAL; if (sd1->time.stop != sd2->time.stop) return PJMEDIA_SDP_ETIMENOTEQUAL; /* Compare attributes. */ status = compare_attr(inst_id, sd1->attr_count, sd1->attr, sd2->attr_count, sd2->attr); if (status != PJ_SUCCESS) return status; /* Compare media lines. */ if (sd1->media_count != sd2->media_count) return PJMEDIA_SDP_EMEDIANOTEQUAL; for (i=0; i<sd1->media_count; ++i) { status = pjmedia_sdp_media_cmp(inst_id, sd1->media[i], sd2->media[i], 0); if (status != PJ_SUCCESS) return status; } /* Looks equal. */ return PJ_SUCCESS; }