D25682: [WIP] add initial wsdiscovery support

David Faure noreply at phabricator.kde.org
Sat Dec 7 00:27:52 GMT 2019


dfaure requested changes to this revision.
dfaure added a comment.
This revision now requires changes to proceed.


  I guess you were expecting a higher-level review, but I don't know anything about these protocols.
  
  I'm glad to see my KDSoap library being useful in KDE too though :-)

INLINE COMMENTS

> discovery.cpp:21
> +
> +#include "discovery.h"

Not sure this .cpp file serves any purpose right now ;)

But actually the virtual destructors could be implemented here out-of-line to avoid being generated in every user of the class. The `=default` syntax would work here too.

> discovery.h:2
> +/*
> +    Copyright 2019 Harald Sitter <sitter at kde.org
> +

What happened to the '>' character?

[repeats]

> discovery.h:40
> +    virtual ~Discovery() = default;
> +    virtual void toEntry(KIO::UDSEntry &entry) = 0;
> +};

Why don't these `toEntry()` methods *return* a KIO::UDSEntry instead?
It's always empty on incoming anyway.

And UDSEntry supports moving so the "return" statement won't make a copy.

> discovery.h:51
> +    virtual void stop() = 0;
> +    virtual bool isFinished() = 0;
> +

const?

> dnssddiscoverer.cpp:46
> +    //   that assumption will be true all the time. ~sitter, 2018
> +    QUrl u(QStringLiteral("smb://"));
> +    u.setHost(m_service->hostName());

`u.setScheme(QStringLiteral("smb"))` would be slightly faster; you're constructing a URL from its parts, no need to trigger parsing.

> dnssddiscoverer.cpp:71
> +        // RemoteService::Ptr is useless here.
> +        for (const auto &it : m_services) {
> +            if (*service == *it) {

qAsConst

> dnssddiscoverer.cpp:103
> +    m_browser.disconnect();
> +    for (auto service : m_services) {
> +        service->resolve(); // Blocks until resolution happened. Our signal handle then jumps in.

qAsConst

> dnssddiscoverer.h:41
> +
> +class DNSSDDiscoverer : public QObject, public virtual Discoverer
> +{

Why `virtual`? I thought this only mattered for diamond-shaped inheritance.

(OTOH I remember it leads to strange order of ctors being called, so I avoid it as much as possible)

> .gitlab-ci.yml:2
> +fedora:
> +    image: registry.gitlab.com/caspermeijn/docker-images/fedora-build-onvifviewer:latest
> +    stage: build

(is this meant to go into kde git? just wondering)

> CMakeLists.txt.user:3
> +<!DOCTYPE QtCreatorProject>
> +<!-- Written by QtCreator 4.9.1, 2019-08-07T17:08:05. -->
> +<qtcreator>

Now this one I'm sure, should NOT go into git.

> CMakeLists.txt.user:205
> +    </valuelist>
> +    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/me/src/git/soapy/build-kdsoap-ws-discovery-client-Desktop-Release-with-Debug-Information</value>
> +    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">

... because it's about your config :)

> wsdiscoverytargetservice.cpp:38
> +
> +bool WSDiscoveryTargetService::isMatchingType(const KDQName &matchingType)
> +{

const

(this will avoid detaching m_typeList)

> wsdiscoverytargetservice.cpp:48
> +
> +bool WSDiscoveryTargetService::isMatchingScope(const QUrl &matchingScope)
> +{

same

> kio_smb_browse.cpp:479
> +       if (normalizedUrl.path().isEmpty()) {
> +#pragma message "refactor this entire function into less of a long pile of madness"
> +           qDebug() << "Trying modern discovery (dnssd/wsdiscovery)";

lol

> kio_smb_browse.cpp:494
> +           connect(&sendTimer, &QTimer::timeout, this, [&] {
> +               if (list.size() < 1) {
> +                   return;

isEmpty() is more readable.

> kio_smb_browse.cpp:503
> +           auto enterDiscovery = [&](Discovery::Ptr discovery) {
> +               discovery->toEntry(udsentry);
> +               list.append(udsentry);

With my suggestion to return a udsentry, this whole lambda becomes

`list.append(discovery->toEntry())`

(another move, no copy)

> kio_smb_browse.cpp:511
> +
> +           QList<Discoverer *> discoverers {&d, &w};
> +

const QList.... to avoid detaching in range-for below

> kio_smb_browse.cpp:519
> +                   }
> +                   allFinished &= discoverer->isFinished();
> +               }

never use &= for booleans, it's not meant for that

(it won't work for '1' and '2' which are both 'true' for booleans)

`allFinished = allFinished && discoverer->isFinished()`

Unfortunately there's no &&= in C++.

> wsdiscoverer.cpp:116
> +            qWarning() << response.faultAsString();
> +            // No return! We'd disqualify systems that do not implement pbsd.
> +        }

OK. But maybe an `else` then ?
Not much point in using response.childValues() on a fault, i.e. iterating over the fault details.

> wsdiscoverer.cpp:128
> +        QString computer;
> +        for (auto section : response.childValues()) {
> +            computer = section

Needs a const local var to avoid a detach. Yes, range-for is annoying for Qt containers.

> wsdiscoverer.cpp:160
> +
> +        const QHostAddress address(m_endpointUrl.toString());
> +        qDebug() << "++++++++++++++++++++++++++++++++++++++++++++";

unused

> wsdiscoverer.cpp:209
> +    // We do set a suitable timeout in the resolver so this doesn't take forever.
> +    for (auto future : m_futures) {
> +        future.waitForFinished();

qAsConst

auto & ?

> wsdiscoverer.cpp:252
> +        addr = xAddr;
> +#warning only get first val we only need one addr
> +    }

then rewrite this code to `.at(0)` ?

> wsdiscoverer.cpp:257
> +
> +    // Probably should just qobject this. Hardly worth the threading.
> +    m_futures << QtConcurrent::run([=] {

especially with the data races.

(service->endpointReference() reads data written by another thread, without mutex)

> wsdiscoverer.cpp:280
> +    entry.fastInsert(KIO::UDSEntry::UDS_ICON_NAME, "network-server");
> +    entry.fastInsert(KIO::UDSEntry::UDS_ICON_OVERLAY_NAMES, "/home/me/.local/share/icons/Windows10Icons/32x32/places/ubuntu-logo.png");
> +

Obviously unfinished :-)

> wsdiscoverer.h:48
> +
> +class WSDiscoverer : public QObject, public virtual Discoverer
> +{

(same question about virtual)

REPOSITORY
  R320 KIO Extras

REVISION DETAIL
  https://phabricator.kde.org/D25682

To: sitter, dfaure, #frameworks, #dolphin
Cc: ngraham, caspermeijn, davidedmundson, kde-frameworks-devel, kfm-devel, pberestov, iasensio, fprice, LeGast00n, MrPepe, fbampaloukas, alexde, GB_2, Codezela, feverfew, meven, michaelh, spoorun, navarromorales, firef, andrebarros, bruns, emmanuelp, mikesomov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.kde.org/mailman/private/kfm-devel/attachments/20191207/cf373523/attachment.htm>


More information about the kfm-devel mailing list