From 6b55b10b9b566209c3013003b3e40174f2f315de Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 9 Jun 2014 01:49:26 +0200 Subject: [PATCH] Prepared for voice capabilities --- src/blackgui/clientlistmodel.cpp | 1 + src/blackmisc/blackmisc.qrc | 4 + src/blackmisc/blackmiscfreefunctions.cpp | 1 + src/blackmisc/icons/captextonly.png | Bin 0 -> 723 bytes src/blackmisc/icons/capunknown.png | Bin 0 -> 206 bytes src/blackmisc/icons/capvoice.png | Bin 0 -> 717 bytes src/blackmisc/icons/capvoicereceive.png | Bin 0 -> 769 bytes src/blackmisc/networkallclasses.h | 1 + src/blackmisc/nwclient.cpp | 15 ++ src/blackmisc/nwclient.h | 23 ++- src/blackmisc/nwvoicecapabilites.cpp | 190 +++++++++++++++++++++++ src/blackmisc/nwvoicecapabilities.h | 108 +++++++++++++ 12 files changed, 340 insertions(+), 3 deletions(-) create mode 100644 src/blackmisc/icons/captextonly.png create mode 100644 src/blackmisc/icons/capunknown.png create mode 100644 src/blackmisc/icons/capvoice.png create mode 100644 src/blackmisc/icons/capvoicereceive.png create mode 100644 src/blackmisc/nwvoicecapabilites.cpp create mode 100644 src/blackmisc/nwvoicecapabilities.h diff --git a/src/blackgui/clientlistmodel.cpp b/src/blackgui/clientlistmodel.cpp index e6580d0cc..afdebe931 100644 --- a/src/blackgui/clientlistmodel.cpp +++ b/src/blackgui/clientlistmodel.cpp @@ -16,6 +16,7 @@ namespace BlackGui this->m_columns.addColumn(CColumn("", CClient::IndexCallsignIcon)); this->m_columns.addColumn(CColumn("callsign", CClient::IndexCallsign)); this->m_columns.addColumn(CColumn("realname", CClient::IndexRealName)); + this->m_columns.addColumn(CColumn("", CClient::IndexVoiceCapabilitiesIcon)); this->m_columns.addColumn(CColumn("capabilities", CClient::IndexCapabilitiesString)); this->m_columns.addColumn(CColumn("model", CClient::IndexQueriedModelString)); this->m_columns.addColumn(CColumn("host", CClient::IndexHost)); diff --git a/src/blackmisc/blackmisc.qrc b/src/blackmisc/blackmisc.qrc index 38aeb20b8..56001e4b8 100644 --- a/src/blackmisc/blackmisc.qrc +++ b/src/blackmisc/blackmisc.qrc @@ -26,5 +26,9 @@ icons/sky.jpg icons/tower_framed.jpg icons/gnd_framed.jpg + icons/captextonly.png + icons/capunknown.png + icons/capvoice.png + icons/capvoicereceive.png diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp index c6c620197..07b2a108c 100644 --- a/src/blackmisc/blackmiscfreefunctions.cpp +++ b/src/blackmisc/blackmiscfreefunctions.cpp @@ -96,6 +96,7 @@ void BlackMisc::Network::registerMetadata() CClient::registerMetadata(); CClientList::registerMetadata(); CAircraftModel::registerMetadata(); + CVoiceCapabilities::registerMetadata(); } /* diff --git a/src/blackmisc/icons/captextonly.png b/src/blackmisc/icons/captextonly.png new file mode 100644 index 0000000000000000000000000000000000000000..51ad2dc27aa2fc5be7e012cbe7084a6c823722ad GIT binary patch literal 723 zcmV;^0xbQBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn z4jTXf02y>eSaefwW^{L9a%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*00J{fL_t(YOSP3x zh!Rm8$G_; zo%Rx?8x;h5T&PYaQsQK3Dmlrv@9obS$9YprupfB5-+S-(KKw@CypfbsGkYMWK7XX> z|M)h2h9bZqW*kNyjYcT~3WWmi$E6IJdX341afZVo(&;ppC6h_W^1*h|9$8eOD6!M& zAdyJGZnyJsC=`Oj;SlCBr?j^Z8(1YUYPA|NnG9mF7~F0*!r?GfRYm9YS-w8bXpbgl zh~(AhPm#~(5s$|a2n5h{etq^3Xb z_2MUrbOzybyl*rbhmtZ36+d1+frXW?JQh_hLL_AvD*kzF7U;j@ZR*21&02H!>Sc<| zOo->8yu78g@2|FK#mwgN4Sw9LFo=Js$ML)MLTlA(l~&A1l0=ahgSgdd!8Hx7&0Sfd z6*CKWau^H-G%{lnJ5PeQUyCy|Yt8kC8x)x_onv;v+<&t}Bc1JgtEkuOh~8eM86DBd zFjUMCN#8zL<1dKU>qY9)Jk9Eej;28@O4xn!2&Ga9{eB-lpO2pe_5C)j>P+s{#3Cts z#7HE9R4RpHu?R&`;B-3qtNmr`8D;5=JGj_NIwBYhBAd;kTrMBnYWr6xli$2}fiiSP zF8N>55gv~Rxm*r5n+@%D8@*nSA2(4ha~|2J>4-k2z#q)>`DXK6vcmuX002ovPDHLk FV1j()JqG{) literal 0 HcmV?d00001 diff --git a/src/blackmisc/icons/capunknown.png b/src/blackmisc/icons/capunknown.png new file mode 100644 index 0000000000000000000000000000000000000000..b482da2f982e895d44378fba58aa346647b623f3 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEX7WqAsj$Z!;#Vf&U>cv7h@-A}f&3S>O>_%)r2R1cVuSXYA^>bP0l+XkKA8$5K literal 0 HcmV?d00001 diff --git a/src/blackmisc/icons/capvoice.png b/src/blackmisc/icons/capvoice.png new file mode 100644 index 0000000000000000000000000000000000000000..64531c84e3af4cfa86a0e58da130fe8ecd79cbde GIT binary patch literal 717 zcmV;;0y6!HP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn z4jTXf02y>eSaefwW^{L9a%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*00J#ZL_t(YOSM%y ziyBcB{zg~D2hm0%WK(RhcBTnd{tQ9ge_&;)5D_Z_sq{D41O!D$V`YL}0%|2TTKH&u zA@Q-koy<8q8gwV>Zt#PTIdf;`yWc(M+&h9O0aw7QggqXQ9093RN{)^|!k1#bUW?Ia zl;dKtD0;nKj+LO2_0M8F9wQhG;^yXt@9lOwv|264O1Mb4-EJck3PExRx7*EQI-TyM z@Yz(9%VjYT2#Bp#OWbTWVyDyL@yTQ&`u%>6m2lE=E|)_#n?)=Z!|m-YX0sVer4m0| zE|)J$#kY`v?@h(IR)hb_`%_ate0UjS8&pJL5 z{(!-cPkT}-dc7WMwHlKg_xpWb1*PR;;oqw_SP%1il0y=oPN&RWO6K!91VNC$QpSNW z<>ZoU=F3xY z44==(=R+ow;lf$1R(4D=74y}?1eeQ&a5#)~I?X*y>DYD2i&CM4ySqEY<8c%U1s0<| z{%^-SP)-wx1k`FZMxzn$zEi?i`!!wZXA1lQy!O9}f|rF>00000NkvXXu0mjfUa~i8 literal 0 HcmV?d00001 diff --git a/src/blackmisc/icons/capvoicereceive.png b/src/blackmisc/icons/capvoicereceive.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc4448d69875bee1fd66cd21d3147298ec37a65 GIT binary patch literal 769 zcmV+c1OEJpP)}W5DT;`Kcn~pT z4jw~L?;1SBgXClsiRKVI7=poQ+!&a!4sltN%yf2VraepznVs!flYgwwH_OIT1 z^(wUGS4FGqHr%6)uOGLW$&da6{zdGU@Z-eXUR)aulDkxp;yoP3D$d|T491|FEU8jB z0lyE;2ybEq>-aVHTcCB_Ml#K}5&i&<;4~h>=Qt68x7+e(tDu`)F$rH+?zklT1t;-* z{J}Zgz(!ksc^Y(!k4F=QGAqazSZm8a!TZ>Q98X-5y;u>4YvY43did&1<$T7?f&3yWJ~sahuSV-Z896SDE{mfD+imxa@$`Ao5G@^-d83)W!h7webV1$ z@2<$c?GJ-ERp}=1#g_Bs1y5dCb)~%ErRzU<>cl(6+dXD_%nV5Tq$Qyw36xRcr_&OC z2EIA(=hj&tbh`Gm&N_OlaPgV@%{3GsFU#KOlMYA*Bz@9AS=T*+g>Av-F8e3VJU2*5 zGZr#SamAUaGC(;N6H)av8)e1r`39Z9eB(}AmK_e1qpb(ZlzvHQ%iqH6wu-U4wx64Q zYWs&T{(La|JKRZ~a@3L`cs3rQm#2Y4Re||Uwrh5Hx)>IOWKr=GPPJsO-*vi0JA^}R zxgBiWW@l76SX3NG2iNy0PEGi_x(HPjpE;qE)9I2o6d&P04Au>l4=cW`*!|v0@MO8% zDXc%DcpQ)6Yb?gaJ>+%W7q+X4$+Q|A{q+Z4!=v~PPse&Ohgx0t^fY*~4RmB{cs2U? zSQIlC+ica5Zp*KRN$|a1O>Oy7)zuXKugmmb8Nc#T!JB|X00000NkvXXu0mjfdh=&5 literal 0 HcmV?d00001 diff --git a/src/blackmisc/networkallclasses.h b/src/blackmisc/networkallclasses.h index 4fe9bc817..b48bf52de 100644 --- a/src/blackmisc/networkallclasses.h +++ b/src/blackmisc/networkallclasses.h @@ -13,5 +13,6 @@ #include "blackmisc/nwclient.h" #include "blackmisc/nwclientlist.h" #include "blackmisc/nwaircraftmodel.h" +#include "blackmisc/nwvoicecapabilities.h" #endif // guard diff --git a/src/blackmisc/nwclient.cpp b/src/blackmisc/nwclient.cpp index 349cfb3a7..64b43ea0f 100644 --- a/src/blackmisc/nwclient.cpp +++ b/src/blackmisc/nwclient.cpp @@ -182,6 +182,15 @@ namespace BlackMisc case IndexHost: return QVariant(this->m_host); break; + case IndexVoiceCapabilities: + return this->m_voiceCapabilities.toQVariant(); + break; + case IndexVoiceCapabilitiesString: + return QVariant(this->m_voiceCapabilities.toQString(false)); + break; + case IndexVoiceCapabilitiesIcon: + return QVariant(this->m_voiceCapabilities.toIcon()); + break; default: break; } @@ -217,6 +226,12 @@ namespace BlackMisc case IndexHost: this->m_host = variant.toString(); break; + case IndexVoiceCapabilities: + this->m_voiceCapabilities = variant.value(); + break; + case IndexVoiceCapabilitiesString: + this->m_voiceCapabilities = CVoiceCapabilities(variant.toString()); + break; default: Q_ASSERT_X(false, "CClient", "index unknown"); break; diff --git a/src/blackmisc/nwclient.h b/src/blackmisc/nwclient.h index 5ffb87b09..72b3383bf 100644 --- a/src/blackmisc/nwclient.h +++ b/src/blackmisc/nwclient.h @@ -3,6 +3,7 @@ #include "nwuser.h" #include "nwaircraftmodel.h" +#include "nwvoicecapabilities.h" #include "valueobject.h" #include "indexvariantmap.h" @@ -22,17 +23,23 @@ namespace BlackMisc */ enum ColumnIndex : uint { + // user IndexEmail = 0, IndexId, IndexPassword, IndexRealName, IndexCallsign, IndexCallsignIcon, + // model IndexQueriedModelString = 100, + // own indexes IndexCapabilities = 1000, IndexCapabilitiesString, - IndexModel, // own indexes - IndexHost + IndexModel, + IndexHost, + IndexVoiceCapabilities, + IndexVoiceCapabilitiesString, + IndexVoiceCapabilitiesIcon }; /*! @@ -75,7 +82,6 @@ namespace BlackMisc //! \copydoc CValueObject::fromJson void fromJson(const QJsonObject &json) override; - //! Get capabilities CIndexVariantMap getCapabilities() const { return this->m_capabilities; } @@ -91,6 +97,15 @@ namespace BlackMisc //! Has capability? bool hasCapability(Capabilities capability) const; + //! Get voice capabilities + const CVoiceCapabilities &getVoiceCapabilities() const { return m_voiceCapabilities;} + + //! Set voice capabilities + void setVoiceCapabilities(const CVoiceCapabilities &voiceCapabilities) { m_voiceCapabilities = voiceCapabilities;} + + //! Set voice capabilities + void setVoiceCapabilities(const QString &flightPlanRemarks) { m_voiceCapabilities = CVoiceCapabilities(flightPlanRemarks);} + //! Host const QString &getHost() const { return this->m_host; } @@ -143,6 +158,8 @@ namespace BlackMisc CAircraftModel m_model; CIndexVariantMap m_capabilities; QString m_host; + CVoiceCapabilities m_voiceCapabilities; + }; } // namespace } // namespace diff --git a/src/blackmisc/nwvoicecapabilites.cpp b/src/blackmisc/nwvoicecapabilites.cpp new file mode 100644 index 000000000..93f7d7032 --- /dev/null +++ b/src/blackmisc/nwvoicecapabilites.cpp @@ -0,0 +1,190 @@ +#include "blackmisc/nwvoicecapabilities.h" +#include "blackmisc/blackmiscfreefunctions.h" +#include + +namespace BlackMisc +{ + namespace Network + { + + /* + * Constructor + */ + CVoiceCapabilities::CVoiceCapabilities(const QString &flightPlanRemarks) + { + this->fromFlightPlanRemarks(flightPlanRemarks); + } + + /* + * Convert to string + */ + QString CVoiceCapabilities::convertToQString(bool /** i18n **/) const + { + switch (this->m_voiceCapabilities) + { + case Voice: + { + static const QString v("voice"); + return v; + } + case TextOnly: + { + static const QString t("text only"); + return t; + } + case VoiceReceivingOnly: + { + static const QString r("voice listening only"); + return r; + } + default: + case Unknown: + { + static const QString u("unknown"); + return u; + } + } + Q_ASSERT("Wrong index"); + return QString(""); // never reached + } + + void CVoiceCapabilities::fromFlightPlanRemarks(const QString &flightPlanRemarks) + { + if (flightPlanRemarks.isEmpty()) + { + this->m_voiceCapabilities = Unknown; + return; + } + + QString r = flightPlanRemarks.toLower(); + if (r.contains("/v/") || r.contains("/voice/")) + { + this->setCapabilities(Voice); + return; + } + } + + /* + * metaTypeId + */ + int CVoiceCapabilities::getMetaTypeId() const + { + return qMetaTypeId(); + } + + /* + * is a + */ + bool CVoiceCapabilities::isA(int metaTypeId) const + { + if (metaTypeId == qMetaTypeId()) { return true; } + return this->CValueObject::isA(metaTypeId); + } + + /* + * Compare + */ + int CVoiceCapabilities::compareImpl(const CValueObject &otherBase) const + { + const auto &other = static_cast(otherBase); + return compare(TupleConverter::toTuple(*this), TupleConverter::toTuple(other)); + } + + /* + * Marshall to DBus + */ + void CVoiceCapabilities::marshallToDbus(QDBusArgument &argument) const + { + argument << TupleConverter::toTuple(*this); + } + + /* + * Unmarshall from DBus + */ + void CVoiceCapabilities::unmarshallFromDbus(const QDBusArgument &argument) + { + argument >> TupleConverter::toTuple(*this); + } + + /* + * Equal? + */ + const QPixmap &CVoiceCapabilities::toIcon() const + { + static const QPixmap v(QPixmap(":/blackmisc/icons/capvoice.png").scaledToWidth(16, Qt::SmoothTransformation)); + static const QPixmap t(QPixmap(":/blackmisc/icons/captextonly.png").scaledToWidth(16, Qt::SmoothTransformation)); + static const QPixmap u(QPixmap(":/blackmisc/icons/capunknown.png").scaledToWidth(16, Qt::SmoothTransformation)); + static const QPixmap r(QPixmap(":/blackmisc/icons/capvoicereceive.png").scaledToWidth(16, Qt::SmoothTransformation)); + + switch (this->m_voiceCapabilities) + { + case Voice: + return v; + case TextOnly: + return t; + case Unknown: + return u; + case VoiceReceivingOnly: + return r; + } + Q_ASSERT("Wrong index"); + return u; // never reached + } + + bool CVoiceCapabilities::operator ==(const CVoiceCapabilities &other) const + { + if (this == &other) return true; + return TupleConverter::toTuple(*this) == TupleConverter::toTuple(other); + } + + /* + * Unequal? + */ + bool CVoiceCapabilities::operator !=(const CVoiceCapabilities &other) const + { + return !((*this) == other); + } + + /* + * Hash + */ + uint CVoiceCapabilities::getValueHash() const + { + return qHash(TupleConverter::toTuple(*this)); + } + + /* + * To JSON + */ + QJsonObject CVoiceCapabilities::toJson() const + { + return BlackMisc::serializeJson(CVoiceCapabilities::jsonMembers(), TupleConverter::toTuple(*this)); + } + + /* + * To JSON + */ + void CVoiceCapabilities::fromJson(const QJsonObject &json) + { + BlackMisc::deserializeJson(json, CVoiceCapabilities::jsonMembers(), TupleConverter::toTuple(*this)); + } + + /* + * Members + */ + const QStringList &CVoiceCapabilities::jsonMembers() + { + return TupleConverter::jsonMembers(); + } + + /* + * Register metadata + */ + void CVoiceCapabilities::registerMetadata() + { + qRegisterMetaType(); + qDBusRegisterMetaType(); + } + + } // namespace +} // namespace diff --git a/src/blackmisc/nwvoicecapabilities.h b/src/blackmisc/nwvoicecapabilities.h new file mode 100644 index 000000000..3915ec66b --- /dev/null +++ b/src/blackmisc/nwvoicecapabilities.h @@ -0,0 +1,108 @@ +/* Copyright (C) 2013 VATSIM Community / authors + * This Source Code Form is subject to the terms of the Mozilla Public + * 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_VOICECAPABILITIES_H +#define BLACKMISC_VOICECAPABILITIES_H + +#include "valueobject.h" + +namespace BlackMisc +{ + namespace Network + { + + /*! + * Value object encapsulating information for voice capabilities. + */ + class CVoiceCapabilities : public BlackMisc::CValueObject + { + public: + + //!< Voice capabilities + enum VoiceCapabilities + { + Unknown, + Voice, + VoiceReceivingOnly, + TextOnly, + }; + + //! Default constructor. + CVoiceCapabilities() {} + + //! Constructor by callsign + CVoiceCapabilities(VoiceCapabilities capabilities) : m_voiceCapabilities(static_cast(capabilities)) {} + + //! Constructor. + CVoiceCapabilities(const QString &flightPlanRemarks); + + //! \copydoc CValueObject::toQVariant() + virtual QVariant toQVariant() const override { return QVariant::fromValue(*this); } + + //! Get capabilities + VoiceCapabilities getCapabilities() const { return static_cast(m_voiceCapabilities); } + + //! Set capabilites + void setCapabilities(VoiceCapabilities capabilites) { m_voiceCapabilities = static_cast(capabilites); } + + //! \copydoc CValueObject::toIcon() + virtual const QPixmap &toIcon() const override; + + //! \brief Equal operator == + bool operator ==(const CVoiceCapabilities &other) const; + + //! \brief Unequal operator != + bool operator !=(const CVoiceCapabilities &other) const; + + //! \copydoc CValueObject::getValueHash() + virtual uint getValueHash() const override; + + //! \copydoc CValueObject::toJson + virtual QJsonObject toJson() const override; + + //! \copydoc CValueObject::fromJson + void fromJson(const QJsonObject &json) override; + + //! \brief Register metadata + static void registerMetadata(); + + //! \brief Members + static const QStringList &jsonMembers(); + + protected: + //! \copydoc CValueObject::convertToQString + virtual QString convertToQString(bool i18n = false) const override; + + //! \copydoc CValueObject::getMetaTypeId + virtual int getMetaTypeId() const override; + + //! \copydoc CValueObject::isA + virtual bool isA(int metaTypeId) const override; + + //! \copydoc CValueObject::compareImpl + virtual int compareImpl(const CValueObject &other) const override; + + //! \copydoc CValueObject::marshallToDbus + virtual void marshallToDbus(QDBusArgument &argument) const override; + + //! \copydoc CValueObject::unmarshallFromDbus + virtual void unmarshallFromDbus(const QDBusArgument &argument) override; + + private: + BLACK_ENABLE_TUPLE_CONVERSION(CVoiceCapabilities) + uint m_voiceCapabilities; + + //! Capabilites from flight plans remarks such as "/V/" + void fromFlightPlanRemarks(const QString &flightPlanRemarks); + }; + + } // namespace + +} // namespace + +BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Network::CVoiceCapabilities, (o.m_voiceCapabilities)) +Q_DECLARE_METATYPE(BlackMisc::Network::CVoiceCapabilities) + +#endif // guard