diff options
Diffstat (limited to 'pjsip/src/pjsua2')
-rw-r--r-- | pjsip/src/pjsua2/endpoint.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/pjsip/src/pjsua2/endpoint.cpp b/pjsip/src/pjsua2/endpoint.cpp index a66cfcf1..163e292f 100644 --- a/pjsip/src/pjsua2/endpoint.cpp +++ b/pjsip/src/pjsua2/endpoint.cpp @@ -44,6 +44,82 @@ Endpoint *Endpoint::instance_; /////////////////////////////////////////////////////////////////////////////// +TlsInfo::TlsInfo() +{ + pj_bzero(this, sizeof(TlsInfo)); +} + +bool TlsInfo::isEmpty() const +{ + TlsInfo dummy; + + pj_bzero(&dummy, sizeof(dummy)); + return ((pj_memcmp(this, &dummy, sizeof(dummy)) == 0)? true: false); +} + +void TlsInfo::fromPj(const pjsip_tls_state_info &info) +{ +#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK != 0 + pj_ssl_sock_info *ssock_info = info.ssl_sock_info; + char straddr[PJ_INET6_ADDRSTRLEN+10]; + const char *verif_msgs[32]; + unsigned verif_msg_cnt; + + established = PJ2BOOL(ssock_info->established); + protocol = ssock_info->proto; + cipher = ssock_info->cipher; + cipherName = pj_ssl_cipher_name(ssock_info->cipher); + pj_sockaddr_print(&ssock_info->local_addr, straddr, sizeof(straddr), 3); + localAddr = straddr; + pj_sockaddr_print(&ssock_info->remote_addr, straddr, sizeof(straddr),3); + remoteAddr = straddr; + verifyStatus = ssock_info->verify_status; + if (ssock_info->local_cert_info) + localCertInfo.fromPj(*ssock_info->local_cert_info); + if (ssock_info->remote_cert_info) + remoteCertInfo.fromPj(*ssock_info->remote_cert_info); + + /* Dump server TLS certificate verification result */ + verif_msg_cnt = PJ_ARRAY_SIZE(verif_msgs); + pj_ssl_cert_get_verify_status_strings(ssock_info->verify_status, + verif_msgs, &verif_msg_cnt); + for (unsigned i = 0; i < verif_msg_cnt; ++i) { + verifyMsgs.push_back(verif_msgs[i]); + } +#endif +} + +bool SslCertInfo::isEmpty() const +{ + SslCertInfo dummy; + + pj_bzero(&dummy, sizeof(dummy)); + return ((pj_memcmp(this, &dummy, sizeof(dummy)) == 0)? true: false); +} + +void SslCertInfo::fromPj(const pj_ssl_cert_info &info) +{ + version = info.version; + pj_memcpy(serialNo, info.serial_no, sizeof(info.serial_no)); + subjectCn = pj2Str(info.subject.cn); + subjectInfo = pj2Str(info.subject.info); + issuerCn = pj2Str(info.issuer.cn); + issuerInfo = pj2Str(info.issuer.info); + validityStart.fromPj(info.validity.start); + validityEnd.fromPj(info.validity.end); + validityGmt = PJ2BOOL(info.validity.gmt); + raw = pj2Str(info.raw); + + for (unsigned i = 0; i < info.subj_alt_name.cnt; i++) { + SslCertName cname; + cname.type = info.subj_alt_name.entry[i].type; + cname.name = pj2Str(info.subj_alt_name.entry[i].name); + subjectAltName.push_back(cname); + } +} + +/////////////////////////////////////////////////////////////////////////////// + UaConfig::UaConfig() : mainThreadOnly(false) { @@ -558,8 +634,20 @@ void Endpoint::on_transport_state( pjsip_transport *tp, OnTransportStateParam prm; prm.hnd = (TransportHandle)tp; + prm.type = tp->type_name; prm.state = state; prm.lastError = info ? info->status : PJ_SUCCESS; + pj_bzero(&prm.tlsInfo, sizeof(TlsInfo)); + +#if defined(PJSIP_HAS_TLS_TRANSPORT) && PJSIP_HAS_TLS_TRANSPORT!=0 + if (!pj_ansi_stricmp(tp->type_name, "tls") && info->ext_info && + (state == PJSIP_TP_STATE_CONNECTED || + ((pjsip_tls_state_info*)info->ext_info)-> + ssl_sock_info->verify_status != PJ_SUCCESS)) + { + prm.tlsInfo.fromPj(*((pjsip_tls_state_info*)info->ext_info)); + } +#endif ep.onTransportState(prm); } @@ -1694,6 +1782,11 @@ void Endpoint::transportClose(TransportId id) throw(Error) PJSUA2_CHECK_EXPR( pjsua_transport_close(id, PJ_FALSE) ); } +void Endpoint::transportShutdown(TransportHandle tp) throw(Error) +{ + PJSUA2_CHECK_EXPR( pjsip_transport_shutdown((pjsip_transport *)tp) ); +} + /////////////////////////////////////////////////////////////////////////////// /* * Call operations |