Chromium Code Reviews| Index: chrome/browser/chromeos/extensions/file_browser_event_router.cc |
| diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc |
| index c3479feb361e067385b3f48596832237c6bd1297..8fe5d352e040fec8e6177452c9c4192bbe291416 100644 |
| --- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc |
| +++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc |
| @@ -87,7 +87,8 @@ FileBrowserEventRouter::FileBrowserEventRouter( |
| Profile* profile) |
| : delegate_(new FileBrowserEventRouter::FileWatcherDelegate(this)), |
| notifications_(new FileBrowserNotifications(profile)), |
| - profile_(profile) { |
| + profile_(profile), |
| + num_remote_update_requests_(0) { |
| } |
| FileBrowserEventRouter::~FileBrowserEventRouter() { |
| @@ -150,6 +151,10 @@ bool FileBrowserEventRouter::AddFileWatch( |
| if (gdata::util::GetSpecialRemoteRootPath().IsParent(watch_path)) { |
| watch_path = gdata::util::ExtractGDataPath(watch_path); |
| is_remote_watch = true; |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&FileBrowserEventRouter::HandleRemoteUpdateRequestOnUIThread, |
| + this, true)); |
| } |
| WatcherMap::iterator iter = file_watchers_.find(watch_path); |
| @@ -179,6 +184,10 @@ void FileBrowserEventRouter::RemoveFileWatch( |
| // their change notifications. |
| if (gdata::util::GetSpecialRemoteRootPath().IsParent(watch_path)) { |
| watch_path = gdata::util::ExtractGDataPath(watch_path); |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&FileBrowserEventRouter::HandleRemoteUpdateRequestOnUIThread, |
|
zel
2012/05/03 21:21:10
why are you routing this to another thread? this f
|
| + this, false)); |
| } |
| WatcherMap::iterator iter = file_watchers_.find(watch_path); |
| if (iter == file_watchers_.end()) |
| @@ -191,6 +200,25 @@ void FileBrowserEventRouter::RemoveFileWatch( |
| } |
| } |
| +void FileBrowserEventRouter::HandleRemoteUpdateRequestOnUIThread(bool start) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + gdata::GDataFileSystem* file_system = GetRemoteFileSystem(); |
| + DCHECK(file_system); |
| + |
| + if (start) { |
| + file_system->CheckForUpdates(); |
| + if (num_remote_update_requests_ == 0) |
| + file_system->StartUpdates(); |
| + ++num_remote_update_requests_; |
| + } else { |
| + DCHECK_LE(0, num_remote_update_requests_); |
| + --num_remote_update_requests_; |
| + if (num_remote_update_requests_ == 0) |
| + file_system->StopUpdates(); |
| + } |
| +} |
| + |
| void FileBrowserEventRouter::DiskChanged( |
| DiskMountManagerEventType event, |
| const DiskMountManager::Disk* disk) { |
| @@ -255,10 +283,7 @@ void FileBrowserEventRouter::MountCompleted( |
| if ((event_type == DiskMountManager::MOUNTING) != |
| (error_code == chromeos::MOUNT_ERROR_NONE)) { |
| FilePath source_path(mount_info.source_path); |
| - gdata::GDataSystemService* system_service = |
| - gdata::GDataSystemServiceFactory::GetForProfile(profile_); |
| - gdata::GDataFileSystem* file_system = |
| - system_service ? system_service->file_system() : NULL; |
| + gdata::GDataFileSystem* file_system = GetRemoteFileSystem(); |
| if (file_system && file_system->IsUnderGDataCacheDirectory(source_path)) |
| file_system->SetMountedState(source_path, false, |
| gdata::SetMountedStateCallback()); |
| @@ -601,6 +626,13 @@ FileBrowserEventRouter::FileWatcherExtensions::GetVirtualPath() const { |
| return virtual_path_; |
| } |
| +gdata::GDataFileSystem* FileBrowserEventRouter::GetRemoteFileSystem() const { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + gdata::GDataSystemService* system_service = |
| + gdata::GDataSystemServiceFactory::GetForProfile(profile_); |
| + return (system_service ? system_service->file_system() : NULL); |
| +} |
| + |
| bool FileBrowserEventRouter::FileWatcherExtensions::Watch |
| (const FilePath& path, FileWatcherDelegate* delegate) { |
| if (is_remote_file_system_) |