00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <tqstringlist.h>
00022 #include "domainbrowser.h"
00023 #include "settings.h"
00024 #include "sdevent.h"
00025 #include "responder.h"
00026 #include "remoteservice.h"
00027 #include "query.h"
00028 #include "servicebrowser.h"
00029 #include <tdeapplication.h>
00030 #ifdef HAVE_DNSSD
00031 #ifdef AVAHI_API_0_6
00032 #include <avahi-client/lookup.h>
00033 #endif
00034 #endif
00035
00036 namespace DNSSD
00037 {
00038
00039 #ifdef HAVE_DNSSD
00040 #ifdef AVAHI_API_0_6
00041 void domains_callback(AvahiDomainBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
00042 AvahiLookupResultFlags, void* context);
00043 #else
00044 void domains_callback(AvahiDomainBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
00045 void* context);
00046 #endif
00047 #endif
00048
00049
00050 class DomainBrowserPrivate
00051 {
00052 public:
00053 #ifdef HAVE_DNSSD
00054 DomainBrowserPrivate(DomainBrowser* owner) : m_browseLAN(false), m_started(false), m_browser(0), m_owner(owner) {}
00055 #else
00056 DomainBrowserPrivate(DomainBrowser* owner) : m_browseLAN(false), m_started(false) {}
00057 #endif
00058 #ifdef HAVE_DNSSD
00059 ~DomainBrowserPrivate() { if (m_browser) avahi_domain_browser_free(m_browser); }
00060 #endif
00061 TQStringList m_domains;
00062 virtual void customEvent(TQCustomEvent* event);
00063 bool m_browseLAN;
00064 bool m_started;
00065 #ifdef HAVE_DNSSD
00066 AvahiDomainBrowser* m_browser;
00067 #endif
00068 DomainBrowser* m_owner;
00069 };
00070
00071 void DomainBrowserPrivate::customEvent(TQCustomEvent* event)
00072 {
00073 if (event->type()==TQEvent::User+SD_ADDREMOVE) {
00074 AddRemoveEvent *aev = static_cast<AddRemoveEvent*>(event);
00075 if (aev->m_op==AddRemoveEvent::Add) m_owner->gotNewDomain(aev->m_domain);
00076 else m_owner->gotRemoveDomain(aev->m_domain);
00077 }
00078 }
00079
00080
00081 DomainBrowser::DomainBrowser(TQObject *parent) : TQObject(parent)
00082 {
00083 d = new DomainBrowserPrivate(this);
00084 d->m_domains = Configuration::domainList();
00085 if (Configuration::browseLocal()) {
00086 d->m_domains+="local.";
00087 d->m_browseLAN=true;
00088 }
00089 connect(TDEApplication::kApplication(),TQT_SIGNAL(kipcMessage(int,int)),this,
00090 TQT_SLOT(domainListChanged(int,int)));
00091 }
00092
00093 DomainBrowser::DomainBrowser(const TQStringList& domains, bool recursive, TQObject *parent) : TQObject(parent)
00094 {
00095 d = new DomainBrowserPrivate(this);
00096 d->m_browseLAN = recursive;
00097 d->m_domains=domains;
00098 }
00099
00100
00101 DomainBrowser::~DomainBrowser()
00102 {
00103 delete d;
00104 }
00105
00106
00107 void DomainBrowser::startBrowse()
00108 {
00109 if (d->m_started) return;
00110 d->m_started=true;
00111 if (ServiceBrowser::isAvailable()!=ServiceBrowser::Working) return;
00112 TQStringList::const_iterator itEnd = d->m_domains.end();
00113 for (TQStringList::const_iterator it=d->m_domains.begin(); it!=itEnd; ++it ) emit domainAdded(*it);
00114 #ifdef HAVE_DNSSD
00115 if (d->m_browseLAN)
00116 #ifdef AVAHI_API_0_6
00117 d->m_browser = avahi_domain_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
00118 "local.", AVAHI_DOMAIN_BROWSER_BROWSE, (AvahiLookupFlags)0, domains_callback, this);
00119 #else
00120 d->m_browser = avahi_domain_browser_new(Responder::self().client(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
00121 "local.", AVAHI_DOMAIN_BROWSER_BROWSE, domains_callback, this);
00122 #endif
00123 #endif
00124 }
00125
00126 void DomainBrowser::gotNewDomain(const TQString& domain)
00127 {
00128 if (d->m_domains.contains(domain)) return;
00129 d->m_domains.append(domain);
00130 emit domainAdded(domain);
00131 }
00132
00133 void DomainBrowser::gotRemoveDomain(const TQString& domain)
00134 {
00135 d->m_domains.remove(domain);
00136 emit domainRemoved(domain);
00137 }
00138
00139 void DomainBrowser::domainListChanged(int message,int)
00140 {
00141 if (message!=KIPCDomainsChanged) return;
00142
00143 bool was_started = d->m_started;
00144 #ifdef HAVE_DNSSD
00145 if (d->m_browser) {
00146 avahi_domain_browser_free(d->m_browser);
00147 d->m_browser=0;
00148 }
00149 #endif
00150 d->m_started = false;
00151
00152
00153 if (was_started) {
00154 TQStringList::const_iterator itEnd = d->m_domains.end();
00155 for (TQStringList::const_iterator it=d->m_domains.begin(); it!=itEnd; ++it )
00156 emit domainRemoved(*it);
00157 }
00158 d->m_domains.clear();
00159
00160 Configuration::self()->readConfig();
00161 d->m_browseLAN = Configuration::browseLocal();
00162 d->m_domains = Configuration::domainList();
00163 if (Configuration::browseLocal()) d->m_domains+="local";
00164
00165 if (was_started) startBrowse();
00166 }
00167
00168 const TQStringList& DomainBrowser::domains() const
00169 {
00170 return d->m_domains;
00171 }
00172
00173 bool DomainBrowser::isRunning() const
00174 {
00175 return d->m_started;
00176 }
00177
00178 void DomainBrowser::virtual_hook(int, void*)
00179 {}
00180
00181 #ifdef HAVE_DNSSD
00182 #ifdef AVAHI_API_0_6
00183 void domains_callback(AvahiDomainBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
00184 AvahiLookupResultFlags,void* context)
00185 #else
00186 void domains_callback(AvahiDomainBrowser*, AvahiIfIndex, AvahiProtocol, AvahiBrowserEvent event, const char* replyDomain,
00187 void* context)
00188 #endif
00189 {
00190 TQObject *obj = reinterpret_cast<TQObject*>(context);
00191 AddRemoveEvent* arev=new AddRemoveEvent((event==AVAHI_BROWSER_NEW) ? AddRemoveEvent::Add :
00192 AddRemoveEvent::Remove, TQString::null, TQString::null,
00193 DNSToDomain(replyDomain));
00194 TQApplication::postEvent(obj, arev);
00195 }
00196 #endif
00197
00198 }
00199 #include "domainbrowser.moc"