#include "TBonjourRegistrar.h"
#include "TSysEvtHandler.h"
#include "TError.h"
#include "TSystem.h"
#include <arpa/inet.h>
ClassImp(TBonjourRegistrar)
TBonjourRegistrar::TBonjourRegistrar() : fDNSRef(0), fBonjourSocketHandler(0)
{
gSystem->Setenv("AVAHI_COMPAT_NOWARN", "1");
}
TBonjourRegistrar::~TBonjourRegistrar()
{
delete fBonjourSocketHandler;
if (fDNSRef) {
DNSServiceRefDeallocate(fDNSRef);
fDNSRef = 0;
}
}
Int_t TBonjourRegistrar::RegisterService(const TBonjourRecord &record, UShort_t servicePort)
{
if (fDNSRef) {
Warning("RegisterService", "already registered a service");
return 0;
}
UShort_t sport = htons(servicePort);
DNSServiceErrorType err = DNSServiceRegister(&fDNSRef, 0, kDNSServiceInterfaceIndexAny,
!strlen(record.GetServiceName()) ? 0
: record.GetServiceName(),
record.GetRegisteredType(),
!strlen(record.GetReplyDomain()) ? 0
: record.GetReplyDomain(),
0, sport,
record.GetTXTRecordsLength(),
!strlen(record.GetTXTRecords()) ? 0
: record.GetTXTRecords(),
(DNSServiceRegisterReply)BonjourRegisterService,
this);
if (err != kDNSServiceErr_NoError) {
Error("RegisterService", "error in DNSServiceRegister (%d)", err);
return -1;
}
Int_t sockfd = DNSServiceRefSockFD(fDNSRef);
if (sockfd == -1) {
Error("RegisterService", "invalid sockfd");
return -1;
}
fBonjourSocketHandler = new TFileHandler(sockfd, TFileHandler::kRead);
fBonjourSocketHandler->Connect("Notified()", "TBonjourRegistrar", this, "BonjourSocketReadyRead()");
fBonjourSocketHandler->Add();
return 0;
}
void TBonjourRegistrar::ServiceRegistered(TBonjourRecord *record)
{
Emit("ServiceRegistered(TBonjourRecord*)", (Long_t)record);
}
void TBonjourRegistrar::BonjourSocketReadyRead()
{
DNSServiceErrorType err = DNSServiceProcessResult(fDNSRef);
if (err != kDNSServiceErr_NoError)
Error("BonjourSocketReadyRead", "error in DNSServiceProcessResult");
}
void TBonjourRegistrar::BonjourRegisterService(DNSServiceRef, DNSServiceFlags,
DNSServiceErrorType errCode,
const char *name, const char *regType,
const char *domain, void *context)
{
TBonjourRegistrar *registrar = static_cast<TBonjourRegistrar*>(context);
if (errCode != kDNSServiceErr_NoError) {
::Error("TBonjourRegistrar::BonjourRegisterService", "error in BonjourRegisterService");
} else {
registrar->fFinalRecord = TBonjourRecord(name, regType, domain);
registrar->ServiceRegistered(®istrar->fFinalRecord);
}
}
TBonjourRegistrar.cxx:100 TBonjourRegistrar.cxx:101 TBonjourRegistrar.cxx:102 TBonjourRegistrar.cxx:103 TBonjourRegistrar.cxx:104 TBonjourRegistrar.cxx:105 TBonjourRegistrar.cxx:106 TBonjourRegistrar.cxx:107 TBonjourRegistrar.cxx:108 TBonjourRegistrar.cxx:109 TBonjourRegistrar.cxx:110 TBonjourRegistrar.cxx:111 TBonjourRegistrar.cxx:112 TBonjourRegistrar.cxx:113 TBonjourRegistrar.cxx:114 TBonjourRegistrar.cxx:115 TBonjourRegistrar.cxx:116 TBonjourRegistrar.cxx:117 TBonjourRegistrar.cxx:118 TBonjourRegistrar.cxx:119 TBonjourRegistrar.cxx:120 TBonjourRegistrar.cxx:121 TBonjourRegistrar.cxx:122 TBonjourRegistrar.cxx:123 TBonjourRegistrar.cxx:124 TBonjourRegistrar.cxx:125 TBonjourRegistrar.cxx:126 TBonjourRegistrar.cxx:127 TBonjourRegistrar.cxx:128 TBonjourRegistrar.cxx:129 TBonjourRegistrar.cxx:130 TBonjourRegistrar.cxx:131 TBonjourRegistrar.cxx:132 TBonjourRegistrar.cxx:133 TBonjourRegistrar.cxx:134 TBonjourRegistrar.cxx:135 TBonjourRegistrar.cxx:136 TBonjourRegistrar.cxx:137 TBonjourRegistrar.cxx:138 TBonjourRegistrar.cxx:139 TBonjourRegistrar.cxx:140 TBonjourRegistrar.cxx:141 TBonjourRegistrar.cxx:142 TBonjourRegistrar.cxx:143 TBonjourRegistrar.cxx:144 TBonjourRegistrar.cxx:145