diff --git a/smb/discovery.h b/smb/discovery.h --- a/smb/discovery.h +++ b/smb/discovery.h @@ -31,6 +31,7 @@ Discovery(); virtual ~Discovery(); + virtual QString udsName() const = 0; virtual KIO::UDSEntry toEntry() const = 0; }; diff --git a/smb/dnssddiscoverer.h b/smb/dnssddiscoverer.h --- a/smb/dnssddiscoverer.h +++ b/smb/dnssddiscoverer.h @@ -32,6 +32,7 @@ { public: DNSSDDiscovery(KDNSSD::RemoteService::Ptr service); + QString udsName() const override; KIO::UDSEntry toEntry() const override; private: diff --git a/smb/dnssddiscoverer.cpp b/smb/dnssddiscoverer.cpp --- a/smb/dnssddiscoverer.cpp +++ b/smb/dnssddiscoverer.cpp @@ -26,10 +26,15 @@ { } +QString DNSSDDiscovery::udsName() const +{ + return m_service->serviceName(); +} + KIO::UDSEntry DNSSDDiscovery::toEntry() const { KIO::UDSEntry entry; - entry.fastInsert(KIO::UDSEntry::UDS_NAME, m_service->serviceName()); + entry.fastInsert(KIO::UDSEntry::UDS_NAME, udsName()); entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); diff --git a/smb/kio_smb_browse.cpp b/smb/kio_smb_browse.cpp --- a/smb/kio_smb_browse.cpp +++ b/smb/kio_smb_browse.cpp @@ -509,6 +509,7 @@ QEventLoop e; UDSEntryList list; + QStringList discoveredNames; const auto flushEntries = [this, &list]() { if (list.isEmpty()) { @@ -538,7 +539,13 @@ const QList discoverers {&d, &w}; - auto appendDiscovery = [&](const Discovery::Ptr &discovery) { list.append(discovery->toEntry()); }; + auto appendDiscovery = [&](const Discovery::Ptr &discovery) { + if (discoveredNames.contains(discovery->udsName())) { + return; + } + discoveredNames << discovery->udsName(); + list.append(discovery->toEntry()); + }; auto maybeFinished = [&] { // finishes if all discoveries finished bool allFinished = true; diff --git a/smb/wsdiscoverer.h b/smb/wsdiscoverer.h --- a/smb/wsdiscoverer.h +++ b/smb/wsdiscoverer.h @@ -41,7 +41,7 @@ public: WSDiscovery(const QString &computer, const QString &remote); - + QString udsName() const override; KIO::UDSEntry toEntry() const override; }; diff --git a/smb/wsdiscoverer.cpp b/smb/wsdiscoverer.cpp --- a/smb/wsdiscoverer.cpp +++ b/smb/wsdiscoverer.cpp @@ -295,10 +295,15 @@ { } +QString WSDiscovery::udsName() const +{ + return m_computer; +} + KIO::UDSEntry WSDiscovery::toEntry() const { KIO::UDSEntry entry; - entry.fastInsert(KIO::UDSEntry::UDS_NAME, m_computer); + entry.fastInsert(KIO::UDSEntry::UDS_NAME, udsName()); entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH));