Changeset 492 for pjproject/trunk


Ignore:
Timestamp:
Jun 6, 2006 6:40:40 PM (18 years ago)
Author:
bennylp
Message:

Another huge chunks of modifications in PJSUA API, too many things to mention!

Location:
pjproject/trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/build/pjmedia.dsp

    r458 r492  
    304304# Begin Source File 
    305305 
     306SOURCE=..\include\pjmedia\splitcomb.h 
     307# End Source File 
     308# Begin Source File 
     309 
    306310SOURCE=..\include\pjmedia\stream.h 
    307311# End Source File 
  • pjproject/trunk/pjmedia/include/pjmedia/conference.h

    r347 r492  
    4747    pj_bool_t          *listener;           /**< Array of listeners.        */ 
    4848    unsigned            clock_rate;         /**< Clock rate of the port.    */ 
     49    unsigned            channel_count;      /**< Number of channels.        */ 
    4950    unsigned            samples_per_frame;  /**< Samples per frame          */ 
     51    unsigned            bits_per_sample;    /**< Bits per sample.           */ 
    5052    int                 tx_adj_level;       /**< Tx level adjustment.       */ 
    5153    int                 rx_adj_level;       /**< Rx level adjustment.       */ 
     
    255257 
    256258/** 
     259 * Enumerate occupied ports in the bridge. 
     260 * 
     261 * @param conf          The conference bridge. 
     262 * @param ports         Array of port numbers to be filled in. 
     263 * @param count         On input, specifies the maximum number of ports 
     264 *                      in the array. On return, it will be filled with 
     265 *                      the actual number of ports. 
     266 * 
     267 * @return              PJ_SUCCESS on success. 
     268 */ 
     269PJ_DECL(pj_status_t) pjmedia_conf_enum_ports( pjmedia_conf *conf, 
     270                                              unsigned ports[], 
     271                                              unsigned *count ); 
     272 
     273 
     274/** 
    257275 * Get port info. 
    258276 * 
  • pjproject/trunk/pjmedia/src/pjmedia/conference.c

    r481 r492  
    821821} 
    822822 
     823 
     824/* 
     825 * Enum ports. 
     826 */ 
     827PJ_DEF(pj_status_t) pjmedia_conf_enum_ports( pjmedia_conf *conf, 
     828                                             unsigned ports[], 
     829                                             unsigned *p_count ) 
     830{ 
     831    unsigned i, count=0; 
     832 
     833    PJ_ASSERT_RETURN(conf && p_count && ports, PJ_EINVAL); 
     834 
     835    for (i=0; i<conf->max_ports && count<*p_count; ++i) { 
     836        if (!conf->ports[i]) 
     837            continue; 
     838 
     839        ports[count++] = i; 
     840    } 
     841 
     842    *p_count = count; 
     843    return PJ_SUCCESS; 
     844} 
     845 
    823846/* 
    824847 * Get port info 
     
    844867    info->listener = conf_port->listeners; 
    845868    info->clock_rate = conf_port->clock_rate; 
     869    info->channel_count = conf->channel_count; 
    846870    info->samples_per_frame = conf_port->samples_per_frame; 
     871    info->bits_per_sample = conf->bits_per_sample; 
    847872    info->tx_adj_level = conf_port->tx_adj_level - NORMAL_LEVEL; 
    848873    info->rx_adj_level = conf_port->rx_adj_level - NORMAL_LEVEL; 
  • pjproject/trunk/pjsip-apps/src/activex-pjsua/activex-pjsua.idl

    r487 r492  
    3030                [id(10), helpstring("method call_has_media")] HRESULT call_has_media([in] int call_index, [out,retval] Pj_Bool *pRet); 
    3131                [id(11), helpstring("method call_get_info")] HRESULT call_get_info([in] int call_index, [out] Pjsua_Call_Info *pInfo, [out,retval] Pj_Status *pRet); 
    32                 [id(12), helpstring("method call_make_call")] HRESULT call_make_call([in] int acc_index, [in,string] Pj_String dst_uri, [out] int *call_index, [out,retval] Pj_Status *pRet); 
     32                [id(12), helpstring("method call_make_call")] HRESULT call_make_call([in] int acc_id, [in,string] Pj_String dst_uri, [out] int *call_index, [out,retval] Pj_Status *pRet); 
    3333                [id(13), helpstring("method call_answer")] HRESULT call_answer([in] int call_index, [in] int status_code, [out,retval] Pj_Status *pRet); 
    3434                [id(14), helpstring("method call_hangup")] HRESULT call_hangup([in] int call_index, [out,retval] Pj_Status *pRet); 
     
    4141                [id(21), helpstring("method call_hangup_all")] HRESULT call_hangup_all(); 
    4242                [id(22), helpstring("method acc_get_count")] HRESULT acc_get_count([out,retval] int *pCount); 
    43                 [id(23), helpstring("method acc_get_info")] HRESULT acc_get_info([in] int acc_index, [out] Pjsua_Acc_Info *pInfo, [out,retval] Pj_Status *pRet); 
     43                [id(23), helpstring("method acc_get_info")] HRESULT acc_get_info([in] int acc_id, [out] Pjsua_Acc_Info *pInfo, [out,retval] Pj_Status *pRet); 
    4444                [id(24), helpstring("method acc_add")] HRESULT acc_add([in] Pjsua_Acc_Config *pConfig, [out] int *pAcc_Index, [out,retval] Pj_Status *pRet); 
    45                 [id(25), helpstring("method acc_set_online_status")] HRESULT acc_set_online_status([in] int acc_index, [in] int is_online, [out,retval] Pj_Status *pRet); 
    46                 [id(26), helpstring("method acc_set_registration")] HRESULT acc_set_registration([in] int acc_index, [in] int reg_active, [out,retval] Pj_Status *pRet); 
     45                [id(25), helpstring("method acc_set_online_status")] HRESULT acc_set_online_status([in] int acc_id, [in] int is_online, [out,retval] Pj_Status *pRet); 
     46                [id(26), helpstring("method acc_set_registration")] HRESULT acc_set_registration([in] int acc_id, [in] int reg_active, [out,retval] Pj_Status *pRet); 
    4747                [id(27), helpstring("method buddy_get_count")] HRESULT buddy_get_count([out,retval] int *pCount); 
    4848                [id(28), helpstring("method buddy_get_info")] HRESULT buddy_get_info([in] int buddy_index, [out] Pjsua_Buddy_Info *pInfo, [out,retval] Pj_Status *pRet); 
    4949                [id(29), helpstring("method buddy_add")] HRESULT buddy_add([in,string] Pj_String uri, [out] int *pBuddy_Index, [out,retval] Pj_Status *pRet); 
    5050                [id(30), helpstring("method buddy_subscribe_pres")] HRESULT buddy_subscribe_pres([in] int buddy_index, [in] int subscribe, [out,retval] Pj_Status *pRet); 
    51                 [id(31), helpstring("method im_send_text")] HRESULT im_send_text([in] int acc_index, [in,string] Pj_String dst_uri, [in,string] Pj_String text, [out,retval] Pj_Status *pRet); 
    52                 [id(32), helpstring("method im_typing")] HRESULT im_typing([in] int acc_index, [in,string] Pj_URI dst_uri, [in] int is_typing, [out,retval] Pj_Status *pRet); 
     51                [id(31), helpstring("method im_send_text")] HRESULT im_send_text([in] int acc_id, [in,string] Pj_String dst_uri, [in,string] Pj_String text, [out,retval] Pj_Status *pRet); 
     52                [id(32), helpstring("method im_typing")] HRESULT im_typing([in] int acc_id, [in,string] Pj_URI dst_uri, [in] int is_typing, [out,retval] Pj_Status *pRet); 
    5353                [id(33), helpstring("method conf_connect")] HRESULT conf_connect([in] int src_port, [in] int sink_port, [out,retval] Pj_Status *pRet); 
    5454                [id(34), helpstring("method conf_disconnect")] HRESULT conf_disconnect([in] int src_port, [in] int sink_port, [out,retval] Pj_Status *pRet); 
     
    6767                [id(47), helpstring("method call_get_textstat")] HRESULT call_get_textstat([in] int call_index, [out,retval] BSTR *textstat); 
    6868                [id(48), helpstring("method app_handle_events")] HRESULT app_handle_events([in] int msec_timeout, [out,retval] int *pEvCount); 
     69                [id(49), helpstring("method app_parse_uri")] HRESULT app_parse_uri([in] BSTR uriString, [out] Pjsip_Sip_Uri *pSipUri, [out,retval] Pj_Status *pStatus); 
     70                [id(50), helpstring("method app_print_uri")] HRESULT app_print_uri([in] Pjsip_Sip_Uri *pSipURI, [in] Pjsip_Uri_Context context, [out,retval] BSTR *uriText); 
     71                [id(51), helpstring("method app_compare_uri_string")] HRESULT app_compare_uri_string([in] Pjsip_Uri_Context context, [in] BSTR uri1, [in] BSTR uri2, [out,retval] Pj_Status *pStatus); 
     72                [id(52), helpstring("method buddy_del")] HRESULT buddy_del([in] int buddy_index, [out,retval] Pj_Status *pRet); 
     73                [id(53), helpstring("method acc_del")] HRESULT acc_del([in] int acc_id, [out,retval] Pj_Status *pRet); 
     74                [id(54), helpstring("method acc_find_for_outgoing")] HRESULT acc_find_for_outgoing([in] BSTR url, [out,retval] int *acc_id); 
     75                [id(55), helpstring("method acc_enum_id")] HRESULT acc_enum_id([out,retval] SAFEARRAY(int) *accIdArray); 
     76                [id(56), helpstring("method conf_enum_ports")] HRESULT conf_enum_ports([out,retval] SAFEARRAY(int) *pPortsArray); 
     77                [id(57), helpstring("method conf_get_port_info")] HRESULT conf_get_port_info([in] int port_id, [out] Pjsua_Conf_Port_Info *pInfo, [out,retval] Pj_Status *pRet); 
    6978        }; 
    7079 
     
    8594        struct Pjsua_Buddy_Info; 
    8695        struct Pjsua_Acc_Info; 
     96        struct Pjsua_Conf_Port_Info; 
    8797 
    8898        [ 
     
    95105            methods: 
    96106                [id(1), helpstring("method OnCallState")] void OnCallState([in] int call_index, [in] Pjsua_Call_Info *pInfo); 
    97                 [id(2), helpstring("method OnRegState")] void OnRegState([in] int acc_index); 
     107                [id(2), helpstring("method OnRegState")] void OnRegState([in] int acc_id); 
    98108                [id(3), helpstring("method OnBuddyState")] void OnBuddyState([in] int buddy_index); 
    99109                [id(4), helpstring("method OnIncomingPager")] void OnIncomingPager([in] int call_index, [in] BSTR fromUri, [in] BSTR toURI, [in] BSTR pagerText); 
    100110                [id(5), helpstring("method OnTypingIndication")] void OnTypingIndication([in] int call_index, [in] BSTR fromUri, [in] BSTR toURI, [in] int isTyping); 
     111                [id(6), helpstring("method OnIncomingCall")] void OnIncomingCall([in] int call_index); 
    101112        }; 
    102113 
  • pjproject/trunk/pjsip-apps/src/activex-pjsua/activex-pjsuaCP.h

    r487 r492  
    33 
    44//#import "C:\project\pjproject\pjsip-apps\src\activex-pjsua\activex-pjsua.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids        //"Import typelib" 
     5 
    56template <class T> 
    67class CProxy_IPjsuaEvents : public IConnectionPointImpl<T, &DIID__IPjsuaEvents, CComDynamicUnkArray> 
     
    148149         
    149150        } 
     151        VOID Fire_OnIncomingCall(INT call_index) 
     152        { 
     153                T* pT = static_cast<T*>(this); 
     154                int nConnectionIndex; 
     155                CComVariant* pvars = new CComVariant[1]; 
     156                int nConnections = m_vec.GetSize(); 
     157                 
     158                for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) 
     159                { 
     160                        pT->Lock(); 
     161                        CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex); 
     162                        pT->Unlock(); 
     163                        IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p); 
     164                        if (pDispatch != NULL) 
     165                        { 
     166                                pvars[0] = call_index; 
     167                                DISPPARAMS disp = { pvars, NULL, 1, 0 }; 
     168                                pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); 
     169                        } 
     170                } 
     171                delete[] pvars; 
     172         
     173        } 
    150174}; 
    151175#endif 
  • pjproject/trunk/pjsip-apps/src/activex-pjsua/app.cpp

    r487 r492  
    1414{ 0x9ce3052a, 0x7a32, 0x4229, { 0xb3, 0x1c, 0x5e, 0x2, 0xe0, 0x66, 0x7a, 0x77 } }; 
    1515 
     16// {7F6CFF0F-C5B3-41e8-B278-61CD584C1F34} 
     17static const GUID IID_Pjsip_Sip_Uri =  
     18{ 0x7f6cff0f, 0xc5b3, 0x41e8, { 0xb2, 0x78, 0x61, 0xcd, 0x58, 0x4c, 0x1f, 0x34 } }; 
     19 
    1620// {3B12B04F-6E48-46a7-B9E0-6C4BF1594A96} 
    1721static const GUID IID_Pjsua_Acc_Config =  
     
    3337static const GUID IID_Pjsua_Acc_Info =  
    3438{ 0x8d345956, 0x10b7, 0x4450, { 0x8a, 0x6, 0xa8, 0xd, 0x2f, 0x31, 0x9e, 0xfd } }; 
     39 
     40// {0D05907A-3E1F-4c92-9FD0-26CB6E1CC56A} 
     41static const GUID IID_Pjsua_Conf_Port_Info =  
     42{ 0xd05907a, 0x3e1f, 0x4c92, { 0x9f, 0xd0, 0x26, 0xcb, 0x6e, 0x1c, 0xc5, 0x6a } }; 
     43 
    3544 
    3645#define SA_SIZE(lbound,ubound)  (ubound-lbound) 
     
    118127            *count = 0; 
    119128            for (i=0; i<sa->cbElements; ++i) { 
    120                 BSTR str; 
     129                BSTR str = NULL; 
    121130                long rg = lbound + i; 
    122131                hr = SafeArrayGetElement(sa, &rg, &str); 
     
    175184                Pjsip_Cred_Info cred_info; 
    176185                long rg = lbound + i; 
     186                pj_memset(&cred_info, 0, sizeof(cred_info)); 
    177187                hr = SafeArrayGetElement(c1->cred_info, &rg, &cred_info); 
    178188                if (FAILED(hr)) 
     
    245255    c2->sip_port = c1->sip_port; 
    246256    c2->start_rtp_port = c1->rtp_port; 
     257    c2->msg_logging = c1->msg_logging; 
    247258    c2->max_calls = c1->max_calls; 
    248259    c2->conf_ports = c1->conf_ports; 
     
    281292                Pjsua_Acc_Config acc_config; 
    282293                long rg = lbound + i; 
     294                pj_memset(&acc_config, 0, sizeof(acc_config)); 
    283295                hr = SafeArrayGetElement(c1->acc_config, &rg, &acc_config); 
    284296                if (FAILED(hr)) 
     
    312324    c2->sip_port = c1->sip_port; 
    313325    c2->rtp_port = c1->start_rtp_port; 
     326    c2->msg_logging = c1->msg_logging; 
    314327    c2->max_calls = c1->max_calls; 
    315328    c2->conf_ports = c1->conf_ports; 
     
    387400    c2->connect_duration = c1->connect_duration.sec; 
    388401    c2->total_duration = c1->total_duration.sec; 
    389     c2->cause = c1->cause; 
    390     Cp(c2->cause_text, &c1->cause_text); 
     402    c2->last_status = c1->last_status; 
     403    Cp(c2->last_status_text, &c1->last_status_text); 
    391404    c2->has_media = c1->has_media; 
    392405    c2->conf_slot = c1->conf_slot; 
     
    398411 
    399412    info2->index = info1->index; 
    400     Cp(info2->acc_id, &info1->acc_id); 
     413    Cp(info2->acc_uri, &info1->acc_id); 
    401414    info2->has_registration = info1->has_registration; 
    402415    info2->expires = info1->expires; 
     
    420433    Cp(info2->status_text, &info1->status_text); 
    421434    info2->monitor = info1->monitor; 
    422     info2->acc_index = info1->acc_index; 
    423435} 
    424436 
     
    464476    Pjsua_Call_Info *Call_Info = new Pjsua_Call_Info; 
    465477 
    466     pjsua_get_call_info(call_index, &call_info); 
     478    pjsua_call_get_info(call_index, &call_info); 
    467479    callinfo2CallInfo(&call_info, Call_Info); 
    468480 
     
    470482} 
    471483 
    472 static void on_reg_state(int acc_index) 
    473 { 
    474     CApp_Instance->Fire_OnRegState(acc_index); 
     484static void on_incoming_call(int acc_id, int call_index, 
     485                             pjsip_rx_data *rdata) 
     486{ 
     487    CApp_Instance->Fire_OnIncomingCall(call_index); 
     488} 
     489 
     490static void on_reg_state(int acc_id) 
     491{ 
     492    CApp_Instance->Fire_OnRegState(acc_id); 
    475493} 
    476494 
     
    513531    pj_memset(&cb, 0, sizeof(cb)); 
    514532    cb.on_call_state = &on_call_state; 
     533    cb.on_incoming_call = &on_incoming_call; 
    515534    cb.on_reg_state = &on_reg_state; 
    516535    cb.on_buddy_state = &on_buddy_state; 
     
    540559STDMETHODIMP CApp::call_get_max_count(int *retCount) 
    541560{ 
    542     *retCount = pjsua_get_max_calls(); 
     561    *retCount = pjsua_call_get_max_count(); 
    543562    return S_OK; 
    544563} 
     
    546565STDMETHODIMP CApp::call_get_count(int *retCount) 
    547566{ 
    548     *retCount = pjsua_get_call_count(); 
     567    *retCount = pjsua_call_get_count(); 
    549568    return S_OK; 
    550569} 
     
    565584{ 
    566585    pjsua_call_info info; 
    567     *pRet = pjsua_get_call_info(call_index, &info); 
     586    *pRet = pjsua_call_get_info(call_index, &info); 
    568587    callinfo2CallInfo(&info, pInfo); 
    569588    return S_OK; 
    570589} 
    571590 
    572 STDMETHODIMP CApp::call_make_call(int acc_index, Pj_String dst_uri, int *call_index, Pj_Status *pRet) 
     591STDMETHODIMP CApp::call_make_call(int acc_id, Pj_String dst_uri, int *call_index, Pj_Status *pRet) 
    573592{ 
    574593    Temp_Pool tp; 
    575594    pj_str_t tmp = Pj_str(tp.get_pool(), dst_uri); 
    576595 
    577     *pRet = pjsua_make_call(acc_index, &tmp, call_index); 
     596    *pRet = pjsua_call_make_call(acc_id, &tmp, call_index); 
    578597    return S_OK; 
    579598} 
     
    581600STDMETHODIMP CApp::call_answer(int call_index, int status_code, Pj_Status *pRet) 
    582601{ 
    583     pjsua_call_answer(call_index, status_code); 
    584     *pRet = PJ_SUCCESS; 
     602    *pRet = pjsua_call_answer(call_index, status_code); 
    585603    return S_OK; 
    586604} 
     
    602620STDMETHODIMP CApp::call_release_hold(int call_index, Pj_Status *pRet) 
    603621{ 
    604     pjsua_call_reinvite(call_index); 
    605     *pRet = PJ_SUCCESS; 
     622    *pRet = pjsua_call_reinvite(call_index); 
    606623    return S_OK; 
    607624} 
     
    611628    Temp_Pool tp; 
    612629    pj_str_t tmp = Pj_str(tp.get_pool(), dst_uri); 
    613     pjsua_call_xfer(call_index, &tmp); 
    614     *pRet = PJ_SUCCESS; 
     630    *pRet = pjsua_call_xfer(call_index, &tmp); 
    615631    return S_OK; 
    616632} 
     
    628644    Temp_Pool tp; 
    629645    pj_str_t tmp = Pj_str(tp.get_pool(), text); 
    630     pjsua_call_send_im(call_index, &tmp); 
    631     *pRet = PJ_SUCCESS; 
     646    *pRet = pjsua_call_send_im(call_index, &tmp); 
    632647    return S_OK; 
    633648} 
     
    635650STDMETHODIMP CApp::call_typing(int call_index, int is_typing, Pj_Status *pRet) 
    636651{ 
    637     pjsua_call_typing(call_index, is_typing); 
    638     *pRet = PJ_SUCCESS; 
     652    *pRet = pjsua_call_send_typing_ind(call_index, is_typing); 
    639653    return S_OK; 
    640654} 
     
    649663{ 
    650664    char buf[1024]; 
    651     pjsua_dump_call(call_index, 1, buf, sizeof(buf), ""); 
     665    pjsua_call_dump(call_index, 1, buf, sizeof(buf), ""); 
    652666 
    653667    OLECHAR wbuf[1024]; 
     
    664678} 
    665679 
    666 STDMETHODIMP CApp::acc_get_info(int acc_index, Pjsua_Acc_Info *pInfo, Pj_Status *pRet) 
     680STDMETHODIMP CApp::acc_get_info(int acc_id, Pjsua_Acc_Info *pInfo, Pj_Status *pRet) 
    667681{ 
    668682    pjsua_acc_info info; 
    669     *pRet = pjsua_acc_get_info(acc_index, &info); 
     683    *pRet = pjsua_acc_get_info(acc_id, &info); 
    670684    accinfo2AccInfo(&info, pInfo); 
    671685    return S_OK; 
     
    681695} 
    682696 
    683 STDMETHODIMP CApp::acc_set_online_status(int acc_index, int is_online, Pj_Status *pRet) 
    684 { 
    685     *pRet = pjsua_acc_set_online_status(acc_index, is_online); 
    686     return S_OK; 
    687 } 
    688  
    689 STDMETHODIMP CApp::acc_set_registration(int acc_index, int reg_active, Pj_Status *pRet) 
    690 { 
    691     *pRet = pjsua_acc_set_registration(acc_index, reg_active); 
     697STDMETHODIMP CApp::acc_set_online_status(int acc_id, int is_online, Pj_Status *pRet) 
     698{ 
     699    *pRet = pjsua_acc_set_online_status(acc_id, is_online); 
     700    return S_OK; 
     701} 
     702 
     703STDMETHODIMP CApp::acc_set_registration(int acc_id, int reg_active, Pj_Status *pRet) 
     704{ 
     705    *pRet = pjsua_acc_set_registration(acc_id, reg_active); 
    692706    return S_OK; 
    693707} 
     
    718732{ 
    719733    *pRet = pjsua_buddy_subscribe_pres(buddy_index, subscribe); 
    720     pjsua_pres_refresh(); 
    721     return S_OK; 
    722 } 
    723  
    724 STDMETHODIMP CApp::im_send_text(int acc_index, Pj_String dst_uri, Pj_String text, Pj_Status *pRet) 
     734    return S_OK; 
     735} 
     736 
     737STDMETHODIMP CApp::im_send_text(int acc_id, Pj_String dst_uri, Pj_String text, Pj_Status *pRet) 
    725738{ 
    726739    Temp_Pool tp; 
    727740    pj_str_t tmp_uri = Pj_str(tp.get_pool(), dst_uri); 
    728741    pj_str_t tmp_text = Pj_str(tp.get_pool(), text); 
    729     *pRet = pjsua_im_send(acc_index, &tmp_uri, &tmp_text); 
    730     return S_OK; 
    731 } 
    732  
    733 STDMETHODIMP CApp::im_typing(int acc_index, Pj_URI dst_uri, int is_typing, Pj_Status *pRet) 
     742    *pRet = pjsua_im_send(acc_id, &tmp_uri, &tmp_text); 
     743    return S_OK; 
     744} 
     745 
     746STDMETHODIMP CApp::im_typing(int acc_id, Pj_URI dst_uri, int is_typing, Pj_Status *pRet) 
    734747{ 
    735748    Temp_Pool tp; 
    736749    pj_str_t tmp_uri = Pj_str(tp.get_pool(), dst_uri); 
    737     *pRet = pjsua_im_typing(acc_index, &tmp_uri, is_typing); 
     750    *pRet = pjsua_im_typing(acc_id, &tmp_uri, is_typing); 
    738751    return S_OK; 
    739752} 
     
    803816    pj_str_t tmp = Pj_str(tp.get_pool(), filename); 
    804817    pjsua_default_config(&config); 
    805     *pRet = pjsua_load_settings(tmp.ptr, &config); 
     818    *pRet = pjsua_load_settings(tmp.ptr, &config, NULL); 
    806819    if (*pRet == PJ_SUCCESS) 
    807820        *pRet = config2Config(&config, pConfig); 
     
    826839STDMETHODIMP CApp::app_get_current_config(Pjsua_Config *pConfig) 
    827840{ 
    828     pjsua_config *config; 
    829     config = (pjsua_config*) pjsua_get_config(); 
    830     return config2Config(config, pConfig); 
     841    Temp_Pool tp; 
     842    pjsua_config config; 
     843 
     844    pjsua_get_config(tp.get_pool(), &config); 
     845    return config2Config(&config, pConfig); 
    831846} 
    832847 
     
    857872    return S_OK; 
    858873} 
     874 
     875STDMETHODIMP CApp::app_parse_uri(BSTR uriString, Pjsip_Sip_Uri *pSipUri, Pj_Status *pStatus) 
     876{ 
     877    Temp_Pool tp; 
     878    pj_str_t tmp = Pj_str(tp.get_pool(), uriString); 
     879    pjsip_name_addr *addr; 
     880    char buf[1024]; 
     881    pj_str_t s; 
     882 
     883    addr = (pjsip_name_addr*) 
     884        pjsip_parse_uri(tp.get_pool(), tmp.ptr, tmp.slen, PJSIP_PARSE_URI_AS_NAMEADDR); 
     885    if (addr == NULL) { 
     886        *pStatus = PJSIP_EINVALIDURI; 
     887        return S_OK; 
     888    } 
     889 
     890    if (!PJSIP_URI_SCHEME_IS_SIP(addr) && !PJSIP_URI_SCHEME_IS_SIPS(addr)) { 
     891        *pStatus = PJSIP_EINVALIDSCHEME; 
     892        return S_OK; 
     893    } 
     894 
     895    pjsip_sip_uri *sip = (pjsip_sip_uri*)addr->uri; 
     896 
     897    Cp2(&pSipUri->display, &addr->display); 
     898    Cp2(&pSipUri->user, &sip->user); 
     899    Cp2(&pSipUri->passwd, &sip->passwd); 
     900    Cp2(&pSipUri->host, &sip->host); 
     901    pSipUri->port = sip->port; 
     902    Cp2(&pSipUri->param_user, &sip->user_param); 
     903    Cp2(&pSipUri->param_method, &sip->method_param); 
     904    Cp2(&pSipUri->param_transport, &sip->transport_param); 
     905    pSipUri->param_ttl = sip->ttl_param; 
     906    pSipUri->param_lr = sip->lr_param; 
     907    Cp2(&pSipUri->param_maddr, &sip->maddr_param); 
     908 
     909    s.ptr = buf; 
     910    s.slen = pjsip_param_print_on(&sip->other_param, buf, sizeof(buf),  
     911                                  &pjsip_PARAM_CHAR_SPEC, &pjsip_PARAM_CHAR_SPEC, ';'); 
     912    Cp2(&pSipUri->param_other, &s); 
     913 
     914    s.slen = pjsip_param_print_on(&sip->header_param, buf, sizeof(buf),  
     915                                  &pjsip_HDR_CHAR_SPEC, &pjsip_HDR_CHAR_SPEC, '?'); 
     916    Cp2(&pSipUri->param_header, &s); 
     917 
     918    *pStatus = PJ_SUCCESS; 
     919    return S_OK; 
     920} 
     921 
     922STDMETHODIMP CApp::app_print_uri(Pjsip_Sip_Uri *pSipURI, Pjsip_Uri_Context context, BSTR *uriText) 
     923{ 
     924    Temp_Pool tp; 
     925    pjsip_name_addr *addr; 
     926    pj_str_t tmp; 
     927    char buf[1024]; 
     928    pjsip_sip_uri *sip; 
     929 
     930    addr = pjsip_name_addr_create(tp.get_pool()); 
     931    sip = pjsip_sip_uri_create(tp.get_pool(), PJ_FALSE); 
     932    addr->uri = (pjsip_uri*)sip; 
     933 
     934    addr->display = Pj_str(tp.get_pool(), pSipURI->display); 
     935    sip->user = Pj_str(tp.get_pool(), pSipURI->user); 
     936    sip->passwd = Pj_str(tp.get_pool(), pSipURI->passwd); 
     937    sip->host = Pj_str(tp.get_pool(), pSipURI->host); 
     938    sip->port = pSipURI->port; 
     939    sip->user_param = Pj_str(tp.get_pool(), pSipURI->param_user); 
     940    sip->method_param = Pj_str(tp.get_pool(), pSipURI->param_method); 
     941    sip->transport_param = Pj_str(tp.get_pool(), pSipURI->param_transport); 
     942    sip->ttl_param = pSipURI->param_ttl; 
     943    sip->lr_param = pSipURI->param_lr; 
     944    sip->maddr_param = Pj_str(tp.get_pool(), pSipURI->param_maddr); 
     945     
     946    /* Unfortunately can't transport params yet (no parsing function) */ 
     947 
     948    tmp.ptr = buf; 
     949    tmp.slen = pjsip_uri_print((pjsip_uri_context_e)context, addr, buf, sizeof(buf)); 
     950 
     951    Cp2(uriText, &tmp); 
     952    return S_OK; 
     953} 
     954 
     955STDMETHODIMP CApp::app_compare_uri_string(Pjsip_Uri_Context context, BSTR uri1, BSTR uri2, Pj_Status *pStatus) 
     956{ 
     957    Temp_Pool tp; 
     958 
     959    pj_str_t tmp_uri1 = Pj_str(tp.get_pool(), uri1); 
     960    pj_str_t tmp_uri2 = Pj_str(tp.get_pool(), uri2); 
     961 
     962    pjsip_uri *u1, *u2; 
     963 
     964    u1 = pjsip_parse_uri(tp.get_pool(), tmp_uri1.ptr, tmp_uri1.slen, PJSIP_PARSE_URI_AS_NAMEADDR); 
     965    if (u1 == NULL) { 
     966        *pStatus = PJSIP_EINVALIDURI; 
     967        return S_OK; 
     968    } 
     969 
     970    u2 = pjsip_parse_uri(tp.get_pool(), tmp_uri2.ptr, tmp_uri2.slen, PJSIP_PARSE_URI_AS_NAMEADDR); 
     971    if (u2 == NULL) { 
     972        *pStatus = PJSIP_EINVALIDURI; 
     973        return S_OK; 
     974    } 
     975     
     976    *pStatus = pjsip_uri_cmp((pjsip_uri_context_e)context, u1, u2); 
     977    return S_OK; 
     978} 
     979 
     980STDMETHODIMP CApp::buddy_del(int buddy_index, Pj_Status *pRet) 
     981{ 
     982    *pRet = pjsua_buddy_del(buddy_index); 
     983    return S_OK; 
     984} 
     985 
     986STDMETHODIMP CApp::acc_del(int acc_id, Pj_Status *pRet) 
     987{ 
     988    *pRet = pjsua_acc_del(acc_id); 
     989    return S_OK; 
     990} 
     991 
     992STDMETHODIMP CApp::acc_find_for_outgoing(BSTR url, int *acc_id) 
     993{ 
     994    Temp_Pool tp; 
     995 
     996    pj_str_t tmp_uri = Pj_str(tp.get_pool(), url); 
     997 
     998    *acc_id = pjsua_acc_find_for_outgoing(&tmp_uri); 
     999 
     1000    return S_OK; 
     1001} 
     1002 
     1003STDMETHODIMP CApp::acc_enum_id(SAFEARRAY **accIdArray) 
     1004{ 
     1005    int id[32]; 
     1006    unsigned count = PJ_ARRAY_SIZE(id); 
     1007    unsigned i; 
     1008 
     1009    pjsua_acc_enum_id(id, &count); 
     1010 
     1011    *accIdArray = SafeArrayCreateVector(VT_INT, 0, count); 
     1012 
     1013    for (i=0; i<count; ++i) { 
     1014        long rg = i; 
     1015        SafeArrayPutElement(*accIdArray, &rg, &id[i]); 
     1016    } 
     1017 
     1018    return S_OK; 
     1019} 
     1020 
     1021STDMETHODIMP CApp::conf_enum_ports(SAFEARRAY **pPortsArray) 
     1022{ 
     1023    int id[128]; 
     1024    unsigned count = PJ_ARRAY_SIZE(id); 
     1025    unsigned i; 
     1026 
     1027    pjsua_conf_enum_port_ids(id, &count); 
     1028 
     1029    *pPortsArray = SafeArrayCreateVector(VT_INT, 0, count); 
     1030 
     1031    for (i=0; i<count; ++i) { 
     1032        long rg = i; 
     1033        SafeArrayPutElement(*pPortsArray, &rg, &id[i]); 
     1034    } 
     1035 
     1036    return S_OK; 
     1037} 
     1038 
     1039STDMETHODIMP CApp::conf_get_port_info(int port_id, Pjsua_Conf_Port_Info *pInfo, Pj_Status *pRet) 
     1040{ 
     1041    unsigned i; 
     1042    pjsua_conf_port_info info; 
     1043 
     1044    *pRet = pjsua_conf_get_port_info(port_id, &info); 
     1045    if (*pRet != PJ_SUCCESS) 
     1046        return S_OK; 
     1047 
     1048    pInfo->slot_id = info.slot_id; 
     1049    Cp2(&pInfo->name, &info.name); 
     1050    pInfo->clock_rate = info.clock_rate; 
     1051    pInfo->channel_count = info.channel_count; 
     1052    pInfo->samples_per_frame = info.samples_per_frame; 
     1053    pInfo->bits_per_sample = info.bits_per_sample; 
     1054     
     1055 
     1056    pInfo->listeners = SafeArrayCreateVector(VT_INT, 0, info.listener_cnt); 
     1057 
     1058    for (i=0; i<info.listener_cnt; ++i) { 
     1059        long rg = i; 
     1060        SafeArrayPutElement(pInfo->listeners, &rg, &info.listeners[i]); 
     1061    } 
     1062 
     1063    return S_OK; 
     1064} 
     1065 
  • pjproject/trunk/pjsip-apps/src/activex-pjsua/app.h

    r487 r492  
    55 
    66#include "resource.h"       // main symbols 
    7 #include "..\activex-pjsua\activex-pjsuaCP.h" 
     7#include "activex-pjsuaCP.h" 
    88 
    99 
     
    3838// IApp 
    3939public: 
     40        STDMETHOD(app_destroy)(/*[out,retval]*/ Pj_Status *retStatus); 
     41        STDMETHOD(app_start)(/*[out,retval]*/ Pj_Status *retStatus); 
     42        STDMETHOD(app_init)(/*[in]*/ Pjsua_Config *pConfig, /*[out,retval]*/ Pj_Status *pStatus); 
     43        STDMETHOD(app_test_config)(/*[in]*/ Pjsua_Config *pConfig, /*[out,retval,string]*/ BSTR *retmsg); 
     44        STDMETHOD(app_default_config)(/*[in,out]*/ Pjsua_Config *pConfig); 
     45        STDMETHOD(app_create)(/*[out,retval]*/ Pj_Status *ret); 
     46        STDMETHOD(app_compare_uri_string)(/*[in]*/ Pjsip_Uri_Context context, /*[in]*/ BSTR uri1, /*[in]*/ BSTR uri2, /*[out,retval]*/ Pj_Status *pStatus); 
     47        STDMETHOD(app_print_uri)(/*[in]*/ Pjsip_Sip_Uri *pSipURI, Pjsip_Uri_Context context, /*[out,retval]*/ BSTR *uriText); 
     48        STDMETHOD(app_parse_uri)(/*[in]*/ BSTR uriString, /*[out]*/ Pjsip_Sip_Uri *pSipUri, /*[out,retval]*/ Pj_Status *pStatus); 
    4049        STDMETHOD(app_handle_events)(/*[in]*/ int msec_timeout, /*[out,retval]*/ int *pEvCount); 
    4150        STDMETHOD(app_verify_sip_url)(/*[in,string]*/ Pj_String uri, /*[out,retval]*/ Pj_Status *pRet); 
     
    5362        STDMETHOD(conf_disconnect)(/*[in]*/ int src_port, /*[in]*/ int sink_port, /*[out,retval]*/ Pj_Status *pRet); 
    5463        STDMETHOD(conf_connect)(/*[in]*/ int src_port, /*[in]*/ int sink_port, /*[out,retval]*/ Pj_Status *pRet); 
     64        STDMETHOD(conf_enum_ports)(SAFEARRAY **pPortsArray); 
     65        STDMETHOD(conf_get_port_info)(int port_id, Pjsua_Conf_Port_Info *pInfo, Pj_Status *pRet); 
    5566        STDMETHOD(im_typing)(/*[in]*/ int acc_index, /*[in,string]*/ Pj_URI dst_uri, /*[in]*/ int is_typing, /*[out,retval]*/ Pj_Status *pRet); 
    5667        STDMETHOD(im_send_text)(/*[in]*/ int acc_index, /*[in,string]*/ Pj_String dst_uri, /*[in,string]*/ Pj_String text, /*[out,retval]*/ Pj_Status *pRet); 
     
    5970        STDMETHOD(buddy_get_info)(/*[in]*/ int buddy_index, /*[out]*/ Pjsua_Buddy_Info *pInfo, /*[out,retval]*/ Pj_Status *pRet); 
    6071        STDMETHOD(buddy_get_count)(/*[out,retval]*/ int *pCount); 
     72        STDMETHOD(buddy_del)(/*[in]*/ int buddy_index, /*[out,retval]*/ Pj_Status *pRet); 
    6173        STDMETHOD(acc_set_registration)(/*[in]*/ int acc_index, /*[in]*/ int reg_active, /*[out,retval]*/ Pj_Status *pRet); 
    6274        STDMETHOD(acc_set_online_status)(/*[in]*/ int acc_index, /*[in]*/ int is_online, /*[out,retval]*/ Pj_Status *pRet); 
    6375        STDMETHOD(acc_add)(/*[in]*/ Pjsua_Acc_Config *pConfig, /*[out]*/ int *pAcc_Index, /*[out,retval]*/ Pj_Status *pRet); 
     76        STDMETHOD(acc_del)(/*[out,retval]*/ int acc_index, Pj_Status *pRet); 
    6477        STDMETHOD(acc_get_info)(/*[in]*/ int acc_index, /*[out]*/ Pjsua_Acc_Info *pInfo, /*[out,retval]*/ Pj_Status *pRet); 
    6578        STDMETHOD(acc_get_count)(/*[out,retval]*/ int *pCount); 
     79        STDMETHOD(acc_enum_id)(SAFEARRAY **accIdArray); 
     80        STDMETHOD(acc_find_for_outgoing)(/*[in]*/ BSTR url, /*[out,retval]*/ int *acc_index); 
    6681        STDMETHOD(call_hangup_all)(); 
    6782        STDMETHOD(call_typing)(/*[in]*/ int call_index, /*[in]*/ int is_typing, /*[out,retval]*/ Pj_Status *pRet); 
     
    7994        STDMETHOD(call_get_count)(/*[out,retval]*/ int *retCount); 
    8095        STDMETHOD(call_get_max_count)(/*[out,retval]*/ int *retCount); 
    81         STDMETHOD(app_destroy)(/*[out,retval]*/ Pj_Status *retStatus); 
    82         STDMETHOD(app_start)(/*[out,retval]*/ Pj_Status *retStatus); 
    83         STDMETHOD(app_init)(/*[in]*/ Pjsua_Config *pConfig, /*[out,retval]*/ Pj_Status *pStatus); 
    84         STDMETHOD(app_test_config)(/*[in]*/ Pjsua_Config *pConfig, /*[out,retval,string]*/ BSTR *retmsg); 
    85         STDMETHOD(app_default_config)(/*[in,out]*/ Pjsua_Config *pConfig); 
    86         STDMETHOD(app_create)(/*[out,retval]*/ Pj_Status *ret); 
    8796        STDMETHOD(call_get_textstat)(/* [in] */ int call_index,    /* [retval][out] */ BSTR *textstat); 
    8897 
  • pjproject/trunk/pjsip-apps/src/activex-pjsua/pjsua-structs.idl

    r487 r492  
    2121    Pj_String   data; 
    2222} Pjsip_Cred_Info; 
     23 
     24 
     25[ 
     26    uuid(7F6CFF0F-C5B3-41e8-B278-61CD584C1F34), 
     27    version(1.0), 
     28    helpstring("PJSIP SIP URI"), 
     29] 
     30typedef struct Pjsip_Sip_Uri 
     31{ 
     32    Pj_String   display; 
     33    Pj_String   user; 
     34    Pj_String   passwd; 
     35    Pj_String   host; 
     36    int         port; 
     37    Pj_String   param_user; 
     38    Pj_String   param_method; 
     39    Pj_String   param_transport; 
     40    int         param_ttl; 
     41    int         param_lr; 
     42    Pj_String   param_maddr; 
     43    Pj_String   param_other; 
     44    Pj_String   param_header; 
     45} Pjsip_Sip_Uri; 
     46 
     47 
     48typedef enum Pjsip_Uri_Context 
     49{ 
     50    PJSIPX_URI_IN_REQ_URI, 
     51    PJSIPX_URI_IN_FROMTO_HDR, 
     52    PJSIPX_URI_IN_CONTACT_HDR, 
     53    PJSIPX_URI_IN_ROUTING_HDR, 
     54    PJSIPX_URI_IN_OTHER 
     55} Pjsip_Uri_Context; 
    2356 
    2457 
     
    4578typedef struct Pjsua_Config 
    4679{ 
    47     unsigned int                udp_port; 
    48     Pj_String                   sip_host; 
    49     unsigned int                sip_port; 
    50     unsigned int                rtp_port; 
    51     unsigned int                max_calls; 
    52     unsigned int                conf_ports; 
    53     unsigned int                thread_cnt; 
    54     Pj_String                   stun_srv1; 
    55     unsigned int                stun_port1; 
    56     Pj_String                   stun_srv2; 
    57     unsigned int                stun_port2; 
    58     unsigned int                snd_player_id; 
    59     unsigned int                snd_capture_id; 
    60     unsigned int                clock_rate; 
    61     Pj_Bool                     null_audio; 
    62     unsigned int                quality; 
    63     unsigned int                complexity; 
    64     SAFEARRAY(Pj_String)        codec_arg; 
    65     unsigned int                auto_answer; 
    66     unsigned int                uas_refresh; 
    67     Pj_String                   outbound_proxy; 
     80    int                     udp_port; 
     81    Pj_String               sip_host; 
     82    int                     sip_port; 
     83    int                     rtp_port; 
     84    int                     msg_logging; 
     85    int                     max_calls; 
     86    int                     conf_ports; 
     87    int                     thread_cnt; 
     88    Pj_String               stun_srv1; 
     89    int                     stun_port1; 
     90    Pj_String               stun_srv2; 
     91    int                     stun_port2; 
     92    int                     snd_player_id; 
     93    int                     snd_capture_id; 
     94    int                     clock_rate; 
     95    Pj_Bool                 null_audio; 
     96    int                     quality; 
     97    int                     complexity; 
     98    SAFEARRAY(Pj_String)    codec_arg; 
     99    int                     auto_answer; 
     100    int                     uas_refresh; 
     101    Pj_String               outbound_proxy; 
    68102    SAFEARRAY(Pjsua_Acc_Config) acc_config; 
    69     unsigned int                log_level; 
    70     unsigned int                app_log_level; 
    71     unsigned long               log_decor; 
    72     Pj_String                   log_filename; 
    73     SAFEARRAY(Pj_String)        buddy_uri; 
     103    int                     log_level; 
     104    int                     app_log_level; 
     105    long                    log_decor; 
     106    Pj_String               log_filename; 
     107    SAFEARRAY(Pj_String)    buddy_uri; 
    74108} Pjsua_Config; 
    75109 
     
    94128typedef struct Pjsua_Call_Info 
    95129{ 
    96     unsigned int        index; 
     130    int                 index; 
    97131    Pj_Bool             active; 
    98132    Pj_Bool             is_uac; 
     
    101135    Pjsua_Call_State    state; 
    102136    Pj_String           state_text; 
    103     unsigned int        connect_duration; 
    104     unsigned int        total_duration; 
    105     unsigned int        cause; 
    106     Pj_String           cause_text; 
     137    int                 connect_duration; 
     138    int                 total_duration; 
     139    int                 last_status; 
     140    Pj_String           last_status_text; 
    107141    Pj_Bool             has_media; 
    108     unsigned int        conf_slot; 
     142    int                 conf_slot; 
    109143} Pjsua_Call_Info; 
    110144 
     
    125159typedef struct Pjsua_Buddy_Info 
    126160{ 
    127     unsigned int        index; 
     161    int index; 
    128162    Pj_Bool             is_valid; 
    129163    Pj_String           name; 
    130164    Pj_String           display; 
    131165    Pj_String           host; 
    132     unsigned int        port; 
     166    int                 port; 
    133167    Pj_URI              uri; 
    134168    Pjsua_Buddy_State   status; 
    135169    Pj_String           status_text; 
    136170    Pj_Bool             monitor; 
    137     int                 acc_index; 
    138171} Pjsua_Buddy_Info; 
    139172 
     
    146179typedef struct Pjsua_Acc_Info 
    147180{ 
    148     unsigned int        index; 
    149     Pj_URI              acc_id; 
     181    int                 index; 
     182    Pj_URI              acc_uri; 
    150183    Pj_Bool             has_registration; 
    151184    int                 expires; 
    152     unsigned int        status_code; 
     185    int                 status_code; 
    153186    Pj_String           status_text; 
    154187    Pj_Bool             online_status; 
    155188} Pjsua_Acc_Info; 
    156189 
     190 
     191 
     192[ 
     193    uuid(0D05907A-3E1F-4c92-9FD0-26CB6E1CC56A), 
     194    version(1.0), 
     195    helpstring("PJSUA Conference Port Information"), 
     196] 
     197typedef struct Pjsua_Conf_Port_Info 
     198{ 
     199    int                 slot_id; 
     200    Pj_String           name; 
     201    int                 clock_rate; 
     202    int                 channel_count; 
     203    int                 samples_per_frame; 
     204    int                 bits_per_sample; 
     205    SAFEARRAY(int)      listeners; 
     206} Pjsua_Conf_Port_Info; 
     207 
  • pjproject/trunk/pjsip-apps/src/pjsua/main.c

    r487 r492  
    2929{ 
    3030    pjsua_config cfg; 
     31    pj_str_t uri_to_call = { NULL, 0 }; 
    3132 
    3233    /* Init default settings. */ 
     
    3940 
    4041    /* Parse command line arguments: */ 
    41     if (pjsua_parse_args(argc, argv, &cfg) != PJ_SUCCESS) 
     42    if (pjsua_parse_args(argc, argv, &cfg, &uri_to_call) != PJ_SUCCESS) 
    4243        return 1; 
    4344 
     
    4647    if (pjsua_init(&cfg, &console_callback) != PJ_SUCCESS) 
    4748        return 1; 
    48  
    49     /* Register message logger to print incoming and outgoing 
    50      * messages. 
    51      */ 
    52     pjsip_endpt_register_module(pjsua_get_pjsip_endpt(), 
    53                                 &pjsua_console_app_msg_logger); 
    5449 
    5550 
     
    6661 
    6762    /* Start UI console main loop: */ 
    68     pjsua_console_app_main(); 
     63    pjsua_console_app_main(&uri_to_call); 
    6964 
    7065 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r487 r492  
    6969 
    7070 
     71typedef int pjsua_acc_id; 
     72typedef int pjsua_buddy_id; 
     73typedef int pjsua_player_id; 
     74typedef int pjsua_recorder_id; 
     75typedef int pjsua_conf_port_id; 
     76 
     77 
    7178/** 
    7279 * Account configuration. 
     
    136143    unsigned    start_rtp_port; 
    137144 
     145    /** 
     146     * Enable incoming and outgoing message logging (default: 1). 
     147     */ 
     148    pj_bool_t   msg_logging; 
     149 
    138150    /** Maximum calls to support (default: 4) */ 
    139151    unsigned    max_calls; 
     
    223235    /** Outbound proxy (default: none) */ 
    224236    pj_str_t    outbound_proxy; 
    225  
    226     /** URI to call.                    */ 
    227     pj_str_t    uri_to_call; 
    228237 
    229238    /** Number of SIP accounts */ 
     
    273282 
    274283    /** 
     284     * Notify application on incoming call. 
     285     */ 
     286    void (*on_incoming_call)(pjsua_acc_id acc_id, int call_index, 
     287                             pjsip_rx_data *rdata); 
     288 
     289    /** 
    275290     * Notify application on call being transfered. 
    276291     * Application can decide to accept/reject transfer request 
     
    288303     * registration details. 
    289304     */ 
    290     void (*on_reg_state)(int acc_index); 
     305    void (*on_reg_state)(pjsua_acc_id acc_id); 
    291306 
    292307    /** 
     
    294309     * Application may then query the buddy into to get the details. 
    295310     */ 
    296     void (*on_buddy_state)(int buddy_index); 
     311    void (*on_buddy_state)(pjsua_buddy_id buddy_id); 
    297312 
    298313    /** 
     
    330345    pjsip_inv_state     state; 
    331346    pj_str_t            state_text; 
     347    pjsip_status_code   last_status; 
     348    pj_str_t            last_status_text; 
    332349    pj_time_val         connect_duration; 
    333350    pj_time_val         total_duration; 
    334     pjsip_status_code   cause; 
    335     pj_str_t            cause_text; 
    336351    pj_bool_t           has_media; 
    337     unsigned            conf_slot; 
     352    pjsua_conf_port_id  conf_slot; 
    338353}; 
    339354 
     
    356371struct pjsua_buddy_info 
    357372{ 
    358     unsigned            index; 
     373    pjsua_buddy_id      index; 
    359374    pj_bool_t           is_valid; 
    360375    pj_str_t            name; 
     
    366381    pj_str_t            status_text; 
    367382    pj_bool_t           monitor; 
    368     int                 acc_index; 
    369383}; 
    370384 
     
    377391struct pjsua_acc_info 
    378392{ 
    379     unsigned            index; 
     393    pjsua_acc_id        index; 
    380394    pj_str_t            acc_id; 
    381395    pj_bool_t           has_registration; 
     
    390404 
    391405 
    392 typedef int pjsua_player_id; 
    393 typedef int pjsua_recorder_id; 
    394  
     406/** 
     407 * Conference port info. 
     408 */ 
     409struct pjsua_conf_port_info 
     410{ 
     411    pjsua_conf_port_id  slot_id; 
     412    pj_str_t            name; 
     413    unsigned            clock_rate; 
     414    unsigned            channel_count; 
     415    unsigned            samples_per_frame; 
     416    unsigned            bits_per_sample; 
     417    unsigned            listener_cnt; 
     418    pjsua_conf_port_id  listeners[256]; 
     419}; 
     420 
     421 
     422typedef struct pjsua_conf_port_info pjsua_conf_port_info; 
    395423 
    396424 
     
    479507 * Get maximum number of calls configured in pjsua. 
    480508 */ 
    481 PJ_DECL(unsigned) pjsua_get_max_calls(void); 
     509PJ_DECL(unsigned) pjsua_call_get_max_count(void); 
    482510 
    483511/** 
    484512 * Get current number of active calls. 
    485513 */ 
    486 PJ_DECL(unsigned) pjsua_get_call_count(void); 
     514PJ_DECL(unsigned) pjsua_call_get_count(void); 
    487515 
    488516/** 
     
    502530 * Get call info. 
    503531 */ 
    504 PJ_DECL(pj_status_t) pjsua_get_call_info(unsigned call_index, 
     532PJ_DECL(pj_status_t) pjsua_call_get_info(unsigned call_index, 
    505533                                         pjsua_call_info *info); 
    506534 
     
    509537 * Duplicate call info. 
    510538 */ 
    511 PJ_DECL(void) pjsua_dup_call_info(pj_pool_t *pool, 
     539PJ_DECL(void) pjsua_call_info_dup(pj_pool_t *pool, 
    512540                                  pjsua_call_info *dst_info, 
    513541                                  const pjsua_call_info *src_info); 
     
    517545 * Make outgoing call. 
    518546 */ 
    519 PJ_DECL(pj_status_t) pjsua_make_call(unsigned acc_index, 
    520                                      const pj_str_t *dst_uri, 
    521                                      int *p_call_index); 
     547PJ_DECL(pj_status_t) pjsua_call_make_call(unsigned acc_id, 
     548                                          const pj_str_t *dst_uri, 
     549                                          int *p_call_index); 
    522550 
    523551 
     
    525553 * Answer call. 
    526554 */ 
    527 PJ_DECL(void) pjsua_call_answer(int call_index, int code); 
     555PJ_DECL(pj_status_t) pjsua_call_answer(int call_index, int code); 
    528556 
    529557/** 
     
    536564 * Put call on-hold. 
    537565 */ 
    538 PJ_DECL(void) pjsua_call_set_hold(int call_index); 
     566PJ_DECL(pj_status_t) pjsua_call_set_hold(int call_index); 
    539567 
    540568 
     
    542570 * Send re-INVITE (to release hold). 
    543571 */ 
    544 PJ_DECL(void) pjsua_call_reinvite(int call_index); 
     572PJ_DECL(pj_status_t) pjsua_call_reinvite(int call_index); 
    545573 
    546574 
     
    548576 * Transfer call. 
    549577 */ 
    550 PJ_DECL(void) pjsua_call_xfer(unsigned call_index, const pj_str_t *dest); 
     578PJ_DECL(pj_status_t) pjsua_call_xfer(unsigned call_index, const pj_str_t *dest); 
    551579 
    552580/** 
     
    560588 * Send instant messaging inside INVITE session. 
    561589 */ 
    562 PJ_DECL(void) pjsua_call_send_im(int call_index, const pj_str_t *text); 
     590PJ_DECL(pj_status_t) pjsua_call_send_im(int call_index, const pj_str_t *text); 
    563591 
    564592 
     
    566594 * Send IM typing indication inside INVITE session. 
    567595 */ 
    568 PJ_DECL(void) pjsua_call_typing(int call_index, pj_bool_t is_typing); 
     596PJ_DECL(pj_status_t) pjsua_call_send_typing_ind(int call_index,  
     597                                                pj_bool_t is_typing); 
    569598 
    570599/** 
     
    577606 * Dump call and media statistics to string. 
    578607 */ 
    579 PJ_DECL(void) pjsua_dump_call(int call_index, int with_media,  
     608PJ_DECL(void) pjsua_call_dump(int call_index, int with_media,  
    580609                              char *buffer, unsigned maxlen, 
    581610                              const char *indent); 
     
    595624 * Get account info. 
    596625 */ 
    597 PJ_DECL(pj_status_t) pjsua_acc_get_info(unsigned acc_index, 
     626PJ_DECL(pj_status_t) pjsua_acc_get_info(pjsua_acc_id acc_id, 
    598627                                        pjsua_acc_info *info); 
     628 
     629 
     630/** 
     631 * Enum accounts id. 
     632 */ 
     633PJ_DECL(pj_status_t) pjsua_acc_enum_id( pjsua_acc_id ids[], 
     634                                        unsigned *count ); 
     635 
     636 
     637/** 
     638 * Enum accounts info. 
     639 */ 
     640PJ_DECL(pj_status_t) pjsua_acc_enum_info( pjsua_acc_info info[], 
     641                                          unsigned *count ); 
     642 
     643 
     644/** 
     645 * Find account for outgoing request. 
     646 */ 
     647PJ_DECL(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url); 
     648 
     649/** 
     650 * Find account for incoming request. 
     651 */ 
     652PJ_DECL(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata); 
    599653 
    600654/** 
     
    605659 */ 
    606660PJ_DECL(pj_status_t) pjsua_acc_add(const pjsua_acc_config *cfg, 
    607                                    int *acc_index); 
     661                                   pjsua_acc_id *acc_id); 
     662 
     663/** 
     664 * Delete account. 
     665 */ 
     666PJ_DECL(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_id); 
    608667 
    609668 
    610669/** 
    611670 * Set account's presence status. 
    612  * Must call pjsua_pres_refresh() after this. 
    613  */ 
    614 PJ_DECL(pj_status_t) pjsua_acc_set_online_status(unsigned acc_index, 
     671 */ 
     672PJ_DECL(pj_status_t) pjsua_acc_set_online_status(pjsua_acc_id acc_id, 
    615673                                                 pj_bool_t is_online); 
    616674 
     
    620678 * this will start unregistration process. 
    621679 */ 
    622 PJ_DECL(pj_status_t) pjsua_acc_set_registration(unsigned acc_index, pj_bool_t renew); 
     680PJ_DECL(pj_status_t) pjsua_acc_set_registration(pjsua_acc_id acc_id,  
     681                                                pj_bool_t renew); 
    623682 
    624683 
     
    638697 * Get buddy info. 
    639698 */ 
    640 PJ_DECL(pj_status_t) pjsua_buddy_get_info(unsigned buddy_index, 
     699PJ_DECL(pj_status_t) pjsua_buddy_get_info(pjsua_buddy_id buddy_index, 
    641700                                          pjsua_buddy_info *info); 
    642701 
     
    645704 */ 
    646705PJ_DECL(pj_status_t) pjsua_buddy_add(const pj_str_t *uri, 
    647                                      int *buddy_index); 
     706                                     pjsua_buddy_id *buddy_index); 
     707 
     708 
     709/** 
     710 * Delete buddy. 
     711 */ 
     712PJ_DECL(pj_status_t) pjsua_buddy_del(pjsua_buddy_id buddy_index); 
    648713 
    649714 
    650715/** 
    651716 * Enable/disable buddy's presence monitoring. 
    652  * Must call pjsua_pres_refresh() after this. 
    653  */ 
    654 PJ_DECL(pj_status_t) pjsua_buddy_subscribe_pres(unsigned buddy_index, 
     717 */ 
     718PJ_DECL(pj_status_t) pjsua_buddy_subscribe_pres(pjsua_buddy_id buddy_index, 
    655719                                                pj_bool_t monitor); 
    656720 
    657  
    658 /** 
    659  * Refresh both presence client and server subscriptions. 
    660  */ 
    661 PJ_DECL(void) pjsua_pres_refresh(void); 
    662721 
    663722/** 
     
    681740 * Send IM outside dialog. 
    682741 */ 
    683 PJ_DECL(pj_status_t) pjsua_im_send(int acc_index, const pj_str_t *dst_uri,  
     742PJ_DECL(pj_status_t) pjsua_im_send(int acc_id, const pj_str_t *dst_uri,  
    684743                                   const pj_str_t *text); 
    685744 
     
    688747 * Send typing indication outside dialog. 
    689748 */ 
    690 PJ_DECL(pj_status_t) pjsua_im_typing(int acc_index, const pj_str_t *dst_uri,  
     749PJ_DECL(pj_status_t) pjsua_im_typing(int acc_id, const pj_str_t *dst_uri,  
    691750                                     pj_bool_t is_typing); 
    692751 
     
    706765 * Enum all conference ports. 
    707766 */ 
    708 PJ_DECL(pj_status_t) pjsua_conf_enum_ports(unsigned *count, 
    709                                            pjmedia_conf_port_info info[]); 
     767PJ_DECL(pj_status_t) pjsua_conf_enum_port_ids(pjsua_conf_port_id id[], 
     768                                              unsigned *count); 
     769 
     770 
     771/** 
     772 * Get information about the specified conference port 
     773 */ 
     774PJ_DECL(pj_status_t) pjsua_conf_get_port_info( pjsua_conf_port_id id, 
     775                                               pjsua_conf_port_info *info); 
    710776 
    711777 
     
    713779 * Connect conference port. 
    714780 */ 
    715 PJ_DECL(pj_status_t) pjsua_conf_connect(unsigned src_port, 
    716                                         unsigned dst_port); 
     781PJ_DECL(pj_status_t) pjsua_conf_connect(pjsua_conf_port_id src_port, 
     782                                        pjsua_conf_port_id dst_port); 
    717783 
    718784 
     
    720786 * Connect conference port connection. 
    721787 */ 
    722 PJ_DECL(pj_status_t) pjsua_conf_disconnect(unsigned src_port, 
    723                                            unsigned dst_port); 
     788PJ_DECL(pj_status_t) pjsua_conf_disconnect(pjsua_conf_port_id src_port, 
     789                                           pjsua_conf_port_id dst_port); 
    724790 
    725791 
     
    734800 * Get conference port associated with player. 
    735801 */ 
    736 PJ_DECL(int) pjsua_player_get_conf_port(pjsua_player_id id); 
     802PJ_DECL(pjsua_conf_port_id) pjsua_player_get_conf_port(pjsua_player_id id); 
    737803 
    738804 
     
    761827 * Get conference port associated with recorder. 
    762828 */ 
    763 PJ_DECL(int) pjsua_recorder_get_conf_port(pjsua_recorder_id id); 
     829PJ_DECL(pjsua_conf_port_id) pjsua_recorder_get_conf_port(pjsua_recorder_id id); 
    764830 
    765831 
     
    798864 */ 
    799865PJ_DECL(pj_status_t) pjsua_parse_args(int argc, char *argv[], 
    800                                       pjsua_config *cfg); 
     866                                      pjsua_config *cfg, 
     867                                      pj_str_t *uri_to_call); 
    801868 
    802869/** 
     
    804871 */ 
    805872PJ_DECL(pj_status_t) pjsua_load_settings(const char *filename, 
    806                                          pjsua_config *cfg); 
     873                                         pjsua_config *cfg, 
     874                                         pj_str_t *uri_to_call); 
    807875 
    808876/** 
    809877 * Get pjsua running config. 
    810878 */ 
    811 PJ_DECL(const pjsua_config*) pjsua_get_config(void); 
     879PJ_DECL(void) pjsua_get_config(pj_pool_t *pool, 
     880                               pjsua_config *config); 
    812881 
    813882 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_console_app.h

    r487 r492  
    2121 
    2222 
    23 void pjsua_console_app_main(void); 
     23void pjsua_console_app_main(const pj_str_t *uri_to_call); 
    2424 
    2525extern pjsip_module pjsua_console_app_msg_logger; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r482 r492  
    128128 * Get maximum number of calls configured in pjsua. 
    129129 */ 
    130 PJ_DEF(unsigned) pjsua_get_max_calls(void) 
     130PJ_DEF(unsigned) pjsua_call_get_max_count(void) 
    131131{ 
    132132    return pjsua.config.max_calls; 
     
    137137 * Get current number of active calls. 
    138138 */ 
    139 PJ_DEF(unsigned) pjsua_get_call_count(void) 
     139PJ_DEF(unsigned) pjsua_call_get_count(void) 
    140140{ 
    141141    return pjsua.call_cnt; 
     
    167167 * Get call info. 
    168168 */ 
    169 PJ_DEF(pj_status_t) pjsua_get_call_info( unsigned call_index, 
     169PJ_DEF(pj_status_t) pjsua_call_get_info( unsigned call_index, 
    170170                                         pjsua_call_info *info) 
    171171{ 
     
    213213    } 
    214214 
    215     info->cause = call->inv->cause; 
    216     info->cause_text = *pjsip_get_status_text(info->cause); 
     215    info->last_status = call->last_code; 
     216    info->last_status_text = *pjsip_get_status_text(info->last_status); 
    217217 
    218218    info->has_media = (call->session != NULL); 
     
    226226 * Duplicate call info. 
    227227 */ 
    228 PJ_DEF(void) pjsua_dup_call_info( pj_pool_t *pool, 
     228PJ_DEF(void) pjsua_call_info_dup( pj_pool_t *pool, 
    229229                                  pjsua_call_info *dst_info, 
    230230                                  const pjsua_call_info *src_info) 
     
    246246 * Make outgoing call. 
    247247 */ 
    248 PJ_DEF(pj_status_t) pjsua_make_call(unsigned acc_index, 
    249                                     const pj_str_t *dest_uri, 
    250                                     int *p_call_index) 
     248PJ_DEF(pj_status_t) pjsua_call_make_call(unsigned acc_index, 
     249                                        const pj_str_t *dest_uri, 
     250                                        int *p_call_index) 
    251251{ 
    252252    pjsip_dialog *dlg = NULL; 
     
    385385 * Answer call. 
    386386 */ 
    387 PJ_DEF(void) pjsua_call_answer(int call_index, int code) 
     387PJ_DEF(pj_status_t) pjsua_call_answer(int call_index, int code) 
    388388{ 
    389389    pjsip_tx_data *tdata; 
    390390    pj_status_t status; 
    391391 
    392     PJ_ASSERT_ON_FAIL(call_index >= 0 &&  
     392    PJ_ASSERT_RETURN( call_index >= 0 &&  
    393393                      call_index < (int)pjsua.config.max_calls, 
    394                       return); 
     394                      PJ_EINVAL); 
    395395 
    396396    if (pjsua.calls[call_index].inv == NULL) { 
    397397        PJ_LOG(3,(THIS_FILE, "Call %d already disconnected")); 
    398         return; 
     398        return PJSIP_ESESSIONTERMINATED; 
    399399    } 
    400400 
     
    409409                     status); 
    410410 
     411    return status; 
    411412} 
    412413 
     
    613614    } 
    614615 
     616    /* Notify application */ 
     617    if (pjsua.cb.on_incoming_call) 
     618        pjsua.cb.on_incoming_call(acc_index, call_index, rdata); 
     619 
     620 
    615621    /* This INVITE request has been handled. */ 
    616622    return PJ_TRUE; 
     
    636642            if (call->res_time.sec == 0) 
    637643                pj_gettimeofday(&call->res_time); 
     644            call->last_code = e->body.tsx_state.tsx->status_code; 
    638645            break; 
    639646        case PJSIP_INV_STATE_CONFIRMED: 
     
    642649        case PJSIP_INV_STATE_DISCONNECTED: 
    643650            pj_gettimeofday(&call->dis_time); 
     651            if (e->body.tsx_state.tsx->status_code > call->last_code) { 
     652                call->last_code = e->body.tsx_state.tsx->status_code; 
     653            } 
    644654            break; 
    645655        default: 
    646             /* Nothing to do. Just to keep gcc from complaining about 
    647              * unused enums. 
    648              */  
     656            call->last_code = e->body.tsx_state.tsx->status_code; 
    649657            break; 
    650658    } 
     
    683691            break; 
    684692 
    685         default: 
     693        case PJSIP_INV_STATE_INCOMING: 
    686694            /* Nothing to do. Just to keep gcc from complaining about 
    687695             * unused enums. 
     
    854862    /* Now make the outgoing call. */ 
    855863    tmp = pj_str(uri); 
    856     status = pjsua_make_call(existing_call->acc_index, &tmp, &new_call); 
     864    status = pjsua_call_make_call(existing_call->acc_index, &tmp, &new_call); 
    857865    if (status != PJ_SUCCESS) { 
    858866 
     
    13551363 * Put call on-Hold. 
    13561364 */ 
    1357 PJ_DEF(void) pjsua_call_set_hold(int call_index) 
     1365PJ_DEF(pj_status_t) pjsua_call_set_hold(int call_index) 
    13581366{ 
    13591367    pjmedia_sdp_session *sdp; 
     
    13661374    if (!call->inv) { 
    13671375        PJ_LOG(3,(THIS_FILE,"Call has been disconnected")); 
    1368         return; 
     1376        return PJSIP_ESESSIONTERMINATED; 
    13691377    } 
    13701378 
    13711379    if (call->inv->state != PJSIP_INV_STATE_CONFIRMED) { 
    13721380        PJ_LOG(3,(THIS_FILE, "Can not hold call that is not confirmed")); 
    1373         return; 
     1381        return PJSIP_ESESSIONSTATE; 
    13741382    } 
    13751383 
    13761384    status = create_inactive_sdp(call, &sdp); 
    13771385    if (status != PJ_SUCCESS) 
    1378         return; 
     1386        return status; 
    13791387 
    13801388    /* Send re-INVITE with new offer */ 
     
    13821390    if (status != PJ_SUCCESS) { 
    13831391        pjsua_perror(THIS_FILE, "Unable to create re-INVITE", status); 
    1384         return; 
     1392        return status; 
    13851393    } 
    13861394 
     
    13881396    if (status != PJ_SUCCESS) { 
    13891397        pjsua_perror(THIS_FILE, "Unable to send re-INVITE", status); 
    1390         return; 
    1391     } 
     1398        return status; 
     1399    } 
     1400 
     1401    return PJ_SUCCESS; 
    13921402} 
    13931403 
     
    13961406 * re-INVITE. 
    13971407 */ 
    1398 PJ_DEF(void) pjsua_call_reinvite(int call_index) 
     1408PJ_DEF(pj_status_t) pjsua_call_reinvite(int call_index) 
    13991409{ 
    14001410    pjmedia_sdp_session *sdp; 
     
    14071417    if (!call->inv) { 
    14081418        PJ_LOG(3,(THIS_FILE,"Call has been disconnected")); 
    1409         return; 
     1419        return PJSIP_ESESSIONTERMINATED; 
    14101420    } 
    14111421 
     
    14131423    if (call->inv->state != PJSIP_INV_STATE_CONFIRMED) { 
    14141424        PJ_LOG(3,(THIS_FILE, "Can not re-INVITE call that is not confirmed")); 
    1415         return; 
     1425        return PJSIP_ESESSIONSTATE; 
    14161426    } 
    14171427 
     
    14221432        pjsua_perror(THIS_FILE, "Unable to get SDP from media endpoint",  
    14231433                     status); 
    1424         return; 
     1434        return status; 
    14251435    } 
    14261436 
     
    14291439    if (status != PJ_SUCCESS) { 
    14301440        pjsua_perror(THIS_FILE, "Unable to create re-INVITE", status); 
    1431         return; 
     1441        return status; 
    14321442    } 
    14331443 
     
    14351445    if (status != PJ_SUCCESS) { 
    14361446        pjsua_perror(THIS_FILE, "Unable to send re-INVITE", status); 
    1437         return; 
    1438     } 
     1447        return status; 
     1448    } 
     1449 
     1450    return PJ_SUCCESS; 
    14391451} 
    14401452 
     
    14431455 * Transfer call. 
    14441456 */ 
    1445 PJ_DEF(void) pjsua_call_xfer(unsigned call_index, const pj_str_t *dest) 
     1457PJ_DEF(pj_status_t) pjsua_call_xfer(unsigned call_index, const pj_str_t *dest) 
    14461458{ 
    14471459    pjsip_evsub *sub; 
     
    14551467    if (!call->inv) { 
    14561468        PJ_LOG(3,(THIS_FILE,"Call has been disconnected")); 
    1457         return; 
     1469        return PJSIP_ESESSIONTERMINATED; 
    14581470    } 
    14591471    
     
    14651477    if (status != PJ_SUCCESS) { 
    14661478        pjsua_perror(THIS_FILE, "Unable to create xfer", status); 
    1467         return; 
     1479        return status; 
    14681480    } 
    14691481 
     
    14741486    if (status != PJ_SUCCESS) { 
    14751487        pjsua_perror(THIS_FILE, "Unable to create REFER request", status); 
    1476         return; 
     1488        return status; 
    14771489    } 
    14781490 
     
    14811493    if (status != PJ_SUCCESS) { 
    14821494        pjsua_perror(THIS_FILE, "Unable to send REFER request", status); 
    1483         return; 
     1495        return status; 
    14841496    } 
    14851497 
     
    14881500     * may want to hold the INVITE, or terminate the invite, or whatever. 
    14891501     */ 
     1502 
     1503    return PJ_SUCCESS; 
    14901504} 
    14911505 
     
    15131527 * Send instant messaging inside INVITE session. 
    15141528 */ 
    1515 PJ_DECL(void) pjsua_call_send_im(int call_index, const pj_str_t *str) 
     1529PJ_DEF(pj_status_t) pjsua_call_send_im(int call_index, const pj_str_t *str) 
    15161530{ 
    15171531    pjsua_call *call; 
     
    15251539    if (!call->inv) { 
    15261540        PJ_LOG(3,(THIS_FILE,"Call has been disconnected")); 
    1527         return; 
     1541        return PJSIP_ESESSIONTERMINATED; 
    15281542    } 
    15291543 
     
    15611575on_return: 
    15621576    pjsip_dlg_dec_lock(call->inv->dlg); 
     1577    return status; 
    15631578} 
    15641579 
     
    15671582 * Send IM typing indication inside INVITE session. 
    15681583 */ 
    1569 PJ_DECL(void) pjsua_call_typing(int call_index, pj_bool_t is_typing) 
     1584PJ_DEF(pj_status_t) pjsua_call_send_typing_ind(int call_index,  
     1585                                               pj_bool_t is_typing) 
    15701586{ 
    15711587    pjsua_call *call; 
     
    15771593    if (!call->inv) { 
    15781594        PJ_LOG(3,(THIS_FILE,"Call has been disconnected")); 
    1579         return; 
     1595        return PJSIP_ESESSIONTERMINATED; 
    15801596    } 
    15811597 
     
    16031619 
    16041620on_return: 
    1605     pjsip_dlg_dec_lock(call->inv->dlg);} 
     1621    pjsip_dlg_dec_lock(call->inv->dlg); 
     1622    return status; 
     1623} 
    16061624 
    16071625 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_console_app.c

    r487 r492  
    3737    int i, max; 
    3838 
    39     max = pjsua_get_max_calls(); 
     39    max = pjsua_call_get_max_count(); 
    4040    for (i=current_call+1; i<max; ++i) { 
    4141        if (pjsua_call_is_active(i)) { 
     
    6464    int i, max; 
    6565 
    66     max = pjsua_get_max_calls(); 
     66    max = pjsua_call_get_max_count(); 
    6767    for (i=current_call-1; i>=0; --i) { 
    6868        if (pjsua_call_is_active(i)) { 
     
    9494    PJ_UNUSED_ARG(e); 
    9595 
    96     pjsua_get_call_info(call_index, &call_info); 
     96    pjsua_call_get_info(call_index, &call_info); 
    9797 
    9898    if (call_info.state == PJSIP_INV_STATE_DISCONNECTED) { 
     
    100100        PJ_LOG(3,(THIS_FILE, "Call %d is DISCONNECTED [reason=%d (%s)]",  
    101101                  call_index, 
    102                   call_info.cause, 
    103                   call_info.cause_text.ptr)); 
     102                  call_info.last_status, 
     103                  call_info.last_status_text.ptr)); 
    104104 
    105105        if ((int)call_index == current_call) { 
     
    386386{ 
    387387    unsigned i, count; 
    388     pjmedia_conf_port_info info[PJSUA_MAX_CALLS]; 
     388    pjsua_conf_port_id id[PJSUA_MAX_CALLS]; 
    389389 
    390390    printf("Conference ports:\n"); 
    391391 
    392     count = PJ_ARRAY_SIZE(info); 
    393     pjsua_conf_enum_ports(&count, info); 
     392    count = PJ_ARRAY_SIZE(id); 
     393    pjsua_conf_enum_port_ids(id, &count); 
     394 
    394395    for (i=0; i<count; ++i) { 
    395396        char txlist[PJSUA_MAX_CALLS*4+10]; 
    396         int j; 
    397         pjmedia_conf_port_info *port_info = &info[i];    
    398          
     397        unsigned j; 
     398        pjsua_conf_port_info info; 
     399 
     400        pjsua_conf_get_port_info(id[i], &info); 
     401 
    399402        txlist[0] = '\0'; 
    400         for (j=0; j<(int)count; ++j) { 
     403        for (j=0; j<info.listener_cnt; ++j) { 
    401404            char s[10]; 
    402             if (port_info->listener[j]) { 
    403                 pj_ansi_sprintf(s, "#%d ", j); 
    404                 pj_ansi_strcat(txlist, s); 
    405             } 
     405            pj_ansi_sprintf(s, "#%d ", info.listeners[j]); 
     406            pj_ansi_strcat(txlist, s); 
    406407        } 
    407408        printf("Port #%02d[%2dKHz/%dms] %20.*s  transmitting to: %s\n",  
    408                port_info->slot,  
    409                port_info->clock_rate/1000, 
    410                port_info->samples_per_frame * 1000 / port_info->clock_rate, 
    411                (int)port_info->name.slen,  
    412                port_info->name.ptr, 
     409               info.slot_id,  
     410               info.clock_rate/1000, 
     411               info.samples_per_frame * 1000 / info.clock_rate, 
     412               (int)info.name.slen,  
     413               info.name.ptr, 
    413414               txlist); 
    414415 
     
    418419 
    419420 
    420 void pjsua_console_app_main(void) 
     421void pjsua_console_app_main(const pj_str_t *uri_to_call) 
    421422{ 
    422423    char menuin[10]; 
     
    432433 
    433434    /* If user specifies URI to call, then call the URI */ 
    434     if (pjsua_get_config()->uri_to_call.slen) { 
    435         pjsua_make_call( current_acc, &pjsua_get_config()->uri_to_call,  
    436                          NULL); 
     435    if (uri_to_call->slen) { 
     436        pjsua_call_make_call( current_acc, uri_to_call, NULL); 
    437437    } 
    438438 
     
    450450        case 'm': 
    451451            /* Make call! : */ 
    452             printf("(You currently have %d calls)\n", pjsua_get_call_count()); 
     452            printf("(You currently have %d calls)\n",  
     453                     pjsua_call_get_count()); 
    453454             
    454455            uri = NULL; 
     
    470471             
    471472            tmp = pj_str(uri); 
    472             pjsua_make_call( current_acc, &tmp, NULL); 
     473            pjsua_call_make_call( current_acc, &tmp, NULL); 
    473474            break; 
    474475 
    475476        case 'M': 
    476477            /* Make multiple calls! : */ 
    477             printf("(You currently have %d calls)\n", pjsua_get_call_count()); 
     478            printf("(You currently have %d calls)\n",  
     479                   pjsua_call_get_count()); 
    478480             
    479481            if (!simple_input("Number of calls", menuin, sizeof(menuin))) 
     
    501503             
    502504                tmp = pj_str(uri); 
    503                 status = pjsua_make_call(current_acc, &tmp, NULL); 
     505                status = pjsua_call_make_call(current_acc, &tmp, NULL); 
    504506                if (status != PJ_SUCCESS) 
    505507                    break; 
     
    541543            /* Send typing indication. */ 
    542544            if (i != -1) 
    543                 pjsua_call_typing(i, PJ_TRUE); 
     545                pjsua_call_send_typing_ind(i, PJ_TRUE); 
    544546            else { 
    545547                pj_str_t tmp_uri = pj_str(uri); 
     
    554556                 */ 
    555557                if (i != -1) 
    556                     pjsua_call_typing(i, PJ_FALSE); 
     558                    pjsua_call_send_typing_ind(i, PJ_FALSE); 
    557559                else { 
    558560                    pj_str_t tmp_uri = pj_str(uri); 
     
    577579 
    578580            if (current_call != -1) { 
    579                 pjsua_get_call_info(current_call, &call_info); 
     581                pjsua_call_get_info(current_call, &call_info); 
    580582            } else { 
    581583                /* Make compiler happy */ 
     
    651653            if (current_call != -1) { 
    652654                 
    653                 pjsua_get_call_info(current_call, &call_info); 
     655                pjsua_call_get_info(current_call, &call_info); 
    654656                PJ_LOG(3,(THIS_FILE,"Current dialog: %.*s",  
    655657                          (int)call_info.remote_info.slen,  
     
    782784                } 
    783785 
    784                 pjsua_pres_refresh(); 
    785  
    786786            } else if (result.uri_result) { 
    787787                puts("Sorry, can only subscribe to buddy's presence, " 
     
    815815                   acc_info.acc_id.ptr, 
    816816                   (acc_info.online_status?"online":"offline")); 
    817             pjsua_pres_refresh(); 
    818817            break; 
    819818 
     
    898897 
    899898/***************************************************************************** 
    900  * This is a very simple PJSIP module, whose sole purpose is to display 
    901  * incoming and outgoing messages to log. This module will have priority 
    902  * higher than transport layer, which means: 
    903  * 
    904  *  - incoming messages will come to this module first before reaching 
    905  *    transaction layer. 
    906  * 
    907  *  - outgoing messages will come to this module last, after the message 
    908  *    has been 'printed' to contiguous buffer by transport layer and 
    909  *    appropriate transport instance has been decided for this message. 
    910  * 
    911  */ 
    912  
    913 /* Notification on incoming messages */ 
    914 static pj_bool_t console_on_rx_msg(pjsip_rx_data *rdata) 
    915 { 
    916     PJ_LOG(4,(THIS_FILE, "RX %d bytes %s from %s:%d:\n" 
    917                          "%s\n" 
    918                          "--end msg--", 
    919                          rdata->msg_info.len, 
    920                          pjsip_rx_data_get_info(rdata), 
    921                          rdata->pkt_info.src_name, 
    922                          rdata->pkt_info.src_port, 
    923                          rdata->msg_info.msg_buf)); 
    924      
    925     /* Always return false, otherwise messages will not get processed! */ 
    926     return PJ_FALSE; 
    927 } 
    928  
    929 /* Notification on outgoing messages */ 
    930 static pj_status_t console_on_tx_msg(pjsip_tx_data *tdata) 
    931 { 
    932      
    933     /* Important note: 
    934      *  tp_info field is only valid after outgoing messages has passed 
    935      *  transport layer. So don't try to access tp_info when the module 
    936      *  has lower priority than transport layer. 
    937      */ 
    938  
    939     PJ_LOG(4,(THIS_FILE, "TX %d bytes %s to %s:%d:\n" 
    940                          "%s\n" 
    941                          "--end msg--", 
    942                          (tdata->buf.cur - tdata->buf.start), 
    943                          pjsip_tx_data_get_info(tdata), 
    944                          tdata->tp_info.dst_name, 
    945                          tdata->tp_info.dst_port, 
    946                          tdata->buf.start)); 
    947  
    948     /* Always return success, otherwise message will not get sent! */ 
    949     return PJ_SUCCESS; 
    950 } 
    951  
    952 /* The module instance. */ 
    953 pjsip_module pjsua_console_app_msg_logger =  
    954 { 
    955     NULL, NULL,                         /* prev, next.          */ 
    956     { "mod-pjsua-log", 13 },            /* Name.                */ 
    957     -1,                                 /* Id                   */ 
    958     PJSIP_MOD_PRIORITY_TRANSPORT_LAYER-1,/* Priority            */ 
    959     NULL,                               /* load()               */ 
    960     NULL,                               /* start()              */ 
    961     NULL,                               /* stop()               */ 
    962     NULL,                               /* unload()             */ 
    963     &console_on_rx_msg,                 /* on_rx_request()      */ 
    964     &console_on_rx_msg,                 /* on_rx_response()     */ 
    965     &console_on_tx_msg,                 /* on_tx_request.       */ 
    966     &console_on_tx_msg,                 /* on_tx_response()     */ 
    967     NULL,                               /* on_tsx_state()       */ 
    968  
    969 }; 
    970  
    971  
    972  
    973 /***************************************************************************** 
    974899 * Error display: 
    975900 */ 
     
    993918{ 
    994919    &console_on_call_state, 
    995     NULL,   /* default accept transfer */ 
     920    NULL,   /* on_incoming_call         */ 
     921    NULL,   /* default accept transfer  */ 
    996922    &console_on_reg_state, 
    997923    &console_on_buddy_state, 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r487 r492  
    5656    cfg->udp_port = 5060; 
    5757    cfg->start_rtp_port = 4000; 
     58    cfg->msg_logging = PJ_TRUE; 
    5859    cfg->max_calls = 4; 
    5960    cfg->conf_ports = 0; 
     
    722723    unsigned j; 
    723724 
     725    pj_memcpy(dst_acc, src_acc, sizeof(pjsua_acc_config)); 
     726 
    724727    pj_strdup_with_null(pool, &dst_acc->id, &src_acc->id); 
    725728    pj_strdup_with_null(pool, &dst_acc->reg_uri, &src_acc->reg_uri); 
     
    743746 * Copy configuration. 
    744747 */ 
    745 static void copy_config(pj_pool_t *pool, pjsua_config *dst,  
     748void pjsua_copy_config( pj_pool_t *pool, pjsua_config *dst,  
    746749                        const pjsua_config *src) 
    747750{ 
     
    762765 
    763766    pj_strdup_with_null(pool, &dst->outbound_proxy, &src->outbound_proxy); 
    764     pj_strdup_with_null(pool, &dst->uri_to_call, &src->uri_to_call); 
     767    //pj_strdup_with_null(pool, &dst->uri_to_call, &src->uri_to_call); 
    765768 
    766769    for (i=0; i<src->acc_cnt; ++i) { 
     
    814817    } 
    815818 
     819    /* Enable SIP message logging */ 
     820    if (pjsua.config.msg_logging) 
     821        pjsip_endpt_register_module(pjsua.endpt, &pjsua_msg_logger); 
     822 
    816823    return PJ_SUCCESS; 
    817824} 
     
    864871 
    865872    /* Copy configuration */ 
    866     copy_config(pjsua.pool, &pjsua.config, cfg); 
     873    pjsua_copy_config(pjsua.pool, &pjsua.config, cfg); 
    867874 
    868875    /* Copy callback */ 
     
    10271034 * Find account for incoming request. 
    10281035 */ 
    1029 int pjsua_find_account_for_incoming(pjsip_rx_data *rdata) 
     1036PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata) 
    10301037{ 
    10311038    pjsip_uri *uri; 
     
    10351042    uri = rdata->msg_info.to->uri; 
    10361043 
    1037     /* Just return last account if To URI is not SIP: */ 
     1044    /* Just return default account if To URI is not SIP: */ 
    10381045    if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&  
    10391046        !PJSIP_URI_SCHEME_IS_SIPS(uri))  
    10401047    { 
    1041         return pjsua.config.acc_cnt; 
     1048        return pjsua.default_acc; 
    10421049    } 
    10431050 
     
    10691076    } 
    10701077 
    1071     /* Still no match, just return last account */ 
    1072     return pjsua.config.acc_cnt; 
     1078    /* Still no match, use default account */ 
     1079    return pjsua.default_acc; 
    10731080} 
    10741081 
     
    10771084 * Find account for outgoing request. 
    10781085 */ 
    1079 int pjsua_find_account_for_outgoing(const pj_str_t *url) 
    1080 { 
    1081     PJ_UNUSED_ARG(url); 
    1082  
    1083     /* Just use account #0 */ 
    1084     return 0; 
     1086PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *str_url) 
     1087{ 
     1088    pj_str_t tmp; 
     1089    pjsip_uri *uri; 
     1090    pjsip_sip_uri *sip_uri; 
     1091    unsigned i; 
     1092 
     1093    pj_strdup_with_null(pjsua.pool, &tmp, str_url); 
     1094 
     1095    uri = pjsip_parse_uri(pjsua.pool, tmp.ptr, tmp.slen, 0); 
     1096    if (!uri) 
     1097        return pjsua.config.acc_cnt-1; 
     1098 
     1099    if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&  
     1100        !PJSIP_URI_SCHEME_IS_SIPS(uri))  
     1101    { 
     1102        /* Return the first account with proxy */ 
     1103        for (i=0; i<PJ_ARRAY_SIZE(pjsua.acc); ++i) { 
     1104            if (!pjsua.acc[i].valid) 
     1105                continue; 
     1106            if (pjsua.config.acc_config[i].proxy.slen) 
     1107                break; 
     1108        } 
     1109 
     1110        if (i != PJ_ARRAY_SIZE(pjsua.acc)) 
     1111            return i; 
     1112 
     1113        /* Not found, use default account */ 
     1114        return pjsua.default_acc; 
     1115    } 
     1116 
     1117    sip_uri = pjsip_uri_get_uri(uri); 
     1118 
     1119    /* Find matching domain */ 
     1120    for (i=0; i<PJ_ARRAY_SIZE(pjsua.acc); ++i) { 
     1121        if (!pjsua.acc[i].valid) 
     1122            continue; 
     1123        if (pj_stricmp(&pjsua.acc[i].host_part, &sip_uri->host)==0) 
     1124            break; 
     1125    } 
     1126 
     1127    if (i != PJ_ARRAY_SIZE(pjsua.acc)) 
     1128        return i; 
     1129 
     1130    /* Just use default account */ 
     1131    return pjsua.default_acc; 
    10851132} 
    10861133 
     
    11931240    } 
    11941241 
     1242    /* Mark account as valid */ 
     1243    pjsua.acc[acc_index].valid = PJ_TRUE; 
     1244 
     1245 
    11951246    return PJ_SUCCESS; 
    11961247} 
     
    12001251 */ 
    12011252PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg, 
    1202                                    int *acc_index) 
    1203 { 
     1253                                   pjsua_acc_id *acc_index) 
     1254{ 
     1255    unsigned index; 
    12041256    pj_status_t status; 
    12051257 
    1206     PJ_ASSERT_RETURN(pjsua.config.acc_cnt<PJ_ARRAY_SIZE(pjsua.config.acc_config), 
     1258    PJ_ASSERT_RETURN(pjsua.config.acc_cnt <  
     1259                        PJ_ARRAY_SIZE(pjsua.config.acc_config), 
    12071260                     PJ_ETOOMANY); 
    12081261 
    1209     copy_acc_config(pjsua.pool, &pjsua.config.acc_config[pjsua.config.acc_cnt], cfg); 
     1262    /* Find empty account index. */ 
     1263    for (index=0; index < PJ_ARRAY_SIZE(pjsua.acc); ++index) { 
     1264        if (pjsua.acc[index].valid == PJ_FALSE) 
     1265            break; 
     1266    } 
     1267 
     1268    /* Expect to find a slot */ 
     1269    PJ_ASSERT_RETURN(index < PJ_ARRAY_SIZE(pjsua.acc), PJ_EBUG); 
     1270 
     1271    copy_acc_config(pjsua.pool, &pjsua.config.acc_config[index], cfg); 
    12101272     
    1211     status = init_acc(pjsua.config.acc_cnt); 
     1273    status = init_acc(index); 
    12121274    if (status != PJ_SUCCESS) { 
    12131275        pjsua_perror(THIS_FILE, "Error adding account", status); 
     
    12161278 
    12171279    if (acc_index) 
    1218         *acc_index = pjsua.config.acc_cnt; 
     1280        *acc_index = index; 
    12191281 
    12201282    pjsua.config.acc_cnt++; 
     
    12231285} 
    12241286 
     1287 
     1288/* 
     1289 * Delete account. 
     1290 */ 
     1291PJ_DEF(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_index) 
     1292{ 
     1293    PJ_ASSERT_RETURN(acc_index < (int)pjsua.config.acc_cnt,  
     1294                     PJ_EINVAL); 
     1295    PJ_ASSERT_RETURN(pjsua.acc[acc_index].valid, PJ_EINVALIDOP); 
     1296 
     1297    /* Delete registration */ 
     1298    if (pjsua.acc[acc_index].regc != NULL)  
     1299        pjsua_acc_set_registration(acc_index, PJ_FALSE); 
     1300 
     1301    /* Invalidate */ 
     1302    pjsua.acc[acc_index].valid = PJ_FALSE; 
     1303 
     1304    return PJ_SUCCESS; 
     1305} 
    12251306 
    12261307 
     
    12671348 
    12681349        tmp.ptr = buf; 
    1269         tmp.slen = pj_ansi_sprintf(tmp.ptr, "<sip:%s:%d>",  
     1350        tmp.slen = pj_ansi_sprintf(tmp.ptr, "Local <sip:%s:%d>",  
    12701351                                   pjsua.config.sip_host.ptr, 
    12711352                                   pjsua.config.sip_port); 
     
    12831364    } 
    12841365     
     1366 
     1367    /* Add another account as the last one.  
     1368     * This account corresponds to local endpoint, and is user-less. 
     1369     * This is also the default account. 
     1370     */ 
     1371    if (pjsua.config.acc_cnt < PJ_ARRAY_SIZE(pjsua.config.acc_config)) { 
     1372        pjsua.default_acc = pjsua.config.acc_cnt; 
     1373        pjsua.acc[pjsua.default_acc].auto_gen = 1; 
     1374        pjsua.config.acc_cnt++; 
     1375    } 
     1376 
    12851377 
    12861378    /* Initialize accounts: */ 
     
    12921384        } 
    12931385    } 
    1294  
    12951386 
    12961387 
     
    13341425 
    13351426 
     1427    /* Refresh presence */ 
     1428    pjsua_pres_refresh(); 
     1429 
    13361430 
    13371431    PJ_LOG(3,(THIS_FILE, "PJSUA version %s started", PJ_VERSION)); 
     
    13691463 
    13701464/** 
    1371  * Enum all conference ports. 
    1372  */ 
    1373 PJ_DEF(pj_status_t) pjsua_conf_enum_ports( unsigned *count, 
    1374                                            pjmedia_conf_port_info info[]) 
    1375 { 
    1376     return pjmedia_conf_get_ports_info(pjsua.mconf, count, info); 
    1377 } 
    1378  
    1379  
     1465 * Enum all conference port ID. 
     1466 */ 
     1467PJ_DEF(pj_status_t) pjsua_conf_enum_port_ids( pjsua_conf_port_id id[], 
     1468                                              unsigned *count) 
     1469{ 
     1470    return pjmedia_conf_enum_ports( pjsua.mconf, (unsigned*)id, count); 
     1471} 
     1472 
     1473 
     1474 
     1475/** 
     1476 * Get information about the specified conference port 
     1477 */ 
     1478PJ_DEF(pj_status_t) pjsua_conf_get_port_info( pjsua_conf_port_id id, 
     1479                                              pjsua_conf_port_info *info) 
     1480{ 
     1481    pjmedia_conf_port_info cinfo; 
     1482    unsigned i, count; 
     1483    pj_status_t status; 
     1484 
     1485    status = pjmedia_conf_get_port_info( pjsua.mconf, id, &cinfo); 
     1486    if (status != PJ_SUCCESS) 
     1487        return status; 
     1488 
     1489    pj_memset(info, 0, sizeof(*info)); 
     1490    info->slot_id = id; 
     1491    info->name = cinfo.name; 
     1492    info->clock_rate = cinfo.clock_rate; 
     1493    info->channel_count = cinfo.channel_count; 
     1494    info->samples_per_frame = cinfo.samples_per_frame; 
     1495    info->bits_per_sample = cinfo.bits_per_sample; 
     1496 
     1497    /* Build array of listeners */ 
     1498    count = pjsua.config.conf_ports; 
     1499    for (i=0; i<count; ++i) { 
     1500        if (cinfo.listener[i]) { 
     1501            info->listeners[info->listener_cnt++] = i; 
     1502        } 
     1503    } 
     1504 
     1505    return PJ_SUCCESS; 
     1506} 
    13801507 
    13811508 
     
    13831510 * Connect conference port. 
    13841511 */ 
    1385 PJ_DEF(pj_status_t) pjsua_conf_connect( unsigned src_port, 
    1386                                         unsigned dst_port) 
     1512PJ_DEF(pj_status_t) pjsua_conf_connect( pjsua_conf_port_id src_port, 
     1513                                        pjsua_conf_port_id dst_port) 
    13871514{ 
    13881515    return pjmedia_conf_connect_port(pjsua.mconf, src_port, dst_port, 0); 
     
    13931520 * Connect conference port connection. 
    13941521 */ 
    1395 PJ_DEF(pj_status_t) pjsua_conf_disconnect( unsigned src_port, 
    1396                                            unsigned dst_port) 
     1522PJ_DEF(pj_status_t) pjsua_conf_disconnect( pjsua_conf_port_id src_port, 
     1523                                           pjsua_conf_port_id dst_port) 
    13971524{ 
    13981525    return pjmedia_conf_disconnect_port(pjsua.mconf, src_port, dst_port); 
     
    14351562    pjsua.player[pjsua.player_cnt].slot = slot; 
    14361563 
    1437     if (*id) 
     1564    if (id) 
    14381565        *id = pjsua.player_cnt; 
    14391566 
     
    14471574 * Get conference port associated with player. 
    14481575 */ 
    1449 PJ_DEF(int) pjsua_player_get_conf_port(pjsua_player_id id) 
     1576PJ_DEF(pjsua_conf_port_id) pjsua_player_get_conf_port(pjsua_player_id id) 
    14501577{ 
    14511578    PJ_ASSERT_RETURN(id>=0 && id < PJ_ARRAY_SIZE(pjsua.player), PJ_EINVAL); 
     
    15311658 * Get conference port associated with recorder. 
    15321659 */ 
    1533 PJ_DEF(int) pjsua_recorder_get_conf_port(pjsua_recorder_id id) 
     1660PJ_DEF(pjsua_conf_port_id) pjsua_recorder_get_conf_port(pjsua_recorder_id id) 
    15341661{ 
    15351662    PJ_ASSERT_RETURN(id>=0 && id < PJ_ARRAY_SIZE(pjsua.recorder), PJ_EINVAL); 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_im.c

    r482 r492  
    186186    pj_str_t from, to; 
    187187    pjsip_accept_hdr *accept_hdr; 
     188    pjsip_contact_hdr *contact_hdr; 
    188189    pjsip_msg *msg; 
    189190    pj_status_t status; 
     
    222223                                  NULL, NULL, NULL); 
    223224 
    224     /* Build the From text. */ 
     225    /* For the source URI, we use Contact header if present, since 
     226     * Contact header contains the port number information. If this is 
     227     * not available, then use From header. 
     228     */ 
    225229    from.ptr = pj_pool_alloc(rdata->tp_info.pool, PJSIP_MAX_URL_SIZE); 
    226     from.slen = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR,  
    227                                 rdata->msg_info.from->uri, 
    228                                 from.ptr, PJSIP_MAX_URL_SIZE); 
     230    contact_hdr = pjsip_msg_find_hdr(rdata->msg_info.msg, 
     231                                     PJSIP_H_CONTACT, NULL); 
     232    if (contact_hdr) { 
     233        from.slen = pjsip_uri_print(PJSIP_URI_IN_CONTACT_HDR, 
     234                                    contact_hdr->uri,  
     235                                    from.ptr, PJSIP_MAX_URL_SIZE); 
     236    } else { 
     237        from.slen = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR,  
     238                                    rdata->msg_info.from->uri, 
     239                                    from.ptr, PJSIP_MAX_URL_SIZE); 
     240    } 
     241 
    229242    if (from.slen < 1) 
    230243        from = pj_str("<--URI is too long-->"); 
     
    337350                                    pj_bool_t is_typing) 
    338351{ 
     352    const pj_str_t STR_CONTACT = { "Contact", 7 }; 
    339353    pjsip_tx_data *tdata; 
    340354    pj_status_t status; 
     
    351365 
    352366 
     367    /* Add accept header. */ 
     368    pjsip_msg_add_hdr( tdata->msg,  
     369                       (pjsip_hdr*)pjsua_im_create_accept(tdata->pool)); 
     370 
     371 
     372    /* Add contact. */ 
     373    pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) 
     374        pjsip_generic_string_hdr_create(tdata->pool,  
     375                                        &STR_CONTACT, 
     376                                        &pjsua.config.acc_config[acc_index].contact)); 
     377 
     378 
    353379    /* Create "application/im-iscomposing+xml" msg body. */ 
    354380    tdata->msg->body = pjsip_iscomposing_create_body( tdata->pool, is_typing, 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_imp.h

    r487 r492  
    3333    unsigned             index;     /**< Index in pjsua array.              */ 
    3434    pjsip_inv_session   *inv;       /**< The invite session.                */ 
     35    pjsip_status_code    last_code; /**<Last status code seen.              */ 
    3536    pj_time_val          start_time;/**< First INVITE sent/received.        */ 
    3637    pj_time_val          res_time;  /**< First response sent/received.      */ 
     
    6263    pj_str_t             host;      /**< Buddy host.                    */ 
    6364    unsigned             port;      /**< Buddy port.                    */ 
    64     int                  acc_index; /**< Which account to use.          */ 
    6565    pj_bool_t            monitor;   /**< Should we monitor?             */ 
    6666    pjsip_evsub         *sub;       /**< Buddy presence subscription    */ 
     
    9090struct pjsua_acc 
    9191{ 
     92    pj_bool_t        valid;         /**< Is this account valid?         */ 
     93    pj_bool_t        auto_gen;      /**< Is this account generated.     */ 
    9294    int              index;         /**< Index in accounts array.       */ 
    9395    pj_str_t         user_part;     /**< User part of local URI.        */ 
     
    160162 
    161163    /* Account: */ 
     164    int              default_acc;   /**< Default account to use.        */ 
    162165    pjsua_acc        acc[PJSUA_MAX_ACC];    /** Client regs array.      */ 
    163166 
     
    176179    pjsua_call       calls[PJSUA_MAX_CALLS];    /** Calls array.        */ 
    177180 
    178  
    179181    /* SIMPLE and buddy status: */ 
    180182    pjsua_buddy      buddies[PJSUA_MAX_BUDDIES]; 
     
    186188 
    187189 
    188  
    189 /** 
    190  * Find account for incoming request. 
    191  */ 
    192 int pjsua_find_account_for_incoming(pjsip_rx_data *rdata); 
    193  
    194  
    195 /** 
    196  * Find account for outgoing request. 
    197  */ 
    198 int pjsua_find_account_for_outgoing(const pj_str_t *url); 
     190void pjsua_copy_config( pj_pool_t *pool, pjsua_config *dst,  
     191                        const pjsua_config *src); 
    199192 
    200193 
     
    224217pj_status_t pjsua_pres_init(); 
    225218 
     219 
     220/** 
     221 * Refresh both presence client and server subscriptions. 
     222 */ 
     223void pjsua_pres_refresh(void); 
    226224 
    227225/** 
     
    256254 
    257255 
     256extern pjsip_module pjsua_msg_logger; 
    258257 
    259258#endif  /* __PJSUA_IMP_H__ */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_pres.c

    r487 r492  
    9898 
    9999    /* Find which account for the incoming request. */ 
    100     acc_index = pjsua_find_account_for_incoming(rdata); 
     100    acc_index = pjsua_acc_find_for_incoming(rdata); 
    101101    acc_config = &pjsua.config.acc_config[acc_index]; 
    102102 
     
    311311    pj_status_t status; 
    312312 
    313     acc_index = pjsua.buddies[index].acc_index; 
     313    acc_index = pjsua_acc_find_for_outgoing(&pjsua.config.buddy_uri[index]); 
     314 
    314315    acc_config = &pjsua.config.acc_config[acc_index]; 
    315316 
     
    440441 * Get buddy info. 
    441442 */ 
    442 PJ_DEF(pj_status_t) pjsua_buddy_get_info(unsigned index, 
     443PJ_DEF(pj_status_t) pjsua_buddy_get_info(pjsua_buddy_id index, 
    443444                                         pjsua_buddy_info *info) 
    444445{ 
    445446    pjsua_buddy *buddy; 
    446447 
    447     PJ_ASSERT_RETURN(index < pjsua.config.buddy_cnt, PJ_EINVAL); 
     448    PJ_ASSERT_RETURN(index < (int)PJ_ARRAY_SIZE(pjsua.config.buddy_uri),  
     449                     PJ_EINVAL); 
    448450 
    449451    pj_memset(info, 0, sizeof(pjsua_buddy_info)); 
     
    472474    } 
    473475 
    474     info->acc_index = buddy->acc_index; 
    475476    return PJ_SUCCESS; 
    476477} 
     
    481482 */ 
    482483PJ_DEF(pj_status_t) pjsua_buddy_add( const pj_str_t *uri, 
    483                                      int *buddy_index) 
     484                                     pjsua_buddy_id *buddy_index) 
    484485{ 
    485486    pjsip_name_addr *url; 
     
    488489    pj_str_t tmp; 
    489490 
    490     PJ_ASSERT_RETURN(pjsua.config.buddy_cnt <= PJ_ARRAY_SIZE(pjsua.config.buddy_uri), 
     491    PJ_ASSERT_RETURN(pjsua.config.buddy_cnt <=  
     492                        PJ_ARRAY_SIZE(pjsua.config.buddy_uri), 
    491493                     PJ_ETOOMANY); 
    492494 
    493     index = pjsua.config.buddy_cnt; 
     495    /* Find empty slot */ 
     496    for (index=0; index<PJ_ARRAY_SIZE(pjsua.config.buddy_uri); ++index) { 
     497        if (pjsua.config.buddy_uri[index].slen == 0) 
     498            break; 
     499    } 
     500 
     501    /* Expect to find an empty slot */ 
     502    PJ_ASSERT_RETURN(index < PJ_ARRAY_SIZE(pjsua.config.buddy_uri), 
     503                     PJ_ETOOMANY); 
     504 
    494505 
    495506    /* Get name and display name for buddy */ 
     
    512523        pjsua.buddies[index].port = 5060; 
    513524 
    514     /* Find account for outgoing preence subscription */ 
    515     pjsua.buddies[index].acc_index =  
    516         pjsua_find_account_for_outgoing(&pjsua.config.buddy_uri[index]); 
    517  
    518525    if (buddy_index) 
    519526        *buddy_index = index; 
     
    526533 
    527534 
    528 PJ_DEF(pj_status_t) pjsua_buddy_subscribe_pres( unsigned index, 
     535/** 
     536 * Delete buddy. 
     537 */ 
     538PJ_DEF(pj_status_t) pjsua_buddy_del(pjsua_buddy_id index) 
     539{ 
     540    PJ_ASSERT_RETURN(index < (int)PJ_ARRAY_SIZE(pjsua.config.buddy_uri),  
     541                     PJ_EINVAL); 
     542 
     543    if (pjsua.config.buddy_uri[index].slen == 0) 
     544        return PJ_SUCCESS; 
     545 
     546    /* Unsubscribe presence */ 
     547    pjsua_buddy_subscribe_pres(index, PJ_FALSE); 
     548 
     549    /* Remove buddy */ 
     550    pjsua.config.buddy_uri[index].slen = 0; 
     551    pjsua.config.buddy_cnt--; 
     552 
     553    return PJ_SUCCESS; 
     554} 
     555 
     556 
     557PJ_DEF(pj_status_t) pjsua_buddy_subscribe_pres( pjsua_buddy_id index, 
    529558                                                pj_bool_t monitor) 
    530559{ 
    531560    pjsua_buddy *buddy; 
    532561 
    533     PJ_ASSERT_RETURN(index < pjsua.config.buddy_cnt, PJ_EINVAL); 
     562    PJ_ASSERT_RETURN(index < (int)PJ_ARRAY_SIZE(pjsua.config.buddy_uri), 
     563                     PJ_EINVAL); 
    534564 
    535565    buddy = &pjsua.buddies[index]; 
    536566    buddy->monitor = monitor; 
     567    pjsua_pres_refresh(); 
    537568    return PJ_SUCCESS; 
    538569} 
    539570 
    540571 
    541 PJ_DEF(pj_status_t) pjsua_acc_set_online_status( unsigned acc_index, 
     572PJ_DEF(pj_status_t) pjsua_acc_set_online_status( pjsua_acc_id acc_index, 
    542573                                                 pj_bool_t is_online) 
    543574{ 
    544     PJ_ASSERT_RETURN(acc_index < pjsua.config.acc_cnt, PJ_EINVAL); 
     575    PJ_ASSERT_RETURN(acc_index < (int)PJ_ARRAY_SIZE(pjsua.acc),  
     576                     PJ_EINVAL); 
     577    PJ_ASSERT_RETURN(pjsua.acc[acc_index].valid, PJ_EINVALIDOP); 
     578 
    545579    pjsua.acc[acc_index].online_status = is_online; 
     580    pjsua_pres_refresh(); 
    546581    return PJ_SUCCESS; 
    547582} 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_reg.c

    r487 r492  
    9696 * Get account info. 
    9797 */ 
    98 PJ_DEF(pj_status_t) pjsua_acc_get_info( unsigned acc_index, 
     98PJ_DEF(pj_status_t) pjsua_acc_get_info( pjsua_acc_id acc_index, 
    9999                                        pjsua_acc_info *info) 
    100100{ 
     
    102102    pjsua_acc_config *acc_cfg = &pjsua.config.acc_config[acc_index]; 
    103103 
    104     PJ_ASSERT_RETURN(acc_index < pjsua.config.acc_cnt, PJ_EINVAL); 
    105  
     104    PJ_ASSERT_RETURN(info != NULL, PJ_EINVAL); 
     105     
    106106    pj_memset(info, 0, sizeof(pjsua_acc_info)); 
    107107 
     108    PJ_ASSERT_RETURN(acc_index < (int)pjsua.config.acc_cnt,  
     109                     PJ_EINVAL); 
     110    PJ_ASSERT_RETURN(pjsua.acc[acc_index].valid, PJ_EINVALIDOP); 
     111 
     112     
    108113    info->index = acc_index; 
    109114    info->acc_id = acc_cfg->id; 
     
    115120        pj_strerror(acc->reg_last_err, info->buf, sizeof(info->buf)); 
    116121        info->status_text = pj_str(info->buf); 
    117     } else { 
     122    } else if (acc->reg_last_code) { 
    118123        info->status = acc->reg_last_code; 
    119124        info->status_text = *pjsip_get_status_text(acc->reg_last_code); 
     125    } else { 
     126        info->status = 0; 
     127        info->status_text = pj_str("In Progress"); 
    120128    } 
    121129     
     
    130138 
    131139 
     140PJ_DEF(pj_status_t) pjsua_acc_enum_info( pjsua_acc_info info[], 
     141                                         unsigned *count ) 
     142{ 
     143    unsigned i, c; 
     144 
     145    for (i=0, c=0; c<*count && i<PJ_ARRAY_SIZE(pjsua.acc); ++i) { 
     146        if (!pjsua.acc[i].valid) 
     147            continue; 
     148 
     149        pjsua_acc_get_info(i, &info[c]); 
     150        ++c; 
     151    } 
     152 
     153    *count = c; 
     154    return PJ_SUCCESS; 
     155} 
     156 
     157 
     158/** 
     159 * Enum accounts id. 
     160 */ 
     161PJ_DEF(pj_status_t) pjsua_acc_enum_id( pjsua_acc_id ids[], 
     162                                       unsigned *count ) 
     163{ 
     164    unsigned i, c; 
     165 
     166    for (i=0, c=0; c<*count && i<PJ_ARRAY_SIZE(pjsua.acc); ++i) { 
     167        if (!pjsua.acc[i].valid) 
     168            continue; 
     169        ids[c] = i; 
     170        ++c; 
     171    } 
     172 
     173    *count = c; 
     174    return PJ_SUCCESS; 
     175} 
     176 
     177 
    132178/* 
    133179 * Update registration. If renew is false, then unregistration will be performed. 
    134180 */ 
    135 PJ_DECL(pj_status_t) pjsua_acc_set_registration(unsigned acc_index, pj_bool_t renew) 
     181PJ_DECL(pj_status_t) pjsua_acc_set_registration(pjsua_acc_id acc_index,  
     182                                                pj_bool_t renew) 
    136183{ 
    137184    pj_status_t status = 0; 
    138185    pjsip_tx_data *tdata = 0; 
     186 
     187    PJ_ASSERT_RETURN(acc_index < (int)pjsua.config.acc_cnt,  
     188                     PJ_EINVAL); 
     189    PJ_ASSERT_RETURN(pjsua.acc[acc_index].valid, PJ_EINVALIDOP); 
    139190 
    140191    if (renew) { 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_settings.c

    r487 r492  
    212212/* Parse arguments. */ 
    213213PJ_DEF(pj_status_t) pjsua_parse_args(int argc, char *argv[], 
    214                                      pjsua_config *cfg) 
     214                                     pjsua_config *cfg, 
     215                                     pj_str_t *uri_to_call) 
    215216{ 
    216217    int c; 
     
    596597 
    597598    if (pj_optind != argc) { 
     599        pj_str_t uri_arg; 
    598600 
    599601        if (pjsua_verify_sip_url(argv[pj_optind]) != PJ_SUCCESS) { 
     
    601603            return -1; 
    602604        } 
    603         cfg->uri_to_call = pj_str(argv[pj_optind]); 
     605        uri_arg = pj_str(argv[pj_optind]); 
     606        if (uri_to_call) 
     607            *uri_to_call = uri_arg; 
    604608        pj_optind++; 
    605609 
    606610        /* Add URI to call to buddy list if it's not already there */ 
    607611        for (i=0; i<cfg->buddy_cnt; ++i) { 
    608             if (pj_stricmp(&cfg->buddy_uri[i], &cfg->uri_to_call)==0) 
     612            if (pj_stricmp(&cfg->buddy_uri[i], &uri_arg)==0) 
    609613                break; 
    610614        } 
    611615        if (i == cfg->buddy_cnt && cfg->buddy_cnt < PJSUA_MAX_BUDDIES) { 
    612             cfg->buddy_uri[cfg->buddy_cnt++] = cfg->uri_to_call; 
    613         } 
     616            cfg->buddy_uri[cfg->buddy_cnt++] = uri_arg; 
     617        } 
     618 
     619    } else { 
     620        if (uri_to_call) 
     621            uri_to_call->slen = 0; 
    614622    } 
    615623 
     
    870878} 
    871879 
    872 PJ_DEF(void) pjsua_dump_call(int call_index, int with_media,  
     880PJ_DEF(void) pjsua_call_dump(int call_index, int with_media,  
    873881                             char *buffer, unsigned maxlen, 
    874882                             const char *indent) 
     
    976984        for (i=0; i<pjsua.config.max_calls; ++i) { 
    977985            if (pjsua.calls[i].inv) { 
    978                 pjsua_dump_call(i, detail, buf, sizeof(buf), "  "); 
     986                pjsua_call_dump(i, detail, buf, sizeof(buf), "  "); 
    979987                PJ_LOG(3,(THIS_FILE, "%s", buf)); 
    980988            } 
     
    9941002 */ 
    9951003PJ_DECL(pj_status_t) pjsua_load_settings(const char *filename, 
    996                                          pjsua_config *cfg) 
     1004                                         pjsua_config *cfg, 
     1005                                         pj_str_t *uri_to_call) 
    9971006{ 
    9981007    int argc = 3; 
     
    10001009 
    10011010    argv[2] = (char*)filename; 
    1002     return pjsua_parse_args(argc, argv, cfg); 
     1011    return pjsua_parse_args(argc, argv, cfg, uri_to_call); 
    10031012} 
    10041013 
     
    12981307 * Get pjsua running config. 
    12991308 */ 
    1300 PJ_DEF(const pjsua_config*) pjsua_get_config(void) 
    1301 { 
    1302     return &pjsua.config; 
    1303 } 
    1304  
     1309PJ_DEF(void) pjsua_get_config(pj_pool_t *pool, 
     1310                              pjsua_config *cfg) 
     1311{ 
     1312    unsigned i; 
     1313 
     1314    pjsua_copy_config(pool, cfg, &pjsua.config); 
     1315 
     1316    /* Compact buddy uris. */ 
     1317    for (i=0; i<PJ_ARRAY_SIZE(pjsua.config.buddy_uri)-1; ++i) { 
     1318        if (pjsua.config.buddy_uri[i].slen == 0) { 
     1319            unsigned j; 
     1320 
     1321            for (j=i+1; j<PJ_ARRAY_SIZE(pjsua.config.buddy_uri); ++j) { 
     1322                if (pjsua.config.buddy_uri[j].slen != 0) 
     1323                    break; 
     1324            } 
     1325         
     1326            if (j == PJ_ARRAY_SIZE(pjsua.config.buddy_uri)) 
     1327                break; 
     1328            else 
     1329                pjsua.config.buddy_uri[i] = pjsua.config.buddy_uri[j]; 
     1330        } 
     1331    } 
     1332 
     1333    /* Compact accounts. */ 
     1334    for (i=0; i<PJ_ARRAY_SIZE(pjsua.config.acc_config)-1; ++i) { 
     1335 
     1336        if (pjsua.acc[i].valid == PJ_FALSE || pjsua.acc[i].auto_gen) { 
     1337            unsigned j; 
     1338 
     1339            for (j=i+1; j<PJ_ARRAY_SIZE(pjsua.config.acc_config); ++j) { 
     1340                if (pjsua.acc[j].valid && !pjsua.acc[j].auto_gen) 
     1341                    break; 
     1342            } 
     1343         
     1344            if (j == PJ_ARRAY_SIZE(pjsua.config.acc_config)) { 
     1345                break; 
     1346            } else { 
     1347                pj_memcpy(&pjsua.config.acc_config[i] , 
     1348                          &pjsua.config.acc_config[j], 
     1349                          sizeof(pjsua_acc_config)); 
     1350            } 
     1351        } 
     1352 
     1353    } 
     1354 
     1355    /* Remove auto generated account from config */ 
     1356    for (i=0; i<PJ_ARRAY_SIZE(pjsua.config.acc_config); ++i) { 
     1357        if (pjsua.acc[i].auto_gen) 
     1358            --cfg->acc_cnt; 
     1359    } 
     1360} 
     1361 
     1362 
     1363 
     1364/***************************************************************************** 
     1365 * This is a very simple PJSIP module, whose sole purpose is to display 
     1366 * incoming and outgoing messages to log. This module will have priority 
     1367 * higher than transport layer, which means: 
     1368 * 
     1369 *  - incoming messages will come to this module first before reaching 
     1370 *    transaction layer. 
     1371 * 
     1372 *  - outgoing messages will come to this module last, after the message 
     1373 *    has been 'printed' to contiguous buffer by transport layer and 
     1374 *    appropriate transport instance has been decided for this message. 
     1375 * 
     1376 */ 
     1377 
     1378/* Notification on incoming messages */ 
     1379static pj_bool_t logging_on_rx_msg(pjsip_rx_data *rdata) 
     1380{ 
     1381    PJ_LOG(4,(THIS_FILE, "RX %d bytes %s from %s:%d:\n" 
     1382                         "%s\n" 
     1383                         "--end msg--", 
     1384                         rdata->msg_info.len, 
     1385                         pjsip_rx_data_get_info(rdata), 
     1386                         rdata->pkt_info.src_name, 
     1387                         rdata->pkt_info.src_port, 
     1388                         rdata->msg_info.msg_buf)); 
     1389     
     1390    /* Always return false, otherwise messages will not get processed! */ 
     1391    return PJ_FALSE; 
     1392} 
     1393 
     1394/* Notification on outgoing messages */ 
     1395static pj_status_t logging_on_tx_msg(pjsip_tx_data *tdata) 
     1396{ 
     1397     
     1398    /* Important note: 
     1399     *  tp_info field is only valid after outgoing messages has passed 
     1400     *  transport layer. So don't try to access tp_info when the module 
     1401     *  has lower priority than transport layer. 
     1402     */ 
     1403 
     1404    PJ_LOG(4,(THIS_FILE, "TX %d bytes %s to %s:%d:\n" 
     1405                         "%s\n" 
     1406                         "--end msg--", 
     1407                         (tdata->buf.cur - tdata->buf.start), 
     1408                         pjsip_tx_data_get_info(tdata), 
     1409                         tdata->tp_info.dst_name, 
     1410                         tdata->tp_info.dst_port, 
     1411                         tdata->buf.start)); 
     1412 
     1413    /* Always return success, otherwise message will not get sent! */ 
     1414    return PJ_SUCCESS; 
     1415} 
     1416 
     1417/* The module instance. */ 
     1418pjsip_module pjsua_msg_logger =  
     1419{ 
     1420    NULL, NULL,                         /* prev, next.          */ 
     1421    { "mod-pjsua-log", 13 },            /* Name.                */ 
     1422    -1,                                 /* Id                   */ 
     1423    PJSIP_MOD_PRIORITY_TRANSPORT_LAYER-1,/* Priority            */ 
     1424    NULL,                               /* load()               */ 
     1425    NULL,                               /* start()              */ 
     1426    NULL,                               /* stop()               */ 
     1427    NULL,                               /* unload()             */ 
     1428    &logging_on_rx_msg,                 /* on_rx_request()      */ 
     1429    &logging_on_rx_msg,                 /* on_rx_response()     */ 
     1430    &logging_on_tx_msg,                 /* on_tx_request.       */ 
     1431    &logging_on_tx_msg,                 /* on_tx_response()     */ 
     1432    NULL,                               /* on_tsx_state()       */ 
     1433 
     1434}; 
     1435 
Note: See TracChangeset for help on using the changeset viewer.