DNSSD
mdnsd-domainbrowser.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "mdnsd-domainbrowser_p.h"
00022 #include "domainbrowser.h"
00023 #include "settings.h"
00024 #include "remoteservice.h"
00025 #include "mdnsd-responder.h"
00026 #include "mdnsd-sdevent.h"
00027
00028 #include <QtCore/QCoreApplication>
00029 #include <QtCore/QHash>
00030 #include <QtCore/QStringList>
00031 #include <QtDBus/QtDBus>
00032
00033 namespace DNSSD
00034 {
00035
00036 void domain_callback(DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, const char *replyDomain, void *context);
00037
00038 DomainBrowser::DomainBrowser(DomainType type, QObject *parent) : QObject(parent),d(new DomainBrowserPrivate(type,this))
00039 {
00040 d->m_domains = Configuration::domainList();
00041
00042
00043 const QString dbusPath = "/libdnssd";
00044 const QString dbusInterface = "org.kde.DNSSD.DomainBrowser";
00045 QDBusConnection dbus = QDBusConnection::sessionBus();
00046 dbus.connect( QString(), dbusPath, dbusInterface, "domainListChanged", this, SLOT(domainListChanged()) );
00047 }
00048
00049 DomainBrowser::~DomainBrowser()
00050 {
00051 delete d;
00052 }
00053
00054
00055 void DomainBrowser::startBrowse()
00056 {
00057 QStringList::const_iterator itEnd = d->m_domains.end();
00058 for (QStringList::const_iterator it=d->m_domains.begin(); it!=itEnd; ++it ) emit domainAdded(*it);
00059 if (d->isRunning()) return;
00060 DNSServiceRef ref;
00061 if (DNSServiceEnumerateDomains(&ref,(d->m_type==Browsing) ? kDNSServiceFlagsBrowseDomains:kDNSServiceFlagsBrowseDomains,
00062 0, domain_callback,reinterpret_cast<void*>(d)) == kDNSServiceErr_NoError) d->setRef(ref);
00063 }
00064
00065 void DomainBrowserPrivate::customEvent(QEvent* event)
00066 {
00067 if (event->type()==QEvent::User+SD_ERROR) stop();
00068 if (event->type()==QEvent::User+SD_ADDREMOVE) {
00069 AddRemoveEvent *aev = static_cast<AddRemoveEvent*>(event);
00070 if (aev->m_op==AddRemoveEvent::Add) {
00071
00072 if (m_domains.contains(aev->m_domain)) return;
00073 m_domains.append(aev->m_domain);
00074 emit m_parent->domainAdded(aev->m_domain);
00075 }
00076 else {
00077 m_domains.removeAll(aev->m_domain);
00078 emit m_parent->domainRemoved(aev->m_domain);
00079 }
00080 }
00081 }
00082
00083 void DomainBrowserPrivate::domainListChanged()
00084 {
00085 bool was_running = m_running;
00086 m_running = false;
00087 if (was_running) {
00088 QStringList::const_iterator itEnd = m_domains.end();
00089 for (QStringList::const_iterator it=m_domains.begin(); it!=itEnd; ++it )
00090 emit m_parent->domainRemoved(*it);
00091 }
00092 m_domains.clear();
00093
00094 Configuration::self()->readConfig();
00095 m_domains = Configuration::domainList();
00096
00097 if (was_running) m_parent->startBrowse();
00098 }
00099
00100 QStringList DomainBrowser::domains() const
00101 {
00102 return d->m_domains;
00103 }
00104
00105 bool DomainBrowser::isRunning() const
00106 {
00107 return d->isRunning();
00108 }
00109
00110 void domain_callback(DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, const char *replyDomain, void *context)
00111 {
00112 QObject *obj = reinterpret_cast<QObject*>(context);
00113 if (errorCode != kDNSServiceErr_NoError) {
00114 ErrorEvent err;
00115 QCoreApplication::sendEvent(obj, &err);
00116 } else {
00117
00118 if (flags&kDNSServiceFlagsDefault) return;
00119 AddRemoveEvent arev((flags & kDNSServiceFlagsAdd) ? AddRemoveEvent::Add :
00120 AddRemoveEvent::Remove, QString(), QString(),
00121 DNSToDomain(replyDomain), !(flags & kDNSServiceFlagsMoreComing));
00122 QCoreApplication::sendEvent(obj, &arev);
00123 }
00124 }
00125
00126 }
00127
00128
00129
00130 #include "domainbrowser.moc"
00131 #include "mdnsd-domainbrowser_p.moc"