Ignore:
Timestamp:
Nov 29, 2013 5:56:02 AM (8 years ago)
Author:
ming
Message:

Re #1519: Add Call API in pjsua2.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/pjsua2/pjsip/src/pjsua2/endpoint.cpp

    r4662 r4663  
    2626using namespace std; 
    2727 
     28#include <pjsua2/account.hpp> 
     29#include <pjsua2/call.hpp> 
     30 
    2831#define THIS_FILE               "endpoint.cpp" 
    2932#define MAX_STUN_SERVERS        32 
     
    695698} 
    696699 
     700// Call callbacks 
     701void Endpoint::on_call_state(pjsua_call_id call_id, pjsip_event *e) 
     702{ 
     703    Call *call = Call::lookup(call_id); 
     704    if (!call) { 
     705        return; 
     706    } 
     707     
     708    OnCallStateParam prm; 
     709    prm.e.fromPj(*e); 
     710     
     711    call->onCallState(prm); 
     712    /* If the state is DISCONNECTED, call may have already been deleted 
     713     * by the application in the callback, so do not access it anymore here. 
     714     */ 
     715} 
     716 
     717void Endpoint::on_call_tsx_state(pjsua_call_id call_id, 
     718                                 pjsip_transaction *tsx, 
     719                                 pjsip_event *e) 
     720{ 
     721    Call *call = Call::lookup(call_id); 
     722    if (!call) { 
     723        return; 
     724    } 
     725     
     726    OnCallTsxStateParam prm; 
     727    prm.e.fromPj(*e); 
     728     
     729    call->onCallTsxState(prm); 
     730} 
     731 
     732void Endpoint::on_call_media_state(pjsua_call_id call_id) 
     733{ 
     734    Call *call = Call::lookup(call_id); 
     735    if (!call) { 
     736        return; 
     737    } 
     738     
     739    OnCallMediaStateParam prm; 
     740    call->onCallMediaState(prm); 
     741} 
     742 
     743void Endpoint::on_call_sdp_created(pjsua_call_id call_id, 
     744                                   pjmedia_sdp_session *sdp, 
     745                                   pj_pool_t *pool, 
     746                                   const pjmedia_sdp_session *rem_sdp) 
     747{ 
     748    Call *call = Call::lookup(call_id); 
     749    if (!call) { 
     750        return; 
     751    } 
     752     
     753    OnCallSdpCreatedParam prm; 
     754    string orig_sdp; 
     755     
     756    prm.sdp.fromPj(*sdp); 
     757    orig_sdp = prm.sdp.wholeSdp; 
     758    if (rem_sdp) 
     759        prm.remSdp.fromPj(*rem_sdp); 
     760     
     761    call->onCallSdpCreated(prm); 
     762     
     763    /* Check if application modifies the SDP */ 
     764    if (orig_sdp != prm.sdp.wholeSdp) { 
     765        pjmedia_sdp_parse(pool, (char*)prm.sdp.wholeSdp.c_str(), 
     766                          prm.sdp.wholeSdp.size(), &sdp); 
     767    } 
     768} 
     769 
     770void Endpoint::on_stream_created(pjsua_call_id call_id, 
     771                                 pjmedia_stream *strm, 
     772                                 unsigned stream_idx, 
     773                                 pjmedia_port **p_port) 
     774{ 
     775    Call *call = Call::lookup(call_id); 
     776    if (!call) { 
     777        return; 
     778    } 
     779     
     780    OnStreamCreatedParam prm; 
     781    prm.stream = strm; 
     782    prm.streamIdx = stream_idx; 
     783    prm.pPort = (void *)*p_port; 
     784     
     785    call->onStreamCreated(prm); 
     786     
     787    if (prm.pPort != (void *)*p_port) 
     788        *p_port = (pjmedia_port *)prm.pPort; 
     789} 
     790 
     791void Endpoint::on_stream_destroyed(pjsua_call_id call_id, 
     792                                   pjmedia_stream *strm, 
     793                                   unsigned stream_idx) 
     794{ 
     795    Call *call = Call::lookup(call_id); 
     796    if (!call) { 
     797        return; 
     798    } 
     799     
     800    OnStreamDestroyedParam prm; 
     801    prm.stream = strm; 
     802    prm.streamIdx = stream_idx; 
     803     
     804    call->onStreamDestroyed(prm); 
     805} 
     806 
     807void Endpoint::on_dtmf_digit(pjsua_call_id call_id, int digit) 
     808{ 
     809    Call *call = Call::lookup(call_id); 
     810    if (!call) { 
     811        return; 
     812    } 
     813     
     814    OnDtmfDigitParam prm; 
     815    char buf[10]; 
     816    pj_ansi_sprintf(buf, "%c", digit); 
     817    prm.digit = (string)buf; 
     818     
     819    call->onDtmfDigit(prm); 
     820} 
     821 
     822void Endpoint::on_call_transfer_request2(pjsua_call_id call_id, 
     823                                         const pj_str_t *dst, 
     824                                         pjsip_status_code *code, 
     825                                         pjsua_call_setting *opt) 
     826{ 
     827    Call *call = Call::lookup(call_id); 
     828    if (!call) { 
     829        return; 
     830    } 
     831     
     832    OnCallTransferRequestParam prm; 
     833    prm.dstUri = pj2Str(*dst); 
     834    prm.statusCode = *code; 
     835    prm.opt.fromPj(*opt); 
     836     
     837    call->onCallTransferRequest(prm); 
     838     
     839    *code = prm.statusCode; 
     840    *opt = prm.opt.toPj(); 
     841} 
     842 
     843void Endpoint::on_call_transfer_status(pjsua_call_id call_id, 
     844                                       int st_code, 
     845                                       const pj_str_t *st_text, 
     846                                       pj_bool_t final, 
     847                                       pj_bool_t *p_cont) 
     848{ 
     849    Call *call = Call::lookup(call_id); 
     850    if (!call) { 
     851        return; 
     852    } 
     853     
     854    OnCallTransferStatusParam prm; 
     855    prm.statusCode = (pjsip_status_code)st_code; 
     856    prm.reason = pj2Str(*st_text); 
     857    prm.finalNotify = final; 
     858    prm.cont = *p_cont; 
     859     
     860    call->onCallTransferStatus(prm); 
     861     
     862    *p_cont = prm.cont; 
     863} 
     864 
     865void Endpoint::on_call_replace_request2(pjsua_call_id call_id, 
     866                                        pjsip_rx_data *rdata, 
     867                                        int *st_code, 
     868                                        pj_str_t *st_text, 
     869                                        pjsua_call_setting *opt) 
     870{ 
     871    Call *call = Call::lookup(call_id); 
     872    if (!call) { 
     873        return; 
     874    } 
     875     
     876    OnCallReplaceRequestParam prm; 
     877    prm.rdata.fromPj(*rdata); 
     878    prm.statusCode = (pjsip_status_code)*st_code; 
     879    prm.reason = pj2Str(*st_text); 
     880    prm.opt.fromPj(*opt); 
     881     
     882    call->onCallReplaceRequest(prm); 
     883     
     884    *st_code = prm.statusCode; 
     885    *st_text = str2Pj(prm.reason); 
     886    *opt = prm.opt.toPj(); 
     887} 
     888 
     889void Endpoint::on_call_replaced(pjsua_call_id old_call_id, 
     890                                pjsua_call_id new_call_id) 
     891{ 
     892    Call *call = Call::lookup(old_call_id); 
     893    if (!call) { 
     894        return; 
     895    } 
     896     
     897    OnCallReplacedParam prm; 
     898    prm.newCallId = new_call_id; 
     899     
     900    call->onCallReplaced(prm); 
     901} 
     902 
     903void Endpoint::on_call_rx_offer(pjsua_call_id call_id, 
     904                                const pjmedia_sdp_session *offer, 
     905                                void *reserved, 
     906                                pjsip_status_code *code, 
     907                                pjsua_call_setting *opt) 
     908{ 
     909    Call *call = Call::lookup(call_id); 
     910    if (!call) { 
     911        return; 
     912    } 
     913     
     914    OnCallRxOfferParam prm; 
     915    prm.offer.fromPj(*offer); 
     916    prm.statusCode = *code; 
     917    prm.opt.fromPj(*opt); 
     918     
     919    call->onCallRxOffer(prm); 
     920     
     921    *code = prm.statusCode; 
     922    *opt = prm.opt.toPj(); 
     923} 
     924 
     925pjsip_redirect_op Endpoint::on_call_redirected(pjsua_call_id call_id, 
     926                                               const pjsip_uri *target, 
     927                                               const pjsip_event *e) 
     928{ 
     929    Call *call = Call::lookup(call_id); 
     930    if (!call) { 
     931        return PJSIP_REDIRECT_STOP; 
     932    } 
     933     
     934    OnCallRedirectedParam prm; 
     935    char uristr[PJSIP_MAX_URL_SIZE]; 
     936    int len = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, target, uristr, 
     937                              sizeof(uristr)); 
     938    if (len < 1) { 
     939        pj_ansi_strcpy(uristr, "--URI too long--"); 
     940    } 
     941    prm.targetUri = string(uristr); 
     942    if (e) 
     943        prm.e.fromPj(*e); 
     944    else 
     945        prm.e.type = PJSIP_EVENT_UNKNOWN; 
     946     
     947    return call->onCallRedirected(prm); 
     948} 
     949 
     950pj_status_t 
     951Endpoint::on_call_media_transport_state(pjsua_call_id call_id, 
     952                                        const pjsua_med_tp_state_info *info) 
     953{ 
     954    Call *call = Call::lookup(call_id); 
     955    if (!call) { 
     956        return PJ_SUCCESS; 
     957    } 
     958     
     959    OnCallMediaTransportStateParam prm; 
     960    prm.medIdx = info->med_idx; 
     961    prm.state = info->state; 
     962    prm.status = info->status; 
     963    prm.sipErrorCode = info->sip_err_code; 
     964     
     965    call->onCallMediaTransportState(prm); 
     966     
     967    return PJ_SUCCESS; 
     968} 
     969 
     970void Endpoint::on_call_media_event(pjsua_call_id call_id, 
     971                                   unsigned med_idx, 
     972                                   pjmedia_event *event) 
     973{ 
     974    Call *call = Call::lookup(call_id); 
     975    if (!call) { 
     976        return; 
     977    } 
     978     
     979    OnCallMediaEventParam prm; 
     980    prm.medIdx = med_idx; 
     981    prm.ev.fromPj(*event); 
     982     
     983    call->onCallMediaEvent(prm); 
     984} 
     985 
     986pjmedia_transport* 
     987Endpoint::on_create_media_transport(pjsua_call_id call_id, 
     988                                    unsigned media_idx, 
     989                                    pjmedia_transport *base_tp, 
     990                                    unsigned flags) 
     991{ 
     992    Call *call = Call::lookup(call_id); 
     993    if (!call) { 
     994        return base_tp; 
     995    } 
     996     
     997    OnCreateMediaTransportParam prm; 
     998    prm.mediaIdx = media_idx; 
     999    prm.mediaTp = base_tp; 
     1000    prm.flags = flags; 
     1001     
     1002    call->onCreateMediaTransport(prm); 
     1003     
     1004    return (pjmedia_transport *)prm.mediaTp; 
     1005} 
    6971006 
    6981007/////////////////////////////////////////////////////////////////////////////// 
     
    7531062    ua_cfg.cb.on_buddy_state    = &Endpoint::on_buddy_state; 
    7541063 
     1064    /* Call callbacks */ 
     1065    ua_cfg.cb.on_call_state             = &Endpoint::on_call_state; 
     1066    ua_cfg.cb.on_call_tsx_state         = &Endpoint::on_call_tsx_state; 
     1067    ua_cfg.cb.on_call_media_state       = &Endpoint::on_call_media_state; 
     1068    ua_cfg.cb.on_call_sdp_created       = &Endpoint::on_call_sdp_created; 
     1069    ua_cfg.cb.on_stream_created         = &Endpoint::on_stream_created; 
     1070    ua_cfg.cb.on_stream_destroyed       = &Endpoint::on_stream_destroyed; 
     1071    ua_cfg.cb.on_dtmf_digit             = &Endpoint::on_dtmf_digit; 
     1072    ua_cfg.cb.on_call_transfer_request2 = &Endpoint::on_call_transfer_request2; 
     1073    ua_cfg.cb.on_call_transfer_status   = &Endpoint::on_call_transfer_status; 
     1074    ua_cfg.cb.on_call_replace_request2  = &Endpoint::on_call_replace_request2; 
     1075    ua_cfg.cb.on_call_replaced          = &Endpoint::on_call_replaced; 
     1076    ua_cfg.cb.on_call_rx_offer          = &Endpoint::on_call_rx_offer; 
     1077    ua_cfg.cb.on_call_redirected        = &Endpoint::on_call_redirected; 
     1078    ua_cfg.cb.on_call_media_transport_state = 
     1079        &Endpoint::on_call_media_transport_state; 
     1080    ua_cfg.cb.on_call_media_event       = &Endpoint::on_call_media_event; 
     1081    ua_cfg.cb.on_create_media_transport = &Endpoint::on_create_media_transport; 
     1082 
    7551083    /* Init! */ 
    7561084    PJSUA2_CHECK_EXPR( pjsua_init(&ua_cfg, &log_cfg, &med_cfg) ); 
     
    9771305 
    9781306/////////////////////////////////////////////////////////////////////////////// 
    979  
     1307/* 
     1308 * Call operations 
     1309 */ 
     1310 
     1311void Endpoint::hangupAllCalls(void) 
     1312{ 
     1313    pjsua_call_hangup_all(); 
     1314} 
     1315 
     1316/////////////////////////////////////////////////////////////////////////////// 
    9801317/* 
    9811318 * Media API 
Note: See TracChangeset for help on using the changeset viewer.