-
Notifications
You must be signed in to change notification settings - Fork 0
/
device.h
161 lines (132 loc) · 5.31 KB
/
device.h
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*******************************************************************************
*
* HDDTest the graphical drive benchmarking tool.
* Copyright (C) 2011 Vladimír Matěna <[email protected]>
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
********************************************************************************/
/**
* \class Device
*
* This class provides abstraction to block device.
* It contains methods for:
* 1. querying and storing information about device
* 2. running basic benchmark operations (timed reading, writing, ...)
* Class can be used to access block device or regular file
*
* \author Vladimír Matěna [email protected]
*
*/
#pragma once
#include <fcntl.h>
#include <linux/hdreg.h>
#include <sys/ioctl.h>
#include <mntent.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <QtCore>
#include <QMessageBox>
#include <QtXml>
#include "definitions.h"
#include "timer.h"
using namespace HDDTest;
/// Class for device manipulation via device file
class Device: public QObject {
Q_OBJECT
public:
/// Stores one item in device selection combobox
struct Item {
/// Item type enumeration
enum class Type { DEVICE, RESULT, NOTHING };
/// Constructor for empty item
Item():
type(Type::NOTHING), path("") {}
/// Constructor for type and path specified
Item(Type type, QString path):
type(type), path(path), label(path) {}
/// Constructor for type, path and label specified
Item(Type type, QString path, QString label):
type(type), path(path), label(label) {}
/// Construct from QStorageInfo
Item(QStorageInfo info);
static Item None(); /// Returns item of none type
static Item Saved(QString path);/// Returns item of saved type
Type type {}; /// Item type
QString path {}; /// Item path
QString label {}; /// Item label
QStorageInfo info {}; /// Qt storage info
};
Device(); /// Device constructor
~Device(); /// Device destructor - close device file descriptor
// device listing
QList<Item> GetDevices(); /// Gets list of devices
// device access operations
void Open(Item device, bool close); /// Opens device specified by path
void Close(); /// Close device file descriptor
void DropCaches(); /// Disables some caches for device
hddtime Sync(); /// Sync filesystem
void Warmup(); /// Make device redy for operation
void DriveInfo(); /// Read driveinfo from device
void EraseDriveInfo(); /// Erase drive info to default values
// raw disk operations
void SetPos(hddsize pos); /// Set actual position
hddtime SeekTo(hddsize pos); /// Seek to position returns operation time
hddtime Read(hddsize size); /// Read data at current position and return operation time
hddtime ReadAt(hddsize size, hddsize pos); /// Read data at position return operation time
hddsize GetSize(); /// Get size of drive
// fs operations
hddtime MkDir(QString path); /// Makes new directory in temp and returns operation time
hddtime MkFile(QString path, hddsize size); /// Makes new file in temp and return operation time
hddtime DelFile(QString path); /// Delete file from temp and return operation time
hddtime DelDir(QString path); /// Delete dir from tmp path and return operation time
hddtime ReadFile(QString path); /// Reads file and return operation time
Timer timer; /// Timer for device operation measuring
// temp directory operations
QString GetSafeTemp(); /// Prepares and returns path to temp for FS tests
void ClearSafeTemp(); /// Clears temp
// drive info
QStorageInfo info; /// Qt storage info
QString path; /// Path to device
QString model; /// model of the device
QString serial; /// Serial number of the device
QString firmware; /// Firmware version of the device
hddsize size; /// Device capacity
// fs info
bool fs; /// Whenever the device is mounted
QString mountpoint; /// Where mounted
QString fstype; /// Filesystem type
QString fsversion; /// Fileystem version
QString fsoptions; /// Filesystem options
// kernel info
QString kernel; /// Kernel identification string
QDomElement WriteInfo(QDomDocument &doc); /// Store information to XML element
void ReadInfo(QDomElement &root); /// Read information from XML element
private:
void ReportWarning(); /// Reports a problem with accessing device
void ReportError(); /// Reports error in test
// Device's file destriptor
int fd;
// Device's size
hddsize device_size;
// Whenever device access problem was reported
bool problemReported;
// UDisks2 DBus connection
// QDBusInterface *udisks;
signals:
void accessWarning();
void operationError();
void udisksUpdate();
};
Q_DECLARE_METATYPE(Device::Item)