From 29224b5cce3353b67784ada08165ff9259a5bee1 Mon Sep 17 00:00:00 2001 From: pescuma Date: Thu, 21 Jan 2010 03:19:47 +0000 Subject: SIP: 0.1.3.0 * Fix for going online after connecting error * Fix for reconection crash + Added stun server to client API + Added list of hosts to client API git-svn-id: http://pescuma.googlecode.com/svn/trunk/Miranda@214 c086bb3d-8645-0410-b8da-73a8550f86e7 --- Protocols/SIP/Docs/sip_changelog.txt | 6 ++++++ Protocols/SIP/Docs/sip_version.txt | 2 +- Protocols/SIP/SIPClient.cpp | 28 +++++++++++++++++++----- Protocols/SIP/SIPClient.h | 4 ++-- Protocols/SIP/SIPProto.cpp | 41 ++++++++++++++++++++++-------------- Protocols/SIP/SIPProto.h | 1 + Protocols/SIP/m_sip.h | 9 +++++++- Protocols/SIP/sip.cpp | 8 ++++--- 8 files changed, 71 insertions(+), 28 deletions(-) (limited to 'Protocols') diff --git a/Protocols/SIP/Docs/sip_changelog.txt b/Protocols/SIP/Docs/sip_changelog.txt index 674f9e3..b8b858f 100644 --- a/Protocols/SIP/Docs/sip_changelog.txt +++ b/Protocols/SIP/Docs/sip_changelog.txt @@ -2,6 +2,12 @@ SIP protocol Changelog: +. 0.1.3.0 + * Fix for going online after connecting error + * Fix for reconection crash + + Added stun server to client API + + Added list of hosts to client API + . 0.1.2.0 + Support for clients (Example plugin at http://pescuma.googlecode.com/svn/trunk/Miranda/Plugins/sip_cli ) diff --git a/Protocols/SIP/Docs/sip_version.txt b/Protocols/SIP/Docs/sip_version.txt index e967521..7a5d348 100644 --- a/Protocols/SIP/Docs/sip_version.txt +++ b/Protocols/SIP/Docs/sip_version.txt @@ -1 +1 @@ -SIP protocol 0.1.2.0 \ No newline at end of file +SIP protocol 0.1.3.0 \ No newline at end of file diff --git a/Protocols/SIP/SIPClient.cpp b/Protocols/SIP/SIPClient.cpp index cc831b5..86dc64c 100644 --- a/Protocols/SIP/SIPClient.cpp +++ b/Protocols/SIP/SIPClient.cpp @@ -31,12 +31,15 @@ SIPClient::SIPClient(SIP_REGISTRATION *reg) hasToDestroy = false; udp.transport_id = -1; udp.acc_id = -1; + udp.host[0] = 0; udp.port = 0; tcp.transport_id = -1; tcp.acc_id = -1; tcp.port = 0; + tcp.host[0] = 0; tls.transport_id = -1; tls.acc_id = -1; + tls.host[0] = 0; tls.port = 0; hNetlibUser = reg->hNetlib; @@ -221,12 +224,12 @@ void SIPClient::RegisterTransport(pjsip_transport_type_e type, int port, ta *ta) pjsua_acc_set_user_data(ta->acc_id, this); - lstrcpyn(host, SipToTchar(info.local_name.host), MAX_REGS(host)); + lstrcpyn(ta->host, SipToTchar(info.local_name.host), MAX_REGS(ta->host)); ta->port = info.local_name.port; } -int SIPClient::Connect(int udp_port, int tcp_port, int tls_port) +int SIPClient::Connect(SIP_REGISTRATION *reg) { Trace(_T("Connecting...")); @@ -241,6 +244,8 @@ int SIPClient::Connect(int udp_port, int tcp_port, int tls_port) } { + scoped_mir_free stun; + pjsua_config cfg; pjsua_config_default(&cfg); #ifndef _DEBUG @@ -250,6 +255,19 @@ int SIPClient::Connect(int udp_port, int tcp_port, int tls_port) cfg.cb.on_call_media_state = &static_on_call_media_state; cfg.cb.on_call_state = &static_on_call_state; + + if (!IsEmpty(reg->stun.host)) + { + TCHAR tmp[1024]; + mir_sntprintf(tmp, MAX_REGS(tmp), _T("%s:%d"), + CleanupSip(reg->stun.host), + FirstGtZero(reg->stun.port, PJ_STUN_PORT)); + stun = TcharToSip(tmp).detach(); + + cfg.stun_srv_cnt = 1; + cfg.stun_srv[0] = pj_str(stun); + } + pjsua_logging_config log_cfg; pjsua_logging_config_default(&log_cfg); log_cfg.cb = &static_on_log; @@ -267,9 +285,9 @@ int SIPClient::Connect(int udp_port, int tcp_port, int tls_port) } { - RegisterTransport(PJSIP_TRANSPORT_UDP, udp_port, &udp); - RegisterTransport(PJSIP_TRANSPORT_TCP, tcp_port, &tcp); - RegisterTransport(PJSIP_TRANSPORT_TLS, tls_port, &tls); + RegisterTransport(PJSIP_TRANSPORT_UDP, reg->udp_port, &udp); + RegisterTransport(PJSIP_TRANSPORT_TCP, reg->tcp_port, &tcp); + RegisterTransport(PJSIP_TRANSPORT_TLS, reg->tls_port, &tls); if (udp.port <= 0 && tcp.port <= 0 && tls.port <= 0) return 1; diff --git a/Protocols/SIP/SIPClient.h b/Protocols/SIP/SIPClient.h index 1af9cb6..bbcb3ef 100644 --- a/Protocols/SIP/SIPClient.h +++ b/Protocols/SIP/SIPClient.h @@ -31,6 +31,7 @@ public: struct ta { pjsua_transport_id transport_id; pjsua_acc_id acc_id; + TCHAR host[256]; int port; }; @@ -42,7 +43,6 @@ public: void *callback_param; char name[512]; - TCHAR host[256]; CRITICAL_SECTION cs; std::vector events; @@ -61,7 +61,7 @@ public: int AnswerCall(pjsua_call_id call_id); int SendDTMF(pjsua_call_id call_id, TCHAR dtmf); - int Connect(int udp_port, int tcp_port, int tls_port); + int Connect(SIP_REGISTRATION *reg); void Disconnect(); private: diff --git a/Protocols/SIP/SIPProto.cpp b/Protocols/SIP/SIPProto.cpp index c0d042a..2f79e16 100644 --- a/Protocols/SIP/SIPProto.cpp +++ b/Protocols/SIP/SIPProto.cpp @@ -41,16 +41,6 @@ SIPProto::SIPProto(const char *aProtoName, const TCHAR *aUserName) memset(awayMessages, 0, sizeof(awayMessages)); - { - pj_status_t status = pjsua_create(); - if (status != PJ_SUCCESS) - { - Error(status, _T("Error creating pjsua")); - throw "Error creating pjsua"; - } - hasToDestroy = true; - } - InitializeCriticalSection(&cs); m_tszUserName = mir_tstrdup(aUserName); @@ -508,6 +498,19 @@ int SIPProto::Connect() BroadcastStatus(ID_STATUS_CONNECTING); + DestroySIP(); + + { + pj_status_t status = pjsua_create(); + if (status != PJ_SUCCESS) + { + Error(status, _T("Error creating pjsua")); + Disconnect(); + return 1; + } + hasToDestroy = true; + } + { scoped_mir_free stun; scoped_mir_free dns; @@ -638,6 +641,7 @@ int SIPProto::Connect() } cfg.publish_enabled = (opts.publish ? PJ_TRUE : PJ_FALSE); + cfg.mwi_enabled = PJ_TRUE; if (!opts.sendKeepAlive) cfg.ka_interval = 0; @@ -929,6 +933,7 @@ void SIPProto::Disconnect() DBDeleteContactSetting(hContact, "CList", "StatusMsg"); } + m_iDesiredStatus = ID_STATUS_OFFLINE; BroadcastStatus(ID_STATUS_OFFLINE); } @@ -994,15 +999,19 @@ int __cdecl SIPProto::OnOptionsInit(WPARAM wParam, LPARAM lParam) } -int __cdecl SIPProto::OnPreShutdown(WPARAM wParam, LPARAM lParam) +void SIPProto::DestroySIP() { - if (hasToDestroy) - { - pjsua_destroy(); - hasToDestroy = false; - } + if (!hasToDestroy) + return; + pjsua_destroy(); + hasToDestroy = false; +} + +int __cdecl SIPProto::OnPreShutdown(WPARAM wParam, LPARAM lParam) +{ + DestroySIP(); return 0; } diff --git a/Protocols/SIP/SIPProto.h b/Protocols/SIP/SIPProto.h index 5d3797f..6efbe59 100644 --- a/Protocols/SIP/SIPProto.h +++ b/Protocols/SIP/SIPProto.h @@ -166,6 +166,7 @@ private: bool SendPresence(int status = 0); int Connect(); void Disconnect(); + void DestroySIP(); INT_PTR __cdecl CreateAccMgrUI(WPARAM wParam, LPARAM lParam); void ConfigureDevices(); diff --git a/Protocols/SIP/m_sip.h b/Protocols/SIP/m_sip.h index 360912b..e31f813 100644 --- a/Protocols/SIP/m_sip.h +++ b/Protocols/SIP/m_sip.h @@ -35,6 +35,11 @@ struct SIP_REGISTRATION int tcp_port; // UDP port to be used: 0 means TCP, -1 means don't want TCP int tls_port; // UDP port to be used: 0 means TLS, -1 means don't want TLS + struct { + const TCHAR *host; + int port; + } stun; + HANDLE hNetlib; // To be used for logs. Can be 0 SIPClientCallback callback; @@ -45,9 +50,11 @@ struct SIP_REGISTRATION struct SIP_CLIENT { void *data; // Do not touch - const TCHAR *host; + const TCHAR *udp_host; const int udp_port; + const TCHAR *tcp_host; const int tcp_port; + const TCHAR *tls_host; const int tls_port; // @param protocol 1 UDP, 2 TCP, 3 TLS diff --git a/Protocols/SIP/sip.cpp b/Protocols/SIP/sip.cpp index 138ad78..c68b538 100644 --- a/Protocols/SIP/sip.cpp +++ b/Protocols/SIP/sip.cpp @@ -30,7 +30,7 @@ PLUGININFOEX pluginInfo={ #else "SIP protocol (Ansi)", #endif - PLUGIN_MAKE_VERSION(0,1,2,0), + PLUGIN_MAKE_VERSION(0,1,3,0), "Provides support for SIP protocol", "Ricardo Pescuma Domenecci", "pescuma@miranda-im.org", @@ -322,7 +322,7 @@ static INT_PTR ClientRegister(WPARAM wParam, LPARAM lParam) return NULL; SIPClient *cli = new SIPClient(reg); - if (cli->Connect(reg->udp_port, reg->tcp_port, reg->tls_port) != 0) + if (cli->Connect(reg) != 0) { cli->Disconnect(); delete cli; @@ -333,9 +333,11 @@ static INT_PTR ClientRegister(WPARAM wParam, LPARAM lParam) SIP_CLIENT *ret = (SIP_CLIENT *) mir_alloc0(sizeof(SIP_CLIENT) + sizeof(SIPClient *)); ret->data = cli; - * (TCHAR **) & ret->host = cli->host; + * (TCHAR **) & ret->udp_host = cli->udp.host; * (int *) & ret->udp_port = cli->udp.port; + * (TCHAR **) & ret->tcp_host = cli->tcp.host; * (int *) & ret->tcp_port = cli->tcp.port; + * (TCHAR **) & ret->tls_host = cli->tls.host; * (int *) & ret->tls_port = cli->tls.port; ret->Call = &ClientCall; ret->DropCall = &ClientDropCall; -- cgit v1.2.3