// 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_BINDINGS_LIB_MESSAGE_H_
#define MOJO_PUBLIC_BINDINGS_LIB_MESSAGE_H_
#include <vector>
#include "mojo/public/system/core_cpp.h"
namespace mojo {
#pragma pack(push, 1)
struct MessageHeader {
uint32_t num_bytes;
uint32_t name;
};
MOJO_COMPILE_ASSERT(sizeof(MessageHeader) == 8, bad_sizeof_MessageHeader);
struct MessageData {
MessageHeader header;
uint8_t payload[1];
};
MOJO_COMPILE_ASSERT(sizeof(MessageData) == 9, bad_sizeof_MessageData);
#pragma pack(pop)
// Message is a holder for the data and handles to be sent over a MessagePipe.
// Message owns its data and handles, but a consumer of Message is free to
// manipulate the data and handles members.
class Message {
public:
Message();
~Message();
void Swap(Message* other);
MessageData* data; // Heap-allocated using malloc.
// TODO(davemoore): Turn these into ScopedHandles and fix bindings generation.
std::vector<Handle> handles;
private:
MOJO_DISALLOW_COPY_AND_ASSIGN(Message);
};
class MessageReceiver {
public:
// The receiver may mutate the given message or take ownership of its
// |message->data| member by setting it to NULL. Returns true if the message
// was accepted and false otherwise, indicating that the message was invalid
// or malformed.
virtual bool Accept(Message* message) = 0;
};
} // namespace mojo
#endif // MOJO_PUBLIC_BINDINGS_LIB_MESSAGE_H_