OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_framer.h" | 5 #include "extensions/browser/api/cast_channel/cast_framer.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 return bytes_left; | 106 return bytes_left; |
107 default: | 107 default: |
108 NOTREACHED() << "Unhandled packet element type."; | 108 NOTREACHED() << "Unhandled packet element type."; |
109 return 0; | 109 return 0; |
110 } | 110 } |
111 } | 111 } |
112 | 112 |
113 scoped_ptr<CastMessage> MessageFramer::Ingest(size_t num_bytes, | 113 scoped_ptr<CastMessage> MessageFramer::Ingest(size_t num_bytes, |
114 size_t* message_length, | 114 size_t* message_length, |
115 ChannelError* error) { | 115 ChannelError* error) { |
116 LOG(ERROR) << "Ingest1"; | |
117 DCHECK(error); | 116 DCHECK(error); |
118 DCHECK(message_length); | 117 DCHECK(message_length); |
119 if (error_) { | 118 if (error_) { |
120 *error = CHANNEL_ERROR_INVALID_MESSAGE; | 119 *error = CHANNEL_ERROR_INVALID_MESSAGE; |
121 return scoped_ptr<CastMessage>(); | 120 return scoped_ptr<CastMessage>(); |
122 } | 121 } |
123 | 122 |
124 DCHECK_EQ(base::checked_cast<int32>(message_bytes_received_), | 123 DCHECK_EQ(base::checked_cast<int32>(message_bytes_received_), |
125 input_buffer_->offset()); | 124 input_buffer_->offset()); |
126 CHECK_LE(num_bytes, BytesRequested()); | 125 CHECK_LE(num_bytes, BytesRequested()); |
127 message_bytes_received_ += num_bytes; | 126 message_bytes_received_ += num_bytes; |
128 *error = CHANNEL_ERROR_NONE; | 127 *error = CHANNEL_ERROR_NONE; |
129 *message_length = 0; | 128 *message_length = 0; |
130 LOG(ERROR) << "Ingest2"; | |
131 switch (current_element_) { | 129 switch (current_element_) { |
132 case HEADER: | 130 case HEADER: |
133 LOG(ERROR) << "IngestHeader"; | |
134 if (BytesRequested() == 0) { | 131 if (BytesRequested() == 0) { |
135 MessageHeader header; | 132 MessageHeader header; |
136 MessageHeader::Deserialize(input_buffer_.get()->StartOfBuffer(), | 133 MessageHeader::Deserialize(input_buffer_.get()->StartOfBuffer(), |
137 &header); | 134 &header); |
138 if (header.message_size > MessageHeader::max_message_size()) { | 135 if (header.message_size > MessageHeader::max_message_size()) { |
139 VLOG(1) << "Error parsing header (message size too large)."; | 136 VLOG(1) << "Error parsing header (message size too large)."; |
140 *error = CHANNEL_ERROR_INVALID_MESSAGE; | 137 *error = CHANNEL_ERROR_INVALID_MESSAGE; |
141 error_ = true; | 138 error_ = true; |
142 return scoped_ptr<CastMessage>(); | 139 return scoped_ptr<CastMessage>(); |
143 } | 140 } |
144 current_element_ = BODY; | 141 current_element_ = BODY; |
145 body_size_ = header.message_size; | 142 body_size_ = header.message_size; |
146 } | 143 } |
147 break; | 144 break; |
148 case BODY: | 145 case BODY: |
149 LOG(ERROR) << "IngestBody"; | |
150 if (BytesRequested() == 0) { | 146 if (BytesRequested() == 0) { |
151 LOG(ERROR) << "IngestBodyBytesRequestedIsZero"; | |
152 scoped_ptr<CastMessage> parsed_message(new CastMessage); | 147 scoped_ptr<CastMessage> parsed_message(new CastMessage); |
153 if (!parsed_message->ParseFromArray( | 148 if (!parsed_message->ParseFromArray( |
154 input_buffer_->StartOfBuffer() + MessageHeader::header_size(), | 149 input_buffer_->StartOfBuffer() + MessageHeader::header_size(), |
155 body_size_)) { | 150 body_size_)) { |
156 LOG(ERROR) << "Couldn't parse packet body"; | |
157 VLOG(1) << "Error parsing packet body."; | 151 VLOG(1) << "Error parsing packet body."; |
158 *error = CHANNEL_ERROR_INVALID_MESSAGE; | 152 *error = CHANNEL_ERROR_INVALID_MESSAGE; |
159 error_ = true; | 153 error_ = true; |
160 return scoped_ptr<CastMessage>(); | 154 return scoped_ptr<CastMessage>(); |
161 } | 155 } |
162 *message_length = body_size_; | 156 *message_length = body_size_; |
163 Reset(); | 157 Reset(); |
164 LOG(ERROR) << "Returning message"; | |
165 return parsed_message.Pass(); | 158 return parsed_message.Pass(); |
166 } | 159 } |
167 break; | 160 break; |
168 default: | 161 default: |
169 NOTREACHED() << "Unhandled packet element type."; | 162 NOTREACHED() << "Unhandled packet element type."; |
170 return scoped_ptr<CastMessage>(); | 163 return scoped_ptr<CastMessage>(); |
171 } | 164 } |
172 | 165 |
173 input_buffer_->set_offset(message_bytes_received_); | 166 input_buffer_->set_offset(message_bytes_received_); |
174 return scoped_ptr<CastMessage>(); | 167 return scoped_ptr<CastMessage>(); |
175 } | 168 } |
176 | 169 |
177 void MessageFramer::Reset() { | 170 void MessageFramer::Reset() { |
178 current_element_ = HEADER; | 171 current_element_ = HEADER; |
179 message_bytes_received_ = 0; | 172 message_bytes_received_ = 0; |
180 body_size_ = 0; | 173 body_size_ = 0; |
181 input_buffer_->set_offset(0); | 174 input_buffer_->set_offset(0); |
182 } | 175 } |
183 | 176 |
184 } // namespace cast_channel | 177 } // namespace cast_channel |
185 } // namespace core_api | 178 } // namespace core_api |
186 } // namespace extensions | 179 } // namespace extensions |
OLD | NEW |