-
Notifications
You must be signed in to change notification settings - Fork 0
/
zconf_domains.cpp
129 lines (108 loc) · 2.69 KB
/
zconf_domains.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
zconf - zeroconf networking objects
Copyright (c)2006,2007 Thomas Grill (gr@grrrr.org)
For information on usage and redistribution, and for a DISCLAIMER OF ALL
WARRANTIES, see the file, "license.txt," in this distribution.
$LastChangedRevision$
$LastChangedDate$
$LastChangedBy$
*/
#include "zconf.h"
namespace zconf {
class DomainsWorker
: public Worker
{
public:
DomainsWorker(int i,bool reg)
: interf(i),regdomains(reg)
{}
protected:
int interf;
bool regdomains;
virtual bool Init()
{
DNSServiceErrorType err = DNSServiceEnumerateDomains(
&client,
regdomains?kDNSServiceFlagsRegistrationDomains:kDNSServiceFlagsBrowseDomains, // flags
interf < 0?kDNSServiceInterfaceIndexLocalOnly:kDNSServiceInterfaceIndexAny,
&callback, this
);
if(LIKELY(err == kDNSServiceErr_NoError)) {
FLEXT_ASSERT(client);
return Worker::Init();
}
else {
OnError(err);
return false;
}
}
private:
static void DNSSD_API callback(
DNSServiceRef client,
DNSServiceFlags flags, // kDNSServiceFlagsMoreComing + kDNSServiceFlagsAdd
uint32_t ifIndex,
DNSServiceErrorType errorCode,
const char *replyDomain,
void *context)
{
DomainsWorker *w = (DomainsWorker *)context;
if(LIKELY(errorCode == kDNSServiceErr_NoError))
w->OnDomain(replyDomain,ifIndex,(flags & kDNSServiceFlagsAdd) != 0,(flags & kDNSServiceFlagsMoreComing) != 0);
else
w->OnError(errorCode);
}
// can be called from a secondary thread
void OnDomain(const char *domain,int ifix,bool add,bool more)
{
t_atom at[3];
SetString(at[0],DNSUnescape(domain).c_str());
SetInt(at[1],ifix);
SetBool(at[2],more);
Message(add?sym_add:sym_remove,3,at);
}
};
class Domains
: public Base
{
FLEXT_HEADER_S(Domains,Base,Setup)
public:
Domains()
: mode(0),interf(0)
{
Update();
}
void ms_mode(int m)
{
if(m < 0 || m > 2)
post("%s - mode must be 0 (off), 1 (browse domains), 2 (registration domains)",thisName());
else {
mode = m;
Update();
}
}
void ms_interface(int i)
{
if(i != interf) {
interf = i;
Update();
}
}
protected:
int mode;
int interf;
void Update()
{
Install(mode?new DomainsWorker(interf,mode == 2):NULL);
}
FLEXT_ATTRGET_I(mode)
FLEXT_CALLSET_I(ms_mode)
FLEXT_CALLSET_I(ms_interface)
FLEXT_ATTRGET_I(interf)
static void Setup(t_classid c)
{
FLEXT_CADDATTR_VAR(c,"mode",mode,ms_mode);
FLEXT_CADDATTR_VAR(c,"interface",interf,ms_interface);
}
};
FLEXT_LIB("zconf.domains, zconf",Domains)
} //namespace