Ignore:
Timestamp:
Feb 19, 2006 1:38:06 AM (18 years ago)
Author:
bennylp
Message:

Initial SIMPLE implementation

File:
1 edited

Legend:

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

    r184 r197  
    2323#define THIS_FILE       "main.c" 
    2424 
    25 static pjsip_inv_session *inv_session; 
     25/* Current dialog */ 
     26static struct pjsua_inv_data *inv_session; 
    2627 
    2728/* 
     
    3637 
    3738    if (inv->state == PJSIP_INV_STATE_DISCONNECTED) { 
    38         if (inv == inv_session) 
    39             inv_session = NULL; 
     39        if (inv == inv_session->inv) { 
     40            inv_session = inv_session->next; 
     41            if (inv_session == &pjsua.inv_list) 
     42                inv_session = pjsua.inv_list.next; 
     43        } 
    4044 
    4145    } else { 
    4246 
    43         inv_session = inv; 
     47        if (inv_session == &pjsua.inv_list || inv_session == NULL) 
     48            inv_session = inv->mod_data[pjsua.mod.id]; 
    4449 
    4550    } 
     
    5762 
    5863 
     64/* 
     65 * Print buddy list. 
     66 */ 
     67static void print_buddy_list(void) 
     68{ 
     69    unsigned i; 
     70 
     71    puts("Buddy list:"); 
     72    //puts("-------------------------------------------------------------------------------"); 
     73    if (pjsua.buddy_cnt == 0) 
     74        puts(" -none-"); 
     75    else { 
     76        for (i=0; i<pjsua.buddy_cnt; ++i) { 
     77            const char *status; 
     78 
     79            if (pjsua.buddies[i].sub == NULL ||  
     80                pjsua.buddies[i].status.info_cnt==0) 
     81            { 
     82                status = "   ?   "; 
     83            }  
     84            else if (pjsua.buddies[i].status.info[0].basic_open) 
     85                status = " Online"; 
     86            else 
     87                status = "Offline"; 
     88 
     89            printf(" [%2d] <%s>  %s\n",  
     90                    i+1, status, pjsua.buddies[i].uri.ptr); 
     91        } 
     92    } 
     93    puts(""); 
     94} 
    5995 
    6096/* 
    6197 * Show a bit of help. 
    6298 */ 
    63 static void ui_help(void) 
    64 { 
    65     puts(""); 
    66     puts("Console keys:"); 
    67     puts("  m    Make a call/another call"); 
    68     puts("  d    Dump application states"); 
    69     puts("  a    Answer incoming call"); 
    70     puts("  h    Hangup current call"); 
    71     puts("  q    Quit"); 
    72     puts(""); 
     99static void keystroke_help(void) 
     100{ 
     101 
     102    printf(">>>>\nOnline status: %s\n",  
     103           (pjsua.online_status ? "Online" : "Invisible")); 
     104    print_buddy_list(); 
     105     
     106    //puts("Commands:"); 
     107    puts("+=============================================================================+"); 
     108    puts("|       Call Commands:         |      IM & Presence:      |   Misc:           |"); 
     109    puts("|                              |                          |                   |"); 
     110    puts("|  m  Make new call            |  i  Send IM              |  o  Send OPTIONS  |"); 
     111    puts("|  a  Answer call              |  s  Subscribe presence   |  d  Dump status   |"); 
     112    puts("|  h  Hangup call              |  u  Unsubscribe presence |  d1 Dump detailed |"); 
     113    puts("|  ]  Select next dialog       |  t  Toggle Online status |                   |"); 
     114    puts("|  [  Select previous dialog   |                          |                   |"); 
     115    puts("+-----------------------------------------------------------------------------+"); 
     116    puts("|  q  QUIT                                                                    |"); 
     117    puts("+=============================================================================+"); 
     118    printf(">>> "); 
     119 
     120 
    73121    fflush(stdout); 
    74122} 
    75123 
    76 static pj_bool_t input(const char *title, char *buf, pj_size_t len) 
     124 
     125/* 
     126 * Input simple string 
     127 */ 
     128static pj_bool_t simple_input(const char *title, char *buf, pj_size_t len) 
    77129{ 
    78130    char *p; 
     
    93145} 
    94146 
     147 
     148#define NO_NB   -2 
     149struct input_result 
     150{ 
     151    int   nb_result; 
     152    char *uri_result; 
     153}; 
     154 
     155 
     156/* 
     157 * Input URL. 
     158 */ 
     159static void ui_input_url(const char *title, char *buf, int len,  
     160                         struct input_result *result) 
     161{ 
     162    result->nb_result = NO_NB; 
     163    result->uri_result = NULL; 
     164 
     165    print_buddy_list(); 
     166 
     167    printf("Choices:\n" 
     168           "   0         For current dialog.\n" 
     169           "  -1         All %d buddies in buddy list\n" 
     170           "  [1 -%2d]    Select from buddy list\n" 
     171           "  URL        An URL\n" 
     172           "  <Enter>    Empty input (or 'q') to cancel\n" 
     173           , pjsua.buddy_cnt, pjsua.buddy_cnt); 
     174    printf("%s: ", title); 
     175 
     176    fflush(stdout); 
     177    fgets(buf, len, stdin); 
     178    len = strlen(buf); 
     179 
     180    /* Left trim */ 
     181    while (isspace(*buf)) { 
     182        ++buf; 
     183        --len; 
     184    } 
     185 
     186    /* Remove trailing newlines */ 
     187    while (len && (buf[len-1] == '\r' || buf[len-1] == '\n')) 
     188        buf[--len] = '\0'; 
     189 
     190    if (len == 0 || buf[0]=='q') 
     191        return; 
     192 
     193    if (isdigit(*buf) || *buf=='-') { 
     194         
     195        int i; 
     196         
     197        if (*buf=='-') 
     198            i = 1; 
     199        else 
     200            i = 0; 
     201 
     202        for (; i<len; ++i) { 
     203            if (!isdigit(buf[i])) { 
     204                puts("Invalid input"); 
     205                return; 
     206            } 
     207        } 
     208 
     209        result->nb_result = atoi(buf); 
     210 
     211        if (result->nb_result > 0 && result->nb_result <= (int)pjsua.buddy_cnt) { 
     212            --result->nb_result; 
     213            return; 
     214        } 
     215        if (result->nb_result == -1) 
     216            return; 
     217 
     218        puts("Invalid input"); 
     219        result->nb_result = NO_NB; 
     220        return; 
     221 
     222    } else { 
     223        pj_status_t status; 
     224 
     225        if ((status=pjsua_verify_sip_url(buf)) != PJ_SUCCESS) { 
     226            pjsua_perror("Invalid URL", status); 
     227            return; 
     228        } 
     229 
     230        result->uri_result = buf; 
     231    } 
     232} 
     233 
    95234static void ui_console_main(void) 
    96235{ 
     236    char menuin[10]; 
    97237    char buf[128]; 
    98238    pjsip_inv_session *inv; 
    99  
    100     //ui_help(); 
     239    struct input_result result; 
     240 
     241    //keystroke_help(); 
    101242 
    102243    for (;;) { 
    103244 
    104         ui_help(); 
    105         fgets(buf, sizeof(buf), stdin); 
    106  
    107         switch (buf[0]) { 
     245        keystroke_help(); 
     246        fgets(menuin, sizeof(menuin), stdin); 
     247 
     248        switch (menuin[0]) { 
    108249 
    109250        case 'm': 
    110             if (inv_session != NULL) { 
    111                 puts("Can not make call while another one is in progress"); 
    112                 fflush(stdout); 
    113                 continue; 
    114             } 
    115  
    116 #if 1 
    117251            /* Make call! : */ 
    118             if (!input("Enter URL to call", buf, sizeof(buf))) 
    119                 continue; 
    120             pjsua_invite(buf, &inv); 
    121  
    122 #else 
    123  
    124             pjsua_invite("sip:localhost:5061", &inv); 
    125 #endif 
    126             break; 
    127  
    128  
    129         case 'd': 
    130             pjsua_dump(); 
    131             break; 
     252            if (pj_list_size(&pjsua.inv_list)) 
     253                printf("(You have %d calls)\n", pj_list_size(&pjsua.inv_list)); 
     254             
     255            ui_input_url("Make call", buf, sizeof(buf), &result); 
     256            if (result.nb_result != NO_NB) { 
     257                if (result.nb_result == -1) 
     258                    puts("You can't do that with make call!"); 
     259                else 
     260                    pjsua_invite(pjsua.buddies[result.nb_result].uri.ptr, &inv); 
     261            } else if (result.uri_result) 
     262                pjsua_invite(result.uri_result, &inv); 
     263             
     264            break; 
     265 
    132266 
    133267        case 'a': 
    134268 
    135             if (inv_session == NULL || inv_session->role != PJSIP_ROLE_UAS || 
    136                 inv_session->state >= PJSIP_INV_STATE_CONNECTING)  
     269            if (inv_session == &pjsua.inv_list ||  
     270                inv_session->inv->role != PJSIP_ROLE_UAS || 
     271                inv_session->inv->state >= PJSIP_INV_STATE_CONNECTING)  
    137272            { 
    138273                puts("No pending incoming call"); 
     
    144279                pjsip_tx_data *tdata; 
    145280 
    146                 if (!input("Answer with code (100-699)", buf, sizeof(buf))) 
     281                if (!simple_input("Answer with code (100-699)", buf, sizeof(buf))) 
    147282                    continue; 
    148283                 
     
    150285                    continue; 
    151286 
    152                 status = pjsip_inv_answer(inv_session, atoi(buf), NULL, NULL,  
    153                                           &tdata); 
     287                status = pjsip_inv_answer(inv_session->inv, atoi(buf),  
     288                                          NULL, NULL, &tdata); 
    154289                if (status == PJ_SUCCESS) 
    155                     status = pjsip_inv_send_msg(inv_session, tdata, NULL); 
     290                    status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); 
    156291 
    157292                if (status != PJ_SUCCESS) 
     
    161296            break; 
    162297 
     298 
    163299        case 'h': 
    164300 
    165             if (inv_session == NULL) { 
     301            if (inv_session == &pjsua.inv_list) { 
    166302                puts("No current call"); 
    167303                fflush(stdout); 
     
    172308                pjsip_tx_data *tdata; 
    173309 
    174                 status = pjsip_inv_end_session(inv_session, PJSIP_SC_DECLINE,  
    175                                                NULL, &tdata); 
     310                status = pjsip_inv_end_session(inv_session->inv,  
     311                                               PJSIP_SC_DECLINE, NULL, &tdata); 
    176312                if (status != PJ_SUCCESS) { 
    177313                    pjsua_perror("Failed to create end session message", status); 
     
    179315                } 
    180316 
    181                 status = pjsip_inv_send_msg(inv_session, tdata, NULL); 
     317                status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); 
    182318                if (status != PJ_SUCCESS) { 
    183319                    pjsua_perror("Failed to send end session message", status); 
     
    185321                } 
    186322            } 
    187  
     323            break; 
     324 
     325        case ']': 
     326            inv_session = inv_session->next; 
     327            if (inv_session == &pjsua.inv_list) 
     328                inv_session = pjsua.inv_list.next; 
     329            break; 
     330 
     331        case '[': 
     332            inv_session = inv_session->prev; 
     333            if (inv_session == &pjsua.inv_list) 
     334                inv_session = pjsua.inv_list.prev; 
     335            break; 
     336 
     337        case 's': 
     338        case 'u': 
     339            ui_input_url("Subscribe presence of", buf, sizeof(buf), &result); 
     340            if (result.nb_result != NO_NB) { 
     341                if (result.nb_result == -1) { 
     342                    unsigned i; 
     343                    for (i=0; i<pjsua.buddy_cnt; ++i) 
     344                        pjsua.buddies[i].monitor = (menuin[0]=='s'); 
     345                } else { 
     346                    pjsua.buddies[result.nb_result].monitor = (menuin[0]=='s'); 
     347                } 
     348 
     349                pjsua_pres_refresh(); 
     350 
     351            } else if (result.uri_result) { 
     352                puts("Sorry, can only subscribe to buddy's presence, not arbitrary URL (for now)"); 
     353            } 
     354 
     355            break; 
     356 
     357        case 't': 
     358            pjsua.online_status = !pjsua.online_status; 
     359            pjsua_pres_refresh(); 
     360            break; 
     361 
     362        case 'd': 
     363            pjsua_dump(); 
    188364            break; 
    189365 
     
    255431{ 
    256432    NULL, NULL,                         /* prev, next.          */ 
    257     { "mod-console-msg-logger", 22 },   /* Name.                */ 
     433    { "mod-pjsua-log", 13 },            /* Name.                */ 
    258434    -1,                                 /* Id                   */ 
    259435    PJSIP_MOD_PRIORITY_TRANSPORT_LAYER-1,/* Priority            */ 
     
    386562 
    387563 
     564    /* No current call initially: */ 
     565 
     566    inv_session = &pjsua.inv_list; 
     567 
     568 
    388569    /* Start UI console main loop: */ 
    389570 
Note: See TracChangeset for help on using the changeset viewer.