diff options
Diffstat (limited to 'chrome/common/ipc_message.cc')
-rw-r--r-- | chrome/common/ipc_message.cc | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/chrome/common/ipc_message.cc b/chrome/common/ipc_message.cc index 848f8bc..9a15f1c 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 |