fune/ipc/glue/ProtocolMessageUtils.h
Nika Layzell 96d76af151 Bug 1779792 - Part 5: Add a unique nsID field to each MessageChannel pair, r=ipc-reviewers,mccr8
This won't be used for any security or routing purposes, but can be useful for
debugging. It will be used in the future by the profiler to correlate sent and
received message events across processes.

Differential Revision: https://phabricator.services.mozilla.com/D153621
2022-08-10 14:55:23 +00:00

129 lines
3.7 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
#ifndef IPC_GLUE_PROTOCOLMESSAGEUTILS_H
#define IPC_GLUE_PROTOCOLMESSAGEUTILS_H
#include <stdint.h>
#include <string>
#include "base/string_util.h"
#include "chrome/common/ipc_channel.h"
#include "chrome/common/ipc_message_utils.h"
#include "ipc/EnumSerializer.h"
#include "mozilla/Assertions.h"
#include "mozilla/ipc/Endpoint.h"
#include "mozilla/ipc/ProtocolUtils.h"
class PickleIterator;
namespace mozilla::ipc {
class FileDescriptor;
template <class PFooSide>
class Endpoint;
template <class PFooSide>
class ManagedEndpoint;
template <typename P>
struct IPDLParamTraits;
} // namespace mozilla::ipc
namespace IPC {
class Message;
class MessageReader;
class MessageWriter;
template <>
struct ParamTraits<Channel::Mode>
: ContiguousEnumSerializerInclusive<Channel::Mode, Channel::MODE_SERVER,
Channel::MODE_CLIENT> {};
template <>
struct ParamTraits<IPCMessageStart>
: ContiguousEnumSerializer<IPCMessageStart, IPCMessageStart(0),
LastMsgIndex> {};
template <>
struct ParamTraits<mozilla::ipc::ActorHandle> {
typedef mozilla::ipc::ActorHandle paramType;
static void Write(MessageWriter* aWriter, const paramType& aParam) {
IPC::WriteParam(aWriter, aParam.mId);
}
static bool Read(MessageReader* aReader, paramType* aResult) {
int id;
if (IPC::ReadParam(aReader, &id)) {
aResult->mId = id;
return true;
}
return false;
}
static void Log(const paramType& aParam, std::wstring* aLog) {
aLog->append(StringPrintf(L"(%d)", aParam.mId));
}
};
template <>
struct ParamTraits<mozilla::ipc::UntypedEndpoint> {
using paramType = mozilla::ipc::UntypedEndpoint;
static void Write(MessageWriter* aWriter, paramType&& aParam);
static bool Read(MessageReader* aReader, paramType* aResult);
static void Log(const paramType& aParam, std::wstring* aLog) {
aLog->append(StringPrintf(L"Endpoint"));
}
};
template <class PFooSide>
struct ParamTraits<mozilla::ipc::Endpoint<PFooSide>>
: ParamTraits<mozilla::ipc::UntypedEndpoint> {};
} // namespace IPC
namespace mozilla::ipc {
template <>
struct IPDLParamTraits<UntypedManagedEndpoint> {
using paramType = UntypedManagedEndpoint;
static void Write(IPC::MessageWriter* aWriter, IProtocol* aActor,
paramType&& aParam);
static bool Read(IPC::MessageReader* aReader, IProtocol* aActor,
paramType* aResult);
};
template <class PFooSide>
struct IPDLParamTraits<ManagedEndpoint<PFooSide>> {
using paramType = ManagedEndpoint<PFooSide>;
static void Write(IPC::MessageWriter* aWriter, IProtocol* aActor,
paramType&& aParam) {
IPDLParamTraits<UntypedManagedEndpoint>::Write(aWriter, aActor,
std::move(aParam));
}
static bool Read(IPC::MessageReader* aReader, IProtocol* aActor,
paramType* aResult) {
return IPDLParamTraits<UntypedManagedEndpoint>::Read(aReader, aActor,
aResult);
}
};
template <>
struct IPDLParamTraits<FileDescriptor> {
typedef FileDescriptor paramType;
static void Write(IPC::MessageWriter* aWriter, IProtocol* aActor,
const paramType& aParam);
static bool Read(IPC::MessageReader* aReader, IProtocol* aActor,
paramType* aResult);
};
} // namespace mozilla::ipc
#endif // IPC_GLUE_PROTOCOLMESSAGEUTILS_H