MessageDecoder.cpp [plain text]
#include "config.h"
#include "MessageDecoder.h"
#include "ArgumentCoders.h"
#include "DataReference.h"
#include "MessageFlags.h"
#include "StringReference.h"
#if PLATFORM(MAC)
#include "ImportanceAssertion.h"
#endif
namespace IPC {
MessageDecoder::~MessageDecoder()
{
#if HAVE(QOS_CLASSES)
if (m_qosClassOverride)
pthread_override_qos_class_end_np(m_qosClassOverride);
#endif
}
MessageDecoder::MessageDecoder(const DataReference& buffer, Vector<Attachment> attachments)
: ArgumentDecoder(buffer.data(), buffer.size(), WTFMove(attachments))
{
if (!decode(m_messageFlags))
return;
if (!decode(m_messageReceiverName))
return;
if (!decode(m_messageName))
return;
if (!decode(m_destinationID))
return;
#if HAVE(DTRACE)
decode(m_UUID);
#endif
}
bool MessageDecoder::isSyncMessage() const
{
return m_messageFlags & SyncMessage;
}
bool MessageDecoder::shouldDispatchMessageWhenWaitingForSyncReply() const
{
return m_messageFlags & DispatchMessageWhenWaitingForSyncReply;
}
bool MessageDecoder::shouldUseFullySynchronousModeForTesting() const
{
return m_messageFlags & UseFullySynchronousModeForTesting;
}
#if PLATFORM(MAC)
void MessageDecoder::setImportanceAssertion(std::unique_ptr<ImportanceAssertion> assertion)
{
m_importanceAssertion = WTFMove(assertion);
}
#endif
std::unique_ptr<MessageDecoder> MessageDecoder::unwrapForTesting(MessageDecoder& decoder)
{
ASSERT(decoder.isSyncMessage());
Vector<Attachment> attachments;
Attachment attachment;
while (decoder.removeAttachment(attachment))
attachments.append(WTFMove(attachment));
attachments.reverse();
DataReference wrappedMessage;
if (!decoder.decode(wrappedMessage))
return nullptr;
return std::make_unique<MessageDecoder>(wrappedMessage, WTFMove(attachments));
}
}