Reuse the d-pointer of the base class Device for the child class DiskDevice.

This commit is contained in:
Andrius Štikonas 2018-04-09 00:34:45 +01:00
parent 210dea15de
commit df364bdc7c
5 changed files with 49 additions and 22 deletions

View File

@ -48,6 +48,30 @@ Device::Device(const QString& name,
d->m_Type = type; d->m_Type = type;
} }
/** Constructs a Device with an empty PartitionTable.
@param name the Device's name, usually some string defined by the manufacturer
@param deviceNode the Device's node, for example "/dev/sda"
*/
Device::Device(std::shared_ptr<DevicePrivate> d_ptr,
const QString& name,
const QString& deviceNode,
const qint64 logicalSectorSize,
const qint64 totalLogicalSectors,
const QString& iconName,
Device::Type type)
: QObject()
, d(d_ptr)
{
d->m_Name = name.length() > 0 ? name : i18n("Unknown Device");
d->m_DeviceNode = deviceNode;
d->m_LogicalSectorSize = logicalSectorSize;
d->m_TotalLogical = totalLogicalSectors;
d->m_PartitionTable = nullptr;
d->m_IconName = iconName.isEmpty() ? QStringLiteral("drive-harddisk") : iconName;
d->m_SmartStatus = type == Device::Disk_Device ? std::make_shared<SmartStatus>(deviceNode) : nullptr;
d->m_Type = type;
}
/** Copy constructor for Device. /** Copy constructor for Device.
* @param other the other Device. * @param other the other Device.
*/ */

View File

@ -29,7 +29,7 @@ class PartitionTable;
class CreatePartitionTableOperation; class CreatePartitionTableOperation;
class CoreBackend; class CoreBackend;
class SmartStatus; class SmartStatus;
struct DevicePrivate; class DevicePrivate;
/** A device description. /** A device description.
@ -60,11 +60,12 @@ public:
protected: protected:
explicit Device(const QString& name, const QString& deviceNode, const qint64 logicalSectorSize, const qint64 totalLogicalSectors, const QString& iconName = QString(), Device::Type type = Device::Disk_Device); explicit Device(const QString& name, const QString& deviceNode, const qint64 logicalSectorSize, const qint64 totalLogicalSectors, const QString& iconName = QString(), Device::Type type = Device::Disk_Device);
explicit Device(std::shared_ptr<DevicePrivate> d_ptr, const QString& name, const QString& deviceNode, const qint64 logicalSectorSize, const qint64 totalLogicalSectors, const QString& iconName = QString(), Device::Type type = Device::Disk_Device);
public: public:
explicit Device(const Device& other); explicit Device(const Device& other);
virtual ~Device(); virtual ~Device();
public:
virtual bool operator==(const Device& other) const; virtual bool operator==(const Device& other) const;
virtual bool operator!=(const Device& other) const; virtual bool operator!=(const Device& other) const;

View File

@ -24,8 +24,9 @@
class PartitionTable; class PartitionTable;
class SmartStatus; class SmartStatus;
struct DevicePrivate class DevicePrivate
{ {
public:
QString m_Name; QString m_Name;
QString m_DeviceNode; QString m_DeviceNode;
qint64 m_LogicalSectorSize; qint64 m_LogicalSectorSize;

View File

@ -17,6 +17,7 @@
*************************************************************************/ *************************************************************************/
#include "core/diskdevice.h" #include "core/diskdevice.h"
#include "core/device_p.h"
#include "core/partitiontable.h" #include "core/partitiontable.h"
#include "core/smartstatus.h" #include "core/smartstatus.h"
@ -39,7 +40,11 @@
#define BLKPBSZGET _IO(0x12,123)/* get block physical sector size */ #define BLKPBSZGET _IO(0x12,123)/* get block physical sector size */
#endif #endif
struct DiskDevicePrivate { #define d_ptr std::static_pointer_cast<DiskDevicePrivate>(d)
class DiskDevicePrivate : public DevicePrivate
{
public:
qint32 m_Heads; qint32 m_Heads;
qint32 m_SectorsPerTrack; qint32 m_SectorsPerTrack;
qint32 m_Cylinders; qint32 m_Cylinders;
@ -94,47 +99,46 @@ DiskDevice::DiskDevice(const QString& name,
qint32 cylinders, qint32 cylinders,
qint64 sectorSize, qint64 sectorSize,
const QString& iconName) const QString& iconName)
: Device(name, deviceNode, sectorSize, (static_cast<qint64>(heads) * cylinders * numSectors), iconName, Device::Disk_Device) : Device(std::make_shared<DiskDevicePrivate>(), name, deviceNode, sectorSize, (static_cast<qint64>(heads) * cylinders * numSectors), iconName, Device::Disk_Device)
, d(std::make_unique<DiskDevicePrivate>())
{ {
d->m_Heads = heads; d_ptr->m_Heads = heads;
d->m_SectorsPerTrack = numSectors; d_ptr->m_SectorsPerTrack = numSectors;
d->m_Cylinders = cylinders; d_ptr->m_Cylinders = cylinders;
d->m_LogicalSectorSize = sectorSize; d_ptr->m_LogicalSectorSize = sectorSize;
d->m_PhysicalSectorSize = getPhysicalSectorSize(deviceNode); d_ptr->m_PhysicalSectorSize = getPhysicalSectorSize(deviceNode);
} }
qint32 DiskDevice::heads() const qint32 DiskDevice::heads() const
{ {
return d->m_Heads; return d_ptr->m_Heads;
} }
qint32 DiskDevice::cylinders() const qint32 DiskDevice::cylinders() const
{ {
return d->m_Cylinders; return d_ptr->m_Cylinders;
} }
qint32 DiskDevice::sectorsPerTrack() const qint32 DiskDevice::sectorsPerTrack() const
{ {
return d->m_SectorsPerTrack; return d_ptr->m_SectorsPerTrack;
} }
qint64 DiskDevice::physicalSectorSize() const qint64 DiskDevice::physicalSectorSize() const
{ {
return d->m_PhysicalSectorSize; return d_ptr->m_PhysicalSectorSize;
} }
qint64 DiskDevice::logicalSectorSize() const qint64 DiskDevice::logicalSectorSize() const
{ {
return d->m_LogicalSectorSize; return d_ptr->m_LogicalSectorSize;
} }
qint64 DiskDevice::totalSectors() const qint64 DiskDevice::totalSectors() const
{ {
return static_cast<qint64>(d->m_Heads) * d->m_Cylinders * d->m_SectorsPerTrack; return static_cast<qint64>(d_ptr->m_Heads) * d_ptr->m_Cylinders * d_ptr->m_SectorsPerTrack;
} }
qint64 DiskDevice::cylinderSize() const qint64 DiskDevice::cylinderSize() const
{ {
return static_cast<qint64>(d->m_Heads) * d->m_SectorsPerTrack; return static_cast<qint64>(d_ptr->m_Heads) * d_ptr->m_SectorsPerTrack;
} }

View File

@ -32,7 +32,7 @@ class PartitionTable;
class CreatePartitionTableOperation; class CreatePartitionTableOperation;
class CoreBackend; class CoreBackend;
class SmartStatus; class SmartStatus;
struct DiskDevicePrivate; class DiskDevicePrivate;
/** A disk device. /** A disk device.
@ -91,9 +91,6 @@ public:
* @return the size of a cylinder on this Device in sectors * @return the size of a cylinder on this Device in sectors
*/ */
qint64 cylinderSize() const; qint64 cylinderSize() const;
private:
std::unique_ptr<DiskDevicePrivate> d;
}; };
#endif #endif