// Copyright 2014 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 "mojo/services/network/net_adapters.h" #include "net/base/net_errors.h" namespace mojo { namespace { const uint32_t kMaxBufSize = 64 * 1024; } // namespace NetToMojoPendingBuffer::NetToMojoPendingBuffer( ScopedDataPipeProducerHandle handle, void* buffer) : handle_(handle.Pass()), buffer_(buffer) { } NetToMojoPendingBuffer::~NetToMojoPendingBuffer() { if (handle_.is_valid()) EndWriteDataRaw(handle_.get(), 0); } // static MojoResult NetToMojoPendingBuffer::BeginWrite( ScopedDataPipeProducerHandle* handle, scoped_refptr* pending, uint32_t* num_bytes) { void* buf; *num_bytes = 0; MojoResult result = BeginWriteDataRaw(handle->get(), &buf, num_bytes, MOJO_WRITE_DATA_FLAG_NONE); if (result == MOJO_RESULT_OK) { if (*num_bytes > kMaxBufSize) *num_bytes = kMaxBufSize; *pending = new NetToMojoPendingBuffer(handle->Pass(), buf); } return result; } ScopedDataPipeProducerHandle NetToMojoPendingBuffer::Complete( uint32_t num_bytes) { EndWriteDataRaw(handle_.get(), num_bytes); buffer_ = NULL; return handle_.Pass(); } // ----------------------------------------------------------------------------- NetToMojoIOBuffer::NetToMojoIOBuffer( NetToMojoPendingBuffer* pending_buffer) : net::WrappedIOBuffer(pending_buffer->buffer()), pending_buffer_(pending_buffer) { } NetToMojoIOBuffer::~NetToMojoIOBuffer() { } // ----------------------------------------------------------------------------- MojoToNetPendingBuffer::MojoToNetPendingBuffer( ScopedDataPipeConsumerHandle handle, const void* buffer) : handle_(handle.Pass()), buffer_(buffer) { } MojoToNetPendingBuffer::~MojoToNetPendingBuffer() { } // static MojoResult MojoToNetPendingBuffer::BeginRead( ScopedDataPipeConsumerHandle* handle, scoped_refptr* pending, uint32_t* num_bytes) { const void* buffer = NULL; *num_bytes = 0; MojoResult result = BeginReadDataRaw(handle->get(), &buffer, num_bytes, MOJO_READ_DATA_FLAG_NONE); if (result == MOJO_RESULT_OK) *pending = new MojoToNetPendingBuffer(handle->Pass(), buffer); return result; } ScopedDataPipeConsumerHandle MojoToNetPendingBuffer::Complete( uint32_t num_bytes) { EndReadDataRaw(handle_.get(), num_bytes); buffer_ = NULL; return handle_.Pass(); } // ----------------------------------------------------------------------------- MojoToNetIOBuffer::MojoToNetIOBuffer(MojoToNetPendingBuffer* pending_buffer) : net::WrappedIOBuffer(pending_buffer->buffer()), pending_buffer_(pending_buffer) { } MojoToNetIOBuffer::~MojoToNetIOBuffer() { } // ----------------------------------------------------------------------------- NetworkErrorPtr MakeNetworkError(int error_code) { NetworkErrorPtr error = NetworkError::New(); error->code = error_code; if (error_code <= 0) error->description = net::ErrorToString(error_code); return error.Pass(); } } // namespace mojo