dnssd Library API Documentation

query.cpp

00001 /* This file is part of the KDE project 00002 * 00003 * Copyright (C) 2004 Jakub Stachowski <qbast@go2.pl> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public License 00016 * along with this library; see the file COPYING.LIB. If not, write to 00017 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 * Boston, MA 02111-1307, USA. 00019 */ 00020 00021 #include "query.h" 00022 #include "responder.h" 00023 #include "remoteservice.h" 00024 #include "sdevent.h" 00025 #include <qapplication.h> 00026 #include <qtimer.h> 00027 00028 #define TIMEOUT_WAN 2000 00029 #define TIMEOUT_LAN 200 00030 00031 namespace DNSSD 00032 { 00033 #ifdef HAVE_DNSSD 00034 void query_callback (DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, 00035 const char *serviceName, const char *regtype, const char *replyDomain, void *context); 00036 #endif 00037 class QueryPrivate : public Responder 00038 { 00039 public: 00040 QueryPrivate(const QString& type, const QString& domain) : Responder(), m_finished(false), 00041 m_domain(domain), m_type(type) 00042 {}; 00043 bool m_finished; 00044 QString m_domain; 00045 QTimer timeout; 00046 QString m_type; 00047 }; 00048 00049 Query::Query(const QString& type, const QString& domain) 00050 { 00051 d = new QueryPrivate(type,domain); 00052 connect(&d->timeout,SIGNAL(timeout()),this,SLOT(timeout())); 00053 } 00054 00055 00056 Query::~Query() 00057 { 00058 delete d; 00059 } 00060 00061 bool Query::isRunning() const 00062 { 00063 return d->isRunning(); 00064 } 00065 00066 bool Query::isFinished() const 00067 { 00068 return d->m_finished; 00069 } 00070 00071 const QString& Query::domain() const 00072 { 00073 return d->m_domain; 00074 } 00075 00076 void Query::startQuery() 00077 { 00078 if (d->isRunning()) return; 00079 d->m_finished = false; 00080 #ifdef HAVE_DNSSD 00081 DNSServiceRef ref; 00082 if (DNSServiceBrowse(&ref,0,0, d->m_type.ascii(), 00083 domainToDNS(d->m_domain),query_callback,reinterpret_cast<void*>(this)) 00084 == kDNSServiceErr_NoError) d->setRef(ref); 00085 #endif 00086 if (!d->isRunning()) emit finished(); 00087 else d->timeout.start(domainIsLocal(d->m_domain) ? TIMEOUT_LAN : TIMEOUT_WAN,true); 00088 } 00089 void Query::virtual_hook(int, void*) 00090 { 00091 } 00092 00093 void Query::customEvent(QCustomEvent* event) 00094 { 00095 if (event->type()==QEvent::User+SD_ERROR) { 00096 d->stop(); 00097 d->m_finished=false; 00098 emit finished(); 00099 } 00100 if (event->type()==QEvent::User+SD_ADDREMOVE) { 00101 AddRemoveEvent *aev = static_cast<AddRemoveEvent*>(event); 00102 // m_type has useless trailing dot 00103 RemoteService* svr = new RemoteService(aev->m_name+"."+ 00104 aev->m_type.left(aev->m_type.length()-1)+"."+aev->m_domain); 00105 if (aev->m_op==AddRemoveEvent::Add) emit serviceAdded(svr); 00106 else emit serviceRemoved(svr); 00107 d->m_finished = aev->m_last; 00108 if (d->m_finished) emit finished(); 00109 } 00110 } 00111 00112 void Query::timeout() 00113 { 00114 d->m_finished=true; 00115 emit finished(); 00116 } 00117 #ifdef HAVE_DNSSD 00118 void query_callback (DNSServiceRef, DNSServiceFlags flags, uint32_t, DNSServiceErrorType errorCode, 00119 const char *serviceName, const char *regtype, const char *replyDomain, 00120 void *context) 00121 { 00122 QObject *obj = reinterpret_cast<QObject*>(context); 00123 if (errorCode != kDNSServiceErr_NoError) { 00124 ErrorEvent err; 00125 QApplication::sendEvent(obj, &err); 00126 } else { 00127 AddRemoveEvent arev((flags & kDNSServiceFlagsAdd) ? AddRemoveEvent::Add : 00128 AddRemoveEvent::Remove, QString::fromUtf8(serviceName), regtype, 00129 DNSToDomain(replyDomain), !(flags & kDNSServiceFlagsMoreComing)); 00130 QApplication::sendEvent(obj, &arev); 00131 } 00132 } 00133 #endif 00134 } 00135 #include "query.moc"
KDE Logo
This file is part of the documentation for dnssd Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 23:21:56 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003