File indexing completed on 2024-04-21 03:59:48

0001 /*
0002     SPDX-FileCopyrightText: 2013 Lukas Tinkl <ltinkl@redhat.com>
0003     SPDX-FileCopyrightText: 2013-2015 Jan Grulich <jgrulich@redhat.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "bearer_p.h"
0009 #include "mmdebug_p.h"
0010 #ifdef MMQT_STATIC
0011 #include "dbus/fakedbus.h"
0012 #else
0013 #include "dbus/dbus.h"
0014 #endif
0015 
0016 // logging category for this framework, default: log stuff >= warning
0017 Q_LOGGING_CATEGORY(MMQT, "kf.modemmanagerqt", QtWarningMsg)
0018 
0019 namespace ModemManager
0020 {
0021 class ModemManager::IpConfig::Private
0022 {
0023 public:
0024     Private()
0025     {
0026     }
0027     MMBearerIpMethod method{MM_BEARER_IP_METHOD_UNKNOWN};
0028 
0029     QString address;
0030     uint prefix{0};
0031     QString dns1;
0032     QString dns2;
0033     QString dns3;
0034     QString gateway;
0035 };
0036 
0037 }
0038 
0039 ModemManager::IpConfig::IpConfig()
0040     : d(new Private())
0041 {
0042 }
0043 
0044 ModemManager::IpConfig::IpConfig(const ModemManager::IpConfig &other)
0045     : d(new Private)
0046 {
0047     *this = other;
0048 }
0049 
0050 ModemManager::IpConfig::~IpConfig()
0051 {
0052     delete d;
0053 }
0054 
0055 MMBearerIpMethod ModemManager::IpConfig::method() const
0056 {
0057     return d->method;
0058 }
0059 
0060 void ModemManager::IpConfig::setMethod(MMBearerIpMethod method)
0061 {
0062     d->method = method;
0063 }
0064 
0065 QString ModemManager::IpConfig::address() const
0066 {
0067     return d->address;
0068 }
0069 
0070 void ModemManager::IpConfig::setAddress(const QString &address)
0071 {
0072     d->address = address;
0073 }
0074 
0075 uint ModemManager::IpConfig::prefix() const
0076 {
0077     return d->prefix;
0078 }
0079 
0080 void ModemManager::IpConfig::setPrefix(uint prefix)
0081 {
0082     d->prefix = prefix;
0083 }
0084 
0085 QString ModemManager::IpConfig::dns1() const
0086 {
0087     return d->dns1;
0088 }
0089 
0090 void ModemManager::IpConfig::setDns1(const QString &dns1)
0091 {
0092     d->dns1 = dns1;
0093 }
0094 
0095 QString ModemManager::IpConfig::dns2() const
0096 {
0097     return d->dns2;
0098 }
0099 
0100 void ModemManager::IpConfig::setDns2(const QString &dns2)
0101 {
0102     d->dns2 = dns2;
0103 }
0104 
0105 QString ModemManager::IpConfig::dns3() const
0106 {
0107     return d->dns3;
0108 }
0109 
0110 void ModemManager::IpConfig::setDns3(const QString &dns3)
0111 {
0112     d->dns3 = dns3;
0113 }
0114 
0115 QString ModemManager::IpConfig::gateway() const
0116 {
0117     return d->gateway;
0118 }
0119 
0120 void ModemManager::IpConfig::setGateway(const QString &gateway)
0121 {
0122     d->gateway = gateway;
0123 }
0124 
0125 ModemManager::IpConfig &ModemManager::IpConfig::operator=(const ModemManager::IpConfig &other)
0126 {
0127     if (this == &other) {
0128         return *this;
0129     }
0130 
0131     *d = *other.d;
0132     return *this;
0133 }
0134 
0135 ModemManager::BearerPrivate::BearerPrivate(const QString &path, Bearer *q)
0136 #ifdef MMQT_STATIC
0137     : bearerIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::sessionBus())
0138 #else
0139     : bearerIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::systemBus())
0140 #endif
0141     , uni(path)
0142     , q_ptr(q)
0143 {
0144     if (bearerIface.isValid()) {
0145         bearerInterface = bearerIface.interface();
0146         isConnected = bearerIface.connected();
0147         isSuspended = bearerIface.suspended();
0148         ipv4Config = ipConfigFromMap(bearerIface.ip4Config());
0149         ipv6Config = ipConfigFromMap(bearerIface.ip6Config());
0150         ipTimeout = bearerIface.ipTimeout();
0151         bearerProperties = bearerIface.properties();
0152     }
0153 }
0154 
0155 ModemManager::Bearer::Bearer(const QString &path, QObject *parent)
0156     : QObject(parent)
0157     , d_ptr(new BearerPrivate(path, this))
0158 {
0159     Q_D(Bearer);
0160 
0161 #ifdef MMQT_STATIC
0162     QDBusConnection::sessionBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0163                                           path,
0164                                           DBUS_INTERFACE_PROPS,
0165                                           QStringLiteral("PropertiesChanged"),
0166                                           d,
0167                                           SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0168 #else
0169     QDBusConnection::systemBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0170                                          path,
0171                                          DBUS_INTERFACE_PROPS,
0172                                          QStringLiteral("PropertiesChanged"),
0173                                          d,
0174                                          SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0175 #endif
0176 }
0177 
0178 ModemManager::Bearer::~Bearer()
0179 {
0180     delete d_ptr;
0181 }
0182 
0183 QString ModemManager::Bearer::interface() const
0184 {
0185     Q_D(const Bearer);
0186     return d->bearerInterface;
0187 }
0188 
0189 bool ModemManager::Bearer::isConnected() const
0190 {
0191     Q_D(const Bearer);
0192     return d->isConnected;
0193 }
0194 
0195 bool ModemManager::Bearer::isSuspended() const
0196 {
0197     Q_D(const Bearer);
0198     return d->isSuspended;
0199 }
0200 
0201 ModemManager::IpConfig ModemManager::Bearer::ip4Config() const
0202 {
0203     Q_D(const Bearer);
0204     return d->ipv4Config;
0205 }
0206 
0207 ModemManager::IpConfig ModemManager::Bearer::ip6Config() const
0208 {
0209     Q_D(const Bearer);
0210     return d->ipv6Config;
0211 }
0212 
0213 uint ModemManager::Bearer::ipTimeout() const
0214 {
0215     Q_D(const Bearer);
0216     return d->ipTimeout;
0217 }
0218 
0219 QVariantMap ModemManager::Bearer::properties() const
0220 {
0221     Q_D(const Bearer);
0222     return d->bearerProperties;
0223 }
0224 
0225 QDBusPendingReply<void> ModemManager::Bearer::connectBearer()
0226 {
0227     Q_D(Bearer);
0228     return d->bearerIface.Connect();
0229 }
0230 
0231 QDBusPendingReply<void> ModemManager::Bearer::disconnectBearer()
0232 {
0233     Q_D(Bearer);
0234     return d->bearerIface.Disconnect();
0235 }
0236 
0237 void ModemManager::Bearer::setTimeout(int timeout)
0238 {
0239     Q_D(Bearer);
0240     d->bearerIface.setTimeout(timeout);
0241 }
0242 
0243 int ModemManager::Bearer::timeout() const
0244 {
0245     Q_D(const Bearer);
0246     return d->bearerIface.timeout();
0247 }
0248 
0249 ModemManager::IpConfig ModemManager::BearerPrivate::ipConfigFromMap(const QVariantMap &map)
0250 {
0251     ModemManager::IpConfig result;
0252     result.setMethod((MMBearerIpMethod)map.value(QStringLiteral("method")).toUInt());
0253 
0254     if (result.method() == MM_BEARER_IP_METHOD_STATIC) {
0255         result.setAddress(map.value(QStringLiteral("address")).toString());
0256         result.setPrefix(map.value(QStringLiteral("prefix")).toUInt());
0257         result.setDns1(map.value(QStringLiteral("dns1")).toString());
0258         result.setDns2(map.value(QStringLiteral("dns2")).toString());
0259         result.setDns3(map.value(QStringLiteral("dns3")).toString());
0260         result.setGateway(map.value(QStringLiteral("gateway")).toString());
0261     }
0262 
0263     return result;
0264 }
0265 
0266 void ModemManager::BearerPrivate::onPropertiesChanged(const QString &interface, const QVariantMap &properties, const QStringList &invalidatedProps)
0267 {
0268     Q_Q(Bearer);
0269     Q_UNUSED(invalidatedProps);
0270     qCDebug(MMQT) << interface << properties.keys();
0271 
0272     if (interface == QLatin1String(MMQT_DBUS_INTERFACE_BEARER)) {
0273         QVariantMap::const_iterator it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_INTERFACE));
0274         if (it != properties.constEnd()) {
0275             bearerInterface = it->toString();
0276             Q_EMIT q->interfaceChanged(bearerInterface);
0277         }
0278         it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_CONNECTED));
0279         if (it != properties.constEnd()) {
0280             isConnected = it->toBool();
0281             Q_EMIT q->connectedChanged(isConnected);
0282         }
0283         it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_SUSPENDED));
0284         if (it != properties.constEnd()) {
0285             isSuspended = it->toBool();
0286             Q_EMIT q->suspendedChanged(isSuspended);
0287         }
0288         it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_IP4CONFIG));
0289         if (it != properties.constEnd()) {
0290             ipv4Config = ipConfigFromMap(qdbus_cast<QVariantMap>(*it));
0291             Q_EMIT q->ip4ConfigChanged(ipv4Config);
0292         }
0293         it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_IP6CONFIG));
0294         if (it != properties.constEnd()) {
0295             ipv6Config = ipConfigFromMap(qdbus_cast<QVariantMap>(*it));
0296             Q_EMIT q->ip6ConfigChanged(ipv6Config);
0297         }
0298         it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_IPTIMEOUT));
0299         if (it != properties.constEnd()) {
0300             ipTimeout = it->toUInt();
0301             Q_EMIT q->ipTimeoutChanged(ipTimeout);
0302         }
0303         it = properties.constFind(QLatin1String(MM_BEARER_PROPERTY_PROPERTIES));
0304         if (it != properties.constEnd()) {
0305             bearerProperties = qdbus_cast<QVariantMap>(*it);
0306             Q_EMIT q->propertiesChanged(bearerProperties);
0307         }
0308     }
0309 }
0310 
0311 QString ModemManager::Bearer::uni() const
0312 {
0313     Q_D(const Bearer);
0314     return d->uni;
0315 }
0316 
0317 #include "moc_bearer.cpp"
0318 #include "moc_bearer_p.cpp"