From 6af9b55738de30b7266e7fde84b363b4e377c7d6 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Thu, 5 May 2022 16:35:55 +0300 Subject: [PATCH] generic: reimplement kdnssd library works as expected, services queries include two for IPv4 and one for the advertised IPv6 address which have to be filtered: https://ibb.co/4VpJK9V Signed-off-by: Ivailo Monev --- CMakeLists.txt | 13 +- cmake/modules/CMakeLists.txt | 1 - cmake/modules/FindAvahi.cmake | 33 +- cmake/modules/FindDNSSD.cmake | 46 -- cmake/modules/FindKDE4Internal.cmake | 4 +- dnssd/CMakeLists.txt | 110 ----- dnssd/PACKAGERS | 3 - dnssd/avahi-domainbrowser.cpp | 107 ----- dnssd/avahi-domainbrowser_p.h | 50 --- dnssd/avahi-publicservice.cpp | 257 ----------- dnssd/avahi-publicservice_p.h | 73 --- dnssd/avahi-remoteservice.cpp | 117 ----- dnssd/avahi-remoteservice_p.h | 58 --- dnssd/avahi-servicebrowser.cpp | 188 -------- dnssd/avahi-servicebrowser_p.h | 66 --- dnssd/avahi-servicetypebrowser.cpp | 94 ---- dnssd/avahi-servicetypebrowser_p.h | 53 --- dnssd/avahi_entrygroup_interface.cpp | 28 -- dnssd/avahi_entrygroup_interface.h | 115 ----- dnssd/avahi_server_interface.cpp | 54 --- dnssd/avahi_server_interface.h | 250 ----------- dnssd/avahi_serviceresolver_interface.cpp | 29 -- dnssd/avahi_serviceresolver_interface.h | 57 --- dnssd/domainbrowser.h | 145 ------ dnssd/domainmodel.cpp | 89 ---- dnssd/domainmodel.h | 97 ---- dnssd/dummy-domainbrowser.cpp | 48 -- dnssd/dummy-publicservice.cpp | 94 ---- dnssd/dummy-remoteservice.cpp | 55 --- dnssd/dummy-servicebrowser.cpp | 69 --- dnssd/dummy-servicetypebrowser.cpp | 44 -- dnssd/kcm_kdnssd.kcfg | 13 - dnssd/mdnsd-domainbrowser.cpp | 131 ------ dnssd/mdnsd-domainbrowser_p.h | 46 -- dnssd/mdnsd-publicservice.cpp | 203 --------- dnssd/mdnsd-remoteservice.cpp | 149 ------ dnssd/mdnsd-responder.cpp | 85 ---- dnssd/mdnsd-responder.h | 69 --- dnssd/mdnsd-sdevent.h | 81 ---- dnssd/mdnsd-servicebrowser.cpp | 198 -------- dnssd/mdnsd-servicebrowser_p.h | 60 --- dnssd/mdnsd-servicetypebrowser.cpp | 72 --- dnssd/mdnsd-servicetypebrowser_p.h | 46 -- dnssd/org.freedesktop.Avahi.DomainBrowser.xml | 56 --- .../org.freedesktop.Avahi.ServiceBrowser.xml | 59 --- ...g.freedesktop.Avahi.ServiceTypeBrowser.xml | 57 --- dnssd/publicservice.h | 233 ---------- dnssd/remoteservice.h | 138 ------ dnssd/servicebase.cpp | 88 ---- dnssd/servicebase.h | 203 --------- dnssd/servicebase_p.h | 50 --- dnssd/servicebrowser.h | 290 ------------ dnssd/servicemodel.cpp | 108 ----- dnssd/servicemodel.h | 126 ------ dnssd/servicetypebrowser.h | 146 ------ dnssd/settings.kcfgc | 12 - includes/CMakeLists.txt | 15 - includes/DNSSD/Configuration | 1 - includes/DNSSD/DomainBrowser | 1 - includes/DNSSD/DomainModel | 1 - includes/DNSSD/PublicService | 1 - includes/DNSSD/RemoteService | 1 - includes/DNSSD/ServiceBase | 1 - includes/DNSSD/ServiceBrowser | 1 - includes/DNSSD/ServiceModel | 1 - includes/DNSSD/ServiceTypeBrowser | 1 - kdecore/kdebug.areas | 3 + kutils/CMakeLists.txt | 1 + kutils/kdnssd/CMakeLists.txt | 43 ++ kutils/kdnssd/kdnssd.cpp | 425 ++++++++++++++++++ kutils/kdnssd/kdnssd.h | 74 +++ 71 files changed, 577 insertions(+), 5159 deletions(-) delete mode 100644 cmake/modules/FindDNSSD.cmake delete mode 100644 dnssd/CMakeLists.txt delete mode 100644 dnssd/PACKAGERS delete mode 100644 dnssd/avahi-domainbrowser.cpp delete mode 100644 dnssd/avahi-domainbrowser_p.h delete mode 100644 dnssd/avahi-publicservice.cpp delete mode 100644 dnssd/avahi-publicservice_p.h delete mode 100644 dnssd/avahi-remoteservice.cpp delete mode 100644 dnssd/avahi-remoteservice_p.h delete mode 100644 dnssd/avahi-servicebrowser.cpp delete mode 100644 dnssd/avahi-servicebrowser_p.h delete mode 100644 dnssd/avahi-servicetypebrowser.cpp delete mode 100644 dnssd/avahi-servicetypebrowser_p.h delete mode 100644 dnssd/avahi_entrygroup_interface.cpp delete mode 100644 dnssd/avahi_entrygroup_interface.h delete mode 100644 dnssd/avahi_server_interface.cpp delete mode 100644 dnssd/avahi_server_interface.h delete mode 100644 dnssd/avahi_serviceresolver_interface.cpp delete mode 100644 dnssd/avahi_serviceresolver_interface.h delete mode 100644 dnssd/domainbrowser.h delete mode 100644 dnssd/domainmodel.cpp delete mode 100644 dnssd/domainmodel.h delete mode 100644 dnssd/dummy-domainbrowser.cpp delete mode 100644 dnssd/dummy-publicservice.cpp delete mode 100644 dnssd/dummy-remoteservice.cpp delete mode 100644 dnssd/dummy-servicebrowser.cpp delete mode 100644 dnssd/dummy-servicetypebrowser.cpp delete mode 100644 dnssd/kcm_kdnssd.kcfg delete mode 100644 dnssd/mdnsd-domainbrowser.cpp delete mode 100644 dnssd/mdnsd-domainbrowser_p.h delete mode 100644 dnssd/mdnsd-publicservice.cpp delete mode 100644 dnssd/mdnsd-remoteservice.cpp delete mode 100644 dnssd/mdnsd-responder.cpp delete mode 100644 dnssd/mdnsd-responder.h delete mode 100644 dnssd/mdnsd-sdevent.h delete mode 100644 dnssd/mdnsd-servicebrowser.cpp delete mode 100644 dnssd/mdnsd-servicebrowser_p.h delete mode 100644 dnssd/mdnsd-servicetypebrowser.cpp delete mode 100644 dnssd/mdnsd-servicetypebrowser_p.h delete mode 100644 dnssd/org.freedesktop.Avahi.DomainBrowser.xml delete mode 100644 dnssd/org.freedesktop.Avahi.ServiceBrowser.xml delete mode 100644 dnssd/org.freedesktop.Avahi.ServiceTypeBrowser.xml delete mode 100644 dnssd/publicservice.h delete mode 100644 dnssd/remoteservice.h delete mode 100644 dnssd/servicebase.cpp delete mode 100644 dnssd/servicebase.h delete mode 100644 dnssd/servicebase_p.h delete mode 100644 dnssd/servicebrowser.h delete mode 100644 dnssd/servicemodel.cpp delete mode 100644 dnssd/servicemodel.h delete mode 100644 dnssd/servicetypebrowser.h delete mode 100644 dnssd/settings.kcfgc delete mode 100644 includes/DNSSD/Configuration delete mode 100644 includes/DNSSD/DomainBrowser delete mode 100644 includes/DNSSD/DomainModel delete mode 100644 includes/DNSSD/PublicService delete mode 100644 includes/DNSSD/RemoteService delete mode 100644 includes/DNSSD/ServiceBase delete mode 100644 includes/DNSSD/ServiceBrowser delete mode 100644 includes/DNSSD/ServiceModel delete mode 100644 includes/DNSSD/ServiceTypeBrowser create mode 100644 kutils/kdnssd/CMakeLists.txt create mode 100644 kutils/kdnssd/kdnssd.cpp create mode 100644 kutils/kdnssd/kdnssd.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 30fa1616..3a863ea1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -133,17 +133,9 @@ set_package_properties(ACL macro_optional_find_package(Avahi) set_package_properties(Avahi PROPERTIES DESCRIPTION "Facilities for service discovery on a local network (DNSSD)" - URL "http://avahi.org" + URL "https://avahi.org/" TYPE OPTIONAL - PURPOSE "Either Avahi or DNSSD is required for KDE applications to make use of multicast DNS/DNS-SD service discovery" -) - -macro_optional_find_package(DNSSD) -set_package_properties(DNSSD PROPERTIES - DESCRIPTION "Facilities for service discovery on a local network" - URL "http://avahi.org" - TYPE OPTIONAL - PURPOSE "Either Avahi or DNSSD is required for KDE applications to make use of multicast DNS/DNS-SD service discovery" + PURPOSE "Avahi is required for KDE applications to make use of multicast DNS/DNS-SD service discovery" ) macro_optional_find_package(BZip2) @@ -359,7 +351,6 @@ set(KDE4_KPARTS_INCLUDES add_subdirectory( cmake ) -add_subdirectory( dnssd ) add_subdirectory( includes ) add_subdirectory( interfaces ) add_subdirectory( kdeclarative ) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 9ec6f9db..9f25ce05 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -9,7 +9,6 @@ set(cmakeFilesDontInstall FindMPV.cmake FindUDev.cmake FindAvahi.cmake - FindDNSSD.cmake FindENCHANT.cmake FindACL.cmake FindLibCDIO.cmake diff --git a/cmake/modules/FindAvahi.cmake b/cmake/modules/FindAvahi.cmake index b205539a..0028c445 100644 --- a/cmake/modules/FindAvahi.cmake +++ b/cmake/modules/FindAvahi.cmake @@ -1,19 +1,40 @@ -# Try to find the Avahi, once done this will define: +# Try to find Avahi library, once done this will define: # # AVAHI_FOUND - system has Avahi # AVAHI_INCLUDE_DIR - the Avahi include directory +# AVAHI_LIBRARIES - the libraries needed to use Avahi # # Copyright (c) 2020 Ivailo Monev # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. -find_path(AVAHI_INCLUDE_DIR - NAMES avahi-common/defs.h - HINTS $ENV{AVAHIDIR}/include -) +if(NOT WIN32) + include(FindPkgConfig) + pkg_check_modules(PC_AVAHI QUIET avahi-client) + + set(AVAHI_INCLUDE_DIR ${PC_AVAHI_INCLUDE_DIRS}) + set(AVAHI_LIBRARIES ${PC_AVAHI_LIBRARIES}) +endif() + +set(AVAHI_VERSION ${PC_AVAHI_VERSION}) + +if(NOT AVAHI_INCLUDE_DIR OR NOT AVAHI_LIBRARIES) + find_path(AVAHI_INCLUDE_DIR + NAMES avahi-client/client.h + HINTS $ENV{AVAHIDIR}/include + ) + + find_library(AVAHI_LIBRARIES + NAMES avahi-client + HINTS $ENV{AVAHIDIR}/lib + ) +endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Avahi - REQUIRED_VARS AVAHI_INCLUDE_DIR + VERSION_VAR AVAHI_VERSION + REQUIRED_VARS AVAHI_LIBRARIES AVAHI_INCLUDE_DIR ) + +mark_as_advanced(AVAHI_INCLUDE_DIR AVAHI_LIBRARIES) diff --git a/cmake/modules/FindDNSSD.cmake b/cmake/modules/FindDNSSD.cmake deleted file mode 100644 index 679dba74..00000000 --- a/cmake/modules/FindDNSSD.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# Try to find DNSSD, once done this will define: -# -# DNSSD_FOUND - system has DNSSD -# DNSSD_INCLUDE_DIR - the DNSSD include directory -# DNSSD_LIBRARIES - Link these to use dnssd -# DNSSD_DEFINITIONS - Compiler switches required for using DNSSD -# -# need more test: look at into dnssd/configure.in.in - -# Copyright (c) 2006, Laurent Montel, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -include(CMakePushCheckState) - -find_path(DNSSD_INCLUDE_DIR - NAMES dns_sd.h - PATH_SUFFIXES avahi-compat-libdns_sd -) - -if(DNSSD_INCLUDE_DIR) - find_library(DNSSD_LIBRARIES NAMES dns_sd) - - cmake_reset_check_state() - set(CMAKE_REQUIRED_INCLUDES ${DNSSD_INCLUDE_DIR}) - set(CMAKE_REQUIRED_LIBRARIES ${DNSSD_LIBRARIES}) - CHECK_FUNCTION_EXISTS(DNSServiceRefDeallocate DNSSD_FUNCTION_FOUND) - cmake_reset_check_state() - - if(DNSSD_INCLUDE_DIR AND DNSSD_LIBRARIES AND DNSSD_FUNCTION_FOUND) - set(DNSSD_FOUND TRUE) - endif() -endif() - -if(DNSSD_FOUND) - if (NOT DNSSD_FIND_QUIETLY) - message(STATUS "Found DNSSD: ${DNSSD_LIBRARIES}") - endif() -else() - if(DNSSD_FIND_REQUIRED) - message(FATAL_ERROR "Could NOT find DNSSD") - endif() -endif() - -MARK_AS_ADVANCED(DNSSD_INCLUDE_DIR DNSSD_LIBRARIES) diff --git a/cmake/modules/FindKDE4Internal.cmake b/cmake/modules/FindKDE4Internal.cmake index cf1a60ec..4405cac6 100644 --- a/cmake/modules/FindKDE4Internal.cmake +++ b/cmake/modules/FindKDE4Internal.cmake @@ -51,7 +51,6 @@ # KDE4_KIDLETIME_LIBS - the kidletime library and all depending libraries # KDE4_KCMUTILS_LIBS - the kcmutils library and all depending libraries # KDE4_KFILE_LIBS - the kfile library and all depending libraries -# KDE4_KDNSSD_LIBS - the kdnssd library and all depending libraries # KDE4_KPTY_LIBS - the kpty library and all depending libraries # KDE4_SOLID_LIBS - the solid library and all depending libraries # KDE4_KNOTIFYCONFIG_LIBS - the knotify config library and all depending libraries @@ -61,6 +60,7 @@ # KDE4_KMEDIAPLAYER_LIBS - the kmediaplayer library and all depending libraries # KDE4_KPASSWDSTORE_LIBS - the kpasswdstore library and all depending libraries # KDE4_KPOWERMANAGER_LIBS - the kpowermanager library and all depending libraries +# KDE4_KDNSSD_LIBS - the kdnssd library and all depending libraries # # The variable INSTALL_TARGETS_DEFAULT_ARGS can be used when installing libraries # or executables into the default locations. @@ -284,10 +284,10 @@ set(_kde_libraries kdeclarative kdecore kdeui - kdnssd kexiv2 kpasswdstore kpowermanager + kdnssd kfile kidletime kio diff --git a/dnssd/CMakeLists.txt b/dnssd/CMakeLists.txt deleted file mode 100644 index 4af69766..00000000 --- a/dnssd/CMakeLists.txt +++ /dev/null @@ -1,110 +0,0 @@ -project(dnssd) - -include_directories( ${KDE4_KDECORE_INCLUDES} ) - -set(kdnssd_LIB_SRCS - servicebase.cpp - servicemodel.cpp - domainmodel.cpp -) -kde4_add_kcfg_files(kdnssd_LIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/settings.kcfgc) - -if(AVAHI_FOUND) - include_directories( ${AVAHI_INCLUDE_DIR} ) - set(kdnssd_LIB_SRCS ${kdnssd_LIB_SRCS} - avahi-domainbrowser.cpp - avahi-servicebrowser.cpp - avahi-remoteservice.cpp - avahi-publicservice.cpp - avahi-servicetypebrowser.cpp - avahi_server_interface.cpp - avahi_serviceresolver_interface.cpp - avahi_entrygroup_interface.cpp - ) - qt4_add_dbus_interface( - kdnssd_LIB_SRCS - org.freedesktop.Avahi.DomainBrowser.xml - avahi_domainbrowser_interface - ) - qt4_add_dbus_interface( - kdnssd_LIB_SRCS - org.freedesktop.Avahi.ServiceBrowser.xml - avahi_servicebrowser_interface - ) - qt4_add_dbus_interface( - kdnssd_LIB_SRCS - org.freedesktop.Avahi.ServiceTypeBrowser.xml - avahi_servicetypebrowser_interface - ) -elseif(DNSSD_FOUND) - include_directories( ${DNSSD_INCLUDE_DIR} ) - set(kdnssd_LIB_SRCS ${kdnssd_LIB_SRCS} - mdnsd-domainbrowser.cpp - mdnsd-remoteservice.cpp - mdnsd-publicservice.cpp - mdnsd-responder.cpp - mdnsd-servicebrowser.cpp - mdnsd-servicetypebrowser.cpp - ) -else() - set(kdnssd_LIB_SRCS ${kdnssd_LIB_SRCS} - dummy-domainbrowser.cpp - dummy-remoteservice.cpp - dummy-publicservice.cpp - dummy-servicebrowser.cpp - dummy-servicetypebrowser.cpp - ) -endif() - -########### next target ############### - -add_library(kdnssd ${LIBRARY_TYPE} ${kdnssd_LIB_SRCS}) - -target_link_libraries(kdnssd PRIVATE - ${KDE4_KDECORE_LIBS} - ${QT_QTNETWORK_LIBRARY} -) - -if(DNSSD_FOUND) - target_link_libraries(kdnssd PRIVATE - ${DNSSD_LIBRARIES} - ) -endif() - -target_link_libraries(kdnssd PUBLIC kdecore ${QT_QTCORE_LIBRARY} ) - -set_target_properties(kdnssd PROPERTIES - VERSION ${GENERIC_LIB_VERSION} - SOVERSION ${GENERIC_LIB_SOVERSION} -) - -install( - TARGETS kdnssd - EXPORT kdelibsLibraryTargets - ${INSTALL_TARGETS_DEFAULT_ARGS} -) - -########### install files ############### - -generate_export_header(kdnssd) - -install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/kdnssd_export.h - domainbrowser.h - remoteservice.h - servicetypebrowser.h - publicservice.h - servicebase.h - servicebrowser.h - servicemodel.h - domainmodel.h - ${CMAKE_CURRENT_BINARY_DIR}/settings.h - DESTINATION ${KDE4_INCLUDE_INSTALL_DIR}/dnssd - COMPONENT Devel -) - - - - - diff --git a/dnssd/PACKAGERS b/dnssd/PACKAGERS deleted file mode 100644 index fca728dd..00000000 --- a/dnssd/PACKAGERS +++ /dev/null @@ -1,3 +0,0 @@ -If you package kdnssd with Avahi support (default on Linux) make sure that NSS -module for mdns is also a dependency. Without nss-mdns working, users will be -able to see remote services but trying to access them will fail. diff --git a/dnssd/avahi-domainbrowser.cpp b/dnssd/avahi-domainbrowser.cpp deleted file mode 100644 index 8343594c..00000000 --- a/dnssd/avahi-domainbrowser.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* 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 "avahi-domainbrowser_p.h" -#include -#include -#include -#include -#include -#include "avahi_server_interface.h" -#include "domainbrowser.h" -#include "avahi_domainbrowser_interface.h" - - - -Q_DECLARE_METATYPE(QList) -namespace DNSSD -{ - -DomainBrowser::DomainBrowser(DomainType type, QObject *parent) : QObject(parent), d(new DomainBrowserPrivate(type,this)) -{} - -DomainBrowser::~DomainBrowser() -{ - delete d; -} - - -void DomainBrowser::startBrowse() -{ - if (d->m_started) return; - d->m_started=true; - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - QDBusReply rep=s.DomainBrowserNew(-1, -1, "", (d->m_type==Browsing) ? - AVAHI_DOMAIN_BROWSER_BROWSE : AVAHI_DOMAIN_BROWSER_REGISTER,0); - - if (!rep.isValid()) return; - org::freedesktop::Avahi::DomainBrowser *b=new org::freedesktop::Avahi::DomainBrowser("org.freedesktop.Avahi",rep.value().path(), - QDBusConnection::systemBus()); - connect(b,SIGNAL(ItemNew(int,int,QString,uint)),d, SLOT(gotNewDomain(int,int,QString,uint))); - connect(b,SIGNAL(ItemRemove(int,int,QString,uint)),d, SLOT(gotRemoveDomain(int,int,QString,uint))); - d->m_browser=b; - if (d->m_type==Browsing) { - QString domains_evar=qgetenv("AVAHI_BROWSE_DOMAINS"); - if (!domains_evar.isEmpty()) { - QStringList edomains=domains_evar.split(':'); - Q_FOREACH(const QString &s, edomains) d->gotNewDomain(-1,-1,s,0); - } - KStandardDirs dirs; - //FIXME: watch this file and restart browser if it changes - QFile domains_cfg(dirs.localxdgconfdir()+"/avahi/browse-domains"); - if (domains_cfg.open(QIODevice::ReadOnly | QIODevice::Text)) - while (!domains_cfg.atEnd()) d->gotNewDomain(-1,-1,QString::fromUtf8(domains_cfg.readLine().data()).trimmed(),0); - - } - -} - -void DomainBrowserPrivate::gotNewDomain(int,int,const QString& domain,uint) -{ - QString decoded=DNSToDomain(domain); - if (m_domains.contains(decoded)) return; - m_domains+=decoded; - emit m_parent->domainAdded(decoded); -} - -void DomainBrowserPrivate::gotRemoveDomain(int,int,const QString& domain,uint) -{ - QString decoded=DNSToDomain(domain); - if (!m_domains.contains(decoded)) return; - emit m_parent->domainRemoved(decoded); - m_domains.remove(decoded); -} - - -QStringList DomainBrowser::domains() const -{ - return d->m_domains.values(); -} - -bool DomainBrowser::isRunning() const -{ - return d->m_started; -} - - -} -#include "moc_domainbrowser.cpp" -#include "moc_avahi-domainbrowser_p.cpp" diff --git a/dnssd/avahi-domainbrowser_p.h b/dnssd/avahi-domainbrowser_p.h deleted file mode 100644 index 1bf895cb..00000000 --- a/dnssd/avahi-domainbrowser_p.h +++ /dev/null @@ -1,50 +0,0 @@ -/* 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. - */ - -#ifndef AVAHI_DOMAINBROWSER_P_H -#define AVAHI_DOMAINBROWSER_P_H - -#include -#include "domainbrowser.h" -#include "avahi_domainbrowser_interface.h" - -namespace DNSSD -{ - -class DomainBrowserPrivate : public QObject -{ -Q_OBJECT -public: - DomainBrowserPrivate(DomainBrowser::DomainType type, DomainBrowser* parent) : m_type(type), m_browser(0), m_parent(parent),m_started(false) {} - ~DomainBrowserPrivate() { if (m_browser) m_browser->Free(); } - - DomainBrowser::DomainType m_type; - org::freedesktop::Avahi::DomainBrowser* m_browser; - DomainBrowser* m_parent; - bool m_started; - QSet m_domains; -public Q_SLOTS: - void gotNewDomain(int,int,const QString&, uint); - void gotRemoveDomain(int,int,const QString&, uint); - -}; - -} -#endif diff --git a/dnssd/avahi-publicservice.cpp b/dnssd/avahi-publicservice.cpp deleted file mode 100644 index 3b7df9c2..00000000 --- a/dnssd/avahi-publicservice.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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 "avahi-publicservice_p.h" - -#include -#include - -#include "publicservice.h" -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#include "servicebrowser.h" -#include "settings.h" -#include "avahi_server_interface.h" -#include "avahi_entrygroup_interface.h" -Q_DECLARE_METATYPE(QList) - -namespace DNSSD -{ - -PublicService::PublicService(const QString& name, const QString& type, unsigned int port, - const QString& domain, const QStringList& subtypes) - : QObject(), ServiceBase(new PublicServicePrivate(this, name, type, domain, port)) -{ - K_D; - if (domain.isNull()) d->m_domain="local."; - d->m_subtypes=subtypes; -} - - -PublicService::~PublicService() -{ - stop(); -} - -void PublicServicePrivate::tryApply() -{ - if (fillEntryGroup()) commit(); - else { - m_parent->stop(); - emit m_parent->published(false); - } -} - -void PublicService::setServiceName(const QString& serviceName) -{ - K_D; - d->m_serviceName = serviceName; - if (d->m_running) { - d->m_group->Reset(); - d->tryApply(); - } -} - -void PublicService::setDomain(const QString& domain) -{ - K_D; - d->m_domain = domain; - if (d->m_running) { - d->m_group->Reset(); - d->tryApply(); - } -} - - -void PublicService::setType(const QString& type) -{ - K_D; - d->m_type = type; - if (d->m_running) { - d->m_group->Reset(); - d->tryApply(); - } -} - -void PublicService::setSubTypes(const QStringList& subtypes) -{ - K_D; - d->m_subtypes = subtypes; - if (d->m_running) { - d->m_group->Reset(); - d->tryApply(); - } -} - -QStringList PublicService::subtypes() const -{ - K_D; - return d->m_subtypes; -} - -void PublicService::setPort(unsigned short port) -{ - K_D; - d->m_port = port; - if (d->m_running) { - d->m_group->Reset(); - d->tryApply(); - } -} - -void PublicService::setTextData(const QMap& textData) -{ - K_D; - d->m_textData = textData; - if (d->m_running) { - d->m_group->Reset(); - d->tryApply(); - } -} - -bool PublicService::isPublished() const -{ - K_D; - return d->m_published; -} - -bool PublicService::publish() -{ - K_D; - publishAsync(); - while (d->m_running && !d->m_published) QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - return d->m_published; -} - -void PublicService::stop() -{ - K_D; - if (d->m_group) d->m_group->Reset(); - d->m_running = false; - d->m_published = false; -} -bool PublicServicePrivate::fillEntryGroup() -{ - registerTypes(); - if (!m_group) { - QDBusReply rep=m_server->EntryGroupNew(); - if (!rep.isValid()) return false; - m_group=new org::freedesktop::Avahi::EntryGroup("org.freedesktop.Avahi",rep.value().path(), QDBusConnection::systemBus()); - connect(m_group,SIGNAL(StateChanged(int,QString)), this, SLOT(groupStateChanged(int,QString))); - } - if (m_serviceName.isNull()) { - QDBusReply rep=m_server->GetHostName(); - if (!rep.isValid()) return false; - m_serviceName=rep.value(); - } - - QList txt; - QMap::ConstIterator itEnd = m_textData.constEnd(); - for (QMap::ConstIterator it = m_textData.constBegin(); it!=itEnd ; ++it) - if (it.value().isNull()) txt.append(it.key().toLatin1()); - else txt.append(it.key().toLatin1()+'='+it.value()); - - - for (;;) { - QDBusReply ret = m_group->AddService(-1,-1, 0, m_serviceName, m_type , domainToDNS(m_domain) , - m_hostName, m_port,txt); - if (ret.isValid()) break; - - // serious error, bail out - if (ret.error().name()!=QLatin1String("org.freedesktop.Avahi.CollisionError")) return false; - - // name collision, try another - QDBusReply rep=m_server->GetAlternativeServiceName(m_serviceName); - if (rep.isValid()) m_serviceName = rep.value(); - else return false; - } - - Q_FOREACH(const QString &subtype, m_subtypes) - m_group->AddServiceSubtype(-1,-1, 0, m_serviceName, m_type, domainToDNS(m_domain) , subtype); - return true; -} - -void PublicServicePrivate::serverStateChanged(int s,const QString&) -{ - if (!m_running) return; - switch (s) { - case AVAHI_SERVER_INVALID: - m_parent->stop(); - emit m_parent->published(false); - break; - case AVAHI_SERVER_REGISTERING: - case AVAHI_SERVER_COLLISION: - if (m_group) m_group->Reset(); - m_collision=true; - break; - case AVAHI_SERVER_RUNNING: - if (m_collision) { - m_collision=false; - tryApply(); - } - } -} - -void PublicService::publishAsync() -{ - K_D; - if (d->m_running) stop(); - - if (!d->m_server) { - d->m_server = new org::freedesktop::Avahi::Server("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - connect(d->m_server,SIGNAL(StateChanged(int,QString)),d,SLOT(serverStateChanged(int,QString))); - } - - int state=AVAHI_SERVER_INVALID; - QDBusReply rep=d->m_server->GetState(); - - if (rep.isValid()) state=rep.value(); - d->m_running=true; - d->m_collision=true; // make it look like server is getting out of collision to force registering - d->serverStateChanged(state, QString()); -} - - -void PublicServicePrivate::groupStateChanged(int s, const QString& reason) -{ - switch (s) { - case AVAHI_ENTRY_GROUP_COLLISION: { - QDBusReply rep=m_server->GetAlternativeServiceName(m_serviceName); - if (rep.isValid()) m_parent->setServiceName(rep.value()); - else serverStateChanged(AVAHI_SERVER_INVALID, reason); - break; - } - case AVAHI_ENTRY_GROUP_ESTABLISHED: - m_published=true; - emit m_parent->published(true); - break; - case AVAHI_ENTRY_GROUP_FAILURE: - serverStateChanged(AVAHI_SERVER_INVALID, reason); - default: - break; - } -} - - -} - -#include "moc_publicservice.cpp" -#include "moc_avahi-publicservice_p.cpp" diff --git a/dnssd/avahi-publicservice_p.h b/dnssd/avahi-publicservice_p.h deleted file mode 100644 index aa4efbd5..00000000 --- a/dnssd/avahi-publicservice_p.h +++ /dev/null @@ -1,73 +0,0 @@ -/* 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. - */ - -#ifndef AVAHI_PUBLICSERVICE_P_H -#define AVAHI_PUBLICSERVICE_P_H - -#include -#include "servicebase_p.h" -#include -#include "publicservice.h" -#include "avahi_server_interface.h" -#include "avahi_entrygroup_interface.h" - -#define K_D PublicServicePrivate* d=static_cast(this->d) - -namespace DNSSD -{ - -class PublicServicePrivate : public QObject, public ServiceBasePrivate -{ -Q_OBJECT -public: - PublicServicePrivate(PublicService* parent, const QString& name, const QString& type, const QString& domain, unsigned int port) : - QObject(), ServiceBasePrivate(name, type, domain, QString(), port), m_published(false), m_running(false), m_group(0), - m_server(0), m_collision(false), m_parent(parent) - {} - ~PublicServicePrivate() { - if (m_group) m_group->Free(); - delete m_group; - delete m_server; - } - - bool m_published; - bool m_running; - org::freedesktop::Avahi::EntryGroup* m_group; - org::freedesktop::Avahi::Server* m_server; - bool m_collision; - QStringList m_subtypes; - PublicService* m_parent; - - void commit() - { - if (!m_collision) m_group->Commit(); - } - void stop(); - bool fillEntryGroup(); - void tryApply(); - -public Q_SLOTS: - void serverStateChanged(int,const QString&); - void groupStateChanged(int,const QString&); -}; - -} - -#endif diff --git a/dnssd/avahi-remoteservice.cpp b/dnssd/avahi-remoteservice.cpp deleted file mode 100644 index 94c561b2..00000000 --- a/dnssd/avahi-remoteservice.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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 "avahi-remoteservice_p.h" -#include -#include -#include -#include -#include "remoteservice.h" -#include "avahi_server_interface.h" -#include "avahi_serviceresolver_interface.h" -Q_DECLARE_METATYPE(QList) -namespace DNSSD -{ - -RemoteService::RemoteService(const QString& name,const QString& type,const QString& domain) - : ServiceBase(new RemoteServicePrivate(this, name,type,domain)) -{ -} - - -RemoteService::~RemoteService() -{ -} - -bool RemoteService::resolve() -{ - K_D; - resolveAsync(); - while (d->m_running && !d->m_resolved) QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - return d->m_resolved; -} - -void RemoteService::resolveAsync() -{ - K_D; - if (d->m_running) return; - d->m_resolved = false; - registerTypes(); - kDebug() << this << ":Starting resolve of : " << d->m_serviceName << " " << d->m_type << " " << d->m_domain << "\n"; - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - //FIXME: don't use LOOKUP_NO_ADDRESS if NSS unavailable - QDBusReply rep=s.ServiceResolverNew(-1, -1, d->m_serviceName, d->m_type, - domainToDNS(d->m_domain), -1, 8 /*AVAHI_LOOKUP_NO_ADDRESS*/); - if (!rep.isValid()) { - emit resolved(false); - return; - } - - org::freedesktop::Avahi::ServiceResolver *b=new org::freedesktop::Avahi::ServiceResolver("org.freedesktop.Avahi",rep.value().path(), - QDBusConnection::systemBus()); - connect(b,SIGNAL(Found(int,int,const QString &,const QString &,const QString &,const QString &, int, const QString &,ushort, - const QList&, uint)),d, SLOT(gotFound(int,int,const QString &,const QString &,const QString &,const QString &, - int, const QString &,ushort , const QList&, uint))); - connect(b,SIGNAL(Failure(QString)),d, SLOT(gotError())); - d->m_running=true; -} - -bool RemoteService::isResolved() const -{ - K_D; - return d->m_resolved; -} - -void RemoteServicePrivate::gotError() -{ - m_resolved=false; - stop(); - - emit m_parent->resolved(false); -} - -void RemoteServicePrivate::gotFound(int, int, const QString &name, const QString &, const QString &domain, const QString &host, int, const QString &, ushort port, const QList &txt, uint) -{ - m_serviceName = name; - m_hostName = host; - m_port = port; - m_domain=DNSToDomain(domain); - Q_FOREACH(const QByteArray &x, txt) { - int pos=x.indexOf("="); - if (pos==-1) m_textData[x]=QByteArray(); - else m_textData[x.mid(0,pos)]=x.mid(pos+1,x.size()-pos); - } - m_resolved = true; - emit m_parent->resolved(true); -} - -void RemoteServicePrivate::stop() -{ - if (m_resolver) m_resolver->Free(); - delete m_resolver; - m_resolver=0; - m_running=false; -} - - -} - -#include "moc_remoteservice.cpp" -#include "moc_avahi-remoteservice_p.cpp" diff --git a/dnssd/avahi-remoteservice_p.h b/dnssd/avahi-remoteservice_p.h deleted file mode 100644 index 0b25d60a..00000000 --- a/dnssd/avahi-remoteservice_p.h +++ /dev/null @@ -1,58 +0,0 @@ -/* 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. - */ - -#ifndef AVAHI_REMOTESERVICE_P_H -#define AVAHI_REMOTESERVICE_P_H - -#include -#include -#include -#include "servicebase_p.h" -#include "remoteservice.h" -#include "avahi_serviceresolver_interface.h" - - -#define K_D RemoteServicePrivate* d=static_cast(this->d) - -namespace DNSSD -{ - -class RemoteServicePrivate : public QObject, public ServiceBasePrivate -{ -Q_OBJECT -public: - RemoteServicePrivate(RemoteService* parent, const QString& name, const QString& type, const QString& domain) : QObject(), - ServiceBasePrivate(name, type, domain, QString(), 0), m_resolved(false), m_running(false), m_resolver(0), m_parent(parent) - {} - ~RemoteServicePrivate() { if (m_resolver) m_resolver->Free(); delete m_resolver; } - bool m_resolved; - bool m_running; - org::freedesktop::Avahi::ServiceResolver* m_resolver; - RemoteService* m_parent; - void stop(); - -private Q_SLOTS: - void gotFound(int, int, const QString &name, const QString &type, const QString &domain, const QString &host, int aprotocol, const QString &address, ushort port, const QList &txt, uint flags); - void gotError(); -}; - -} - -#endif diff --git a/dnssd/avahi-servicebrowser.cpp b/dnssd/avahi-servicebrowser.cpp deleted file mode 100644 index bb7f24b1..00000000 --- a/dnssd/avahi-servicebrowser.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* 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 "avahi-servicebrowser_p.h" -#include -#include "servicebrowser.h" -#include "avahi_servicebrowser_interface.h" -#include "avahi_server_interface.h" -#include -#include -Q_DECLARE_METATYPE(QList) -namespace DNSSD -{ - -ServiceBrowser::ServiceBrowser(const QString& type,bool autoResolve,const QString& domain, const QString& subtype) - :d(new ServiceBrowserPrivate(this)) -{ - d->m_type=type; - d->m_subtype=subtype; - d->m_autoResolve=autoResolve; - d->m_domain=domain; - d->m_timer.setSingleShot(true); -} - -ServiceBrowser::State ServiceBrowser::isAvailable() -{ - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - QDBusReply rep= s.GetState(); - return (rep.isValid() && rep.value()==2) ? Working:Stopped; -} -ServiceBrowser::~ServiceBrowser() -{ - delete d; -} - -bool ServiceBrowser::isAutoResolving() const -{ - return d->m_autoResolve; -} - -void ServiceBrowser::startBrowse() -{ - if (d->m_running) return; - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - QString fullType=d->m_type; - if (!d->m_subtype.isEmpty()) fullType=d->m_subtype+"._sub."+d->m_type; - QDBusReply rep=s.ServiceBrowserNew(-1, -1, fullType, domainToDNS(d->m_domain),0); - - if (!rep.isValid()) { - emit finished(); - return; - } - d->m_running=true; - d->m_browserFinished=true; - org::freedesktop::Avahi::ServiceBrowser *b=new org::freedesktop::Avahi::ServiceBrowser("org.freedesktop.Avahi",rep.value().path(), - QDBusConnection::systemBus()); - connect(b,SIGNAL(ItemNew(int,int,QString,QString,QString,uint)),d, - SLOT(gotNewService(int,int,QString,QString,QString,uint))); - connect(b,SIGNAL(ItemRemove(int,int,QString,QString,QString,uint)),d, - SLOT(gotRemoveService(int,int,QString,QString,QString,uint))); - connect(b,SIGNAL(AllForNow()),d,SLOT(browserFinished())); - d->m_browser=b; - connect(&d->m_timer,SIGNAL(timeout()), d, SLOT(browserFinished())); - d->m_timer.start(domainIsLocal(d->m_domain) ? TIMEOUT_LAST_SERVICE : TIMEOUT_START_WAN); -} - -void ServiceBrowserPrivate::serviceResolved(bool success) -{ - QObject* sender_obj = const_cast(sender()); - RemoteService* svr = static_cast(sender_obj); - disconnect(svr,SIGNAL(resolved(bool)),this,SLOT(serviceResolved(bool))); - QList::Iterator it = m_duringResolve.begin(); - QList::Iterator itEnd = m_duringResolve.end(); - while ( it!= itEnd && svr!= (*it).data()) ++it; - if (it != itEnd) { - if (success) { - m_services+=(*it); - emit m_parent->serviceAdded(RemoteService::Ptr(svr)); - } - m_duringResolve.erase(it); - queryFinished(); - } -} - -RemoteService::Ptr ServiceBrowserPrivate::find(RemoteService::Ptr s, const QList& where) const -{ - Q_FOREACH (const RemoteService::Ptr& i, where) if (*s==*i) return i; - return RemoteService::Ptr(); -} - -void ServiceBrowserPrivate::gotNewService(int,int,const QString& name, const QString& type, const QString& domain, uint) -{ - m_timer.start(TIMEOUT_LAST_SERVICE); - RemoteService::Ptr svr(new RemoteService(name, type,domain)); - if (m_autoResolve) { - connect(svr.data(),SIGNAL(resolved(bool)),this,SLOT(serviceResolved(bool))); - m_duringResolve+=svr; - svr->resolveAsync(); - } else { - m_services+=svr; - emit m_parent->serviceAdded(svr); - } -} - -void ServiceBrowserPrivate::gotRemoveService(int,int,const QString& name, const QString& type, const QString& domain, uint) -{ - m_timer.start(TIMEOUT_LAST_SERVICE); - RemoteService::Ptr tmpl(new RemoteService(name, type,domain)); - RemoteService::Ptr found=find(tmpl, m_duringResolve); - if (!found.isNull()) { - m_duringResolve.removeAll(found); - return; - } - found=find(tmpl, m_services); - if (found.isNull()) return; - - emit m_parent->serviceRemoved(found); - m_services.removeAll(found); -} -void ServiceBrowserPrivate::browserFinished() -{ - m_timer.stop(); - m_browserFinished=true; - queryFinished(); -} - -void ServiceBrowserPrivate::queryFinished() -{ - if (!m_duringResolve.count() && m_browserFinished) emit m_parent->finished(); -} - - -QList ServiceBrowser::services() const -{ - return d->m_services; -} - -QHostAddress ServiceBrowser::resolveHostName(const QString &hostname) -{ - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - - int protocol = 0; - QString name; - int aprotocol = 0; - QString address; - uint flags = 0; - - QDBusReply reply = s.ResolveHostName(-1, -1, hostname, 0, (unsigned int ) 0, protocol, name, aprotocol, address, flags); - - if (reply.isValid()) - return QHostAddress(address); - else - return QHostAddress(); -} - -QString ServiceBrowser::getLocalHostName() -{ - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - - QDBusReply reply = s.GetHostName(); - - if (reply.isValid()) - return reply.value(); - else - return QString(); -} - -} - -#include "moc_servicebrowser.cpp" -#include "moc_avahi-servicebrowser_p.cpp" diff --git a/dnssd/avahi-servicebrowser_p.h b/dnssd/avahi-servicebrowser_p.h deleted file mode 100644 index d48b9674..00000000 --- a/dnssd/avahi-servicebrowser_p.h +++ /dev/null @@ -1,66 +0,0 @@ -/* 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. - */ - -#ifndef AVAHI_SERVICEBROWSER_P_H -#define AVAHI_SERVICEBROWSER_P_H - -#include -#include -#include -#include "servicebrowser.h" -#include "avahi_servicebrowser_interface.h" - -namespace DNSSD -{ - -class ServiceBrowserPrivate : public QObject -{ - Q_OBJECT -public: - ServiceBrowserPrivate(ServiceBrowser* parent) : QObject(), m_running(false), m_browser(0), m_parent(parent) - {} - ~ServiceBrowserPrivate() { if (m_browser) m_browser->Free(); delete m_browser;} - QList m_services; - QList m_duringResolve; - QString m_type; - QString m_domain; - QString m_subtype; - bool m_autoResolve; - bool m_running; - bool m_finished; - bool m_browserFinished; - QTimer m_timer; - org::freedesktop::Avahi::ServiceBrowser* m_browser; - ServiceBrowser* m_parent; - - // get already found service identical to s or null if not found - RemoteService::Ptr find(RemoteService::Ptr s, const QList& where) const; - -private Q_SLOTS: - void browserFinished(); - void queryFinished(); - void serviceResolved(bool success); - void gotNewService(int,int,const QString&,const QString&,const QString&, uint); - void gotRemoveService(int,int,const QString&,const QString&,const QString&, uint); -}; - -} - -#endif diff --git a/dnssd/avahi-servicetypebrowser.cpp b/dnssd/avahi-servicetypebrowser.cpp deleted file mode 100644 index f668ef7e..00000000 --- a/dnssd/avahi-servicetypebrowser.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004,2007 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 "avahi-servicetypebrowser_p.h" -#include -#include "avahi_server_interface.h" -#include "servicetypebrowser.h" -#include "avahi_servicetypebrowser_interface.h" - -#define UNSPEC -1 -Q_DECLARE_METATYPE(QList) -namespace DNSSD -{ - -ServiceTypeBrowser::ServiceTypeBrowser(const QString& domain, QObject *parent) : QObject(parent), d(new ServiceTypeBrowserPrivate(this)) -{ - d->m_domain=domain; - d->m_timer.setSingleShot(true); -} - -ServiceTypeBrowser::~ServiceTypeBrowser() -{ - delete d; -} - -void ServiceTypeBrowser::startBrowse() -{ - if (d->m_started) return; - d->m_started=true; - org::freedesktop::Avahi::Server s("org.freedesktop.Avahi","/",QDBusConnection::systemBus()); - QDBusReply rep=s.ServiceTypeBrowserNew(-1, -1, d->m_domain, 0); - - if (!rep.isValid()) return; - org::freedesktop::Avahi::ServiceTypeBrowser *b=new org::freedesktop::Avahi::ServiceTypeBrowser("org.freedesktop.Avahi",rep.value().path(), - QDBusConnection::systemBus()); - connect(b,SIGNAL(ItemNew(int,int,QString,QString,uint)),d, SLOT(gotNewServiceType(int,int,QString,QString,uint))); - connect(b,SIGNAL(ItemRemove(int,int,QString,QString,uint)),d, SLOT(gotRemoveServiceType(int,int,QString,QString,uint))); - connect(b,SIGNAL(AllForNow()),d,SLOT(finished())); - connect(&d->m_timer,SIGNAL(timeout()), d, SLOT(finished())); - d->m_browser=b; - d->m_timer.start(domainIsLocal(d->m_domain) ? TIMEOUT_LAST_SERVICE : TIMEOUT_START_WAN); -} - -void ServiceTypeBrowserPrivate::finished() -{ - m_timer.stop(); - emit m_parent->finished(); -} - -void ServiceTypeBrowserPrivate::gotNewServiceType(int,int,const QString& type,const QString&,uint) -{ - m_timer.start(TIMEOUT_LAST_SERVICE); - m_servicetypes+=type; - emit m_parent->serviceTypeAdded(type); -} - - - -void ServiceTypeBrowserPrivate::gotRemoveServiceType(int,int,const QString& type,const QString&,uint) -{ - m_timer.start(TIMEOUT_LAST_SERVICE); - m_servicetypes.removeAll(type); - emit m_parent->serviceTypeRemoved(type); -} - - -QStringList ServiceTypeBrowser::serviceTypes() const -{ - return d->m_servicetypes; -} - - - -} -#include "moc_servicetypebrowser.cpp" -#include "moc_avahi-servicetypebrowser_p.cpp" diff --git a/dnssd/avahi-servicetypebrowser_p.h b/dnssd/avahi-servicetypebrowser_p.h deleted file mode 100644 index 2991324e..00000000 --- a/dnssd/avahi-servicetypebrowser_p.h +++ /dev/null @@ -1,53 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004,2007 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. - */ - -#ifndef AVAHI_SERVICETYPEBROWSER_P_H -#define AVAHI_SERVICETYPEBROWSER_P_H - -#include -#include -#include "servicetypebrowser.h" -#include "avahi_servicetypebrowser_interface.h" - -namespace DNSSD -{ - -class ServiceTypeBrowserPrivate : public QObject -{ - Q_OBJECT -public: - ServiceTypeBrowserPrivate(ServiceTypeBrowser* parent) : m_browser(0), m_parent(parent),m_started(false) {} - ~ServiceTypeBrowserPrivate() { if (m_browser) m_browser->Free(); } - - org::freedesktop::Avahi::ServiceTypeBrowser* m_browser; - ServiceTypeBrowser* m_parent; - bool m_started; - QStringList m_servicetypes; - QString m_domain; - QTimer m_timer; -private Q_SLOTS: - void gotNewServiceType(int,int,const QString&, const QString&, uint); - void gotRemoveServiceType(int,int,const QString&, const QString&, uint); - void finished(); - -}; - -} -#endif diff --git a/dnssd/avahi_entrygroup_interface.cpp b/dnssd/avahi_entrygroup_interface.cpp deleted file mode 100644 index f3dc7b34..00000000 --- a/dnssd/avahi_entrygroup_interface.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file was generated by dbusxml2cpp version 0.6 - * Command line was: dbusxml2cpp -m -p avahi_entrygroup_interface /home/qba/src/kdelibs/dnssd/org.freedesktop.Avahi.EntryGroup.xml - * - * dbusxml2cpp is Copyright (C) 2006 Trolltech ASA. All rights reserved. - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "avahi_entrygroup_interface.h" -Q_DECLARE_METATYPE(QList) -/* - * Implementation of interface class OrgFreedesktopAvahiEntryGroupInterface - */ - -OrgFreedesktopAvahiEntryGroupInterface::OrgFreedesktopAvahiEntryGroupInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -OrgFreedesktopAvahiEntryGroupInterface::~OrgFreedesktopAvahiEntryGroupInterface() -{ -} - - -#include "moc_avahi_entrygroup_interface.cpp" diff --git a/dnssd/avahi_entrygroup_interface.h b/dnssd/avahi_entrygroup_interface.h deleted file mode 100644 index 1ccca151..00000000 --- a/dnssd/avahi_entrygroup_interface.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file was generated by dbusxml2cpp version 0.6 - * Command line was: dbusxml2cpp -m -p avahi_entrygroup_interface /home/qba/src/kdelibs/dnssd/org.freedesktop.Avahi.EntryGroup.xml - * - * dbusxml2cpp is Copyright (C) 2006 Trolltech ASA. All rights reserved. - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef AVAHI_ENTRYGROUP_INTERFACE_H_1175536773 -#define AVAHI_ENTRYGROUP_INTERFACE_H_1175536773 - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Proxy class for interface org.freedesktop.Avahi.EntryGroup - */ -class OrgFreedesktopAvahiEntryGroupInterface: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.freedesktop.Avahi.EntryGroup"; } - -public: - OrgFreedesktopAvahiEntryGroupInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~OrgFreedesktopAvahiEntryGroupInterface(); - -public Q_SLOTS: // METHODS - inline QDBusReply AddAddress(int interface, int protocol, uint flags, const QString &name, const QString &address) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(flags) << qVariantFromValue(name) << qVariantFromValue(address); - return callWithArgumentList(QDBus::Block, QLatin1String("AddAddress"), argumentList); - } - - inline QDBusReply AddRecord(int interface, int protocol, uint flags, const QString &name, ushort clazz, ushort type, uint ttl, const QByteArray &rdata) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(flags) << qVariantFromValue(name) << qVariantFromValue(clazz) << qVariantFromValue(type) << qVariantFromValue(ttl) << qVariantFromValue(rdata); - return callWithArgumentList(QDBus::Block, QLatin1String("AddRecord"), argumentList); - } - - inline QDBusReply AddService(int interface, int protocol, uint flags, const QString &name, const QString &type, const QString &domain, const QString &host, ushort port, const QList &txt) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(flags) << qVariantFromValue(name) << qVariantFromValue(type) << qVariantFromValue(domain) << qVariantFromValue(host) << qVariantFromValue(port) << qVariantFromValue(txt); - return callWithArgumentList(QDBus::Block, QLatin1String("AddService"), argumentList); - } - - inline QDBusReply AddServiceSubtype(int interface, int protocol, uint flags, const QString &name, const QString &type, const QString &domain, const QString &subtype) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(flags) << qVariantFromValue(name) << qVariantFromValue(type) << qVariantFromValue(domain) << qVariantFromValue(subtype); - return callWithArgumentList(QDBus::Block, QLatin1String("AddServiceSubtype"), argumentList); - } - - inline QDBusReply Commit() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("Commit"), argumentList); - } - - inline QDBusReply Free() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("Free"), argumentList); - } - - inline QDBusReply GetState() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetState"), argumentList); - } - - inline QDBusReply IsEmpty() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("IsEmpty"), argumentList); - } - - inline QDBusReply Reset() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("Reset"), argumentList); - } - - inline QDBusReply UpdateServiceTxt(int interface, int protocol, uint flags, const QString &name, const QString &type, const QString &domain, const QList &txt) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(flags) << qVariantFromValue(name) << qVariantFromValue(type) << qVariantFromValue(domain) << qVariantFromValue(txt); - return callWithArgumentList(QDBus::Block, QLatin1String("UpdateServiceTxt"), argumentList); - } - -Q_SIGNALS: // SIGNALS - void StateChanged(int state, const QString &error); -}; - -namespace org { - namespace freedesktop { - namespace Avahi { - typedef ::OrgFreedesktopAvahiEntryGroupInterface EntryGroup; - } - } -} -#endif diff --git a/dnssd/avahi_server_interface.cpp b/dnssd/avahi_server_interface.cpp deleted file mode 100644 index d24c4146..00000000 --- a/dnssd/avahi_server_interface.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file was generated by dbusxml2cpp version 0.6 - * Command line was: dbusxml2cpp -m -p avahi_server_interface /home/qba/src/kdelibs/dnssd/org.freedesktop.Avahi.Server.xml - * - * dbusxml2cpp is Copyright (C) 2006 Trolltech ASA. All rights reserved. - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "avahi_server_interface.h" -#include "servicebase.h" -#include -Q_DECLARE_METATYPE(QList) -/* - * Implementation of interface class OrgFreedesktopAvahiServerInterface - */ - -OrgFreedesktopAvahiServerInterface::OrgFreedesktopAvahiServerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -OrgFreedesktopAvahiServerInterface::~OrgFreedesktopAvahiServerInterface() -{ -} - -namespace DNSSD { - - -void registerTypes() -{ - static bool registered=false; - if (!registered) { - qDBusRegisterMetaType >(); - registered=true; - } -} - -QString domainToDNS(const QString &domain) -{ - if (domainIsLocal(domain)) return domain; - else return QUrl::toAce(domain); -} - -QString DNSToDomain(const QString& domain) -{ - if (domainIsLocal(domain)) return domain; - else return QUrl::fromAce(domain.toLatin1()); -} -} - -#include "moc_avahi_server_interface.cpp" diff --git a/dnssd/avahi_server_interface.h b/dnssd/avahi_server_interface.h deleted file mode 100644 index f00377ac..00000000 --- a/dnssd/avahi_server_interface.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * This file was generated by dbusxml2cpp version 0.6 - * Command line was: dbusxml2cpp -m -p avahi_server_interface /home/qba/src/kdelibs/dnssd/org.freedesktop.Avahi.Server.xml - * - * dbusxml2cpp is Copyright (C) 2006 Trolltech ASA. All rights reserved. - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef AVAHI_SERVER_INTERFACE_H_1175535514 -#define AVAHI_SERVER_INTERFACE_H_1175535514 - -#include -#include -#include -#include -#include -#include -#include -#include - -// wait 100ms after last service -#define TIMEOUT_LAST_SERVICE 100 -// and at least 700ms for first WAN answer -#define TIMEOUT_START_WAN 700 - -/* - * Proxy class for interface org.freedesktop.Avahi.Server - */ -class OrgFreedesktopAvahiServerInterface: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.freedesktop.Avahi.Server"; } - -public: - OrgFreedesktopAvahiServerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~OrgFreedesktopAvahiServerInterface(); - -public Q_SLOTS: // METHODS - inline QDBusReply AddressResolverNew(int interface, int protocol, const QString &address, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(address) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("AddressResolverNew"), argumentList); - } - - inline QDBusReply DomainBrowserNew(int interface, int protocol, const QString &domain, int btype, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(domain) << qVariantFromValue(btype) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("DomainBrowserNew"), argumentList); - } - - inline QDBusReply EntryGroupNew() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("EntryGroupNew"), argumentList); - } - - inline QDBusReply GetAPIVersion() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetAPIVersion"), argumentList); - } - - inline QDBusReply GetAlternativeHostName(const QString &name) - { - QList argumentList; - argumentList << qVariantFromValue(name); - return callWithArgumentList(QDBus::Block, QLatin1String("GetAlternativeHostName"), argumentList); - } - - inline QDBusReply GetAlternativeServiceName(const QString &name) - { - QList argumentList; - argumentList << qVariantFromValue(name); - return callWithArgumentList(QDBus::Block, QLatin1String("GetAlternativeServiceName"), argumentList); - } - - inline QDBusReply GetDomainName() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetDomainName"), argumentList); - } - - inline QDBusReply GetHostName() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetHostName"), argumentList); - } - - inline QDBusReply GetHostNameFqdn() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetHostNameFqdn"), argumentList); - } - - inline QDBusReply GetLocalServiceCookie() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetLocalServiceCookie"), argumentList); - } - - inline QDBusReply GetNetworkInterfaceIndexByName(const QString &name) - { - QList argumentList; - argumentList << qVariantFromValue(name); - return callWithArgumentList(QDBus::Block, QLatin1String("GetNetworkInterfaceIndexByName"), argumentList); - } - - inline QDBusReply GetNetworkInterfaceNameByIndex(int index) - { - QList argumentList; - argumentList << qVariantFromValue(index); - return callWithArgumentList(QDBus::Block, QLatin1String("GetNetworkInterfaceNameByIndex"), argumentList); - } - - inline QDBusReply GetState() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetState"), argumentList); - } - - inline QDBusReply GetVersionString() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("GetVersionString"), argumentList); - } - - inline QDBusReply HostNameResolverNew(int interface, int protocol, const QString &name, int aprotocol, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(name) << qVariantFromValue(aprotocol) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("HostNameResolverNew"), argumentList); - } - - inline QDBusReply IsNSSSupportAvailable() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("IsNSSSupportAvailable"), argumentList); - } - - inline QDBusReply RecordBrowserNew(int interface, int protocol, const QString &name, ushort clazz, ushort type, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(name) << qVariantFromValue(clazz) << qVariantFromValue(type) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("RecordBrowserNew"), argumentList); - } - - inline QDBusReply ResolveAddress(int interface, int protocol, const QString &address, uint flags, int &protocol_, int &aprotocol, QString &address_, QString &name, uint &flags_) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(address) << qVariantFromValue(flags); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("ResolveAddress"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 6) { - protocol_ = qdbus_cast(reply.arguments().at(1)); - aprotocol = qdbus_cast(reply.arguments().at(2)); - address_ = qdbus_cast(reply.arguments().at(3)); - name = qdbus_cast(reply.arguments().at(4)); - flags_ = qdbus_cast(reply.arguments().at(5)); - } - return reply; - } - - inline QDBusReply ResolveHostName(int interface, int protocol, const QString &name, int aprotocol, uint flags, int &protocol_, QString &name_, int &aprotocol_, QString &address, uint &flags_) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(name) << qVariantFromValue(aprotocol) << qVariantFromValue(flags); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("ResolveHostName"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 6) { - protocol_ = qdbus_cast(reply.arguments().at(1)); - name_ = qdbus_cast(reply.arguments().at(2)); - aprotocol_ = qdbus_cast(reply.arguments().at(3)); - address = qdbus_cast(reply.arguments().at(4)); - flags_ = qdbus_cast(reply.arguments().at(5)); - } - return reply; - } - - inline QDBusReply ResolveService(int interface, int protocol, const QString &name, const QString &type, const QString &domain, int aprotocol, uint flags, int &protocol_, QString &name_, QString &type_, QString &domain_, QString &host, int &aprotocol_, QString &address, ushort &port, QList &txt, uint &flags_) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(name) << qVariantFromValue(type) << qVariantFromValue(domain) << qVariantFromValue(aprotocol) << qVariantFromValue(flags); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("ResolveService"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 11) { - protocol_ = qdbus_cast(reply.arguments().at(1)); - name_ = qdbus_cast(reply.arguments().at(2)); - type_ = qdbus_cast(reply.arguments().at(3)); - domain_ = qdbus_cast(reply.arguments().at(4)); - host = qdbus_cast(reply.arguments().at(5)); - aprotocol_ = qdbus_cast(reply.arguments().at(6)); - address = qdbus_cast(reply.arguments().at(7)); - port = qdbus_cast(reply.arguments().at(8)); - txt = qdbus_cast >(reply.arguments().at(9)); - flags_ = qdbus_cast(reply.arguments().at(10)); - } - return reply; - } - - inline QDBusReply ServiceBrowserNew(int interface, int protocol, const QString &type, const QString &domain, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(type) << qVariantFromValue(domain) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("ServiceBrowserNew"), argumentList); - } - - inline QDBusReply ServiceResolverNew(int interface, int protocol, const QString &name, const QString &type, const QString &domain, int aprotocol, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(name) << qVariantFromValue(type) << qVariantFromValue(domain) << qVariantFromValue(aprotocol) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("ServiceResolverNew"), argumentList); - } - - inline QDBusReply ServiceTypeBrowserNew(int interface, int protocol, const QString &domain, uint flags) - { - QList argumentList; - argumentList << qVariantFromValue(interface) << qVariantFromValue(protocol) << qVariantFromValue(domain) << qVariantFromValue(flags); - return callWithArgumentList(QDBus::Block, QLatin1String("ServiceTypeBrowserNew"), argumentList); - } - - inline QDBusReply SetHostName(const QString &name) - { - QList argumentList; - argumentList << qVariantFromValue(name); - return callWithArgumentList(QDBus::Block, QLatin1String("SetHostName"), argumentList); - } - -Q_SIGNALS: // SIGNALS - void StateChanged(int state, const QString &error); -}; - - -namespace DNSSD { - void registerTypes(); - QString domainToDNS(const QString &domain); - QString DNSToDomain(const QString &domain); -} - -namespace org { - namespace freedesktop { - namespace Avahi { - typedef ::OrgFreedesktopAvahiServerInterface Server; - } - } -} -#endif diff --git a/dnssd/avahi_serviceresolver_interface.cpp b/dnssd/avahi_serviceresolver_interface.cpp deleted file mode 100644 index b7e7b45d..00000000 --- a/dnssd/avahi_serviceresolver_interface.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file was generated by dbusxml2cpp version 0.6 - * Command line was: dbusxml2cpp -m -p avahi_serviceresolver_interface /home/qba/src/kdelibs/dnssd/org.freedesktop.Avahi.ServiceResolver.xml - * - * dbusxml2cpp is Copyright (C) 2006 Trolltech ASA. All rights reserved. - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "avahi_serviceresolver_interface.h" -Q_DECLARE_METATYPE(QList) - -/* - * Implementation of interface class OrgFreedesktopAvahiServiceResolverInterface - */ - -OrgFreedesktopAvahiServiceResolverInterface::OrgFreedesktopAvahiServiceResolverInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -OrgFreedesktopAvahiServiceResolverInterface::~OrgFreedesktopAvahiServiceResolverInterface() -{ -} - - -#include "moc_avahi_serviceresolver_interface.cpp" diff --git a/dnssd/avahi_serviceresolver_interface.h b/dnssd/avahi_serviceresolver_interface.h deleted file mode 100644 index 67e831aa..00000000 --- a/dnssd/avahi_serviceresolver_interface.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This file was generated by dbusxml2cpp version 0.6 - * Command line was: dbusxml2cpp -m -p avahi_serviceresolver_interface /home/qba/src/kdelibs/dnssd/org.freedesktop.Avahi.ServiceResolver.xml - * - * dbusxml2cpp is Copyright (C) 2006 Trolltech ASA. All rights reserved. - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef AVAHI_SERVICERESOLVER_INTERFACE_H_1175536773 -#define AVAHI_SERVICERESOLVER_INTERFACE_H_1175536773 - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Proxy class for interface org.freedesktop.Avahi.ServiceResolver - */ -class OrgFreedesktopAvahiServiceResolverInterface: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.freedesktop.Avahi.ServiceResolver"; } - -public: - OrgFreedesktopAvahiServiceResolverInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~OrgFreedesktopAvahiServiceResolverInterface(); - -public Q_SLOTS: // METHODS - inline QDBusReply Free() - { - QList argumentList; - return callWithArgumentList(QDBus::Block, QLatin1String("Free"), argumentList); - } - -Q_SIGNALS: // SIGNALS - void Failure(const QString &error); - void Found(int interface, int protocol, const QString &name, const QString &type, const QString &domain, const QString &host, int aprotocol, const QString &address, ushort port, const QList &txt, uint flags); -}; - -namespace org { - namespace freedesktop { - namespace Avahi { - typedef ::OrgFreedesktopAvahiServiceResolverInterface ServiceResolver; - } - } -} -#endif diff --git a/dnssd/domainbrowser.h b/dnssd/domainbrowser.h deleted file mode 100644 index f0072710..00000000 --- a/dnssd/domainbrowser.h +++ /dev/null @@ -1,145 +0,0 @@ -/* 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. - */ - -#ifndef DNSSDDOMAINBROWSER_H -#define DNSSDDOMAINBROWSER_H - -#include -#include -#include - -namespace DNSSD -{ -class DomainBrowserPrivate; - -/** - * @class DomainBrowser domainbrowser.h DNSSD/DomainBrowser - * @short Browses recommended domains for browsing or publishing to. - * - * Usage of this class is very simple. If you are interested in - * browsing for services, simple do - * @code - * DNSSD::DomainBrowser *browser = - * new DNSSD::DomainBrowser(DNSSD::DomainBrowser::Browsing, this); - * connect(browser, SIGNAL(domainAdded(QString)), - * this, SLOT(browsingDomainAdded(QString)); - * connect(browser, SIGNAL(domainRemoved(QString)), - * this, SLOT(browsingDomainRemove(QString)); - * browser->startBrowse(); - * @endcode - * - * If you are interested in domains where you can register services, - * usage is identical except that you should pass - * DNSSD::DomainBrowser::Registering to the constructor. - * - * @author Jakub Stachowski - */ -class KDNSSD_EXPORT DomainBrowser : public QObject -{ - Q_OBJECT -public: - /** - * A type of domain recommendation - */ - enum DomainType - { - /** Domains recommended for browsing for services on (using ServiceBrowser) */ - Browsing, - /** Domains recommended for publishing to (using PublicService) */ - Publishing - }; - /** - * Standard constructor - * - * The global DNS-SD configuration (for example, the global Avahi - * configuration for the Avahi backend) will be used. - * - * @param type the type of domain to search for - * @param parent parent object (see QObject documentation) - * - * @see startBrowse() and ServiceBrowser::isAvailable() - */ - explicit DomainBrowser(DomainType type, QObject* parent = 0); - - ~DomainBrowser(); - - /** - * The current known list of domains of the requested DomainType - * - * @return a list of currently known domain names - */ - QStringList domains() const; - - /** - * Starts browsing - * - * Only the first call to this function will have any effect. - * - * Browsing stops when the DomainBrowser object is destroyed. - * - * @warning The domainAdded() signal may be emitted before this - * function returns. - * - * @see domainAdded() and domainRemoved() - */ - void startBrowse(); - - /** - * Whether the browsing has been started - * - * @return @c true if startBrowse() has been called, @c false otherwise - */ - bool isRunning() const; - -Q_SIGNALS: - /** - * A domain has disappeared from the browsed list - * - * Emitted when domain has been removed from browsing list - * or the publishing list (depending on which list was - * requested in the constructor). - * - * @param domain the name of the domain - * - * @see domainAdded() - */ - void domainRemoved(const QString& domain); - - /** - * A new domain has been discovered - * - * If the requested DomainType is Browsing, this will - * also be emitted for the domains specified in the - * global configuration. - * - * @param domain the name of the domain - * - * @see domainRemoved() - */ - void domainAdded(const QString& domain); - -private: - friend class DomainBrowserPrivate; - DomainBrowserPrivate* const d; -}; - -} - -#endif diff --git a/dnssd/domainmodel.cpp b/dnssd/domainmodel.cpp deleted file mode 100644 index 1bea715b..00000000 --- a/dnssd/domainmodel.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2008 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 "domainmodel.h" -#include "domainbrowser.h" -#include - -namespace DNSSD -{ - -struct DomainModelPrivate -{ - DomainBrowser* m_browser; -}; - - -DomainModel::DomainModel(DomainBrowser* browser, QObject* parent) - : QAbstractItemModel(parent), d(new DomainModelPrivate) -{ - d->m_browser=browser; - browser->setParent(this); - connect(browser, SIGNAL(domainAdded(QString)), this, - SIGNAL(layoutChanged())); - connect(browser, SIGNAL(domainRemoved(QString)), this, - SIGNAL(layoutChanged())); - browser->startBrowse(); -} - -DomainModel::~DomainModel() -{ - delete d; -} - -int DomainModel::columnCount(const QModelIndex& parent) const -{ - Q_UNUSED(parent); - return 1; -} -int DomainModel::rowCount(const QModelIndex& parent ) const -{ - return (parent.isValid()) ? 0 : d->m_browser->domains().size(); -} - -QModelIndex DomainModel::parent(const QModelIndex& index ) const -{ - Q_UNUSED(index); - return QModelIndex(); -} - -QModelIndex DomainModel::index(int row, int column, const QModelIndex& parent ) const -{ - return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex(); -} - -bool DomainModel::hasIndex(int row, int column, const QModelIndex &parent) const -{ - if (parent.isValid()) return false; - if (column!=0) return false; - if (row<0 || row>=rowCount(parent)) return false; - return true; -} - -QVariant DomainModel::data(const QModelIndex& index, int role ) const -{ - if (!index.isValid()) return QVariant(); - if (!hasIndex(index.row(), index.column(), index.parent())) return QVariant(); - const QStringList domains=d->m_browser->domains(); - if (role==Qt::DisplayRole) return domains[index.row()]; - return QVariant(); -} - -} diff --git a/dnssd/domainmodel.h b/dnssd/domainmodel.h deleted file mode 100644 index e420471a..00000000 --- a/dnssd/domainmodel.h +++ /dev/null @@ -1,97 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2008 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. - */ - -#ifndef DNSSDDOMAINMODEL_H -#define DNSSDDOMAINMODEL_H - -#include -#include - -namespace DNSSD -{ - -struct DomainModelPrivate; -class DomainBrowser; - - -/** - * @class DomainModel domainmodel.h DNSSD/DomainModel - * @short Model for list of Zeroconf domains - * - * This class provides a Qt Model for DomainBrowser to allow easy - * integration of domain discovery into a GUI. For example, to - * provide a combo box listing available domains, you can do: - * @code - * DNSSD::DomainModel *domainModel = new DomainModel( - * new DNSSD::DomainBrowser(DNSSD::DomainBrowser::Browsing) - * ); - * QComboBox *domainCombo = new QComboBox(); - * domainCombo->setModel(domainModel); - * @endcode - * - * @since 4.1 - * @author Jakub Stachowski - */ - -class KDNSSD_EXPORT DomainModel : public QAbstractItemModel -{ - Q_OBJECT - -public: - /** - * Creates a model for given domain browser and starts - * browsing for domains. - * - * The model takes ownership of the browser, - * so there is no need to delete it afterwards. - * - * You should @b not call DomainBrowser::startBrowse() on @p browser - * before passing it to DomainModel. - * - * @param browser the domain browser that will provide the domains - * to be listed by the model - * @param parent the parent object (see QObject documentation) - */ - explicit DomainModel(DomainBrowser* browser, QObject* parent = 0); - - virtual ~DomainModel(); - - /** @reimp */ - virtual int columnCount(const QModelIndex& parent = QModelIndex() ) const; - /** @reimp */ - virtual int rowCount(const QModelIndex& parent = QModelIndex() ) const; - /** @reimp */ - virtual QModelIndex parent(const QModelIndex& index ) const; - /** @reimp */ - virtual QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex() ) const; - /** @reimp */ - virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const; - /** @reimp */ - virtual bool hasIndex(int row, int column, const QModelIndex &parent) const; - -private: - DomainModelPrivate* const d; - friend struct DomainModelPrivate; - -}; - -} - -#endif diff --git a/dnssd/dummy-domainbrowser.cpp b/dnssd/dummy-domainbrowser.cpp deleted file mode 100644 index a41bb2e3..00000000 --- a/dnssd/dummy-domainbrowser.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* 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 -#include "domainbrowser.h" - -namespace DNSSD -{ - -DomainBrowser::DomainBrowser(DomainType, QObject *parent) : QObject(parent), d(0) -{} - -DomainBrowser::~DomainBrowser() -{} - - -void DomainBrowser::startBrowse() -{} - -QStringList DomainBrowser::domains() const -{ - return QStringList(); -} - -bool DomainBrowser::isRunning() const -{ - return false; -} - -} -#include "moc_domainbrowser.cpp" diff --git a/dnssd/dummy-publicservice.cpp b/dnssd/dummy-publicservice.cpp deleted file mode 100644 index d1b90793..00000000 --- a/dnssd/dummy-publicservice.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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 "publicservice.h" -#include "servicebase_p.h" -#include - -namespace DNSSD -{ - -PublicService::PublicService(const QString& name, const QString& type, unsigned int port, - const QString& domain, const QStringList&) - : QObject(), ServiceBase(name, type, QString(), domain, port) -{ - if (domain.isNull()) d->m_domain=QLatin1String("local."); -} - - -PublicService::~PublicService() -{} - -void PublicService::setServiceName(const QString& serviceName) -{ - d->m_serviceName = serviceName; -} - -void PublicService::setDomain(const QString& domain) -{ - d->m_domain = domain; -} - -void PublicService::setTextData(const QMap& textData) -{ - d->m_textData = textData; -} - -void PublicService::setType(const QString& type) -{ - d->m_type = type; -} - -void PublicService::setSubTypes(const QStringList&) -{ - // dummy and empty -} - -void PublicService::setPort(unsigned short port) -{ - d->m_port = port; -} - -QStringList PublicService::subtypes() const -{ - return QStringList(); -} - -bool PublicService::isPublished() const -{ - return false; -} - -bool PublicService::publish() -{ - return false; -} - -void PublicService::stop() -{} - -void PublicService::publishAsync() -{ - emit published(false); -} - -} - -#include "moc_publicservice.cpp" diff --git a/dnssd/dummy-remoteservice.cpp b/dnssd/dummy-remoteservice.cpp deleted file mode 100644 index 84c6e934..00000000 --- a/dnssd/dummy-remoteservice.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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 "remoteservice.h" -#include - -namespace DNSSD -{ - -RemoteService::RemoteService(const QString& name,const QString& type,const QString& domain) - : ServiceBase(name, type, domain) -{ -} - - -RemoteService::~RemoteService() -{ -} - -bool RemoteService::resolve() -{ - return false; -} - -void RemoteService::resolveAsync() -{ - emit resolved(false); -} - -bool RemoteService::isResolved() const -{ - return false; -} - - -} - -#include "moc_remoteservice.cpp" diff --git a/dnssd/dummy-servicebrowser.cpp b/dnssd/dummy-servicebrowser.cpp deleted file mode 100644 index 38e51aae..00000000 --- a/dnssd/dummy-servicebrowser.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* 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 -#include "domainbrowser.h" -#include "servicebrowser.h" -#include - -namespace DNSSD -{ - -ServiceBrowser::ServiceBrowser(const QString&,bool,const QString&, const QString&) : d(0) -{} - -bool ServiceBrowser::isAutoResolving() const -{ - return false; -} - - -ServiceBrowser::State ServiceBrowser::isAvailable() -{ - return Unsupported; -} -ServiceBrowser::~ ServiceBrowser() -{ -} - -void ServiceBrowser::startBrowse() -{ - emit finished(); -} - -QList ServiceBrowser::services() const -{ - return QList(); -} - -QHostAddress ServiceBrowser::resolveHostName(const QString &hostname) -{ - Q_UNUSED(hostname); - return QHostAddress(); -} - -QString ServiceBrowser::getLocalHostName() -{ - return QString(); -} - -} - -#include "moc_servicebrowser.cpp" diff --git a/dnssd/dummy-servicetypebrowser.cpp b/dnssd/dummy-servicetypebrowser.cpp deleted file mode 100644 index fa7c55fb..00000000 --- a/dnssd/dummy-servicetypebrowser.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* 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 -#include "servicetypebrowser.h" - -namespace DNSSD -{ - -ServiceTypeBrowser::ServiceTypeBrowser(const QString&, QObject *parent) : QObject(parent), d(0) -{} - -ServiceTypeBrowser::~ServiceTypeBrowser() -{} - - -void ServiceTypeBrowser::startBrowse() -{} - -QStringList ServiceTypeBrowser::serviceTypes() const -{ - return QStringList(); -} - - -} -#include "moc_servicetypebrowser.cpp" diff --git a/dnssd/kcm_kdnssd.kcfg b/dnssd/kcm_kdnssd.kcfg deleted file mode 100644 index 43779166..00000000 --- a/dnssd/kcm_kdnssd.kcfg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - List of 'wide-area' (non link-local) domains that should be browsed. - - - diff --git a/dnssd/mdnsd-domainbrowser.cpp b/dnssd/mdnsd-domainbrowser.cpp deleted file mode 100644 index 9d441d8e..00000000 --- a/dnssd/mdnsd-domainbrowser.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* 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 "mdnsd-domainbrowser_p.h" -#include "domainbrowser.h" -#include "settings.h" -#include "remoteservice.h" -#include "mdnsd-responder.h" -#include "mdnsd-sdevent.h" - -#include -#include -#include -#include - -namespace DNSSD -{ - -void domain_callback(DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, const char *replyDomain, void *context); - -DomainBrowser::DomainBrowser(DomainType type, QObject *parent) : QObject(parent),d(new DomainBrowserPrivate(type,this)) -{ - d->m_domains = Configuration::domainList(); - - // Those same names have to be used in the kcontrol module too. - const QString dbusPath = "/libdnssd"; - const QString dbusInterface = "org.kde.DNSSD.DomainBrowser"; - QDBusConnection dbus = QDBusConnection::sessionBus(); - dbus.connect( QString(), dbusPath, dbusInterface, "domainListChanged", this, SLOT(domainListChanged()) ); -} - -DomainBrowser::~DomainBrowser() -{ - delete d; -} - - -void DomainBrowser::startBrowse() -{ - QStringList::const_iterator itEnd = d->m_domains.end(); - for (QStringList::const_iterator it=d->m_domains.begin(); it!=itEnd; ++it ) emit domainAdded(*it); - if (d->isRunning()) return; - DNSServiceRef ref; - if (DNSServiceEnumerateDomains(&ref,(d->m_type==Browsing) ? kDNSServiceFlagsBrowseDomains:kDNSServiceFlagsBrowseDomains, - 0, domain_callback,reinterpret_cast(d)) == kDNSServiceErr_NoError) d->setRef(ref); -} - -void DomainBrowserPrivate::customEvent(QEvent* event) -{ - if (event->type()==QEvent::User+SD_ERROR) stop(); - if (event->type()==QEvent::User+SD_ADDREMOVE) { - AddRemoveEvent *aev = static_cast(event); - if (aev->m_op==AddRemoveEvent::Add) { - //FIXME: check if domain name is not name+domain (there was some mdnsd weirdness) - if (m_domains.contains(aev->m_domain)) return; - m_domains.append(aev->m_domain); - emit m_parent->domainAdded(aev->m_domain); - } - else { - m_domains.removeAll(aev->m_domain); - emit m_parent->domainRemoved(aev->m_domain); - } - } -} - -void DomainBrowserPrivate::domainListChanged() -{ - bool was_running = m_running; - m_running = false; - if (was_running) { - QStringList::const_iterator itEnd = m_domains.end(); - for (QStringList::const_iterator it=m_domains.begin(); it!=itEnd; ++it ) - emit m_parent->domainRemoved(*it); - } - m_domains.clear(); - // now reread configuration and add domains - Configuration::self()->readConfig(); - m_domains = Configuration::domainList(); - // this will emit domainAdded() for every domain if necessary - if (was_running) m_parent->startBrowse(); -} - -QStringList DomainBrowser::domains() const -{ - return d->m_domains; -} - -bool DomainBrowser::isRunning() const -{ - return d->isRunning(); -} - -void domain_callback(DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, const char *replyDomain, void *context) -{ - QObject *obj = reinterpret_cast(context); - if (errorCode != kDNSServiceErr_NoError) { - ErrorEvent err; - QCoreApplication::sendEvent(obj, &err); - } else { - // domain browser is supposed to return only _additional_ domains - if (flags&kDNSServiceFlagsDefault) return; - AddRemoveEvent arev((flags & kDNSServiceFlagsAdd) ? AddRemoveEvent::Add : - AddRemoveEvent::Remove, QString(), QString(), - DNSToDomain(replyDomain), !(flags & kDNSServiceFlagsMoreComing)); - QCoreApplication::sendEvent(obj, &arev); - } -} - -} - - - -#include "moc_domainbrowser.cpp" -#include "moc_mdnsd-domainbrowser_p.cpp" diff --git a/dnssd/mdnsd-domainbrowser_p.h b/dnssd/mdnsd-domainbrowser_p.h deleted file mode 100644 index 8d025668..00000000 --- a/dnssd/mdnsd-domainbrowser_p.h +++ /dev/null @@ -1,46 +0,0 @@ -/* 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. - */ - -#ifndef MDNSD_DOMAINBROWSER_P_H -#define MDNSD_DOMAINBROWSER_P_H - -#include -#include "mdnsd-responder.h" -#include "domainbrowser.h" - -namespace DNSSD -{ - -class DomainBrowserPrivate : public Responder -{ -Q_OBJECT -public: - DomainBrowserPrivate(DomainBrowser::DomainType type, DomainBrowser* parent): Responder(), m_type(type), m_parent(parent) {} - DomainBrowser::DomainType m_type; - DomainBrowser* m_parent; - QStringList m_domains; - virtual void customEvent(QEvent* event); -public Q_SLOTS: - void domainListChanged(); - -}; - -} -#endif diff --git a/dnssd/mdnsd-publicservice.cpp b/dnssd/mdnsd-publicservice.cpp deleted file mode 100644 index d26dee34..00000000 --- a/dnssd/mdnsd-publicservice.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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 -#include -#include -#include "publicservice.h" -#include "servicebase_p.h" -#include "mdnsd-sdevent.h" -#include "mdnsd-responder.h" -#include "settings.h" - -#define K_D PublicServicePrivate* d=static_cast(this->d) - -namespace DNSSD -{ -void publish_callback (DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, - const char*, const char*, void *context); -class PublicServicePrivate : public Responder, public ServiceBasePrivate -{ -public: - PublicServicePrivate(PublicService* parent, const QString& name, const QString& type, unsigned int port, - const QString& domain) : Responder(), ServiceBasePrivate(name, type, domain, QString(), port), - m_published(false), m_parent(parent) - {} - bool m_published; - PublicService* m_parent; - QStringList m_subtypes; - virtual void customEvent(QEvent* event); -}; - -PublicService::PublicService(const QString& name, const QString& type, unsigned int port, - const QString& domain, const QStringList& subtypes) - : QObject(), ServiceBase(new PublicServicePrivate(this, name, type, port, domain)) -{ - K_D; - if (domain.isNull()) d->m_domain="local."; - d->m_subtypes=subtypes; -} - - -PublicService::~PublicService() -{ - stop(); -} - -void PublicService::setServiceName(const QString& serviceName) -{ - K_D; - d->m_serviceName = serviceName; - if (d->isRunning()) { - stop(); - publishAsync(); - } -} - -void PublicService::setDomain(const QString& domain) -{ - K_D; - d->m_domain = domain; - if (d->isRunning()) { - stop(); - publishAsync(); - } -} - -QStringList PublicService::subtypes() const -{ - K_D; - return d->m_subtypes; -} - -void PublicService::setType(const QString& type) -{ - K_D; - d->m_type = type; - if (d->isRunning()) { - stop(); - publishAsync(); - } -} - -void PublicService::setSubTypes(const QStringList& subtypes) -{ - K_D; - d->m_subtypes = subtypes; - if (d->isRunning()) { - stop(); - publishAsync(); - } -} - -void PublicService::setPort(unsigned short port) -{ - K_D; - d->m_port = port; - if (d->isRunning()) { - stop(); - publishAsync(); - } -} - -bool PublicService::isPublished() const -{ - K_D; - return d->m_published; -} - -void PublicService::setTextData(const QMap& textData) -{ - K_D; - d->m_textData = textData; - if (d->isRunning()) { - stop(); - publishAsync(); - } -} - -bool PublicService::publish() -{ - K_D; - publishAsync(); - while (d->isRunning() && !d->m_published) d->process(); - return d->m_published; -} - -void PublicService::stop() -{ - K_D; - d->stop(); - d->m_published = false; -} - -void PublicService::publishAsync() -{ - K_D; - if (d->isRunning()) stop(); - TXTRecordRef txt; - TXTRecordCreate(&txt,0,0); - QMap::ConstIterator itEnd = d->m_textData.end(); - for (QMap::ConstIterator it = d->m_textData.begin(); it!=itEnd ; ++it) { - if (TXTRecordSetValue(&txt,it.key().toUtf8(),it.value().length(),it.value())!=kDNSServiceErr_NoError) { - TXTRecordDeallocate(&txt); - emit published(false); - return; - } - } - DNSServiceRef ref; - QString fullType=d->m_type; - Q_FOREACH(const QString &subtype, d->m_subtypes) fullType+=','+subtype; - if (DNSServiceRegister(&ref,0,0,d->m_serviceName.toUtf8(),fullType.toLatin1().constData(),domainToDNS(d->m_domain),NULL, - htons(d->m_port),TXTRecordGetLength(&txt),TXTRecordGetBytesPtr(&txt),publish_callback, - reinterpret_cast(d)) == kDNSServiceErr_NoError) d->setRef(ref); - TXTRecordDeallocate(&txt); - if (!d->isRunning()) emit published(false); -} - -void publish_callback (DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, - const char*, const char*, void *context) -{ - QObject *obj = reinterpret_cast(context); - if (errorCode != kDNSServiceErr_NoError) { - ErrorEvent err; - QCoreApplication::sendEvent(obj, &err); - } else { - PublishEvent pev(QString::fromUtf8(name)); - QCoreApplication::sendEvent(obj, &pev); - } -} - -void PublicServicePrivate::customEvent(QEvent* event) -{ - if (event->type()==QEvent::User+SD_ERROR) { - m_parent->stop(); - emit m_parent->published(false); - } - if (event->type()==QEvent::User+SD_PUBLISH) { - m_published=true; - emit m_parent->published(true); - m_serviceName = static_cast(event)->m_name; - } -} - -} - -#include "moc_publicservice.cpp" diff --git a/dnssd/mdnsd-remoteservice.cpp b/dnssd/mdnsd-remoteservice.cpp deleted file mode 100644 index 47d28255..00000000 --- a/dnssd/mdnsd-remoteservice.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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 -#include -#include -#include -#include "remoteservice.h" -#include "servicebase_p.h" -#include "mdnsd-responder.h" -#include "mdnsd-sdevent.h" - -namespace DNSSD -{ -void resolve_callback ( DNSServiceRef, - DNSServiceFlags, - uint32_t, - DNSServiceErrorType errorCode, - const char*, - const char *hosttarget, - uint16_t port, - uint16_t txtLen, - const unsigned char *txtRecord, - void *context - ); - -#define K_D RemoteServicePrivate* d=static_cast(this->d) - -class RemoteServicePrivate : public Responder, public ServiceBasePrivate -{ -public: - RemoteServicePrivate(RemoteService* parent, const QString& name,const QString& type,const QString& domain) : - Responder(), ServiceBasePrivate(name, type, domain, QString(), 0), m_resolved(false), m_parent(parent) - {} - bool m_resolved; - RemoteService* m_parent; - virtual void customEvent(QEvent* event); -}; - -RemoteService::RemoteService(const QString& name,const QString& type,const QString& domain) - : ServiceBase(new RemoteServicePrivate(this, name, type, domain)) -{ -} - - -RemoteService::~RemoteService() -{} - -bool RemoteService::resolve() -{ - K_D; - resolveAsync(); - while (d->isRunning() && !d->m_resolved) d->process(); - d->stop(); - return d->m_resolved; -} - -void RemoteService::resolveAsync() -{ - K_D; - if (d->isRunning()) return; - d->m_resolved = false; - kDebug() << this << ":Starting resolve of : " << d->m_serviceName << " " << d->m_type << " " << d->m_domain << "\n"; - DNSServiceRef ref; - if (DNSServiceResolve(&ref,0,0,d->m_serviceName.toUtf8(), d->m_type.toLatin1().constData(), - domainToDNS(d->m_domain),(DNSServiceResolveReply)resolve_callback,reinterpret_cast(d)) - == kDNSServiceErr_NoError) d->setRef(ref); - if (!d->isRunning()) emit resolved(false); -} - -bool RemoteService::isResolved() const -{ - K_D; - return d->m_resolved; -} - -void RemoteServicePrivate::customEvent(QEvent* event) -{ - if (event->type() == QEvent::User+SD_ERROR) { - stop(); - m_resolved=false; - emit m_parent->resolved(false); - } - if (event->type() == QEvent::User+SD_RESOLVE) { - ResolveEvent* rev = static_cast(event); - m_hostName = rev->m_hostname; - m_port = rev->m_port; - m_textData = rev->m_txtdata; - m_resolved = true; - emit m_parent->resolved(true); - } -} - - -void resolve_callback ( DNSServiceRef, - DNSServiceFlags, - uint32_t, - DNSServiceErrorType errorCode, - const char*, - const char *hosttarget, - uint16_t port, - uint16_t txtLen, - const unsigned char *txtRecord, - void *context - ) -{ - QObject *obj = reinterpret_cast(context); - if (errorCode != kDNSServiceErr_NoError) { - ErrorEvent err; - QCoreApplication::sendEvent(obj, &err); - return; - } - char key[256]; - int index=0; - unsigned char valueLen; - kDebug() << "Resolve callback\n"; - QMap map; - const void *voidValue = 0; - while (TXTRecordGetItemAtIndex(txtLen,txtRecord,index++,256,key,&valueLen, - &voidValue) == kDNSServiceErr_NoError) - { - if (voidValue) map[QString::fromUtf8(key)]=QByteArray((const char*)voidValue,valueLen); - else map[QString::fromUtf8(key)].clear(); - } - ResolveEvent rev(DNSToDomain(hosttarget),ntohs(port),map); - QCoreApplication::sendEvent(obj, &rev); -} - - -} - -#include "moc_remoteservice.cpp" diff --git a/dnssd/mdnsd-responder.cpp b/dnssd/mdnsd-responder.cpp deleted file mode 100644 index ddf0c4aa..00000000 --- a/dnssd/mdnsd-responder.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* 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 "mdnsd-responder.h" -#include "servicebase.h" -#include -#include - -namespace DNSSD -{ - -Responder::Responder(DNSServiceRef ref,QObject *parent) - : QObject(parent), 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; - 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; -} -Responder::~Responder() -{ - stop(); -} - -void Responder::stop() -{ - delete m_socket; - m_socket = 0; - if (m_ref) DNSServiceRefDeallocate(m_ref); - m_ref = 0; - m_running = false; -} - - -void Responder::process() -{ - if ( DNSServiceProcessResult(m_ref) != kDNSServiceErr_NoError) stop(); -} - -bool Responder::isRunning() const -{ - return m_running; -} - -QByteArray domainToDNS(const QString &domain) -{ - if (domainIsLocal(domain)) return domain.toUtf8(); - else return KUrl::toAce(domain); -} - -QString DNSToDomain(const char* domain) -{ - if (domainIsLocal(domain)) return QString::fromUtf8(domain); - else return KUrl::fromAce(domain); -} - -} -#include "moc_mdnsd-responder.cpp" diff --git a/dnssd/mdnsd-responder.h b/dnssd/mdnsd-responder.h deleted file mode 100644 index b944cce9..00000000 --- a/dnssd/mdnsd-responder.h +++ /dev/null @@ -1,69 +0,0 @@ -/* 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. - */ - -#ifndef MDNSD_RESPONDER_H -#define MDNSD_RESPONDER_H - -#include -#include -#include - -namespace DNSSD -{ - -/** -This class should not be used directly. - -@author Jakub Stachowski -@short Internal class wrapping dns_sd.h interface - */ -class Responder : public QObject -{ - Q_OBJECT - -public: - explicit Responder(DNSServiceRef ref=0,QObject *parent = 0); - - ~Responder(); - - /** - Returns true if it is possible to use mDNS service publishing and discovery. - It needs mDNSResponder running. - */ - bool isRunning() const; - void setRef(DNSServiceRef ref); - void stop(); -public Q_SLOTS: - void process(); -protected: - DNSServiceRef m_ref; - bool m_running; - QSocketNotifier *m_socket; -}; - -/* Utils functions */ - -// Encodes domain name using utf8() or IDN -QByteArray domainToDNS(const QString &domain); -QString DNSToDomain(const char* domain); - -} - -#endif diff --git a/dnssd/mdnsd-sdevent.h b/dnssd/mdnsd-sdevent.h deleted file mode 100644 index d20b0de5..00000000 --- a/dnssd/mdnsd-sdevent.h +++ /dev/null @@ -1,81 +0,0 @@ -/* 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. - */ - -#ifndef MDNSD_SDEVENT_H -#define MDNSD_SDEVENT_H - -#include -#include -#include - -namespace DNSSD -{ - -enum Operation { SD_ERROR = 101,SD_ADDREMOVE, SD_PUBLISH, SD_RESOLVE}; - -class ErrorEvent : public QEvent -{ -public: - ErrorEvent() : QEvent((QEvent::Type)(QEvent::User+SD_ERROR)) - {} -}; -class AddRemoveEvent : public QEvent -{ -public: - enum Operation { Add, Remove }; - AddRemoveEvent(Operation op,const QString& name,const QString& type, - const QString& domain, bool last) : QEvent((QEvent::Type)(QEvent::User+SD_ADDREMOVE)), - m_op(op), m_name(name), m_type(type), m_domain(domain), m_last(last) - {} - - const Operation m_op; - const QString m_name; - const QString m_type; - const QString m_domain; - const bool m_last; -}; - -class PublishEvent : public QEvent -{ -public: - PublishEvent(const QString& name) : QEvent((QEvent::Type)(QEvent::User+SD_PUBLISH)), m_name(name) - {} - - const QString m_name; -}; - -class ResolveEvent : public QEvent -{ -public: - ResolveEvent(const QString& hostname, unsigned short port, - const QMap& txtdata) - : QEvent((QEvent::Type)(QEvent::User+SD_RESOLVE)), m_hostname(hostname), - m_port(port), m_txtdata(txtdata) - {} - - const QString m_hostname; - const unsigned short m_port; - const QMap m_txtdata; -}; - - -} - -#endif diff --git a/dnssd/mdnsd-servicebrowser.cpp b/dnssd/mdnsd-servicebrowser.cpp deleted file mode 100644 index e9588ac7..00000000 --- a/dnssd/mdnsd-servicebrowser.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* 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 "mdnsd-servicebrowser_p.h" -#include "domainbrowser.h" -#include "servicebrowser.h" -#include "mdnsd-responder.h" -#include "remoteservice.h" -#include "mdnsd-sdevent.h" -#include -#include -#include -#include -#include -#include - -#define TIMEOUT_WAN 2000 -#define TIMEOUT_LAN 200 - -namespace DNSSD -{ -void query_callback (DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, - const char *serviceName, const char *regtype, const char *replyDomain, void *context); - -ServiceBrowser::ServiceBrowser(const QString& type,bool autoResolve,const QString& domain, const QString& subtype) - :d(new ServiceBrowserPrivate(this)) -{ - d->m_type=type; - d->m_autoResolve=autoResolve; - d->m_domain=domain; - d->m_subtype=subtype; - d->timeout.setSingleShot(true); - connect(&d->timeout,SIGNAL(timeout()),d,SLOT(onTimeout())); -} - - -ServiceBrowser::State ServiceBrowser::isAvailable() -{ -// DNSServiceRef ref; -// bool ok (DNSServiceCreateConnection(&ref)==kDNSServiceErr_NoError); -// if (ok) DNSServiceRefDeallocate(ref); -// return (ok) ? Working : Stopped; - return Working; -} -ServiceBrowser::~ ServiceBrowser() -{ - delete d; -} - -bool ServiceBrowser::isAutoResolving() const -{ - return d->m_autoResolve; -} - - -void ServiceBrowserPrivate::serviceResolved(bool success) -{ - QObject* sender_obj = const_cast(sender()); - RemoteService* svr = static_cast(sender_obj); - disconnect(svr,SIGNAL(resolved(bool)),this,SLOT(serviceResolved(bool))); - QList::Iterator it = m_duringResolve.begin(); - QList::Iterator itEnd = m_duringResolve.end(); - while ( it!= itEnd && svr!= (*it).data()) ++it; - if (it != itEnd) { - if (success) { - m_services+=(*it); - emit m_parent->serviceAdded(RemoteService::Ptr(svr)); - } - m_duringResolve.erase(it); - queryFinished(); - } -} - -void ServiceBrowser::startBrowse() -{ - if (d->isRunning()) return; - d->m_finished = false; - DNSServiceRef ref; - QString fullType=d->m_type; - if (!d->m_subtype.isEmpty()) fullType=d->m_subtype+"._sub."+d->m_type; - if (DNSServiceBrowse(&ref,0,0, fullType.toLatin1().constData(), - domainToDNS(d->m_domain),query_callback,reinterpret_cast(d)) - == kDNSServiceErr_NoError) d->setRef(ref); - if (!d->isRunning()) emit finished(); - else d->timeout.start(domainIsLocal(d->m_domain) ? TIMEOUT_LAN : TIMEOUT_WAN); -} - - -void ServiceBrowserPrivate::queryFinished() -{ - if (!m_duringResolve.count() && m_finished) emit m_parent->finished(); -} - - -QList ServiceBrowser::services() const -{ - return d->m_services; -} - -RemoteService::Ptr ServiceBrowserPrivate::find(RemoteService::Ptr s, const QList& where) const -{ - Q_FOREACH (const RemoteService::Ptr& i, where) if (*s==*i) return i; - return RemoteService::Ptr(); -} - - -void ServiceBrowserPrivate::customEvent(QEvent* event) -{ - if (event->type()==QEvent::User+SD_ERROR) { - stop(); - m_finished=false; - queryFinished(); - } - if (event->type()==QEvent::User+SD_ADDREMOVE) { - AddRemoveEvent *aev = static_cast(event); - // m_type has useless trailing dot - RemoteService::Ptr svr(new RemoteService(aev->m_name,aev->m_type.left(aev->m_type.length()-1),aev->m_domain)); - if (aev->m_op==AddRemoveEvent::Add) { - if (m_autoResolve) { - connect(svr.data(),SIGNAL(resolved(bool)),this,SLOT(serviceResolved(bool))); - m_duringResolve+=svr; - svr->resolveAsync(); - } else { - m_services+=svr; - emit m_parent->serviceAdded(svr); - } - } - else { - - RemoteService::Ptr found=find(svr, m_duringResolve); - if (!found.isNull()) m_duringResolve.removeAll(found); - else { - found=find(svr, m_services); - if (!found.isNull()) { - emit m_parent->serviceRemoved(found); - m_services.removeAll(found); - } - } - } - m_finished = aev->m_last; - if (m_finished) queryFinished(); - } -} - -void ServiceBrowserPrivate::onTimeout() -{ - m_finished=true; - queryFinished(); -} - -void query_callback (DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, - const char *serviceName, const char *regtype, const char *replyDomain, - void *context) -{ - QObject *obj = reinterpret_cast(context); - if (errorCode != kDNSServiceErr_NoError) { - ErrorEvent err; - QCoreApplication::sendEvent(obj, &err); - } else { - AddRemoveEvent arev((flags & kDNSServiceFlagsAdd) ? AddRemoveEvent::Add : - AddRemoveEvent::Remove, QString::fromUtf8(serviceName), regtype, - DNSToDomain(replyDomain), !(flags & kDNSServiceFlagsMoreComing)); - QCoreApplication::sendEvent(obj, &arev); - } -} - -// TODO: Please Implement Me - Using a KResolver (if not natively) -QHostAddress ServiceBrowser::resolveHostName(const QString &hostname) -{ - return QHostAddress(); -} - -QString ServiceBrowser::getLocalHostName() -{ - return QHostInfo::localHostName(); -} - -} - -#include "moc_servicebrowser.cpp" -#include "moc_mdnsd-servicebrowser_p.cpp" diff --git a/dnssd/mdnsd-servicebrowser_p.h b/dnssd/mdnsd-servicebrowser_p.h deleted file mode 100644 index 9d31c3ac..00000000 --- a/dnssd/mdnsd-servicebrowser_p.h +++ /dev/null @@ -1,60 +0,0 @@ -/* 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. - */ - -#ifndef MDNSD_SERVICEBROWSER_P_H -#define MDNSD_SERVICEBROWSER_P_H - -#include -#include - -#include "mdnsd-responder.h" -#include "servicebrowser.h" - -namespace DNSSD -{ - -class ServiceBrowserPrivate : public Responder -{ -Q_OBJECT -public: - ServiceBrowserPrivate(ServiceBrowser* parent) : Responder(), m_parent(parent) - {} - QList m_services; - QList m_duringResolve; - QString m_type; - QString m_domain; - QString m_subtype; - bool m_autoResolve; - bool m_finished; - ServiceBrowser* m_parent; - QTimer timeout; - - // get already found service identical to s or null if not found - RemoteService::Ptr find(RemoteService::Ptr s, const QList& where) const; - virtual void customEvent(QEvent* event); -public Q_SLOTS: - void queryFinished(); - void serviceResolved(bool success); - void onTimeout(); -}; - -} - -#endif diff --git a/dnssd/mdnsd-servicetypebrowser.cpp b/dnssd/mdnsd-servicetypebrowser.cpp deleted file mode 100644 index a874f26a..00000000 --- a/dnssd/mdnsd-servicetypebrowser.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* 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 "mdnsd-servicetypebrowser_p.h" -#include "servicetypebrowser.h" -#include "servicebrowser.h" - -namespace DNSSD -{ - -ServiceTypeBrowser::ServiceTypeBrowser(const QString& domain,QObject *parent) : QObject(parent),d(new ServiceTypeBrowserPrivate(this)) -{ - d->m_browser=new ServiceBrowser("_services._dns-sd._udp",false, domain); - connect(d->m_browser,SIGNAL(serviceAdded(DNSSD::RemoteService::Ptr)), d, SLOT(newService(DNSSD::RemoteService::Ptr))); - connect(d->m_browser,SIGNAL(serviceRemoved(DNSSD::RemoteService::Ptr)), d, SLOT(removeService(DNSSD::RemoteService::Ptr))); - connect(d->m_browser,SIGNAL(finished()), this, SIGNAL(finished())); -} - -ServiceTypeBrowser::~ServiceTypeBrowser() -{ - delete d; -} - -QStringList ServiceTypeBrowser::serviceTypes() const -{ - return d->m_servicetypes; -} - - -void ServiceTypeBrowser::startBrowse() -{ - d->m_browser->startBrowse(); -} - -void ServiceTypeBrowserPrivate::newService(DNSSD::RemoteService::Ptr srv) -{ - QString type=srv->serviceName()+'.'+srv->type(); - m_servicetypes+=type; - emit m_parent->serviceTypeAdded(type); -} - -void ServiceTypeBrowserPrivate::removeService(DNSSD::RemoteService::Ptr srv) -{ - QString type=srv->serviceName()+'.'+srv->type(); - m_servicetypes.removeAll(type); - emit m_parent->serviceTypeRemoved(type); -} - - -} - - - -#include "moc_servicetypebrowser.cpp" -#include "moc_mdnsd-servicetypebrowser_p.cpp" diff --git a/dnssd/mdnsd-servicetypebrowser_p.h b/dnssd/mdnsd-servicetypebrowser_p.h deleted file mode 100644 index 92895888..00000000 --- a/dnssd/mdnsd-servicetypebrowser_p.h +++ /dev/null @@ -1,46 +0,0 @@ -/* 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. - */ - -#ifndef MDNSD_SERVICETYPEBROWSER_P_H -#define MDNSD_SERVICETYPEBROWSER_P_H - -#include - -#include "servicebrowser.h" -#include "servicetypebrowser.h" - -namespace DNSSD -{ - -class ServiceTypeBrowserPrivate : public QObject -{ -Q_OBJECT -public: - ServiceTypeBrowserPrivate(ServiceTypeBrowser* parent): m_parent(parent) {} - ServiceTypeBrowser* m_parent; - ServiceBrowser* m_browser; - QStringList m_servicetypes; -public Q_SLOTS: - void newService(DNSSD::RemoteService::Ptr); - void removeService(DNSSD::RemoteService::Ptr); -}; - -} -#endif diff --git a/dnssd/org.freedesktop.Avahi.DomainBrowser.xml b/dnssd/org.freedesktop.Avahi.DomainBrowser.xml deleted file mode 100644 index 9f64db99..00000000 --- a/dnssd/org.freedesktop.Avahi.DomainBrowser.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dnssd/org.freedesktop.Avahi.ServiceBrowser.xml b/dnssd/org.freedesktop.Avahi.ServiceBrowser.xml deleted file mode 100644 index d2db3592..00000000 --- a/dnssd/org.freedesktop.Avahi.ServiceBrowser.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dnssd/org.freedesktop.Avahi.ServiceTypeBrowser.xml b/dnssd/org.freedesktop.Avahi.ServiceTypeBrowser.xml deleted file mode 100644 index 0468168c..00000000 --- a/dnssd/org.freedesktop.Avahi.ServiceTypeBrowser.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dnssd/publicservice.h b/dnssd/publicservice.h deleted file mode 100644 index b0e8d839..00000000 --- a/dnssd/publicservice.h +++ /dev/null @@ -1,233 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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. - */ - -#ifndef DNSSDPUBLICSERVICE_H -#define DNSSDPUBLICSERVICE_H - -#include -#include -#include - -namespace DNSSD -{ -class PublicServicePrivate; - -/** - * @class PublicService publicservice.h DNSSD/PublicService - * @short Represents a service to be published - * - * This class allows you to publish the existence of a network - * service provided by your application. - * - * If you are providing a web server and want to advertise it - * on the local network, you might do - * @code - * DNSSD::PublicService *service = new DNSSD::PublicService("My files", "_http._tcp", 80); - * bool isOK = service->publish(); - * @endcode - * - * In this example publish() is synchronous: it will not return - * until publishing is complete. This is usually not too long - * but it can freeze an application's GUI for a moment. - * To publish asynchronously instead, do: - * @code - * DNSSD::PublicService *service = new DNSSD::PublicService("My files", "_http._tcp", 80); - * connect(service, SIGNAL(published(bool)), this, SLOT(wasPublished(bool))); - * service->publishAsync(); - * @endcode - * - * @author Jakub Stachowski - */ - -class KDNSSD_EXPORT PublicService : public QObject, public ServiceBase -{ - Q_OBJECT - -public: - /** - * Creates a service description that can be published - * - * If no @p name is given, the computer name is used instead. If there - * is already a service with the same name, type and domain a number will - * be appended to the name to make it unique. - * - * If no @p domain is specified, the service is published on the link-local - * domain (.local). - * - * The subtypes can be used to specify server attributes, such - * as "_anon" for anonymous FTP servers, or can specify a specific protocol - * (such as a web service interface) on top of a generic protocol like SOAP. - * - * There is - * a comprehensive list - * of possible types available, but you are largely on your own for - * subtypes. - * - * @param name a service name to use instead of the computer name - * @param type service type, in the form _sometype._udp or _sometype._tcp - * @param port port number, or 0 to "reserve" the service name - * @param domain the domain to publish the service on (see DomainBrowser) - * @param subtypes optional list of subtypes, each with a leading underscore - * - * @see ServiceBrowser::ServiceBrowser() - */ - explicit PublicService(const QString& name = QString(), - const QString& type = QString(), - unsigned int port = 0, - const QString& domain = QString(), - const QStringList& subtypes = QStringList()); - - ~PublicService(); - - /** - * Stops publishing or aborts an incomplete publish request. - * - * Useful when you want to disable the service for some time. - * - * Note that if you stop providing a service (without exiting the - * application), you should stop publishing it. - */ - void stop(); - - /** - * Publish the service synchronously - * - * The method will not return (and hence the application interface will - * freeze, since KDElibs code should be executed in the main thread) - * until either the service is published or publishing fails. - * - * published(bool) is emitted before this method returns. - * - * @return @c true if the service was successfully published, @c false otherwise - */ - bool publish(); - - /** - * Whether the service is currently published - * - * @return @c true if the service is being published to the domain, - * @c false otherwise - */ - bool isPublished() const; - - /** - * Publish the service asynchronously - * - * Returns immediately and emits published(bool) when completed. - * Note that published(bool) may be emitted before this method - * returns when an error is detected immediately. - */ - void publishAsync(); - - /** - * Sets new text properties - * - * If the service is already published, it will be re-announced with - * the new data. - * - * @param textData the new text properties for the service - * - * @see ServiceBase::textData() - */ - void setTextData(const QMap& textData); - - /** - * Sets the name of the service - * - * If the service is already published, it will be re-announced with - * the new name. - * - * @param serviceName the new name of the service - */ - void setServiceName(const QString &serviceName); - - /** - * Sets the service type - * - * If the service is already published, it will be re-announced with - * the new type. - * - * @param type the new type of the service - * - * See PublicService() for details on the format of @p type - */ - void setType(const QString& type); - - /** - * Sets the subtypetypes of the service - * - * If the service is already published, it will be re-announced with - * the new subtypes. - * - * The existing list of substypes is replaced, so an empty list will - * cause all existing subtypes to be removed. - * - * @param subtypes the new list of subtypes - */ - void setSubTypes(const QStringList& subtypes); - - /** - * Sets the port - * - * If the service is already published, it will be re-announced with - * the new port. - * - * @param port the port of the service, or 0 to simply "reserve" the name - */ - void setPort(unsigned short port); - - /** - * Sets the domain where the service is published - * - * "local." means link-local, ie: the IP subnet on the LAN containing - * this computer. - * - * If service is already published, it will be removed from the current - * domain and published on @p domain instead. - * - * @param domain the new domain to publish the service on - */ - void setDomain(const QString& domain); - - /** - * The subtypes of service. - * - * @see setSubTypes() - */ - QStringList subtypes() const; - -Q_SIGNALS: - /** - * Emitted when publishing is complete - * - * It will also emitted when an already-published service is - * republished after a property of the service (such as the - * name or port) is changed. - */ - void published(bool successful); - -private: - friend class PublicServicePrivate; -}; - - -} - -#endif diff --git a/dnssd/remoteservice.h b/dnssd/remoteservice.h deleted file mode 100644 index 20c2b243..00000000 --- a/dnssd/remoteservice.h +++ /dev/null @@ -1,138 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2005 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. - */ - -#ifndef DNSSDREMOTESERVICE_H -#define DNSSDREMOTESERVICE_H - -#include -#include -#include - -namespace DNSSD -{ -class RemoteServicePrivate; - -/** - * @class RemoteService remoteservice.h DNSSD/RemoteService - * @short Describes a service published over DNS-SD, - * typically on a remote machine - * - * This class allows delayed or asynchronous resolution of - * services. As the name suggests, the service is normally - * on a remote machine, but the service could just as easily - * be published on the local machine. - * - * RemoteService instances are normally provided by ServiceBrowser, - * but can be used to resolve any service if you know the name, type - * and domain for it. - * - * @author Jakub Stachowski - * - * @see ServiceBrowser - */ -class KDNSSD_EXPORT RemoteService : public QObject, public ServiceBase -{ - Q_OBJECT - -public: - typedef KSharedPtr Ptr; - - /** - * Creates an unresolved RemoteService representing the service with - * the given name, type and domain - * - * @param name the name of the service - * @param type the type of the service (see ServiceBrowser::ServiceBrowser()) - * @param domain the domain of the service - * - * @see ServiceBrowser::isAvailable() - */ - RemoteService(const QString& name, const QString& type, const QString& domain); - - virtual ~RemoteService(); - - /** - * Resolves the host name and port of service asynchronously - * - * The host name is not resolved into an IP address - use KResolver - * for that. - * - * The resolved(bool) signal will be emitted when the - * resolution is complete, or when it fails. - * - * Note that resolved(bool) may be emitted before this function - * returns in case of immediate failure. - * - * RemoteService will keep monitoring the service for - * changes in hostname and port, and re-emit resolved(bool) - * when either changes. - * - * @see resolve(), hostName(), port() - */ - void resolveAsync(); - - /** - * Resolves the host name and port of service synchronously - * - * The host name is not resolved into an IP address - use KResolver - * for that. - * - * resolved(bool) is emitted before this function is returned. - * - * resolve() will not cause RemoteService to monitor for changes - * in the hostname or port of the service. - * - * @return @c true if successful, @c false on failure - * - * @see resolveAsync(), hostName(), port() - */ - bool resolve(); - - /** - * Whether the service has been successfully resolved - * - * @return @c true if hostName() and port() will return - * valid values, @c false otherwise - */ - bool isResolved() const; - -Q_SIGNALS: - /** - * Emitted when resolving is complete - * - * If operating in asynchronous mode this signal can be - * emitted several times (when the hostName or port of - * the service changes). - * - * @param successful @c true if the hostName and port were - * successfully resolved, @c false otherwise - */ - void resolved(bool successful); - -private: - friend class RemoteServicePrivate; - -}; - -} - -Q_DECLARE_METATYPE(DNSSD::RemoteService::Ptr) - -#endif diff --git a/dnssd/servicebase.cpp b/dnssd/servicebase.cpp deleted file mode 100644 index 7652ab22..00000000 --- a/dnssd/servicebase.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* 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 "servicebase.h" -#include "servicebase_p.h" -#include -#include -#include - -namespace DNSSD -{ - -ServiceBase::ServiceBase(const QString& name, const QString& type, const QString& domain, - const QString& host, unsigned short port) - : d(new ServiceBasePrivate(name,type,domain,host,port)) -{} - -ServiceBase::ServiceBase(ServiceBasePrivate* const _d) -: d(_d) -{} - -ServiceBase::~ServiceBase() -{ - delete d; -} - -QString ServiceBase::serviceName() const -{ - return d->m_serviceName; -} - -QString ServiceBase::type() const -{ - return d->m_type; -} - -QString ServiceBase::domain() const -{ - return d->m_domain; -} - -QString ServiceBase::hostName() const -{ - return d->m_hostName; -} - -unsigned short ServiceBase::port() const -{ - return d->m_port; -} -QMap ServiceBase::textData() const -{ - return d->m_textData; -} - -bool ServiceBase::operator==(const ServiceBase& o) const -{ - return d->m_domain==o.d->m_domain && d->m_serviceName==o.d->m_serviceName && d->m_type==o.d->m_type; -} - -bool ServiceBase::operator!=(const ServiceBase& o) const -{ - return !(*this == o); -} - -bool domainIsLocal(const QString& domain) -{ - return domain.section('.',-1,-1).toLower()==QLatin1String("local"); -} - -} diff --git a/dnssd/servicebase.h b/dnssd/servicebase.h deleted file mode 100644 index 00fca3cc..00000000 --- a/dnssd/servicebase.h +++ /dev/null @@ -1,203 +0,0 @@ -/* 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. - */ - -#ifndef DNSSDSERVICEBASE_H -#define DNSSDSERVICEBASE_H - -#include -#include -#include -#include - -namespace DNSSD -{ -class ServiceBasePrivate; - -/** - * @class ServiceBase servicebase.h DNSSD/ServiceBase - * @short Describes a service - * - * This class is used to describe a service. The service - * can be published by the current application (in which - * case it is probably a PublicService) or by - * another application, either on the current machine or - * a remote machine, in which case it is probably a - * RemoteService returned by ServiceBrowser. - * - * You should not normally need to create a ServiceBase - * object yourself. - * - * @author Jakub Stachowski - * - * @see PublicService - */ -class KDNSSD_EXPORT ServiceBase : public QSharedData //krazy:exclude=dpointer (protected) -{ -public: - typedef KSharedPtr Ptr; - - /** - * Creates a ServiceBase object - * - * Note that @p name, @p type and @p domain uniquely identify - * the service in the DNS-SD system, and @p host and @p port - * provide the actual location of the service. - * - * For example, RemoteService populates @p host and @p port - * based on the @p name, @p type and @p domain attributes - * using the DNS-SD resolution system. - * - * @param name service name - * @param type service type - * @param domain the DNS-SD domain name for service - * @param host the host name of the service (a fully-qualified domain name) - * @param port the port number of the service - */ - explicit ServiceBase(const QString& name = QString(), - const QString& type = QString(), - const QString& domain = QString(), - const QString& host = QString(), - unsigned short port = 0); - - virtual ~ServiceBase(); - - /** - * The name of the service - */ - QString serviceName() const; - - /** - * The type of the service - * - * This is always in the format _sometype._udp or _sometype._tcp. - * - * See the DNS-SD website for - * a full list of service types. - */ - QString type() const; - - /** - * The domain that the service belongs to - * - * It is "local." for link-local services. - */ - QString domain() const; - - /** - * The hostname of the service - * - * Only valid for local and resolved remote services. - * - * Together with port(), this can be used to actually - * access the service. - * - * @see RemoteService::resolve() and RemoteService::resolveAsync() - */ - QString hostName() const; - - /** - * The port number of the service - * - * Only valid for local and resolved remote services. - * - * Together with hostName(), this can be used to actually - * access the service. - * - * @see RemoteService::resolve() and RemoteService::resolveAsync() - */ - unsigned short port() const; - - /** - * Additional text data associated with the service - * - * Only valid for local and resolved remote services. - * - * This is data that provides additional information about the - * service. For example, it might be used to specify a printer - * queue on the printer server specified by hostName() and port(). - * - * You can check for the data that might be associated with a - * particular service on the service types list. - * If a @c key=value pair is given, this will appear with the @c value - * in a QByteArray indexed by the @c key. If the data is on its own - * (does not have an @c = in it), it will be used to index an empty - * QByteArray, and can be checked for with QMap::contains(). - * - * For example, if you are accessing the _ipp._tcp service, you might - * do something like - * @code - * QString printerModel = "unknown"; - * if (service->textData().contains("ty")) { - * printQueue = QString::fromUtf8(service->textData()["ty"].constData()); - * } - * @endcode - * since the TXT data of the IPP service may contain data like - * "ty=Apple LaserWriter Pro 630". Note that you actually have to be - * a bit more clever than this, since the key should usually be case - * insensitive. - */ - QMap textData() const; - - /** - * Compares services based on name, type and domain - * - * This is enough to for unique identification and omitting - * port, host and text data allows to compare resolved and - * unresolved services - * - * @param o the service to compare this service to - * @return @c true if this service represents the same - * service (from the point of view of DNS-SD) as - * @p o, @c false otherwise - */ - bool operator==(const ServiceBase& o) const; - /** - * Compares services based on name, type and domain - * - * This is enough to for unique identification and omitting - * port, host and text data allows to compare resolved and - * unresolved services - * - * @param o the service to compare this service to - * @return @c false if this service represents the same - * service (from the point of view of DNS-SD) as - * @p o, @c true otherwise - */ - bool operator!=(const ServiceBase& o) const; - -protected: - ServiceBase(ServiceBasePrivate* const d); - ServiceBasePrivate* const d; - -}; - -/* Utility functions */ - -/** - * Check if the domain is link-local - * - * @return @c true if domain is link-local ('local.'), @c false otherwise - */ -bool domainIsLocal(const QString& domain); - -} - -#endif diff --git a/dnssd/servicebase_p.h b/dnssd/servicebase_p.h deleted file mode 100644 index 066c35ea..00000000 --- a/dnssd/servicebase_p.h +++ /dev/null @@ -1,50 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2004, 2007 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. - */ - -#ifndef SERVICEBASE_P_H -#define SERVICEBASE_P_H - -#include -#include - -namespace DNSSD { - -class ServiceBasePrivate -{ -public: - ServiceBasePrivate(const QString& name, const QString& type, const QString& domain, - const QString& host, unsigned short port) : m_serviceName(name), m_type(type), - m_domain(domain), m_hostName(host), m_port(port) {} - - virtual ~ServiceBasePrivate() {} - - QString m_serviceName; - QString m_type; - QString m_domain; - QString m_hostName; - unsigned short m_port; - - /** - Map of TXT properties - */ - QMap m_textData; -}; -} -#endif diff --git a/dnssd/servicebrowser.h b/dnssd/servicebrowser.h deleted file mode 100644 index c38fe896..00000000 --- a/dnssd/servicebrowser.h +++ /dev/null @@ -1,290 +0,0 @@ -/* 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. - */ - -#ifndef DNSSDSERVICEBROWSER_H -#define DNSSDSERVICEBROWSER_H - -#include -#include - -#include - - -namespace DNSSD -{ -class DomainBrowser; -class ServiceBrowserPrivate; - -/** - * @class ServiceBrowser servicebrowser.h DNSSD/ServiceBrowser - * @short Browses for network services advertised over DNS-SD - * - * This is the central class in the DNSSD library for applications - * that want to discover services on network. - * - * Suppose that you need list of web servers running. Then you - * might do something like - * @code - * DNSSD::ServiceBrowser* browser = new DNSSD::ServiceBrowser("_http._tcp"); - * connect(browser, SIGNAL(serviceAdded(RemoteService::Ptr)), - * this, SLOT(addService(RemoteService::Ptr))); - * connect(browser, SIGNAL(serviceRemoved(RemoteService::Ptr)), - * this, SLOT(delService(RemoteService::Ptr))); - * browser->startBrowse(); - * @endcode - * - * In above example addService() will be called for every web server - * already running and for every web service that subsequently - * appears on the network and delService() will be called when - * a server previously advertised is stopped. - * - * Because no domain was passed to constructor, the default domain - * will be searched. To find other domains to browse for services on, - * use DomainBrowser. - * - * @author Jakub Stachowski - */ -class KDNSSD_EXPORT ServiceBrowser : public QObject -{ - Q_OBJECT - -public: - /** - * Availability of DNS-SD services - */ - enum State { - /** the service is available */ - Working, - /** not available because mDnsd or Avahi daemon is not running */ - Stopped, - /** not available because KDE was compiled without DNS-SD support */ - Unsupported - }; - - /** - * Create a ServiceBrowser for a particular service type - * - * DomainBrowser can be used to find other domains to browse on. - * If no domain is given, the default domain is used. - * - * The service type is the high-level protocol type, followed by a dot, - * followed by the transport protocol type (@c _tcp or @c _udp). - * The DNS-SD website maintains - * a full list - * of service types. - * - * The @p subtype parameter allows you to do more fine-grained filtering - * on the services you are interested in. So you might request only - * FTP servers that allow anonymous access by passing "_ftp._tcp" as the - * @p type and "_anon" as the @p subtype. Subtypes are particularly - * important for types like _soap and _upnp, which are far too generic - * for most applications. In these cases, the subtype can be used to - * specify the particular SOAP or UPnP protocol they want. - * - * @warning - * Enabling @p autoResolve will increase network usage by resolving - * all services, so this feature should be used only when necessary. - * - * @param type service types to browse for (example: "_http._tcp") - * @param autoResolve discovered services will be resolved before being - * reported with the serviceAdded() signal - * @param domain a domain to search on instead of the default one - * @param subtype only browse for a specific subtype - * - * @see startBrowse() and isAvailable() - */ - explicit ServiceBrowser(const QString& type, - bool autoResolve = false, - const QString& domain = QString(), - const QString& subtype = QString()); - - ~ServiceBrowser(); - - /** - * The currently known services of the specified type - * - * @returns a list of RemoteService pointers - * - * @see serviceAdded() and serviceRemoved() - */ - QList services() const; - - /** - * Starts browsing for services - * - * Only the first call to this function will have any effect. - * - * Browsing stops when the ServiceBrowser object is destroyed. - * - * @warning The serviceAdded() signal may be emitted before this - * function returns. - * - * @see serviceAdded(), serviceRemoved() and finished() - */ - virtual void startBrowse(); - - /** - * Checks availability of DNS-SD services - * - * Although this method is part of ServiceBrowser, none of the classes - * in this library will be able to perform their intended function - * if this method does not return Working. - * - * If this method does not return Working, it is still safe to call - * any of the methods in this library. However, no services will be - * found or published and no domains will be found. - * - * If you use this function to report an error to the user, below - * is a suggestion on how to word the errors when publishing a - * service. The first line of each error message can also be - * used for reporting errors when browsing for services. - * - * @code - * switch(DNSSD::ServiceBrowser::isAvailable()) { - * case DNSSD::ServiceBrowser::Working: - * return ""; - * case DNSSD::ServiceBrowser::Stopped: - * return i18n("

The Zeroconf daemon is not running. See the Service" - * " Discovery Handbook for more information.
" - * "Other users will not see the services provided by this - * " system when browsing the network via zeroconf, but " - * " normal access will still work.

"); - * case DNSSD::ServiceBrowser::Unsupported: - * return i18n("

Zeroconf support is not available in this version of KDE." - * " See the Service Discovery Handbook for more information.
" - * "Other users will not see the services provided by this - * " application when browsing the network via zeroconf, but " - * " normal access will still work.

"); - * default: - * return i18n("

Unknown error with Zeroconf.
" - * "Other users will not see the services provided by this - * " application when browsing the network via zeroconf, but " - * " normal access will still work.

"); - * } - * @endcode - * - */ - static State isAvailable(); - - /** - * Whether discovered services are resolved before being reported - * - * @return the value of the @p autoResolve parameter passed to the constructor - * - * @since 4.1 - */ - bool isAutoResolving() const; - - /** - * Resolves an mDNS hostname into an IP address - * - * This function is very rarely useful, since a properly configured - * system is able to resolve an mDNS-based host name using the system - * resolver (ie: you can just pass the mDNS hostname to KIO or other - * library). - * - * @param hostname the hostname to be resolved - * @return a QHostAddress containing the IP address, or QHostAddress() if - * resolution failed - * @since 4.2 - */ - static QHostAddress resolveHostName(const QString& hostname); - - /** - * The mDNS hostname of the local machine - * - * Usually this will return the same as QHostInfo::localHostName(), - * but it may be changed to something different - * in the Avahi configuration file (if using the Avahi backend). - * - * @return the hostname, or an empty string on failure - * @since 4.2 - */ - static QString getLocalHostName(); - -Q_SIGNALS: - /** - * Emitted when new service is discovered - * - * If isAutoResolving() returns @c true, this will not be emitted - * until the service has been resolved. - * - * @param service a RemoteService object describing the service - * - * @see serviceRemoved() and finished() - */ - void serviceAdded(DNSSD::RemoteService::Ptr service); - - /** - * Emitted when a service is no longer published over DNS-SD - * - * The RemoteService object is removed from the services() list - * and deleted immediately after this signal returns. - * - * @warning - * Do @b not use a delayed connection with this signal - * - * @param service a RemoteService object describing the service - * - * @see serviceAdded() and finished() - */ - void serviceRemoved(DNSSD::RemoteService::Ptr service); - - /** - * Emitted when the list of published services has settled - * - * This signal is emitted once after startBrowse() is called - * when all the services of the requested type that are - * currently published have been reported (even if none - * are available or the DNS-SD service is not available). - * It is emitted again when a new batch of services become - * available or disappear. - * - * For example, if a new host is connected to network and - * announces some services watched for by this ServiceBrowser, - * they will be reported by one or more serviceAdded() signals - * and the whole batch will be concluded by finished(). - * - * This signal can be used by applications that just want to - * get a list of the currently available services - * (similar to a directory listing) and do not care about - * adding or removing services that appear or disappear later. - * - * @warning - * There is no guarantee any RemoteService - * pointers received by serviceAdded() will be valid - * by the time this signal is emitted, so you should either - * do all your work involving them in the slot receiving - * the serviceAdded() signal, or you should listen to - * serviceRemoved() as well. - * - * @see serviceAdded() and serviceRemoved() - */ - void finished(); - -private: - friend class ServiceBrowserPrivate; - ServiceBrowserPrivate* const d; - -}; - -} - -#endif diff --git a/dnssd/servicemodel.cpp b/dnssd/servicemodel.cpp deleted file mode 100644 index 38f0e5df..00000000 --- a/dnssd/servicemodel.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2008 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 "servicemodel.h" -#include "servicebrowser.h" -#include - -namespace DNSSD -{ - -struct ServiceModelPrivate -{ - ServiceBrowser* m_browser; -}; - - -ServiceModel::ServiceModel(ServiceBrowser* browser, QObject* parent) - : QAbstractItemModel(parent), d(new ServiceModelPrivate) -{ - d->m_browser=browser; - browser->setParent(this); - connect(browser, SIGNAL(serviceAdded(DNSSD::RemoteService::Ptr)), this, - SIGNAL(layoutChanged())); - connect(browser, SIGNAL(serviceRemoved(DNSSD::RemoteService::Ptr)), this, - SIGNAL(layoutChanged())); - browser->startBrowse(); -} - -ServiceModel::~ServiceModel() -{ - delete d; -} - -int ServiceModel::columnCount(const QModelIndex&) const -{ - return d->m_browser->isAutoResolving() ? 3 : 1; -} -int ServiceModel::rowCount(const QModelIndex& parent ) const -{ - return (parent.isValid()) ? 0 : d->m_browser->services().size(); -} - -QModelIndex ServiceModel::parent(const QModelIndex&) const -{ - return QModelIndex(); -} - -QModelIndex ServiceModel::index(int row, int column, const QModelIndex& parent ) const -{ - return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex(); -} - -bool ServiceModel::hasIndex(int row, int column, const QModelIndex &parent) const -{ - if (parent.isValid()) return false; - if (column<0 || column>=columnCount()) return false; - if (row<0 || row>=rowCount(parent)) return false; - return true; -} - -QVariant ServiceModel::data(const QModelIndex& index, int role ) const -{ - if (!index.isValid()) return QVariant(); - if (!hasIndex(index.row(), index.column(), index.parent())) return QVariant(); - const QList srv=d->m_browser->services(); - switch (role) { - case Qt::DisplayRole: - switch (index.column()) { - case ServiceName: return srv[index.row()]->serviceName(); - case Host: return srv[index.row()]->hostName(); - case Port: return srv[index.row()]->port(); - } - case ServicePtrRole: QVariant ret; - ret.setValue(srv[index.row()]); - return ret; - } - return QVariant(); -} - -QVariant ServiceModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - if (orientation!=Qt::Horizontal || role!=Qt::DisplayRole) return QVariant(); - switch (section) { - case ServiceName: return i18n("Name"); - case Host: return i18n("Host"); - case Port: return i18n("Port"); - } - return QVariant(); -} - -} diff --git a/dnssd/servicemodel.h b/dnssd/servicemodel.h deleted file mode 100644 index 611b5ed9..00000000 --- a/dnssd/servicemodel.h +++ /dev/null @@ -1,126 +0,0 @@ -/* This file is part of the KDE project - * - * Copyright (C) 2008 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. - */ - -#ifndef DNSSDSERVICEMODEL_H -#define DNSSDSERVICEMODEL_H - -#include -#include -#include - -namespace DNSSD -{ - -struct ServiceModelPrivate; -class ServiceBrowser; - - -/** - * @class ServiceModel servicemodel.h DNSSD/ServiceModel - * @short Model for list of Zeroconf services - * - * This class provides a Qt Model for ServiceBrowser to allow easy - * integration of service discovery into a GUI. For example, to - * show the HTTP servers published on the local network, you can do: - * @code - * DNSSD::ServiceModel *serviceModel = new ServiceModel( - * new DNSSD::ServiceBrowser("_http._tcp") - * ); - * QComboBox *serviceCombo = new QComboBox(); - * serviceCombo->setModel(serviceModel); - * @endcode - * - * After the user makes a selection, the application typically needs - * to get a pointer to the selected service in order to get the host - * name and port. A RemoteService::Ptr can be obtained from - * a QModelIndex using: - * @code - * void onSelected(const QModelIndex &selection) { - * DNSSD::RemoteService::Ptr service = - * selection.data(DNSSD::ServiceModel::ServicePtrRole) - * .value(); - * } - * @endcode - * - * @since 4.1 - * @author Jakub Stachowski - */ - -class KDNSSD_EXPORT ServiceModel : public QAbstractItemModel -{ - Q_OBJECT - -public: - - /** The additional data roles provided by this model */ - enum AdditionalRoles { - ServicePtrRole = Qt::UserRole + 1 ///< gets a RemoteService::Ptr for the service - }; - - /** - * The default columns for this model. - * - * If service browser is not set to resolve automatically, - * then the model will only ever have one column (the service name). - */ - enum ModelColumns { - ServiceName = 0, - Host = 1, - Port = 2 - }; - - /** - * Creates a model for the given service browser and starts browsing - * for services. - * - * The model takes ownership of the browser, - * so there is no need to delete it afterwards. - * - * You should @b not call ServiceBrowser::startBrowse() on @p browser - * before passing it to ServiceModel. - */ - explicit ServiceModel(ServiceBrowser* browser, QObject* parent = 0); - - virtual ~ServiceModel(); - - /** @reimp */ - virtual int columnCount(const QModelIndex& parent = QModelIndex() ) const; - /** @reimp */ - virtual int rowCount(const QModelIndex& parent = QModelIndex() ) const; - /** @reimp */ - virtual QModelIndex parent(const QModelIndex& index ) const; - /** @reimp */ - virtual QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex() ) const; - /** @reimp */ - virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const; - /** @reimp */ - virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - /** @reimp */ - virtual bool hasIndex(int row, int column, const QModelIndex &parent) const; - -private: - ServiceModelPrivate* const d; - friend struct ServiceModelPrivate; - -}; - -} - -#endif diff --git a/dnssd/servicetypebrowser.h b/dnssd/servicetypebrowser.h deleted file mode 100644 index f1aaae2a..00000000 --- a/dnssd/servicetypebrowser.h +++ /dev/null @@ -1,146 +0,0 @@ -/* 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. - */ - -#ifndef DNSSDSERVICETYPEBROWSER_H -#define DNSSDSERVICETYPEBROWSER_H - -#include -#include -#include - -namespace DNSSD -{ -class ServiceTypeBrowserPrivate; - -/** - * @class ServiceBrowser servicebrowser.h DNSSD/ServiceBrowser - * @short Browses the service types being published on a domain - * - * This class is mostly useful for generic utilities for - * browsing all the published services on a local network. - * Applications that wish to find out about available services - * of a particular type (such as web servers) should use - * ServiceBrowser. - * - * ServiceTypeBrowser provides a list of all the service types - * published by at least one service on a given domain. - * - * @author Jakub Stachowski - */ -class KDNSSD_EXPORT ServiceTypeBrowser : public QObject -{ - Q_OBJECT - -public: - /** - * Create a ServiceTypeBrowser for a domain - * - * The link-local domain (the LAN subnet for this computer) will - * be used if no @p domain is given. DomainBrowser can be used - * to get a list of browsing domains. - * - * Note that WAN domains may not support service type browsing. - * - * @param domain a browsing domain to search - * @param parent the parent object (see QObject documentation) - * - * @see startBrowse() and ServiceBrowser::isAvailable() - */ - explicit ServiceTypeBrowser(const QString& domain = QString(), - QObject* parent = 0); - - ~ServiceTypeBrowser(); - - /** - * All the service types currently being published - * - * @return a list of service types, in the form _type._tcp or _type._udp - */ - QStringList serviceTypes() const; - - /** - * Starts browsing - * - * Only the first call to this function will have any effect. - * - * Browsing stops when the ServiceBrowser object is destroyed. - * - * @warning The serviceTypeAdded() signal may be emitted before this - * function returns. - * - * @see serviceTypeAdded(), serviceTypeRemoved() and finished() - */ - void startBrowse(); - -Q_SIGNALS: - /** - * Emitted when there are no more services of this type - * - * @warning - * This signal is not reliable: it is possible that it will not be - * emitted even after last service of this type disappeared - * - * @param type the service type - * - * @see serviceTypeAdded() and finished() - */ - void serviceTypeRemoved(const QString& type); - - /** - * A new type of service has been found - * - * @param type the service type - * - * @see serviceTypeAdded() and finished() - */ - void serviceTypeAdded(const QString& type); - - /** - * Emitted when the list of published service types has settled - * - * This signal is emitted once after startBrowse() is called - * when the types of all the services that are - * currently published have been reported (even if no services - * are available or the DNS-SD service is not available). - * It is emitted again when a new batch of service types become - * available or disappear. - * - * For example, if a new host is connected to network and - * announces services of several new types, - * they will be reported by several serviceTypeAdded() signals - * and the whole batch will be concluded by finished(). - * - * This signal can be used by applications that just want to - * get a list of the currently available service types - * (similar to a directory listing) and do not care about - * adding or removing service types that appear or disappear later. - * - * @see serviceTypeAdded() and serviceTypeRemoved() - */ - void finished(); - -private: - friend class ServiceTypeBrowserPrivate; - ServiceTypeBrowserPrivate* const d; -}; - -} - -#endif diff --git a/dnssd/settings.kcfgc b/dnssd/settings.kcfgc deleted file mode 100644 index 22d2bf84..00000000 --- a/dnssd/settings.kcfgc +++ /dev/null @@ -1,12 +0,0 @@ -ClassName=Configuration -File=kcm_kdnssd.kcfg -GlobalEnums=false -Inherits=KCoreConfigSkeleton -ItemAccessors=false -MemberVariables=private -Mutators=true -NameSpace=DNSSD -SetUserTexts=false -Singleton=true -Visibility=KDNSSD_EXPORT -IncludeFiles=dnssd/kdnssd_export.h diff --git a/includes/CMakeLists.txt b/includes/CMakeLists.txt index 0e9e82db..10e1fd73 100644 --- a/includes/CMakeLists.txt +++ b/includes/CMakeLists.txt @@ -401,21 +401,6 @@ install( COMPONENT Devel ) -install( - FILES - DNSSD/Configuration - DNSSD/DomainBrowser - DNSSD/DomainModel - DNSSD/PublicService - DNSSD/RemoteService - DNSSD/ServiceBase - DNSSD/ServiceBrowser - DNSSD/ServiceModel - DNSSD/ServiceTypeBrowser - DESTINATION ${KDE4_INCLUDE_INSTALL_DIR}/KDE/DNSSD - COMPONENT Devel -) - install( FILES KAccelGen/Deref diff --git a/includes/DNSSD/Configuration b/includes/DNSSD/Configuration deleted file mode 100644 index afafd3d9..00000000 --- a/includes/DNSSD/Configuration +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/settings.h" diff --git a/includes/DNSSD/DomainBrowser b/includes/DNSSD/DomainBrowser deleted file mode 100644 index f2b9a9aa..00000000 --- a/includes/DNSSD/DomainBrowser +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/domainbrowser.h" diff --git a/includes/DNSSD/DomainModel b/includes/DNSSD/DomainModel deleted file mode 100644 index 63d1a218..00000000 --- a/includes/DNSSD/DomainModel +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/domainmodel.h" diff --git a/includes/DNSSD/PublicService b/includes/DNSSD/PublicService deleted file mode 100644 index 4f665f10..00000000 --- a/includes/DNSSD/PublicService +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/publicservice.h" diff --git a/includes/DNSSD/RemoteService b/includes/DNSSD/RemoteService deleted file mode 100644 index 1e0dc068..00000000 --- a/includes/DNSSD/RemoteService +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/remoteservice.h" diff --git a/includes/DNSSD/ServiceBase b/includes/DNSSD/ServiceBase deleted file mode 100644 index dc40c199..00000000 --- a/includes/DNSSD/ServiceBase +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/servicebase.h" diff --git a/includes/DNSSD/ServiceBrowser b/includes/DNSSD/ServiceBrowser deleted file mode 100644 index 221e9e93..00000000 --- a/includes/DNSSD/ServiceBrowser +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/servicebrowser.h" diff --git a/includes/DNSSD/ServiceModel b/includes/DNSSD/ServiceModel deleted file mode 100644 index cd07f940..00000000 --- a/includes/DNSSD/ServiceModel +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/servicemodel.h" diff --git a/includes/DNSSD/ServiceTypeBrowser b/includes/DNSSD/ServiceTypeBrowser deleted file mode 100644 index 03e384f8..00000000 --- a/includes/DNSSD/ServiceTypeBrowser +++ /dev/null @@ -1 +0,0 @@ -#include "../../dnssd/servicetypebrowser.h" diff --git a/kdecore/kdebug.areas b/kdecore/kdebug.areas index b9d9f031..e7cb79b3 100644 --- a/kdecore/kdebug.areas +++ b/kdecore/kdebug.areas @@ -200,6 +200,9 @@ # kpowermanager 51005 kpowermanager +# kdnssd +51006 kdnssd + # kdemultimedia 67100 kmix diff --git a/kutils/CMakeLists.txt b/kutils/CMakeLists.txt index 94c10118..235f3f6f 100644 --- a/kutils/CMakeLists.txt +++ b/kutils/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(kmediaplayer) add_subdirectory(kexiv2) add_subdirectory(kpasswdstore) add_subdirectory(kpowermanager) +add_subdirectory(kdnssd) ######## kidletime #################### diff --git a/kutils/kdnssd/CMakeLists.txt b/kutils/kdnssd/CMakeLists.txt new file mode 100644 index 00000000..271ac13f --- /dev/null +++ b/kutils/kdnssd/CMakeLists.txt @@ -0,0 +1,43 @@ +if(AVAHI_FOUND) + include_directories(${AVAHI_INCLUDE_DIR}) + add_definitions(-DHAVE_AVAHI) +endif() + +add_definitions(-DKDE_DEFAULT_DEBUG_AREA=51006) + +set(kdnssd_LIB_SRCS + kdnssd.cpp +) + +add_library(kdnssd ${LIBRARY_TYPE} ${kdnssd_LIB_SRCS}) + +target_link_libraries(kdnssd PUBLIC + ${KDE4_KDECORE_LIBS} + ${QT_QTCORE_LIBRARY} + ${QT_QTNETWORK_LIBRARY} +) + +if(AVAHI_FOUND) + target_link_libraries(kdnssd PRIVATE ${AVAHI_LIBRARIES}) +endif() + +set_target_properties(kdnssd PROPERTIES + VERSION ${GENERIC_LIB_VERSION} + SOVERSION ${GENERIC_LIB_SOVERSION} +) + +generate_export_header(kdnssd) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/kdnssd_export.h + kdnssd.h + DESTINATION ${KDE4_INCLUDE_INSTALL_DIR} + COMPONENT Devel +) + +install( + TARGETS kdnssd + EXPORT kdelibsLibraryTargets + ${INSTALL_TARGETS_DEFAULT_ARGS} +) diff --git a/kutils/kdnssd/kdnssd.cpp b/kutils/kdnssd/kdnssd.cpp new file mode 100644 index 00000000..69bb0d56 --- /dev/null +++ b/kutils/kdnssd/kdnssd.cpp @@ -0,0 +1,425 @@ +/* This file is part of the KDE libraries + Copyright (C) 2022 Ivailo Monev + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2, as published by the Free Software Foundation. + + 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 "kdnssd.h" +#include "kurl.h" +#include "kdebug.h" + +#include +#include + +#if defined(HAVE_AVAHI) +# include +# include +# include +# include +# include +#endif + +class KDNSSDPrivate : public QObject +{ + Q_OBJECT +public: + KDNSSDPrivate(QObject *parent); + ~KDNSSDPrivate(); + + bool publishService(const QByteArray &servicetype, const uint serviceport, const QString &servicename); + bool unpublishService(); + + void startBrowse(const QByteArray &servicetype); + QList services(); + +#if defined(HAVE_AVAHI) + static void clientCallback(AvahiClient *avahiclient, AvahiClientState avahistate, void *userdata); + static void groupCallback(AvahiEntryGroup *avahigroup, AvahiEntryGroupState avahistate, void *userdata); + static void browseCallback(AvahiServiceBrowser *avahibrowser, AvahiIfIndex avahiinterface, + AvahiProtocol avahiprotocol, AvahiBrowserEvent avahievent, + const char *avahiname, const char *avahitype, const char *avahidomain, + AvahiLookupResultFlags avahiflags, + void* userdata); + static void resolveCallback(AvahiServiceResolver *avahiresolver, AvahiIfIndex avahiinterface, + AvahiProtocol avahiprotocol, AvahiResolverEvent avahievent, + const char *avahiname, const char *avahitype, const char *avahidomain, const char *avahihost_name, + const AvahiAddress *avahiaddress, uint16_t avahiport, + AvahiStringList *avahitxt, + AvahiLookupResultFlags avahiflags, + void* userdata); + static void serviceCallback(AvahiServiceTypeBrowser *avahiservice, + AvahiIfIndex avahiinterface, + AvahiProtocol avahiprotocol, + AvahiBrowserEvent avahievent, + const char *avahitype, + const char *avahidomain, + AvahiLookupResultFlags avahiflags, + void *userdata); + +private: + int m_poll; + AvahiSimplePoll *m_avahipoll; + AvahiClient *m_avahiclient; + AvahiEntryGroup *m_avahigroup; + QList m_services; + QList m_servicetypes; +#endif // HAVE_AVAHI +}; + +KDNSSDPrivate::KDNSSDPrivate(QObject *parent) + : QObject(parent) +#if defined(HAVE_AVAHI) + , m_poll(0), + m_avahipoll(nullptr), + m_avahiclient(nullptr), + m_avahigroup(nullptr) +#endif +{ +#if defined(HAVE_AVAHI) + m_avahipoll = avahi_simple_poll_new(); + if (!m_avahipoll) { + kWarning() << "Could not create Avahi poll"; + return; + } + + int avahierror = 0; + m_avahiclient = avahi_client_new( + avahi_simple_poll_get(m_avahipoll), AVAHI_CLIENT_NO_FAIL, + KDNSSDPrivate::clientCallback, this, + &avahierror + ); + if (!m_avahiclient) { + kWarning() << "Could not create Avahi client" << avahi_strerror(avahierror); + return; + } +#endif // HAVE_AVAHI +} + +KDNSSDPrivate::~KDNSSDPrivate() +{ +#if defined(HAVE_AVAHI) + m_poll = 0; + + if (m_avahigroup) { + avahi_entry_group_reset(m_avahigroup); + } + + if (m_avahiclient) { + avahi_client_free(m_avahiclient); + } + + if (m_avahipoll) { + avahi_simple_poll_free(m_avahipoll); + } +#endif // HAVE_AVAHI +} + +bool KDNSSDPrivate::publishService(const QByteArray &servicetype, const uint serviceport, const QString &servicename) +{ +#if defined(HAVE_AVAHI) + if (m_avahigroup) { + avahi_entry_group_reset(m_avahigroup); + } + m_avahigroup = avahi_entry_group_new(m_avahiclient, KDNSSDPrivate::groupCallback, this); + if (!m_avahigroup) { + kWarning() << "Could not create Avahi group"; + return false; + } + const QByteArray servicenamebytes = servicename.toUtf8(); + // qDebug() << Q_FUNC_INFO << servicenamebytes << servicetype; + int avahiresult = avahi_entry_group_add_service( + m_avahigroup, + AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, + AvahiPublishFlags(0), + servicenamebytes.constData(), servicetype.constData(), NULL, NULL, serviceport, + NULL + ); + if (avahiresult < 0) { + kWarning() << "Could not add Avahi service to group" << avahi_strerror(avahiresult); + return false; + } + avahiresult = avahi_entry_group_commit(m_avahigroup); + return (avahiresult >= 0); +#else + return false; +#endif +} + +bool KDNSSDPrivate::unpublishService() +{ +#if defined(HAVE_AVAHI) + if (!m_avahigroup) { + return true; + } + const int avahiresult = avahi_entry_group_reset(m_avahigroup); + if (avahiresult < 0) { + kWarning() << "Could not reset Avahi service group" << avahi_strerror(avahiresult); + return false; + } + return true; +#else + return false; +#endif +} + +void KDNSSDPrivate::startBrowse(const QByteArray &servicetype) +{ + // qDebug() << Q_FUNC_INFO << servicetype; + + QList servicetypes; + if (servicetype.isEmpty()) { + AvahiServiceTypeBrowser* avahiservice = avahi_service_type_browser_new( + m_avahiclient, + AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, NULL, + AvahiLookupFlags(0), + KDNSSDPrivate::serviceCallback, this + ); + if (!avahiservice) { + kWarning() << "Could not create Avahi service type browser" << avahi_strerror(avahi_client_errno(m_avahiclient)); + return; + } + + m_poll++; + m_servicetypes.clear(); + while (m_poll) { + // qDebug() << Q_FUNC_INFO << m_poll; + avahi_simple_poll_iterate(m_avahipoll, 0); + } + + avahi_service_type_browser_free(avahiservice); + + servicetypes = m_servicetypes; + } else { + servicetypes.append(servicetype); + } + + m_services.clear(); + foreach (const QByteArray &servicetypeit, servicetypes) { + AvahiServiceBrowser *avahibrowser = avahi_service_browser_new( + m_avahiclient, + AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, servicetypeit.constData(), NULL, + AvahiLookupFlags(0), + KDNSSDPrivate::browseCallback, this + ); + if (!avahibrowser) { + kWarning() << "Could not create Avahi browser" << avahi_strerror(avahi_client_errno(m_avahiclient)); + return; + } + + m_poll++; + while (m_poll) { + // qDebug() << Q_FUNC_INFO << m_poll; + avahi_simple_poll_iterate(m_avahipoll, 0); + } + + avahi_service_browser_free(avahibrowser); + } + + // TODO: filter IPv6 if IPv4 addresses are available or vice-versa? +} + +QList KDNSSDPrivate::services() +{ +#if defined(HAVE_AVAHI) + return m_services; +#else + static const QList result; + return result; +#endif +} + +#if defined(HAVE_AVAHI) +void KDNSSDPrivate::groupCallback(AvahiEntryGroup *avahigroup, AvahiEntryGroupState avahistate, void *userdata) +{ + // qDebug() << Q_FUNC_INFO << avahigroup << avahistate << userdata; + + if (avahistate == AVAHI_ENTRY_GROUP_FAILURE) { + kWarning() << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(avahigroup))); + } +} + +void KDNSSDPrivate::clientCallback(AvahiClient *avahiclient, AvahiClientState avahistate, void *userdata) +{ + // qDebug() << Q_FUNC_INFO << avahistate << userdata; + + if (avahistate == AVAHI_CLIENT_FAILURE) { + kWarning() << avahi_strerror(avahi_client_errno(avahiclient)); + // avahi_simple_poll_quit(m_avahiclient); + } +} + +void KDNSSDPrivate::browseCallback(AvahiServiceBrowser *avahibrowser, AvahiIfIndex avahiinterface, + AvahiProtocol avahiprotocol, AvahiBrowserEvent avahievent, + const char *avahiname, const char *avahitype, const char *avahidomain, + AvahiLookupResultFlags avahiflags, + void* userdata) +{ + // qDebug() << Q_FUNC_INFO << avahievent << avahiname << avahitype << avahidomain << userdata; + + KDNSSDPrivate *kdnssdprivate = static_cast(userdata); + AvahiClient *avahiclient = avahi_service_browser_get_client(avahibrowser); + switch (avahievent) { + case AVAHI_BROWSER_NEW: { + kDebug() << "New service" << avahiname << avahitype << avahidomain; + kdnssdprivate->m_poll++; + AvahiServiceResolver *avahiresolver = avahi_service_resolver_new( + avahiclient, + avahiinterface, avahiprotocol, + avahiname, avahitype, avahidomain, + AVAHI_PROTO_UNSPEC, AvahiLookupFlags(0), + KDNSSDPrivate::resolveCallback, + userdata + ); + if (!avahiresolver) { + kWarning() << avahi_strerror(avahi_client_errno(avahiclient)); + } + break; + } + case AVAHI_BROWSER_ALL_FOR_NOW: + case AVAHI_BROWSER_CACHE_EXHAUSTED: { + kDebug() << "Done browsing"; + kdnssdprivate->m_poll--; + KDNSSD *kdnssd= qobject_cast(kdnssdprivate->parent()); + emit kdnssd->finished(); + break; + } + case AVAHI_BROWSER_FAILURE: { + kWarning() << avahi_strerror(avahi_client_errno(avahiclient)); + kdnssdprivate->m_poll = 0; + break; + } + } +} + +void KDNSSDPrivate::resolveCallback(AvahiServiceResolver *avahiresolver, AvahiIfIndex avahiinterface, + AvahiProtocol avahiprotocol, AvahiResolverEvent avahievent, + const char *avahiname, const char *avahitype, const char *avahidomain, const char *avahihost_name, + const AvahiAddress *avahiaddress, uint16_t avahiport, + AvahiStringList *avahitxt, + AvahiLookupResultFlags avahiflags, + void* userdata) +{ + // qDebug() << Q_FUNC_INFO << avahievent << avahiname << avahitype << avahidomain << userdata; + + KDNSSDPrivate *kdnssdprivate = static_cast(userdata); + switch (avahievent) { + case AVAHI_RESOLVER_FOUND: { + kDebug() << "Resolved service" << avahiname << avahitype << avahidomain; + char avahiaddressbuff[AVAHI_ADDRESS_STR_MAX]; + ::memset(avahiaddressbuff, 0, sizeof(avahiaddressbuff) * sizeof(char)); + avahi_address_snprint(avahiaddressbuff, sizeof(avahiaddressbuff), avahiaddress); + + QString kdnssdserviceprotocol = QString::fromLatin1(avahitype); + kdnssdserviceprotocol = kdnssdserviceprotocol.mid(1); + const int dotindex = kdnssdserviceprotocol.indexOf(QLatin1Char('.')); + kdnssdserviceprotocol = kdnssdserviceprotocol.left(dotindex); + KUrl kdnssdserviceurl; + kdnssdserviceurl.setProtocol(kdnssdserviceprotocol); + kdnssdserviceurl.setHost(QString::fromLatin1(avahiaddressbuff)); + kdnssdserviceurl.setPort(avahiport); + + KDNSSDService kdnssdservice; + kdnssdservice.name = QString::fromUtf8(avahiname); + kdnssdservice.type = QByteArray(avahitype); + kdnssdservice.domain = QString::fromUtf8(avahidomain); + kdnssdservice.hostname = QString::fromUtf8(avahihost_name); + kdnssdservice.url = kdnssdserviceurl.prettyUrl(); + kdnssdservice.port = avahiport; + kdnssdprivate->m_services.append(kdnssdservice); + break; + } + case AVAHI_RESOLVER_FAILURE: { + kWarning() << avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(avahiresolver))); + break; + } + } + + kdnssdprivate->m_poll--; + avahi_service_resolver_free(avahiresolver); +} + +void KDNSSDPrivate::serviceCallback(AvahiServiceTypeBrowser *avahiservice, + AvahiIfIndex avahiinterface, + AvahiProtocol avahiprotocol, + AvahiBrowserEvent avahievent, + const char *avahitype, + const char *avahidomain, + AvahiLookupResultFlags avahiflags, + void *userdata) +{ + // qDebug() << Q_FUNC_INFO << avahievent << avahitype << avahidomain << userdata; + + KDNSSDPrivate *kdnssdprivate = static_cast(userdata); + AvahiClient *avahiclient = avahi_service_type_browser_get_client(avahiservice); + switch (avahievent) { + case AVAHI_BROWSER_NEW: { + kDebug() << "New service type" << avahitype << avahidomain; + const QByteArray kdnsservicetype(avahitype); + if (!kdnssdprivate->m_servicetypes.contains(kdnsservicetype)) { + kdnssdprivate->m_servicetypes.append(kdnsservicetype); + } + break; + } + case AVAHI_BROWSER_ALL_FOR_NOW: + case AVAHI_BROWSER_CACHE_EXHAUSTED: { + kDebug() << "Done browsing service types"; + kdnssdprivate->m_poll--; + break; + } + case AVAHI_BROWSER_FAILURE: { + kWarning() << avahi_strerror(avahi_client_errno(avahiclient)); + kdnssdprivate->m_poll = 0; + break; + } + } +} +#endif // HAVE_AVAHI + +KDNSSD::KDNSSD(QObject *parent) + : QObject(parent), + d(new KDNSSDPrivate(this)) +{ +} + +KDNSSD::~KDNSSD() +{ + delete d; +} + +bool KDNSSD::publishService(const QByteArray &servicetype, const uint serviceport, const QString &servicename) +{ +#if defined(HAVE_AVAHI) + return d->publishService(servicetype, serviceport, servicename); +#else + return false; +#endif +} + +bool KDNSSD::unpublishService() +{ + return d->unpublishService(); +} + +QList KDNSSD::services() +{ + return d->services(); +} + +void KDNSSD::startBrowse(const QByteArray &servicetype) +{ + d->startBrowse(servicetype); +} + +#include "kdnssd.moc" diff --git a/kutils/kdnssd/kdnssd.h b/kutils/kdnssd/kdnssd.h new file mode 100644 index 00000000..0178491c --- /dev/null +++ b/kutils/kdnssd/kdnssd.h @@ -0,0 +1,74 @@ +/* This file is part of the KDE libraries + Copyright (C) 2022 Ivailo Monev + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2, as published by the Free Software Foundation. + + 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. +*/ + +#ifndef KDNSSD_H +#define KDNSSD_H + +#include "kdnssd_export.h" + +#include +#include + +struct KDNSSDService +{ + QString name; + QByteArray type; + QString domain; + QString hostname; + QString url; + uint port; +}; + +class KDNSSDPrivate; + +/*! + Class to register and query for discovarable services. + + @since 4.21 + @warning the API is subject to change +*/ +class KDNSSD_EXPORT KDNSSD : public QObject +{ + Q_OBJECT +public: + /*! + @brief Contructs object with @p parent + */ + KDNSSD(QObject *parent = nullptr); + ~KDNSSD(); + + bool publishService(const QByteArray &servicetype, const uint serviceport, const QString &servicename); + bool unpublishService(); + + /*! + @brief Starts browse request for @p servicetype, if @p servicetype is empty the result will + include services for all service types. This will block until all services are resolved + */ + void startBrowse(const QByteArray &servicetype = QByteArray()); + QList services(); + +Q_SIGNALS: + void finished(); + +private: + friend KDNSSDPrivate; + Q_DISABLE_COPY(KDNSSD); + KDNSSDPrivate *d; +}; + +#endif // KDNSSD_H