Ignore:
Timestamp:
Feb 21, 2006 11:47:00 PM (18 years ago)
Author:
bennylp
Message:

Implemented major feature: call hold and transfer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua/main.c

    r205 r212  
    114114                    "%s (%.*s;expires=%d)", 
    115115                    pjsip_get_status_text(pjsua.regc_last_code)->ptr, 
    116                     (int)info.server_uri.slen, 
    117                     info.server_uri.ptr, 
     116                    (int)info.client_uri.slen, 
     117                    info.client_uri.ptr, 
    118118                    info.next_reg); 
    119119 
     
    132132    puts("|                              |                          |                   |"); 
    133133    puts("|  m  Make new call            |  i  Send IM              |  o  Send OPTIONS  |"); 
    134     puts("|  a  Answer call              |  s  Subscribe presence   |  R  (Re-)register |"); 
    135     puts("|  h  Hangup call              |  u  Unsubscribe presence |  r  Unregister    |"); 
    136     puts("|  ]  Select next dialog       |  t  Toggle Online status |  d  Dump status   |"); 
     134    puts("|  a  Answer call              |  s  Subscribe presence   | rr  (Re-)register |"); 
     135    puts("|  h  Hangup call              |  u  Unsubscribe presence | ru  Unregister    |"); 
     136    puts("|  ]  Select next dialog       |  t  ToGgle Online status |  d  Dump status   |"); 
    137137    puts("|  [  Select previous dialog   |                          |                   |"); 
    138     puts("+-----------------------------------------------------------------------------+"); 
    139     puts("|      Conference Command                                                     |"); 
    140     puts("| cl  List ports                                                              |"); 
    141     puts("| cc  Connect port                                                            |"); 
    142     puts("| cd  Disconnect port                                                         |"); 
    143     puts("+-----------------------------------------------------------------------------+"); 
     138    puts("|                              +--------------------------+-------------------+"); 
     139    puts("|  H  Hold call                |     Conference Command   |                   |"); 
     140    puts("|  v  re-inVite (release hold) | cl  List ports           |                   |"); 
     141    puts("|  x  Xfer call                | cc  Connect port         |                   |"); 
     142    puts("|                              | cd  Disconnect port      |                   |"); 
     143    puts("+------------------------------+--------------------------+-------------------+"); 
    144144    puts("|  q  QUIT                                                                    |"); 
    145145    puts("+=============================================================================+"); 
     
    284284    char menuin[10]; 
    285285    char buf[128]; 
    286     pjsip_inv_session *inv; 
    287286    struct input_result result; 
    288287 
     
    306305                    puts("You can't do that with make call!"); 
    307306                else 
    308                     pjsua_invite(pjsua.buddies[result.nb_result].uri.ptr, &inv); 
     307                    pjsua_invite(pjsua.buddies[result.nb_result].uri.ptr, NULL); 
    309308            } else if (result.uri_result) 
    310                 pjsua_invite(result.uri_result, &inv); 
     309                pjsua_invite(result.uri_result, NULL); 
    311310             
    312311            break; 
     
    354353 
    355354            } else { 
    356                 pj_status_t status; 
    357                 pjsip_tx_data *tdata; 
    358  
    359                 status = pjsip_inv_end_session(inv_session->inv,  
    360                                                PJSIP_SC_DECLINE, NULL, &tdata); 
    361                 if (status != PJ_SUCCESS) { 
    362                     pjsua_perror(THIS_FILE,  
    363                                  "Failed to create end session message",  
    364                                  status); 
    365                     continue; 
     355                pjsua_inv_hangup(inv_session, PJSIP_SC_DECLINE); 
     356            } 
     357            break; 
     358 
     359        case ']': 
     360        case '[': 
     361            /* 
     362             * Cycle next/prev dialog. 
     363             */ 
     364            if (menuin[0] == ']') { 
     365                inv_session = inv_session->next; 
     366                if (inv_session == &pjsua.inv_list) 
     367                    inv_session = pjsua.inv_list.next; 
     368 
     369            } else { 
     370                inv_session = inv_session->prev; 
     371                if (inv_session == &pjsua.inv_list) 
     372                    inv_session = pjsua.inv_list.prev; 
     373            } 
     374 
     375            if (inv_session != &pjsua.inv_list) { 
     376                char url[PJSIP_MAX_URL_SIZE]; 
     377                int len; 
     378 
     379                len = pjsip_uri_print(0, inv_session->inv->dlg->remote.info->uri, 
     380                                      url, sizeof(url)-1); 
     381                if (len < 1) { 
     382                    pj_ansi_strcpy(url, "<uri is too long>"); 
     383                } else { 
     384                    url[len] = '\0'; 
    366385                } 
    367386 
    368                 status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); 
    369                 if (status != PJ_SUCCESS) { 
    370                     pjsua_perror(THIS_FILE,  
    371                                  "Failed to send end session message",  
    372                                  status); 
    373                     continue; 
     387                PJ_LOG(3,(THIS_FILE,"Current dialog: %s", url)); 
     388 
     389            } else { 
     390                PJ_LOG(3,(THIS_FILE,"No current dialog")); 
     391            } 
     392            break; 
     393 
     394        case 'H': 
     395            /* 
     396             * Hold call. 
     397             */ 
     398            if (inv_session != &pjsua.inv_list) { 
     399                 
     400                pjsua_inv_set_hold(inv_session); 
     401 
     402            } else { 
     403                PJ_LOG(3,(THIS_FILE, "No current call")); 
     404            } 
     405            break; 
     406 
     407        case 'v': 
     408            /* 
     409             * Send re-INVITE (to release hold, etc). 
     410             */ 
     411            if (inv_session != &pjsua.inv_list) { 
     412                 
     413                pjsua_inv_reinvite(inv_session); 
     414 
     415            } else { 
     416                PJ_LOG(3,(THIS_FILE, "No current call")); 
     417            } 
     418            break; 
     419 
     420        case 'x': 
     421            /* 
     422             * Transfer call. 
     423             */ 
     424            if (inv_session == &pjsua.inv_list) { 
     425                 
     426                PJ_LOG(3,(THIS_FILE, "No current call")); 
     427 
     428            } else { 
     429                ui_input_url("Transfer to URL", buf, sizeof(buf), &result); 
     430                if (result.nb_result != NO_NB) { 
     431                    if (result.nb_result == -1)  
     432                        puts("You can't do that with transfer call!"); 
     433                    else 
     434                        pjsua_inv_xfer_call( inv_session, 
     435                                             pjsua.buddies[result.nb_result].uri.ptr); 
     436 
     437                } else if (result.uri_result) { 
     438                    pjsua_inv_xfer_call( inv_session, result.uri_result); 
    374439                } 
    375440            } 
    376             break; 
    377  
    378         case ']': 
    379             inv_session = inv_session->next; 
    380             if (inv_session == &pjsua.inv_list) 
    381                 inv_session = pjsua.inv_list.next; 
    382             break; 
    383  
    384         case '[': 
    385             inv_session = inv_session->prev; 
    386             if (inv_session == &pjsua.inv_list) 
    387                 inv_session = pjsua.inv_list.prev; 
    388441            break; 
    389442 
    390443        case 's': 
    391444        case 'u': 
    392             ui_input_url("Subscribe presence of", buf, sizeof(buf), &result); 
     445            /* 
     446             * Subscribe/unsubscribe presence. 
     447             */ 
     448            ui_input_url("(un)Subscribe presence of", buf, sizeof(buf), &result); 
    393449            if (result.nb_result != NO_NB) { 
    394450                if (result.nb_result == -1) { 
     
    403459 
    404460            } else if (result.uri_result) { 
    405                 puts("Sorry, can only subscribe to buddy's presence, not arbitrary URL (for now)"); 
    406             } 
    407  
    408             break; 
    409  
    410         case 'R': 
    411             pjsua_regc_update(PJ_TRUE); 
     461                puts("Sorry, can only subscribe to buddy's presence, " 
     462                     "not arbitrary URL (for now)"); 
     463            } 
     464 
     465            break; 
     466 
     467        case 'r': 
     468            switch (menuin[1]) { 
     469            case 'r': 
     470                /* 
     471                 * Re-Register. 
     472                 */ 
     473                pjsua_regc_update(PJ_TRUE); 
     474                break; 
     475            case 'u': 
     476                /* 
     477                 * Unregister 
     478                 */ 
     479                pjsua_regc_update(PJ_FALSE); 
     480                break; 
     481            } 
    412482            break; 
    413483             
    414         case 'r': 
    415             pjsua_regc_update(PJ_FALSE); 
    416             break; 
    417  
    418484        case 't': 
    419485            pjsua.online_status = !pjsua.online_status; 
     
    431497                    char src_port[10], dst_port[10]; 
    432498                    pj_status_t status; 
    433  
    434                     if (!simple_input("Connect src port #:", src_port, sizeof(src_port))) 
     499                    const char *src_title, *dst_title; 
     500 
     501                    conf_list(); 
     502 
     503                    src_title = (menuin[1]=='c'? 
     504                                 "Connect src port #": 
     505                                 "Disconnect src port #"); 
     506                    dst_title = (menuin[1]=='c'? 
     507                                 "To dst port #": 
     508                                 "From dst port #"); 
     509 
     510                    if (!simple_input(src_title, src_port, sizeof(src_port))) 
    435511                        break; 
    436                     if (!simple_input("To dst port #:", dst_port, sizeof(dst_port))) 
     512 
     513                    if (!simple_input(dst_title, dst_port, sizeof(dst_port))) 
    437514                        break; 
    438515 
    439516                    if (menuin[1]=='c') { 
    440                         status = pjmedia_conf_connect_port(pjsua.mconf, atoi(src_port), atoi(dst_port)); 
     517                        status = pjmedia_conf_connect_port(pjsua.mconf,  
     518                                                           atoi(src_port),  
     519                                                           atoi(dst_port)); 
    441520                    } else { 
    442                         status = pjmedia_conf_disconnect_port(pjsua.mconf, atoi(src_port), atoi(dst_port)); 
     521                        status = pjmedia_conf_disconnect_port(pjsua.mconf,  
     522                                                              atoi(src_port),  
     523                                                              atoi(dst_port)); 
    443524                    } 
    444525                    if (status == PJ_SUCCESS) { 
Note: See TracChangeset for help on using the changeset viewer.