| Index: services/flog/flog_logger_impl.cc
|
| diff --git a/services/flog/flog_logger_impl.cc b/services/flog/flog_logger_impl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6941e0dc9c6752689176efd29d757c6cf1113326
|
| --- /dev/null
|
| +++ b/services/flog/flog_logger_impl.cc
|
| @@ -0,0 +1,74 @@
|
| +// Copyright 2016 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 "base/logging.h"
|
| +#include "services/flog/flog_logger_impl.h"
|
| +
|
| +namespace mojo {
|
| +namespace flog {
|
| +
|
| +// static
|
| +std::shared_ptr<FlogLoggerImpl> FlogLoggerImpl::Create(
|
| + InterfaceRequest<FlogLogger> request,
|
| + uint32_t log_id,
|
| + const std::string& label,
|
| + std::shared_ptr<FlogDirectory> directory,
|
| + FlogServiceImpl* owner) {
|
| + return std::shared_ptr<FlogLoggerImpl>(
|
| + new FlogLoggerImpl(request.Pass(), log_id, label, directory, owner));
|
| +}
|
| +
|
| +FlogLoggerImpl::FlogLoggerImpl(InterfaceRequest<FlogLogger> request,
|
| + uint32_t log_id,
|
| + const std::string& label,
|
| + std::shared_ptr<FlogDirectory> directory,
|
| + FlogServiceImpl* owner)
|
| + : FlogServiceImpl::ProductBase(owner),
|
| + file_(directory->GetFile(log_id, label, true)) {
|
| + mojo::internal::MessageValidatorList validators;
|
| + router_.reset(new mojo::internal::Router(
|
| + request.PassMessagePipe(), std::move(validators),
|
| + Environment::GetDefaultAsyncWaiter()));
|
| + router_->set_incoming_receiver(this);
|
| + router_->set_connection_error_handler([this]() { ReleaseFromOwner(); });
|
| +}
|
| +
|
| +FlogLoggerImpl::~FlogLoggerImpl() {}
|
| +
|
| +bool FlogLoggerImpl::Accept(Message* message) {
|
| + DCHECK(message != nullptr);
|
| + DCHECK(message->data_num_bytes() > 0);
|
| + DCHECK(message->data() != nullptr);
|
| +
|
| + uint32_t message_size = message->data_num_bytes();
|
| +
|
| + WriteData(sizeof(message_size), &message_size);
|
| + WriteData(message_size, message->data());
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool FlogLoggerImpl::AcceptWithResponder(Message* message,
|
| + MessageReceiverWithStatus* responder) {
|
| + DCHECK(false) << "FlogLogger has no methods with responses";
|
| + abort();
|
| +}
|
| +
|
| +void FlogLoggerImpl::WriteData(uint32_t data_size, const void* data) {
|
| + DCHECK(data_size > 0);
|
| + DCHECK(data != nullptr);
|
| + DCHECK(file_);
|
| +
|
| + Array<uint8_t> bytes_to_write = Array<uint8_t>::New(data_size);
|
| + memcpy(bytes_to_write.data(), data, data_size);
|
| + file_->Write(bytes_to_write.Pass(), 0, files::Whence::FROM_CURRENT,
|
| + [data_size](files::Error error, uint32 bytes_written) {
|
| + DCHECK(error == files::Error::OK);
|
| + DCHECK(bytes_written == data_size);
|
| + // TODO(dalesat): Handle error.
|
| + });
|
| +}
|
| +
|
| +} // namespace flog
|
| +} // namespace mojo
|
|
|