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/drive/drive_integration_service.h" | 5 #include "chrome/browser/chromeos/drive/drive_integration_service.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/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 } | 132 } |
133 | 133 |
134 } // namespace | 134 } // namespace |
135 | 135 |
136 DriveIntegrationService::DriveIntegrationService( | 136 DriveIntegrationService::DriveIntegrationService( |
137 Profile* profile, | 137 Profile* profile, |
138 DriveServiceInterface* test_drive_service, | 138 DriveServiceInterface* test_drive_service, |
139 const base::FilePath& test_cache_root, | 139 const base::FilePath& test_cache_root, |
140 FileSystemInterface* test_file_system) | 140 FileSystemInterface* test_file_system) |
141 : profile_(profile), | 141 : profile_(profile), |
142 is_initialized_(false), | 142 state_(NOT_INITIALIZED), |
143 cache_root_directory_(!test_cache_root.empty() ? | 143 cache_root_directory_(!test_cache_root.empty() ? |
144 test_cache_root : util::GetCacheRootPath(profile)), | 144 test_cache_root : util::GetCacheRootPath(profile)), |
145 weak_ptr_factory_(this) { | 145 weak_ptr_factory_(this) { |
146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
147 | 147 |
148 base::SequencedWorkerPool* blocking_pool = BrowserThread::GetBlockingPool(); | 148 base::SequencedWorkerPool* blocking_pool = BrowserThread::GetBlockingPool(); |
149 blocking_task_runner_ = blocking_pool->GetSequencedTaskRunner( | 149 blocking_task_runner_ = blocking_pool->GetSequencedTaskRunner( |
150 blocking_pool->GetSequenceToken()); | 150 blocking_pool->GetSequenceToken()); |
151 | 151 |
152 OAuth2TokenService* oauth_service = | 152 OAuth2TokenService* oauth_service = |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 debug_info_collector_.reset( | 202 debug_info_collector_.reset( |
203 new DebugInfoCollector(file_system(), cache_.get())); | 203 new DebugInfoCollector(file_system(), cache_.get())); |
204 } | 204 } |
205 | 205 |
206 DriveIntegrationService::~DriveIntegrationService() { | 206 DriveIntegrationService::~DriveIntegrationService() { |
207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
208 } | 208 } |
209 | 209 |
210 void DriveIntegrationService::Initialize() { | 210 void DriveIntegrationService::Initialize() { |
211 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 211 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 212 DCHECK_EQ(NOT_INITIALIZED, state_); |
| 213 |
| 214 state_ = INITIALIZING; |
212 drive_service_->Initialize(); | 215 drive_service_->Initialize(); |
213 file_system_->Initialize(); | 216 file_system_->Initialize(); |
214 | 217 |
215 base::PostTaskAndReplyWithResult( | 218 base::PostTaskAndReplyWithResult( |
216 blocking_task_runner_.get(), | 219 blocking_task_runner_.get(), |
217 FROM_HERE, | 220 FROM_HERE, |
218 base::Bind(&InitializeMetadata, | 221 base::Bind(&InitializeMetadata, |
219 cache_root_directory_, | 222 cache_root_directory_, |
220 metadata_storage_.get(), | 223 metadata_storage_.get(), |
221 cache_.get(), | 224 cache_.get(), |
222 resource_metadata_.get()), | 225 resource_metadata_.get()), |
223 base::Bind(&DriveIntegrationService::InitializeAfterMetadataInitialized, | 226 base::Bind(&DriveIntegrationService::InitializeAfterMetadataInitialized, |
224 weak_ptr_factory_.GetWeakPtr())); | 227 weak_ptr_factory_.GetWeakPtr())); |
225 } | 228 } |
226 | 229 |
227 void DriveIntegrationService::Shutdown() { | 230 void DriveIntegrationService::Shutdown() { |
228 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
229 | 232 |
| 233 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 234 |
230 DriveNotificationManager* drive_notification_manager = | 235 DriveNotificationManager* drive_notification_manager = |
231 DriveNotificationManagerFactory::GetForBrowserContext(profile_); | 236 DriveNotificationManagerFactory::GetForBrowserContext(profile_); |
232 if (drive_notification_manager) | 237 if (drive_notification_manager) |
233 drive_notification_manager->RemoveObserver(this); | 238 drive_notification_manager->RemoveObserver(this); |
234 | 239 |
235 RemoveDriveMountPoint(); | 240 RemoveDriveMountPoint(); |
236 debug_info_collector_.reset(); | 241 debug_info_collector_.reset(); |
237 download_handler_.reset(); | 242 download_handler_.reset(); |
238 file_system_.reset(); | 243 file_system_.reset(); |
239 drive_app_registry_.reset(); | 244 drive_app_registry_.reset(); |
(...skipping 25 matching lines...) Expand all Loading... |
265 const char* status = (enabled ? "enabled" : "disabled"); | 270 const char* status = (enabled ? "enabled" : "disabled"); |
266 util::Log(logging::LOG_INFO, "Push notification is %s", status); | 271 util::Log(logging::LOG_INFO, "Push notification is %s", status); |
267 } | 272 } |
268 | 273 |
269 bool DriveIntegrationService::IsDriveEnabled() { | 274 bool DriveIntegrationService::IsDriveEnabled() { |
270 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 275 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
271 | 276 |
272 if (!util::IsDriveEnabledForProfile(profile_)) | 277 if (!util::IsDriveEnabledForProfile(profile_)) |
273 return false; | 278 return false; |
274 | 279 |
275 return is_initialized_; | 280 // For backword compatibility, REMOUNTING also means enabled. |
| 281 return state_ == INITIALIZED || state_ == REMOUNTING; |
276 } | 282 } |
277 | 283 |
278 void DriveIntegrationService::ClearCacheAndRemountFileSystem( | 284 void DriveIntegrationService::ClearCacheAndRemountFileSystem( |
279 const base::Callback<void(bool)>& callback) { | 285 const base::Callback<void(bool)>& callback) { |
280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 286 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
281 DCHECK(!callback.is_null()); | 287 DCHECK(!callback.is_null()); |
282 | 288 |
| 289 if (state_ != INITIALIZED) { |
| 290 callback.Run(false); |
| 291 return; |
| 292 } |
| 293 |
| 294 state_ = REMOUNTING; |
| 295 |
283 RemoveDriveMountPoint(); | 296 RemoveDriveMountPoint(); |
284 // Reloading the file system will clear the resource metadata. | 297 // Reloading the file system will clear the resource metadata. |
285 file_system_->Reload(); | 298 file_system_->Reload(); |
286 // Reload the Drive app registry too. | 299 // Reload the Drive app registry too. |
287 drive_app_registry_->Update(); | 300 drive_app_registry_->Update(); |
288 | 301 |
289 cache_->ClearAllOnUIThread(base::Bind( | 302 cache_->ClearAllOnUIThread(base::Bind( |
290 &DriveIntegrationService::AddBackDriveMountPoint, | 303 &DriveIntegrationService::AddBackDriveMountPoint, |
291 weak_ptr_factory_.GetWeakPtr(), | 304 weak_ptr_factory_.GetWeakPtr(), |
292 callback)); | 305 callback)); |
(...skipping 24 matching lines...) Expand all Loading... |
317 fileapi::ExternalMountPoints* mount_points = | 330 fileapi::ExternalMountPoints* mount_points = |
318 BrowserContext::GetMountPoints(profile_); | 331 BrowserContext::GetMountPoints(profile_); |
319 DCHECK(mount_points); | 332 DCHECK(mount_points); |
320 | 333 |
321 bool success = mount_points->RegisterFileSystem( | 334 bool success = mount_points->RegisterFileSystem( |
322 drive_mount_point.BaseName().AsUTF8Unsafe(), | 335 drive_mount_point.BaseName().AsUTF8Unsafe(), |
323 fileapi::kFileSystemTypeDrive, | 336 fileapi::kFileSystemTypeDrive, |
324 drive_mount_point); | 337 drive_mount_point); |
325 | 338 |
326 if (success) { | 339 if (success) { |
| 340 state_ = INITIALIZED; |
327 util::Log(logging::LOG_INFO, "Drive mount point is added"); | 341 util::Log(logging::LOG_INFO, "Drive mount point is added"); |
328 FOR_EACH_OBSERVER(DriveIntegrationServiceObserver, observers_, | 342 FOR_EACH_OBSERVER(DriveIntegrationServiceObserver, observers_, |
329 OnFileSystemMounted()); | 343 OnFileSystemMounted()); |
| 344 } else { |
| 345 state_ = NOT_INITIALIZED; |
330 } | 346 } |
331 } | 347 } |
332 | 348 |
333 void DriveIntegrationService::RemoveDriveMountPoint() { | 349 void DriveIntegrationService::RemoveDriveMountPoint() { |
334 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 350 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
335 | 351 |
336 job_list()->CancelAllJobs(); | 352 job_list()->CancelAllJobs(); |
337 | 353 |
338 FOR_EACH_OBSERVER(DriveIntegrationServiceObserver, observers_, | 354 FOR_EACH_OBSERVER(DriveIntegrationServiceObserver, observers_, |
339 OnFileSystemBeingUnmounted()); | 355 OnFileSystemBeingUnmounted()); |
(...skipping 15 matching lines...) Expand all Loading... |
355 LOG(WARNING) << "Failed to initialize: " << FileErrorToString(error); | 371 LOG(WARNING) << "Failed to initialize: " << FileErrorToString(error); |
356 | 372 |
357 // Change the download directory to the default value if the download | 373 // Change the download directory to the default value if the download |
358 // destination is set to under Drive mount point. | 374 // destination is set to under Drive mount point. |
359 PrefService* pref_service = profile_->GetPrefs(); | 375 PrefService* pref_service = profile_->GetPrefs(); |
360 if (util::IsUnderDriveMountPoint( | 376 if (util::IsUnderDriveMountPoint( |
361 pref_service->GetFilePath(prefs::kDownloadDefaultDirectory))) { | 377 pref_service->GetFilePath(prefs::kDownloadDefaultDirectory))) { |
362 pref_service->SetFilePath(prefs::kDownloadDefaultDirectory, | 378 pref_service->SetFilePath(prefs::kDownloadDefaultDirectory, |
363 DownloadPrefs::GetDefaultDownloadDirectory()); | 379 DownloadPrefs::GetDefaultDownloadDirectory()); |
364 } | 380 } |
| 381 |
| 382 // Back to NOT_INITIALIZED state. Then, re-running Initialize() should |
| 383 // work if the error is recovarable manually (such as out of disk space). |
| 384 state_ = NOT_INITIALIZED; |
365 return; | 385 return; |
366 } | 386 } |
367 is_initialized_ = true; | |
368 | 387 |
369 content::DownloadManager* download_manager = | 388 content::DownloadManager* download_manager = |
370 g_browser_process->download_status_updater() ? | 389 g_browser_process->download_status_updater() ? |
371 BrowserContext::GetDownloadManager(profile_) : NULL; | 390 BrowserContext::GetDownloadManager(profile_) : NULL; |
372 download_handler_->Initialize( | 391 download_handler_->Initialize( |
373 download_manager, | 392 download_manager, |
374 cache_root_directory_.Append(kTemporaryFileDirectory)); | 393 cache_root_directory_.Append(kTemporaryFileDirectory)); |
375 | 394 |
376 // Register for Google Drive invalidation notifications. | 395 // Register for Google Drive invalidation notifications. |
377 DriveNotificationManager* drive_notification_manager = | 396 DriveNotificationManager* drive_notification_manager = |
378 DriveNotificationManagerFactory::GetForBrowserContext(profile_); | 397 DriveNotificationManagerFactory::GetForBrowserContext(profile_); |
379 if (drive_notification_manager) { | 398 if (drive_notification_manager) { |
380 drive_notification_manager->AddObserver(this); | 399 drive_notification_manager->AddObserver(this); |
381 const bool registered = | 400 const bool registered = |
382 drive_notification_manager->push_notification_registered(); | 401 drive_notification_manager->push_notification_registered(); |
383 const char* status = (registered ? "registered" : "not registered"); | 402 const char* status = (registered ? "registered" : "not registered"); |
384 util::Log(logging::LOG_INFO, "Push notification is %s", status); | 403 util::Log(logging::LOG_INFO, "Push notification is %s", status); |
385 | 404 |
386 if (drive_notification_manager->push_notification_enabled()) | 405 if (drive_notification_manager->push_notification_enabled()) |
387 drive_app_registry_->Update(); | 406 drive_app_registry_->Update(); |
388 } | 407 } |
389 | 408 |
390 AddDriveMountPoint(); | 409 AddDriveMountPoint(); |
| 410 state_ = INITIALIZED; |
391 } | 411 } |
392 | 412 |
393 //===================== DriveIntegrationServiceFactory ======================= | 413 //===================== DriveIntegrationServiceFactory ======================= |
394 | 414 |
395 // static | 415 // static |
396 DriveIntegrationService* DriveIntegrationServiceFactory::GetForProfile( | 416 DriveIntegrationService* DriveIntegrationServiceFactory::GetForProfile( |
397 Profile* profile) { | 417 Profile* profile) { |
398 DriveIntegrationService* service = GetForProfileRegardlessOfStates(profile); | 418 DriveIntegrationService* service = GetForProfileRegardlessOfStates(profile); |
399 if (service && !service->IsDriveEnabled()) | 419 if (service && !service->IsDriveEnabled()) |
400 return NULL; | 420 return NULL; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 profile, NULL, base::FilePath(), NULL); | 482 profile, NULL, base::FilePath(), NULL); |
463 } else { | 483 } else { |
464 service = factory_for_test_.Run(profile); | 484 service = factory_for_test_.Run(profile); |
465 } | 485 } |
466 | 486 |
467 service->Initialize(); | 487 service->Initialize(); |
468 return service; | 488 return service; |
469 } | 489 } |
470 | 490 |
471 } // namespace drive | 491 } // namespace drive |
OLD | NEW |