bool PartitionTable::getUnallocatedRange(const Device& d, PartitionNode& parent, qint64& start, qint64& end) { if (d.type() == Device::Disk_Device) { const DiskDevice& device = dynamic_cast<const DiskDevice&>(d); if (!parent.isRoot()) { Partition* extended = dynamic_cast<Partition*>(&parent); if (extended == nullptr) { qWarning() << "extended is null. start: " << start << ", end: " << end << ", device: " << device.deviceNode(); return false; } // Leave a track (cylinder aligned) or sector alignment sectors (sector based) free at the // start for a new partition's metadata start += device.partitionTable()->type() == PartitionTable::msdos ? device.sectorsPerTrack() : PartitionAlignment::sectorAlignment(device); // .. and also at the end for the metadata for a partition to follow us, if we're not // at the end of the extended partition if (end < extended->lastSector()) end -= device.partitionTable()->type() == PartitionTable::msdos ? device.sectorsPerTrack() : PartitionAlignment::sectorAlignment(device); } return end - start + 1 >= PartitionAlignment::sectorAlignment(device); } else if (d.type() == Device::LVM_Device) { if (end - start + 1 > 0) { return true; } } return false; }
void PartitionIterator::operator++() { if ( !m_current ) return; if ( m_current->hasChildren() ) { // Go to the first child m_current = static_cast< Partition* >( m_current->children().first() ); return; } PartitionNode* parent = m_current->parent(); Partition* successor = parent->successor( *m_current ); if ( successor ) { // Go to the next sibling m_current = successor; return; } if ( parent->isRoot() ) { // We reached the end m_current = nullptr; return; } // Try to go to the next sibling of our parent PartitionNode* grandParent = parent->parent(); Q_ASSERT( grandParent ); // If parent is not root, then it's not a PartitionTable but a // Partition, we can static_cast it. m_current = grandParent->successor( *static_cast< Partition* >( parent ) ); }