#include "bonjour.h" #import #import #include "core/logging.h" #include "core/scoped_nsautorelease_pool.h" @interface NetServicePublicationDelegate : NSObject { } - (void)netServiceWillPublish:(NSNetService*)netService; - (void)netService:(NSNetService*)netService didNotPublish:(NSDictionary*)errorDict; - (void)netServiceDidStop:(NSNetService*)netService; @end @implementation NetServicePublicationDelegate - (void)netServiceWillPublish:(NSNetService*)netService { qLog(Debug) << "Publishing:" << [[netService name] UTF8String]; } - (void)netService:(NSNetService*)netServie didNotPublish:(NSDictionary*)errorDict { qLog(Debug) << "Failed to publish remote service with Bonjour"; NSLog(@"%@", errorDict); } - (void)netServiceDidStop:(NSNetService*)netService { qLog(Debug) << "Unpublished:" << [[netService name] UTF8String]; } @end namespace { NSString* NSStringFromQString(const QString& s) { return [[NSString alloc] initWithUTF8String:s.toUtf8().constData()]; } } Bonjour::Bonjour() : delegate_([[NetServicePublicationDelegate alloc] init]) {} Bonjour::~Bonjour() { [delegate_ release]; } void Bonjour::PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port) { ScopedNSAutoreleasePool pool; NSNetService* service = [[NSNetService alloc] initWithDomain:NSStringFromQString(domain) type:NSStringFromQString(type) name:[NSString stringWithUTF8String:name.constData()] port:port]; if (service) { [service setDelegate:delegate_]; [service publish]; } }