1 /*
2 SPDX-FileCopyrightText: 2004 Jakub Stachowski <qbast@go2.pl>
3
4 SPDX-License-Identifier: LGPL-2.0-only
5 */
6
7 #include "dnssdwatcher.h"
8 #include "kdnssdadaptor.h"
9 #include "watcher.h"
10
11 #include <KPluginFactory>
12
13 K_PLUGIN_CLASS_WITH_JSON(DNSSDWatcher, "dnssdwatcher.json")
14
DNSSDWatcher(QObject * parent,const QList<QVariant> &)15 DNSSDWatcher::DNSSDWatcher(QObject* parent, const QList<QVariant>&)
16 : KDEDModule(parent)
17 {
18 QDBusConnection::sessionBus().connect(QString(), QString(),
19 QStringLiteral("org.kde.KDirNotify"),
20 QStringLiteral("enteredDirectory"),
21 this, SLOT(enteredDirectory(QString)));
22 QDBusConnection::sessionBus().connect(QString(), QString(),
23 QStringLiteral("org.kde.KDirNotify"),
24 QStringLiteral("leftDirectory"),
25 this, SLOT(leftDirectory(QString)));
26 new KdnssdAdaptor( this );
27 }
28
watchedDirectories()29 QStringList DNSSDWatcher::watchedDirectories()
30 {
31 return watchers.keys();
32 }
33
34
35 // from ioslave
dissect(const QUrl & url,QString & name,QString & type)36 void DNSSDWatcher::dissect(const QUrl& url,QString& name,QString& type)
37 {
38 type = url.path().section(QChar::fromLatin1('/'),1,1);
39 name = url.path().section(QChar::fromLatin1('/'),2,-1);
40 }
41
42
43
enteredDirectory(const QString & _dir)44 void DNSSDWatcher::enteredDirectory(const QString& _dir)
45 {
46 QUrl dir(_dir);
47 if (dir.scheme() != QLatin1String("zeroconf")) {
48 return;
49 }
50 if (watchers.contains(dir.url())) {
51 watchers[dir.url()]->refcount++;
52 }
53 else {
54 createNotifier(dir);
55 }
56 }
57
58
leftDirectory(const QString & _dir)59 void DNSSDWatcher::leftDirectory(const QString& _dir)
60 {
61 QUrl dir(_dir);
62 if (dir.scheme() != QLatin1String("zeroconf")) {
63 return;
64 }
65 Watcher* watcher = watchers.value(dir.url());
66 if (!watcher) {
67 return;
68 }
69 if (watcher->refcount==1) {
70 delete watcher;
71 watchers.remove(dir.url());
72 } else {
73 watcher->refcount--;
74 }
75 }
76
77
createNotifier(const QUrl & url)78 void DNSSDWatcher::createNotifier(const QUrl& url)
79 {
80 QString type,name;
81 dissect(url,name,type);
82 if (type.isEmpty()) {
83 watchers.insert(url.url(), new TypeWatcher());
84 }
85 else {
86 watchers.insert(url.url(), new ServiceWatcher(type));
87 }
88 }
89
~DNSSDWatcher()90 DNSSDWatcher::~DNSSDWatcher()
91 {
92 qDeleteAll( watchers );
93 }
94
95 #include <dnssdwatcher.moc>
96