Identifier list was filled and more and more identifiers got checked via DBus

- identifier set if only one unique identifer is needed
- using set avoids duplicates and fixes the bug
- restart time if registered, no need to check again
This commit is contained in:
Klaus Basan
2018-08-20 18:15:31 +02:00
parent f1312bbb50
commit b610ff1087
5 changed files with 107 additions and 4 deletions

View File

@@ -163,6 +163,7 @@ namespace BlackCore
CIdentifier CContextApplicationProxy::registerApplication(const CIdentifier &application)
{
m_proxyPingIdentifiers.insert(application);
if (m_pingTimer.isActive()) { m_pingTimer.start(); } // restart, no need to ping again
return m_dBusInterface->callDBusRet<BlackMisc::CIdentifier>(QLatin1String("registerApplication"), application);
}
@@ -210,7 +211,7 @@ namespace BlackCore
{
if (!m_dBusInterface) { return; }
if (m_proxyPingIdentifiers.isEmpty()) { return; }
const CIdentifierList identifiers = m_proxyPingIdentifiers; // copy so member can be modified
const CIdentifierSet identifiers = m_proxyPingIdentifiers; // copy so member can be modified
for (const CIdentifier &identifier : identifiers)
{
this->registerApplication(identifier);

View File

@@ -15,7 +15,7 @@
#include "blackcore/blackcoreexport.h"
#include "blackcore/context/contextapplication.h"
#include "blackcore/corefacadeconfig.h"
#include "blackmisc/identifierlist.h"
#include "blackmisc/identifierset.h"
#include "blackmisc/statusmessage.h"
#include "blackmisc/valuecache.h"
@@ -90,7 +90,7 @@ namespace BlackCore
private:
BlackMisc::CGenericDBusInterface *m_dBusInterface = nullptr; //!< interface
BlackMisc::CIdentifierList m_proxyPingIdentifiers; //!< automatically ping the implementing side
BlackMisc::CIdentifierSet m_proxyPingIdentifiers; //!< automatically ping the implementing side
QTimer m_pingTimer;
//! Relay connection signals to local signals

View File

@@ -54,7 +54,7 @@ namespace BlackMisc
} //namespace
Q_DECLARE_METATYPE(BlackMisc::CIdentifierList)
Q_DECLARE_METATYPE(BlackMisc::CCollection<BlackMisc::CIdentifier>)
Q_DECLARE_METATYPE(BlackMisc::CSequence<BlackMisc::CIdentifier>)
// in set: Q_DECLARE_METATYPE(BlackMisc::CCollection<BlackMisc::CIdentifier>)
#endif //guard

View File

@@ -0,0 +1,50 @@
/* Copyright (C) 2018
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
* including this file, may be copied, modified, propagated, or distributed except according to the terms
* contained in the LICENSE file.
*/
#include "blackmisc/identifierset.h"
#include <QString>
#include <tuple>
namespace BlackMisc
{
CIdentifierSet::CIdentifierSet() { }
CIdentifierSet::CIdentifierSet(const CCollection<CIdentifier> &other) : CCollection<CIdentifier>(other)
{
// void
}
bool CIdentifierSet::containsAnyNotIn(const CIdentifierSet &other) const
{
return containsBy([&other](const CIdentifier & id) { return ! other.contains(id); });
}
CIdentifierSet CIdentifierSet::getMachinesUnique() const
{
CIdentifierSet il;
for (const CIdentifier &identifier : *this)
{
const bool contained = il.containsBy([ = ](const CIdentifier & ident)
{
return identifier.hasSameMachineName(ident);
});
if (!contained) { il.push_back(identifier); }
}
return il;
}
QStringList CIdentifierSet::getMachineNames(bool unique, bool sort) const
{
QStringList codes = this->transform(Predicates::MemberTransform(&CIdentifier::getMachineName));
if (sort) { codes.sort(); }
if (unique) { codes.removeDuplicates(); }
return codes;
}
} // namespace

View File

@@ -0,0 +1,52 @@
/* Copyright (C) 2018
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
* including this file, may be copied, modified, propagated, or distributed except according to the terms
* contained in the LICENSE file.
*/
//! \file
#ifndef BLACKMISC_IDENTIFIERSET_H
#define BLACKMISC_IDENTIFIERSET_H
#include "blackmisc/identifier.h"
#include "blackmisc/collection.h"
#include "blackmisc/variant.h"
#include "blackmisc/blackmiscexport.h"
#include <QMetaType>
namespace BlackMisc
{
/*!
* Value object encapsulating a set of object identifiers
*/
class BLACKMISC_EXPORT CIdentifierSet : public CCollection<CIdentifier>
{
public:
//! Default constructor.
CIdentifierSet();
//! Construct from a base class object.
CIdentifierSet(const CCollection<CIdentifier> &other);
//! This list contains an identifier which is not contained in other.
bool containsAnyNotIn(const CIdentifierSet &other) const;
//! Get a list of identifiers reduced to maximum one per machine.
//! If there is more than one per machine, it is undefined which one will be added.
CIdentifierSet getMachinesUnique() const;
//! Get machine names
QStringList getMachineNames(bool unique = true, bool sort = true) const;
};
} //namespace
Q_DECLARE_METATYPE(BlackMisc::CIdentifierSet)
Q_DECLARE_METATYPE(BlackMisc::CCollection<BlackMisc::CIdentifier>)
// in list: Q_DECLARE_METATYPE(BlackMisc::CSequence<BlackMisc::CIdentifier>)
#endif //guard