File indexing completed on 2024-04-14 05:39:12

0001 /*
0002     SPDX-FileCopyrightText: 2017 Adriaan de Groot <groot@kde.org>
0003     SPDX-FileCopyrightText: 2017-2019 Andrius Štikonas <andrius@stikonas.eu>
0004     SPDX-FileCopyrightText: 2019 Shubham Jangra <aryan100jangid@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-3.0-or-later
0007 */
0008 
0009 // Lists devices
0010 
0011 #include "helpers.h"
0012 
0013 #include "backend/corebackend.h"
0014 #include "backend/corebackendmanager.h"
0015 #include "core/device.h"
0016 #include "core/partition.h"
0017 #include "util/capacity.h"
0018 
0019 #include <QCoreApplication>
0020 #include <QDebug>
0021 #include <QList>
0022 
0023 #include <memory>
0024 
0025 using PartitionList = QList<Partition *>;
0026 
0027 // Recursive helper for flatten(), adds partitions that
0028 // are children of @p n to the list @p l.
0029 void _flatten(PartitionList& l, PartitionNode *n)
0030 {
0031     for (const auto &p : n->children()) {
0032         l.append(p);
0033 
0034         if (p->roles().has(PartitionRole::Extended)) {
0035             _flatten(l, p);
0036         }
0037     }
0038 }
0039 
0040 /**
0041  * Recursively walk the partition table and collect all the partitions
0042  * in it (also in extended partitions). Produces a sorted list.
0043  */
0044 PartitionList flatten(PartitionTable *table)
0045 {
0046     PartitionList l;
0047     _flatten(l, table);
0048     std::sort(l.begin(), l.end(),
0049                 [](const Partition* p1, const Partition* p2) { return p1->number() < p2->number(); });
0050     return l;
0051 }
0052 
0053 int main( int argc, char **argv )
0054 {
0055     QCoreApplication app(argc, argv);
0056     std::unique_ptr<KPMCoreInitializer> i;
0057 
0058     if (argc != 2) {
0059         i = std::make_unique<KPMCoreInitializer>();
0060         if (!i->isValid())
0061             return 1;
0062     } else {
0063         i = std::make_unique<KPMCoreInitializer>( argv[1] );
0064         if (!i->isValid())
0065             return 1;
0066     }
0067 
0068     auto backend = CoreBackendManager::self()->backend();
0069 
0070     if (!backend) {
0071         qWarning() << "Could not get backend.";
0072         return 1;
0073     }
0074 
0075     const auto devices = backend->scanDevices(ScanFlag::includeLoopback);
0076     qDebug() << "Found" << devices.length() << "devices.";
0077 
0078     for (const auto &pdev : devices) {
0079         qDebug() << "Device @" << (void *)pdev;
0080         qDebug() << "  " << pdev->prettyName();
0081 
0082         const auto partitiontable = pdev->partitionTable();
0083         qDebug() << "    Partition Table @" << (void *)partitiontable << '('
0084             << (partitiontable ? partitiontable->typeName() : QLatin1String("null")) << ')';
0085 
0086         const auto partitionlist = flatten(partitiontable);
0087         for (const auto &p : partitionlist)
0088             qDebug() << "      "
0089             << p->number()
0090             << p->partitionPath()
0091             << p->label()
0092             << Capacity::formatByteSize(p->capacity())
0093             << p->fileSystem().name();
0094     }
0095 
0096     return 0;
0097 }
0098