blob: 99ad59b213b95fffaefec1ffb02d7c6ffbe77e14 [file]
// Copyright 2015 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.
#include "device/usb/usb_service.h"
#include "base/at_exit.h"
#include "base/bind.h"
#include "components/device_event_log/device_event_log.h"
#include "device/usb/usb_device.h"
#include "device/usb/usb_service_impl.h"
namespace device {
namespace {
UsbService* g_service;
} // namespace
void UsbService::Observer::OnDeviceAdded(scoped_refptr<UsbDevice> device) {
}
void UsbService::Observer::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
}
void UsbService::Observer::OnDeviceRemovedCleanup(
scoped_refptr<UsbDevice> device) {
}
// static
UsbService* UsbService::GetInstance(
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) {
if (!g_service) {
// |g_service| is set by the UsbService constructor.
new UsbServiceImpl(blocking_task_runner);
if (!g_service) {
base::AtExitManager::RegisterTask(base::Bind(
&base::DeletePointer<UsbService>, base::Unretained(g_service)));
}
}
return g_service;
}
UsbService::UsbService() {
DCHECK(!g_service);
g_service = this;
}
UsbService::~UsbService() {
DCHECK(g_service);
g_service = nullptr;
}
void UsbService::AddObserver(Observer* observer) {
DCHECK(CalledOnValidThread());
observer_list_.AddObserver(observer);
}
void UsbService::RemoveObserver(Observer* observer) {
DCHECK(CalledOnValidThread());
observer_list_.RemoveObserver(observer);
}
void UsbService::NotifyDeviceAdded(scoped_refptr<UsbDevice> device) {
DCHECK(CalledOnValidThread());
FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceAdded(device));
}
void UsbService::NotifyDeviceRemoved(scoped_refptr<UsbDevice> device) {
DCHECK(CalledOnValidThread());
FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(device));
FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemovedCleanup(device));
}
} // namespace device