1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file_path.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/string_util.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/stringprintf.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "mojo/public/cpp/bindings/lib/message_builder.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "mojo/public/cpp/bindings/lib/message_internal.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "mojo/public/cpp/bindings/message.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// This file is used to generate various files corresponding to mojo
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// messages. The various binding implementations can parse these to verify they
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// correctly decode messages.
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch//
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The output consists of each byte of the message encoded in a hex string with
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// a newline after it.
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace mojo {
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string BinaryToHex(const base::StringPiece& piece) {
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string result("// File generated by mojo_message_generator.\n");;
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  result.reserve(result.size() + (piece.size() * 5));
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < piece.size(); ++i)
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::StringAppendF(&result, "0X%.2X\n", static_cast<int>(piece.data()[i]));
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return result;
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WriteMessageToFile(const Message& message, const base::FilePath& path) {
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const std::string hex_message(BinaryToHex(
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base::StringPiece(reinterpret_cast<const char*>(message.data()),
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        message.data_num_bytes())));
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CHECK_EQ(static_cast<int>(hex_message.size()),
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           base::WriteFile(path, hex_message.data(),
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           static_cast<int>(hex_message.size())));
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Generates a message of type MessageData. The message uses the name 21,
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// with 4 bytes of payload: 0x9, 0x8, 0x7, 0x6.
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid GenerateMessageDataMessage() {
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  internal::MessageBuilder builder(static_cast<uint32_t>(21),
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                   static_cast<size_t>(4));
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  char* data = static_cast<char*>(builder.buffer()->Allocate(4));
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(data);
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  data[0] = 9;
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  data[1] = 8;
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  data[2] = 7;
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  data[3] = 6;
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Message message;
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  builder.Finish(&message);
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WriteMessageToFile(message,
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     base::FilePath(FILE_PATH_LITERAL("message_data")));
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace mojo
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint main(int argc, char** argv) {
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  mojo::GenerateMessageDataMessage();
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return 0;
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
64