OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/child/webblobregistry_impl.h" | 5 #include "content/child/webblobregistry_impl.h" |
6 | 6 |
7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
8 #include "base/guid.h" | 8 #include "base/guid.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 } | 157 } |
158 | 158 |
159 void WebBlobRegistryImpl::registerStreamURL( | 159 void WebBlobRegistryImpl::registerStreamURL( |
160 const WebURL& url, const WebURL& src_url) { | 160 const WebURL& url, const WebURL& src_url) { |
161 DCHECK(ChildThread::current()); | 161 DCHECK(ChildThread::current()); |
162 sender_->Send(new StreamHostMsg_Clone(url, src_url)); | 162 sender_->Send(new StreamHostMsg_Clone(url, src_url)); |
163 } | 163 } |
164 | 164 |
165 void WebBlobRegistryImpl::addDataToStream(const WebURL& url, | 165 void WebBlobRegistryImpl::addDataToStream(const WebURL& url, |
166 WebThreadSafeData& data) { | 166 WebThreadSafeData& data) { |
| 167 addDataToStream(url, data.data(), data.size()); |
| 168 } |
| 169 |
| 170 void WebBlobRegistryImpl::addDataToStream(const WebURL& url, |
| 171 const char* data, size_t length) { |
167 DCHECK(ChildThread::current()); | 172 DCHECK(ChildThread::current()); |
168 if (data.size() == 0) | 173 if (length == 0) |
169 return; | 174 return; |
170 if (data.size() < kLargeThresholdBytes) { | 175 if (length < kLargeThresholdBytes) { |
171 storage::BlobData::Item item; | 176 storage::BlobData::Item item; |
172 item.SetToBytes(data.data(), data.size()); | 177 item.SetToBytes(data, length); |
173 sender_->Send(new StreamHostMsg_AppendBlobDataItem(url, item)); | 178 sender_->Send(new StreamHostMsg_AppendBlobDataItem(url, item)); |
174 } else { | 179 } else { |
175 // We handle larger amounts of data via SharedMemory instead of | 180 // We handle larger amounts of data via SharedMemory instead of |
176 // writing it directly to the IPC channel. | 181 // writing it directly to the IPC channel. |
177 size_t shared_memory_size = std::min( | 182 size_t shared_memory_size = std::min( |
178 data.size(), kMaxSharedMemoryBytes); | 183 length, kMaxSharedMemoryBytes); |
179 scoped_ptr<base::SharedMemory> shared_memory( | 184 scoped_ptr<base::SharedMemory> shared_memory( |
180 ChildThread::AllocateSharedMemory(shared_memory_size, | 185 ChildThread::AllocateSharedMemory(shared_memory_size, |
181 sender_.get())); | 186 sender_.get())); |
182 CHECK(shared_memory.get()); | 187 CHECK(shared_memory.get()); |
183 | 188 |
184 size_t data_size = data.size(); | 189 size_t remaining_bytes = length; |
185 const char* data_ptr = data.data(); | 190 const char* current_ptr = data; |
186 while (data_size) { | 191 while (remaining_bytes) { |
187 size_t chunk_size = std::min(data_size, shared_memory_size); | 192 size_t chunk_size = std::min(remaining_bytes, shared_memory_size); |
188 memcpy(shared_memory->memory(), data_ptr, chunk_size); | 193 memcpy(shared_memory->memory(), current_ptr, chunk_size); |
189 sender_->Send(new StreamHostMsg_SyncAppendSharedMemory( | 194 sender_->Send(new StreamHostMsg_SyncAppendSharedMemory( |
190 url, shared_memory->handle(), chunk_size)); | 195 url, shared_memory->handle(), chunk_size)); |
191 data_size -= chunk_size; | 196 remaining_bytes -= chunk_size; |
192 data_ptr += chunk_size; | 197 current_ptr += chunk_size; |
193 } | 198 } |
194 } | 199 } |
195 } | 200 } |
196 | 201 |
197 void WebBlobRegistryImpl::finalizeStream(const WebURL& url) { | 202 void WebBlobRegistryImpl::finalizeStream(const WebURL& url) { |
198 DCHECK(ChildThread::current()); | 203 DCHECK(ChildThread::current()); |
199 sender_->Send(new StreamHostMsg_FinishBuilding(url)); | 204 sender_->Send(new StreamHostMsg_FinishBuilding(url)); |
200 } | 205 } |
201 | 206 |
202 void WebBlobRegistryImpl::abortStream(const WebURL& url) { | 207 void WebBlobRegistryImpl::abortStream(const WebURL& url) { |
203 DCHECK(ChildThread::current()); | 208 DCHECK(ChildThread::current()); |
204 sender_->Send(new StreamHostMsg_AbortBuilding(url)); | 209 sender_->Send(new StreamHostMsg_AbortBuilding(url)); |
205 } | 210 } |
206 | 211 |
207 void WebBlobRegistryImpl::unregisterStreamURL(const WebURL& url) { | 212 void WebBlobRegistryImpl::unregisterStreamURL(const WebURL& url) { |
208 DCHECK(ChildThread::current()); | 213 DCHECK(ChildThread::current()); |
209 sender_->Send(new StreamHostMsg_Remove(url)); | 214 sender_->Send(new StreamHostMsg_Remove(url)); |
210 } | 215 } |
211 | 216 |
212 } // namespace content | 217 } // namespace content |
OLD | NEW |