Ignore:
Timestamp:
Feb 7, 2006 12:34:58 PM (18 years ago)
Author:
bennylp
Message:

Added STATE_REMOTE_OFFER state in negotiator

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/sdp_neg.c

    r129 r140  
    7878PJ_DEF(pj_status_t)  
    7979pjmedia_sdp_neg_create_w_remote_offer(pj_pool_t *pool, 
    80                                       const pjmedia_sdp_session *local, 
     80                                      const pjmedia_sdp_session *initial, 
    8181                                      const pjmedia_sdp_session *remote, 
    8282                                      pjmedia_sdp_neg **p_neg) 
     
    8686 
    8787    /* Check arguments are valid. */ 
    88     PJ_ASSERT_RETURN(pool && local && remote && p_neg, PJ_EINVAL); 
     88    PJ_ASSERT_RETURN(pool && remote && p_neg, PJ_EINVAL); 
    8989 
    9090    *p_neg = NULL; 
    9191 
    92     /* Validate remote offer and local answer */ 
     92    /* Validate remote offer and initial answer */ 
    9393    status = pjmedia_sdp_validate(remote); 
    9494    if (status != PJ_SUCCESS) 
    9595        return status; 
    96     PJ_ASSERT_RETURN((status=pjmedia_sdp_validate(local))==PJ_SUCCESS, status); 
    9796 
    9897    /* Create and initialize negotiator. */ 
     
    10099    PJ_ASSERT_RETURN(neg != NULL, PJ_ENOMEM); 
    101100 
    102     neg->state = PJMEDIA_SDP_NEG_STATE_WAIT_NEGO; 
    103     neg->initial_sdp = pjmedia_sdp_session_clone(pool, local); 
    104     PJ_ASSERT_RETURN((status=pjmedia_sdp_validate(neg->initial_sdp))==PJ_SUCCESS, 
    105                      status); 
    106  
    107     neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, local); 
    108101    neg->neg_remote_sdp = pjmedia_sdp_session_clone(pool, remote); 
    109     PJ_ASSERT_RETURN((status=pjmedia_sdp_validate(neg->neg_remote_sdp))==PJ_SUCCESS, 
    110                       status); 
     102 
     103    if (initial) { 
     104        PJ_ASSERT_RETURN((status=pjmedia_sdp_validate(initial))==PJ_SUCCESS,  
     105                         status); 
     106 
     107        neg->initial_sdp = pjmedia_sdp_session_clone(pool, initial); 
     108        neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, initial); 
     109 
     110        neg->state = PJMEDIA_SDP_NEG_STATE_WAIT_NEGO; 
     111 
     112    } else { 
     113         
     114        neg->state = PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER; 
     115 
     116    } 
    111117 
    112118    *p_neg = neg; 
     
    127133 
    128134PJ_DEF(pj_status_t)  
    129 pjmedia_sdp_neg_get_local( pjmedia_sdp_neg *neg, 
    130                            const pjmedia_sdp_session **local) 
     135pjmedia_sdp_neg_get_active_local( pjmedia_sdp_neg *neg, 
     136                                  const pjmedia_sdp_session **local) 
    131137{ 
    132138    PJ_ASSERT_RETURN(neg && local, PJ_EINVAL); 
     
    139145 
    140146PJ_DEF(pj_status_t)  
    141 pjmedia_sdp_neg_get_remote( pjmedia_sdp_neg *neg, 
    142                             const pjmedia_sdp_session **remote) 
     147pjmedia_sdp_neg_get_active_remote( pjmedia_sdp_neg *neg, 
     148                                   const pjmedia_sdp_session **remote) 
    143149{ 
    144150    PJ_ASSERT_RETURN(neg && remote, PJ_EINVAL); 
     
    146152 
    147153    *remote = neg->active_remote_sdp; 
     154    return PJ_SUCCESS; 
     155} 
     156 
     157PJ_DEF(pj_status_t) 
     158pjmedia_sdp_neg_get_neg_remote( pjmedia_sdp_neg *neg, 
     159                                const pjmedia_sdp_session **remote) 
     160{ 
     161    PJ_ASSERT_RETURN(neg && remote, PJ_EINVAL); 
     162    PJ_ASSERT_RETURN(neg->neg_remote_sdp, PJMEDIA_SDPNEG_ENONEG); 
     163 
     164    *remote = neg->neg_remote_sdp; 
     165    return PJ_SUCCESS; 
     166} 
     167 
     168PJ_DEF(pj_status_t)  
     169pjmedia_sdp_neg_get_neg_local( pjmedia_sdp_neg *neg, 
     170                               const pjmedia_sdp_session **local) 
     171{ 
     172    PJ_ASSERT_RETURN(neg && local, PJ_EINVAL); 
     173    PJ_ASSERT_RETURN(neg->neg_local_sdp, PJMEDIA_SDPNEG_ENONEG); 
     174 
     175    *local = neg->neg_local_sdp; 
    148176    return PJ_SUCCESS; 
    149177} 
     
    175203 
    176204PJ_DEF(pj_status_t)  
    177 pjmedia_sdp_neg_tx_local_offer( pj_pool_t *pool, 
    178                                 pjmedia_sdp_neg *neg, 
    179                                 const pjmedia_sdp_session **offer) 
     205pjmedia_sdp_neg_send_local_offer( pj_pool_t *pool, 
     206                                  pjmedia_sdp_neg *neg, 
     207                                  const pjmedia_sdp_session **offer) 
    180208{ 
    181209    /* Check arguments are valid. */ 
     
    211239 
    212240PJ_DEF(pj_status_t)  
    213 pjmedia_sdp_neg_rx_remote_offer( pj_pool_t *pool, 
    214                                  pjmedia_sdp_neg *neg, 
    215                                  const pjmedia_sdp_session *remote) 
     241pjmedia_sdp_neg_set_remote_answer( pj_pool_t *pool, 
     242                                   pjmedia_sdp_neg *neg, 
     243                                   const pjmedia_sdp_session *remote) 
     244{ 
     245    /* Check arguments are valid. */ 
     246    PJ_ASSERT_RETURN(pool && neg && remote, PJ_EINVAL); 
     247 
     248    /* Can only do this in STATE_LOCAL_OFFER. 
     249     * If we haven't provided local offer, then rx_remote_offer() should 
     250     * be called instead of this function. 
     251     */ 
     252    PJ_ASSERT_RETURN(neg->state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER,  
     253                     PJMEDIA_SDPNEG_EINSTATE); 
     254 
     255    /* We're ready to negotiate. */ 
     256    neg->state = PJMEDIA_SDP_NEG_STATE_WAIT_NEGO; 
     257    neg->has_remote_answer = 1; 
     258    neg->neg_remote_sdp = pjmedia_sdp_session_clone(pool, remote); 
     259  
     260    return PJ_SUCCESS; 
     261} 
     262 
     263PJ_DEF(pj_status_t)  
     264pjmedia_sdp_neg_set_remote_offer( pj_pool_t *pool, 
     265                                  pjmedia_sdp_neg *neg, 
     266                                  const pjmedia_sdp_session *remote) 
    216267{ 
    217268    /* Check arguments are valid. */ 
     
    225276                     PJMEDIA_SDPNEG_EINSTATE); 
    226277 
    227     /* We're ready to negotiate. */ 
    228     neg->state = PJMEDIA_SDP_NEG_STATE_WAIT_NEGO; 
     278    /* State now is STATE_REMOTE_OFFER. */ 
     279    neg->state = PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER; 
    229280    neg->neg_remote_sdp = pjmedia_sdp_session_clone(pool, remote); 
    230281 
     
    233284 
    234285PJ_DEF(pj_status_t)  
    235 pjmedia_sdp_neg_rx_remote_answer( pj_pool_t *pool, 
     286pjmedia_sdp_neg_set_local_answer( pj_pool_t *pool, 
    236287                                  pjmedia_sdp_neg *neg, 
    237                                   const pjmedia_sdp_session *remote) 
     288                                  const pjmedia_sdp_session *local) 
    238289{ 
    239290    /* Check arguments are valid. */ 
    240     PJ_ASSERT_RETURN(pool && neg && remote, PJ_EINVAL); 
    241  
    242     /* Can only do this in STATE_LOCAL_OFFER. 
    243      * If we haven't provided local offer, then rx_remote_offer() should 
     291    PJ_ASSERT_RETURN(pool && neg && local, PJ_EINVAL); 
     292 
     293    /* Can only do this in STATE_REMOTE_OFFER. 
     294     * If we already provide local offer, then rx_remote_answer() should 
    244295     * be called instead of this function. 
    245296     */ 
    246     PJ_ASSERT_RETURN(neg->state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER,  
     297    PJ_ASSERT_RETURN(neg->state == PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER,  
    247298                     PJMEDIA_SDPNEG_EINSTATE); 
    248299 
    249     /* We're ready to negotiate. */ 
     300    /* State now is STATE_WAIT_NEGO. */ 
    250301    neg->state = PJMEDIA_SDP_NEG_STATE_WAIT_NEGO; 
    251     neg->has_remote_answer = 1; 
    252     neg->neg_remote_sdp = pjmedia_sdp_session_clone(pool, remote); 
    253   
     302    if (local) 
     303        neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, local); 
     304    else { 
     305        PJ_ASSERT_RETURN(neg->initial_sdp, PJMEDIA_SDPNEG_ENOINITIAL); 
     306        neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, neg->initial_sdp); 
     307    } 
     308 
    254309    return PJ_SUCCESS; 
    255310} 
     
    464519{ 
    465520    unsigned mi; 
     521    pj_bool_t has_active = PJ_FALSE; 
    466522    pj_status_t status; 
    467523 
     
    479535        if (status != PJ_SUCCESS) 
    480536            return status; 
     537 
     538        if (offer->media[mi]->desc.port != 0) 
     539            has_active = PJ_TRUE; 
    481540    } 
    482541 
    483542    *p_active = offer; 
    484     return PJ_SUCCESS; 
     543 
     544    return has_active ? PJ_SUCCESS : PJMEDIA_SDPNEG_ENOMEDIA; 
    485545} 
    486546 
     
    675735{ 
    676736    pj_status_t status; 
     737    pj_bool_t has_active = PJ_FALSE; 
    677738    pjmedia_sdp_session *answer; 
    678739    char media_used[PJSDP_MAX_MEDIA]; 
     
    749810        /* Add the media answer */ 
    750811        answer->media[answer->media_count++] = am; 
     812 
     813        /* Check if this media is active.*/ 
     814        if (am->desc.port != 0) 
     815            has_active = PJ_TRUE; 
    751816    } 
    752817 
    753818    *p_answer = answer; 
    754     return PJ_SUCCESS; 
     819 
     820    return has_active ? PJ_SUCCESS : PJMEDIA_SDPNEG_ENOMEDIA; 
    755821} 
    756822 
     
    785851        pjmedia_sdp_session *answer; 
    786852 
    787         status = create_answer(pool, neg->initial_sdp, neg->neg_remote_sdp, 
     853        status = create_answer(pool, neg->neg_local_sdp, neg->neg_remote_sdp, 
    788854                               &answer); 
    789855        if (status == PJ_SUCCESS) { 
Note: See TracChangeset for help on using the changeset viewer.