ipc/chromium/src/chrome/common/ipc_sync_message.cc

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/ipc/chromium/src/chrome/common/ipc_sync_message.cc	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,125 @@
     1.4 +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
     1.5 +// Use of this source code is governed by a BSD-style license that can be
     1.6 +// found in the LICENSE file.
     1.7 +
     1.8 +#include "build/build_config.h"
     1.9 +
    1.10 +#if defined(OS_WIN)
    1.11 +#include <windows.h>
    1.12 +#endif
    1.13 +#include <stack>
    1.14 +
    1.15 +#include "base/logging.h"
    1.16 +#include "base/waitable_event.h"
    1.17 +#include "chrome/common/ipc_sync_message.h"
    1.18 +
    1.19 +namespace IPC {
    1.20 +
    1.21 +uint32_t SyncMessage::next_id_ = 0;
    1.22 +#define kSyncMessageHeaderSize 4
    1.23 +
    1.24 +SyncMessage::SyncMessage(
    1.25 +    int32_t routing_id,
    1.26 +    uint16_t type,
    1.27 +    PriorityValue priority,
    1.28 +    MessageReplyDeserializer* deserializer)
    1.29 +    : Message(routing_id, type, priority),
    1.30 +      deserializer_(deserializer),
    1.31 +      pump_messages_event_(NULL)
    1.32 +      {
    1.33 +  set_sync();
    1.34 +  set_unblock(true);
    1.35 +
    1.36 +  // Add synchronous message data before the message payload.
    1.37 +  SyncHeader header;
    1.38 +  header.message_id = ++next_id_;
    1.39 +  WriteSyncHeader(this, header);
    1.40 +}
    1.41 +
    1.42 +MessageReplyDeserializer* SyncMessage::GetReplyDeserializer() {
    1.43 +  MessageReplyDeserializer* rv = deserializer_;
    1.44 +  DCHECK(rv);
    1.45 +  deserializer_ = NULL;
    1.46 +  return rv;
    1.47 +}
    1.48 +
    1.49 +void SyncMessage::EnableMessagePumping() {
    1.50 +  static base::WaitableEvent* dummy_event = new base::WaitableEvent(true, true);
    1.51 +  DCHECK(!pump_messages_event_);
    1.52 +  set_pump_messages_event(dummy_event);
    1.53 +}
    1.54 +
    1.55 +bool SyncMessage::IsMessageReplyTo(const Message& msg, int request_id) {
    1.56 +  if (!msg.is_reply())
    1.57 +    return false;
    1.58 +
    1.59 +  return GetMessageId(msg) == request_id;
    1.60 +}
    1.61 +
    1.62 +void* SyncMessage::GetDataIterator(const Message* msg) {
    1.63 +  void* iter = const_cast<char*>(msg->payload());
    1.64 +  UpdateIter(&iter, kSyncMessageHeaderSize);
    1.65 +  return iter;
    1.66 +}
    1.67 +
    1.68 +int SyncMessage::GetMessageId(const Message& msg) {
    1.69 +  if (!msg.is_sync() && !msg.is_reply())
    1.70 +    return 0;
    1.71 +
    1.72 +  SyncHeader header;
    1.73 +  if (!ReadSyncHeader(msg, &header))
    1.74 +    return 0;
    1.75 +
    1.76 +  return header.message_id;
    1.77 +}
    1.78 +
    1.79 +Message* SyncMessage::GenerateReply(const Message* msg) {
    1.80 +  DCHECK(msg->is_sync());
    1.81 +
    1.82 +  Message* reply = new Message(msg->routing_id(), IPC_REPLY_ID,
    1.83 +                               msg->priority());
    1.84 +  reply->set_reply();
    1.85 +
    1.86 +  SyncHeader header;
    1.87 +
    1.88 +  // use the same message id, but this time reply bit is set
    1.89 +  header.message_id = GetMessageId(*msg);
    1.90 +  WriteSyncHeader(reply, header);
    1.91 +
    1.92 +  return reply;
    1.93 +}
    1.94 +
    1.95 +bool SyncMessage::ReadSyncHeader(const Message& msg, SyncHeader* header) {
    1.96 +  DCHECK(msg.is_sync() || msg.is_reply());
    1.97 +
    1.98 +  void* iter = NULL;
    1.99 +  bool result = msg.ReadInt(&iter, &header->message_id);
   1.100 +  if (!result) {
   1.101 +    NOTREACHED();
   1.102 +    return false;
   1.103 +  }
   1.104 +
   1.105 +  return true;
   1.106 +}
   1.107 +
   1.108 +bool SyncMessage::WriteSyncHeader(Message* msg, const SyncHeader& header) {
   1.109 +  DCHECK(msg->is_sync() || msg->is_reply());
   1.110 +  DCHECK(msg->payload_size() == 0);
   1.111 +  bool result = msg->WriteInt(header.message_id);
   1.112 +  if (!result) {
   1.113 +    NOTREACHED();
   1.114 +    return false;
   1.115 +  }
   1.116 +
   1.117 +  // Note: if you add anything here, you need to update kSyncMessageHeaderSize.
   1.118 +  DCHECK(kSyncMessageHeaderSize == msg->payload_size());
   1.119 +
   1.120 +  return true;
   1.121 +}
   1.122 +
   1.123 +
   1.124 +bool MessageReplyDeserializer::SerializeOutputParameters(const Message& msg) {
   1.125 +  return SerializeOutputParameters(msg, SyncMessage::GetDataIterator(&msg));
   1.126 +}
   1.127 +
   1.128 +}  // namespace IPC

mercurial