1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/* 2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * 4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */ 10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/xmppclient.h" 12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/constants.h" 14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/plainsaslhandler.h" 15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/prexmppauth.h" 16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/saslplainmechanism.h" 17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/logging.h" 18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/sigslot.h" 20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/stringutils.h" 21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "xmpptask.h" 22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace buzz { 24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass XmppClient::Private : 26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public sigslot::has_slots<>, 27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public XmppSessionHandler, 28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public XmppOutputHandler { 29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgpublic: 30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org explicit Private(XmppClient* client) : 32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org client_(client), 33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_(), 34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org engine_(), 35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org proxy_port_(0), 36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org pre_engine_error_(XmppEngine::ERROR_NONE), 37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org pre_engine_subcode_(0), 38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org signal_closed_(false), 39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org allow_plain_(false) {} 40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual ~Private() { 42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // We need to disconnect from socket_ before engine_ is destructed (by 43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // the auto-generated destructor code). 44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ResetSocket(); 45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // the owner 48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppClient* const client_; 49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // the two main objects 51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<AsyncSocket> socket_; 52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<XmppEngine> engine_; 53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<PreXmppAuth> pre_auth_; 54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::CryptString pass_; 55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string auth_mechanism_; 56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string auth_token_; 57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::SocketAddress server_; 58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string proxy_host_; 59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int proxy_port_; 60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngine::Error pre_engine_error_; 61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int pre_engine_subcode_; 62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org CaptchaChallenge captcha_challenge_; 63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool signal_closed_; 64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool allow_plain_; 65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void ResetSocket() { 67269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (socket_) { 68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_->SignalConnected.disconnect(this); 69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_->SignalRead.disconnect(this); 70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_->SignalClosed.disconnect(this); 71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_.reset(NULL); 72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // implementations of interfaces 76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnStateChange(int state); 77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void WriteOutput(const char* bytes, size_t len); 78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void StartTls(const std::string& domainname); 79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void CloseConnection(); 80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // slots for socket signals 82269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnSocketConnected(); 83269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnSocketRead(); 84269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnSocketClosed(); 85269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}; 86269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 87269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbool IsTestServer(const std::string& server_name, 88269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& test_server_domain) { 89269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return (!test_server_domain.empty() && 90269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::ends_with(server_name.c_str(), 91269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org test_server_domain.c_str())); 92269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 93269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 94269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppReturnStatus XmppClient::Connect( 95269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const XmppClientSettings& settings, 96269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& lang, AsyncSocket* socket, PreXmppAuth* pre_auth) { 97269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (socket == NULL) 98269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XMPP_RETURN_BADARGUMENT; 99269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (d_->socket_) 100269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XMPP_RETURN_BADSTATE; 101269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 102269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->socket_.reset(socket); 103269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 104269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->socket_->SignalConnected.connect(d_.get(), &Private::OnSocketConnected); 105269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->socket_->SignalRead.connect(d_.get(), &Private::OnSocketRead); 106269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->socket_->SignalClosed.connect(d_.get(), &Private::OnSocketClosed); 107269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 108269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_.reset(XmppEngine::Create()); 109269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetSessionHandler(d_.get()); 110269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetOutputHandler(d_.get()); 111269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!settings.resource().empty()) { 112269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetRequestedResource(settings.resource()); 113269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 114269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetTls(settings.use_tls()); 115269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 116269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // The talk.google.com server returns a certificate with common-name: 117269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // CN="gmail.com" for @gmail.com accounts, 118269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // CN="googlemail.com" for @googlemail.com accounts, 119269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // CN="talk.google.com" for other accounts (such as @example.com), 120269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // so we tweak the tls server setting for those other accounts to match the 121269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // returned certificate CN of "talk.google.com". 122269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // For other servers, we leave the strings empty, which causes the jid's 123269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // domain to be used. We do the same for gmail.com and googlemail.com as the 124269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // returned CN matches the account domain in those cases. 125269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string server_name = settings.server().HostAsURIString(); 126269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (server_name == buzz::STR_TALK_GOOGLE_COM || 127269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org server_name == buzz::STR_TALKX_L_GOOGLE_COM || 128269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org server_name == buzz::STR_XMPP_GOOGLE_COM || 129269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org server_name == buzz::STR_XMPPX_L_GOOGLE_COM || 130269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org IsTestServer(server_name, settings.test_server_domain())) { 131269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (settings.host() != STR_GMAIL_COM && 132269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org settings.host() != STR_GOOGLEMAIL_COM) { 133269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetTlsServer("", STR_TALK_GOOGLE_COM); 134269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 135269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 136269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 137269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Set language 138269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetLanguage(lang); 139269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 140269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetUser(buzz::Jid(settings.user(), settings.host(), STR_EMPTY)); 141269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 142269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pass_ = settings.pass(); 143269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->auth_mechanism_ = settings.auth_mechanism(); 144269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->auth_token_ = settings.auth_token(); 145269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->server_ = settings.server(); 146269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->proxy_host_ = settings.proxy_host(); 147269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->proxy_port_ = settings.proxy_port(); 148269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->allow_plain_ = settings.allow_plain(); 149269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_auth_.reset(pre_auth); 150269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 151269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XMPP_RETURN_OK; 152269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 153269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 154269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppEngine::State XmppClient::GetState() const { 155269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->engine_) 156269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XmppEngine::STATE_NONE; 157269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->GetState(); 158269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 159269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 160269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppEngine::Error XmppClient::GetError(int* subcode) { 161269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (subcode) { 162269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *subcode = 0; 163269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 164269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->engine_) 165269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XmppEngine::ERROR_NONE; 166269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (d_->pre_engine_error_ != XmppEngine::ERROR_NONE) { 167269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (subcode) { 168269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *subcode = d_->pre_engine_subcode_; 169269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 170269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->pre_engine_error_; 171269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 172269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->GetError(subcode); 173269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 174269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 175269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgconst XmlElement* XmppClient::GetStreamError() { 176269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->engine_) { 177269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return NULL; 178269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 179269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->GetStreamError(); 180269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 181269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 182269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgCaptchaChallenge XmppClient::GetCaptchaChallenge() { 183269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->engine_) 184269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return CaptchaChallenge(); 185269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->captcha_challenge_; 186269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 187269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 188269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgstd::string XmppClient::GetAuthMechanism() { 189269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->engine_) 190269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return ""; 191269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->auth_mechanism_; 192269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 193269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 194269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgstd::string XmppClient::GetAuthToken() { 195269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->engine_) 196269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return ""; 197269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->auth_token_; 198269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 199269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 200269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgint XmppClient::ProcessStart() { 201269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Should not happen, but was observed in crash reports 202269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->socket_) { 203269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org LOG(LS_ERROR) << "socket_ already reset"; 204269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_DONE; 205269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 206269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 207269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (d_->pre_auth_) { 208269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_auth_->SignalAuthDone.connect(this, &XmppClient::OnAuthDone); 209269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_auth_->StartPreXmppAuth( 210269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->GetUser(), d_->server_, d_->pass_, 211269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->auth_mechanism_, d_->auth_token_); 212269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pass_.Clear(); // done with this; 213269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_PRE_XMPP_LOGIN; 214269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 215269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org else { 216269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetSaslHandler(new PlainSaslHandler( 217269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->GetUser(), d_->pass_, d_->allow_plain_)); 218269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pass_.Clear(); // done with this; 219269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_START_XMPP_LOGIN; 220269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 221269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 222269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 223269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::OnAuthDone() { 224269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org Wake(); 225269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 226269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 227269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgint XmppClient::ProcessTokenLogin() { 228269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Should not happen, but was observed in crash reports 229269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->socket_) { 230269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org LOG(LS_ERROR) << "socket_ already reset"; 231269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_DONE; 232269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 233269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 234269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Don't know how this could happen, but crash reports show it as NULL 235269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->pre_auth_) { 236269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_engine_error_ = XmppEngine::ERROR_AUTH; 237269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org EnsureClosed(); 238269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_ERROR; 239269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 240269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 241269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Wait until pre authentication is done is done 242269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->pre_auth_->IsAuthDone()) 243269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_BLOCKED; 244269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 245269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->pre_auth_->IsAuthorized()) { 246269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // maybe split out a case when gaia is down? 247269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (d_->pre_auth_->HadError()) { 248269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_engine_error_ = XmppEngine::ERROR_AUTH; 249269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_engine_subcode_ = d_->pre_auth_->GetError(); 250269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 251269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org else { 252269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_engine_error_ = XmppEngine::ERROR_UNAUTHORIZED; 253269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_engine_subcode_ = 0; 254269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->captcha_challenge_ = d_->pre_auth_->GetCaptchaChallenge(); 255269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 256269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->pre_auth_.reset(NULL); // done with this 257269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org EnsureClosed(); 258269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_ERROR; 259269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 260269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 261269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Save auth token as a result 262269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 263269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->auth_mechanism_ = d_->pre_auth_->GetAuthMechanism(); 264269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->auth_token_ = d_->pre_auth_->GetAuthToken(); 265269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 266269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // transfer ownership of pre_auth_ to engine 267269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->SetSaslHandler(d_->pre_auth_.release()); 268269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_START_XMPP_LOGIN; 269269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 270269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 271269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgint XmppClient::ProcessStartXmppLogin() { 272269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Should not happen, but was observed in crash reports 273269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->socket_) { 274269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org LOG(LS_ERROR) << "socket_ already reset"; 275269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_DONE; 276269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 277269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 278269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Done with pre-connect tasks - connect! 279269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->socket_->Connect(d_->server_)) { 280269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org EnsureClosed(); 281269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_ERROR; 282269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 283269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 284269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_RESPONSE; 285269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 286269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 287269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgint XmppClient::ProcessResponse() { 288269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Hang around while we are connected. 289269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!delivering_signal_ && 290269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org (!d_->engine_ || d_->engine_->GetState() == XmppEngine::STATE_CLOSED)) 291269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_DONE; 292269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return STATE_BLOCKED; 293269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 294269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 295269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppReturnStatus XmppClient::Disconnect() { 296269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->socket_) 297269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XMPP_RETURN_BADSTATE; 298269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org Abort(); 299269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->Disconnect(); 300269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->ResetSocket(); 301269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return XMPP_RETURN_OK; 302269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 303269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 304269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppClient::XmppClient(TaskParent* parent) 305269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org : XmppTaskParentInterface(parent), 306269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delivering_signal_(false), 307269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org valid_(false) { 308269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_.reset(new Private(this)); 309269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org valid_ = true; 310269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 311269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 312269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppClient::~XmppClient() { 313269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org valid_ = false; 314269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 315269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 316269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgconst Jid& XmppClient::jid() const { 317269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->FullJid(); 318269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 319269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 320269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 321269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgstd::string XmppClient::NextId() { 322269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->NextId(); 323269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 324269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 325269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppReturnStatus XmppClient::SendStanza(const XmlElement* stanza) { 326269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->SendStanza(stanza); 327269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 328269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 329269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppReturnStatus XmppClient::SendStanzaError( 330269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const XmlElement* old_stanza, XmppStanzaError xse, 331269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& message) { 332269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->SendStanzaError(old_stanza, xse, message); 333269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 334269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 335269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppReturnStatus XmppClient::SendRaw(const std::string& text) { 336269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_->SendRaw(text); 337269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 338269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 339269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppEngine* XmppClient::engine() { 340269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return d_->engine_.get(); 341269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 342269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 343269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::OnSocketConnected() { 344269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org engine_->Connect(); 345269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 346269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 347269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::OnSocketRead() { 348269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org char bytes[4096]; 349269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org size_t bytes_read; 350269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org for (;;) { 351269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Should not happen, but was observed in crash reports 352269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!socket_) { 353269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org LOG(LS_ERROR) << "socket_ already reset"; 354269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 355269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 356269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 357269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!socket_->Read(bytes, sizeof(bytes), &bytes_read)) { 358269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // TODO: deal with error information 359269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 360269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 361269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 362269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (bytes_read == 0) 363269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 364269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 365a41ab9326c8f0f7eb738e5d51a239a2b9e276361tfarina//#if !defined(NDEBUG) 366269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org client_->SignalLogInput(bytes, static_cast<int>(bytes_read)); 367269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//#endif 368269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 369269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org engine_->HandleInput(bytes, bytes_read); 370269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 371269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 372269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 373269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::OnSocketClosed() { 374269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int code = socket_->GetError(); 375269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org engine_->ConnectionClosed(code); 376269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 377269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 378269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::OnStateChange(int state) { 379269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (state == XmppEngine::STATE_CLOSED) { 380269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org client_->EnsureClosed(); 381269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 382269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org else { 383269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org client_->SignalStateChange((XmppEngine::State)state); 384269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 385269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org client_->Wake(); 386269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 387269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 388269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::WriteOutput(const char* bytes, size_t len) { 389a41ab9326c8f0f7eb738e5d51a239a2b9e276361tfarina//#if !defined(NDEBUG) 390269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org client_->SignalLogOutput(bytes, static_cast<int>(len)); 391269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//#endif 392269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 393269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_->Write(bytes, len); 394269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // TODO: deal with error information 395269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 396269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 397269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::StartTls(const std::string& domain) { 398269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#if defined(FEATURE_ENABLE_SSL) 399269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_->StartTls(domain); 400269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif 401269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 402269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 403269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::Private::CloseConnection() { 404269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket_->Close(); 405269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 406269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 407269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::AddXmppTask(XmppTask* task, XmppEngine::HandlerLevel level) { 408269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->AddStanzaHandler(task, level); 409269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 410269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 411269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::RemoveXmppTask(XmppTask* task) { 412269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->engine_->RemoveStanzaHandler(task); 413269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 414269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 415269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppClient::EnsureClosed() { 416269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!d_->signal_closed_) { 417269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org d_->signal_closed_ = true; 418269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delivering_signal_ = true; 419269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalStateChange(XmppEngine::STATE_CLOSED); 420269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delivering_signal_ = false; 421269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 422269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 423269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 424269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} // namespace buzz 425