- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / media_galleries / win / portable_device_map_service.h
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 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 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 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 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 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_