blob: 16e45675dbc889a2e0c4ad3988ebd09167ffdc13 [file] [log] [blame]
// 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_