File indexing completed on 2024-12-08 05:10:25
0001 /* 0002 SPDX-FileCopyrightText: 2017 Adriaan de Groot <groot@kde.org> 0003 SPDX-FileCopyrightText: 2017 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/devicescanner.h" 0017 #include "core/operationstack.h" 0018 #include "core/partition.h" 0019 #include "util/capacity.h" 0020 0021 #include <QCoreApplication> 0022 #include <QDebug> 0023 #include <QList> 0024 0025 #include <memory> 0026 0027 using PartitionList = QList<Partition *>; 0028 0029 // Recursive helper for flatten(), adds partitions that 0030 // are children of @p n to the list @p l. 0031 void _flatten(PartitionList& l, PartitionNode *n) 0032 { 0033 for (const auto &p : n->children()) { 0034 l.append(p); 0035 0036 if (p->roles().has(PartitionRole::Extended)) { 0037 _flatten(l, p); 0038 } 0039 } 0040 } 0041 0042 /** 0043 * Recursively walk the partition table and collect all the partitions 0044 * in it (also in extended partitions). Produces a sorted list. 0045 */ 0046 PartitionList flatten(PartitionTable *table) 0047 { 0048 PartitionList l; 0049 _flatten(l, table); 0050 std::sort(l.begin(), l.end(), 0051 [](const Partition* p1, const Partition* p2) { return p1->number() < p2->number(); }); 0052 return l; 0053 } 0054 0055 int main( int argc, char **argv ) 0056 { 0057 QCoreApplication app(argc, argv); 0058 std::unique_ptr<KPMCoreInitializer> i; 0059 0060 if (argc != 2) { 0061 i = std::make_unique<KPMCoreInitializer>(); 0062 if (!i->isValid()) 0063 return 1; 0064 } else { 0065 i = std::make_unique<KPMCoreInitializer>( argv[1] ); 0066 if (!i->isValid()) 0067 return 1; 0068 } 0069 0070 auto backend = CoreBackendManager::self()->backend(); 0071 0072 if (!backend) { 0073 qWarning() << "Could not get backend."; 0074 return 1; 0075 } 0076 0077 // First create operationStack with another QObject as parent. 0078 OperationStack *operationStack = new OperationStack(); 0079 DeviceScanner *deviceScanner = new DeviceScanner(nullptr, *operationStack); 0080 deviceScanner->scan(); 0081 0082 const auto devices = operationStack->previewDevices(); 0083 qDebug() << "Found" << devices.length() << "devices."; 0084 0085 for (const auto &pdev : devices) { 0086 qDebug() << "Device @" << (void *)pdev; 0087 qDebug() << " " << pdev->prettyName(); 0088 0089 const auto partitiontable = pdev->partitionTable(); 0090 qDebug() << " Partition Table @" << (void *)partitiontable << '(' 0091 << (partitiontable ? partitiontable->typeName() : QLatin1String("null")) << ')'; 0092 0093 const auto partitionlist = flatten(partitiontable); 0094 for (const auto &p : partitionlist) 0095 qDebug() << " " 0096 << p->number() 0097 << p->partitionPath() 0098 << p->label() 0099 << Capacity::formatByteSize(p->capacity()) 0100 << p->fileSystem().name(); 0101 } 0102 0103 return 0; 0104 } 0105