blob: 6c19297c6de52c7474c38cbc1da9844d90a3135a [file] [log] [blame]
// Copyright 2015 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/edk/system/data_pipe_impl.h"
#include <algorithm>
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "mojo/edk/system/configuration.h"
#include "mojo/edk/system/message_in_transit.h"
#include "mojo/edk/system/message_in_transit_queue.h"
namespace mojo {
namespace system {
void DataPipeImpl::ConvertDataToMessages(const char* buffer,
size_t* start_index,
size_t* current_num_bytes,
MessageInTransitQueue* message_queue) {
// The maximum amount of data to send per message (make it a multiple of the
// element size.
size_t max_message_num_bytes = GetConfiguration().max_message_num_bytes;
max_message_num_bytes -= max_message_num_bytes % element_num_bytes();
DCHECK_GT(max_message_num_bytes, 0u);
while (*current_num_bytes > 0) {
size_t current_contiguous_num_bytes =
(*start_index + *current_num_bytes > capacity_num_bytes())
? (capacity_num_bytes() - *start_index)
: *current_num_bytes;
size_t message_num_bytes =
std::min(max_message_num_bytes, current_contiguous_num_bytes);
// Note: |message_num_bytes| fits in a |uint32_t| since the capacity does.
scoped_ptr<MessageInTransit> message(new MessageInTransit(
MessageInTransit::Type::ENDPOINT_CLIENT,
MessageInTransit::Subtype::ENDPOINT_CLIENT_DATA,
static_cast<uint32_t>(message_num_bytes), buffer + *start_index));
message_queue->AddMessage(message.Pass());
DCHECK_LE(message_num_bytes, *current_num_bytes);
*start_index += message_num_bytes;
*start_index %= capacity_num_bytes();
*current_num_bytes -= message_num_bytes;
}
}
} // namespace system
} // namespace mojo