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