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/extensions/file_manager/event_router.h" | 5 #include "chrome/browser/chromeos/extensions/file_manager/event_router.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/prefs/pref_change_registrar.h" | 10 #include "base/prefs/pref_change_registrar.h" |
11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/thread_task_runner_handle.h" |
13 #include "base/threading/sequenced_worker_pool.h" | 14 #include "base/threading/sequenced_worker_pool.h" |
14 #include "base/values.h" | 15 #include "base/values.h" |
15 #include "chrome/browser/app_mode/app_mode_utils.h" | 16 #include "chrome/browser/app_mode/app_mode_utils.h" |
16 #include "chrome/browser/chrome_notification_types.h" | 17 #include "chrome/browser/chrome_notification_types.h" |
17 #include "chrome/browser/chromeos/drive/drive_integration_service.h" | 18 #include "chrome/browser/chromeos/drive/drive_integration_service.h" |
18 #include "chrome/browser/chromeos/drive/file_change.h" | 19 #include "chrome/browser/chromeos/drive/file_change.h" |
19 #include "chrome/browser/chromeos/drive/file_system_interface.h" | 20 #include "chrome/browser/chromeos/drive/file_system_interface.h" |
20 #include "chrome/browser/chromeos/drive/file_system_util.h" | 21 #include "chrome/browser/chromeos/drive/file_system_util.h" |
21 #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" | 22 #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" |
22 #include "chrome/browser/chromeos/file_manager/app_id.h" | 23 #include "chrome/browser/chromeos/file_manager/app_id.h" |
(...skipping 29 matching lines...) Expand all Loading... |
52 using drive::DriveIntegrationService; | 53 using drive::DriveIntegrationService; |
53 using drive::DriveIntegrationServiceFactory; | 54 using drive::DriveIntegrationServiceFactory; |
54 using file_manager::util::EntryDefinition; | 55 using file_manager::util::EntryDefinition; |
55 using file_manager::util::FileDefinition; | 56 using file_manager::util::FileDefinition; |
56 | 57 |
57 namespace file_browser_private = extensions::api::file_browser_private; | 58 namespace file_browser_private = extensions::api::file_browser_private; |
58 | 59 |
59 namespace file_manager { | 60 namespace file_manager { |
60 namespace { | 61 namespace { |
61 // Constants for the "transferState" field of onFileTransferUpdated event. | 62 // Constants for the "transferState" field of onFileTransferUpdated event. |
| 63 const char kFileTransferStateAdded[] = "added"; |
62 const char kFileTransferStateStarted[] = "started"; | 64 const char kFileTransferStateStarted[] = "started"; |
63 const char kFileTransferStateInProgress[] = "in_progress"; | 65 const char kFileTransferStateInProgress[] = "in_progress"; |
64 const char kFileTransferStateCompleted[] = "completed"; | 66 const char kFileTransferStateCompleted[] = "completed"; |
65 const char kFileTransferStateFailed[] = "failed"; | 67 const char kFileTransferStateFailed[] = "failed"; |
66 | 68 |
67 // Frequency of sending onFileTransferUpdated. | 69 // Frequency of sending onFileTransferUpdated. |
68 const int64 kProgressEventFrequencyInMilliseconds = 1000; | 70 const int64 kProgressEventFrequencyInMilliseconds = 1000; |
69 | 71 |
70 // Maximim size of detailed change info on directory change event. If the size | 72 // Maximim size of detailed change info on directory change event. If the size |
71 // exceeds the maximum size, the detailed info is omitted and the force refresh | 73 // exceeds the maximum size, the detailed info is omitted and the force refresh |
(...skipping 17 matching lines...) Expand all Loading... |
89 | 91 |
90 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue); | 92 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue); |
91 GURL url = util::ConvertDrivePathToFileSystemUrl( | 93 GURL url = util::ConvertDrivePathToFileSystemUrl( |
92 profile, job_info.file_path, extension_id); | 94 profile, job_info.file_path, extension_id); |
93 status->file_url = url.spec(); | 95 status->file_url = url.spec(); |
94 status->transfer_state = file_browser_private::ParseTransferState(job_status); | 96 status->transfer_state = file_browser_private::ParseTransferState(job_status); |
95 status->transfer_type = | 97 status->transfer_type = |
96 IsUploadJob(job_info.job_type) ? | 98 IsUploadJob(job_info.job_type) ? |
97 file_browser_private::TRANSFER_TYPE_UPLOAD : | 99 file_browser_private::TRANSFER_TYPE_UPLOAD : |
98 file_browser_private::TRANSFER_TYPE_DOWNLOAD; | 100 file_browser_private::TRANSFER_TYPE_DOWNLOAD; |
| 101 status->num_total_jobs.reset( |
| 102 new double(static_cast<double>(job_info.num_total_jobs))); |
99 // JavaScript does not have 64-bit integers. Instead we use double, which | 103 // JavaScript does not have 64-bit integers. Instead we use double, which |
100 // is in IEEE 754 formant and accurate up to 52-bits in JS, and in practice | 104 // is in IEEE 754 formant and accurate up to 52-bits in JS, and in practice |
101 // in C++. Larger values are rounded. | 105 // in C++. Larger values are rounded. |
102 status->processed.reset( | 106 status->processed.reset( |
103 new double(static_cast<double>(job_info.num_completed_bytes))); | 107 new double(static_cast<double>(job_info.num_completed_bytes))); |
104 status->total.reset( | 108 status->total.reset( |
105 new double(static_cast<double>(job_info.num_total_bytes))); | 109 new double(static_cast<double>(job_info.num_total_bytes))); |
106 } | 110 } |
107 | 111 |
108 // Checks if the Recovery Tool is running. This is a temporary solution. | 112 // Checks if the Recovery Tool is running. This is a temporary solution. |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 EventRouter::DriveJobInfoWithStatus::DriveJobInfoWithStatus() | 337 EventRouter::DriveJobInfoWithStatus::DriveJobInfoWithStatus() |
334 : job_info(drive::TYPE_DOWNLOAD_FILE) { | 338 : job_info(drive::TYPE_DOWNLOAD_FILE) { |
335 } | 339 } |
336 | 340 |
337 EventRouter::DriveJobInfoWithStatus::DriveJobInfoWithStatus( | 341 EventRouter::DriveJobInfoWithStatus::DriveJobInfoWithStatus( |
338 const drive::JobInfo& info, const std::string& status) | 342 const drive::JobInfo& info, const std::string& status) |
339 : job_info(info), status(status) { | 343 : job_info(info), status(status) { |
340 } | 344 } |
341 | 345 |
342 EventRouter::EventRouter(Profile* profile) | 346 EventRouter::EventRouter(Profile* profile) |
343 : pref_change_registrar_(new PrefChangeRegistrar), | 347 : startup_time_delta_(base::TimeDelta::FromSeconds(1)), |
| 348 pref_change_registrar_(new PrefChangeRegistrar), |
344 profile_(profile), | 349 profile_(profile), |
345 multi_user_window_manager_observer_registered_(false), | 350 multi_user_window_manager_observer_registered_(false), |
346 weak_factory_(this) { | 351 weak_factory_(this) { |
347 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 352 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
348 } | 353 } |
349 | 354 |
350 EventRouter::~EventRouter() { | 355 EventRouter::~EventRouter() { |
351 } | 356 } |
352 | 357 |
353 void EventRouter::Shutdown() { | 358 void EventRouter::Shutdown() { |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 } | 577 } |
573 | 578 |
574 BroadcastEvent( | 579 BroadcastEvent( |
575 profile_, | 580 profile_, |
576 file_browser_private::OnPreferencesChanged::kEventName, | 581 file_browser_private::OnPreferencesChanged::kEventName, |
577 file_browser_private::OnPreferencesChanged::Create()); | 582 file_browser_private::OnPreferencesChanged::Create()); |
578 } | 583 } |
579 | 584 |
580 void EventRouter::OnJobAdded(const drive::JobInfo& job_info) { | 585 void EventRouter::OnJobAdded(const drive::JobInfo& job_info) { |
581 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 586 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
582 OnJobUpdated(job_info); | 587 if (!drive::IsActiveFileTransferJobInfo(job_info)) |
| 588 return; |
| 589 DriveJobInfoWithStatus job_info_with_status = |
| 590 DriveJobInfoWithStatus(job_info, kFileTransferStateAdded); |
| 591 SendDriveFileTransferEventDelay( |
| 592 job_info_with_status, base::Time::Now(), false /* is_delayed */); |
583 } | 593 } |
584 | 594 |
585 void EventRouter::OnJobUpdated(const drive::JobInfo& job_info) { | 595 void EventRouter::OnJobUpdated(const drive::JobInfo& job_info) { |
586 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 596 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
587 if (!drive::IsActiveFileTransferJobInfo(job_info)) | 597 if (!drive::IsActiveFileTransferJobInfo(job_info)) |
588 return; | 598 return; |
589 | 599 |
590 bool is_new_job = (drive_jobs_.find(job_info.job_id) == drive_jobs_.end()); | 600 bool is_new_job = (drive_jobs_.find(job_info.job_id) == drive_jobs_.end()); |
591 | 601 |
592 // Replace with the latest job info. | 602 // Replace with the latest job info. |
(...skipping 19 matching lines...) Expand all Loading... |
612 : kFileTransferStateFailed); | 622 : kFileTransferStateFailed); |
613 | 623 |
614 // Fire event if needed. | 624 // Fire event if needed. |
615 bool always = true; | 625 bool always = true; |
616 SendDriveFileTransferEvent(always); | 626 SendDriveFileTransferEvent(always); |
617 | 627 |
618 // Forget about the job. | 628 // Forget about the job. |
619 drive_jobs_.erase(job_info.job_id); | 629 drive_jobs_.erase(job_info.job_id); |
620 } | 630 } |
621 | 631 |
| 632 void EventRouter::SendDriveFileTransferEventDelay( |
| 633 const DriveJobInfoWithStatus& job_info_with_status, |
| 634 base::Time call_time, |
| 635 bool is_delayed) { |
| 636 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 637 DCHECK_EQ(job_info_with_status.job_info.state, drive::STATE_NEW); |
| 638 |
| 639 if (!is_delayed) { |
| 640 last_post_delayed_task_ = base::Time::Now(); |
| 641 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 642 FROM_HERE, |
| 643 base::Bind(&EventRouter::SendDriveFileTransferEventDelay, |
| 644 weak_factory_.GetWeakPtr(), |
| 645 job_info_with_status, |
| 646 last_post_delayed_task_, |
| 647 true /* is_delayed */), |
| 648 startup_time_delta_); |
| 649 return; |
| 650 } |
| 651 |
| 652 DCHECK(!last_post_delayed_task_.is_null()); |
| 653 |
| 654 if (call_time < last_post_delayed_task_) { |
| 655 return; |
| 656 } |
| 657 |
| 658 // Convert the current |drive_jobs_| to IDL type. |
| 659 std::vector<linked_ptr<file_browser_private::FileTransferStatus> > |
| 660 status_list; |
| 661 |
| 662 linked_ptr<file_browser_private::FileTransferStatus> status( |
| 663 new file_browser_private::FileTransferStatus()); |
| 664 JobInfoToTransferStatus(profile_, |
| 665 kFileManagerAppId, |
| 666 job_info_with_status.status, |
| 667 job_info_with_status.job_info, |
| 668 status.get()); |
| 669 status_list.push_back(status); |
| 670 |
| 671 BroadcastEvent( |
| 672 profile_, |
| 673 file_browser_private::OnFileTransfersUpdated::kEventName, |
| 674 file_browser_private::OnFileTransfersUpdated::Create(status_list)); |
| 675 } |
| 676 |
622 void EventRouter::SendDriveFileTransferEvent(bool always) { | 677 void EventRouter::SendDriveFileTransferEvent(bool always) { |
623 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 678 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
624 | 679 |
625 // When |always| flag is not set, we don't send the event until certain | 680 // When |always| flag is not set, we don't send the event until certain |
626 // amount of time passes after the previous one. This is to avoid | 681 // amount of time passes after the previous one. This is to avoid |
627 // flooding the IPC between extensions by many onFileTransferUpdated events. | 682 // flooding the IPC between extensions by many onFileTransferUpdated events. |
628 if (!ShouldSendProgressEvent(always, &last_file_transfer_event_)) | 683 if (!ShouldSendProgressEvent(always, &last_file_transfer_event_)) |
629 return; | 684 return; |
630 | 685 |
631 // Convert the current |drive_jobs_| to IDL type. | 686 // Convert the current |drive_jobs_| to IDL type. |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 } | 1032 } |
978 } | 1033 } |
979 | 1034 |
980 void EventRouter::OnOwnerEntryChanged(aura::Window* window) { | 1035 void EventRouter::OnOwnerEntryChanged(aura::Window* window) { |
981 BroadcastEvent(profile_, | 1036 BroadcastEvent(profile_, |
982 file_browser_private::OnDesktopChanged::kEventName, | 1037 file_browser_private::OnDesktopChanged::kEventName, |
983 file_browser_private::OnDesktopChanged::Create()); | 1038 file_browser_private::OnDesktopChanged::Create()); |
984 } | 1039 } |
985 | 1040 |
986 } // namespace file_manager | 1041 } // namespace file_manager |
OLD | NEW |