Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(502)

Unified Diff: chrome/browser/media_gallery/media_file_system_registry.h

Issue 11358243: Redesigned and refactored ScopedMTPDeviceMapEntry, MTPDeviceMapService & MTPDeviceDelegate classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit test Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;

Powered by Google App Engine
This is Rietveld 408576698