Skip to content

Commit

Permalink
Implement deleting LVs
Browse files Browse the repository at this point in the history
  • Loading branch information
vicr123 committed Aug 16, 2023
1 parent 37a77b4 commit 013a552
Show file tree
Hide file tree
Showing 18 changed files with 769 additions and 298 deletions.
1 change: 1 addition & 0 deletions application/diskpane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,5 @@ void DiskPane::on_checkButton_clicked() {
}

void DiskPane::on_deleteButton_clicked() {
DiskOperationManager::showDiskOperationUi(this->window(), DiskOperationManager::Delete, d->disk);
}
3 changes: 2 additions & 1 deletion libthefrisbee/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ file(GLOB DRIVEOBJECT_HEADERS DriveObjects/*.h)

set(HEADERS ${ROOT_HEADERS} ${DRIVEOBJECT_HEADERS} ${STRUCTURES_HEADERS})

add_library(libthefrisbee SHARED ${SOURCES} ${HEADERS})
add_library(libthefrisbee SHARED ${SOURCES} ${HEADERS}
operations/removelvpopover.h operations/removelvpopover.cpp operations/removelvpopover.ui)
set_target_properties(libthefrisbee PROPERTIES
CNTP_DATA_SUBDIR thefrisbee/libthefrisbee)
cntp_init(libthefrisbee 20)
Expand Down
15 changes: 15 additions & 0 deletions libthefrisbee/DriveObjects/logicalvolume.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
#include "logicalvolume.h"

#include "driveobjectmanager.h"
#include "frisbeeexception.h"
#include <QCoroDBusPendingCall>
#include <QDBusConnection>
#include <QDBusMessage>

struct LogicalVolumePrivate {
QDBusObjectPath path;

QDBusObjectPath vg;
QDBusObjectPath block;
QString name;
Expand All @@ -11,6 +17,7 @@ struct LogicalVolumePrivate {
LogicalVolume::LogicalVolume(QDBusObjectPath path, QObject* parent) :
UdisksInterface{path, interfaceName(), parent} {
d = new LogicalVolumePrivate();
d->path = path;

bindPropertyUpdater("Name", [this](QVariant value) {
d->name = value.toString();
Expand Down Expand Up @@ -42,3 +49,11 @@ VolumeGroup* LogicalVolume::vg() {
DiskObject* LogicalVolume::block() {
return DriveObjectManager::diskForPath(d->block);
}

QCoro::Task<> LogicalVolume::deleteLogicalVolume(QVariantMap options) {
QDBusMessage message = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", d->path.path(), interfaceName(), "Delete");
message.setArguments({options});
auto call = QDBusConnection::systemBus().asyncCall(message);
auto reply = co_await call;
if (call.isError()) throw FrisbeeException(call.error().message());
}
3 changes: 3 additions & 0 deletions libthefrisbee/DriveObjects/logicalvolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define LOGICALVOLUME_H

#include "udisksinterface.h"
#include <QCoroTask>

struct LogicalVolumePrivate;
class VolumeGroup;
Expand All @@ -17,6 +18,8 @@ class LogicalVolume : public UdisksInterface {
VolumeGroup* vg();
DiskObject* block();

QCoro::Task<> deleteLogicalVolume(QVariantMap options);

private:
LogicalVolumePrivate* d;
};
Expand Down
28 changes: 26 additions & 2 deletions libthefrisbee/diskoperationmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "diskoperationmanager.h"

#include <DriveObjects/blockinterface.h>
#include <DriveObjects/blocklvm2interface.h>
#include <DriveObjects/driveinterface.h>
#include <DriveObjects/filesysteminterface.h>
#include <DriveObjects/partitioninterface.h>
Expand All @@ -38,6 +39,7 @@
#include <operations/erasepartitiontablepopover.h>
#include <operations/imagepopover.h>
#include <operations/partitionpopover.h>
#include <operations/removelvpopover.h>
#include <operations/restoreopticalpopover.h>

struct OperationManagerPrivate {
Expand All @@ -50,15 +52,17 @@ QMap<DiskOperationManager::DiskOperation, QString> OperationManagerPrivate::oper
{DiskOperationManager::Image, "image" },
{DiskOperationManager::Restore, "restore" },
{DiskOperationManager::Partition, "partition"},
{DiskOperationManager::AttachPv, "attachPv" }
{DiskOperationManager::AttachPv, "attachPv" },
{DiskOperationManager::Delete, "delete" }
};

QMap<DiskOperationManager::DiskOperation, QString> OperationManagerPrivate::operationDescriptions = {
{DiskOperationManager::Erase, DiskOperationManager::tr("Erase a block device") },
{DiskOperationManager::Image, DiskOperationManager::tr("Create an image of a block device") },
{DiskOperationManager::Restore, DiskOperationManager::tr("Restore an image back to a block device or disc")},
{DiskOperationManager::Partition, DiskOperationManager::tr("Edit partitions on a filesystem") },
{DiskOperationManager::AttachPv, DiskOperationManager::tr("Attach a Physical Volume to a Volume Group") }
{DiskOperationManager::AttachPv, DiskOperationManager::tr("Attach a Physical Volume to a Volume Group") },
{DiskOperationManager::AttachPv, DiskOperationManager::tr("Delete a volume") }
};

DiskOperationManager::DiskOperation DiskOperationManager::operationForString(QString operationString) {
Expand Down Expand Up @@ -93,6 +97,9 @@ void DiskOperationManager::showDiskOperationUi(QWidget* parent, DiskOperation op
break;
case DiskOperationManager::AttachPv:
showAttachPvOperationUi(parent, disk);
break;
case DiskOperationManager::Delete:
showDeleteOperationUi(parent, disk);
}
}

Expand Down Expand Up @@ -287,6 +294,23 @@ void DiskOperationManager::showAttachPvOperationUi(QWidget* parent, DiskObject*
popover->show(parent->window());
}

void DiskOperationManager::showDeleteOperationUi(QWidget* parent, DiskObject* disk) {
if (disk->isInterfaceAvailable(DiskInterface::BlockLvm2)) {
auto blockLvm2 = disk->interface<BlockLvm2Interface>();
auto pv = blockLvm2->logicalVolume();
if (pv) {
auto* jp = new RemoveLvPopover(pv);
tPopover* popover = new tPopover(jp);
popover->setPopoverWidth(-200);
popover->setPopoverSide(tPopover::Bottom);
connect(jp, &RemoveLvPopover::done, popover, &tPopover::dismiss);
connect(popover, &tPopover::dismissed, popover, &tPopover::deleteLater);
connect(popover, &tPopover::dismissed, jp, &RemoveLvPopover::deleteLater);
popover->show(parent->window());
}
}
}

bool DiskOperationManager::ensureOpticalUtilitiesInstalled(QWidget* parent) {
if (QStandardPaths::findExecutable("cdrecord").isEmpty()) {
QMessageBox* box = new QMessageBox();
Expand Down
2 changes: 2 additions & 0 deletions libthefrisbee/diskoperationmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class LIBTHEFRISBEE_EXPORT DiskOperationManager : public QObject {
Image,
Partition,
AttachPv,
Delete,
LastOperation = Partition
};

Expand All @@ -53,6 +54,7 @@ class LIBTHEFRISBEE_EXPORT DiskOperationManager : public QObject {
static void showImageOperationUi(QWidget* parent, DiskObject* disk);
static void showPartitionOperationUi(QWidget* parent, DiskObject* disk);
static void showAttachPvOperationUi(QWidget* parent, DiskObject* disk);
static void showDeleteOperationUi(QWidget* parent, DiskObject* disk);
};

#endif // DISKOPERATIONMANAGER_H
14 changes: 7 additions & 7 deletions libthefrisbee/operations/eraseopticalpopover.ui
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,9 @@
<widget class="QWidget" name="optionsWidget" native="true">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<widget class="tSubtitleLabel" name="label">
<property name="text">
<string>ERASE OPTIONS</string>
<string>Erase Options</string>
</property>
</widget>
</item>
Expand Down Expand Up @@ -226,6 +221,11 @@
<signal>backButtonClicked()</signal>
</slots>
</customwidget>
<customwidget>
<class>tSubtitleLabel</class>
<extends>QLabel</extends>
<header location="global">tsubtitlelabel.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
Expand Down
35 changes: 35 additions & 0 deletions libthefrisbee/operations/removelvpopover.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "removelvpopover.h"
#include "ui_removelvpopover.h"

#include "DriveObjects/logicalvolume.h"
#include <tcontentsizer.h>

struct RemoveLvPopoverPrivate {
LogicalVolume* lv;
};

RemoveLvPopover::RemoveLvPopover(LogicalVolume* lv, QWidget* parent) :
QWidget(parent),
ui(new Ui::RemoveLvPopover) {
ui->setupUi(this);
d = new RemoveLvPopoverPrivate();
d->lv = lv;

new tContentSizer(ui->optionsWidget);

ui->deleteButton->setProperty("type", "destructive");
}

RemoveLvPopover::~RemoveLvPopover() {
delete d;
delete ui;
}

void RemoveLvPopover::on_titleLabel_backButtonClicked() {
emit done();
}

void RemoveLvPopover::on_deleteButton_clicked() {
d->lv->deleteLogicalVolume({});
emit done();
}
32 changes: 32 additions & 0 deletions libthefrisbee/operations/removelvpopover.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef REMOVELVPOPOVER_H
#define REMOVELVPOPOVER_H

#include <QWidget>

namespace Ui {
class RemoveLvPopover;
}

class LogicalVolume;
struct RemoveLvPopoverPrivate;
class RemoveLvPopover : public QWidget {
Q_OBJECT

public:
explicit RemoveLvPopover(LogicalVolume* lv, QWidget* parent = nullptr);
~RemoveLvPopover();

signals:
void done();

private slots:
void on_titleLabel_backButtonClicked();

void on_deleteButton_clicked();

private:
Ui::RemoveLvPopover* ui;
RemoveLvPopoverPrivate* d;
};

#endif // REMOVELVPOPOVER_H
102 changes: 102 additions & 0 deletions libthefrisbee/operations/removelvpopover.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RemoveLvPopover</class>
<widget class="QWidget" name="RemoveLvPopover">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>689</width>
<height>483</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="tTitleLabel" name="titleLabel">
<property name="text">
<string>Delete Logical Volume</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignHCenter">
<widget class="QWidget" name="optionsWidget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="tSubtitleLabel" name="label">
<property name="text">
<string>This is it!</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>There's no going back after this. Once the logical volume is deleted, all the data on it will be gone forever.</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="deleteButton">
<property name="text">
<string>Delete Logical Volume</string>
</property>
<property name="icon">
<iconset theme="edit-delete">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>378</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>tTitleLabel</class>
<extends>QLabel</extends>
<header location="global">ttitlelabel.h</header>
<slots>
<signal>backButtonClicked()</signal>
</slots>
</customwidget>
<customwidget>
<class>tSubtitleLabel</class>
<extends>QLabel</extends>
<header location="global">tsubtitlelabel.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
Loading

0 comments on commit 013a552

Please sign in to comment.