// Copyright 2013 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.

#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_

#include <stdint.h>

#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
#include "mojo/public/cpp/bindings/lib/message_internal.h"

namespace mojo {
class Message;

namespace internal {

class MessageBuilder {
 public:
  MessageBuilder(uint32_t name, size_t payload_size);
  ~MessageBuilder();

  Buffer* buffer() { return &buf_; }

  // Call Finish when done making allocations in |buffer()|. Upon return,
  // |message| will contain the message data, and |buffer()| will no longer be
  // valid to reference.
  void Finish(Message* message);

 protected:
  explicit MessageBuilder(size_t size);
  FixedBuffer buf_;

  MOJO_DISALLOW_COPY_AND_ASSIGN(MessageBuilder);
};

class MessageWithRequestIDBuilder : public MessageBuilder {
 public:
  MessageWithRequestIDBuilder(uint32_t name, size_t payload_size,
                              uint32_t flags, uint64_t request_id);
};

class RequestMessageBuilder : public MessageWithRequestIDBuilder {
 public:
  RequestMessageBuilder(uint32_t name, size_t payload_size)
      : MessageWithRequestIDBuilder(name, payload_size, kMessageExpectsResponse,
                                    0) {
  }
};

class ResponseMessageBuilder : public MessageWithRequestIDBuilder {
 public:
  ResponseMessageBuilder(uint32_t name, size_t payload_size,
                         uint64_t request_id)
      : MessageWithRequestIDBuilder(name, payload_size, kMessageIsResponse,
                                    request_id) {
  }
};

}  // namespace internal
}  // namespace mojo

#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
