OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ipc/ipc_channel_reader.h" | 5 #include "ipc/ipc_channel_reader.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ipc/ipc_listener.h" | 9 #include "ipc/ipc_listener.h" |
10 #include "ipc/ipc_logging.h" | 10 #include "ipc/ipc_logging.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 LOG(ERROR) << "IPC message is too big"; | 78 LOG(ERROR) << "IPC message is too big"; |
79 return false; | 79 return false; |
80 } | 80 } |
81 input_overflow_buf_.append(input_data, input_data_len); | 81 input_overflow_buf_.append(input_data, input_data_len); |
82 p = input_overflow_buf_.data(); | 82 p = input_overflow_buf_.data(); |
83 end = p + input_overflow_buf_.size(); | 83 end = p + input_overflow_buf_.size(); |
84 } | 84 } |
85 | 85 |
86 // Dispatch all complete messages in the data buffer. | 86 // Dispatch all complete messages in the data buffer. |
87 while (p < end) { | 87 while (p < end) { |
88 const char* message_tail = Message::FindNext(p, end); | 88 Message::NextMessageInfo info; |
89 if (message_tail) { | 89 Message::FindNext(p, end, &info); |
90 int len = static_cast<int>(message_tail - p); | 90 if (info.message_found) { |
| 91 int pickle_len = static_cast<int>(info.pickle_end - p); |
| 92 Message translated_message(p, pickle_len); |
91 | 93 |
92 Message translated_message(p, len); | 94 // TODO(erikchen): Make attachments for info.attachment_ids. |
| 95 // http://crbug.com/493414. |
| 96 |
93 if (!GetNonBrokeredAttachments(&translated_message)) | 97 if (!GetNonBrokeredAttachments(&translated_message)) |
94 return false; | 98 return false; |
95 | 99 |
96 // If there are no queued messages, attempt to immediately dispatch the | 100 // If there are no queued messages, attempt to immediately dispatch the |
97 // newly translated message. | 101 // newly translated message. |
98 if (queued_messages_.empty()) { | 102 if (queued_messages_.empty()) { |
99 DCHECK(blocked_ids_.empty()); | 103 DCHECK(blocked_ids_.empty()); |
100 AttachmentIdSet blocked_ids = | 104 AttachmentIdSet blocked_ids = |
101 GetBrokeredAttachments(&translated_message); | 105 GetBrokeredAttachments(&translated_message); |
102 | 106 |
103 if (blocked_ids.empty()) { | 107 if (blocked_ids.empty()) { |
104 // Dispatch the message and continue the loop. | 108 // Dispatch the message and continue the loop. |
105 DispatchMessage(&translated_message); | 109 DispatchMessage(&translated_message); |
106 p = message_tail; | 110 p = info.message_end; |
107 continue; | 111 continue; |
108 } | 112 } |
109 | 113 |
110 blocked_ids_.swap(blocked_ids); | 114 blocked_ids_.swap(blocked_ids); |
111 StartObservingAttachmentBroker(); | 115 StartObservingAttachmentBroker(); |
112 } | 116 } |
113 | 117 |
114 // Make a deep copy of |translated_message| to add to the queue. | 118 // Make a deep copy of |translated_message| to add to the queue. |
115 scoped_ptr<Message> m(new Message(translated_message)); | 119 scoped_ptr<Message> m(new Message(translated_message)); |
116 queued_messages_.push_back(m.release()); | 120 queued_messages_.push_back(m.release()); |
117 p = message_tail; | 121 p = info.message_end; |
118 } else { | 122 } else { |
119 // Last message is partial. | 123 // Last message is partial. |
120 break; | 124 break; |
121 } | 125 } |
122 } | 126 } |
123 | 127 |
124 // Save any partial data in the overflow buffer. | 128 // Save any partial data in the overflow buffer. |
125 input_overflow_buf_.assign(p, end - p); | 129 input_overflow_buf_.assign(p, end - p); |
126 | 130 |
127 if (input_overflow_buf_.empty() && !DidEmptyInputBuffers()) | 131 if (input_overflow_buf_.empty() && !DidEmptyInputBuffers()) |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 } | 237 } |
234 | 238 |
235 void ChannelReader::StopObservingAttachmentBroker() { | 239 void ChannelReader::StopObservingAttachmentBroker() { |
236 #if USE_ATTACHMENT_BROKER | 240 #if USE_ATTACHMENT_BROKER |
237 GetAttachmentBroker()->RemoveObserver(this); | 241 GetAttachmentBroker()->RemoveObserver(this); |
238 #endif // USE_ATTACHMENT_BROKER | 242 #endif // USE_ATTACHMENT_BROKER |
239 } | 243 } |
240 | 244 |
241 } // namespace internal | 245 } // namespace internal |
242 } // namespace IPC | 246 } // namespace IPC |
OLD | NEW |