| 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 "chrome/browser/extensions/api/usb/usb_device_resource.h" | 5 #include "chrome/browser/extensions/api/usb/usb_device_resource.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 template<class T> | 87 template<class T> |
| 88 static bool GetTransferSize(const T& input, size_t* output) { | 88 static bool GetTransferSize(const T& input, size_t* output) { |
| 89 if (input.direction == kDirectionIn) { | 89 if (input.direction == kDirectionIn) { |
| 90 const int* length = input.length.get(); | 90 const int* length = input.length.get(); |
| 91 if (length) { | 91 if (length) { |
| 92 *output = *length; | 92 *output = *length; |
| 93 return true; | 93 return true; |
| 94 } | 94 } |
| 95 } else if (input.direction == kDirectionOut) { | 95 } else if (input.direction == kDirectionOut) { |
| 96 if (input.data.get()) { | 96 if (input.data.get()) { |
| 97 *output = input.data->size(); | 97 *output = input.data->GetSize(); |
| 98 return true; | 98 return true; |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 return false; | 101 return false; |
| 102 } | 102 } |
| 103 | 103 |
| 104 template<class T> | 104 template<class T> |
| 105 static scoped_refptr<net::IOBuffer> CreateBufferForTransfer(const T& input) { | 105 static scoped_refptr<net::IOBuffer> CreateBufferForTransfer(const T& input) { |
| 106 size_t size = 0; | 106 size_t size = 0; |
| 107 if (!GetTransferSize(input, &size)) { | 107 if (!GetTransferSize(input, &size)) { |
| 108 return NULL; | 108 return NULL; |
| 109 } | 109 } |
| 110 | 110 |
| 111 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size); | 111 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size); |
| 112 if (!input.data.get()) { | 112 if (!input.data.get()) { |
| 113 return buffer; | 113 return buffer; |
| 114 } | 114 } |
| 115 | 115 |
| 116 const vector<int>& input_buffer = *input.data.get(); | 116 memcpy(buffer->data(), input.data->GetBuffer(), size); |
| 117 for (size_t i = 0; i < size; ++i) { | |
| 118 buffer->data()[i] = input_buffer[i]; | |
| 119 } | |
| 120 | 117 |
| 121 return buffer; | 118 return buffer; |
| 122 } | 119 } |
| 123 | 120 |
| 124 } // namespace | 121 } // namespace |
| 125 | 122 |
| 126 namespace extensions { | 123 namespace extensions { |
| 127 | 124 |
| 128 UsbDeviceResource::UsbDeviceResource(APIResourceEventNotifier* notifier, | 125 UsbDeviceResource::UsbDeviceResource(APIResourceEventNotifier* notifier, |
| 129 UsbDevice* device) | 126 UsbDevice* device) |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 device_->IsochronousTransfer(direction, generic_transfer.endpoint, buffer, | 199 device_->IsochronousTransfer(direction, generic_transfer.endpoint, buffer, |
| 203 size, transfer.packets, transfer.packet_length, 0, base::Bind( | 200 size, transfer.packets, transfer.packet_length, 0, base::Bind( |
| 204 &UsbDeviceResource::TransferComplete, base::Unretained(this), buffer, | 201 &UsbDeviceResource::TransferComplete, base::Unretained(this), buffer, |
| 205 size)); | 202 size)); |
| 206 } | 203 } |
| 207 | 204 |
| 208 void UsbDeviceResource::TransferComplete(net::IOBuffer* buffer, | 205 void UsbDeviceResource::TransferComplete(net::IOBuffer* buffer, |
| 209 const size_t length, | 206 const size_t length, |
| 210 int success) { | 207 int success) { |
| 211 if (buffer) { | 208 if (buffer) { |
| 212 base::ListValue *const response_buffer = new base::ListValue(); | 209 base::BinaryValue* const response_buffer = |
| 213 for (size_t i = 0; i < length; ++i) { | 210 base::BinaryValue::CreateWithCopiedBuffer(buffer->data(), length); |
| 214 const uint8_t value = buffer->data()[i] & 0xFF; | |
| 215 response_buffer->Append(base::Value::CreateIntegerValue(value)); | |
| 216 } | |
| 217 event_notifier()->OnTransferComplete(success, response_buffer); | 211 event_notifier()->OnTransferComplete(success, response_buffer); |
| 218 } | 212 } |
| 219 } | 213 } |
| 220 | 214 |
| 221 } // namespace extensions | 215 } // namespace extensions |
| OLD | NEW |