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 "xmppsocket.h" 12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifdef HAVE_CONFIG_H 14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <config.h> 15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif 16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <errno.h> 18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/logging.h" 19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/thread.h" 20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifdef FEATURE_ENABLE_SSL 21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/ssladapter.h" 22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif 23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifdef USE_SSLSTREAM 25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/socketstream.h" 26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifdef FEATURE_ENABLE_SSL 27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/sslstreamadapter.h" 28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // FEATURE_ENABLE_SSL 29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace buzz { 32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppSocket::XmppSocket(buzz::TlsOptions tls) : cricket_socket_(NULL), 34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org tls_(tls) { 35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_CLOSED; 36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppSocket::CreateCricketSocket(int family) { 39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::Thread* pth = rtc::Thread::Current(); 40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (family == AF_UNSPEC) { 41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org family = AF_INET; 42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::AsyncSocket* socket = 44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org pth->socketserver()->CreateAsyncSocket(family, SOCK_STREAM); 45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifdef FEATURE_ENABLE_SSL 47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (tls_ != buzz::TLS_DISABLED) { 48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org socket = rtc::SSLAdapter::Create(socket); 49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // FEATURE_ENABLE_SSL 51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org cricket_socket_ = socket; 52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org cricket_socket_->SignalReadEvent.connect(this, &XmppSocket::OnReadEvent); 53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org cricket_socket_->SignalWriteEvent.connect(this, &XmppSocket::OnWriteEvent); 54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org cricket_socket_->SignalConnectEvent.connect(this, 55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org &XmppSocket::OnConnectEvent); 56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org cricket_socket_->SignalCloseEvent.connect(this, &XmppSocket::OnCloseEvent); 57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org cricket_socket_ = socket; 59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org stream_ = new rtc::SocketStream(cricket_socket_); 60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifdef FEATURE_ENABLE_SSL 61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (tls_ != buzz::TLS_DISABLED) 62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org stream_ = rtc::SSLStreamAdapter::Create(stream_); 63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // FEATURE_ENABLE_SSL 64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org stream_->SignalEvent.connect(this, &XmppSocket::OnEvent); 65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 67269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgXmppSocket::~XmppSocket() { 69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org Close(); 70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delete cricket_socket_; 72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delete stream_; 74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppSocket::OnReadEvent(rtc::AsyncSocket * socket) { 79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalRead(); 80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 82269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppSocket::OnWriteEvent(rtc::AsyncSocket * socket) { 83269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Write bytes if there are any 84269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org while (buffer_.Length() != 0) { 85269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int written = cricket_socket_->Send(buffer_.Data(), buffer_.Length()); 86269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (written > 0) { 87269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org buffer_.Consume(written); 88269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org continue; 89269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 90269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!cricket_socket_->IsBlocking()) 91269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org LOG(LS_ERROR) << "Send error: " << cricket_socket_->GetError(); 92269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 93269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 94269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 95269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 96269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppSocket::OnConnectEvent(rtc::AsyncSocket * socket) { 97269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#if defined(FEATURE_ENABLE_SSL) 98269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (state_ == buzz::AsyncSocket::STATE_TLS_CONNECTING) { 99269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_TLS_OPEN; 100269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalSSLConnected(); 101269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org OnWriteEvent(cricket_socket_); 102269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 103269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 104269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // !defined(FEATURE_ENABLE_SSL) 105269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_OPEN; 106269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalConnected(); 107269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 108269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 109269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppSocket::OnCloseEvent(rtc::AsyncSocket * socket, int error) { 110269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalCloseEvent(error); 111269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 112269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 113269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 114269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 115269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgvoid XmppSocket::OnEvent(rtc::StreamInterface* stream, 116269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int events, int err) { 117269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if ((events & rtc::SE_OPEN)) { 118269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#if defined(FEATURE_ENABLE_SSL) 119269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (state_ == buzz::AsyncSocket::STATE_TLS_CONNECTING) { 120269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_TLS_OPEN; 121269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalSSLConnected(); 122269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org events |= rtc::SE_WRITE; 123269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } else 124269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif 125269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org { 126269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_OPEN; 127269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalConnected(); 128269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 129269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 130269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if ((events & rtc::SE_READ)) 131269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalRead(); 132269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if ((events & rtc::SE_WRITE)) { 133269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Write bytes if there are any 134269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org while (buffer_.Length() != 0) { 135269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::StreamResult result; 136269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org size_t written; 137269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int error; 138269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org result = stream_->Write(buffer_.Data(), buffer_.Length(), 139269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org &written, &error); 140269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (result == rtc::SR_ERROR) { 141269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org LOG(LS_ERROR) << "Send error: " << error; 142269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 143269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 144269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (result == rtc::SR_BLOCK) 145269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return; 146269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ASSERT(result == rtc::SR_SUCCESS); 147269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ASSERT(written > 0); 148269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org buffer_.Shift(written); 149269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 150269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 151269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if ((events & rtc::SE_CLOSE)) 152269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalCloseEvent(err); 153269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 154269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 155269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 156269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbuzz::AsyncSocket::State XmppSocket::state() { 157269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return state_; 158269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 159269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 160269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbuzz::AsyncSocket::Error XmppSocket::error() { 161269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return buzz::AsyncSocket::ERROR_NONE; 162269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 163269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 164269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgint XmppSocket::GetError() { 165269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return 0; 166269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 167269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 168269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbool XmppSocket::Connect(const rtc::SocketAddress& addr) { 169269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (cricket_socket_ == NULL) { 170269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org CreateCricketSocket(addr.family()); 171269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 172269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (cricket_socket_->Connect(addr) < 0) { 173269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return cricket_socket_->IsBlocking(); 174269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 175269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 176269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 177269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 178269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbool XmppSocket::Read(char * data, size_t len, size_t* len_read) { 179269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 180269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int read = cricket_socket_->Recv(data, len); 181269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (read > 0) { 182269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *len_read = (size_t)read; 183269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 184269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 185269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 186269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::StreamResult result = stream_->Read(data, len, len_read, NULL); 187269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (result == rtc::SR_SUCCESS) 188269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 189269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 190269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 191269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 192269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 193269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbool XmppSocket::Write(const char * data, size_t len) { 194269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org buffer_.WriteBytes(data, len); 195269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 196269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org OnWriteEvent(cricket_socket_); 197269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 198269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org OnEvent(stream_, rtc::SE_WRITE, 0); 199269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 200269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 201269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 202269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 203269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbool XmppSocket::Close() { 204269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (state_ != buzz::AsyncSocket::STATE_OPEN) 205269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 206269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 207269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (cricket_socket_->Close() == 0) { 208269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_CLOSED; 209269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalClosed(); 210269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 211269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 212269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 213269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 214269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_CLOSED; 215269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org stream_->Close(); 216269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SignalClosed(); 217269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 218269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 219269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 220269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 221269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgbool XmppSocket::StartTls(const std::string & domainname) { 222269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#if defined(FEATURE_ENABLE_SSL) 223269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (tls_ == buzz::TLS_DISABLED) 224269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 225269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef USE_SSLSTREAM 226269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::SSLAdapter* ssl_adapter = 227269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org static_cast<rtc::SSLAdapter *>(cricket_socket_); 228269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (ssl_adapter->StartSSL(domainname.c_str(), false) != 0) 229269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 230269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // USE_SSLSTREAM 231269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::SSLStreamAdapter* ssl_stream = 232269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org static_cast<rtc::SSLStreamAdapter *>(stream_); 233269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (ssl_stream->StartSSLWithServer(domainname.c_str()) != 0) 234269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 235269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // USE_SSLSTREAM 236269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org state_ = buzz::AsyncSocket::STATE_TLS_CONNECTING; 237269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 238269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#else // !defined(FEATURE_ENABLE_SSL) 239269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return false; 240269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // !defined(FEATURE_ENABLE_SSL) 241269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 242269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 243269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} // namespace buzz 244269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 245