| Index: ipc/ipc_message.cc
|
| diff --git a/ipc/ipc_message.cc b/ipc/ipc_message.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..84db00ce7b67fcc750b89e4a92de270bf8eff3bc
|
| --- /dev/null
|
| +++ b/ipc/ipc_message.cc
|
| @@ -0,0 +1,124 @@
|
| +// Copyright (c) 2006-2008 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.
|
| +
|
| +#include "ipc/ipc_message.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "build/build_config.h"
|
| +
|
| +#if defined(OS_POSIX)
|
| +#include "ipc/file_descriptor_set_posix.h"
|
| +#endif
|
| +
|
| +namespace IPC {
|
| +
|
| +//------------------------------------------------------------------------------
|
| +
|
| +Message::~Message() {
|
| +}
|
| +
|
| +Message::Message()
|
| + : Pickle(sizeof(Header)) {
|
| + header()->routing = header()->type = header()->flags = 0;
|
| +#if defined(OS_POSIX)
|
| + header()->num_fds = 0;
|
| +#endif
|
| + InitLoggingVariables();
|
| +}
|
| +
|
| +Message::Message(int32 routing_id, uint16 type, PriorityValue priority)
|
| + : Pickle(sizeof(Header)) {
|
| + header()->routing = routing_id;
|
| + header()->type = type;
|
| + header()->flags = priority;
|
| +#if defined(OS_POSIX)
|
| + header()->num_fds = 0;
|
| +#endif
|
| + InitLoggingVariables();
|
| +}
|
| +
|
| +Message::Message(const char* data, int data_len) : Pickle(data, data_len) {
|
| + InitLoggingVariables();
|
| +}
|
| +
|
| +Message::Message(const Message& other) : Pickle(other) {
|
| + InitLoggingVariables();
|
| +#if defined(OS_POSIX)
|
| + file_descriptor_set_ = other.file_descriptor_set_;
|
| +#endif
|
| +}
|
| +
|
| +void Message::InitLoggingVariables() {
|
| +#ifdef IPC_MESSAGE_LOG_ENABLED
|
| + received_time_ = 0;
|
| + dont_log_ = false;
|
| + log_data_ = NULL;
|
| +#endif
|
| +}
|
| +
|
| +Message& Message::operator=(const Message& other) {
|
| + *static_cast<Pickle*>(this) = other;
|
| +#if defined(OS_POSIX)
|
| + file_descriptor_set_ = other.file_descriptor_set_;
|
| +#endif
|
| + return *this;
|
| +}
|
| +
|
| +#ifdef IPC_MESSAGE_LOG_ENABLED
|
| +void Message::set_sent_time(int64 time) {
|
| + DCHECK((header()->flags & HAS_SENT_TIME_BIT) == 0);
|
| + header()->flags |= HAS_SENT_TIME_BIT;
|
| + WriteInt64(time);
|
| +}
|
| +
|
| +int64 Message::sent_time() const {
|
| + if ((header()->flags & HAS_SENT_TIME_BIT) == 0)
|
| + return 0;
|
| +
|
| + const char* data = end_of_payload();
|
| + data -= sizeof(int64);
|
| + return *(reinterpret_cast<const int64*>(data));
|
| +}
|
| +
|
| +void Message::set_received_time(int64 time) const {
|
| + received_time_ = time;
|
| +}
|
| +#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(file_descriptor_set()->size());
|
| + if (descriptor.auto_close) {
|
| + return file_descriptor_set()->AddAndAutoClose(descriptor.fd);
|
| + } else {
|
| + return file_descriptor_set()->Add(descriptor.fd);
|
| + }
|
| +}
|
| +
|
| +bool Message::ReadFileDescriptor(void** iter,
|
| + base::FileDescriptor* descriptor) const {
|
| + int descriptor_index;
|
| + if (!ReadInt(iter, &descriptor_index))
|
| + return false;
|
| +
|
| + FileDescriptorSet* file_descriptor_set = file_descriptor_set_.get();
|
| + if (!file_descriptor_set)
|
| + return false;
|
| +
|
| + descriptor->fd = file_descriptor_set->GetDescriptorAt(descriptor_index);
|
| + descriptor->auto_close = true;
|
| +
|
| + return descriptor->fd >= 0;
|
| +}
|
| +
|
| +void Message::EnsureFileDescriptorSet() {
|
| + if (file_descriptor_set_.get() == NULL)
|
| + file_descriptor_set_ = new FileDescriptorSet;
|
| +}
|
| +
|
| +#endif
|
| +
|
| +} // namespace IPC
|
|
|