Index: chrome/browser/media_gallery/media_file_system_registry.h |
diff --git a/chrome/browser/media_gallery/media_file_system_registry.h b/chrome/browser/media_gallery/media_file_system_registry.h |
index fe1236571a2e357f8d16b5c1b7a30fb1c3b4dbbd..fc8e7e0425051cae59f9b478f0ebdb99c7ad3219 100644 |
--- a/chrome/browser/media_gallery/media_file_system_registry.h |
+++ b/chrome/browser/media_gallery/media_file_system_registry.h |
@@ -9,6 +9,7 @@ |
#define CHROME_BROWSER_MEDIA_GALLERY_MEDIA_FILE_SYSTEM_REGISTRY_H_ |
#include <map> |
+#include <set> |
#include <string> |
#include <utility> |
#include <vector> |
@@ -17,7 +18,6 @@ |
#include "base/lazy_instance.h" |
#include "base/file_path.h" |
#include "base/memory/ref_counted.h" |
-#include "base/memory/weak_ptr.h" |
#include "base/prefs/public/pref_change_registrar.h" |
#include "base/system_monitor/system_monitor.h" |
#include "webkit/fileapi/media/mtp_device_file_system_config.h" |
@@ -57,38 +57,22 @@ struct MediaFileSystemInfo { |
}; |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
-// Class to manage MTPDeviceDelegateImpl object for the attached MTP device. |
-// Refcounted to reuse the same MTP device delegate entry across extensions. |
-// This class supports WeakPtr (extends SupportsWeakPtr) to expose itself as |
-// a weak pointer to MediaFileSystemRegistry. |
-class ScopedMTPDeviceMapEntry |
- : public base::RefCounted<ScopedMTPDeviceMapEntry>, |
- public base::SupportsWeakPtr<ScopedMTPDeviceMapEntry> { |
+// Class to manage the lifetime of MTPDeviceDelegateImpl object for the attached |
+// media transfer protocol(MTP) device. This object is constructed for each MTP |
Lei Zhang
2012/11/21 02:32:48
nit: space after protocol.
kmadhusu
2012/11/21 04:09:53
Done.
|
+// device. |
+class ScopedMTPDeviceMapEntry { |
public: |
- // |no_references_callback| is called when the last ScopedMTPDeviceMapEntry |
- // reference goes away. |
- ScopedMTPDeviceMapEntry(const FilePath::StringType& device_location, |
- const base::Closure& no_references_callback); |
+ explicit ScopedMTPDeviceMapEntry(const FilePath::StringType& device_location); |
- private: |
- // Friend declaration for ref counted implementation. |
- friend class base::RefCounted<ScopedMTPDeviceMapEntry>; |
- |
- // Private because this class is ref-counted. |
+ // Destructed when the last user of this MTP device is destroyed or when the |
+ // MTP device is detached from the system or when the browser is in shutdown |
+ // mode or when the last extension revokes the MTP device gallery permissions. |
~ScopedMTPDeviceMapEntry(); |
- // Store the MTP or PTP device location. |
+ private: |
+ // The MTP or PTP device location. |
const FilePath::StringType device_location_; |
- // Store a raw pointer of MTPDeviceDelegateImpl object. |
- // MTPDeviceDelegateImpl is ref-counted and owned by MTPDeviceMapService. |
- // This class tells MTPDeviceMapService to dispose of it when the last |
- // reference to |this| goes away. |
- MTPDeviceDelegateImpl* delegate_; |
- |
- // A callback to call when the last reference of this object goes away. |
- base::Closure no_references_callback_; |
- |
DISALLOW_COPY_AND_ASSIGN(ScopedMTPDeviceMapEntry); |
}; |
#endif |
@@ -103,12 +87,16 @@ class MediaFileSystemContext { |
const std::string& device_id, const FilePath& path) = 0; |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- // Registers and returns the file system id for the MTP or PTP device |
- // specified by |device_id| and |path|. Updates |entry| with the corresponding |
- // ScopedMTPDeviceMapEntry object. |
+ // For the given |galleries_host|, this function returns the file system id |
+ // of the registered MTP or PTP device specified by |device_id| and |path|. |
virtual std::string RegisterFileSystemForMTPDevice( |
const std::string& device_id, const FilePath& path, |
- scoped_refptr<ScopedMTPDeviceMapEntry>* entry) = 0; |
+ const ExtensionGalleriesHost* galleries_host) = 0; |
+ |
+ // Removes the MTP or PTP device reference for the given |galleries_host|. |
+ virtual void RemoveMTPDeviceReferenceForHost( |
+ const FilePath::StringType& device_location, |
+ const ExtensionGalleriesHost* galleries_host) = 0; |
#endif |
// Revoke the passed |fsid|. |
@@ -161,11 +149,19 @@ class MediaFileSystemRegistry |
typedef std::map<Profile*, PrefChangeRegistrar*> PrefChangeRegistrarMap; |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- // Map a MTP or PTP device location to the weak pointer of |
- // ScopedMTPDeviceMapEntry. |
- typedef std::map<const FilePath::StringType, |
- base::WeakPtr<ScopedMTPDeviceMapEntry> > |
+ // Map a MTP or PTP device location to the ScopedMTPDeviceMapEntry. |
+ // This map owns ScopedMTPDeviceMapEntry. |
+ typedef std::map<const FilePath::StringType, ScopedMTPDeviceMapEntry*> |
MTPDeviceDelegateMap; |
+ |
+ // Set of extension galleries host. |
+ typedef std::set<const ExtensionGalleriesHost*> ExtensionGalleriesHostSet; |
+ |
+ // Map a device location to a set of extension galleries host. |
+ // This map keeps track of extension galleries that currently registered |
+ // the MTP device gallery as a file system. |
+ typedef std::map<const FilePath::StringType, ExtensionGalleriesHostSet> |
Lei Zhang
2012/11/21 02:32:48
Isn't this just used as another way of ref-countin
kmadhusu
2012/11/21 04:09:53
Yes.
Lei Zhang
2012/11/21 06:46:39
So why can't ScopedMTPDeviceMapEntry just be ref-c
kmadhusu
2012/11/22 00:49:07
As we discussed, reverted ScopedMTPDeviceMapEntry
|
+ MTPDeviceReferencesMap; |
#endif |
// Obtain an instance of this class via GetInstance(). |
@@ -175,14 +171,17 @@ class MediaFileSystemRegistry |
void OnMediaGalleriesRememberedGalleriesChanged(PrefServiceBase* service); |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
- // Returns ScopedMTPDeviceMapEntry object for the given |device_location|. |
- ScopedMTPDeviceMapEntry* GetOrCreateScopedMTPDeviceMapEntry( |
- const FilePath::StringType& device_location); |
+ // Adds the |galleries_host| reference for the MTP device specified by the |
+ // |device_location|. |
+ void AddGalleriesHostReferenceForMTPDevice( |
+ const FilePath::StringType& device_location, |
+ const ExtensionGalleriesHost* galleries_host); |
- // Removes the ScopedMTPDeviceMapEntry associated with the given |
+ // Removes the |galleries_host| reference for the MTP device specified by the |
// |device_location|. |
- void RemoveScopedMTPDeviceMapEntry( |
- const FilePath::StringType& device_location); |
+ void RemoveGalleriesHostReferenceForMTPDevice( |
+ const FilePath::StringType& device_location, |
+ const ExtensionGalleriesHost* galleries_host); |
#endif |
void OnExtensionGalleriesHostEmpty(Profile* profile, |
@@ -196,7 +195,8 @@ class MediaFileSystemRegistry |
#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM) |
// Only accessed on the UI thread. |
- MTPDeviceDelegateMap mtp_delegate_map_; |
+ MTPDeviceDelegateMap mtp_device_delegate_map_; |
+ MTPDeviceReferencesMap mtp_device_references_map_; |
#endif |
scoped_ptr<MediaFileSystemContext> file_system_context_; |