| 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 // MediaFileSystemRegistry implementation. | 5 // MediaFileSystemRegistry implementation. |
| 6 | 6 |
| 7 #include "chrome/browser/media_galleries/media_file_system_registry.h" | 7 #include "chrome/browser/media_galleries/media_file_system_registry.h" |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 ******************/ | 428 ******************/ |
| 429 | 429 |
| 430 void MediaFileSystemRegistry::GetMediaFileSystemsForExtension( | 430 void MediaFileSystemRegistry::GetMediaFileSystemsForExtension( |
| 431 const content::RenderViewHost* rvh, | 431 const content::RenderViewHost* rvh, |
| 432 const extensions::Extension* extension, | 432 const extensions::Extension* extension, |
| 433 const MediaFileSystemsCallback& callback) { | 433 const MediaFileSystemsCallback& callback) { |
| 434 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 434 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 435 | 435 |
| 436 Profile* profile = | 436 Profile* profile = |
| 437 Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext()); | 437 Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext()); |
| 438 MediaGalleriesPreferences* preferences = GetPreferences(profile); | 438 GetPreferencesAsync( |
| 439 profile, base::Bind( |
| 440 &MediaFileSystemRegistry::GetMediaFileSystemsPostStorageMonitorInit, |
| 441 weak_ptr_factory_.GetWeakPtr(), |
| 442 rvh, extension, callback)); |
| 443 } |
| 444 |
| 445 void MediaFileSystemRegistry::GetMediaFileSystemsPostStorageMonitorInit( |
| 446 const content::RenderViewHost* rvh, |
| 447 const extensions::Extension* extension, |
| 448 const MediaFileSystemsCallback& callback, |
| 449 MediaGalleriesPreferences* preferences) { |
| 439 MediaGalleryPrefIdSet galleries = | 450 MediaGalleryPrefIdSet galleries = |
| 440 preferences->GalleriesForExtension(*extension); | 451 preferences->GalleriesForExtension(*extension); |
| 441 | 452 |
| 442 if (galleries.empty()) { | 453 if (galleries.empty()) { |
| 443 callback.Run(std::vector<MediaFileSystemInfo>()); | 454 callback.Run(std::vector<MediaFileSystemInfo>()); |
| 444 return; | 455 return; |
| 445 } | 456 } |
| 446 | 457 |
| 458 Profile* profile = |
| 459 Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext()); |
| 447 if (!ContainsKey(pref_change_registrar_map_, profile)) { | 460 if (!ContainsKey(pref_change_registrar_map_, profile)) { |
| 448 PrefChangeRegistrar* pref_registrar = new PrefChangeRegistrar; | 461 PrefChangeRegistrar* pref_registrar = new PrefChangeRegistrar; |
| 449 pref_registrar->Init(profile->GetPrefs()); | 462 pref_registrar->Init(profile->GetPrefs()); |
| 450 pref_registrar->Add( | 463 pref_registrar->Add( |
| 451 prefs::kMediaGalleriesRememberedGalleries, | 464 prefs::kMediaGalleriesRememberedGalleries, |
| 452 base::Bind(&MediaFileSystemRegistry::OnRememberedGalleriesChanged, | 465 base::Bind(&MediaFileSystemRegistry::OnRememberedGalleriesChanged, |
| 453 base::Unretained(this), | 466 base::Unretained(this), |
| 454 pref_registrar->prefs())); | 467 pref_registrar->prefs())); |
| 455 pref_change_registrar_map_[profile] = pref_registrar; | 468 pref_change_registrar_map_[profile] = pref_registrar; |
| 456 } | 469 } |
| 457 | 470 |
| 458 ExtensionGalleriesHost* extension_host = | 471 ExtensionGalleriesHost* extension_host = |
| 459 extension_hosts_map_[profile][extension->id()].get(); | 472 extension_hosts_map_[profile][extension->id()].get(); |
| 460 if (!extension_host) { | 473 if (!extension_host) { |
| 461 extension_host = new ExtensionGalleriesHost( | 474 extension_host = new ExtensionGalleriesHost( |
| 462 file_system_context_.get(), | 475 file_system_context_.get(), |
| 463 base::Bind(&MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty, | 476 base::Bind(&MediaFileSystemRegistry::OnExtensionGalleriesHostEmpty, |
| 464 base::Unretained(this), profile, extension->id())); | 477 base::Unretained(this), profile, extension->id())); |
| 465 extension_hosts_map_[profile][extension->id()] = extension_host; | 478 extension_hosts_map_[profile][extension->id()] = extension_host; |
| 466 } | 479 } |
| 467 extension_host->ReferenceFromRVH(rvh); | 480 extension_host->ReferenceFromRVH(rvh); |
| 468 | 481 |
| 469 extension_host->GetMediaFileSystems(galleries, preferences->known_galleries(), | 482 extension_host->GetMediaFileSystems(galleries, preferences->known_galleries(), |
| 470 callback); | 483 callback); |
| 471 } | 484 } |
| 472 | 485 |
| 486 void MediaFileSystemRegistry::GetPreferencesAsync( |
| 487 Profile* profile, |
| 488 base::Callback<void(MediaGalleriesPreferences*)> callback) { |
| 489 StorageMonitor* monitor = StorageMonitor::GetInstance(); |
| 490 // TODO(gbillock): Make sure tests all have a test storage monitor |
| 491 // and eliminate the checks here and elsewhere. |
| 492 if (!monitor) { |
| 493 callback.Run(MediaGalleriesPreferencesFactory::GetForProfile(profile)); |
| 494 return; |
| 495 } |
| 496 |
| 497 if (monitor->IsInitialized()) { |
| 498 callback.Run(GetPreferences(profile)); |
| 499 return; |
| 500 } |
| 501 |
| 502 monitor->Initialize( |
| 503 base::Bind(&MediaFileSystemRegistry::OnStorageMonitorInitialized, |
| 504 weak_ptr_factory_.GetWeakPtr(), |
| 505 profile, callback)); |
| 506 |
| 507 // TODO(gbillock): set a timeout here to bail out of init? |
| 508 } |
| 509 |
| 510 void MediaFileSystemRegistry::OnStorageMonitorInitialized( |
| 511 Profile* profile, |
| 512 base::Callback<void(MediaGalleriesPreferences*)> callback) { |
| 513 callback.Run(GetPreferences(profile)); |
| 514 } |
| 515 |
| 473 MediaGalleriesPreferences* MediaFileSystemRegistry::GetPreferences( | 516 MediaGalleriesPreferences* MediaFileSystemRegistry::GetPreferences( |
| 474 Profile* profile) { | 517 Profile* profile) { |
| 475 MediaGalleriesPreferences* preferences = | 518 MediaGalleriesPreferences* preferences = |
| 476 MediaGalleriesPreferencesFactory::GetForProfile(profile); | 519 MediaGalleriesPreferencesFactory::GetForProfile(profile); |
| 477 if (ContainsKey(extension_hosts_map_, profile)) | 520 if (ContainsKey(extension_hosts_map_, profile)) |
| 478 return preferences; | 521 return preferences; |
| 479 | 522 |
| 480 // Create an empty entry so the initialization code below only gets called | 523 // Create an empty entry so the initialization code below only gets called |
| 481 // once per profile. | 524 // once per profile. |
| 482 extension_hosts_map_[profile] = ExtensionHostMap(); | 525 extension_hosts_map_[profile] = ExtensionHostMap(); |
| 483 | 526 |
| 484 // TODO(gbillock): Move this stanza to MediaGalleriesPreferences init code. | 527 // TODO(gbillock): Move this stanza to MediaGalleriesPreferences init code. |
| 485 // StorageMonitor may be NULL in unit tests. | 528 // StorageMonitor may be NULL in unit tests. |
| 486 StorageMonitor* monitor = StorageMonitor::GetInstance(); | 529 StorageMonitor* monitor = StorageMonitor::GetInstance(); |
| 487 if (!monitor) | 530 if (!monitor) |
| 488 return preferences; | 531 return preferences; |
| 532 DCHECK(monitor->IsInitialized()); |
| 489 std::vector<StorageInfo> existing_devices = monitor->GetAttachedStorage(); | 533 std::vector<StorageInfo> existing_devices = monitor->GetAttachedStorage(); |
| 490 for (size_t i = 0; i < existing_devices.size(); i++) { | 534 for (size_t i = 0; i < existing_devices.size(); i++) { |
| 491 if (!MediaStorageUtil::IsMediaDevice(existing_devices[i].device_id)) | 535 if (!MediaStorageUtil::IsMediaDevice(existing_devices[i].device_id)) |
| 492 continue; | 536 continue; |
| 493 if (!existing_devices[i].name.empty()) { | 537 if (!existing_devices[i].name.empty()) { |
| 494 preferences->AddGalleryWithName(existing_devices[i].device_id, | 538 preferences->AddGalleryWithName(existing_devices[i].device_id, |
| 495 existing_devices[i].name, | 539 existing_devices[i].name, |
| 496 base::FilePath(), | 540 base::FilePath(), |
| 497 false /*not user added*/); | 541 false /*not user added*/); |
| 498 } else { | 542 } else { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 return registry_; | 669 return registry_; |
| 626 } | 670 } |
| 627 | 671 |
| 628 private: | 672 private: |
| 629 MediaFileSystemRegistry* registry_; | 673 MediaFileSystemRegistry* registry_; |
| 630 | 674 |
| 631 DISALLOW_COPY_AND_ASSIGN(MediaFileSystemContextImpl); | 675 DISALLOW_COPY_AND_ASSIGN(MediaFileSystemContextImpl); |
| 632 }; | 676 }; |
| 633 | 677 |
| 634 MediaFileSystemRegistry::MediaFileSystemRegistry() | 678 MediaFileSystemRegistry::MediaFileSystemRegistry() |
| 635 : file_system_context_(new MediaFileSystemContextImpl(this)) { | 679 : file_system_context_(new MediaFileSystemContextImpl(this)), |
| 680 weak_ptr_factory_(this) { |
| 636 // StorageMonitor may be NULL in unit tests. | 681 // StorageMonitor may be NULL in unit tests. |
| 637 StorageMonitor* monitor = StorageMonitor::GetInstance(); | 682 StorageMonitor* monitor = StorageMonitor::GetInstance(); |
| 638 if (monitor) | 683 if (monitor) |
| 639 monitor->AddObserver(this); | 684 monitor->AddObserver(this); |
| 640 } | 685 } |
| 641 | 686 |
| 642 MediaFileSystemRegistry::~MediaFileSystemRegistry() { | 687 MediaFileSystemRegistry::~MediaFileSystemRegistry() { |
| 643 // StorageMonitor may be NULL in unit tests. | 688 // StorageMonitor may be NULL in unit tests. |
| 644 StorageMonitor* monitor = StorageMonitor::GetInstance(); | 689 StorageMonitor* monitor = StorageMonitor::GetInstance(); |
| 645 if (monitor) | 690 if (monitor) |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 // previously used. | 785 // previously used. |
| 741 PrefChangeRegistrarMap::iterator pref_it = | 786 PrefChangeRegistrarMap::iterator pref_it = |
| 742 pref_change_registrar_map_.find(profile); | 787 pref_change_registrar_map_.find(profile); |
| 743 DCHECK(pref_it != pref_change_registrar_map_.end()); | 788 DCHECK(pref_it != pref_change_registrar_map_.end()); |
| 744 delete pref_it->second; | 789 delete pref_it->second; |
| 745 pref_change_registrar_map_.erase(pref_it); | 790 pref_change_registrar_map_.erase(pref_it); |
| 746 } | 791 } |
| 747 } | 792 } |
| 748 | 793 |
| 749 } // namespace chrome | 794 } // namespace chrome |
| OLD | NEW |