| 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 |