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