Skip to content

Commit 3ce62e5

Browse files
committed
Feature: Enable developers to custom their own extra nodes.
1 parent 70d5421 commit 3ce62e5

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

ffi/TerracottaAndroidAPI.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.net.UnknownHostException;
1919
import java.nio.charset.StandardCharsets;
2020
import java.util.Arrays;
21+
import java.util.List;
2122
import java.util.Objects;
2223
import java.util.concurrent.atomic.AtomicBoolean;
2324
import java.util.concurrent.atomic.AtomicLong;
@@ -234,32 +235,35 @@ public static void setWaiting() {
234235
/**
235236
* <p>Set Terracotta Android into 'host-scanning' state.</p>
236237
*
237-
* @param player the player's name. A default value will be taken if it's null.
238+
* @param room the room code, which may be used if it's valid.
239+
* @param player the player's name. A default value will be taken if it's null.
240+
* @param extraNodes extra public server nodes for EasyTier.
238241
* @throws IllegalStateException if Terracotta Android hasn't been initialized.
239242
* @implNote Usually, this method doesn't take a long time to fetch states.
240243
* However, when initializing the EasyTier, state fetching may block for ~1 seconds.
241244
*/
242-
public static void setScanning(@Nullable String room, @Nullable String player) {
245+
public static void setScanning(@Nullable String room, @Nullable String player, @Nullable List<String> extraNodes) {
243246
assertStarted();
244-
setScanning0(room, player);
247+
setScanning0(room, playerm, extraNodes == null ? null : String.join("\0", extraNodes));
245248
}
246249

247250
/**
248251
* <p>Set Terracotta Android into 'guest-connecting' state.</p>
249252
*
250-
* @param room the room code. False will be returned if it's invalid.
251-
* @param player the player's name. A default value will be taken if it's null.
253+
* @param room the room code. False will be returned if it's invalid.
254+
* @param player the player's name. A default value will be taken if it's null.
255+
* @param extraNodes extra public server nodes for EasyTier.
252256
* @return True if room code is valid, false otherwise.
253257
* @throws IllegalStateException if Terracotta Android hasn't been initialized.
254258
* @throws NullPointerException if room is null.
255259
* @implNote Usually, this method doesn't take a long time to fetch states.
256260
* However, when initializing the EasyTier, state fetching may block for ~1 seconds.
257261
*/
258-
public static boolean setGuesting(String room, @Nullable String player) {
262+
public static boolean setGuesting(String room, @Nullable String player, @Nullable List<String> extraNodes) {
259263
Objects.requireNonNull(room, "room");
260264

261265
assertStarted();
262-
return setGuesting0(room, player);
266+
return setGuesting0(room, player, extraNodes == null ? null : String.join("\0", extraNodes));
263267
}
264268

265269
/**
@@ -381,7 +385,7 @@ public static void panic() {
381385

382386
private static final long FD_PENDING = ((long) Integer.MAX_VALUE) + 1;
383387
private static final long FD_REJECT = FD_PENDING + 1;
384-
;
388+
385389
@SuppressWarnings("unused") // Native callback
386390
private static int onVpnServiceStateChanged(byte ip1, byte ip2, byte ip3, byte ip4, short network_length, String cidr) throws UnknownHostException {
387391
if (pendingRequest != null) {
@@ -460,9 +464,9 @@ private static void assertStarted() {
460464

461465
private static native void setWaiting0();
462466

463-
private static native void setScanning0(String room, String player);
467+
private static native void setScanning0(String room, String player, String extraNodes);
464468

465-
private static native boolean setGuesting0(String room, String player);
469+
private static native boolean setGuesting0(String room, String player, String extraNodes);
466470

467471
private static native int verifyRoomCode0(String room);
468472

src/lib.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,20 +277,24 @@ extern "system" fn jni_set_waiting<'l>(jenv: JNIEnv<'l>, _: JClass<'l>) {
277277
}
278278
}
279279

280-
extern "system" fn jni_set_scanning<'l>(jenv: JNIEnv<'l>, _: JClass<'l>, room: JString<'l>, player: JString<'l>) {
280+
extern "system" fn jni_set_scanning<'l>(jenv: JNIEnv<'l>, _: JClass<'l>, room: JString<'l>, player: JString<'l>, extra_nodes: JString<'l>) {
281281
try_jvm! { |jenv|
282282
let room = parse_jstring(&jenv, &room);
283283
let player = parse_jstring(&jenv, &player);
284-
controller::set_scanning(room, player, vec![]);
284+
let extra_nodes = parse_jstring(&jenv, &extra_nodes);
285+
let extra_nodes: Vec<String> = extra_nodes.map(|s| s.split("\0").collect()).unwrap_or(vec![]);
286+
controller::set_scanning(room, player, extra_nodes);
285287
}
286288
}
287289

288-
extern "system" fn jni_set_guesting<'l>(jenv: JNIEnv<'l>, _: JClass<'l>, room: JString<'l>, player: JString<'l>) -> jboolean {
290+
extern "system" fn jni_set_guesting<'l>(jenv: JNIEnv<'l>, _: JClass<'l>, room: JString<'l>, player: JString<'l>, extra_nodes: JString<'l>) -> jboolean {
289291
try_jvm! { |jenv|
290292
let room = parse_jstring(&jenv, &room).expect("'room' must not be NULL.");
291293
let player = parse_jstring(&jenv, &player);
294+
let extra_nodes = parse_jstring(&jenv, &extra_nodes);
295+
let extra_nodes: Vec<String> = extra_nodes.map(|s| s.split("\0").collect()).unwrap_or(vec![]);
292296

293-
if let Some(room) = Room::from(&room) && controller::set_guesting(room, player, vec![]) {
297+
if let Some(room) = Room::from(&room) && controller::set_guesting(room, player, extra_nodes) {
294298
JNI_TRUE
295299
} else {
296300
JNI_FALSE

0 commit comments

Comments
 (0)