static BOOL OnInitStack (void) { pjsua_config cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg; pjsua_transport_config udp_cfg; pjsua_transport_config rtp_cfg; pjsua_transport_id transport_id; pjsua_transport_info transport_info; pj_str_t tmp; pj_status_t status; /* Create pjsua */ status = pjsua_create(); if (status != PJ_SUCCESS) { OnError (TEXT ("Error creating pjsua"), status); return FALSE; } /* Create global pool for application */ g_pool = pjsua_pool_create ("pjsua", 4000, 4000); /* Init configs */ pjsua_config_default (&cfg); pjsua_media_config_default (&media_cfg); pjsua_transport_config_default (&udp_cfg); udp_cfg.port = SIP_PORT; pjsua_transport_config_default (&rtp_cfg); rtp_cfg.port = 40000; pjsua_logging_config_default (&log_cfg); log_cfg.level = 5; log_cfg.log_filename = pj_str ("\\pjsua.txt"); log_cfg.msg_logging = 1; log_cfg.decor = pj_log_get_decor() | PJ_LOG_HAS_CR; /* Setup media */ media_cfg.clock_rate = 8000; media_cfg.ec_options = PJMEDIA_ECHO_SIMPLE; media_cfg.ec_tail_len = 256; // use default quality setting //media_cfg.quality = 1; media_cfg.ptime = 20; media_cfg.enable_ice = USE_ICE; /* Initialize application callbacks */ cfg.cb.on_call_state = &on_call_state; cfg.cb.on_call_media_state = &on_call_media_state; cfg.cb.on_incoming_call = &on_incoming_call; cfg.cb.on_reg_state = &on_reg_state; cfg.cb.on_buddy_state = &on_buddy_state; cfg.cb.on_pager = &on_pager; cfg.cb.on_typing = &on_typing; cfg.cb.on_nat_detect = &nat_detect_cb; if (SIP_PROXY) { cfg.outbound_proxy_cnt = 1; cfg.outbound_proxy[0] = pj_str (SIP_PROXY); } if (NAMESERVER) { cfg.nameserver_count = 1; cfg.nameserver[0] = pj_str (NAMESERVER); } if (NAMESERVER && STUN_DOMAIN) { cfg.stun_domain = pj_str (STUN_DOMAIN); } else if (STUN_SERVER) { cfg.stun_host = pj_str (STUN_SERVER); } /* Initialize pjsua */ status = pjsua_init (&cfg, &log_cfg, &media_cfg); if (status != PJ_SUCCESS) { OnError (TEXT ("Initialization error"), status); return FALSE; } /* Set codec priority */ pjsua_codec_set_priority (pj_cstr (&tmp, "pcmu"), 240); pjsua_codec_set_priority (pj_cstr (&tmp, "pcma"), 230); pjsua_codec_set_priority (pj_cstr (&tmp, "speex/8000"), 190); pjsua_codec_set_priority (pj_cstr (&tmp, "ilbc"), 189); pjsua_codec_set_priority (pj_cstr (&tmp, "speex/16000"), 180); pjsua_codec_set_priority (pj_cstr (&tmp, "speex/32000"), 0); pjsua_codec_set_priority (pj_cstr (&tmp, "gsm"), 100); /* Add UDP transport and the corresponding PJSUA account */ status = pjsua_transport_create (PJSIP_TRANSPORT_UDP, &udp_cfg, &transport_id); if (status != PJ_SUCCESS) { OnError (TEXT ("Error starting SIP transport"), status); return FALSE; } pjsua_transport_get_info (transport_id, &transport_info); g_local_uri.ptr = (char*) pj_pool_alloc (g_pool, 128); g_local_uri.slen = pj_ansi_sprintf (g_local_uri.ptr, "<sip:%.*s:%d>", (int) transport_info.local_name.host.slen, transport_info.local_name.host.ptr, transport_info.local_name.port); /* Add local account */ pjsua_acc_add_local (transport_id, PJ_TRUE, &g_current_acc); pjsua_acc_set_online_status (g_current_acc, PJ_TRUE); /* Add account */ if (HAS_SIP_ACCOUNT) { pjsua_acc_config cfg; pjsua_acc_config_default (&cfg); cfg.id = pj_str ("sip:" SIP_USER "@" SIP_DOMAIN); cfg.reg_uri = pj_str ("sip:" SIP_DOMAIN); cfg.cred_count = 1; cfg.cred_info[0].realm = pj_str (SIP_REALM); cfg.cred_info[0].scheme = pj_str ("digest"); cfg.cred_info[0].username = pj_str (SIP_USER); cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; cfg.cred_info[0].data = pj_str (SIP_PASSWD); status = pjsua_acc_add (&cfg, PJ_TRUE, &g_current_acc); if (status != PJ_SUCCESS) { pjsua_destroy(); return PJ_FALSE; } } /* Add buddy */ if (SIP_DST_URI) { pjsua_buddy_config bcfg; pjsua_buddy_config_default (&bcfg); bcfg.uri = pj_str (SIP_DST_URI); bcfg.subscribe = PJ_FALSE; pjsua_buddy_add (&bcfg, NULL); } /* Start pjsua */ status = pjsua_start(); if (status != PJ_SUCCESS) { OnError (TEXT ("Error starting pjsua"), status); return FALSE; } return TRUE; }
int systest_init(void) { pjsua_logging_config log_cfg; pj_status_t status = PJ_SUCCESS; status = pjsua_create(); if (status != PJ_SUCCESS) { systest_perror("Sorry we've had error in pjsua_create(): ", status); return status; } pjsua_logging_config_default(&log_cfg); log_cfg.log_filename = pj_str(add_path(doc_path, LOG_OUT_PATH)); pjsua_config_default(&systest.ua_cfg); pjsua_media_config_default(&systest.media_cfg); systest.media_cfg.clock_rate = TEST_CLOCK_RATE; systest.media_cfg.snd_clock_rate = DEV_CLOCK_RATE; if (OVERRIDE_AUD_FRAME_PTIME) systest.media_cfg.audio_frame_ptime = OVERRIDE_AUD_FRAME_PTIME; systest.media_cfg.channel_count = CHANNEL_COUNT; systest.rec_id = REC_DEV_ID; systest.play_id = PLAY_DEV_ID; systest.media_cfg.ec_tail_len = 0; systest.media_cfg.snd_auto_close_time = 0; #if defined(OVERRIDE_AUDDEV_PLAY_LAT) && OVERRIDE_AUDDEV_PLAY_LAT!=0 systest.media_cfg.snd_play_latency = OVERRIDE_AUDDEV_PLAY_LAT; #endif #if defined(OVERRIDE_AUDDEV_REC_LAT) && OVERRIDE_AUDDEV_REC_LAT!=0 systest.media_cfg.snd_rec_latency = OVERRIDE_AUDDEV_REC_LAT; #endif status = pjsua_init(&systest.ua_cfg, &log_cfg, &systest.media_cfg); if (status != PJ_SUCCESS) { pjsua_destroy(); systest_perror("Sorry we've had error in pjsua_init(): ", status); return status; } status = pjsua_start(); if (status != PJ_SUCCESS) { pjsua_destroy(); systest_perror("Sorry we've had error in pjsua_start(): ", status); return status; } status = gui_init(&root_menu); if (status != 0) goto on_return; return 0; on_return: gui_destroy(); return status; }
PJ_DECL(pj_status_t) csipsimple_destroy(void) { destroy_ringback_tone(); #if PJMEDIA_HAS_VIDEO unsigned i; for (i = 0; i < css_var.extra_vid_codecs_cnt; i++) { dynamic_factory *codec = &css_var.extra_vid_codecs_destroy[i]; pj_status_t (*destroy_factory)() = get_library_factory(codec); if(destroy_factory != NULL){ pj_status_t status = destroy_factory(); if(status != PJ_SUCCESS) { PJ_LOG(2, (THIS_FILE,"Error loading dynamic codec plugin")); } } } #endif if (css_var.pool) { pj_pool_release(css_var.pool); css_var.pool = NULL; } if(css_var.context){ JNIEnv *jni_env = 0; ATTACH_JVM(jni_env); (*jni_env)->DeleteGlobalRef(jni_env, css_var.context); DETACH_JVM(jni_env); } return (pj_status_t) pjsua_destroy(); }
/* Display error and exit application */ static void error_exit (const char *title, pj_status_t status) { VFVW_LOG("pjsip error [%s, %d]", title, status); pjsua_perror ("voice app", title, status); pjsua_destroy (); exit (1); }
void MainWin::quit() { delete video_prev_; video_prev_ = NULL; delete video_; video_ = NULL; pjsua_destroy(); qApp->quit(); }
PjsuaManager::~PjsuaManager() { pjsua_call_hangup_all(); accounts_.clear(); if (audio_manager_) audio_manager_.reset(); pjsua_destroy(); }
SipPhone::~SipPhone() { Logger::debug("SipPhone::~SipPhone()..."); pjsua_call_hangup_all(); #if 0 pjsua_conf_remove_port(m_mediaConfSilenceId); pjmedia_port_destroy(m_mediaPortSilence); pj_pool_release(m_Pool); #endif #if 0 // see s_Initialized pjsua_destroy(); #endif }
// display error and exit application static void error_exit(const char *title, pj_status_t status) { if (!app_exiting) { app_exiting = 1; pjsua_perror("SIP Call", title, status); // check if player/recorder is active and stop them if (play_id != -1) pjsua_player_destroy(play_id); if (rec_id != -1) pjsua_recorder_destroy(rec_id); // hangup open calls and stop pjsua pjsua_call_hangup_all(); pjsua_destroy(); exit(1); } }
// clean application exit static void app_exit() { if (!app_exiting) { app_exiting = 1; log_message("Stopping application ... "); // check if player/recorder is active and stop them if (play_id != -1) pjsua_player_destroy(play_id); if (rec_id != -1) pjsua_recorder_destroy(rec_id); // hangup open calls and stop pjsua pjsua_call_hangup_all(); pjsua_destroy(); log_message("Done.\n"); exit(0); } }
static void OnDestroy (void) { pjsua_destroy(); }
void destroy() { pjsua_destroy(); }
void systest_deinit(void) { gui_destroy(); pjsua_destroy(); }
//============================================================================= void SIPConference::stop_sip_stack_ () { VFVW_LOG("entering stop_sip_stack_()"); pjsua_destroy (); }
/* * main() * * argv[1] may contain URL to call. */ int main(int argc, char *argv[]) { pjsua_acc_id acc_id; pj_status_t status; /* Create pjsua first! */ status = pjsua_create(); if (status != PJ_SUCCESS) error_exit("Error in pjsua_create()", status); /* If argument is specified, it's got to be a valid SIP URL */ if (argc > 1) { status = pjsua_verify_url(argv[1]); if (status != PJ_SUCCESS) error_exit("Invalid URL in argv", status); } /* Init pjsua */ { pjsua_config cfg; pjsua_logging_config log_cfg; pjsua_config_default(&cfg); cfg.cb.on_incoming_call = &on_incoming_call; cfg.cb.on_call_media_state = &on_call_media_state; cfg.cb.on_call_state = &on_call_state; pjsua_logging_config_default(&log_cfg); log_cfg.console_level = 4; status = pjsua_init(&cfg, &log_cfg, NULL); if (status != PJ_SUCCESS) error_exit("Error in pjsua_init()", status); } /* Add UDP transport. */ { pjsua_transport_config cfg; pjsua_transport_config_default(&cfg); cfg.port = 5060; status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &cfg, NULL); if (status != PJ_SUCCESS) error_exit("Error creating transport", status); } /* Initialization is done, now start pjsua */ status = pjsua_start(); if (status != PJ_SUCCESS) error_exit("Error starting pjsua", status); /* Register to SIP server by creating SIP account. */ { pjsua_acc_config cfg; pjsua_acc_config_default(&cfg); cfg.id = pj_str("sip:" SIP_USER "@" SIP_DOMAIN); cfg.reg_uri = pj_str("sip:" SIP_DOMAIN); cfg.cred_count = 1; cfg.cred_info[0].realm = pj_str(SIP_DOMAIN); cfg.cred_info[0].scheme = pj_str("digest"); cfg.cred_info[0].username = pj_str(SIP_USER); cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; cfg.cred_info[0].data = pj_str(SIP_PASSWD); status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id); if (status != PJ_SUCCESS) error_exit("Error adding account", status); } /* If URL is specified, make call to the URL. */ if (argc > 1) { pj_str_t uri = pj_str(argv[1]); status = pjsua_call_make_call(acc_id, &uri, 0, NULL, NULL, NULL); if (status != PJ_SUCCESS) error_exit("Error making call", status); } /* Wait until user press "q" to quit. */ for (;;) { char option[10]; puts("Press 'h' to hangup all calls, 'q' to quit"); if (fgets(option, sizeof(option), stdin) == NULL) { puts("EOF while reading stdin, will quit now.."); break; } if (option[0] == 'q') break; if (option[0] == 'h') pjsua_call_hangup_all(); } /* Destroy pjsua */ pjsua_destroy(); return 0; }
/* Display error and exit application */ static void error_exit(const char *title, pj_status_t status) { pjsua_perror(THIS_FILE, title, status); pjsua_destroy(); exit(1); }
// REITEK: Added insecure and secure SIP ports PjsuaManager::PjsuaManager(const std::string& executionPath, bool enableIce, const std::string& stunServer, const int& sipPort, const int& sipTlsPort) { pj_status_t status; pjsua_config cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg; pjsua_transport_config tran_cfg, tls_tran_cfg; pjsua_transport_config_default(&tran_cfg); pjsua_transport_config_default(&tls_tran_cfg); pjsua_media_config_default(&media_cfg); pjsua_config_default(&cfg); pjsua_logging_config_default(&log_cfg); //cfg.max_calls = 511; cfg.max_calls = 2; cfg.cb.on_incoming_call = &PjsuaManager::OnIncomingCall; cfg.cb.on_call_media_state = &PjsuaManager::OnCallMediaState; cfg.cb.on_call_state = &PjsuaManager::OnCallState; cfg.cb.on_reg_state = &PjsuaManager::OnRegState; cfg.cb.on_transport_state = &PjsuaManager::OnTransportState; cfg.cb.on_call_transfer_status = &PjsuaManager::OnCallTransferStatus; cfg.cb.on_call_tsx_state = &PjsuaManager::OnCallTsxState; log_cfg.level = 4; log_cfg.console_level = 4; // REITEK: Log messages! log_cfg.msg_logging = PJ_TRUE; log_cfg.decor = PJ_LOG_HAS_SENDER | PJ_LOG_HAS_SPACE | PJ_LOG_HAS_LEVEL_TEXT; log_cfg.cb = BlabbleLogging::blabbleLog; // REITEK: !!! CHECK: Make TLS port configurable ? tls_tran_cfg.port = 0; //tran_cfg.tls_setting.verify_server = PJ_TRUE; tls_tran_cfg.tls_setting.timeout.sec = 5; tls_tran_cfg.tls_setting.method = PJSIP_TLSV1_METHOD; tran_cfg.port = sipPort; // REITEK: !!! CHECK: Make port range configurable ? tran_cfg.port_range = 200; media_cfg.no_vad = 1; media_cfg.enable_ice = enableIce ? PJ_TRUE : PJ_FALSE; // REITEK: Disable EC media_cfg.ec_tail_len = 0; if (!stunServer.empty()) { cfg.stun_srv_cnt = 1; cfg.stun_srv[0] = pj_str(const_cast<char*>(stunServer.c_str())); } // REITEK: User-Agent header handling cfg.user_agent = pj_str("Reitek PluginSIP"); status = pjsua_create(); if (status != PJ_SUCCESS) throw std::runtime_error("pjsua_create failed"); status = pjsua_init(&cfg, &log_cfg, &media_cfg); if (status != PJ_SUCCESS) throw std::runtime_error("Error in pjsua_init()"); try { status = pjsua_transport_create(PJSIP_TRANSPORT_TLS, &tls_tran_cfg, &this->tls_transport); has_tls_ = status == PJ_SUCCESS; if (!has_tls_) { BLABBLE_LOG_DEBUG("Error in tls pjsua_transport_create. Tls will not be enabled"); this->tls_transport = -1; } status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &tran_cfg, &this->udp_transport); if (status != PJ_SUCCESS) throw std::runtime_error("Error in pjsua_transport_create for UDP transport"); status = pjsua_start(); if (status != PJ_SUCCESS) throw std::runtime_error("Error in pjsua_start()"); // REITEK: Codecs priority handling pj_str_t tmpstr; // !!! FIXME: Hardwired now in order to test G. 729 pjsua_codec_set_priority(pj_cstr(&tmpstr, "*"), 0); pjsua_codec_set_priority(pj_cstr(&tmpstr, "g729"), 255); pjsua_codec_set_priority(pj_cstr(&tmpstr, "pcmu"), 240); pjsua_codec_set_priority(pj_cstr(&tmpstr, "pcma"), 230); pjsua_codec_set_priority(pj_cstr(&tmpstr, "speex/8000"), 190); pjsua_codec_set_priority(pj_cstr(&tmpstr, "ilbc"), 189); pjsua_codec_set_priority(pj_cstr(&tmpstr, "speex/16000"), 180); pjsua_codec_set_priority(pj_cstr(&tmpstr, "speex/32000"), 0); pjsua_codec_set_priority(pj_cstr(&tmpstr, "gsm"), 100); #if 0 // REITEK: G.729 codec handling pjmedia_codec_param g729_param; status = pjsua_codec_get_param(pj_cstr(&tmpstr, "g729"), &g729_param); if (status != PJ_SUCCESS) throw std::runtime_error("Cannot get G.729 default parameters"); g729_param.setting.frm_per_pkt = m_config.getG729FramesPerPacket(); pjsua_codec_set_param(pj_cstr(&tmp, "g729"), &g729_param); #endif // REITEK: Use our own directory for ringtones etc #if 0 std::string path = executionPath; unsigned int tmp = path.find("plugins"); if (tmp != std::string::npos) { path = path.substr(0, tmp + 7); } tmp = path.find(FBSTRING_PluginFileName"."); if (tmp != std::string::npos) { path = path.substr(0, tmp - 1); } #endif std::string path; #if defined(XP_WIN) std::string appdata = getenv("ALLUSERSPROFILE"); path = appdata + "\\Mozilla\\Plugins"; #elif defined(XP_LINUX) std::string appdata = getenv("HOME"); path = appdata + "/Reitek/Contact/BrowserPlugin"; #endif audio_manager_ = boost::make_shared<BlabbleAudioManager>(path); BLABBLE_LOG_DEBUG("PjsuaManager startup complete."); } catch (std::runtime_error& e) { std::string str = "Error in PjsuaManager. " + boost::lexical_cast<std::string>(e.what()); BlabbleLogging::blabbleLog(0, str.c_str(), 0); //BLABBLE_LOG_ERROR("Error in PjsuaManager. " << e.what()); pjsua_destroy(); throw e; } }
void PjsipEngine::stop() { pjsua_destroy(); }
/* Display error and exit application */ static void handleError(const char *title, pj_status_t status) { qDebug() << title << "code = " << status; pjsua_destroy(); }
//---------------------------------------------------------------------- SipPhone::~SipPhone(void) { pjsua_destroy(); }
/* * main() * * argv[] contains the registration information. */ int main(int argc, char *argv[]) { pj_status_t status; int loglevel = 0; if (argc < 4) { usage(argv[0]); exit(1); } if (argc > 5){ sscanf(argv[5], "%d", &loglevel); } pjsua_acc_id acc_id; /* Create pjsua first! */ status = pjsua_create(); if (status != PJ_SUCCESS) error_exit("Error in pjsua_create()", status); /* Init pjsua */ { pjsua_config cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg; // This will prevent the SIP stack from trying to switch to TCP. // It will prevent the stack from giving "Transport unavailable" errors. // http://trac.pjsip.org/repos/wiki/Using_SIP_TCP pjsip_cfg()->endpt.disable_tcp_switch = PJ_TRUE; pjsua_config_default(&cfg); cfg.cb.on_incoming_call = &on_incoming_call; cfg.cb.on_call_media_state = &on_call_media_state; cfg.cb.on_call_state = &on_call_state; cfg.cb.on_call_tsx_state = &on_call_tsx_state; pjsua_logging_config_default(&log_cfg); log_cfg.console_level = loglevel; // 0 = Mute console, 3 = somewhat useful, 4 = overly verbose. pjsua_media_config_default(&media_cfg); status = pjsua_init(&cfg, &log_cfg, &media_cfg); if (status != PJ_SUCCESS) error_exit("Error in pjsua_init()", status); } /* Add UDP transport. */ { pjsua_transport_config cfg; pjsua_transport_config_default(&cfg); sscanf(argv[4], "%d", &cfg.port); status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &cfg, NULL); if (status != PJ_SUCCESS) error_exit("Error creating transport", status); printf("Created UDP transport on port %d.\n", cfg.port); } /* Initialization is done, now start pjsua */ status = pjsua_start(); if (status != PJ_SUCCESS) error_exit("Error starting pjsua", status); /* Register to SIP server by creating SIP account. */ { char reg_uri_buf[80] = "sip:"; char uri_buf[80] = "sip:"; pjsua_acc_config cfg; char* username = argv[1]; char* password = argv[2]; char* domain = argv[3]; strcat (uri_buf, username); strcat (reg_uri_buf, domain); strcat (uri_buf, "@"); strcat (uri_buf, domain); pjsua_acc_config_default(&cfg); cfg.id = pj_str(uri_buf); printf("Registering: %.*s.\n", (int)cfg.id.slen, cfg.id.ptr); cfg.reg_uri = pj_str(reg_uri_buf); cfg.cred_count = 1; cfg.cred_info[0].realm = pj_str(domain); cfg.cred_info[0].scheme = pj_str("Digest"); cfg.cred_info[0].username = pj_str(username); cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; cfg.cred_info[0].data = pj_str(password); cfg.register_on_acc_add = PJ_FALSE; status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id); if (status != PJ_SUCCESS) error_exit("Error adding account", status); or_event(OR_READY, "Agent initialized.."); } /* Start by muting the audio device. This a passive agent, and sound is just wasted CPU time and uwanted side effects. */ pjsua_set_null_snd_dev(); fflush(stdout); /* Wait until user press "q" to quit. */ for (;;) { char option[256]; if (fgets(option, sizeof (option), stdin) == NULL) { or_status (OR_ERROR, "EOF while reading stdin, will quit now.."); break; } /* Dial command. */ if (option[0] == 'd') { pj_str_t uri = pj_str(&option[1]); status = pjsua_call_make_call(acc_id, &uri, 0, NULL, NULL, NULL); if (status != PJ_SUCCESS) { or_status (OR_ERROR, "Could not make call"); } else { or_status (OR_OK, "Dialling..."); } } /* Register */ else if (option[0] == 'r') { register_account(acc_id); } /* Unregister */ else if (option[0] == 'u') { unregister_account(acc_id); } /* Enable autoanswer */ else if (option[0] == 'a') { if (option[1] == '1') { autoanswer[0] = true; or_status(OR_OK, "Autoanswer enabled."); } else { or_status(OR_ERROR, "Invalid account."); } } /* Disable autoanswer (manual answer) */ else if (option[0] == 'm') { autoanswer[0] = false; or_status(OR_OK, "Autoanswer disabled."); } /* Pickup incoming call, unsupported for now. */ else if (option[0] == 'p') { if (current_call != PJSUA_INVALID_ID) { pjsua_call_answer(current_call, 200, NULL, NULL); or_status(OR_OK, "Call picked up."); } else { or_status(OR_ERROR, "No call to pick up."); } } /* Hang up current call */ else if (option[0] == 'H') { if (current_call != PJSUA_INVALID_ID) { pjsua_call_hangup (current_call, 0,NULL, NULL); or_status (OR_OK, "Hanging up current call..."); } else { or_status(OR_ERROR, "No call to hang up."); } } /* Full hangup.. */ else if (option[0] == 'h') { pjsua_call_hangup_all(); or_status (OR_OK, "Hanging up all calls..."); } /* Status */ else if (option[0] == 's') { or_dump_status(); } /* Exit application. */ else if (option[0] == 'q') { break; } else { or_status (OR_ERROR, "Unknown command:"); } } pjsua_destroy(); or_status (OR_OK, "Exiting..."); return 0; }
void ics_core_clean(ics_t *data) { data->f_quit = 0; pjsua_destroy(); pj_pool_release(data->pool); pj_caching_pool_destroy(&data->cp); }
// // initStack() // bool MainWin::initStack() { pj_status_t status; //showStatus("Creating stack.."); status = pjsua_create(); if (status != PJ_SUCCESS) { showError("pjsua_create", status); return false; } showStatus("Initializing stack.."); pjsua_config ua_cfg; pjsua_config_default(&ua_cfg); pjsua_callback ua_cb; pj_bzero(&ua_cb, sizeof(ua_cb)); ua_cfg.cb.on_reg_state = &::on_reg_state; ua_cfg.cb.on_call_state = &::on_call_state; ua_cfg.cb.on_incoming_call = &::on_incoming_call; ua_cfg.cb.on_call_media_state = &::on_call_media_state; #if USE_STUN ua_cfg.stun_srv_cnt = 1; ua_cfg.stun_srv[0] = pj_str((char*)STUN_SRV); #endif pjsua_logging_config log_cfg; pjsua_logging_config_default(&log_cfg); log_cfg.log_filename = pj_str((char*)LOG_FILE); pjsua_media_config med_cfg; pjsua_media_config_default(&med_cfg); med_cfg.enable_ice = USE_ICE; status = pjsua_init(&ua_cfg, &log_cfg, &med_cfg); if (status != PJ_SUCCESS) { showError("pjsua_init", status); goto on_error; } // // Create UDP and TCP transports // pjsua_transport_config udp_cfg; pjsua_transport_id udp_id; pjsua_transport_config_default(&udp_cfg); udp_cfg.port = SIP_PORT; status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &udp_cfg, &udp_id); if (status != PJ_SUCCESS) { showError("UDP transport creation", status); goto on_error; } pjsua_transport_info udp_info; status = pjsua_transport_get_info(udp_id, &udp_info); if (status != PJ_SUCCESS) { showError("UDP transport info", status); goto on_error; } #if SIP_TCP pjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port = 0; status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &tcp_cfg, NULL); if (status != PJ_SUCCESS) { showError("TCP transport creation", status); goto on_error; } #endif // // Create account // pjsua_acc_config acc_cfg; pjsua_acc_config_default(&acc_cfg); #if USE_REGISTRATION acc_cfg.id = pj_str( (char*)"<sip:" SIP_USERNAME "@" SIP_DOMAIN ">"); acc_cfg.reg_uri = pj_str((char*) ("sip:" SIP_DOMAIN)); acc_cfg.cred_count = 1; acc_cfg.cred_info[0].realm = pj_str((char*)"*"); acc_cfg.cred_info[0].scheme = pj_str((char*)"digest"); acc_cfg.cred_info[0].username = pj_str((char*)SIP_USERNAME); acc_cfg.cred_info[0].data = pj_str((char*)SIP_PASSWORD); # if SIP_TCP acc_cfg.proxy[acc_cfg.proxy_cnt++] = pj_str((char*) "<sip:" SIP_DOMAIN ";transport=tcp>"); # endif #else char sip_id[80]; snprintf(sip_id, sizeof(sip_id), "sip:%s@%.*s:%u", SIP_USERNAME, (int)udp_info.local_name.host.slen, udp_info.local_name.host.ptr, udp_info.local_name.port); acc_cfg.id = pj_str(sip_id); #endif acc_cfg.vid_cap_dev = DEFAULT_CAP_DEV; acc_cfg.vid_rend_dev = DEFAULT_REND_DEV; acc_cfg.vid_in_auto_show = PJ_TRUE; acc_cfg.vid_out_auto_transmit = PJ_TRUE; status = pjsua_acc_add(&acc_cfg, PJ_TRUE, &accountId_); if (status != PJ_SUCCESS) { showError("Account creation", status); goto on_error; } localUri_->setText(acc_cfg.id.ptr); // // Start pjsua! // showStatus("Starting stack.."); status = pjsua_start(); if (status != PJ_SUCCESS) { showError("pjsua_start", status); goto on_error; } showStatus("Ready"); return true; on_error: pjsua_destroy(); return false; }
PJ_DECL(pj_status_t) csipsimple_destroy(void){ destroy_ringback_tone(); return (pj_status_t) pjsua_destroy(); }