-
Notifications
You must be signed in to change notification settings - Fork 39
/
diskwriter_udisks2.cpp
79 lines (64 loc) · 2.1 KB
/
diskwriter_udisks2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
////////////////////////////////////////////////////////////////////////////////
// This file is part of LibreELEC - http://www.libreelec.tv
// Copyright (C) 2016 Team LibreELEC
//
// LibreELEC is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// LibreELEC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
#include "diskwriter_udisks2.h"
namespace
{
constexpr auto UDISKS2_SERVICE{"org.freedesktop.UDisks2"};
constexpr auto UDISKS2_BLOCK_INTERFACE{"org.freedesktop.UDisks2.Block"};
}
DiskWriter_udisks2::DiskWriter_udisks2(QObject *parent) :
DiskWriter(parent),
connection(QDBusConnection::systemBus())
{
isCancelled = false;
}
DiskWriter_udisks2::~DiskWriter_udisks2()
{
if (isOpen())
close();
}
bool DiskWriter_udisks2::open(const QString& device)
{
QDBusInterface blockInterface{UDISKS2_SERVICE, device, UDISKS2_BLOCK_INTERFACE, connection};
if (!blockInterface.isValid())
return false;
QMap<QString, QVariant> options{};
QDBusReply<QDBusUnixFileDescriptor> reply = blockInterface.call("OpenDevice", "w", options);
if (!reply.isValid())
{
return false;
}
fd = reply.value();
return fd.isValid();
}
void DiskWriter_udisks2::close()
{
::close(fd.fileDescriptor());
}
void DiskWriter_udisks2::sync()
{
fsync(fd.fileDescriptor());
}
bool DiskWriter_udisks2::isOpen()
{
return fd.isValid();
}
bool DiskWriter_udisks2::write(const QByteArray &data)
{
return ::write(fd.fileDescriptor(), data.data(), data.size()) == data.size();
}