Теория
Большинство классов solid, доступных программисту для разработки, содержаться в kdelibs и включают в себя:
Solid::AcAdapter Работа с AC адаптерами
Solid::AudioInterface Работа с звуковыми картами
Solid::Battery Работа с батареями
Solid::Block Работа с блочными устройствами
Solid::Button Работа со специфичными кнопками (Lid, Power, Sleep )
Solid::Camera Работа с цифровыми камерами
Solid::Device Позволяет приложениям узнать, доступно то или иное оборудование в системе.
Solid::DeviceInterface Базовый класс для всех интерфейсов устройств
Solid::DeviceNotifier Оповещение системы о всех имеющихся и подключаемых во время работы устройствах
Solid::DvbInterface Работа с DVB (Digital Video Broadcast) устройствами
Solid::GenericInterface Общий интерфейс для работы с устройствами на прямую
Solid::NetworkInterface Работа с сетевыми интерфейсами
Solid::Networking::Notifier Оповещение системы о изменении состояния сети (Unknown, Unconnected, Disconnecting, Connecting, Connected)
Solid::PowerManagement::Notifier Оповещение системы о состоянии питания
Solid::OpticalDisc Работа с оптическими носителями
Solid::OpticalDrive Работа с оптическими приводами
Solid::PortableMediaPlayer Работа с переносными плеерами
Solid::Predicate Позволяет узнать принадлежит ли устройство к тому или иному типу
Solid::Processor Работа с процессором
Solid::SerialInterface Работа с устройствами с последовательным интерфейсом
Solid::StorageAccess Работа с разделами устройствах хранения информации
Solid::StorageDrive Работа с устройствами хранения информации
Solid::StorageVolume Работа со всему устройсвами, которые могут содержать информацию
Solid::Video Работа с устройствами обработки видео
Используя набор этих классов можно достаточно просто получить информацию о любых имеющихся в системе устройствах.
Практика
Попробуем написать простенький пример. в котором используем пару возможностей Solid.
Для начала экспериментов, необходимо доустановить в свою систему необходимые dev пакеты. Командуем
$ sudo aptitude install automoc cmake kdelibs5-dev
и ждём минут пять пока скачается и установится всё необходимое.
Приложение будет состоять из трёх файлов и реализовывать две функции:
1) Вывод списка всех доступных в системе устройств при старте
2) Слежение за всеми вновь подключёнными в систему устройствами.
app.h:
#include <solid/devicenotifier.h>
#include <solid/device.h>
#include <QApplication.h>
#include <QDebug.h>
class App : public QApplication
{
Q_OBJECT
public:
App(int args, char **argv);
virtual ~App();
private slots:
void deviceAdded(const QString &udi);
void deviceRemoved(const QString &udi);
};
* This source code was highlighted with Source Code Highlighter.app.cpp:
#include "app.h"
App::App( int args, char **argv )
: QApplication(args, argv)
{
//Выводим список всех доступных устройств
qDebug() << "===== All available devices =====";
foreach (const Solid::Device &device, Solid::Device::allDevices())
{
qDebug() << device.udi().toLatin1().constData();
}
//Начинаем слежение за всеми подключаемыми в систему устройствами
qDebug() << "\n===== Start monitoring for new =====";
Solid::DeviceNotifier *notifier = Solid::DeviceNotifier::instance ();
connect(notifier, SIGNAL(deviceAdded (const QString &)), this, SLOT(deviceAdded(QString const&)));
connect(notifier, SIGNAL(deviceRemoved(QString const&)), this, SLOT(deviceRemoved(QString const&)));
}
void App::deviceAdded(QString const&udi)
{
qDebug() << "Added" << udi.toLatin1().constData();
}
void App::deviceRemoved(QString const&udi)
{
qDebug() << "Removed" << udi.toLatin1().constData();
}
App::~App()
{
//TODO
}
* This source code was highlighted with Source Code Highlighter.main.cpp:
#include "app.h"
int main(int args, char **argv)
{
App app( args, argv );
return app.exec();
}
* This source code was highlighted with Source Code Highlighter.CMakeLists.txt:
project(solid)
find_package(KDE4 REQUIRED)
include_directories( ${KDE4_INCLUDES} )
set(mySources main.cpp app.h app.cpp)
kde4_add_executable(solid ${mySources})
target_link_libraries(solid ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
install(TARGETS solid DESTINATION bin)
* This source code was highlighted with Source Code Highlighter.Сохраняем всё это в каком-либо каталоге и выполняем по очереди:
cmake .
make
./solid
* This source code was highlighted with Source Code Highlighter.Если всё собралось правильно, после запуска мы увидим список всех устройств в системе.
Теперь попробуем подключить флешку или мп3 плеер в usb разъём и увидим что-то вроде:
Added /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4
Added /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0
Added /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_usbraw
Added /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0_scsi_host
Added /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0_scsi_host_scsi_device_lun0
Added /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0_scsi_host_scsi_device_lun0_scsi_generic
Added /org/freedesktop/Hal/devices/storage_serial_JetFlash_TS2GJFV60_51ZT24OY_0_0
Added /org/freedesktop/Hal/devices/volume_uuid_4979_CC88
* This source code was highlighted with Source Code Highlighter.Отключаем наше устройство и видим:
Removed /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0_scsi_host_scsi_device_lun0_scsi_generic
Removed /org/freedesktop/Hal/devices/volume_uuid_4979_CC88
Removed /org/freedesktop/Hal/devices/storage_serial_JetFlash_TS2GJFV60_51ZT24OY_0_0
Removed /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0_scsi_host_scsi_device_lun0
Removed /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0_scsi_host
Removed /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_if0
Removed /org/freedesktop/Hal/devices/usb_device_58f_6387_51ZT24OY_4_usbraw
* This source code was highlighted with Source Code Highlighter.Всё это означает, что у нас всё получилось, solid работает и использует в качестве своего бэкэнда ни что иное, как HAL.
Для подготовки заметки использовался материал сайта api.kde.org. зайдя на который можно найти исчерпывающее количество информации по Solid, включая туториалы, документацию по API и т.п.