root/chrome/browser/media_galleries/win/portable_device_map_service.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright 2013 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_WIN_PORTABLE_DEVICE_MAP_SERVICE_H_
#define CHROME_BROWSER_MEDIA_GALLERIES_WIN_PORTABLE_DEVICE_MAP_SERVICE_H_

#include <portabledeviceapi.h>
#include <map>

#include "base/lazy_instance.h"
#include "base/strings/string16.h"
#include "base/synchronization/lock.h"
#include "base/win/scoped_comptr.h"

// PortableDeviceMapService keeps track of initialized portable device
// interfaces. PortableDeviceMapService owns the portable device interfaces.
class PortableDeviceMapService {
 public:
  static PortableDeviceMapService* GetInstance();

  // Adds the portable |device| interface to the map service for the device
  // specified by the |device_location|. Called on a blocking pool thread.
  void AddPortableDevice(const base::string16& device_location,
                         IPortableDevice* device);

  // Marks the IPortableDevice interface of the device specified by the
  // |device_location| for deletion. This helps to cancel all the pending
  // tasks before deleting the IPortableDevice interface.
  //
  // Callers of this function should post a task on a blocking pool thread to
  // remove the IPortableDevice interface from the map service.
  //
  // Called on the IO thread.
  void MarkPortableDeviceForDeletion(const base::string16& device_location);

  // Removes the IPortableDevice interface from the map service for the device
  // specified by the |device_location|. Callers of this function should have
  // already called MarkPortableDeviceForDeletion() on the IO thread.
  // Called on a blocking pool thread.
  void RemovePortableDevice(const base::string16& device_location);

  // Gets the IPortableDevice interface associated with the device specified
  // by the |device_location|. Returns NULL if the |device_location| is no
  // longer valid (e.g. the corresponding device is detached etc).
  // Called on a blocking pool thread.
  IPortableDevice* GetPortableDevice(const base::string16& device_location);

 private:
  friend struct base::DefaultLazyInstanceTraits<PortableDeviceMapService>;

  struct PortableDeviceInfo {
    PortableDeviceInfo();  // Necessary for STL.
    explicit PortableDeviceInfo(IPortableDevice* device);

    // The portable device interface.
    base::win::ScopedComPtr<IPortableDevice> portable_device;

    // Set to true if the |portable_device| is marked for deletion.
    bool scheduled_to_delete;
  };

  typedef std::map<const base::string16, PortableDeviceInfo> PortableDeviceMap;

  // Get access to this class using GetInstance() method.
  PortableDeviceMapService();
  ~PortableDeviceMapService();

  // Mapping of |device_location| and IPortableDevice* object.
  PortableDeviceMap device_map_;
  base::Lock lock_;

  DISALLOW_COPY_AND_ASSIGN(PortableDeviceMapService);
};

#endif  // CHROME_BROWSER_MEDIA_GALLERIES_WIN_PORTABLE_DEVICE_MAP_SERVICE_H_

/* [<][>][^][v][top][bottom][index][help] */