@@ -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
0 commit comments