| Index: chrome/common/ipc_message.cc
|
| diff --git a/chrome/common/ipc_message.cc b/chrome/common/ipc_message.cc
|
| index 848f8bc00d097b02e51c99222ae88dfc87d20649..9a15f1c653795ab02829fbb688e9cd6d834bed3b 100644
|
| --- a/chrome/common/ipc_message.cc
|
| +++ b/chrome/common/ipc_message.cc
|
| @@ -7,6 +7,10 @@
|
| #include "base/logging.h"
|
| #include "build/build_config.h"
|
|
|
| +#if defined(OS_POSIX)
|
| +#include "chrome/common/descriptor_set_posix.h"
|
| +#endif
|
| +
|
| namespace IPC {
|
|
|
| //------------------------------------------------------------------------------
|
| @@ -41,7 +45,7 @@ Message::Message(const char* data, int data_len) : Pickle(data, data_len) {
|
| Message::Message(const Message& other) : Pickle(other) {
|
| InitLoggingVariables();
|
| #if defined(OS_POSIX)
|
| - descriptor_set_.TakeFrom(&other.descriptor_set_);
|
| + descriptor_set_ = other.descriptor_set_;
|
| #endif
|
| }
|
|
|
| @@ -56,7 +60,7 @@ void Message::InitLoggingVariables() {
|
| Message& Message::operator=(const Message& other) {
|
| *static_cast<Pickle*>(this) = other;
|
| #if defined(OS_POSIX)
|
| - descriptor_set_.TakeFrom(&other.descriptor_set_);
|
| + descriptor_set_ = other.descriptor_set_;
|
| #endif
|
| return *this;
|
| }
|
| @@ -82,5 +86,40 @@ void Message::set_received_time(int64 time) const {
|
| }
|
| #endif
|
|
|
| +#if defined(OS_POSIX)
|
| +bool Message::WriteFileDescriptor(const base::FileDescriptor& descriptor) {
|
| + // We write the index of the descriptor so that we don't have to
|
| + // keep the current descriptor as extra decoding state when deserialising.
|
| + WriteInt(descriptor_set()->size());
|
| + if (descriptor.auto_close) {
|
| + return descriptor_set()->AddAndAutoClose(descriptor.fd);
|
| + } else {
|
| + return descriptor_set()->Add(descriptor.fd);
|
| + }
|
| +}
|
| +
|
| +bool Message::ReadFileDescriptor(void** iter,
|
| + base::FileDescriptor* descriptor) const {
|
| + int descriptor_index;
|
| + if (!ReadInt(iter, &descriptor_index))
|
| + return false;
|
| +
|
| + DescriptorSet* descriptor_set = descriptor_set_.get();
|
| + if (!descriptor_set)
|
| + return false;
|
| +
|
| + descriptor->fd = descriptor_set->GetDescriptorAt(descriptor_index);
|
| + descriptor->auto_close = false;
|
| +
|
| + return descriptor->fd >= 0;
|
| +}
|
| +
|
| +void Message::EnsureDescriptorSet() {
|
| + if (descriptor_set_.get() == NULL)
|
| + descriptor_set_ = new DescriptorSet;
|
| +}
|
| +
|
| +#endif
|
| +
|
| } // namespace IPC
|
|
|
|
|