blob: 9b39e2724d56efcf80beaad5d5634896e17c8d43 [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PRIMARY_IO_MANAGER_UDEV_H_
#define PRIMARY_IO_MANAGER_UDEV_H_
#include <libudev.h>
#include <memory>
#include "base/files/file_descriptor_watcher_posix.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "primary_io_manager/udev_scopers.h"
namespace primary_io_manager {
// Simple wrapper around libudev.
class Udev {
public:
using DeviceCallback =
base::RepeatingCallback<void(const ScopedUdevDevicePtr)>;
virtual ~Udev() = default;
virtual bool Init(const DeviceCallback& device_added_callback,
const DeviceCallback& device_removed_callback) = 0;
};
// Udev wrapper implementation.
class UdevImpl : public Udev {
public:
UdevImpl();
UdevImpl(const UdevImpl&) = delete;
UdevImpl& operator=(const UdevImpl&) = delete;
~UdevImpl() override;
// Initialize the wrapper object, registering callbacks for device monitor
// events. Return value of false indicates initialization failure and an
// unusable object.
bool Init(const DeviceCallback& device_added_callback,
const DeviceCallback& device_removed_callback) override;
private:
void OnDeviceAction();
DeviceCallback device_added_callback_;
DeviceCallback device_removed_callback_;
ScopedUdevPtr udev_;
ScopedUdevMonitorPtr monitor_;
std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;
base::WeakPtrFactory<UdevImpl> weak_factory_{this};
};
// Factory for udev object.
class UdevFactory {
public:
virtual ~UdevFactory();
// Create the udev object. Callbacks are invoked on input device
// addition/removal.
virtual std::unique_ptr<Udev> Create(
const Udev::DeviceCallback& device_added_callback,
const Udev::DeviceCallback& device_removed_callback) const = 0;
};
class UdevImplFactory : public UdevFactory {
public:
UdevImplFactory();
UdevImplFactory(const UdevImplFactory&) = delete;
UdevImplFactory& operator=(const UdevImplFactory&) = delete;
~UdevImplFactory() override;
std::unique_ptr<Udev> Create(
const Udev::DeviceCallback& device_added_callback,
const Udev::DeviceCallback& device_removed_callback) const override;
};
} // namespace primary_io_manager
#endif // PRIMARY_IO_MANAGER_UDEV_H_