Detecter une clé USB en C++

Je travail actuellement sur une application qui se voudrait multi-platforme

et j’ai besoin de detecter la connecter d’une clé USB

pour windows j’utilise l’event WM_DEVICECHANGE
mais pour linux, comment faire ?

sous linux il faut ecouter hal via dbus

Sinon sous Gnome, gnome-volume-manager permet peut être de gerer ces evenements encore plus facilement

voilà ce qu’il se passe dans dbus quand on debranche une manette pour brancher une clé USB :
[spoiler]l33thium@Sapphire:~$ dbus-monitor --system
signal sender=org.freedesktop.DBus -> dest=:1.105 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string “:1.105”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceRemoved
string “/org/freedesktop/Hal/devices/usb_device_44f_b300_noserial_if0”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceRemoved
string “/org/freedesktop/Hal/devices/usb_device_44f_b300_noserial_if0_logicaldev_input”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceRemoved
string “/org/freedesktop/Hal/devices/usb_device_44f_b300_noserial”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceRemoved
string “/org/freedesktop/Hal/devices/usb_device_44f_b300_noserial_usbraw”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8_if0”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8_if0; interface=org.freedesktop.Hal.Device; member=PropertyModified
int32 1
array [
struct {
string “info.linux.driver”
boolean false
boolean true
}
]
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8_usbraw”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8_if0_scsi_host”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8_if0_scsi_host_scsi_device_lun0”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/usb_device_930_653d_0DA01460C1C258B8_if0_scsi_host_scsi_device_lun0_scsi_generic”
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string “:1.106”
string “”
string “:1.106”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/storage_serial_0930_USB_Flash_Memory_0DA01460C1C258B8_0_0”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/Manager; interface=org.freedesktop.Hal.Manager; member=DeviceAdded
string “/org/freedesktop/Hal/devices/volume_uuid_448C_04A1”
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string “:1.107”
string “”
string “:1.107”
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string “:1.108”
string “”
string “:1.108”
signal sender=:1.0 -> dest=(null destination) path=/org/freedesktop/Hal/devices/volume_uuid_448C_04A1; interface=org.freedesktop.Hal.Device; member=PropertyModified
int32 2
array [
struct {
string “volume.mount_point”
boolean false
boolean false
}
struct {
string “volume.is_mounted”
boolean false
boolean false
}
]
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string “:1.108”
string “:1.108”
string “”
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string “:1.107”
string “:1.107”
string “”

[/spoiler]
Edité le 30/06/2007 à 16:10

Tu peux également écouter au travers de la lib usb

la lib usb j’avais commencer à regarder

dbus+hal semble aussi pouvoir être utilisé, et Qt dispose d’un objet pour dialoguer avec dbus

vais creuser tout ça, merci à vous deux

Dans la libusb, je crois que usb_open(dev), ne retourne que si il peut ouvrir le périphérique “dev” (qui est une structure que tu as rempli au paravant ). A vérifier.

/sys ne contient pas ce que tu cherches? (où dans /sys je ne fais pas ;))
Un thread qui écoute dans /sys. Bof c’est assez moche mais au final c’est peut être le plus simple (mais est ce accpetable? genre est ce que ça doit marcher avec un noyau 2.4?)

la solution du genre /sys ne me plait pas vraiment, même si elle pourrait effectivement marcher

vais essayer de faire des tests dans la semaine pour voir ce qui est le plus simple et efficace

Le plus efficace, c’est de regarder du côté de DBus+Hal comme l’a dit lithium.