react-native-zeroconf 0.17.4 → 1.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/NOTICE +2 -6
  2. package/Package.swift +19 -3
  3. package/README.md +1 -3
  4. package/android/CMakeLists.txt +64 -0
  5. package/android/build.gradle +1 -17
  6. package/android/generated/java/com/balthazargronon/RCTZeroconf/NativeZeroconfSpec.java +96 -0
  7. package/android/generated/jni/CMakeLists.txt +28 -0
  8. package/android/generated/jni/RNZeroconfSpec-generated.cpp +77 -0
  9. package/android/generated/jni/RNZeroconfSpec.h +31 -0
  10. package/android/generated/jni/react/renderer/components/RNZeroconfSpec/RNZeroconfSpecJSI.h +798 -0
  11. package/android/src/main/java/com/balthazargronon/RCTZeroconf/{ZeroconfModule.java → NsdHost.java} +97 -140
  12. package/android/src/main/java/com/balthazargronon/RCTZeroconf/NsdPayload.java +87 -0
  13. package/android/src/main/java/com/balthazargronon/RCTZeroconf/NsdPromise.java +40 -0
  14. package/android/src/main/java/com/balthazargronon/RCTZeroconf/Zeroconf.java +4 -6
  15. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfNativeSupport.java +60 -0
  16. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfOptions.java +15 -26
  17. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfReactPackage.java +5 -15
  18. package/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/NsdServiceImpl.java +90 -96
  19. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_clientshim.c +31 -6
  20. package/cpp/Backend.cpp +16 -0
  21. package/cpp/Backend.h +116 -0
  22. package/cpp/ZeroconfModule.cpp +280 -0
  23. package/cpp/ZeroconfModule.h +144 -0
  24. package/cpp/android/NsdBackend.cpp +462 -0
  25. package/cpp/android/NsdBackend.h +61 -0
  26. package/cpp/android/ZeroconfAndroidModule.cpp +49 -0
  27. package/cpp/android/ZeroconfAndroidModule.h +15 -0
  28. package/cpp/apple/DispatchExecutor.cpp +66 -0
  29. package/cpp/apple/DispatchExecutor.h +37 -0
  30. package/cpp/apple/LocalNetworkAccess.h +19 -0
  31. package/cpp/apple/LocalNetworkAccess.mm +87 -0
  32. package/cpp/dnssd/DnssdBackend.cpp +976 -0
  33. package/cpp/dnssd/DnssdBackend.h +114 -0
  34. package/cpp/dnssd/Executor.h +28 -0
  35. package/cpp/embedded/EmbeddedExecutor.cpp +124 -0
  36. package/cpp/embedded/EmbeddedExecutor.h +57 -0
  37. package/ios/ZeroconfOnLoad.mm +34 -0
  38. package/ios/generated/ReactCodegen/RNZeroconfSpec/RNZeroconfSpec-generated.mm +140 -0
  39. package/ios/generated/ReactCodegen/RNZeroconfSpec/RNZeroconfSpec.h +189 -0
  40. package/ios/generated/ReactCodegen/RNZeroconfSpecJSI.h +798 -0
  41. package/lib/module/NativeZeroconf.js +15 -0
  42. package/lib/module/NativeZeroconf.js.map +1 -0
  43. package/lib/module/bridge.js +124 -0
  44. package/lib/module/bridge.js.map +1 -0
  45. package/{dist → lib/module}/index.js +149 -149
  46. package/lib/module/index.js.map +1 -0
  47. package/lib/module/package.json +1 -0
  48. package/lib/module/types.js +24 -0
  49. package/lib/module/types.js.map +1 -0
  50. package/lib/typescript/package.json +1 -0
  51. package/lib/typescript/src/NativeZeroconf.d.ts +75 -0
  52. package/lib/typescript/src/NativeZeroconf.d.ts.map +1 -0
  53. package/lib/typescript/src/bridge.d.ts +22 -0
  54. package/lib/typescript/src/bridge.d.ts.map +1 -0
  55. package/lib/typescript/src/index.d.ts +111 -0
  56. package/lib/typescript/src/index.d.ts.map +1 -0
  57. package/lib/typescript/src/types.d.ts +175 -0
  58. package/lib/typescript/src/types.d.ts.map +1 -0
  59. package/package.json +64 -29
  60. package/react-native-zeroconf.podspec +2 -1
  61. package/react-native.config.js +17 -0
  62. package/src/NativeZeroconf.ts +120 -0
  63. package/src/bridge.ts +153 -0
  64. package/src/index.ts +607 -0
  65. package/{index.d.ts → src/types.ts} +5 -99
  66. package/windows/RNZeroconf/RNZeroconf.vcxproj +17 -2
  67. package/windows/RNZeroconf/RNZeroconf.vcxproj.filters +0 -6
  68. package/windows/RNZeroconf/ReactPackageProvider.cpp +23 -20
  69. package/windows/RNZeroconf/WindowsBackend.cpp +156 -0
  70. package/windows/RNZeroconf/WindowsBackend.h +13 -0
  71. package/windows/RNZeroconf/ZeroconfCore.cpp +2 -2
  72. package/windows/RNZeroconf/ZeroconfCore.h +2 -2
  73. package/windows/RNZeroconf/ZeroconfWindowsModule.cpp +22 -0
  74. package/windows/RNZeroconf/ZeroconfWindowsModule.h +14 -0
  75. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroConfImplFactory.java +0 -56
  76. package/android/src/main/java/com/balthazargronon/RCTZeroconf/dnssd/DnssdImpl.java +0 -654
  77. package/android/src/main/java/com/github/druk/dnssd/BaseListener.java +0 -33
  78. package/android/src/main/java/com/github/druk/dnssd/BrowseListener.java +0 -67
  79. package/android/src/main/java/com/github/druk/dnssd/DNSRecord.java +0 -47
  80. package/android/src/main/java/com/github/druk/dnssd/DNSSD.java +0 -681
  81. package/android/src/main/java/com/github/druk/dnssd/DNSSDEmbedded.java +0 -198
  82. package/android/src/main/java/com/github/druk/dnssd/DNSSDException.java +0 -66
  83. package/android/src/main/java/com/github/druk/dnssd/DNSSDRecordRegistrar.java +0 -55
  84. package/android/src/main/java/com/github/druk/dnssd/DNSSDRegistration.java +0 -54
  85. package/android/src/main/java/com/github/druk/dnssd/DNSSDService.java +0 -35
  86. package/android/src/main/java/com/github/druk/dnssd/DomainListener.java +0 -57
  87. package/android/src/main/java/com/github/druk/dnssd/InternalBrowseListener.java +0 -76
  88. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSD.java +0 -870
  89. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDRecordRegistrar.java +0 -30
  90. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDRegistration.java +0 -34
  91. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDService.java +0 -29
  92. package/android/src/main/java/com/github/druk/dnssd/InternalDomainListener.java +0 -62
  93. package/android/src/main/java/com/github/druk/dnssd/InternalQueryListener.java +0 -61
  94. package/android/src/main/java/com/github/druk/dnssd/InternalRegisterListener.java +0 -51
  95. package/android/src/main/java/com/github/druk/dnssd/InternalResolveListener.java +0 -58
  96. package/android/src/main/java/com/github/druk/dnssd/NSClass.java +0 -16
  97. package/android/src/main/java/com/github/druk/dnssd/NSType.java +0 -58
  98. package/android/src/main/java/com/github/druk/dnssd/QueryListener.java +0 -54
  99. package/android/src/main/java/com/github/druk/dnssd/RegisterListener.java +0 -46
  100. package/android/src/main/java/com/github/druk/dnssd/RegisterRecordListener.java +0 -35
  101. package/android/src/main/java/com/github/druk/dnssd/ResolveListener.java +0 -55
  102. package/android/src/main/java/com/github/druk/dnssd/TXTRecord.java +0 -293
  103. package/android/src/main/jni/Android.mk +0 -73
  104. package/android/src/main/jni/Application.mk +0 -3
  105. package/android/src/main/jni/DNSSD.java.h +0 -290
  106. package/android/src/main/jni/JNISupport.c +0 -1221
  107. package/ios/RNZeroconf/RNNetServiceSerializer.h +0 -31
  108. package/ios/RNZeroconf/RNNetServiceSerializer.m +0 -84
  109. package/ios/RNZeroconf/RNZeroconf.h +0 -17
  110. package/ios/RNZeroconf/RNZeroconf.m +0 -1025
  111. package/ios/RNZeroconf.xcodeproj/project.pbxproj +0 -261
  112. package/ios/RNZeroconf.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  113. package/src/index.js +0 -563
  114. package/windows/RNZeroconf/RNZeroconf.cpp +0 -228
  115. package/windows/RNZeroconf/RNZeroconf.h +0 -70
@@ -1,1221 +0,0 @@
1
- /* -*- Mode: C; tab-width: 4 -*-
2
- *
3
- * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
-
17
- This file contains the platform support for DNSSD and related Java classes.
18
- It is used to shim through to the underlying <dns_sd.h> API.
19
- */
20
-
21
- // AUTO_CALLBACKS should be set to 1 if the underlying mDNS implementation fires response
22
- // callbacks automatically (as in the early Windows prototypes).
23
- // AUTO_CALLBACKS should be set to 0 if the client must call DNSServiceProcessResult() to
24
- // invoke response callbacks (as is true on Mac OS X, Posix, Windows, etc.).
25
- // (Invoking callbacks automatically on a different thread sounds attractive, but while
26
- // the client gains by not needing to add an event source to its main event loop, it loses
27
- // by being forced to deal with concurrency and locking, which can be a bigger burden.)
28
- #ifndef AUTO_CALLBACKS
29
- #define AUTO_CALLBACKS 0
30
- #endif
31
-
32
- #if !AUTO_CALLBACKS
33
- #ifdef _WIN32
34
- #include <winsock2.h>
35
- #else //_WIN32
36
- #include <sys/types.h>
37
- #include <sys/select.h>
38
- #endif // _WIN32
39
- #endif // AUTO_CALLBACKS
40
-
41
- #include "dns_sd.h"
42
-
43
- #include <stdio.h>
44
- #include <stdlib.h>
45
- #include <string.h>
46
- #ifdef _WIN32
47
- #include <winsock2.h>
48
- #include <iphlpapi.h>
49
- static char * if_indextoname( DWORD ifIndex, char * nameBuff);
50
- static DWORD if_nametoindex( const char * nameStr );
51
- #define IF_NAMESIZE MAX_ADAPTER_NAME_LENGTH
52
- #else // _WIN32
53
- #include <sys/socket.h>
54
- #include <net/if.h>
55
- #endif // _WIN32
56
-
57
- // When compiling with "-Wshadow" set, including jni.h produces the following error:
58
- // /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h:609: warning: declaration of 'index' shadows a global declaration
59
- // To work around this, we use the preprocessor to map the identifier 'index', which appears harmlessly in function prototype declarations,
60
- // to something 'jni_index', which doesn't conflict
61
- #define index jni_index
62
- #include "DNSSD.java.h"
63
- #undef index
64
-
65
- //#include <syslog.h>
66
-
67
- // convenience definition
68
- #ifdef __GNUC__
69
- #define _UNUSED __attribute__ ((unused))
70
- #else
71
- #define _UNUSED
72
- #endif
73
-
74
- #include <stdio.h>
75
- #include <stdlib.h>
76
- #include <string.h>
77
- #include <unistd.h>
78
- #include <errno.h>
79
- #include <netinet/in.h>
80
- #include <arpa/inet.h>
81
- #include <netdb.h>
82
- #include <signal.h>
83
-
84
- #ifdef EMBEDDED
85
- #include "mDNSEmbeddedAPI.h"
86
- #include "mDNSPosix.h"
87
- #endif
88
- #include <android/log.h>
89
-
90
- enum {
91
- kInterfaceVersionOne = 1,
92
- kInterfaceVersionCurrent // Must match version in .jar file
93
- };
94
-
95
- typedef struct OpContext OpContext;
96
-
97
- struct OpContext
98
- {
99
- DNSServiceRef ServiceRef;
100
- JNIEnv *Env;
101
- jobject JavaObj;
102
- jobject ClientObj;
103
- jmethodID Callback;
104
- jmethodID Callback2;
105
- };
106
-
107
-
108
- //For AUTO_CALLBACKS, we must attach the callback thread to the Java VM prior to upcall.
109
- #if AUTO_CALLBACKS
110
- JNIEnv *pLoopEnv = NULL; // The event loop thread's env, the fallback when the current thread's is unavailable
111
- static JavaVM *gJavaVM = NULL;
112
- #endif
113
-
114
- #ifdef EMBEDDED
115
- int init();
116
- int loop();
117
- void stopLoop();
118
- void lockCore();
119
- void unlockCore();
120
- // The embedded shim reads core state (the interface list, the host name) before mDNS core
121
- // takes its own lock, so every call into it is made under the core lock. It is recursive.
122
- #define LOCK_CORE() lockCore()
123
- #define UNLOCK_CORE() unlockCore()
124
- #else
125
- #define LOCK_CORE() do { } while (0)
126
- #define UNLOCK_CORE() do { } while (0)
127
- #endif
128
-
129
- #ifdef EMBEDDED
130
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_DNSSDEmbedded_nativeInit( JNIEnv *pEnv, jclass cls)
131
- {
132
- pLoopEnv = pEnv;
133
- return init();
134
- }
135
-
136
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_DNSSDEmbedded_nativeLoop( JNIEnv *pEnv, jclass cls)
137
- {
138
- return loop();
139
- }
140
-
141
- JNIEXPORT void JNICALL Java_com_github_druk_dnssd_DNSSDEmbedded_nativeExit( JNIEnv *pEnv, jclass cls)
142
- {
143
- stopLoop();
144
- }
145
- #endif
146
-
147
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDNSSD_InitLibrary( JNIEnv *pEnv, jclass cls,
148
- jint callerVersion)
149
- {
150
- /* Ensure that caller & interface versions match. */
151
- if ( callerVersion != kInterfaceVersionCurrent)
152
- return kDNSServiceErr_Incompatible;
153
-
154
- #if AUTO_CALLBACKS
155
- if ( gJavaVM == NULL && 0 != (*pEnv)->GetJavaVM( pEnv, &gJavaVM))
156
- return kDNSServiceErr_BadState;
157
- #endif
158
-
159
- // Set AppleDNSSD.hasAutoCallbacks
160
- {
161
- #if AUTO_CALLBACKS
162
- jboolean hasAutoC = JNI_TRUE;
163
- #else
164
- jboolean hasAutoC = JNI_FALSE;
165
- #endif
166
- jfieldID hasAutoCField = (*pEnv)->GetStaticFieldID( pEnv, cls, "hasAutoCallbacks", "Z");
167
- (*pEnv)->SetStaticBooleanField( pEnv, cls, hasAutoCField, hasAutoC);
168
- }
169
-
170
- return kDNSServiceErr_NoError;
171
- }
172
-
173
-
174
- static const char* SafeGetUTFChars( JNIEnv *pEnv, jstring str)
175
- // Wrapper for JNI GetStringUTFChars() that returns NULL for null str.
176
- {
177
- return str != NULL ? (*pEnv)->GetStringUTFChars( pEnv, str, 0) : NULL;
178
- }
179
-
180
- static void SafeReleaseUTFChars( JNIEnv *pEnv, jstring str, const char *buff)
181
- // Wrapper for JNI GetStringUTFChars() that handles null str.
182
- {
183
- if ( str != NULL)
184
- (*pEnv)->ReleaseStringUTFChars( pEnv, str, buff);
185
- }
186
-
187
-
188
- #if AUTO_CALLBACKS
189
- static void SetupCallbackState( JNIEnv **ppEnv)
190
- {
191
- // Callbacks usually come from the event loop thread, but mDNS core also calls back from inside
192
- // an API call, on the client's thread: a local-only registration is acknowledged inside
193
- // DNSServiceRegister(). A JNIEnv belongs to one thread, so use the current thread's.
194
- JNIEnv *pEnv = NULL;
195
- if ( gJavaVM != NULL && JNI_OK == (*gJavaVM)->GetEnv( gJavaVM, (void**) &pEnv, JNI_VERSION_1_6) && pEnv != NULL)
196
- (*ppEnv) = pEnv;
197
- else
198
- (*ppEnv) = pLoopEnv;
199
- }
200
-
201
- static void TeardownCallbackState( void )
202
- {
203
- }
204
-
205
- #else // AUTO_CALLBACKS
206
-
207
- static void SetupCallbackState( JNIEnv **ppEnv _UNUSED)
208
- {
209
- // No setup necessary if ProcessResults() has been called
210
- }
211
-
212
- static void TeardownCallbackState( void )
213
- {
214
- // No teardown necessary if ProcessResults() has been called
215
- }
216
- #endif // AUTO_CALLBACKS
217
-
218
-
219
- static OpContext *NewContext( JNIEnv *pEnv, jobject owner,
220
- const char *callbackName, const char *callbackSig)
221
- // Create and initialize a new OpContext.
222
- {
223
- OpContext *pContext = (OpContext*) malloc( sizeof *pContext);
224
-
225
- if ( pContext != NULL)
226
- {
227
- jfieldID clientField = (*pEnv)->GetFieldID( pEnv, (*pEnv)->GetObjectClass( pEnv, owner),
228
- "fListener", "Lcom/github/druk/dnssd/BaseListener;");
229
-
230
- pContext->JavaObj = (*pEnv)->NewWeakGlobalRef( pEnv, owner); // must convert local ref to global to cache;
231
- pContext->ClientObj = (*pEnv)->GetObjectField( pEnv, owner, clientField);
232
- pContext->ClientObj = (*pEnv)->NewWeakGlobalRef( pEnv, pContext->ClientObj); // must convert local ref to global to cache
233
- pContext->Callback = (*pEnv)->GetMethodID( pEnv,
234
- (*pEnv)->GetObjectClass( pEnv, pContext->ClientObj),
235
- callbackName, callbackSig);
236
- pContext->Callback2 = NULL; // not always used
237
- }
238
-
239
- return pContext;
240
- }
241
-
242
-
243
- static void ReportError( JNIEnv *pEnv, jobject target, jobject service, DNSServiceErrorType err)
244
- // Invoke operationFailed() method on target with err.
245
- {
246
- jclass cls = (*pEnv)->GetObjectClass( pEnv, target);
247
- jmethodID opFailed = (*pEnv)->GetMethodID( pEnv, cls, "operationFailed",
248
- "(Lcom/github/druk/dnssd/DNSSDService;I)V");
249
-
250
- (*pEnv)->CallVoidMethod( pEnv, target, opFailed, service, err);
251
- }
252
-
253
- JNIEXPORT void JNICALL Java_com_github_druk_dnssd_AppleService_HaltOperation( JNIEnv *pEnv, jobject pThis)
254
- /* Deallocate the dns_sd service browser and set the Java object's fNativeContext field to 0. */
255
- {
256
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
257
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
258
-
259
- if ( contextField != 0)
260
- {
261
- OpContext *pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, pThis, contextField);
262
- if ( pContext != NULL)
263
- {
264
- // The embedded responder delivers callbacks from its own thread and may be in
265
- // the middle of one for this very operation (an answer with several records
266
- // invokes the callback once per record). DNSServiceRefDeallocate() takes the
267
- // core lock itself; holding it here too keeps the weak refs and the free() in
268
- // the same critical section. Consequently a Java callback running on the loop
269
- // thread must never block on a thread that may be in here (the main thread).
270
- LOCK_CORE();
271
- // MUST clear fNativeContext first, BEFORE calling DNSServiceRefDeallocate()
272
- (*pEnv)->SetLongField(pEnv, pThis, contextField, 0);
273
- if ( pContext->ServiceRef != NULL)
274
- DNSServiceRefDeallocate( pContext->ServiceRef);
275
-
276
- (*pEnv)->DeleteWeakGlobalRef( pEnv, pContext->JavaObj);
277
- (*pEnv)->DeleteWeakGlobalRef( pEnv, pContext->ClientObj);
278
- free( pContext);
279
- UNLOCK_CORE();
280
- }
281
- }
282
- }
283
-
284
-
285
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleService_BlockForData( JNIEnv *pEnv, jobject pThis)
286
- /* Block until data arrives, or one second passes. Returns 1 if data present, 0 otherwise. */
287
- {
288
- // BlockForData() not supported with AUTO_CALLBACKS
289
- #if !AUTO_CALLBACKS
290
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
291
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
292
-
293
- if ( contextField != 0)
294
- {
295
- OpContext *pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, pThis, contextField);
296
- if ( pContext != NULL)
297
- {
298
- fd_set readFDs;
299
- int sd = DNSServiceRefSockFD( pContext->ServiceRef);
300
- struct timeval timeout = { 1, 0 };
301
- FD_ZERO( &readFDs);
302
- FD_SET( sd, &readFDs);
303
-
304
- // Q: Why do we poll here?
305
- // A: Because there's no other thread-safe way to do it.
306
- // Mac OS X terminates a select() call if you close one of the sockets it's listening on, but Linux does not,
307
- // and arguably Linux is correct (See <http://www.ussg.iu.edu/hypermail/linux/kernel/0405.1/0418.html>)
308
- // The problem is that the Mac OS X behaviour assumes that it's okay for one thread to close a socket while
309
- // some other thread is monitoring that socket in select(), but the difficulty is that there's no general way
310
- // to make that thread-safe, because there's no atomic way to enter select() and release a lock simultaneously.
311
- // If we try to do this without holding any lock, then right as we jump to the select() routine,
312
- // some other thread could stop our operation (thereby closing the socket),
313
- // and then that thread (or even some third, unrelated thread)
314
- // could do some other DNS-SD operation (or some other operation that opens a new file descriptor)
315
- // and then we'd blindly resume our fall into the select() call, now blocking on a file descriptor
316
- // that may coincidentally have the same numerical value, but is semantically unrelated
317
- // to the true file descriptor we thought we were blocking on.
318
- // We can't stop this race condition from happening, but at least if we wake up once a second we can detect
319
- // when fNativeContext has gone to zero, and thereby discover that we were blocking on the wrong fd.
320
-
321
- if (select( sd + 1, &readFDs, (fd_set*) NULL, (fd_set*) NULL, &timeout) == 1) return(1);
322
- }
323
- }
324
- #endif // !AUTO_CALLBACKS
325
- return(0);
326
- }
327
-
328
-
329
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleService_ProcessResults( JNIEnv *pEnv, jobject pThis)
330
- /* Call through to DNSServiceProcessResult() while data remains on socket. */
331
- {
332
- #if !AUTO_CALLBACKS // ProcessResults() not supported with AUTO_CALLBACKS
333
-
334
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
335
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
336
- OpContext *pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, pThis, contextField);
337
- DNSServiceErrorType err = kDNSServiceErr_BadState;
338
-
339
- if ( pContext != NULL)
340
- {
341
- int sd = DNSServiceRefSockFD( pContext->ServiceRef);
342
- fd_set readFDs;
343
- struct timeval zeroTimeout = { 0, 0 };
344
-
345
- pContext->Env = pEnv;
346
-
347
- FD_ZERO( &readFDs);
348
- FD_SET( sd, &readFDs);
349
-
350
- err = kDNSServiceErr_NoError;
351
- if (0 < select(sd + 1, &readFDs, (fd_set*) NULL, (fd_set*) NULL, &zeroTimeout))
352
- {
353
- err = DNSServiceProcessResult(pContext->ServiceRef);
354
- // Use caution here!
355
- // We cannot touch any data structures associated with this operation!
356
- // The DNSServiceProcessResult() routine should have invoked our callback,
357
- // and our callback could have terminated the operation with op.stop();
358
- // and that means HaltOperation() will have been called, which frees pContext.
359
- // Basically, from here we just have to get out without touching any stale
360
- // data structures that could blow up on us! Particularly, any attempt
361
- // to loop here reading more results from the file descriptor is unsafe.
362
- }
363
- }
364
- return err;
365
- #else
366
- return kDNSServiceErr_NoError;
367
- #endif // AUTO_CALLBACKS
368
- }
369
-
370
-
371
- static void DNSSD_API ServiceBrowseReply( DNSServiceRef sdRef _UNUSED, DNSServiceFlags flags, uint32_t interfaceIndex,
372
- DNSServiceErrorType errorCode, const char *serviceName, const char *regtype,
373
- const char *replyDomain, void *context)
374
- {
375
- OpContext *pContext = (OpContext*) context;
376
-
377
- SetupCallbackState( &pContext->Env);
378
-
379
- // Copies: the Java callback may stop this operation, after which pContext is freed.
380
- JNIEnv *env = pContext->Env;
381
- jobject javaObj = pContext->JavaObj;
382
- jobject clientRef = pContext->ClientObj;
383
- jmethodID callback = pContext->Callback;
384
- jmethodID callback2 = pContext->Callback2;
385
-
386
- jobject clientObj = (*env)->NewLocalRef(env, clientRef);
387
-
388
- if ( clientObj != NULL && callback != NULL)
389
- {
390
- if ( errorCode == kDNSServiceErr_NoError)
391
- {
392
- jbyteArray jServiceName = (*env)->NewByteArray(env, (jsize)strlen(serviceName));
393
- (*env)->SetByteArrayRegion (env, jServiceName, 0, (jsize)strlen(serviceName), (const jbyte *) serviceName);
394
- jbyteArray jRegType = (*env)->NewByteArray(env, (jsize)strlen(regtype));
395
- (*env)->SetByteArrayRegion (env, jRegType, 0, (jsize)strlen(regtype), (const jbyte *) regtype);
396
- jbyteArray jReplyDomain = (*env)->NewByteArray(env, (jsize)strlen(replyDomain));
397
- (*env)->SetByteArrayRegion (env, jReplyDomain, 0, (jsize)strlen(replyDomain), (const jbyte *) replyDomain);
398
- (*env)->CallVoidMethod( env, clientObj,
399
- ( flags & kDNSServiceFlagsAdd) != 0 ? callback : callback2,
400
- javaObj, flags, interfaceIndex, jServiceName, jRegType, jReplyDomain);
401
- (*env)->DeleteLocalRef( env, jServiceName);
402
- (*env)->DeleteLocalRef( env, jRegType);
403
- (*env)->DeleteLocalRef( env, jReplyDomain);
404
- }
405
- else
406
- ReportError( env, clientObj, javaObj, errorCode);
407
-
408
- (*env)->DeleteLocalRef(env, clientObj);
409
- }
410
-
411
- TeardownCallbackState();
412
- }
413
-
414
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleBrowser_CreateBrowser( JNIEnv *pEnv, jobject pThis,
415
- jint flags, jint ifIndex, jstring regType, jstring domain)
416
- {
417
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
418
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
419
- OpContext *pContext = NULL;
420
- DNSServiceErrorType err = kDNSServiceErr_NoError;
421
-
422
- if ( contextField != 0)
423
- pContext = NewContext( pEnv, pThis, "serviceFound",
424
- "(Lcom/github/druk/dnssd/DNSSDService;II[B[B[B)V");
425
- else
426
- err = kDNSServiceErr_BadParam;
427
-
428
- if ( pContext != NULL)
429
- {
430
- const char *regStr = SafeGetUTFChars( pEnv, regType);
431
- const char *domainStr = SafeGetUTFChars( pEnv, domain);
432
-
433
- pContext->Callback2 = (*pEnv)->GetMethodID( pEnv,
434
- (*pEnv)->GetObjectClass( pEnv, pContext->ClientObj),
435
- "serviceLost", "(Lcom/github/druk/dnssd/DNSSDService;II[B[B[B)V");
436
-
437
- LOCK_CORE();
438
- err = DNSServiceBrowse( &pContext->ServiceRef, flags, ifIndex, regStr, domainStr, ServiceBrowseReply, pContext);
439
- UNLOCK_CORE();
440
- if ( err == kDNSServiceErr_NoError)
441
- {
442
- (*pEnv)->SetLongField(pEnv, pThis, contextField, (long) pContext);
443
- }
444
-
445
- SafeReleaseUTFChars( pEnv, regType, regStr);
446
- SafeReleaseUTFChars( pEnv, domain, domainStr);
447
- }
448
- else
449
- err = kDNSServiceErr_NoMemory;
450
-
451
- return err;
452
- }
453
-
454
-
455
- static void DNSSD_API ServiceResolveReply( DNSServiceRef sdRef _UNUSED, DNSServiceFlags flags, uint32_t interfaceIndex,
456
- DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget,
457
- uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context)
458
- {
459
- OpContext *pContext = (OpContext*) context;
460
- jclass txtCls;
461
- jmethodID txtCtor;
462
- jbyteArray txtBytes;
463
- jobject txtObj;
464
- jbyte *pBytes;
465
-
466
- SetupCallbackState( &pContext->Env);
467
-
468
- // Copies: the Java callback may stop this operation, after which pContext is freed.
469
- JNIEnv *env = pContext->Env;
470
- jobject javaObj = pContext->JavaObj;
471
- jobject clientRef = pContext->ClientObj;
472
- jmethodID callback = pContext->Callback;
473
-
474
- txtCls = (*env)->FindClass( env, "com/github/druk/dnssd/TXTRecord");
475
- txtCtor = (*env)->GetMethodID( env, txtCls, "<init>", "([B)V");
476
-
477
- if ( clientRef != NULL && callback != NULL && txtCtor != NULL &&
478
- NULL != ( txtBytes = (*env)->NewByteArray( env, txtLen)))
479
- {
480
- if ( errorCode == kDNSServiceErr_NoError)
481
- {
482
- // Since Java ints are defined to be big-endian, we canonicalize 'port' from a 16-bit
483
- // pattern into a number here.
484
- port = ( ((unsigned char*) &port)[0] << 8) | ((unsigned char*) &port)[1];
485
-
486
- // Initialize txtBytes with contents of txtRecord
487
- pBytes = (*env)->GetByteArrayElements( env, txtBytes, NULL);
488
- memcpy( pBytes, txtRecord, txtLen);
489
- (*env)->ReleaseByteArrayElements( env, txtBytes, pBytes, JNI_COMMIT);
490
-
491
- // Construct txtObj with txtBytes
492
- txtObj = (*env)->NewObject( env, txtCls, txtCtor, txtBytes);
493
- (*env)->DeleteLocalRef( env, txtBytes);
494
-
495
- jbyteArray jFullName = (*env)->NewByteArray(env, (jsize)strlen(fullname));
496
- (*env)->SetByteArrayRegion (env, jFullName, 0, (jsize)strlen(fullname), (const jbyte *) fullname);
497
- jbyteArray jHostTarget = (*env)->NewByteArray(env, (jsize)strlen(hosttarget));
498
- (*env)->SetByteArrayRegion (env, jHostTarget, 0, (jsize)strlen(hosttarget), (const jbyte *) hosttarget);
499
- (*env)->CallVoidMethod( env, clientRef, callback,
500
- javaObj, flags, interfaceIndex, jFullName, jHostTarget, port, txtObj);
501
- (*env)->DeleteLocalRef( env, jFullName);
502
- (*env)->DeleteLocalRef( env, jHostTarget);
503
- (*env)->DeleteLocalRef( env, txtObj);
504
- }
505
- else
506
- ReportError( env, clientRef, javaObj, errorCode);
507
- }
508
-
509
- TeardownCallbackState();
510
- }
511
-
512
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleResolver_CreateResolver( JNIEnv *pEnv, jobject pThis,
513
- jint flags, jint ifIndex, jstring serviceName, jstring regType, jstring domain)
514
- {
515
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
516
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
517
- OpContext *pContext = NULL;
518
- DNSServiceErrorType err = kDNSServiceErr_NoError;
519
-
520
- if ( contextField != 0)
521
- pContext = NewContext( pEnv, pThis, "serviceResolved",
522
- "(Lcom/github/druk/dnssd/DNSSDService;II[B[BILcom/github/druk/dnssd/TXTRecord;)V");
523
- else
524
- err = kDNSServiceErr_BadParam;
525
-
526
- if ( pContext != NULL)
527
- {
528
- const char *servStr = SafeGetUTFChars( pEnv, serviceName);
529
- const char *regStr = SafeGetUTFChars( pEnv, regType);
530
- const char *domainStr = SafeGetUTFChars( pEnv, domain);
531
-
532
- LOCK_CORE();
533
- err = DNSServiceResolve( &pContext->ServiceRef, flags, ifIndex,
534
- servStr, regStr, domainStr, ServiceResolveReply, pContext);
535
- UNLOCK_CORE();
536
- if ( err == kDNSServiceErr_NoError)
537
- {
538
- (*pEnv)->SetLongField(pEnv, pThis, contextField, (long) pContext);
539
- }
540
-
541
- SafeReleaseUTFChars( pEnv, serviceName, servStr);
542
- SafeReleaseUTFChars( pEnv, regType, regStr);
543
- SafeReleaseUTFChars( pEnv, domain, domainStr);
544
- }
545
- else
546
- err = kDNSServiceErr_NoMemory;
547
-
548
- return err;
549
- }
550
-
551
-
552
- static void DNSSD_API ServiceRegisterReply( DNSServiceRef sdRef _UNUSED, DNSServiceFlags flags,
553
- DNSServiceErrorType errorCode, const char *serviceName,
554
- const char *regType, const char *domain, void *context)
555
- {
556
- OpContext *pContext = (OpContext*) context;
557
-
558
- SetupCallbackState( &pContext->Env);
559
-
560
- // Copies: the Java callback may stop this operation, after which pContext is freed.
561
- JNIEnv *env = pContext->Env;
562
- jobject javaObj = pContext->JavaObj;
563
- jobject clientRef = pContext->ClientObj;
564
- jmethodID callback = pContext->Callback;
565
-
566
- if ( clientRef != NULL && callback != NULL)
567
- {
568
- if ( errorCode == kDNSServiceErr_NoError)
569
- {
570
- jbyteArray jServiceName = (*env)->NewByteArray(env, (jsize)strlen(serviceName));
571
- (*env)->SetByteArrayRegion (env, jServiceName, 0, (jsize)strlen(serviceName), (const jbyte *) serviceName);
572
- jbyteArray jRegType = (*env)->NewByteArray(env, (jsize)strlen(regType));
573
- (*env)->SetByteArrayRegion (env, jRegType, 0, (jsize)strlen(regType), (const jbyte *) regType);
574
- jbyteArray jDomain = (*env)->NewByteArray(env, (jsize)strlen(domain));
575
- (*env)->SetByteArrayRegion (env, jDomain, 0, (jsize)strlen(domain), (const jbyte *) domain);
576
-
577
- (*env)->CallVoidMethod( env, clientRef, callback,
578
- javaObj, flags,jServiceName, jRegType, jDomain);
579
- (*env)->DeleteLocalRef( env, jServiceName);
580
- (*env)->DeleteLocalRef( env, jRegType);
581
- (*env)->DeleteLocalRef( env, jDomain);
582
- }
583
- else
584
- ReportError( env, clientRef, javaObj, errorCode);
585
- }
586
- TeardownCallbackState();
587
- }
588
-
589
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleRegistration_BeginRegister( JNIEnv *pEnv, jobject pThis,
590
- jint ifIndex, jint flags, jstring serviceName, jstring regType,
591
- jstring domain, jstring host, jint port, jbyteArray txtRecord)
592
- {
593
- //syslog(LOG_ERR, "BR");
594
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
595
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
596
- OpContext *pContext = NULL;
597
- DNSServiceErrorType err = kDNSServiceErr_NoError;
598
- jbyte *pBytes;
599
- jsize numBytes;
600
-
601
- //syslog(LOG_ERR, "BR: contextField %d", contextField);
602
-
603
- if ( contextField != 0)
604
- pContext = NewContext( pEnv, pThis, "serviceRegistered",
605
- "(Lcom/github/druk/dnssd/DNSSDRegistration;I[B[B[B)V");
606
- else
607
- err = kDNSServiceErr_BadParam;
608
-
609
- if ( pContext != NULL)
610
- {
611
- const char *servStr = SafeGetUTFChars( pEnv, serviceName);
612
- const char *regStr = SafeGetUTFChars( pEnv, regType);
613
- const char *domainStr = SafeGetUTFChars( pEnv, domain);
614
- const char *hostStr = SafeGetUTFChars( pEnv, host);
615
-
616
- //syslog(LOG_ERR, "BR: regStr %s", regStr);
617
-
618
- // Since Java ints are defined to be big-endian, we de-canonicalize 'port' from a
619
- // big-endian number into a 16-bit pattern here.
620
- uint16_t portBits = port;
621
- portBits = ( ((unsigned char*) &portBits)[0] << 8) | ((unsigned char*) &portBits)[1];
622
-
623
- pBytes = txtRecord ? (*pEnv)->GetByteArrayElements( pEnv, txtRecord, NULL) : NULL;
624
- numBytes = txtRecord ? (*pEnv)->GetArrayLength( pEnv, txtRecord) : 0;
625
-
626
- LOCK_CORE();
627
- err = DNSServiceRegister( &pContext->ServiceRef, flags, ifIndex, servStr, regStr,
628
- domainStr, hostStr, portBits,
629
- numBytes, pBytes, ServiceRegisterReply, pContext);
630
- UNLOCK_CORE();
631
- if ( err == kDNSServiceErr_NoError)
632
- {
633
- (*pEnv)->SetLongField(pEnv, pThis, contextField, (long) pContext);
634
- }
635
-
636
- if ( pBytes != NULL)
637
- (*pEnv)->ReleaseByteArrayElements( pEnv, txtRecord, pBytes, 0);
638
-
639
- SafeReleaseUTFChars( pEnv, serviceName, servStr);
640
- SafeReleaseUTFChars( pEnv, regType, regStr);
641
- SafeReleaseUTFChars( pEnv, domain, domainStr);
642
- SafeReleaseUTFChars( pEnv, host, hostStr);
643
- }
644
- else
645
- err = kDNSServiceErr_NoMemory;
646
-
647
- return err;
648
- }
649
-
650
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleRegistration_AddRecord( JNIEnv *pEnv, jobject pThis,
651
- jint flags, jint rrType, jbyteArray rData, jint ttl, jobject destObj)
652
- {
653
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
654
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
655
- jclass destCls = (*pEnv)->GetObjectClass( pEnv, destObj);
656
- jfieldID recField = (*pEnv)->GetFieldID( pEnv, destCls, "fRecord", "J");
657
- OpContext *pContext = NULL;
658
- DNSServiceErrorType err = kDNSServiceErr_NoError;
659
- jbyte *pBytes;
660
- jsize numBytes;
661
- DNSRecordRef recRef;
662
-
663
- if ( contextField != 0)
664
- pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, pThis, contextField);
665
- if ( pContext == NULL || pContext->ServiceRef == NULL)
666
- return kDNSServiceErr_BadParam;
667
-
668
- pBytes = (*pEnv)->GetByteArrayElements( pEnv, rData, NULL);
669
- numBytes = (*pEnv)->GetArrayLength( pEnv, rData);
670
-
671
- LOCK_CORE();
672
- err = DNSServiceAddRecord( pContext->ServiceRef, &recRef, flags, rrType, numBytes, pBytes, ttl);
673
- UNLOCK_CORE();
674
- if ( err == kDNSServiceErr_NoError)
675
- {
676
- (*pEnv)->SetLongField(pEnv, destObj, recField, (long) recRef);
677
- }
678
-
679
- if ( pBytes != NULL)
680
- (*pEnv)->ReleaseByteArrayElements( pEnv, rData, pBytes, 0);
681
-
682
- return err;
683
- }
684
-
685
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDNSRecord_Update( JNIEnv *pEnv, jobject pThis,
686
- jint flags, jbyteArray rData, jint ttl)
687
- {
688
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
689
- jfieldID ownerField = (*pEnv)->GetFieldID( pEnv, cls, "fOwner", "Lcom/github/druk/dnssd/AppleService;");
690
- jfieldID recField = (*pEnv)->GetFieldID( pEnv, cls, "fRecord", "J");
691
- OpContext *pContext = NULL;
692
- DNSServiceErrorType err = kDNSServiceErr_NoError;
693
- jbyte *pBytes;
694
- jsize numBytes;
695
- DNSRecordRef recRef = NULL;
696
-
697
- if ( ownerField != 0)
698
- {
699
- jobject ownerObj = (*pEnv)->GetObjectField( pEnv, pThis, ownerField);
700
- jclass ownerClass = (*pEnv)->GetObjectClass( pEnv, ownerObj);
701
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, ownerClass, "fNativeContext", "J");
702
- if ( contextField != 0)
703
- pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, ownerObj, contextField);
704
- }
705
- if ( recField != 0)
706
- recRef = (DNSRecordRef) (long) (*pEnv)->GetLongField(pEnv, pThis, recField);
707
- if ( pContext == NULL || pContext->ServiceRef == NULL)
708
- return kDNSServiceErr_BadParam;
709
-
710
- pBytes = (*pEnv)->GetByteArrayElements( pEnv, rData, NULL);
711
- numBytes = (*pEnv)->GetArrayLength( pEnv, rData);
712
-
713
- LOCK_CORE();
714
- err = DNSServiceUpdateRecord( pContext->ServiceRef, recRef, flags, numBytes, pBytes, ttl);
715
- UNLOCK_CORE();
716
-
717
- if ( pBytes != NULL)
718
- (*pEnv)->ReleaseByteArrayElements( pEnv, rData, pBytes, 0);
719
-
720
- return err;
721
- }
722
-
723
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDNSRecord_Remove( JNIEnv *pEnv, jobject pThis)
724
- {
725
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
726
- jfieldID ownerField = (*pEnv)->GetFieldID( pEnv, cls, "fOwner", "Lcom/github/druk/dnssd/AppleService;");
727
- jfieldID recField = (*pEnv)->GetFieldID( pEnv, cls, "fRecord", "J");
728
- OpContext *pContext = NULL;
729
- DNSServiceErrorType err = kDNSServiceErr_NoError;
730
- DNSRecordRef recRef = NULL;
731
-
732
- if ( ownerField != 0)
733
- {
734
- jobject ownerObj = (*pEnv)->GetObjectField( pEnv, pThis, ownerField);
735
- jclass ownerClass = (*pEnv)->GetObjectClass( pEnv, ownerObj);
736
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, ownerClass, "fNativeContext", "J");
737
- if ( contextField != 0)
738
- pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, ownerObj, contextField);
739
- }
740
- if ( recField != 0)
741
- recRef = (DNSRecordRef) (long) (*pEnv)->GetLongField(pEnv, pThis, recField);
742
- if ( pContext == NULL || pContext->ServiceRef == NULL)
743
- return kDNSServiceErr_BadParam;
744
-
745
- LOCK_CORE();
746
- err = DNSServiceRemoveRecord( pContext->ServiceRef, recRef, 0);
747
- UNLOCK_CORE();
748
-
749
- return err;
750
- }
751
-
752
-
753
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleRecordRegistrar_CreateConnection( JNIEnv *pEnv, jobject pThis)
754
- {
755
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
756
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
757
- OpContext *pContext = NULL;
758
- DNSServiceErrorType err = kDNSServiceErr_NoError;
759
-
760
- if ( contextField != 0)
761
- pContext = NewContext( pEnv, pThis, "recordRegistered", "(Lcom/github/druk/dnssd/DNSRecord;I)V");
762
- else
763
- err = kDNSServiceErr_BadParam;
764
-
765
- if ( pContext != NULL)
766
- {
767
- LOCK_CORE();
768
- err = DNSServiceCreateConnection( &pContext->ServiceRef);
769
- UNLOCK_CORE();
770
- if ( err == kDNSServiceErr_NoError)
771
- {
772
- (*pEnv)->SetLongField(pEnv, pThis, contextField, (long) pContext);
773
- }
774
- }
775
- else
776
- err = kDNSServiceErr_NoMemory;
777
-
778
- return err;
779
- }
780
-
781
- struct RecordRegistrationRef
782
- {
783
- OpContext *Context;
784
- jobject RecordObj;
785
- };
786
- typedef struct RecordRegistrationRef RecordRegistrationRef;
787
-
788
- static void DNSSD_API RegisterRecordReply( DNSServiceRef sdRef _UNUSED,
789
- DNSRecordRef recordRef _UNUSED, DNSServiceFlags flags,
790
- DNSServiceErrorType errorCode, void *context)
791
- {
792
- RecordRegistrationRef *regEnvelope = (RecordRegistrationRef*) context;
793
- OpContext *pContext = regEnvelope->Context;
794
-
795
- SetupCallbackState( &pContext->Env);
796
-
797
- // Copies: the Java callback may stop this operation, after which pContext is freed.
798
- JNIEnv *env = pContext->Env;
799
- jobject javaObj = pContext->JavaObj;
800
- jobject clientRef = pContext->ClientObj;
801
- jmethodID callback = pContext->Callback;
802
-
803
- if ( clientRef != NULL && callback != NULL)
804
- {
805
- if ( errorCode == kDNSServiceErr_NoError)
806
- {
807
- (*env)->CallVoidMethod( env, clientRef, callback,
808
- regEnvelope->RecordObj, flags);
809
- }
810
- else
811
- ReportError( env, clientRef, javaObj, errorCode);
812
- }
813
-
814
- (*env)->DeleteWeakGlobalRef( env, regEnvelope->RecordObj);
815
- free( regEnvelope);
816
-
817
- TeardownCallbackState();
818
- }
819
-
820
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleRecordRegistrar_RegisterRecord( JNIEnv *pEnv, jobject pThis,
821
- jint flags, jint ifIndex, jstring fullname, jint rrType, jint rrClass,
822
- jbyteArray rData, jint ttl, jobject destObj)
823
- {
824
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
825
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
826
- jclass destCls = (*pEnv)->GetObjectClass( pEnv, destObj);
827
- jfieldID recField = (*pEnv)->GetFieldID( pEnv, destCls, "fRecord", "J");
828
- const char *nameStr = SafeGetUTFChars( pEnv, fullname);
829
- OpContext *pContext = NULL;
830
- DNSServiceErrorType err = kDNSServiceErr_NoError;
831
- jbyte *pBytes;
832
- jsize numBytes;
833
- DNSRecordRef recRef;
834
- RecordRegistrationRef *regEnvelope;
835
-
836
- if ( contextField != 0)
837
- pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, pThis, contextField);
838
- if ( pContext == NULL || pContext->ServiceRef == NULL || nameStr == NULL)
839
- return kDNSServiceErr_BadParam;
840
-
841
- regEnvelope = calloc( 1, sizeof *regEnvelope);
842
- if ( regEnvelope == NULL)
843
- return kDNSServiceErr_NoMemory;
844
- regEnvelope->Context = pContext;
845
- regEnvelope->RecordObj = (*pEnv)->NewWeakGlobalRef( pEnv, destObj); // must convert local ref to global to cache
846
-
847
- pBytes = (*pEnv)->GetByteArrayElements( pEnv, rData, NULL);
848
- numBytes = (*pEnv)->GetArrayLength( pEnv, rData);
849
-
850
- LOCK_CORE();
851
- err = DNSServiceRegisterRecord( pContext->ServiceRef, &recRef, flags, ifIndex,
852
- nameStr, rrType, rrClass, numBytes, pBytes, ttl,
853
- RegisterRecordReply, regEnvelope);
854
- UNLOCK_CORE();
855
-
856
- if ( err == kDNSServiceErr_NoError)
857
- {
858
- (*pEnv)->SetLongField(pEnv, destObj, recField, (long) recRef);
859
- }
860
- else
861
- {
862
- if ( regEnvelope->RecordObj != NULL)
863
- (*pEnv)->DeleteWeakGlobalRef( pEnv, regEnvelope->RecordObj);
864
- free( regEnvelope);
865
- }
866
-
867
- if ( pBytes != NULL)
868
- (*pEnv)->ReleaseByteArrayElements( pEnv, rData, pBytes, 0);
869
-
870
- SafeReleaseUTFChars( pEnv, fullname, nameStr);
871
-
872
- return err;
873
- }
874
-
875
-
876
- static void DNSSD_API ServiceQueryReply( DNSServiceRef sdRef _UNUSED, DNSServiceFlags flags, uint32_t interfaceIndex,
877
- DNSServiceErrorType errorCode, const char *serviceName,
878
- uint16_t rrtype, uint16_t rrclass, uint16_t rdlen,
879
- const void *rdata, uint32_t ttl, void *context)
880
- {
881
- OpContext *pContext = (OpContext*) context;
882
- jbyteArray rDataObj;
883
- jbyte *pBytes;
884
-
885
- SetupCallbackState( &pContext->Env);
886
-
887
- // Copies: the Java callback may stop this operation, after which pContext is freed.
888
- JNIEnv *env = pContext->Env;
889
- jobject javaObj = pContext->JavaObj;
890
- jobject clientRef = pContext->ClientObj;
891
- jmethodID callback = pContext->Callback;
892
-
893
- if ( clientRef != NULL && callback != NULL &&
894
- NULL != ( rDataObj = (*env)->NewByteArray( env, rdlen)))
895
- {
896
- if ( errorCode == kDNSServiceErr_NoError)
897
- {
898
- // Initialize rDataObj with contents of rdata
899
- pBytes = (*env)->GetByteArrayElements( env, rDataObj, NULL);
900
- memcpy( pBytes, rdata, rdlen);
901
- (*env)->ReleaseByteArrayElements( env, rDataObj, pBytes, JNI_COMMIT);
902
-
903
- jbyteArray jServiceName = (*env)->NewByteArray(env, (jsize)strlen(serviceName));
904
- (*env)->SetByteArrayRegion (env, jServiceName, 0, (jsize)strlen(serviceName), (const jbyte *) serviceName);
905
- (*env)->CallVoidMethod( env, clientRef, callback,
906
- javaObj, flags, interfaceIndex, jServiceName, rrtype, rrclass, rDataObj, ttl);
907
- (*env)->DeleteLocalRef( env, jServiceName);
908
- (*env)->DeleteLocalRef( env, rDataObj);
909
- }
910
- else
911
- ReportError( env, clientRef, javaObj, errorCode);
912
- }
913
- TeardownCallbackState();
914
- }
915
-
916
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleQuery_CreateQuery( JNIEnv *pEnv, jobject pThis,
917
- jint flags, jint ifIndex, jstring serviceName, jint rrtype, jint rrclass)
918
- {
919
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
920
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
921
- OpContext *pContext = NULL;
922
- DNSServiceErrorType err = kDNSServiceErr_NoError;
923
-
924
- if ( contextField != 0)
925
- pContext = NewContext( pEnv, pThis, "queryAnswered",
926
- "(Lcom/github/druk/dnssd/DNSSDService;II[BII[BI)V");
927
- else
928
- err = kDNSServiceErr_BadParam;
929
-
930
- if ( pContext != NULL)
931
- {
932
- const char *servStr = SafeGetUTFChars( pEnv, serviceName);
933
-
934
- LOCK_CORE();
935
- err = DNSServiceQueryRecord( &pContext->ServiceRef, flags, ifIndex, servStr,
936
- rrtype, rrclass, ServiceQueryReply, pContext);
937
- UNLOCK_CORE();
938
- if ( err == kDNSServiceErr_NoError)
939
- {
940
- (*pEnv)->SetLongField(pEnv, pThis, contextField, (long) pContext);
941
- }
942
-
943
- SafeReleaseUTFChars( pEnv, serviceName, servStr);
944
- }
945
- else
946
- err = kDNSServiceErr_NoMemory;
947
-
948
- return err;
949
- }
950
-
951
-
952
- static void DNSSD_API DomainEnumReply( DNSServiceRef sdRef _UNUSED, DNSServiceFlags flags, uint32_t interfaceIndex,
953
- DNSServiceErrorType errorCode, const char *replyDomain, void *context)
954
- {
955
- OpContext *pContext = (OpContext*) context;
956
-
957
- SetupCallbackState( &pContext->Env);
958
-
959
- // Copies: the Java callback may stop this operation, after which pContext is freed.
960
- JNIEnv *env = pContext->Env;
961
- jobject javaObj = pContext->JavaObj;
962
- jobject clientRef = pContext->ClientObj;
963
- jmethodID callback = pContext->Callback;
964
- jmethodID callback2 = pContext->Callback2;
965
-
966
- if ( clientRef != NULL && callback != NULL)
967
- {
968
- if ( errorCode == kDNSServiceErr_NoError)
969
- {
970
- jbyteArray jReplyDomain = (*env)->NewByteArray(env, (jsize)strlen(replyDomain));
971
- (*env)->SetByteArrayRegion (env, jReplyDomain, 0, (jsize)strlen(replyDomain), (const jbyte *) replyDomain);
972
- (*env)->CallVoidMethod( env, clientRef,
973
- ( flags & kDNSServiceFlagsAdd) != 0 ? callback : callback2,
974
- javaObj, flags, interfaceIndex, jReplyDomain);
975
- (*env)->DeleteLocalRef( env, jReplyDomain);
976
- }
977
- else
978
- ReportError( env, clientRef, javaObj, errorCode);
979
- }
980
- TeardownCallbackState();
981
- }
982
-
983
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDomainEnum_BeginEnum( JNIEnv *pEnv, jobject pThis,
984
- jint flags, jint ifIndex)
985
- {
986
- jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis);
987
- jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J");
988
- OpContext *pContext = NULL;
989
- DNSServiceErrorType err = kDNSServiceErr_NoError;
990
-
991
- if ( contextField != 0)
992
- pContext = NewContext( pEnv, pThis, "domainFound",
993
- "(Lcom/github/druk/dnssd/DNSSDService;II[B)V");
994
- else
995
- err = kDNSServiceErr_BadParam;
996
-
997
- if ( pContext != NULL)
998
- {
999
- pContext->Callback2 = (*pEnv)->GetMethodID( pEnv,
1000
- (*pEnv)->GetObjectClass( pEnv, pContext->ClientObj),
1001
- "domainLost", "(Lcom/github/druk/dnssd/DNSSDService;II[B)V");
1002
-
1003
- LOCK_CORE();
1004
- err = DNSServiceEnumerateDomains( &pContext->ServiceRef, flags, ifIndex,
1005
- DomainEnumReply, pContext);
1006
- UNLOCK_CORE();
1007
- if ( err == kDNSServiceErr_NoError)
1008
- {
1009
- (*pEnv)->SetLongField(pEnv, pThis, contextField, (long) pContext);
1010
- }
1011
- }
1012
- else
1013
- err = kDNSServiceErr_NoMemory;
1014
-
1015
- return err;
1016
- }
1017
-
1018
-
1019
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDNSSD_ConstructName( JNIEnv *pEnv, jobject pThis _UNUSED,
1020
- jstring serviceName, jstring regtype, jstring domain, jobjectArray pOut)
1021
- {
1022
- DNSServiceErrorType err = kDNSServiceErr_NoError;
1023
- const char *nameStr = SafeGetUTFChars( pEnv, serviceName);
1024
- const char *regStr = SafeGetUTFChars( pEnv, regtype);
1025
- const char *domStr = SafeGetUTFChars( pEnv, domain);
1026
- char buff[ kDNSServiceMaxDomainName + 1];
1027
-
1028
- err = DNSServiceConstructFullName( buff, nameStr, regStr, domStr);
1029
-
1030
- if ( err == kDNSServiceErr_NoError)
1031
- {
1032
- // pOut is expected to be a String[1] array.
1033
- (*pEnv)->SetObjectArrayElement( pEnv, pOut, 0, (*pEnv)->NewStringUTF( pEnv, buff));
1034
- }
1035
-
1036
- SafeReleaseUTFChars( pEnv, serviceName, nameStr);
1037
- SafeReleaseUTFChars( pEnv, regtype, regStr);
1038
- SafeReleaseUTFChars( pEnv, domain, domStr);
1039
-
1040
- return err;
1041
- }
1042
-
1043
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDNSSD_ReconfirmRecord( JNIEnv *pEnv, jobject pThis _UNUSED,
1044
- jint flags, jint ifIndex, jstring fullName,
1045
- jint rrtype, jint rrclass, jbyteArray rdata)
1046
- {
1047
- jbyte *pBytes;
1048
- jsize numBytes;
1049
- const char *nameStr = SafeGetUTFChars( pEnv, fullName);
1050
- DNSServiceErrorType err = kDNSServiceErr_NoError;
1051
-
1052
- pBytes = (*pEnv)->GetByteArrayElements( pEnv, rdata, NULL);
1053
- numBytes = (*pEnv)->GetArrayLength( pEnv, rdata);
1054
-
1055
- LOCK_CORE();
1056
- err = DNSServiceReconfirmRecord( flags, ifIndex, nameStr, rrtype, rrclass, numBytes, pBytes);
1057
- UNLOCK_CORE();
1058
-
1059
- if ( pBytes != NULL)
1060
- (*pEnv)->ReleaseByteArrayElements( pEnv, rdata, pBytes, 0);
1061
-
1062
- SafeReleaseUTFChars( pEnv, fullName, nameStr);
1063
- return err;
1064
- }
1065
-
1066
- #define LOCAL_ONLY_NAME "loo"
1067
- #define P2P_NAME "p2p"
1068
-
1069
- JNIEXPORT jstring JNICALL Java_com_github_druk_dnssd_AppleDNSSD_GetNameForIfIndex( JNIEnv *pEnv, jobject pThis _UNUSED,
1070
- jint ifIndex)
1071
- {
1072
- char *p = LOCAL_ONLY_NAME, nameBuff[IF_NAMESIZE];
1073
-
1074
- if (ifIndex == (jint) kDNSServiceInterfaceIndexP2P)
1075
- p = P2P_NAME;
1076
- else if (ifIndex != (jint) kDNSServiceInterfaceIndexLocalOnly)
1077
- p = if_indextoname( ifIndex, nameBuff );
1078
-
1079
- jbyteArray jP = (*pEnv)->NewByteArray(pEnv, (jsize)strlen(p));
1080
- (*pEnv)->SetByteArrayRegion (pEnv, jP, 0, (jsize)strlen(p), (const jbyte *) p);
1081
- return jP;
1082
- }
1083
-
1084
-
1085
- JNIEXPORT jint JNICALL Java_com_github_druk_dnssd_AppleDNSSD_GetIfIndexForName( JNIEnv *pEnv, jobject pThis _UNUSED,
1086
- jstring ifName)
1087
- {
1088
- uint32_t ifIndex = kDNSServiceInterfaceIndexLocalOnly;
1089
- const char *nameStr = SafeGetUTFChars( pEnv, ifName);
1090
-
1091
- if (strcmp(nameStr, P2P_NAME) == 0)
1092
- ifIndex = kDNSServiceInterfaceIndexP2P;
1093
- else if (strcmp(nameStr, LOCAL_ONLY_NAME))
1094
- ifIndex = if_nametoindex( nameStr);
1095
-
1096
- SafeReleaseUTFChars( pEnv, ifName, nameStr);
1097
-
1098
- return ifIndex;
1099
- }
1100
-
1101
-
1102
- #if defined(_WIN32)
1103
- static char*
1104
- if_indextoname( DWORD ifIndex, char * nameBuff)
1105
- {
1106
- PIP_ADAPTER_INFO pAdapterInfo = NULL;
1107
- PIP_ADAPTER_INFO pAdapter = NULL;
1108
- DWORD dwRetVal = 0;
1109
- char * ifName = NULL;
1110
- ULONG ulOutBufLen = 0;
1111
-
1112
- if (GetAdaptersInfo( NULL, &ulOutBufLen) != ERROR_BUFFER_OVERFLOW)
1113
- {
1114
- goto exit;
1115
- }
1116
-
1117
- pAdapterInfo = (IP_ADAPTER_INFO *) malloc(ulOutBufLen);
1118
-
1119
- if (pAdapterInfo == NULL)
1120
- {
1121
- goto exit;
1122
- }
1123
-
1124
- dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen );
1125
-
1126
- if (dwRetVal != NO_ERROR)
1127
- {
1128
- goto exit;
1129
- }
1130
-
1131
- pAdapter = pAdapterInfo;
1132
- while (pAdapter)
1133
- {
1134
- if (pAdapter->Index == ifIndex)
1135
- {
1136
- // It would be better if we passed in the length of nameBuff to this
1137
- // function, so we would have absolute certainty that no buffer
1138
- // overflows would occur. Buffer overflows *shouldn't* occur because
1139
- // nameBuff is of size MAX_ADAPTER_NAME_LENGTH.
1140
- strcpy( nameBuff, pAdapter->AdapterName );
1141
- ifName = nameBuff;
1142
- break;
1143
- }
1144
-
1145
- pAdapter = pAdapter->Next;
1146
- }
1147
-
1148
- exit:
1149
-
1150
- if (pAdapterInfo != NULL)
1151
- {
1152
- free( pAdapterInfo );
1153
- pAdapterInfo = NULL;
1154
- }
1155
-
1156
- return ifName;
1157
- }
1158
-
1159
-
1160
- static DWORD
1161
- if_nametoindex( const char * nameStr )
1162
- {
1163
- PIP_ADAPTER_INFO pAdapterInfo = NULL;
1164
- PIP_ADAPTER_INFO pAdapter = NULL;
1165
- DWORD dwRetVal = 0;
1166
- DWORD ifIndex = 0;
1167
- ULONG ulOutBufLen = 0;
1168
-
1169
- if (GetAdaptersInfo( NULL, &ulOutBufLen) != ERROR_BUFFER_OVERFLOW)
1170
- {
1171
- goto exit;
1172
- }
1173
-
1174
- pAdapterInfo = (IP_ADAPTER_INFO *) malloc(ulOutBufLen);
1175
-
1176
- if (pAdapterInfo == NULL)
1177
- {
1178
- goto exit;
1179
- }
1180
-
1181
- dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen );
1182
-
1183
- if (dwRetVal != NO_ERROR)
1184
- {
1185
- goto exit;
1186
- }
1187
-
1188
- pAdapter = pAdapterInfo;
1189
- while (pAdapter)
1190
- {
1191
- if (strcmp(pAdapter->AdapterName, nameStr) == 0)
1192
- {
1193
- ifIndex = pAdapter->Index;
1194
- break;
1195
- }
1196
-
1197
- pAdapter = pAdapter->Next;
1198
- }
1199
-
1200
- exit:
1201
-
1202
- if (pAdapterInfo != NULL)
1203
- {
1204
- free( pAdapterInfo );
1205
- pAdapterInfo = NULL;
1206
- }
1207
-
1208
- return ifIndex;
1209
- }
1210
- #endif
1211
-
1212
-
1213
- // Note: The C preprocessor stringify operator ('#') makes a string from its argument, without macro expansion
1214
- // e.g. If "version" is #define'd to be "4", then STRINGIFY_AWE(version) will return the string "version", not "4"
1215
- // To expand "version" to its value before making the string, use STRINGIFY(version) instead
1216
- #define STRINGIFY_ARGUMENT_WITHOUT_EXPANSION(s) #s
1217
- #define STRINGIFY(s) STRINGIFY_ARGUMENT_WITHOUT_EXPANSION(s)
1218
-
1219
- // NOT static -- otherwise the compiler may optimize it out
1220
- // The "@(#) " pattern is a special prefix the "what" command looks for
1221
- const char VersionString_SCCS[] = "@(#) libjdns_sd " STRINGIFY(mDNSResponderVersion) " (" __DATE__ " " __TIME__ ")";