Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Plasma
libksysguard
Commits
5ba60c0a
Commit
5ba60c0a
authored
Mar 30, 2021
by
Arjen Hiemstra
Browse files
Use a d pointer for all classes in the systemstats lib
parent
fbb35156
Changes
12
Hide whitespace changes
Inline
Side-by-side
systemstats/AggregateSensor.cpp
View file @
5ba60c0a
...
...
@@ -75,44 +75,56 @@ QVariant addVariants(const QVariant &first, const QVariant &second)
return
result
;
}
class
Q_DECL_HIDDEN
AggregateSensor
::
Private
{
public:
QRegularExpression
matchObjects
;
QString
matchProperty
;
QHash
<
QString
,
QPointer
<
SensorProperty
>>
sensors
;
bool
dataChangeQueued
=
false
;
int
dataCompressionDuration
=
100
;
SensorContainer
*
subsystem
=
nullptr
;
std
::
function
<
QVariant
(
QVariant
,
QVariant
)
>
aggregateFunction
;
};
AggregateSensor
::
AggregateSensor
(
SensorObject
*
provider
,
const
QString
&
id
,
const
QString
&
name
)
:
SensorProperty
(
id
,
name
,
provider
)
,
m_subsystem
(
qobject_cast
<
SensorContainer
*>
(
provider
->
parent
()
))
,
d
(
std
::
make_unique
<
Private
>
(
))
{
m_aggregateFunction
=
addVariants
;
connect
(
m_subsystem
,
&
SensorContainer
::
objectAdded
,
this
,
&
AggregateSensor
::
updateSensors
);
connect
(
m_subsystem
,
&
SensorContainer
::
objectRemoved
,
this
,
&
AggregateSensor
::
updateSensors
);
d
->
subsystem
=
qobject_cast
<
SensorContainer
*>
(
provider
->
parent
());
d
->
aggregateFunction
=
addVariants
;
connect
(
d
->
subsystem
,
&
SensorContainer
::
objectAdded
,
this
,
&
AggregateSensor
::
updateSensors
);
connect
(
d
->
subsystem
,
&
SensorContainer
::
objectRemoved
,
this
,
&
AggregateSensor
::
updateSensors
);
}
AggregateSensor
::~
AggregateSensor
()
{
}
AggregateSensor
::~
AggregateSensor
()
=
default
;
QRegularExpression
AggregateSensor
::
matchSensors
()
const
{
return
m_
matchObjects
;
return
d
->
matchObjects
;
}
QVariant
AggregateSensor
::
value
()
const
{
if
(
m_
sensors
.
isEmpty
())
{
if
(
d
->
sensors
.
isEmpty
())
{
return
QVariant
();
}
auto
it
=
m_
sensors
.
constBegin
();
while
(
!
it
.
value
()
&&
it
!=
m_
sensors
.
constEnd
())
{
auto
it
=
d
->
sensors
.
constBegin
();
while
(
!
it
.
value
()
&&
it
!=
d
->
sensors
.
constEnd
())
{
it
++
;
}
if
(
it
==
m_
sensors
.
constEnd
())
{
if
(
it
==
d
->
sensors
.
constEnd
())
{
return
QVariant
{};
}
QVariant
result
=
it
.
value
()
->
value
();
it
++
;
for
(;
it
!=
m_
sensors
.
constEnd
();
it
++
)
{
for
(;
it
!=
d
->
sensors
.
constEnd
();
it
++
)
{
if
(
it
.
value
())
{
result
=
m_
aggregateFunction
(
result
,
it
.
value
()
->
value
());
result
=
d
->
aggregateFunction
(
result
,
it
.
value
()
->
value
());
}
}
return
result
;
...
...
@@ -123,7 +135,7 @@ void AggregateSensor::subscribe()
bool
wasSubscribed
=
SensorProperty
::
isSubscribed
();
SensorProperty
::
subscribe
();
if
(
!
wasSubscribed
&&
isSubscribed
())
{
for
(
auto
sensor
:
qAsConst
(
m_
sensors
))
{
for
(
auto
sensor
:
qAsConst
(
d
->
sensors
))
{
if
(
sensor
)
{
sensor
->
subscribe
();
}
...
...
@@ -136,7 +148,7 @@ void AggregateSensor::unsubscribe()
bool
wasSubscribed
=
SensorProperty
::
isSubscribed
();
SensorProperty
::
unsubscribe
();
if
(
wasSubscribed
&&
!
isSubscribed
())
{
for
(
auto
sensor
:
qAsConst
(
m_
sensors
))
{
for
(
auto
sensor
:
qAsConst
(
d
->
sensors
))
{
if
(
sensor
)
{
sensor
->
unsubscribe
();
}
...
...
@@ -146,28 +158,28 @@ void AggregateSensor::unsubscribe()
void
AggregateSensor
::
setMatchSensors
(
const
QRegularExpression
&
objectIds
,
const
QString
&
propertyName
)
{
if
(
objectIds
==
m_
matchObjects
&&
propertyName
==
m_
matchProperty
)
{
if
(
objectIds
==
d
->
matchObjects
&&
propertyName
==
d
->
matchProperty
)
{
return
;
}
m_
matchProperty
=
propertyName
;
m_
matchObjects
=
objectIds
;
d
->
matchProperty
=
propertyName
;
d
->
matchObjects
=
objectIds
;
updateSensors
();
}
std
::
function
<
QVariant
(
QVariant
,
QVariant
)
>
AggregateSensor
::
aggregateFunction
()
const
{
return
m_
aggregateFunction
;
return
d
->
aggregateFunction
;
}
void
AggregateSensor
::
setAggregateFunction
(
const
std
::
function
<
QVariant
(
QVariant
,
QVariant
)
>
&
newAggregateFunction
)
{
m_
aggregateFunction
=
newAggregateFunction
;
d
->
aggregateFunction
=
newAggregateFunction
;
}
void
AggregateSensor
::
addSensor
(
SensorProperty
*
sensor
)
{
if
(
!
sensor
||
sensor
->
path
()
==
path
()
||
m_
sensors
.
contains
(
sensor
->
path
()))
{
if
(
!
sensor
||
sensor
->
path
()
==
path
()
||
d
->
sensors
.
contains
(
sensor
->
path
()))
{
return
;
}
...
...
@@ -178,12 +190,12 @@ void AggregateSensor::addSensor(SensorProperty *sensor)
connect
(
sensor
,
&
SensorProperty
::
valueChanged
,
this
,
[
this
,
sensor
]()
{
sensorDataChanged
(
sensor
);
});
m_
sensors
.
insert
(
sensor
->
path
(),
sensor
);
d
->
sensors
.
insert
(
sensor
->
path
(),
sensor
);
}
void
AggregateSensor
::
removeSensor
(
const
QString
&
sensorPath
)
{
auto
sensor
=
m_
sensors
.
take
(
sensorPath
);
auto
sensor
=
d
->
sensors
.
take
(
sensorPath
);
sensor
->
disconnect
(
this
);
if
(
isSubscribed
())
{
sensor
->
unsubscribe
();
...
...
@@ -192,27 +204,27 @@ void AggregateSensor::removeSensor(const QString &sensorPath)
int
AggregateSensor
::
matchCount
()
const
{
return
m_
sensors
.
size
();
return
d
->
sensors
.
size
();
}
void
AggregateSensor
::
updateSensors
()
{
if
(
!
m_
matchObjects
.
isValid
())
{
if
(
!
d
->
matchObjects
.
isValid
())
{
return
;
}
for
(
auto
obj
:
m_
subsystem
->
objects
())
{
if
(
m_
matchObjects
.
match
(
obj
->
id
()).
hasMatch
())
{
auto
sensor
=
obj
->
sensor
(
m_
matchProperty
);
for
(
auto
obj
:
d
->
subsystem
->
objects
())
{
if
(
d
->
matchObjects
.
match
(
obj
->
id
()).
hasMatch
())
{
auto
sensor
=
obj
->
sensor
(
d
->
matchProperty
);
if
(
sensor
)
{
addSensor
(
sensor
);
}
}
}
auto
itr
=
m_
sensors
.
begin
();
while
(
itr
!=
m_
sensors
.
end
())
{
auto
itr
=
d
->
sensors
.
begin
();
while
(
itr
!=
d
->
sensors
.
end
())
{
if
(
!
itr
.
value
())
{
itr
=
m_
sensors
.
erase
(
itr
);
itr
=
d
->
sensors
.
erase
(
itr
);
}
else
{
++
itr
;
}
...
...
@@ -229,51 +241,56 @@ void AggregateSensor::sensorDataChanged(SensorProperty *sensor)
void
AggregateSensor
::
delayedEmitDataChanged
()
{
if
(
!
m_
dataChangeQueued
)
{
m_
dataChangeQueued
=
true
;
QTimer
::
singleShot
(
m_
dataCompressionDuration
,
[
this
]()
{
if
(
!
d
->
dataChangeQueued
)
{
d
->
dataChangeQueued
=
true
;
QTimer
::
singleShot
(
d
->
dataCompressionDuration
,
[
this
]()
{
Q_EMIT
valueChanged
();
m_
dataChangeQueued
=
false
;
d
->
dataChangeQueued
=
false
;
});
}
}
class
Q_DECL_HIDDEN
PercentageSensor
::
Private
{
public:
SensorProperty
*
sensor
=
nullptr
;
};
PercentageSensor
::
PercentageSensor
(
SensorObject
*
provider
,
const
QString
&
id
,
const
QString
&
name
)
:
SensorProperty
(
id
,
name
,
provider
)
,
d
(
std
::
make_unique
<
Private
>
())
{
setUnit
(
KSysGuard
::
UnitPercent
);
setMax
(
100
);
}
PercentageSensor
::~
PercentageSensor
()
{
}
PercentageSensor
::~
PercentageSensor
()
=
default
;
void
PercentageSensor
::
setBaseSensor
(
SensorProperty
*
property
)
{
m_
sensor
=
property
;
d
->
sensor
=
property
;
connect
(
property
,
&
SensorProperty
::
valueChanged
,
this
,
&
PercentageSensor
::
valueChanged
);
connect
(
property
,
&
SensorProperty
::
sensorInfoChanged
,
this
,
&
PercentageSensor
::
valueChanged
);
}
QVariant
PercentageSensor
::
value
()
const
{
if
(
!
m_
sensor
)
{
if
(
!
d
->
sensor
)
{
return
QVariant
();
}
QVariant
value
=
m_
sensor
->
value
();
QVariant
value
=
d
->
sensor
->
value
();
if
(
!
value
.
isValid
())
{
return
QVariant
();
}
return
(
value
.
toReal
()
/
m_
sensor
->
info
().
max
)
*
100.0
;
return
(
value
.
toReal
()
/
d
->
sensor
->
info
().
max
)
*
100.0
;
}
void
PercentageSensor
::
subscribe
()
{
m_
sensor
->
subscribe
();
d
->
sensor
->
subscribe
();
}
void
PercentageSensor
::
unsubscribe
()
{
m_
sensor
->
unsubscribe
();
d
->
sensor
->
unsubscribe
();
}
systemstats/AggregateSensor.h
View file @
5ba60c0a
...
...
@@ -21,6 +21,7 @@
#pragma once
#include <functional>
#include <memory>
#include <QRegularExpression>
#include <QVariant>
...
...
@@ -66,14 +67,8 @@ private:
void
sensorDataChanged
(
SensorProperty
*
sensor
);
void
delayedEmitDataChanged
();
QRegularExpression
m_matchObjects
;
QString
m_matchProperty
;
QHash
<
QString
,
QPointer
<
SensorProperty
>>
m_sensors
;
bool
m_dataChangeQueued
=
false
;
int
m_dataCompressionDuration
=
100
;
SensorContainer
*
m_subsystem
;
std
::
function
<
QVariant
(
QVariant
,
QVariant
)
>
m_aggregateFunction
;
class
Private
;
const
std
::
unique_ptr
<
Private
>
d
;
};
class
Q_DECL_EXPORT
PercentageSensor
:
public
SensorProperty
...
...
@@ -90,7 +85,8 @@ public:
void
setBaseSensor
(
SensorProperty
*
sensor
);
private:
SensorProperty
*
m_sensor
;
class
Private
;
const
std
::
unique_ptr
<
Private
>
d
;
};
}
// namespace KSysGuard
systemstats/SensorContainer.cpp
View file @
5ba60c0a
...
...
@@ -23,36 +23,43 @@
using
namespace
KSysGuard
;
class
Q_DECL_HIDDEN
SensorContainer
::
Private
{
public:
QString
id
;
QString
name
;
QHash
<
QString
,
SensorObject
*>
sensorObjects
;
};
SensorContainer
::
SensorContainer
(
const
QString
&
id
,
const
QString
&
name
,
SensorPlugin
*
parent
)
:
QObject
(
parent
)
,
m_id
(
id
)
,
m_name
(
name
)
,
d
(
std
::
make_unique
<
Private
>
())
{
d
->
id
=
id
;
d
->
name
=
name
;
parent
->
addContainer
(
this
);
}
SensorContainer
::~
SensorContainer
()
{
}
SensorContainer
::~
SensorContainer
()
=
default
;
QString
SensorContainer
::
id
()
const
{
return
m_
id
;
return
d
->
id
;
}
QString
SensorContainer
::
name
()
const
{
return
m_
name
;
return
d
->
name
;
}
QList
<
SensorObject
*>
SensorContainer
::
objects
()
{
return
m_
sensorObjects
.
values
();
return
d
->
sensorObjects
.
values
();
}
SensorObject
*
SensorContainer
::
object
(
const
QString
&
id
)
const
{
return
m_
sensorObjects
.
value
(
id
);
return
d
->
sensorObjects
.
value
(
id
);
}
void
SensorContainer
::
addObject
(
SensorObject
*
object
)
...
...
@@ -60,8 +67,8 @@ void SensorContainer::addObject(SensorObject *object)
object
->
setParentContainer
(
this
);
const
QString
id
=
object
->
id
();
Q_ASSERT
(
!
m_
sensorObjects
.
contains
(
id
));
m_
sensorObjects
[
id
]
=
object
;
Q_ASSERT
(
!
d
->
sensorObjects
.
contains
(
id
));
d
->
sensorObjects
[
id
]
=
object
;
Q_EMIT
objectAdded
(
object
);
connect
(
object
,
&
SensorObject
::
aboutToBeRemoved
,
this
,
[
this
,
object
]()
{
...
...
@@ -71,11 +78,11 @@ void SensorContainer::addObject(SensorObject *object)
void
SensorContainer
::
removeObject
(
SensorObject
*
object
)
{
if
(
!
m_
sensorObjects
.
contains
(
object
->
id
()))
{
if
(
!
d
->
sensorObjects
.
contains
(
object
->
id
()))
{
return
;
}
object
->
setParentContainer
(
nullptr
);
m_
sensorObjects
.
remove
(
object
->
id
());
d
->
sensorObjects
.
remove
(
object
->
id
());
Q_EMIT
objectRemoved
(
object
);
}
systemstats/SensorContainer.h
View file @
5ba60c0a
...
...
@@ -19,6 +19,8 @@
#pragma once
#include <memory>
#include <QObject>
#include "SensorPlugin.h"
...
...
@@ -83,10 +85,8 @@ Q_SIGNALS:
void
objectRemoved
(
SensorObject
*
object
);
private:
QString
m_id
;
QString
m_name
;
QHash
<
QString
,
SensorObject
*>
m_sensorObjects
;
friend
class
SensorObject
;
class
Private
;
const
std
::
unique_ptr
<
Private
>
d
;
};
}
// namespace KSysGuard
systemstats/SensorObject.cpp
View file @
5ba60c0a
...
...
@@ -23,6 +23,16 @@
using
namespace
KSysGuard
;
class
Q_DECL_HIDDEN
SensorObject
::
Private
{
public:
SensorContainer
*
parent
=
nullptr
;
QString
id
;
QString
name
;
QHash
<
QString
,
SensorProperty
*>
sensors
;
};
SensorObject
::
SensorObject
(
const
QString
&
id
,
SensorContainer
*
parent
)
:
SensorObject
(
id
,
QString
(),
parent
)
{
...
...
@@ -30,69 +40,69 @@ SensorObject::SensorObject(const QString &id, SensorContainer *parent)
SensorObject
::
SensorObject
(
const
QString
&
id
,
const
QString
&
name
,
SensorContainer
*
parent
)
:
QObject
(
parent
)
,
m_parent
(
parent
)
,
m_id
(
id
)
,
m_name
(
name
)
,
d
(
std
::
make_unique
<
Private
>
())
{
d
->
parent
=
parent
;
d
->
id
=
id
;
d
->
name
=
name
;
if
(
parent
)
{
parent
->
addObject
(
this
);
parent
->
addObject
(
this
);
}
}
SensorObject
::~
SensorObject
()
{
}
SensorObject
::~
SensorObject
()
=
default
;
QString
SensorObject
::
id
()
const
{
return
m_
id
;
return
d
->
id
;
}
QString
SensorObject
::
name
()
const
{
return
m_
name
;
return
d
->
name
;
}
QString
SensorObject
::
path
()
const
{
if
(
!
m_
parent
)
{
if
(
!
d
->
parent
)
{
return
QString
{};
}
return
m_
parent
->
id
()
%
QLatin1Char
(
'/'
)
%
m_
id
;
return
d
->
parent
->
id
()
%
QLatin1Char
(
'/'
)
%
d
->
id
;
}
void
SensorObject
::
setName
(
const
QString
&
newName
)
{
if
(
newName
==
m_
name
)
{
if
(
newName
==
d
->
name
)
{
return
;
}
m_
name
=
newName
;
d
->
name
=
newName
;
Q_EMIT
nameChanged
();
}
void
SensorObject
::
setParentContainer
(
SensorContainer
*
parent
)
{
m_
parent
=
parent
;
d
->
parent
=
parent
;
}
QList
<
SensorProperty
*>
SensorObject
::
sensors
()
const
{
return
m_
sensors
.
values
();
return
d
->
sensors
.
values
();
}
SensorProperty
*
SensorObject
::
sensor
(
const
QString
&
sensorId
)
const
{
return
m_
sensors
.
value
(
sensorId
);
return
d
->
sensors
.
value
(
sensorId
);
}
void
SensorObject
::
addProperty
(
SensorProperty
*
property
)
{
m_
sensors
[
property
->
id
()]
=
property
;
d
->
sensors
[
property
->
id
()]
=
property
;
connect
(
property
,
&
SensorProperty
::
subscribedChanged
,
this
,
[
=
]()
{
uint
count
=
std
::
count_if
(
m_
sensors
.
constBegin
(),
m_
sensors
.
constEnd
(),
[](
const
SensorProperty
*
prop
)
{
uint
count
=
std
::
count_if
(
d
->
sensors
.
constBegin
(),
d
->
sensors
.
constEnd
(),
[](
const
SensorProperty
*
prop
)
{
return
prop
->
isSubscribed
();
});
if
(
count
==
1
)
{
...
...
@@ -105,7 +115,7 @@ void SensorObject::addProperty(SensorProperty *property)
bool
SensorObject
::
isSubscribed
()
const
{
return
std
::
any_of
(
m_
sensors
.
constBegin
(),
m_
sensors
.
constEnd
(),
[](
const
SensorProperty
*
prop
)
{
return
std
::
any_of
(
d
->
sensors
.
constBegin
(),
d
->
sensors
.
constEnd
(),
[](
const
SensorProperty
*
prop
)
{
return
prop
->
isSubscribed
();
});
}
systemstats/SensorObject.h
View file @
5ba60c0a
...
...
@@ -19,6 +19,8 @@
#pragma once
#include <memory>
#include <QObject>
#include "SensorPlugin.h"
...
...
@@ -76,10 +78,8 @@ Q_SIGNALS:
void
nameChanged
();
private:
SensorContainer
*
m_parent
=
nullptr
;
QString
m_id
;
QString
m_name
;
QHash
<
QString
,
SensorProperty
*>
m_sensors
;
class
Private
;
const
std
::
unique_ptr
<
Private
>
d
;
};
}
// namespace KSysGuard
systemstats/SensorPlugin.cpp
View file @
5ba60c0a
...
...
@@ -21,15 +21,24 @@
using
namespace
KSysGuard
;
class
Q_DECL_HIDDEN
SensorPlugin
::
Private
{
public:
QList
<
SensorContainer
*>
containers
;
};
SensorPlugin
::
SensorPlugin
(
QObject
*
parent
,
const
QVariantList
&
args
)
:
QObject
(
parent
)
,
d
(
std
::
make_unique
<
Private
>
())
{
Q_UNUSED
(
args
)
}
SensorPlugin
::~
SensorPlugin
()
=
default
;
QList
<
SensorContainer
*>
SensorPlugin
::
containers
()
const
{
return
m_
containers
;
return
d
->
containers
;
}
QString
SensorPlugin
::
providerName
()
const
...
...
@@ -43,5 +52,5 @@ void SensorPlugin::update()
void
SensorPlugin
::
addContainer
(
SensorContainer
*
container
)
{
m_
containers
<<
container
;
d
->
containers
<<
container
;
}
systemstats/SensorPlugin.h
View file @
5ba60c0a
...
...
@@ -19,6 +19,8 @@
#pragma once
#include <memory>
#include <QObject>
#include <QVariant>
...
...
@@ -38,7 +40,7 @@ class SYSTEMSTATS_EXPORT SensorPlugin : public QObject
Q_OBJECT
public:
SensorPlugin
(
QObject
*
parent
,
const
QVariantList
&
args
);
~
SensorPlugin
()
=
default
;
~
SensorPlugin
();
/**
A list of all containers provided by this plugin
...
...
@@ -65,7 +67,8 @@ public:
void
addContainer
(
SensorContainer
*
container
);
private:
QList
<
SensorContainer
*>
m_containers
;
class
Private
;
const
std
::
unique_ptr
<
Private
>
d
;
};
}
// namespace KSysGuard
systemstats/SensorProperty.cpp
View file @
5ba60c0a
...
...
@@ -22,6 +22,19 @@
using
namespace
KSysGuard
;
class
Q_DECL_HIDDEN
SensorProperty
::
Private
{
public:
SensorObject
*
parent
=
nullptr
;
SensorInfo
info
;
QString
id
;
QString
name
;
QString
prefix
;
QVariant
value
;
int
subscribers
=
0
;
};
SensorProperty
::
SensorProperty
(
const
QString
&
id
,
SensorObject
*
parent
)
:
SensorProperty
(
id
,
QString
(),
parent
)
{
...
...
@@ -34,9 +47,10 @@ SensorProperty::SensorProperty(const QString &id, const QString &name, SensorObj
SensorProperty
::
SensorProperty
(
const
QString
&
id
,
const
QString
&
name
,
const
QVariant
&
initalValue
,
SensorObject
*
parent
)
:
QObject
(
parent
)
,
m_parent
(
parent
)
,
m_id
(
id
)
,
d
(
std
::
make_unique
<
Private
>
())
{
d
->
id
=
id
;
d
->
parent
=
parent
;
setName
(
name
);
if
(
initalValue
.
isValid
())
{
setValue
(
initalValue
);
...
...
@@ -50,78 +64,78 @@ SensorProperty::~SensorProperty()
SensorInfo
SensorProperty
::
info
()
const
{
return
m_
info
;
return
d
->
info
;
}
QString
SensorProperty
::
id
()
const
{
return
m_
id
;