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

Unified Diff: net/base/stream_listen_socket.cc

Issue 13812005: net: move socket files from net/base to net/socket (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sort gyp Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/stream_listen_socket.h ('k') | net/base/tcp_listen_socket.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/stream_listen_socket.cc
diff --git a/net/base/stream_listen_socket.cc b/net/base/stream_listen_socket.cc
deleted file mode 100644
index 7168df37205f9083e51cb85e8e9f5323db9cf285..0000000000000000000000000000000000000000
--- a/net/base/stream_listen_socket.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/base/stream_listen_socket.h"
-
-#if defined(OS_WIN)
-// winsock2.h must be included first in order to ensure it is included before
-// windows.h.
-#include <winsock2.h>
-#elif defined(OS_POSIX)
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include "net/base/net_errors.h"
-#endif
-
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/sys_byteorder.h"
-#include "base/threading/platform_thread.h"
-#include "build/build_config.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_util.h"
-
-using std::string;
-
-#if defined(OS_WIN)
-typedef int socklen_t;
-#endif // defined(OS_WIN)
-
-namespace net {
-
-namespace {
-
-const int kReadBufSize = 4096;
-
-} // namespace
-
-#if defined(OS_WIN)
-const SocketDescriptor StreamListenSocket::kInvalidSocket = INVALID_SOCKET;
-const int StreamListenSocket::kSocketError = SOCKET_ERROR;
-#elif defined(OS_POSIX)
-const SocketDescriptor StreamListenSocket::kInvalidSocket = -1;
-const int StreamListenSocket::kSocketError = -1;
-#endif
-
-StreamListenSocket::StreamListenSocket(SocketDescriptor s,
- StreamListenSocket::Delegate* del)
- : socket_delegate_(del),
- socket_(s),
- reads_paused_(false),
- has_pending_reads_(false) {
-#if defined(OS_WIN)
- socket_event_ = WSACreateEvent();
- // TODO(ibrar): error handling in case of socket_event_ == WSA_INVALID_EVENT.
- WatchSocket(NOT_WAITING);
-#elif defined(OS_POSIX)
- wait_state_ = NOT_WAITING;
-#endif
-}
-
-StreamListenSocket::~StreamListenSocket() {
-#if defined(OS_WIN)
- if (socket_event_) {
- WSACloseEvent(socket_event_);
- socket_event_ = WSA_INVALID_EVENT;
- }
-#endif
- CloseSocket(socket_);
-}
-
-void StreamListenSocket::Send(const char* bytes, int len,
- bool append_linefeed) {
- SendInternal(bytes, len);
- if (append_linefeed)
- SendInternal("\r\n", 2);
-}
-
-void StreamListenSocket::Send(const string& str, bool append_linefeed) {
- Send(str.data(), static_cast<int>(str.length()), append_linefeed);
-}
-
-int StreamListenSocket::GetLocalAddress(IPEndPoint* address) {
- SockaddrStorage storage;
- if (getsockname(socket_, storage.addr, &storage.addr_len)) {
-#if defined(OS_WIN)
- int err = WSAGetLastError();
-#else
- int err = errno;
-#endif
- return MapSystemError(err);
- }
- if (!address->FromSockAddr(storage.addr, storage.addr_len))
- return ERR_FAILED;
- return OK;
-}
-
-SocketDescriptor StreamListenSocket::AcceptSocket() {
- SocketDescriptor conn = HANDLE_EINTR(accept(socket_, NULL, NULL));
- if (conn == kInvalidSocket)
- LOG(ERROR) << "Error accepting connection.";
- else
- SetNonBlocking(conn);
- return conn;
-}
-
-void StreamListenSocket::SendInternal(const char* bytes, int len) {
- char* send_buf = const_cast<char *>(bytes);
- int len_left = len;
- while (true) {
- int sent = HANDLE_EINTR(send(socket_, send_buf, len_left, 0));
- if (sent == len_left) { // A shortcut to avoid extraneous checks.
- break;
- }
- if (sent == kSocketError) {
-#if defined(OS_WIN)
- if (WSAGetLastError() != WSAEWOULDBLOCK) {
- LOG(ERROR) << "send failed: WSAGetLastError()==" << WSAGetLastError();
-#elif defined(OS_POSIX)
- if (errno != EWOULDBLOCK && errno != EAGAIN) {
- LOG(ERROR) << "send failed: errno==" << errno;
-#endif
- break;
- }
- // Otherwise we would block, and now we have to wait for a retry.
- // Fall through to PlatformThread::YieldCurrentThread()
- } else {
- // sent != len_left according to the shortcut above.
- // Shift the buffer start and send the remainder after a short while.
- send_buf += sent;
- len_left -= sent;
- }
- base::PlatformThread::YieldCurrentThread();
- }
-}
-
-void StreamListenSocket::Listen() {
- int backlog = 10; // TODO(erikkay): maybe don't allow any backlog?
- if (listen(socket_, backlog) == -1) {
- // TODO(erikkay): error handling.
- LOG(ERROR) << "Could not listen on socket.";
- return;
- }
-#if defined(OS_POSIX)
- WatchSocket(WAITING_ACCEPT);
-#endif
-}
-
-void StreamListenSocket::Read() {
- char buf[kReadBufSize + 1]; // +1 for null termination.
- int len;
- do {
- len = HANDLE_EINTR(recv(socket_, buf, kReadBufSize, 0));
- if (len == kSocketError) {
-#if defined(OS_WIN)
- int err = WSAGetLastError();
- if (err == WSAEWOULDBLOCK) {
-#elif defined(OS_POSIX)
- if (errno == EWOULDBLOCK || errno == EAGAIN) {
-#endif
- break;
- } else {
- // TODO(ibrar): some error handling required here.
- break;
- }
- } else if (len == 0) {
- // In Windows, Close() is called by OnObjectSignaled. In POSIX, we need
- // to call it here.
-#if defined(OS_POSIX)
- Close();
-#endif
- } else {
- // TODO(ibrar): maybe change DidRead to take a length instead.
- DCHECK_GT(len, 0);
- DCHECK_LE(len, kReadBufSize);
- buf[len] = 0; // Already create a buffer with +1 length.
- socket_delegate_->DidRead(this, buf, len);
- }
- } while (len == kReadBufSize);
-}
-
-void StreamListenSocket::Close() {
-#if defined(OS_POSIX)
- if (wait_state_ == NOT_WAITING)
- return;
- wait_state_ = NOT_WAITING;
-#endif
- UnwatchSocket();
- socket_delegate_->DidClose(this);
-}
-
-void StreamListenSocket::CloseSocket(SocketDescriptor s) {
- if (s && s != kInvalidSocket) {
- UnwatchSocket();
-#if defined(OS_WIN)
- closesocket(s);
-#elif defined(OS_POSIX)
- close(s);
-#endif
- }
-}
-
-void StreamListenSocket::WatchSocket(WaitState state) {
-#if defined(OS_WIN)
- WSAEventSelect(socket_, socket_event_, FD_ACCEPT | FD_CLOSE | FD_READ);
- watcher_.StartWatching(socket_event_, this);
-#elif defined(OS_POSIX)
- // Implicitly calls StartWatchingFileDescriptor().
- MessageLoopForIO::current()->WatchFileDescriptor(
- socket_, true, MessageLoopForIO::WATCH_READ, &watcher_, this);
- wait_state_ = state;
-#endif
-}
-
-void StreamListenSocket::UnwatchSocket() {
-#if defined(OS_WIN)
- watcher_.StopWatching();
-#elif defined(OS_POSIX)
- watcher_.StopWatchingFileDescriptor();
-#endif
-}
-
-// TODO(ibrar): We can add these functions into OS dependent files.
-#if defined(OS_WIN)
-// MessageLoop watcher callback.
-void StreamListenSocket::OnObjectSignaled(HANDLE object) {
- WSANETWORKEVENTS ev;
- if (kSocketError == WSAEnumNetworkEvents(socket_, socket_event_, &ev)) {
- // TODO
- return;
- }
-
- // The object was reset by WSAEnumNetworkEvents. Watch for the next signal.
- watcher_.StartWatching(object, this);
-
- if (ev.lNetworkEvents == 0) {
- // Occasionally the event is set even though there is no new data.
- // The net seems to think that this is ignorable.
- return;
- }
- if (ev.lNetworkEvents & FD_ACCEPT) {
- Accept();
- }
- if (ev.lNetworkEvents & FD_READ) {
- if (reads_paused_) {
- has_pending_reads_ = true;
- } else {
- Read();
- }
- }
- if (ev.lNetworkEvents & FD_CLOSE) {
- Close();
- }
-}
-#elif defined(OS_POSIX)
-void StreamListenSocket::OnFileCanReadWithoutBlocking(int fd) {
- switch (wait_state_) {
- case WAITING_ACCEPT:
- Accept();
- break;
- case WAITING_READ:
- if (reads_paused_) {
- has_pending_reads_ = true;
- } else {
- Read();
- }
- break;
- default:
- // Close() is called by Read() in the Linux case.
- NOTREACHED();
- break;
- }
-}
-
-void StreamListenSocket::OnFileCanWriteWithoutBlocking(int fd) {
- // MessagePumpLibevent callback, we don't listen for write events
- // so we shouldn't ever reach here.
- NOTREACHED();
-}
-
-#endif
-
-void StreamListenSocket::PauseReads() {
- DCHECK(!reads_paused_);
- reads_paused_ = true;
-}
-
-void StreamListenSocket::ResumeReads() {
- DCHECK(reads_paused_);
- reads_paused_ = false;
- if (has_pending_reads_) {
- has_pending_reads_ = false;
- Read();
- }
-}
-
-} // namespace net
« no previous file with comments | « net/base/stream_listen_socket.h ('k') | net/base/tcp_listen_socket.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698