From 9b2cb3b517f332d68348abe7fb3fad38faa5e197 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 24 Jul 2013 02:20:32 +0200 Subject: [PATCH] Shifted DBus operators to CBaseStreamStringifier, much easier to provide streaming - especially for derived classes. Still required but unwanted overloaded DBus operator in aviomodulator.h - no compilation without them. Need to be removed. Enabled more classes for DBus. --- .../BlackMiscTest.Testservice.xml | 6 +- samples/blackmiscquantities_dbus/main.cpp | 14 ++- samples/blackmiscquantities_dbus/readme.txt | 3 +- .../blackmiscquantities_dbus/testservice.cpp | 11 +- .../blackmiscquantities_dbus/testservice.h | 9 +- .../sample_quantities_avionics_xmlplugin.pro | 25 ---- .../sampleplugin.cpp | 12 -- .../sampleplugin.h | 21 ---- src/blackmisc/avaltitude.cpp | 9 ++ src/blackmisc/avaltitude.h | 25 ++++ src/blackmisc/aviobase.h | 23 +++- src/blackmisc/aviocomsystem.h | 6 +- src/blackmisc/aviomodulator.cpp | 13 +- src/blackmisc/aviomodulator.h | 90 ++++++++------ src/blackmisc/basestreamstringifier.h | 61 +++++++-- src/blackmisc/blackmiscfreefunctions.cpp | 3 +- src/blackmisc/pqbase.h | 78 ++++++++---- src/blackmisc/pqphysicalquantity.h | 43 +++---- src/blackmisc/pqunits.h | 117 ++++++++---------- 19 files changed, 335 insertions(+), 234 deletions(-) delete mode 100644 samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro delete mode 100644 samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp delete mode 100644 samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h diff --git a/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml b/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml index fec10b6e1..d8ba83ba6 100644 --- a/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml +++ b/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml @@ -15,8 +15,12 @@ - + + + + + diff --git a/samples/blackmiscquantities_dbus/main.cpp b/samples/blackmiscquantities_dbus/main.cpp index 905f4ca78..785539601 100644 --- a/samples/blackmiscquantities_dbus/main.cpp +++ b/samples/blackmiscquantities_dbus/main.cpp @@ -60,8 +60,7 @@ int main(int argc, char *argv[]) QString service; // service not needed if (QDBusConnection::sessionBus().connect( service, Testservice::ServicePath, Testservice::ServiceName, - "sendStringMessage", pTestservice, - SLOT(receiveStringMessage(const QString &)))) { + "sendStringMessage", pTestservice, SLOT(receiveStringMessage(const QString &)))) { qDebug() << "Connected object with bus sendStringMessage"; } else { qFatal("Cannot connect service with DBus"); @@ -100,12 +99,23 @@ int main(int argc, char *argv[]) CSpeed speed(speedValue++, BlackMisc::PhysicalQuantities::CSpeedUnit::km_h()); testserviceInterface.receiveSpeed(speed); qDebug() << "Send speed via interface" << speed; + + speed.switchUnit(CSpeedUnit::kts()); + testserviceInterface.receiveSpeed(speed); + qDebug() << "Send speed via interface" << speed; TestserviceTool::sleep(2500); // Aviation CComSystem comSystem = CComSystem("DBUS COM1", CPhysicalQuantitiesConstants::FrequencyInternationalAirDistress(), CPhysicalQuantitiesConstants::FrequencyUnicom()); testserviceInterface.receiveComUnit(comSystem); qDebug() << "Send COM via interface" << comSystem; + + CAltitude al(1000, true, CLengthUnit::ft()); + QDBusVariant qv(QVariant::fromValue(al)); + testserviceInterface.receiveVariant(qv); + testserviceInterface.receiveAltitude(al); + qDebug() << "Send altitude via interface" << al; + TestserviceTool::sleep(2500); } } diff --git a/samples/blackmiscquantities_dbus/readme.txt b/samples/blackmiscquantities_dbus/readme.txt index 4481e7f8f..6c74d5ca4 100644 --- a/samples/blackmiscquantities_dbus/readme.txt +++ b/samples/blackmiscquantities_dbus/readme.txt @@ -2,7 +2,8 @@ Starting: dbus-daemon.exe --session - blocks CMD (sometimes daemon continues to run when pressing CTRL/C) - does not start without directory session.d, i.e. ..\Qt\Qt5.1.0DBus\qtbase\etc\dbus-1\session.d -qdbuscpp2xml testservice.h -x H:\Projects\QtBuilds\build-client-Qt_5_1_0_VATSIM_qmake_Microsoft_Visual_C_Compiler_10_0_x86_2-Release\bin\blackmisc_cpp2xml.dll -o BlackMiscTest.Testservice.xml +qdbuscpp2xml testservice.h -x blackmisc_cpp2xml.dll -o BlackMiscTest.Testservice.xml +Set search path for plugins: env.var. QT_PLUGIN_PATH Done automatically, but if required manually Interface: qdbusxml2cpp blackbus.testservice.xml -p itestservice diff --git a/samples/blackmiscquantities_dbus/testservice.cpp b/samples/blackmiscquantities_dbus/testservice.cpp index bcfac37e3..bcca70f78 100644 --- a/samples/blackmiscquantities_dbus/testservice.cpp +++ b/samples/blackmiscquantities_dbus/testservice.cpp @@ -33,7 +33,8 @@ void Testservice::receiveStringMessage(const QString &message) void Testservice::receiveVariant(const QDBusVariant &variant) { QVariant qv = variant.variant(); - qDebug() << "Pid:" << TestserviceTool::getPid() << "Received variant:" << qv; + BlackMisc::Aviation::CAltitude altitude = qv.value(); + qDebug() << "Pid:" << TestserviceTool::getPid() << "Received variant:" << altitude; } /* @@ -52,5 +53,13 @@ void Testservice::receiveComUnit(const BlackMisc::Aviation::CComSystem &comUnit) qDebug() << "Pid:" << TestserviceTool::getPid() << "Received COM:" << comUnit; } +/* + * Receivealtitude + */ +void Testservice::receiveAltitude(const BlackMisc::Aviation::CAltitude &altitude) +{ + qDebug() << "Pid:" << TestserviceTool::getPid() << "Received altitude:" << altitude; + +} } // namespace diff --git a/samples/blackmiscquantities_dbus/testservice.h b/samples/blackmiscquantities_dbus/testservice.h index 6ce955b27..81e10e7b5 100644 --- a/samples/blackmiscquantities_dbus/testservice.h +++ b/samples/blackmiscquantities_dbus/testservice.h @@ -65,11 +65,18 @@ public slots: void receiveSpeed(const BlackMisc::PhysicalQuantities::CSpeed &speed); /*! - * \brief receiveComUnit + * \brief Receive com unit * \param comUnit */ void receiveComUnit(const BlackMisc::Aviation::CComSystem &comUnit); + /*! + * \brief Receive altitude + * \param comUnit + */ + void receiveAltitude(const BlackMisc::Aviation::CAltitude &altitude); + + public: static const QString ServiceName; static const QString ServicePath; diff --git a/samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro b/samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro deleted file mode 100644 index 02804edab..000000000 --- a/samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro +++ /dev/null @@ -1,25 +0,0 @@ -QT += core dbus - -TARGET = sample_quantities_avionics_xmlplugin -TEMPLATE = lib - -CONFIG += plugin - -DEPENDPATH += . ../../src/blackmisc -INCLUDEPATH += . ../../src - -LIBS += -L../../lib -lblackmisc \ - ../blackmiscquantities_dbus/release/dummy.obj \ - ../blackmiscquantities_dbus/release/moc_dummy.obj \ - ../blackmiscquantities_dbus/release/dummynoq.obj - -win32:!win32-g++*: PRE_TARGETDEPS += ../../lib/blackmisc.lib \ - ../../samples/blackmiscquantities_dbus/release/dummy.obj -else: PRE_TARGETDEPS += ../../lib/libblackmisc.a \ - ../../samples/blackmiscquantities_dbus/release/dummy.obj - -DESTDIR = ../../bin - -HEADERS += *.h -SOURCES += *.cpp - diff --git a/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp b/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp deleted file mode 100644 index edf3829ba..000000000 --- a/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "sampleplugin.h" - - -void CXmlSamplePlugin::registerMetaTypes() -{ - qRegisterMetaType("BlackMiscTest::Dummy"); - qDBusRegisterMetaType(); - - qRegisterMetaType("BlackMiscTest::DummyNoQ"); - qDBusRegisterMetaType(); - -} diff --git a/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h b/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h deleted file mode 100644 index 921247b2b..000000000 --- a/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef SAMPLEPLUGIN_H -#define SAMPLEPLUGIN_H - -#include -#include -#include -#include -#include "../blackmiscquantities_dbus/dummy.h" -#include "../blackmiscquantities_dbus/dummynoq.h" - -class CXmlSamplePlugin : public QObject, public QDBusCpp2XmlPlugin -{ - Q_OBJECT - Q_INTERFACES(QDBusCpp2XmlPlugin) - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.DBus.Cpp2XmlPlugin") - -public: - virtual void registerMetaTypes(); -}; - -#endif // SAMPLEPLUGIN_H diff --git a/src/blackmisc/avaltitude.cpp b/src/blackmisc/avaltitude.cpp index c2965d61f..eef440e57 100644 --- a/src/blackmisc/avaltitude.cpp +++ b/src/blackmisc/avaltitude.cpp @@ -50,5 +50,14 @@ bool CAltitude::operator !=(const CAltitude &otherAltitude) return !((*this) == otherAltitude); } +/* + * Register metadata + */ +void CAltitude::registerMetadata() +{ + qRegisterMetaType(typeid(CAltitude).name()); + qDBusRegisterMetaType(); +} + } // namespace } // namespace diff --git a/src/blackmisc/avaltitude.h b/src/blackmisc/avaltitude.h index 7bc24ee39..96316e3d5 100644 --- a/src/blackmisc/avaltitude.h +++ b/src/blackmisc/avaltitude.h @@ -28,6 +28,24 @@ protected: */ virtual QString stringForConverter() const; + /*! + * \brief Stream to DBus << + * \param argument + */ + virtual void marshallToDbus(QDBusArgument &argument) const { + CLength::marshallToDbus(argument); + argument << this->m_msl; + } + + /*! + * \brief Stream from DBus >> + * \param argument + */ + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + CLength::unmarshallFromDbus(argument); + argument >> this->m_msl; + } + public: /*! @@ -105,9 +123,16 @@ public: { return this->m_msl; } + + /*! + * \brief Register metadata + */ + static void registerMetadata(); + }; } // namespace } // namespace +Q_DECLARE_METATYPE(BlackMisc::Aviation::CAltitude) #endif // guard diff --git a/src/blackmisc/aviobase.h b/src/blackmisc/aviobase.h index cd739cc35..e9b152acb 100644 --- a/src/blackmisc/aviobase.h +++ b/src/blackmisc/aviobase.h @@ -19,17 +19,16 @@ namespace Aviation /*! * \brief Base class for avionics */ -class CAvionicsBase : public CBaseStreamStringifier +class CAvionicsBase : public BlackMisc::CBaseStreamStringifier { - protected: QString m_name; //!< name of the unit /*! - * \brief Default constructor + * \brief Constructor */ - CAvionicsBase(const QString &name) : m_name(name) {} + CAvionicsBase(const QString &name) : CBaseStreamStringifier(), m_name(name) {} /*! * \brief Are the set values valid / in range @@ -60,6 +59,22 @@ protected: return this->m_name == otherSystem.m_name; } + /*! + * \brief Stream to DBus << + * \param argument + */ + virtual void marshallToDbus(QDBusArgument &argument) const { + argument << this->m_name; + } + + /*! + * \brief Stream from DBus >> + * \param argument + */ + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + argument >> this->m_name; + } + public: /*! * \brief Virtual destructor diff --git a/src/blackmisc/aviocomsystem.h b/src/blackmisc/aviocomsystem.h index 57857b572..923746f13 100644 --- a/src/blackmisc/aviocomsystem.h +++ b/src/blackmisc/aviocomsystem.h @@ -3,8 +3,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef BLACKMISC_AVIOCOMUNIT_H -#define BLACKMISC_AVIOCOMUNIT_H +#ifndef BLACKMISC_AVIOCOMSYSTEM_H +#define BLACKMISC_AVIOCOMSYSTEM_H #include "blackmisc/aviomodulator.h" #include @@ -315,8 +315,10 @@ public: static bool tryGetCom3System(CComSystem &comSystem, BlackMisc::PhysicalQuantities::CFrequency activeFrequency, BlackMisc::PhysicalQuantities::CFrequency standbyFrequency = CModulator::FrequencyNotSet()) { return CComSystem::tryGetComSystem(comSystem, CModulator::NameCom3(), activeFrequency, standbyFrequency); } + }; + } // namespace } // namespace diff --git a/src/blackmisc/aviomodulator.cpp b/src/blackmisc/aviomodulator.cpp index d13c083c3..49e23a232 100644 --- a/src/blackmisc/aviomodulator.cpp +++ b/src/blackmisc/aviomodulator.cpp @@ -6,6 +6,7 @@ #include "blackmisc/aviomodulator.h" #include "blackmisc/aviocomsystem.h" #include "blackmisc/avionavsystem.h" +#include "blackmisc/avioadfsystem.h" using BlackMisc::PhysicalQuantities::CFrequency; using BlackMisc::PhysicalQuantities::CFrequencyUnit; @@ -25,12 +26,20 @@ template void CModulator::toggleActiveStandby() this->m_frequencyStandby = a; } +/* + * Register metadata + */ +template void CModulator::registerMetadata() +{ + qRegisterMetaType(typeid(AVIO).name()); + qDBusRegisterMetaType(); +} + /* * Assigment operator = */ template CModulator& CModulator::operator=(const CModulator &otherModulator) { - if (this == &otherModulator) return *this; // Same object? this->m_frequencyActive = otherModulator.m_frequencyActive; this->m_frequencyStandby = otherModulator.m_frequencyStandby; @@ -63,6 +72,8 @@ template bool CModulator::operator !=(const CModulator // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html template class CModulator; template class CModulator; +template class CModulator; + } // namespace } // namespace diff --git a/src/blackmisc/aviomodulator.h b/src/blackmisc/aviomodulator.h index dcb9e0cf3..e82270b0d 100644 --- a/src/blackmisc/aviomodulator.h +++ b/src/blackmisc/aviomodulator.h @@ -6,7 +6,7 @@ #ifndef BLACKMISC_AVIOMODULATORUNIT_H #define BLACKMISC_AVIOMODULATORUNIT_H -#include +#include #include "blackmisc/aviobase.h" namespace BlackMisc @@ -19,6 +19,33 @@ namespace Aviation */ template class CModulator : public CAvionicsBase { + /*! + * \brief Unmarshalling operator >>, DBus to object + * \param argument + * \param uc + * \return + */ + friend const QDBusArgument &operator>>(const QDBusArgument &argument, AVIO &uc) { + // If I do not have the method here, DBus metasystem tries to stream against + // a container: inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container &list) + // Once someone solves this, this methods should go and the CBaseStreamStringifier signature + // should be used + CBaseStreamStringifier &sf = uc; + return argument >> sf; + } + + /*! + * \brief Marshalling operator <<, object to DBus + * \param argument + * \param pq + * \return + */ + friend QDBusArgument &operator<<(QDBusArgument &argument, const AVIO &uc) + { + const CBaseStreamStringifier &sf = uc; + return argument << sf; + } + private: BlackMisc::PhysicalQuantities::CFrequency m_frequencyActive; //!< active frequency BlackMisc::PhysicalQuantities::CFrequency m_frequencyStandby; //!< standby frequency @@ -207,6 +234,28 @@ protected: return f; } + /*! + * \brief Stream to DBus << + * \param argument + */ + virtual void marshallToDbus(QDBusArgument &argument) const { + CAvionicsBase::marshallToDbus(argument); + argument << this->m_frequencyActive; + argument << this->m_frequencyStandby; + argument << this->m_digits; + } + + /*! + * \brief Stream from DBus >> + * \param argument + */ + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + CAvionicsBase::unmarshallFromDbus(argument); + argument >> this->m_frequencyActive; + argument >> this->m_frequencyStandby; + argument >> this->m_digits; + } + public: /*! * \brief Virtual destructor @@ -262,47 +311,10 @@ public: this->m_frequencyStandby = frequency; } - /*! - * \brief Unmarshalling operator >>, DBus to object - * \param argument - * \param aviationUnit - * \return - */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, AVIO &aviationUnit) { - argument.beginStructure(); - argument >> aviationUnit.m_frequencyActive; - argument >> aviationUnit.m_frequencyStandby; - argument >> aviationUnit.m_digits; - argument >> aviationUnit.m_name; - argument.endStructure(); - return argument; - } - - /*! - * \brief Marshalling operator <<, object to DBus - * \param argument - * \param aviationUnit - * \return - */ - friend QDBusArgument &operator<<(QDBusArgument &argument, const AVIO& aviationUnit) - { - argument.beginStructure(); - argument << aviationUnit.m_frequencyActive; - argument << aviationUnit.m_frequencyStandby; - argument << aviationUnit.m_digits; - argument << aviationUnit.m_name; - argument.endStructure(); - return argument; - } - /*! * \brief Register metadata */ - static void registerMetadata() - { - qRegisterMetaType(typeid(AVIO).name()); - qDBusRegisterMetaType(); - } + static void registerMetadata(); }; } // namespace diff --git a/src/blackmisc/basestreamstringifier.h b/src/blackmisc/basestreamstringifier.h index 7557f236f..393cf4565 100644 --- a/src/blackmisc/basestreamstringifier.h +++ b/src/blackmisc/basestreamstringifier.h @@ -2,6 +2,7 @@ #define BLACKMISC_BASESTREAMSTRINGIFIER_H #include "blackmisc/debug.h" +#include #include #include #include @@ -23,10 +24,10 @@ class CBaseStreamStringifier */ friend QDebug operator<<(QDebug debug, const CBaseStreamStringifier &uc) { - const CBaseStreamStringifier &sf = uc; // allows to access protected method - debug << sf.stringForStreaming(); + debug << uc.stringForStreaming(); return debug; } + // msvc2010: friend QDebug &operator<<(QDebug &debug, const CBaseStreamStringifier &uc) // MinGW: No reference @@ -38,8 +39,7 @@ class CBaseStreamStringifier */ friend QTextStream &operator<<(QTextStream &textStream, const CBaseStreamStringifier &uc) { - const CBaseStreamStringifier &sf = uc; // allows to acces protected method - textStream << sf.stringForStreaming(); + textStream << uc.stringForStreaming(); return textStream; } @@ -62,8 +62,7 @@ class CBaseStreamStringifier */ friend QDataStream &operator<<(QDataStream &stream, const CBaseStreamStringifier &uc) { - const CBaseStreamStringifier &sf = uc; // allows to acces protected method - stream << sf.stringForStreaming(); + stream << uc.stringForStreaming(); return stream; } @@ -75,8 +74,7 @@ class CBaseStreamStringifier */ friend CLogMessage operator<<(CLogMessage log, const CBaseStreamStringifier &uc) { - const CBaseStreamStringifier &sf = uc; // allows to acces protected method - log << sf.stringForStreaming(); + log << uc.stringForStreaming(); return log; } @@ -88,12 +86,39 @@ class CBaseStreamStringifier */ friend std::ostream &operator<<(std::ostream &ostr, const CBaseStreamStringifier &uc) { - const CBaseStreamStringifier &sf = uc; // allows to acces protected method - ostr << sf.stringForStreaming().toStdString(); + ostr << uc.stringForStreaming().toStdString(); return ostr; } + /*! + * \brief Unmarshalling operator >>, DBus to object + * \param argument + * \param uc + * \return + */ + friend const QDBusArgument &operator>>(const QDBusArgument &argument, CBaseStreamStringifier &uc) { + argument.beginStructure(); + uc.unmarshallFromDbus(argument); + argument.endStructure(); + return argument; + } + + /*! + * \brief Marshalling operator <<, object to DBus + * \param argument + * \param pq + * \return + */ + friend QDBusArgument &operator<<(QDBusArgument &argument, const CBaseStreamStringifier &uc) + { + argument.beginStructure(); + uc.marshallToDbus(argument); + argument.endStructure(); + return argument; + } + public: + /*! * \brief Virtual destructor */ @@ -109,6 +134,10 @@ public: } protected: + /*! + * \brief Default constructor + */ + CBaseStreamStringifier() {} /*! * \brief String for streaming operators @@ -126,6 +155,18 @@ protected: */ virtual QString stringForConverter() const = 0; + /*! + * \brief Stream to DBus + * \param argument + */ + virtual void marshallToDbus(QDBusArgument &) const { } + + /*! + * \brief Stream from DBus + * \param argument + */ + virtual void unmarshallFromDbus(const QDBusArgument &) {} + /*! * \brief Copy assignment operator. * This is protected in order to forbid slicing an instance of one derived diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp index 7634b2843..51316b601 100644 --- a/src/blackmisc/blackmiscfreefunctions.cpp +++ b/src/blackmisc/blackmiscfreefunctions.cpp @@ -29,8 +29,9 @@ void BlackMisc::PhysicalQuantities::registerMetadata() void BlackMisc::Aviation::registerMetadata() { CComSystem::registerMetadata(); - CAdfSystem::registerMetadata(); CNavSystem::registerMetadata(); + CAdfSystem::registerMetadata(); + CAltitude::registerMetadata(); } /* diff --git a/src/blackmisc/pqbase.h b/src/blackmisc/pqbase.h index 3c0dc5451..b0d37129b 100644 --- a/src/blackmisc/pqbase.h +++ b/src/blackmisc/pqbase.h @@ -50,6 +50,24 @@ protected: return this->m_name; } + /*! + * \brief Stream to DBus + * \param argument + */ + virtual void marshallToDbus(QDBusArgument &argument) const { + argument << this->m_name; + } + + /*! + * \brief Stream from DBus + * \param argument + */ + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString name; + argument >> name; + (*this) = CMeasurementPrefix::fromPrefixName(name); + } + public: /*! * \brief Copy constructor @@ -224,6 +242,40 @@ public: return milli; } + + /*! + * \brief All prefixes + * \return + */ + static const QList &prefixes() + { + static QList prefixes; + prefixes.append(CMeasurementPrefix::c()); + prefixes.append(CMeasurementPrefix::G()); + prefixes.append(CMeasurementPrefix::h()); + prefixes.append(CMeasurementPrefix::k()); + prefixes.append(CMeasurementPrefix::M()); + prefixes.append(CMeasurementPrefix::m()); + prefixes.append(CMeasurementPrefix::None()); + prefixes.append(CMeasurementPrefix::One()); + return prefixes; + } + + /*! + * \brief Prefix from name + * \param prefixName must be valid! + * \return + */ + static const CMeasurementPrefix &fromPrefixName(const QString &prefixName) { + QList prefixes = CMeasurementPrefix::prefixes(); + // read only, avoid deep copy + for (int i = 0; i < prefixes.size(); ++i) { + if (prefixes.at(i).getName() == prefixName) return (prefixes.at(i)); + } + qFatal("Illegal unit name"); + return CMeasurementPrefix::None(); // just suppress "not all control paths return a value" + } + }; // --------------------------------------------------------------------------------- @@ -243,16 +295,11 @@ protected: typedef double(*UnitConverter)(const CMeasurementUnit &, double); /*! - * \brief Get unit from DBus argument + * \brief Stream to DBus * \param argument - * \return */ - static QString unitNameUnmarshalling(const QDBusArgument &argument) { - QString type; - argument.beginStructure(); - argument >> type; - argument.endStructure(); - return type; + virtual void marshallToDbus(QDBusArgument &argument) const { + argument << this->m_unitName; } private: @@ -520,21 +567,6 @@ public: return abs(checkValue) <= this->m_epsilon; } - /*! - * Marshalling (to DBus) operator, unmarshalling to be found in specialized classes and - * mapping back to static object - * \brief Marshalling (to DBus) operator << - * \param argument - * \param unit - * \return - */ - friend QDBusArgument &operator<<(QDBusArgument &argument, const CMeasurementUnit& unit) { - argument.beginStructure(); - argument << unit.m_unitName; - argument.endStructure(); - return argument; - } - // -------------------------------------------------------------------- // -- static // -------------------------------------------------------------------- diff --git a/src/blackmisc/pqphysicalquantity.h b/src/blackmisc/pqphysicalquantity.h index 9d9701a86..97619de01 100644 --- a/src/blackmisc/pqphysicalquantity.h +++ b/src/blackmisc/pqphysicalquantity.h @@ -422,40 +422,29 @@ public: } /*! - * \brief Unmarshalling operator >>, DBus to object + * \brief Stream to DBus << * \param argument - * \param pq - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, PQ &pq) { - argument.beginStructure(); - argument >> pq.m_unitValueD; - argument >> pq.m_unitValueI; - argument >> pq.m_convertedSiUnitValueD; - argument >> pq.m_isIntegerBaseValue; - argument >> pq.m_unit; - argument >> pq.m_conversionSiUnit; - argument.endStructure(); - return argument; + virtual void marshallToDbus(QDBusArgument &argument) const { + argument << this->m_unitValueD; + argument << this->m_unitValueI; + argument << this->m_convertedSiUnitValueD; + argument << this->m_isIntegerBaseValue; + argument << this->m_unit; + argument << this->m_conversionSiUnit; } /*! - * \brief Marshalling operator <<, object to DBus + * \brief Stream from DBus >> * \param argument - * \param pq - * \return */ - friend QDBusArgument &operator<<(QDBusArgument &argument, const PQ& pq) - { - argument.beginStructure(); - argument << pq.m_unitValueD; - argument << pq.m_unitValueI; - argument << pq.m_convertedSiUnitValueD; - argument << pq.m_isIntegerBaseValue; - argument << pq.m_unit; - argument << pq.m_conversionSiUnit; - argument.endStructure(); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + argument >> this->m_unitValueD; + argument >> this->m_unitValueI; + argument >> this->m_convertedSiUnitValueD; + argument >> this->m_isIntegerBaseValue; + argument >> this->m_unit; + argument >> this->m_conversionSiUnit; } /*! diff --git a/src/blackmisc/pqunits.h b/src/blackmisc/pqunits.h index 774bf5ebb..285d02042 100644 --- a/src/blackmisc/pqunits.h +++ b/src/blackmisc/pqunits.h @@ -160,16 +160,15 @@ public: return CLengthUnit::m(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CLengthUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CLengthUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CLengthUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CLengthUnit) @@ -289,16 +288,15 @@ public: return CAngleUnit::rad(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CAngleUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CAngleUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CAngleUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CAngleUnit) @@ -406,16 +404,15 @@ public: return CFrequencyUnit::Hz(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CFrequencyUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CFrequencyUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CFrequencyUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CFrequencyUnit) @@ -523,16 +520,15 @@ public: return CMassUnit::kg(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CMassUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CMassUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CMassUnit::fromUnitName(unitName); } }; @@ -673,16 +669,15 @@ public: return CPressureUnit::Pa(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CPressureUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CPressureUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CPressureUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CPressureUnit) @@ -805,16 +800,15 @@ public: return CTemperatureUnit::K(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CTemperatureUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CTemperatureUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CTemperatureUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CTemperatureUnit) @@ -942,16 +936,15 @@ public: return CSpeedUnit::m_s(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CSpeedUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CSpeedUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CSpeedUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CSpeedUnit) @@ -1068,16 +1061,15 @@ public: return CTimeUnit::s(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CTimeUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CTimeUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CTimeUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CTimeUnit) @@ -1161,16 +1153,15 @@ public: return CAccelerationUnit::m_s2(); // just suppress "not all control paths return a value" } +protected: /*! - * \brief Unmarshalling operator >>, map back to concrete static object + * \brief Stream from DBus * \param argument - * \param dummy - * \return */ - friend const QDBusArgument &operator>>(const QDBusArgument &argument, CAccelerationUnit &unit) { - QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument); - unit = CAccelerationUnit::fromUnitName(unitName); - return argument; + virtual void unmarshallFromDbus(const QDBusArgument &argument) { + QString unitName; + argument >> unitName; + (*this) = CAccelerationUnit::fromUnitName(unitName); } }; Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CAccelerationUnit)