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/chromeos/gdata/gdata_download_observer.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_download_observer.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "chrome/browser/chromeos/gdata/gdata_uploader.h" | 8 #include "chrome/browser/chromeos/gdata/gdata_uploader.h" |
9 #include "chrome/browser/chromeos/gdata/gdata_upload_file_info.h" | 9 #include "chrome/browser/chromeos/gdata/gdata_upload_file_info.h" |
10 #include "chrome/browser/chromeos/gdata/gdata_util.h" | 10 #include "chrome/browser/chromeos/gdata/gdata_util.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
81 GDataDownloadObserver::~GDataDownloadObserver() { | 81 GDataDownloadObserver::~GDataDownloadObserver() { |
82 if (download_manager_) | 82 if (download_manager_) |
83 download_manager_->RemoveObserver(this); | 83 download_manager_->RemoveObserver(this); |
84 | 84 |
85 for (DownloadMap::iterator iter = pending_downloads_.begin(); | 85 for (DownloadMap::iterator iter = pending_downloads_.begin(); |
86 iter != pending_downloads_.end(); ++iter) { | 86 iter != pending_downloads_.end(); ++iter) { |
87 DetachFromDownload(iter->second); | 87 DetachFromDownload(iter->second); |
88 } | 88 } |
89 } | 89 } |
90 | 90 |
91 void GDataDownloadObserver::Initialize(const FilePath& temp_download_path, | 91 void GDataDownloadObserver::Initialize( |
92 GDataUploader* gdata_uploader, | 92 GDataUploader* gdata_uploader, |
93 DownloadManager* download_manager) { | 93 DownloadManager* download_manager, |
94 temp_download_path_ = temp_download_path; | 94 const FilePath& gdata_tmp_download_path) { |
95 gdata_uploader_ = gdata_uploader; | 95 gdata_uploader_ = gdata_uploader; |
Ben Chan
2012/03/28 05:29:36
nit: Seems like |gdata_uploader_| is not expected
achuithb
2012/03/28 09:14:04
Done.
| |
96 download_manager_ = download_manager; | 96 download_manager_ = download_manager; |
97 if (download_manager_) | 97 if (download_manager_) |
98 download_manager_->AddObserver(this); | 98 download_manager_->AddObserver(this); |
99 gdata_tmp_download_path_ = gdata_tmp_download_path; | |
99 } | 100 } |
100 | 101 |
101 // static | 102 // static |
102 void GDataDownloadObserver::SetGDataPath(DownloadItem* download, | 103 void GDataDownloadObserver::SetGDataPath(DownloadItem* download, |
103 const FilePath& path) { | 104 const FilePath& path) { |
104 if (download) | 105 if (download) |
105 download->SetExternalData(&kGDataPathKey, | 106 download->SetExternalData(&kGDataPathKey, |
106 new GDataExternalData(path)); | 107 new GDataExternalData(path)); |
107 } | 108 } |
108 | 109 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
172 DownloadManager* download_manager) { | 173 DownloadManager* download_manager) { |
173 download_manager->RemoveObserver(this); | 174 download_manager->RemoveObserver(this); |
174 download_manager_ = NULL; | 175 download_manager_ = NULL; |
175 } | 176 } |
176 | 177 |
177 void GDataDownloadObserver::ModelChanged(DownloadManager* download_manager) { | 178 void GDataDownloadObserver::ModelChanged(DownloadManager* download_manager) { |
178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 179 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
179 | 180 |
180 DownloadManager::DownloadVector downloads; | 181 DownloadManager::DownloadVector downloads; |
181 // GData downloads are considered temporary downloads. | 182 // GData downloads are considered temporary downloads. |
182 download_manager->GetTemporaryDownloads(temp_download_path_, | 183 download_manager->GetTemporaryDownloads(gdata_tmp_download_path_, |
183 &downloads); | 184 &downloads); |
184 for (size_t i = 0; i < downloads.size(); ++i) { | 185 for (size_t i = 0; i < downloads.size(); ++i) { |
185 // Only accept downloads that have the GData meta data associated with | 186 // Only accept downloads that have the GData meta data associated with |
186 // them. Otherwise we might trip over non-GData downloads being saved to | 187 // them. Otherwise we might trip over non-GData downloads being saved to |
187 // temp_download_path_. | 188 // gdata_tmp_download_path_. |
188 if (IsGDataDownload(downloads[i])) | 189 if (IsGDataDownload(downloads[i])) |
189 OnDownloadUpdated(downloads[i]); | 190 OnDownloadUpdated(downloads[i]); |
190 } | 191 } |
191 } | 192 } |
192 | 193 |
193 void GDataDownloadObserver::OnDownloadUpdated(DownloadItem* download) { | 194 void GDataDownloadObserver::OnDownloadUpdated(DownloadItem* download) { |
194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 195 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
195 | 196 |
196 const DownloadItem::DownloadState state = download->GetState(); | 197 const DownloadItem::DownloadState state = download->GetState(); |
197 switch (state) { | 198 switch (state) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 download->RemoveObserver(this); | 249 download->RemoveObserver(this); |
249 } | 250 } |
250 | 251 |
251 void GDataDownloadObserver::UploadDownloadItem(DownloadItem* download) { | 252 void GDataDownloadObserver::UploadDownloadItem(DownloadItem* download) { |
252 // Update metadata of ongoing upload. | 253 // Update metadata of ongoing upload. |
253 UpdateUpload(download); | 254 UpdateUpload(download); |
254 | 255 |
255 if (!ShouldUpload(download)) | 256 if (!ShouldUpload(download)) |
256 return; | 257 return; |
257 | 258 |
258 UploadFileInfo* upload_file_info = CreateUploadFileInfo(download); | 259 scoped_ptr<UploadFileInfo> upload_file_info = CreateUploadFileInfo(download); |
259 gdata_uploader_->UploadFile(upload_file_info); | 260 const int upload_id = gdata_uploader_->UploadFile(upload_file_info.Pass()); |
260 | 261 |
262 // TODO(achuith): Fix this. | |
261 // We won't know the upload ID until the after the GDataUploader::UploadFile() | 263 // We won't know the upload ID until the after the GDataUploader::UploadFile() |
262 // call. | 264 // call. |
263 download->SetExternalData(&kUploadingKey, | 265 download->SetExternalData(&kUploadingKey, |
264 new UploadingExternalData(gdata_uploader_, upload_file_info->upload_id)); | 266 new UploadingExternalData(gdata_uploader_, upload_id)); |
265 } | 267 } |
266 | 268 |
267 void GDataDownloadObserver::UpdateUpload(DownloadItem* download) { | 269 void GDataDownloadObserver::UpdateUpload(DownloadItem* download) { |
268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 270 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
269 | 271 |
270 UploadingExternalData* external_data = GetUploadingExternalData(download); | 272 UploadingExternalData* upload_data = GetUploadingExternalData(download); |
271 if (!external_data) { | 273 if (!upload_data) { |
272 DVLOG(1) << "No UploadingExternalData for download " << download->GetId(); | 274 DVLOG(1) << "No UploadingExternalData for download " << download->GetId(); |
273 return; | 275 return; |
274 } | 276 } |
275 | 277 |
276 gdata_uploader_->UpdateUpload(external_data->upload_id(), download); | 278 gdata_uploader_->UpdateUpload(upload_data->upload_id(), download); |
277 } | 279 } |
278 | 280 |
279 bool GDataDownloadObserver::ShouldUpload(DownloadItem* download) { | 281 bool GDataDownloadObserver::ShouldUpload(DownloadItem* download) { |
280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 282 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
281 | 283 |
282 // Upload if the item is in pending_downloads_, | 284 // Upload if the item is in pending_downloads_, |
283 // is complete or large enough to stream, and, | 285 // is complete or large enough to stream, and, |
284 // is not already being uploaded. | 286 // is not already being uploaded. |
285 return pending_downloads_.count(download->GetId()) != 0 && | 287 return pending_downloads_.count(download->GetId()) != 0 && |
286 (download->IsComplete() || | 288 (download->IsComplete() || |
287 download->GetReceivedBytes() > kStreamingFileSize) && | 289 download->GetReceivedBytes() > kStreamingFileSize) && |
288 GetUploadingExternalData(download) == NULL; | 290 GetUploadingExternalData(download) == NULL; |
289 } | 291 } |
290 | 292 |
291 UploadFileInfo* GDataDownloadObserver::CreateUploadFileInfo( | 293 scoped_ptr<UploadFileInfo> GDataDownloadObserver::CreateUploadFileInfo( |
292 DownloadItem* download) { | 294 DownloadItem* download) { |
293 UploadFileInfo* upload_file_info = new UploadFileInfo(); | 295 scoped_ptr<UploadFileInfo> upload_file_info(new UploadFileInfo()); |
294 | 296 |
295 // GetFullPath will be a temporary location if we're streaming. | 297 // GetFullPath will be a temporary location if we're streaming. |
296 upload_file_info->file_path = download->GetFullPath(); | 298 upload_file_info->file_path = download->GetFullPath(); |
297 upload_file_info->file_size = download->GetReceivedBytes(); | 299 upload_file_info->file_size = download->GetReceivedBytes(); |
298 | 300 |
299 // Extract the final path from DownloadItem. | 301 // Extract the final path from DownloadItem. |
300 upload_file_info->gdata_path = GetGDataPath(download); | 302 upload_file_info->gdata_path = GetGDataPath(download); |
301 | 303 |
302 // Use the file name as the title. | 304 // Use the file name as the title. |
303 upload_file_info->title = upload_file_info->gdata_path.BaseName().value(); | 305 upload_file_info->title = upload_file_info->gdata_path.BaseName().value(); |
304 upload_file_info->content_type = download->GetMimeType(); | 306 upload_file_info->content_type = download->GetMimeType(); |
305 // GData api handles -1 as unknown file length. | 307 // GData api handles -1 as unknown file length. |
306 upload_file_info->content_length = download->AllDataSaved() ? | 308 upload_file_info->content_length = download->AllDataSaved() ? |
307 download->GetReceivedBytes() : -1; | 309 download->GetReceivedBytes() : -1; |
308 | 310 |
309 upload_file_info->all_bytes_present = download->AllDataSaved(); | 311 upload_file_info->all_bytes_present = download->AllDataSaved(); |
310 | 312 |
311 upload_file_info->completion_callback = | 313 upload_file_info->completion_callback = |
312 base::Bind(&GDataDownloadObserver::OnUploadComplete, | 314 base::Bind(&GDataDownloadObserver::OnUploadComplete, |
313 weak_ptr_factory_.GetWeakPtr(), download->GetId()); | 315 weak_ptr_factory_.GetWeakPtr(), |
316 download->GetId()); | |
314 | 317 |
315 return upload_file_info; | 318 return upload_file_info.Pass(); |
316 } | 319 } |
317 | 320 |
318 void GDataDownloadObserver::OnUploadComplete(int32 download_id, | 321 void GDataDownloadObserver::OnUploadComplete(int32 download_id, |
319 base::PlatformFileError error, | 322 base::PlatformFileError error, |
320 DocumentEntry* unused_entry) { | 323 UploadFileInfo* upload_file_info) { |
321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
322 DownloadMap::iterator iter = pending_downloads_.find(download_id); | 325 DownloadMap::iterator iter = pending_downloads_.find(download_id); |
323 if (iter == pending_downloads_.end()) | 326 if (iter == pending_downloads_.end()) |
324 return; | 327 return; |
325 DVLOG(1) << "Completing upload for download ID " << download_id; | 328 DVLOG(1) << "Completing upload for download ID " << download_id; |
326 DownloadItem* download = iter->second; | 329 DownloadItem* download = iter->second; |
327 UploadingExternalData* upload_data = GetUploadingExternalData(download); | 330 UploadingExternalData* upload_data = GetUploadingExternalData(download); |
328 DCHECK(upload_data); | 331 DCHECK(upload_data); |
329 upload_data->MarkAsComplete(); | 332 upload_data->MarkAsComplete(); |
330 download->MaybeCompleteDownload(); | 333 download->MaybeCompleteDownload(); |
331 } | 334 } |
332 | 335 |
333 } // namespace gdata | 336 } // namespace gdata |
OLD | NEW |