91 lines
2.5 KiB
C++
91 lines
2.5 KiB
C++
// Copyright 2015 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 IPC_BROKERABLE_ATTACHMENT_H_
|
|
#define IPC_BROKERABLE_ATTACHMENT_H_
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include <algorithm>
|
|
|
|
#include "base/macros.h"
|
|
#include "build/build_config.h"
|
|
#include "ipc/ipc_export.h"
|
|
#include "ipc/ipc_message_attachment.h"
|
|
|
|
namespace IPC {
|
|
|
|
// This subclass of MessageAttachment requires an AttachmentBroker to be
|
|
// attached to a Chrome IPC message.
|
|
class IPC_EXPORT BrokerableAttachment : public MessageAttachment {
|
|
public:
|
|
static const size_t kNonceSize = 16;
|
|
// An id uniquely identifies an attachment sent via a broker.
|
|
struct IPC_EXPORT AttachmentId {
|
|
uint8_t nonce[kNonceSize];
|
|
|
|
// Generates an AttachmentId with an unguessable, random nonce.
|
|
static AttachmentId CreateIdWithRandomNonce();
|
|
|
|
// Creates an AttachmentId with a zeroed nonce. This should only be used by
|
|
// the IPC translation system, which requires that classes have a default
|
|
// constructor.
|
|
AttachmentId();
|
|
|
|
// Constructs an AttachmentId from a buffer.
|
|
AttachmentId(const char* start_address, size_t size);
|
|
|
|
// Writes the nonce into a buffer.
|
|
void SerializeToBuffer(char* start_address, size_t size);
|
|
|
|
bool operator==(const AttachmentId& rhs) const {
|
|
return std::equal(nonce, nonce + kNonceSize, rhs.nonce);
|
|
}
|
|
|
|
bool operator<(const AttachmentId& rhs) const {
|
|
return std::lexicographical_compare(nonce, nonce + kNonceSize, rhs.nonce,
|
|
rhs.nonce + kNonceSize);
|
|
}
|
|
};
|
|
|
|
enum BrokerableType {
|
|
PLACEHOLDER,
|
|
WIN_HANDLE,
|
|
MACH_PORT,
|
|
};
|
|
|
|
// The identifier is unique across all Chrome processes.
|
|
AttachmentId GetIdentifier() const;
|
|
|
|
// Whether the attachment still needs information from the broker before it
|
|
// can be used.
|
|
bool NeedsBrokering() const;
|
|
|
|
// Returns TYPE_BROKERABLE_ATTACHMENT
|
|
Type GetType() const override;
|
|
|
|
virtual BrokerableType GetBrokerableType() const = 0;
|
|
|
|
// MessageAttachment override.
|
|
#if defined(OS_POSIX)
|
|
base::PlatformFile TakePlatformFile() override;
|
|
#endif // OS_POSIX
|
|
|
|
protected:
|
|
BrokerableAttachment();
|
|
BrokerableAttachment(const AttachmentId& id);
|
|
~BrokerableAttachment() override;
|
|
|
|
private:
|
|
// This member uniquely identifies a BrokerableAttachment across all Chrome
|
|
// processes.
|
|
const AttachmentId id_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(BrokerableAttachment);
|
|
};
|
|
|
|
} // namespace IPC
|
|
|
|
#endif // IPC_BROKERABLE_ATTACHMENT_H_
|