MessageEncoder.cpp [plain text]
#include "config.h"
#include "MessageEncoder.h"
#include "ArgumentCoders.h"
#include "DataReference.h"
#include "MessageFlags.h"
#include "MessageRecorder.h"
#include "StringReference.h"
namespace IPC {
static const uint8_t defaultMessageFlags = 0;
#if HAVE(DTRACE)
MessageEncoder::MessageEncoder(StringReference messageReceiverName, StringReference messageName, uint64_t destinationID, const uuid_t& UUID)
: m_messageReceiverName(messageReceiverName)
, m_messageName(messageName)
, m_destinationID(destinationID)
{
uuid_copy(m_UUID, UUID);
encodeHeader();
}
#endif
MessageEncoder::MessageEncoder(StringReference messageReceiverName, StringReference messageName, uint64_t destinationID)
: m_messageReceiverName(messageReceiverName)
, m_messageName(messageName)
, m_destinationID(destinationID)
{
#if HAVE(DTRACE)
uuid_generate(m_UUID);
#endif
encodeHeader();
}
MessageEncoder::~MessageEncoder()
{
}
void MessageEncoder::encodeHeader()
{
ASSERT(!m_messageReceiverName.isEmpty());
*this << defaultMessageFlags;
*this << m_messageReceiverName;
*this << m_messageName;
*this << m_destinationID;
#if HAVE(DTRACE)
*this << m_UUID;
#endif
}
bool MessageEncoder::isSyncMessage() const
{
return *buffer() & SyncMessage;
}
bool MessageEncoder::shouldDispatchMessageWhenWaitingForSyncReply() const
{
return *buffer() & DispatchMessageWhenWaitingForSyncReply;
}
void MessageEncoder::setIsSyncMessage(bool isSyncMessage)
{
if (isSyncMessage)
*buffer() |= SyncMessage;
else
*buffer() &= ~SyncMessage;
}
void MessageEncoder::setShouldDispatchMessageWhenWaitingForSyncReply(bool shouldDispatchMessageWhenWaitingForSyncReply)
{
if (shouldDispatchMessageWhenWaitingForSyncReply)
*buffer() |= DispatchMessageWhenWaitingForSyncReply;
else
*buffer() &= ~DispatchMessageWhenWaitingForSyncReply;
}
void MessageEncoder::setFullySynchronousModeForTesting()
{
*buffer() |= UseFullySynchronousModeForTesting;
}
void MessageEncoder::wrapForTesting(std::unique_ptr<MessageEncoder> original)
{
ASSERT(isSyncMessage());
ASSERT(!original->isSyncMessage());
original->setShouldDispatchMessageWhenWaitingForSyncReply(true);
encodeVariableLengthByteArray(DataReference(original->buffer(), original->bufferSize()));
Vector<Attachment> attachments = original->releaseAttachments();
reserve(attachments.size());
for (Attachment& attachment : attachments)
addAttachment(WTFMove(attachment));
}
}