Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: third_party/libjingle_xmpp/xmpp/xmppsocket.cc

Issue 2443903004: Add xmllite and xmpp sources to third_party/ (Closed)
Patch Set: Fix GN and sort includes Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2004 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "xmppsocket.h"
6
7 #include <errno.h>
8 #include "webrtc/base/logging.h"
9 #include "webrtc/base/thread.h"
10 #ifdef FEATURE_ENABLE_SSL
11 #include "webrtc/base/ssladapter.h"
12 #endif
13
14 #ifdef USE_SSLSTREAM
15 #include "webrtc/base/socketstream.h"
16 #ifdef FEATURE_ENABLE_SSL
17 #include "webrtc/base/sslstreamadapter.h"
18 #endif // FEATURE_ENABLE_SSL
19 #endif // USE_SSLSTREAM
20
21 namespace buzz {
22
23 XmppSocket::XmppSocket(buzz::TlsOptions tls) : cricket_socket_(NULL),
24 tls_(tls) {
25 state_ = buzz::AsyncSocket::STATE_CLOSED;
26 }
27
28 void XmppSocket::CreateCricketSocket(int family) {
29 rtc::Thread* pth = rtc::Thread::Current();
30 if (family == AF_UNSPEC) {
31 family = AF_INET;
32 }
33 rtc::AsyncSocket* socket =
34 pth->socketserver()->CreateAsyncSocket(family, SOCK_STREAM);
35 #ifndef USE_SSLSTREAM
36 #ifdef FEATURE_ENABLE_SSL
37 if (tls_ != buzz::TLS_DISABLED) {
38 socket = rtc::SSLAdapter::Create(socket);
39 }
40 #endif // FEATURE_ENABLE_SSL
41 cricket_socket_ = socket;
42 cricket_socket_->SignalReadEvent.connect(this, &XmppSocket::OnReadEvent);
43 cricket_socket_->SignalWriteEvent.connect(this, &XmppSocket::OnWriteEvent);
44 cricket_socket_->SignalConnectEvent.connect(this,
45 &XmppSocket::OnConnectEvent);
46 cricket_socket_->SignalCloseEvent.connect(this, &XmppSocket::OnCloseEvent);
47 #else // USE_SSLSTREAM
48 cricket_socket_ = socket;
49 stream_ = new rtc::SocketStream(cricket_socket_);
50 #ifdef FEATURE_ENABLE_SSL
51 if (tls_ != buzz::TLS_DISABLED)
52 stream_ = rtc::SSLStreamAdapter::Create(stream_);
53 #endif // FEATURE_ENABLE_SSL
54 stream_->SignalEvent.connect(this, &XmppSocket::OnEvent);
55 #endif // USE_SSLSTREAM
56 }
57
58 XmppSocket::~XmppSocket() {
59 Close();
60 #ifndef USE_SSLSTREAM
61 delete cricket_socket_;
62 #else // USE_SSLSTREAM
63 delete stream_;
64 #endif // USE_SSLSTREAM
65 }
66
67 #ifndef USE_SSLSTREAM
68 void XmppSocket::OnReadEvent(rtc::AsyncSocket * socket) {
69 SignalRead();
70 }
71
72 void XmppSocket::OnWriteEvent(rtc::AsyncSocket * socket) {
73 // Write bytes if there are any
74 while (buffer_.size() > 0) {
75 int written = cricket_socket_->Send(buffer_.data(), buffer_.size());
76 if (written > 0) {
77 ASSERT(static_cast<size_t>(written) <= buffer_.size());
78 memmove(buffer_.data(), buffer_.data() + written,
79 buffer_.size() - written);
80 buffer_.SetSize(buffer_.size() - written);
81 continue;
82 }
83 if (!cricket_socket_->IsBlocking())
84 LOG(LS_ERROR) << "Send error: " << cricket_socket_->GetError();
85 return;
86 }
87 }
88
89 void XmppSocket::OnConnectEvent(rtc::AsyncSocket * socket) {
90 #if defined(FEATURE_ENABLE_SSL)
91 if (state_ == buzz::AsyncSocket::STATE_TLS_CONNECTING) {
92 state_ = buzz::AsyncSocket::STATE_TLS_OPEN;
93 SignalSSLConnected();
94 OnWriteEvent(cricket_socket_);
95 return;
96 }
97 #endif // !defined(FEATURE_ENABLE_SSL)
98 state_ = buzz::AsyncSocket::STATE_OPEN;
99 SignalConnected();
100 }
101
102 void XmppSocket::OnCloseEvent(rtc::AsyncSocket * socket, int error) {
103 SignalCloseEvent(error);
104 }
105
106 #else // USE_SSLSTREAM
107
108 void XmppSocket::OnEvent(rtc::StreamInterface* stream,
109 int events, int err) {
110 if ((events & rtc::SE_OPEN)) {
111 #if defined(FEATURE_ENABLE_SSL)
112 if (state_ == buzz::AsyncSocket::STATE_TLS_CONNECTING) {
113 state_ = buzz::AsyncSocket::STATE_TLS_OPEN;
114 SignalSSLConnected();
115 events |= rtc::SE_WRITE;
116 } else
117 #endif
118 {
119 state_ = buzz::AsyncSocket::STATE_OPEN;
120 SignalConnected();
121 }
122 }
123 if ((events & rtc::SE_READ))
124 SignalRead();
125 if ((events & rtc::SE_WRITE)) {
126 // Write bytes if there are any
127 while (buffer_.size() > 0) {
128 rtc::StreamResult result;
129 size_t written;
130 int error;
131 result = stream_->Write(buffer_.data(), buffer_.size(),
132 &written, &error);
133 if (result == rtc::SR_ERROR) {
134 LOG(LS_ERROR) << "Send error: " << error;
135 return;
136 }
137 if (result == rtc::SR_BLOCK)
138 return;
139 ASSERT(result == rtc::SR_SUCCESS);
140 ASSERT(written > 0);
141 ASSERT(written <= buffer_.size());
142 memmove(buffer_.data(), buffer_.data() + written,
143 buffer_.size() - written);
144 buffer_.SetSize(buffer_.size() - written);
145 }
146 }
147 if ((events & rtc::SE_CLOSE))
148 SignalCloseEvent(err);
149 }
150 #endif // USE_SSLSTREAM
151
152 buzz::AsyncSocket::State XmppSocket::state() {
153 return state_;
154 }
155
156 buzz::AsyncSocket::Error XmppSocket::error() {
157 return buzz::AsyncSocket::ERROR_NONE;
158 }
159
160 int XmppSocket::GetError() {
161 return 0;
162 }
163
164 bool XmppSocket::Connect(const rtc::SocketAddress& addr) {
165 if (cricket_socket_ == NULL) {
166 CreateCricketSocket(addr.family());
167 }
168 if (cricket_socket_->Connect(addr) < 0) {
169 return cricket_socket_->IsBlocking();
170 }
171 return true;
172 }
173
174 bool XmppSocket::Read(char * data, size_t len, size_t* len_read) {
175 #ifndef USE_SSLSTREAM
176 int read = cricket_socket_->Recv(data, len, nullptr);
177 if (read > 0) {
178 *len_read = (size_t)read;
179 return true;
180 }
181 #else // USE_SSLSTREAM
182 rtc::StreamResult result = stream_->Read(data, len, len_read, NULL);
183 if (result == rtc::SR_SUCCESS)
184 return true;
185 #endif // USE_SSLSTREAM
186 return false;
187 }
188
189 bool XmppSocket::Write(const char * data, size_t len) {
190 buffer_.AppendData(data, len);
191 #ifndef USE_SSLSTREAM
192 OnWriteEvent(cricket_socket_);
193 #else // USE_SSLSTREAM
194 OnEvent(stream_, rtc::SE_WRITE, 0);
195 #endif // USE_SSLSTREAM
196 return true;
197 }
198
199 bool XmppSocket::Close() {
200 if (state_ != buzz::AsyncSocket::STATE_OPEN)
201 return false;
202 #ifndef USE_SSLSTREAM
203 if (cricket_socket_->Close() == 0) {
204 state_ = buzz::AsyncSocket::STATE_CLOSED;
205 SignalClosed();
206 return true;
207 }
208 return false;
209 #else // USE_SSLSTREAM
210 state_ = buzz::AsyncSocket::STATE_CLOSED;
211 stream_->Close();
212 SignalClosed();
213 return true;
214 #endif // USE_SSLSTREAM
215 }
216
217 bool XmppSocket::StartTls(const std::string & domainname) {
218 #if defined(FEATURE_ENABLE_SSL)
219 if (tls_ == buzz::TLS_DISABLED)
220 return false;
221 #ifndef USE_SSLSTREAM
222 rtc::SSLAdapter* ssl_adapter =
223 static_cast<rtc::SSLAdapter *>(cricket_socket_);
224 if (ssl_adapter->StartSSL(domainname.c_str(), false) != 0)
225 return false;
226 #else // USE_SSLSTREAM
227 rtc::SSLStreamAdapter* ssl_stream =
228 static_cast<rtc::SSLStreamAdapter *>(stream_);
229 if (ssl_stream->StartSSLWithServer(domainname.c_str()) != 0)
230 return false;
231 #endif // USE_SSLSTREAM
232 state_ = buzz::AsyncSocket::STATE_TLS_CONNECTING;
233 return true;
234 #else // !defined(FEATURE_ENABLE_SSL)
235 return false;
236 #endif // !defined(FEATURE_ENABLE_SSL)
237 }
238
239 } // namespace buzz
240
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698