Ticket #679: ticket679.patch

File ticket679.patch, 4.1 KB (added by nanang, 15 years ago)

Added support for generic session lines.

  • pjmedia/include/pjmedia/sdp.h

     
    6464#   define PJMEDIA_MAX_SDP_MEDIA        16 
    6565#endif 
    6666 
     67/** 
     68 * The PJMEDIA_MAX_SDP_GEN_LINE macro defines maximum SDP generic lines in a 
     69 * SDP session descriptor. 
     70 */ 
     71#ifndef PJMEDIA_MAX_SDP_GEN_LINE 
     72#   define PJMEDIA_MAX_SDP_GEN_LINE     8 
     73#endif 
    6774 
     75 
    6876/* ************************************************************************** 
    6977 * SDP ATTRIBUTES 
    7078 *************************************************************************** 
     
    535543 **************************************************************************** 
    536544 */ 
    537545 
     546/** 
     547 * This structure describes generic SDP line description. 
     548 */ 
     549typedef struct pjmedia_sdp_gen_line 
     550{ 
     551    char        type;               /**< SDP line type.                 */ 
     552    pj_str_t    value;              /**< SDP line value.                */ 
     553} pjmedia_sdp_gen_line; 
    538554 
     555 
    539556/** 
    540557 * This structure describes SDP session description. A SDP session descriptor 
    541558 * contains complete information about a session, and normally is exchanged 
     
    570587    unsigned           media_count;             /**< Number of media.       */ 
    571588    pjmedia_sdp_media *media[PJMEDIA_MAX_SDP_MEDIA];    /**< Media array.   */ 
    572589 
     590    unsigned           generic_count;           /**< Number of generic lines*/ 
     591    pjmedia_sdp_gen_line *generic[PJMEDIA_MAX_SDP_GEN_LINE];  
     592                                                /**< Generic lines array.   */ 
    573593}; 
    574594 
    575595/** 
     
    578598typedef struct pjmedia_sdp_session pjmedia_sdp_session; 
    579599 
    580600 
    581  
    582601/** 
    583602 * Parse SDP message. 
    584603 * 
  • pjmedia/src/pjmedia/sdp.c

     
    785785        p += printed; 
    786786    } 
    787787 
     788    /* Print generic lines. */ 
     789    for (i=0; i<ses->generic_count; ++i) { 
     790        if ((end-p) < 4 + ses->generic[i]->value.slen) { 
     791            return -1; 
     792        } 
     793        *p++ = (char)ses->generic[i]->type; 
     794        *p++ = '='; 
     795        pj_memcpy(p, ses->generic[i]->value.ptr, ses->generic[i]->value.slen); 
     796        p += ses->generic[i]->value.slen; 
     797        *p++ = '\r'; 
     798        *p++ = '\n'; 
     799    } 
     800 
    788801    return p-buf; 
    789802} 
    790803 
     
    11221135                    } 
    11231136                    break; 
    11241137                default: 
    1125                     if (cur_name >= 'a' && cur_name <= 'z') 
     1138                    if (cur_name >= 'a' && cur_name <= 'z') { 
    11261139                        parse_generic_line(&scanner, &dummy, &ctx); 
    1127                     else  { 
     1140                        if (session->generic_count < PJMEDIA_MAX_SDP_GEN_LINE) 
     1141                        { 
     1142                            pjmedia_sdp_gen_line *gen; 
     1143 
     1144                            gen = PJ_POOL_ALLOC_T(pool, pjmedia_sdp_gen_line); 
     1145                            gen->type = (char)cur_name; 
     1146                            gen->value = dummy; 
     1147                            session->generic[session->generic_count++] = gen; 
     1148                        } 
     1149                    } else { 
    11281150                        ctx.last_error = PJMEDIA_SDP_EINSDP; 
    11291151                        on_scanner_error(&scanner); 
    11301152                    } 
     
    12131235        sess->media[i] = pjmedia_sdp_media_clone(pool, rhs->media[i]); 
    12141236    } 
    12151237 
     1238    /* Duplicate generic lines. */ 
     1239    sess->generic_count = rhs->generic_count; 
     1240    for (i=0; i<rhs->generic_count; ++i) { 
     1241        pjmedia_sdp_gen_line *gen; 
     1242 
     1243        gen = PJ_POOL_ALLOC_T(pool, pjmedia_sdp_gen_line); 
     1244        gen->type = rhs->generic[i]->type; 
     1245        pj_strdup(pool, &gen->value, &rhs->generic[i]->value); 
     1246        sess->generic[i] = gen; 
     1247    } 
     1248 
    12161249    return sess; 
    12171250} 
    12181251 
  • pjmedia/src/pjmedia/sdp_cmp.c

     
    285285            return status; 
    286286    } 
    287287 
     288    /* Compare generic lines. */ 
     289    if (sd1->generic_count != sd2->generic_count) 
     290        return PJMEDIA_SDP_ESESSNOTEQUAL; 
     291 
     292    for (i=0; i<sd1->generic_count; ++i) { 
     293        unsigned j; 
     294        pj_bool_t match = PJ_FALSE; 
     295 
     296        for (j=0; j<sd2->generic_count && !match; ++j) { 
     297            if (sd1->generic[i]->type == sd2->generic[j]->type) { 
     298                if (pj_strcmp(&sd1->generic[i]->value,  
     299                    &sd2->generic[j]->value) == 0) 
     300                    match = PJ_TRUE; 
     301                else 
     302                    return PJMEDIA_SDP_ESESSNOTEQUAL; 
     303            } 
     304        } 
     305 
     306        if (!match) 
     307            return PJMEDIA_SDP_ESESSNOTEQUAL; 
     308    } 
     309 
    288310    /* Looks equal. */ 
    289311    return PJ_SUCCESS; 
    290312}