Skip to content

Commit 7bb4546

Browse files
committed
CBL-8080: Add JNI support for per-transport MultipeerReplicator status
- Implement JNI for per-transport status notifications. - Implement JNI for getting status by transport. - Clean up JNI API comments in the header file.
1 parent c10668d commit 7bb4546

3 files changed

Lines changed: 90 additions & 24 deletions

File tree

common/main/cpp/com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator.h

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ extern "C" {
1010
#endif
1111

1212
/*
13-
* Class: Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
13+
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
1414
* Method: create
15-
* Signature: (JLjava/lang/String;J[BJ[Lcom.couchbase.lite.internal.core.MultipeerCollectionConfiguration;[B)J
16-
*/
15+
* Signature: (JLjava/lang/String;IJ[BJ[Lcom/couchbase/lite/internal/MultipeerReplicationCollection;[B)J
16+
*/
1717
JNIEXPORT jlong
1818
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_create(
1919
JNIEnv *,
@@ -28,14 +28,13 @@ JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_c
2828
jbyteArray);
2929

3030
/*
31-
* Class: Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
31+
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
3232
* Method: start
3333
* Signature: (J)V
3434
*/
3535
JNIEXPORT void
3636
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_start(JNIEnv *, jclass, jlong);
3737

38-
3938
/*
4039
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
4140
* Method: stop
@@ -45,7 +44,7 @@ JNIEXPORT void
4544
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_stop(JNIEnv *, jclass, jlong);
4645

4746
/*
48-
* Class: Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
47+
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
4948
* Method: free
5049
* Signature: (J)V
5150
*/
@@ -65,8 +64,20 @@ JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_g
6564

6665
/*
6766
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
68-
* Method: stop
69-
* Signature: (J)B[[
67+
* Method: getStatus
68+
* Signature: (JI)Lcom/couchbase/lite/internal/core/C4PeerSyncStatus;
69+
*/
70+
JNIEXPORT jobject
71+
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_getStatus(
72+
JNIEnv *env,
73+
jclass clazz,
74+
jlong peer,
75+
jint protocol);
76+
77+
/*
78+
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
79+
* Method: getNeighborPeers
80+
* Signature: (J)[[B
7081
*/
7182
JNIEXPORT jobjectArray
7283
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_getNeighborPeers(
@@ -76,8 +87,8 @@ JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_g
7687

7788
/*
7889
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
79-
* Method: stop
80-
* Signature: (JI)V
90+
* Method: getPeerInfo
91+
* Signature: (J[B)Lcom/couchbase/lite/PeerInfo;
8192
*/
8293
JNIEXPORT jobject
8394
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_getPeerInfo(
@@ -88,8 +99,8 @@ JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_g
8899

89100
/*
90101
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
91-
* Method: stop
92-
* Signature: (J)V
102+
* Method: setProgressLevel
103+
* Signature: (JI)V
93104
*/
94105
JNIEXPORT void
95106
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_setProgressLevel(

common/main/cpp/native_c4multipeerreplicator.cc

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,27 @@ namespace litecore::jni {
5050
//-------------------------------------------------------------------------
5151

5252
// C4MultipeerReplicator
53-
static jclass cls_C4MultipeerReplicator; // global reference
53+
static jclass cls_C4MultipeerReplicator; // global reference
5454
static jmethodID m_C4MultipeerReplicator_createPeerInfo;
5555
static jmethodID m_C4MultipeerReplicator_onSyncStatusChanged;
5656
static jmethodID m_C4MultipeerReplicator_onAuthenticate;
5757
static jmethodID m_C4MultipeerReplicator_onPeerDiscovered;
5858
static jmethodID m_C4MultipeerReplicator_onReplicatorStatusChanged;
5959
static jmethodID m_C4MultipeerReplicator_onDocumentEnded;
6060

61+
// C4PeerSyncStatus
62+
static jclass cls_C4PeerSyncStatus; // global reference
63+
static jmethodID m_C4PeerSyncStatus_init;
64+
6165
// ReplicationCollection
62-
static jclass cls_MultipeerReplColl; // global reference
66+
static jclass cls_MultipeerReplColl; // global reference
6367
static jfieldID f_MultipeerReplColl_token;
6468
static jfieldID f_MultipeerReplColl_scope;
6569
static jfieldID f_MultipeerReplColl_name;
6670
static jfieldID f_MultipeerReplColl_options;
6771
static jfieldID f_MultipeerReplColl_pushFilter;
6872
static jfieldID f_MultipeerReplColl_pullFilter;
69-
static jmethodID m_MultipeerReplColl_filterCallback; // validationFunction method
73+
static jmethodID m_MultipeerReplColl_filterCallback; // validationFunction method
7074

7175
static bool pullFilterCallback(
7276
C4PeerSync *,
@@ -117,7 +121,7 @@ namespace litecore::jni {
117121
m_C4MultipeerReplicator_onSyncStatusChanged = env->GetStaticMethodID(
118122
cls_C4MultipeerReplicator,
119123
"onSyncStatusChanged",
120-
"(JZIJ)V");
124+
"(JLcom/couchbase/lite/internal/core/C4PeerSyncStatus;)V");
121125

122126
if (m_C4MultipeerReplicator_onSyncStatusChanged == nullptr)
123127
return false;
@@ -202,6 +206,21 @@ namespace litecore::jni {
202206
return false;
203207
}
204208

209+
// C4PeerSyncStatus, constructor
210+
{
211+
jclass localClass = env->FindClass("com/couchbase/lite/internal/core/C4PeerSyncStatus");
212+
if (localClass == nullptr)
213+
return false;
214+
215+
cls_C4PeerSyncStatus = reinterpret_cast<jclass>(env->NewGlobalRef(localClass));
216+
if (cls_C4PeerSyncStatus == nullptr)
217+
return false;
218+
219+
m_C4PeerSyncStatus_init = env->GetMethodID(cls_C4PeerSyncStatus, "<init>", "(IZII)V");
220+
if (m_C4PeerSyncStatus_init == nullptr)
221+
return false;
222+
}
223+
205224
auto factory = socket_factory();
206225

207226
// DO NOT change this unless you change the corresponding entry in MultipeerSocketFactory.java
@@ -286,23 +305,32 @@ namespace litecore::jni {
286305
// Callbacks
287306
//-------------------------------------------------------------------------
288307

289-
static void statusChangedCallback(C4PeerSync *ignored, C4PeerSyncProtocol protocol, bool started, C4Error error, void *context) {
290-
// TODO: Use protocol
308+
static void statusChangedCallback(C4PeerSync *ignored, C4PeerSyncProtocol protocol,
309+
bool started, C4Error error, void *context) {
291310
JNIEnv *env = nullptr;
292311
jint envState = attachJVM(&env, "p2pStatusChanged");
293312
if ((envState != JNI_OK) && (envState != JNI_EDETACHED))
294313
return;
295314

315+
jobject _status = env->NewObject(
316+
cls_C4PeerSyncStatus,
317+
m_C4PeerSyncStatus_init,
318+
(jint) protocol,
319+
started ? JNI_TRUE : JNI_FALSE,
320+
(jint) error.domain,
321+
(jint) error.code);
322+
296323
env->CallStaticVoidMethod(
297324
cls_C4MultipeerReplicator,
298325
m_C4MultipeerReplicator_onSyncStatusChanged,
299326
(jlong) context,
300-
started ? JNI_TRUE : JNI_FALSE,
301-
(jint) error.domain,
302-
(jlong) error.code);
327+
_status);
303328

304-
if (envState == JNI_EDETACHED)
329+
if (envState == JNI_EDETACHED) {
305330
detachJVM("p2pStatusChanged");
331+
} else {
332+
if (_status != nullptr) env->DeleteLocalRef(_status);
333+
}
306334
}
307335

308336
static bool authenticateCallback(C4PeerSync *ignored, const C4PeerID *peerId, C4Cert *certChain, void *context) {
@@ -651,6 +679,32 @@ JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_g
651679
return toJByteArray(env, peerId.bytes, 32);
652680
}
653681

682+
/*
683+
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
684+
* Method: getStatus
685+
* Signature: (JI)Lcom/couchbase/lite/internal/core/C4PeerSyncStatus;
686+
*/
687+
JNIEXPORT jobject
688+
JNICALL Java_com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator_getStatus(
689+
JNIEnv *env,
690+
jclass clazz,
691+
jlong peer,
692+
jint protocol) {
693+
C4Error error{};
694+
C4PeerSyncStatus status = c4peersync_getStatus((C4PeerSync *) peer, protocol, &error);
695+
if (error.code > 0) {
696+
throwError(env, error);
697+
return nullptr;
698+
}
699+
return env->NewObject(
700+
cls_C4PeerSyncStatus,
701+
m_C4PeerSyncStatus_init,
702+
(jint) protocol,
703+
status.online ? JNI_TRUE : JNI_FALSE,
704+
(jint) status.error.domain,
705+
(jint) status.error.code);
706+
}
707+
654708
/*
655709
* Class: com_couchbase_lite_internal_core_impl_NativeC4MultipeerReplicator
656710
* Method: stop

common/main/java/com/couchbase/lite/internal/core/C4Constants.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ private WebSocketError() { }
323323
// c4PeerSyncTypes.h
324324
////////////////////////////////////
325325
public static final class PeerSyncProtocols {
326-
public static final int DNS_SD = 0x01;
327-
public static final int BLUETOOTH_LE = 0x02;
326+
public static final int NONE = 0x00; // No protocol, or aggregate of all protocols
327+
public static final int DNS_SD = 0x01; // DNS-SD ("Bonjour") protocol with TCP sockets.
328+
public static final int BLUETOOTH_LE = 0x02; // Bluetooth LE protocol with L2CAP sockets.
328329
}
329330
}

0 commit comments

Comments
 (0)