12using namespace Solid::Backends::Win;
21WinBlock::WinBlock(WinDevice *device)
22 : WinInterface(device)
26 if (m_device->type() == Solid::DeviceInterface::StorageVolume) {
27 STORAGE_DEVICE_NUMBER info =
28 WinDeviceManager::getDeviceInfo<STORAGE_DEVICE_NUMBER>(driveLetterFromUdi(m_device->udi()), IOCTL_STORAGE_GET_DEVICE_NUMBER);
29 m_major = info.DeviceNumber;
30 m_minor = info.PartitionNumber;
31 }
else if (m_device->type() == Solid::DeviceInterface::StorageDrive
32 || m_device->type() == Solid::DeviceInterface::OpticalDrive
33 || m_device->type() == Solid::DeviceInterface::OpticalDisc) {
34 m_major = m_device->udi().mid(m_device->udi().length() - 1).toInt();
36 qFatal(
"Not implemented device type %i", m_device->type());
44int WinBlock::deviceMajor()
const
46 Q_ASSERT(m_major != -1);
50int WinBlock::deviceMinor()
const
55QString WinBlock::device()
const
57 return driveLetterFromUdi(m_device->udi());
60QStringList WinBlock::drivesFromMask(
const DWORD unitmask)
63 DWORD localUnitmask(unitmask);
64 for (
int i = 0; i <= 25; ++i) {
65 if (0x01 == (localUnitmask & 0x1)) {
66 result << QStringLiteral(
"%1:").arg((
char)(i +
'A'));
73QSet<QString> WinBlock::getUdis()
75 return updateUdiFromBitMask(GetLogicalDrives());
78QString WinBlock::driveLetterFromUdi(
const QString &udi)
80 if (!m_driveLetters.contains(udi)) {
81 qWarning() << udi <<
"is not connected to a drive";
83 return m_driveLetters[udi];
86QString WinBlock::udiFromDriveLetter(
const QString &drive)
89 for (QMap<QString, QString>::const_iterator it = m_driveLetters.cbegin(); it != m_driveLetters.cend(); ++it) {
90 if (it.value() == drive) {
98QString WinBlock::resolveVirtualDrive(
const QString &drive)
100 return m_virtualDrives[drive];
103QSet<QString> WinBlock::updateUdiFromBitMask(
const DWORD unitmask)
105 const QStringList drives = drivesFromMask(unitmask);
107 wchar_t driveWCHAR[MAX_PATH];
108 wchar_t bufferOut[MAX_PATH];
110 for (
const QString &drive : drives) {
113 if (GetDriveType(driveWCHAR) == DRIVE_REMOTE) {
115 QString
path = settings.value(
"RemotePath").toString();
117 QString key = QLatin1String(
"/org/kde/solid/win/volume.virtual/") + drive.
at(0);
118 m_virtualDrives[key] =
path;
123 QueryDosDeviceW(driveWCHAR, bufferOut, MAX_PATH);
125 if (dosPath.
startsWith(QLatin1String(
"\\??\\"))) {
126 dosPath = dosPath.
mid(4);
127 QString key = QLatin1String(
"/org/kde/solid/win/volume.virtual/") + drive.
at(0);
128 m_virtualDrives[key] = dosPath;
131 STORAGE_DEVICE_NUMBER info = WinDeviceManager::getDeviceInfo<STORAGE_DEVICE_NUMBER>(drive, IOCTL_STORAGE_GET_DEVICE_NUMBER);
133 switch (info.DeviceType) {
134 case FILE_DEVICE_DISK: {
135 udis << QStringLiteral(
"/org/kde/solid/win/volume/disk#%1,partition#%2").arg(info.DeviceNumber).arg(info.PartitionNumber);
136 udis << QStringLiteral(
"/org/kde/solid/win/storage/disk#%1").arg(info.DeviceNumber);
139 case FILE_DEVICE_CD_ROM:
140 case FILE_DEVICE_DVD: {
141 udis << QStringLiteral(
"/org/kde/solid/win/storage.cdrom/disk#%1").arg(info.DeviceNumber);
142 DISK_GEOMETRY_EX out = WinDeviceManager::getDeviceInfo<DISK_GEOMETRY_EX>(drive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX);
143 if (out.DiskSize.QuadPart != 0) {
144 udis << QStringLiteral(
"/org/kde/solid/win/volume.cdrom/disk#%1").arg(info.DeviceNumber);
149 qDebug() <<
"unknown device" << drive << info.DeviceType << info.DeviceNumber << info.PartitionNumber;
153 m_driveUDIS[drive] = udis;
154 for (
const QString &str : std::as_const(udis)) {
155 m_driveLetters[str] = drive;
162QSet<QString> WinBlock::getFromBitMask(
const DWORD unitmask)
165 const QStringList drives = drivesFromMask(unitmask);
166 for (
const QString &drive : drives) {
167 if (m_driveUDIS.contains(drive)) {
168 list += m_driveUDIS[drive];
171 return updateUdiFromBitMask(unitmask);
177#include "moc_winblock.cpp"
QString path(const QString &relativePath)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
const QChar at(qsizetype position) const const
QString fromWCharArray(const wchar_t *string, qsizetype size)
bool isEmpty() const const
QString mid(qsizetype position, qsizetype n) const const
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
qsizetype toWCharArray(wchar_t *array) const const