147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2010 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketstream.h" 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgSocketStream::SocketStream(AsyncSocket* socket) : socket_(NULL) { 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Attach(socket); 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgSocketStream::~SocketStream() { 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete socket_; 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SocketStream::Attach(AsyncSocket* socket) { 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (socket_) 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete socket_; 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_ = socket; 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (socket_) { 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalConnectEvent.connect(this, &SocketStream::OnConnectEvent); 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalReadEvent.connect(this, &SocketStream::OnReadEvent); 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalWriteEvent.connect(this, &SocketStream::OnWriteEvent); 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalCloseEvent.connect(this, &SocketStream::OnCloseEvent); 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgAsyncSocket* SocketStream::Detach() { 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncSocket* socket = socket_; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (socket_) { 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalConnectEvent.disconnect(this); 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalReadEvent.disconnect(this); 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalWriteEvent.disconnect(this); 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->SignalCloseEvent.disconnect(this); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_ = NULL; 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return socket; 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgStreamState SocketStream::GetState() const { 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket_ != NULL); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org switch (socket_->GetState()) { 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org case Socket::CS_CONNECTED: 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SS_OPEN; 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org case Socket::CS_CONNECTING: 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SS_OPENING; 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org case Socket::CS_CLOSED: 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org default: 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SS_CLOSED; 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgStreamResult SocketStream::Read(void* buffer, size_t buffer_len, 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t* read, int* error) { 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket_ != NULL); 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int result = socket_->Recv(buffer, buffer_len); 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (result < 0) { 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (socket_->IsBlocking()) 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_BLOCK; 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (error) 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *error = socket_->GetError(); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_ERROR; 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if ((result > 0) || (buffer_len == 0)) { 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (read) 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *read = result; 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_SUCCESS; 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_EOS; 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgStreamResult SocketStream::Write(const void* data, size_t data_len, 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t* written, int* error) { 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket_ != NULL); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int result = socket_->Send(data, data_len); 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (result < 0) { 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (socket_->IsBlocking()) 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_BLOCK; 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (error) 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *error = socket_->GetError(); 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_ERROR; 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (written) 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *written = result; 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SR_SUCCESS; 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SocketStream::Close() { 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket_ != NULL); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org socket_->Close(); 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SocketStream::OnConnectEvent(AsyncSocket* socket) { 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket == socket_); 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalEvent(this, SE_OPEN | SE_READ | SE_WRITE, 0); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SocketStream::OnReadEvent(AsyncSocket* socket) { 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket == socket_); 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalEvent(this, SE_READ, 0); 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SocketStream::OnWriteEvent(AsyncSocket* socket) { 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket == socket_); 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalEvent(this, SE_WRITE, 0); 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SocketStream::OnCloseEvent(AsyncSocket* socket, int err) { 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(socket == socket_); 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalEvent(this, SE_CLOSE, err); 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 122