97 lines
3.1 KiB
C++
97 lines
3.1 KiB
C++
// Copyright 2018 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/public/cpp/bindings/message_dumper.h"
|
|
|
|
#include "base/files/file.h"
|
|
#include "base/files/file_path.h"
|
|
#include "base/files/file_util.h"
|
|
#include "base/logging.h"
|
|
#include "base/no_destructor.h"
|
|
#include "base/process/process.h"
|
|
#include "base/rand_util.h"
|
|
#include "base/strings/string_number_conversions.h"
|
|
#include "base/task_scheduler/post_task.h"
|
|
#include "mojo/public/cpp/bindings/message.h"
|
|
|
|
namespace {
|
|
|
|
base::FilePath& DumpDirectory() {
|
|
static base::NoDestructor<base::FilePath> dump_directory;
|
|
return *dump_directory;
|
|
}
|
|
|
|
// void WriteMessage(uint32_t identifier,
|
|
// const mojo::MessageDumper::MessageEntry& entry) {
|
|
// static uint64_t num = 0;
|
|
|
|
// if (!entry.interface_name)
|
|
// return;
|
|
|
|
// base::FilePath message_directory =
|
|
// DumpDirectory()
|
|
// .AppendASCII(entry.interface_name)
|
|
// .AppendASCII(base::NumberToString(identifier));
|
|
|
|
// if (!base::DirectoryExists(message_directory) &&
|
|
// !base::CreateDirectory(message_directory)) {
|
|
// LOG(ERROR) << "Failed to create" << message_directory.value();
|
|
// return;
|
|
// }
|
|
|
|
// std::string filename =
|
|
// base::NumberToString(num++) + "." + entry.method_name + ".mojomsg";
|
|
// base::FilePath path = message_directory.AppendASCII(filename);
|
|
// base::File file(path,
|
|
// base::File::FLAG_WRITE | base::File::FLAG_CREATE_ALWAYS);
|
|
|
|
// file.WriteAtCurrentPos(reinterpret_cast<const char*>(entry.data_bytes.data()),
|
|
// static_cast<int>(entry.data_bytes.size()));
|
|
// }
|
|
|
|
} // namespace
|
|
|
|
namespace mojo {
|
|
|
|
MessageDumper::MessageEntry::MessageEntry(const uint8_t* data,
|
|
uint32_t data_size,
|
|
const char* interface_name,
|
|
const char* method_name)
|
|
: interface_name(interface_name),
|
|
method_name(method_name),
|
|
data_bytes(data, data + data_size) {}
|
|
|
|
MessageDumper::MessageEntry::MessageEntry(const MessageEntry& entry) = default;
|
|
|
|
MessageDumper::MessageEntry::~MessageEntry() {}
|
|
|
|
MessageDumper::MessageDumper() : identifier_(base::RandUint64()) {}
|
|
|
|
MessageDumper::~MessageDumper() {}
|
|
|
|
bool MessageDumper::Accept(mojo::Message* message) {
|
|
// MessageEntry entry(message->data(), message->data_num_bytes(),
|
|
// "unknown interface", "unknown name");
|
|
|
|
// static base::NoDestructor<scoped_refptr<base::TaskRunner>> task_runner(
|
|
// base::CreateSequencedTaskRunnerWithTraits(
|
|
// {base::MayBlock(), base::TaskPriority::USER_BLOCKING,
|
|
// base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}));
|
|
|
|
// (*task_runner)
|
|
// ->PostTask(FROM_HERE,
|
|
// base::BindOnce(&WriteMessage, identifier_, std::move(entry)));
|
|
return true;
|
|
}
|
|
|
|
void MessageDumper::SetMessageDumpDirectory(const base::FilePath& directory) {
|
|
DumpDirectory() = directory;
|
|
}
|
|
|
|
const base::FilePath& MessageDumper::GetMessageDumpDirectory() {
|
|
return DumpDirectory();
|
|
}
|
|
|
|
} // namespace mojo
|