From ce4a32fe52ef09d8f5ff1dd22c001110902b60a2 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- dnssd/responder.cpp | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 dnssd/responder.cpp (limited to 'dnssd/responder.cpp') diff --git a/dnssd/responder.cpp b/dnssd/responder.cpp new file mode 100644 index 000000000..3721d3aae --- /dev/null +++ b/dnssd/responder.cpp @@ -0,0 +1,108 @@ +/* This file is part of the KDE project + * + * Copyright (C) 2004 Jakub Stachowski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "responder.h" +#include +#include + +// dns_sd.h API should care about proper encoding of non-latin1 characters +// but for now it does not +#define IDN_BROKEN_IN_MDNSRESPONDER + +namespace DNSSD +{ + +Responder::Responder(DNSServiceRef ref,QObject *parent, const char *name) + : QObject(parent, name), m_ref(0), m_socket(0) +{ + setRef(ref); +} + +void Responder::setRef(DNSServiceRef ref) +{ + if (m_socket || m_ref) stop(); + m_running = false; + m_ref = ref; + if (m_ref == 0 ) return; +#ifdef HAVE_DNSSD + int fd = DNSServiceRefSockFD(ref); + if (fd == -1) return; + m_socket = new QSocketNotifier(fd,QSocketNotifier::Read,this); + connect(m_socket,SIGNAL(activated(int)),this,SLOT(process())); + m_running = true; +#endif +} +Responder::~Responder() +{ + stop(); +} + +void Responder::stop() +{ + if (m_socket) delete m_socket; + m_socket = 0; +#ifdef HAVE_DNSSD + if (m_ref) DNSServiceRefDeallocate(m_ref); +#endif + m_ref = 0; + m_running = false; +} + + +void Responder::process() +{ +#ifdef HAVE_DNSSD + if ( DNSServiceProcessResult(m_ref) != kDNSServiceErr_NoError) stop(); +#endif +} + +bool Responder::isRunning() const +{ + return m_running; +} + +bool domainIsLocal(const QString& domain) +{ + return domain.section('.',-1,-1).lower()=="local"; +} + +QCString domainToDNS(const QString &domain) +{ +#ifdef IDN_BROKEN_IN_MDNSRESPONDER + if (domainIsLocal(domain)) return domain.utf8(); + else return KIDNA::toAsciiCString(domain); +#else + return domain.utf8(); +#endif +} + +QString DNSToDomain(const char* domain) +{ +#ifdef IDN_BROKEN_IN_MDNSRESPONDER + if (domainIsLocal(domain)) return QString::fromUtf8(domain); + else return KIDNA::toUnicode(domain); +#else + return QString::fromUtf8(domain); +#endif +} + + +} +#include "responder.moc" -- cgit v1.2.3