Home | History | Annotate | Download | only in win
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_MEDIA_GALLERIES_WIN_PORTABLE_DEVICE_MAP_SERVICE_H_
      6 #define CHROME_BROWSER_MEDIA_GALLERIES_WIN_PORTABLE_DEVICE_MAP_SERVICE_H_
      7 
      8 #include <portabledeviceapi.h>
      9 #include <map>
     10 
     11 #include "base/lazy_instance.h"
     12 #include "base/strings/string16.h"
     13 #include "base/synchronization/lock.h"
     14 #include "base/win/scoped_comptr.h"
     15 
     16 // PortableDeviceMapService keeps track of initialized portable device
     17 // interfaces. PortableDeviceMapService owns the portable device interfaces.
     18 class PortableDeviceMapService {
     19  public:
     20   static PortableDeviceMapService* GetInstance();
     21 
     22   // Adds the portable |device| interface to the map service for the device
     23   // specified by the |device_location|. Called on a blocking pool thread.
     24   void AddPortableDevice(const base::string16& device_location,
     25                          IPortableDevice* device);
     26 
     27   // Marks the IPortableDevice interface of the device specified by the
     28   // |device_location| for deletion. This helps to cancel all the pending
     29   // tasks before deleting the IPortableDevice interface.
     30   //
     31   // Callers of this function should post a task on a blocking pool thread to
     32   // remove the IPortableDevice interface from the map service.
     33   //
     34   // Called on the IO thread.
     35   void MarkPortableDeviceForDeletion(const base::string16& device_location);
     36 
     37   // Removes the IPortableDevice interface from the map service for the device
     38   // specified by the |device_location|. Callers of this function should have
     39   // already called MarkPortableDeviceForDeletion() on the IO thread.
     40   // Called on a blocking pool thread.
     41   void RemovePortableDevice(const base::string16& device_location);
     42 
     43   // Gets the IPortableDevice interface associated with the device specified
     44   // by the |device_location|. Returns NULL if the |device_location| is no
     45   // longer valid (e.g. the corresponding device is detached etc).
     46   // Called on a blocking pool thread.
     47   IPortableDevice* GetPortableDevice(const base::string16& device_location);
     48 
     49  private:
     50   friend struct base::DefaultLazyInstanceTraits<PortableDeviceMapService>;
     51 
     52   struct PortableDeviceInfo {
     53     PortableDeviceInfo();  // Necessary for STL.
     54     explicit PortableDeviceInfo(IPortableDevice* device);
     55 
     56     // The portable device interface.
     57     base::win::ScopedComPtr<IPortableDevice> portable_device;
     58 
     59     // Set to true if the |portable_device| is marked for deletion.
     60     bool scheduled_to_delete;
     61   };
     62 
     63   typedef std::map<const base::string16, PortableDeviceInfo> PortableDeviceMap;
     64 
     65   // Get access to this class using GetInstance() method.
     66   PortableDeviceMapService();
     67   ~PortableDeviceMapService();
     68 
     69   // Mapping of |device_location| and IPortableDevice* object.
     70   PortableDeviceMap device_map_;
     71   base::Lock lock_;
     72 
     73   DISALLOW_COPY_AND_ASSIGN(PortableDeviceMapService);
     74 };
     75 
     76 #endif  // CHROME_BROWSER_MEDIA_GALLERIES_WIN_PORTABLE_DEVICE_MAP_SERVICE_H_
     77