Changeset 197 for pjproject/trunk/pjsip/src/pjsua/main.c
- Timestamp:
- Feb 19, 2006 1:38:06 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsua/main.c
r184 r197 23 23 #define THIS_FILE "main.c" 24 24 25 static pjsip_inv_session *inv_session; 25 /* Current dialog */ 26 static struct pjsua_inv_data *inv_session; 26 27 27 28 /* … … 36 37 37 38 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 } 40 44 41 45 } else { 42 46 43 inv_session = inv; 47 if (inv_session == &pjsua.inv_list || inv_session == NULL) 48 inv_session = inv->mod_data[pjsua.mod.id]; 44 49 45 50 } … … 57 62 58 63 64 /* 65 * Print buddy list. 66 */ 67 static 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 } 59 95 60 96 /* 61 97 * Show a bit of help. 62 98 */ 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(""); 99 static 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 73 121 fflush(stdout); 74 122 } 75 123 76 static pj_bool_t input(const char *title, char *buf, pj_size_t len) 124 125 /* 126 * Input simple string 127 */ 128 static pj_bool_t simple_input(const char *title, char *buf, pj_size_t len) 77 129 { 78 130 char *p; … … 93 145 } 94 146 147 148 #define NO_NB -2 149 struct input_result 150 { 151 int nb_result; 152 char *uri_result; 153 }; 154 155 156 /* 157 * Input URL. 158 */ 159 static 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 95 234 static void ui_console_main(void) 96 235 { 236 char menuin[10]; 97 237 char buf[128]; 98 238 pjsip_inv_session *inv; 99 100 //ui_help(); 239 struct input_result result; 240 241 //keystroke_help(); 101 242 102 243 for (;;) { 103 244 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]) { 108 249 109 250 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 1117 251 /* 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 132 266 133 267 case 'a': 134 268 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) 137 272 { 138 273 puts("No pending incoming call"); … … 144 279 pjsip_tx_data *tdata; 145 280 146 if (! input("Answer with code (100-699)", buf, sizeof(buf)))281 if (!simple_input("Answer with code (100-699)", buf, sizeof(buf))) 147 282 continue; 148 283 … … 150 285 continue; 151 286 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); 154 289 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); 156 291 157 292 if (status != PJ_SUCCESS) … … 161 296 break; 162 297 298 163 299 case 'h': 164 300 165 if (inv_session == NULL) {301 if (inv_session == &pjsua.inv_list) { 166 302 puts("No current call"); 167 303 fflush(stdout); … … 172 308 pjsip_tx_data *tdata; 173 309 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); 176 312 if (status != PJ_SUCCESS) { 177 313 pjsua_perror("Failed to create end session message", status); … … 179 315 } 180 316 181 status = pjsip_inv_send_msg(inv_session , tdata, NULL);317 status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); 182 318 if (status != PJ_SUCCESS) { 183 319 pjsua_perror("Failed to send end session message", status); … … 185 321 } 186 322 } 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(); 188 364 break; 189 365 … … 255 431 { 256 432 NULL, NULL, /* prev, next. */ 257 { "mod- console-msg-logger", 22 },/* Name. */433 { "mod-pjsua-log", 13 }, /* Name. */ 258 434 -1, /* Id */ 259 435 PJSIP_MOD_PRIORITY_TRANSPORT_LAYER-1,/* Priority */ … … 386 562 387 563 564 /* No current call initially: */ 565 566 inv_session = &pjsua.inv_list; 567 568 388 569 /* Start UI console main loop: */ 389 570
Note: See TracChangeset
for help on using the changeset viewer.