// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_MAP_SERVICE_H_ #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_MAP_SERVICE_H_ #include <map> #include "base/files/file_path.h" #include "base/lazy_instance.h" #include "base/threading/thread_checker.h" class MTPDeviceAsyncDelegate; // This class provides media transfer protocol (MTP) device delegate to // complete media file system operations. // Lives on the IO thread in production. // TODO(gbillock): Make this class owned by the MediaFileSystemRegistry. class MTPDeviceMapService { public: static MTPDeviceMapService* GetInstance(); // Gets the media device delegate associated with |filesystem_id|. // Return NULL if the |filesystem_id| is no longer valid (e.g. because the // corresponding device is detached, etc). // Called on the IO thread. MTPDeviceAsyncDelegate* GetMTPDeviceAsyncDelegate( const std::string& filesystem_id); // Register that an MTP filesystem is in use for the given |device_location|. void RegisterMTPFileSystem( const base::FilePath::StringType& device_location, const std::string& fsid); // Removes the MTP entry associated with the given // |device_location|. Signals the MTPDeviceMapService to destroy the // delegate if there are no more uses of it. void RevokeMTPFileSystem(const std::string& fsid); private: friend struct base::DefaultLazyInstanceTraits<MTPDeviceMapService>; // Adds the MTP device delegate to the map service. |device_location| // specifies the mount location of the MTP device. // Called on the IO thread. void AddAsyncDelegate(const base::FilePath::StringType& device_location, MTPDeviceAsyncDelegate* delegate); // Removes the MTP device delegate from the map service. |device_location| // specifies the mount location of the MTP device. // Called on the IO thread. void RemoveAsyncDelegate(const base::FilePath::StringType& device_location); // Mapping of device_location and MTPDeviceAsyncDelegate* object. It is safe // to store and access the raw pointer. This class operates on the IO thread. typedef std::map<base::FilePath::StringType, MTPDeviceAsyncDelegate*> AsyncDelegateMap; // Map a filesystem id (fsid) to an MTP device location. typedef std::map<std::string, base::FilePath::StringType> MTPDeviceFileSystemMap; // Map a MTP or PTP device location to a count of current uses of that // location. typedef std::map<const base::FilePath::StringType, int> MTPDeviceUsageMap; // Get access to this class using GetInstance() method. MTPDeviceMapService(); ~MTPDeviceMapService(); // Map of attached mtp device async delegates. AsyncDelegateMap async_delegate_map_; MTPDeviceFileSystemMap mtp_device_map_; MTPDeviceUsageMap mtp_device_usage_map_; DISALLOW_COPY_AND_ASSIGN(MTPDeviceMapService); }; #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_MAP_SERVICE_H_