Skip to main content

ri/java/classes/
protocol.rs

1//! Copyright © 2025-2026 Wenze Wei. All Rights Reserved.
2//!
3//! This file is part of Ri.
4//! The Ri project belongs to the Dunimd Team.
5//!
6//! Licensed under the Apache License, Version 2.0 (the "License");
7//! You may not use this file except in compliance with the License.
8//! You may obtain a copy of the License at
9//!
10//!     http://www.apache.org/licenses/LICENSE-2.0
11//!
12//! Unless required by applicable law or agreed to in writing, software
13//! distributed under the License is distributed on an "AS IS" BASIS,
14//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15//! See the License for the specific language governing permissions and
16//! limitations under the License.
17
18//! # Protocol Module JNI Bindings
19//!
20//! JNI bindings for Ri protocol classes.
21
22use jni::JNIEnv;
23use jni::objects::{JClass, JString};
24use jni::sys::{jlong, jboolean, jint, jdouble, jbyteArray, jstring};
25use crate::protocol::{
26    RiProtocolManager, RiProtocolConfig, RiProtocolType,
27    RiProtocolStats, RiConnectionStats,
28    RiFrame, RiFrameHeader, RiFrameType, RiConnectionInfo, RiMessageFlags,
29    RiSecurityLevel, RiFrameParser, RiFrameBuilder,
30};
31use crate::java::exception::check_not_null;
32
33// =============================================================================
34// RiProtocolManager JNI Bindings
35// =============================================================================
36
37#[no_mangle]
38pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolManager_new0(
39    _env: JNIEnv,
40    _class: JClass,
41) -> jlong {
42    let manager = Box::new(RiProtocolManager::new());
43    Box::into_raw(manager) as jlong
44}
45
46#[no_mangle]
47pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolManager_free0(
48    _env: JNIEnv,
49    _class: JClass,
50    ptr: jlong,
51) {
52    if ptr != 0 {
53        unsafe {
54            let _ = Box::from_raw(ptr as *mut RiProtocolManager);
55        }
56    }
57}
58
59// =============================================================================
60// RiProtocolConfig JNI Bindings
61// =============================================================================
62
63#[no_mangle]
64pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_new0(
65    _env: JNIEnv,
66    _class: JClass,
67) -> jlong {
68    let config = Box::new(RiProtocolConfig::default());
69    Box::into_raw(config) as jlong
70}
71
72#[no_mangle]
73pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_getDefaultProtocol0(
74    mut env: JNIEnv,
75    _class: JClass,
76    ptr: jlong,
77) -> jint {
78    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
79        return 0;
80    }
81    
82    let config = unsafe { &*(ptr as *const RiProtocolConfig) };
83    config.default_protocol as jint
84}
85
86#[no_mangle]
87pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_setDefaultProtocol0(
88    mut env: JNIEnv,
89    _class: JClass,
90    ptr: jlong,
91    protocol_type: jint,
92) {
93    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
94        return;
95    }
96    
97    let config = unsafe { &mut *(ptr as *mut RiProtocolConfig) };
98    config.default_protocol = match protocol_type {
99        0 => RiProtocolType::Global,
100        _ => RiProtocolType::Private,
101    };
102}
103
104#[no_mangle]
105pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_isSecurityEnabled0(
106    mut env: JNIEnv,
107    _class: JClass,
108    ptr: jlong,
109) -> jboolean {
110    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
111        return 0;
112    }
113    
114    let config = unsafe { &*(ptr as *const RiProtocolConfig) };
115    config.security_enabled as jboolean
116}
117
118#[no_mangle]
119pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_setSecurityEnabled0(
120    mut env: JNIEnv,
121    _class: JClass,
122    ptr: jlong,
123    enabled: jboolean,
124) {
125    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
126        return;
127    }
128    
129    let config = unsafe { &mut *(ptr as *mut RiProtocolConfig) };
130    config.security_enabled = enabled != 0;
131}
132
133#[no_mangle]
134pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_getSecurityLevel0(
135    mut env: JNIEnv,
136    _class: JClass,
137    ptr: jlong,
138) -> jint {
139    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
140        return 0;
141    }
142    
143    let config = unsafe { &*(ptr as *const RiProtocolConfig) };
144    config.security_level as jint
145}
146
147#[no_mangle]
148pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_setSecurityLevel0(
149    mut env: JNIEnv,
150    _class: JClass,
151    ptr: jlong,
152    level: jint,
153) {
154    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
155        return;
156    }
157    
158    let config = unsafe { &mut *(ptr as *mut RiProtocolConfig) };
159    config.security_level = match level {
160        0 => RiSecurityLevel::None,
161        1 => RiSecurityLevel::Standard,
162        2 => RiSecurityLevel::High,
163        _ => RiSecurityLevel::Military,
164    };
165}
166
167#[no_mangle]
168pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_isStateSyncEnabled0(
169    mut env: JNIEnv,
170    _class: JClass,
171    ptr: jlong,
172) -> jboolean {
173    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
174        return 0;
175    }
176    
177    let config = unsafe { &*(ptr as *const RiProtocolConfig) };
178    config.state_sync_enabled as jboolean
179}
180
181#[no_mangle]
182pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_setStateSyncEnabled0(
183    mut env: JNIEnv,
184    _class: JClass,
185    ptr: jlong,
186    enabled: jboolean,
187) {
188    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
189        return;
190    }
191    
192    let config = unsafe { &mut *(ptr as *mut RiProtocolConfig) };
193    config.state_sync_enabled = enabled != 0;
194}
195
196#[no_mangle]
197pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_isPerformanceOptimization0(
198    mut env: JNIEnv,
199    _class: JClass,
200    ptr: jlong,
201) -> jboolean {
202    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
203        return 0;
204    }
205    
206    let config = unsafe { &*(ptr as *const RiProtocolConfig) };
207    config.performance_optimization as jboolean
208}
209
210#[no_mangle]
211pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_setPerformanceOptimization0(
212    mut env: JNIEnv,
213    _class: JClass,
214    ptr: jlong,
215    enabled: jboolean,
216) {
217    if !check_not_null(&mut env, ptr, "RiProtocolConfig") {
218        return;
219    }
220    
221    let config = unsafe { &mut *(ptr as *mut RiProtocolConfig) };
222    config.performance_optimization = enabled != 0;
223}
224
225#[no_mangle]
226pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolConfig_free0(
227    _env: JNIEnv,
228    _class: JClass,
229    ptr: jlong,
230) {
231    if ptr != 0 {
232        unsafe {
233            let _ = Box::from_raw(ptr as *mut RiProtocolConfig);
234        }
235    }
236}
237
238// =============================================================================
239// RiProtocolStats JNI Bindings
240// =============================================================================
241
242#[no_mangle]
243pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_getMessagesSent0(
244    mut env: JNIEnv,
245    _class: JClass,
246    ptr: jlong,
247) -> jlong {
248    if !check_not_null(&mut env, ptr, "RiProtocolStats") {
249        return 0;
250    }
251    
252    let stats = unsafe { &*(ptr as *const RiProtocolStats) };
253    stats.messages_sent as jlong
254}
255
256#[no_mangle]
257pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_getMessagesReceived0(
258    mut env: JNIEnv,
259    _class: JClass,
260    ptr: jlong,
261) -> jlong {
262    if !check_not_null(&mut env, ptr, "RiProtocolStats") {
263        return 0;
264    }
265    
266    let stats = unsafe { &*(ptr as *const RiProtocolStats) };
267    stats.messages_received as jlong
268}
269
270#[no_mangle]
271pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_getBytesSent0(
272    mut env: JNIEnv,
273    _class: JClass,
274    ptr: jlong,
275) -> jlong {
276    if !check_not_null(&mut env, ptr, "RiProtocolStats") {
277        return 0;
278    }
279    
280    let stats = unsafe { &*(ptr as *const RiProtocolStats) };
281    stats.bytes_sent as jlong
282}
283
284#[no_mangle]
285pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_getBytesReceived0(
286    mut env: JNIEnv,
287    _class: JClass,
288    ptr: jlong,
289) -> jlong {
290    if !check_not_null(&mut env, ptr, "RiProtocolStats") {
291        return 0;
292    }
293    
294    let stats = unsafe { &*(ptr as *const RiProtocolStats) };
295    stats.bytes_received as jlong
296}
297
298#[no_mangle]
299pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_getErrors0(
300    mut env: JNIEnv,
301    _class: JClass,
302    ptr: jlong,
303) -> jlong {
304    if !check_not_null(&mut env, ptr, "RiProtocolStats") {
305        return 0;
306    }
307    
308    let stats = unsafe { &*(ptr as *const RiProtocolStats) };
309    stats.errors as jlong
310}
311
312#[no_mangle]
313pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_getAvgLatencyMs0(
314    mut env: JNIEnv,
315    _class: JClass,
316    ptr: jlong,
317) -> jdouble {
318    if !check_not_null(&mut env, ptr, "RiProtocolStats") {
319        return 0.0;
320    }
321    
322    let stats = unsafe { &*(ptr as *const RiProtocolStats) };
323    stats.avg_latency_ms
324}
325
326#[no_mangle]
327pub extern "system" fn Java_com_dunimd_ri_protocol_RiProtocolStats_free0(
328    _env: JNIEnv,
329    _class: JClass,
330    ptr: jlong,
331) {
332    if ptr != 0 {
333        unsafe {
334            let _ = Box::from_raw(ptr as *mut RiProtocolStats);
335        }
336    }
337}
338
339// =============================================================================
340// RiConnectionStats JNI Bindings
341// =============================================================================
342
343#[no_mangle]
344pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionStats_getTotalConnections0(
345    mut env: JNIEnv,
346    _class: JClass,
347    ptr: jlong,
348) -> jlong {
349    if !check_not_null(&mut env, ptr, "RiConnectionStats") {
350        return 0;
351    }
352    
353    let stats = unsafe { &*(ptr as *const RiConnectionStats) };
354    stats.total_connections as jlong
355}
356
357#[no_mangle]
358pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionStats_getActiveConnections0(
359    mut env: JNIEnv,
360    _class: JClass,
361    ptr: jlong,
362) -> jlong {
363    if !check_not_null(&mut env, ptr, "RiConnectionStats") {
364        return 0;
365    }
366    
367    let stats = unsafe { &*(ptr as *const RiConnectionStats) };
368    stats.active_connections as jlong
369}
370
371#[no_mangle]
372pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionStats_getBytesSent0(
373    mut env: JNIEnv,
374    _class: JClass,
375    ptr: jlong,
376) -> jlong {
377    if !check_not_null(&mut env, ptr, "RiConnectionStats") {
378        return 0;
379    }
380    
381    let stats = unsafe { &*(ptr as *const RiConnectionStats) };
382    stats.bytes_sent as jlong
383}
384
385#[no_mangle]
386pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionStats_getBytesReceived0(
387    mut env: JNIEnv,
388    _class: JClass,
389    ptr: jlong,
390) -> jlong {
391    if !check_not_null(&mut env, ptr, "RiConnectionStats") {
392        return 0;
393    }
394    
395    let stats = unsafe { &*(ptr as *const RiConnectionStats) };
396    stats.bytes_received as jlong
397}
398
399#[no_mangle]
400pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionStats_getConnectionDurationSecs0(
401    mut env: JNIEnv,
402    _class: JClass,
403    ptr: jlong,
404) -> jlong {
405    if !check_not_null(&mut env, ptr, "RiConnectionStats") {
406        return 0;
407    }
408    
409    let stats = unsafe { &*(ptr as *const RiConnectionStats) };
410    stats.connection_duration_secs as jlong
411}
412
413#[no_mangle]
414pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionStats_free0(
415    _env: JNIEnv,
416    _class: JClass,
417    ptr: jlong,
418) {
419    if ptr != 0 {
420        unsafe {
421            let _ = Box::from_raw(ptr as *mut RiConnectionStats);
422        }
423    }
424}
425
426// =============================================================================
427// RiMessageFlags JNI Bindings
428// =============================================================================
429
430#[no_mangle]
431pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_new0(
432    _env: JNIEnv,
433    _class: JClass,
434) -> jlong {
435    let flags = Box::new(RiMessageFlags::default());
436    Box::into_raw(flags) as jlong
437}
438
439#[no_mangle]
440pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_isCompressed0(
441    mut env: JNIEnv,
442    _class: JClass,
443    ptr: jlong,
444) -> jboolean {
445    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
446        return 0;
447    }
448    
449    let flags = unsafe { &*(ptr as *const RiMessageFlags) };
450    flags.compressed as jboolean
451}
452
453#[no_mangle]
454pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_setCompressed0(
455    mut env: JNIEnv,
456    _class: JClass,
457    ptr: jlong,
458    compressed: jboolean,
459) {
460    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
461        return;
462    }
463    
464    let flags = unsafe { &mut *(ptr as *mut RiMessageFlags) };
465    flags.compressed = compressed != 0;
466}
467
468#[no_mangle]
469pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_isEncrypted0(
470    mut env: JNIEnv,
471    _class: JClass,
472    ptr: jlong,
473) -> jboolean {
474    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
475        return 0;
476    }
477    
478    let flags = unsafe { &*(ptr as *const RiMessageFlags) };
479    flags.encrypted as jboolean
480}
481
482#[no_mangle]
483pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_setEncrypted0(
484    mut env: JNIEnv,
485    _class: JClass,
486    ptr: jlong,
487    encrypted: jboolean,
488) {
489    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
490        return;
491    }
492    
493    let flags = unsafe { &mut *(ptr as *mut RiMessageFlags) };
494    flags.encrypted = encrypted != 0;
495}
496
497#[no_mangle]
498pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_isRequiresAck0(
499    mut env: JNIEnv,
500    _class: JClass,
501    ptr: jlong,
502) -> jboolean {
503    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
504        return 0;
505    }
506    
507    let flags = unsafe { &*(ptr as *const RiMessageFlags) };
508    flags.requires_ack as jboolean
509}
510
511#[no_mangle]
512pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_setRequiresAck0(
513    mut env: JNIEnv,
514    _class: JClass,
515    ptr: jlong,
516    requires_ack: jboolean,
517) {
518    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
519        return;
520    }
521    
522    let flags = unsafe { &mut *(ptr as *mut RiMessageFlags) };
523    flags.requires_ack = requires_ack != 0;
524}
525
526#[no_mangle]
527pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_isPriority0(
528    mut env: JNIEnv,
529    _class: JClass,
530    ptr: jlong,
531) -> jboolean {
532    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
533        return 0;
534    }
535    
536    let flags = unsafe { &*(ptr as *const RiMessageFlags) };
537    flags.priority as jboolean
538}
539
540#[no_mangle]
541pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_setPriority0(
542    mut env: JNIEnv,
543    _class: JClass,
544    ptr: jlong,
545    priority: jboolean,
546) {
547    if !check_not_null(&mut env, ptr, "RiMessageFlags") {
548        return;
549    }
550    
551    let flags = unsafe { &mut *(ptr as *mut RiMessageFlags) };
552    flags.priority = priority != 0;
553}
554
555#[no_mangle]
556pub extern "system" fn Java_com_dunimd_ri_protocol_RiMessageFlags_free0(
557    _env: JNIEnv,
558    _class: JClass,
559    ptr: jlong,
560) {
561    if ptr != 0 {
562        unsafe {
563            let _ = Box::from_raw(ptr as *mut RiMessageFlags);
564        }
565    }
566}
567
568// =============================================================================
569// RiConnectionInfo JNI Bindings
570// =============================================================================
571
572#[no_mangle]
573pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getConnectionId0<'local>(
574    mut env: JNIEnv<'local>,
575    _class: JClass<'local>,
576    ptr: jlong,
577) -> jstring {
578    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
579        return std::ptr::null_mut();
580    }
581    
582    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
583    match env.new_string(&info.connection_id) {
584        Ok(s) => s.into_raw(),
585        Err(_) => std::ptr::null_mut(),
586    }
587}
588
589#[no_mangle]
590pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getDeviceId0<'local>(
591    mut env: JNIEnv<'local>,
592    _class: JClass<'local>,
593    ptr: jlong,
594) -> jstring {
595    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
596        return std::ptr::null_mut();
597    }
598    
599    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
600    match env.new_string(&info.device_id) {
601        Ok(s) => s.into_raw(),
602        Err(_) => std::ptr::null_mut(),
603    }
604}
605
606#[no_mangle]
607pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getAddress0<'local>(
608    mut env: JNIEnv<'local>,
609    _class: JClass<'local>,
610    ptr: jlong,
611) -> jstring {
612    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
613        return std::ptr::null_mut();
614    }
615    
616    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
617    match env.new_string(&info.address) {
618        Ok(s) => s.into_raw(),
619        Err(_) => std::ptr::null_mut(),
620    }
621}
622
623#[no_mangle]
624pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getProtocolType0(
625    mut env: JNIEnv,
626    _class: JClass,
627    ptr: jlong,
628) -> jint {
629    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
630        return 0;
631    }
632    
633    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
634    info.protocol_type as jint
635}
636
637#[no_mangle]
638pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getState0(
639    mut env: JNIEnv,
640    _class: JClass,
641    ptr: jlong,
642) -> jint {
643    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
644        return 0;
645    }
646    
647    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
648    info.state as jint
649}
650
651#[no_mangle]
652pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getSecurityLevel0(
653    mut env: JNIEnv,
654    _class: JClass,
655    ptr: jlong,
656) -> jint {
657    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
658        return 0;
659    }
660    
661    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
662    info.security_level as jint
663}
664
665#[no_mangle]
666pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getConnectedAt0(
667    mut env: JNIEnv,
668    _class: JClass,
669    ptr: jlong,
670) -> jlong {
671    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
672        return 0;
673    }
674    
675    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
676    info.connected_at as jlong
677}
678
679#[no_mangle]
680pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getLastActivity0(
681    mut env: JNIEnv,
682    _class: JClass,
683    ptr: jlong,
684) -> jlong {
685    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
686        return 0;
687    }
688    
689    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
690    info.last_activity as jlong
691}
692
693#[no_mangle]
694pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_free0(
695    _env: JNIEnv,
696    _class: JClass,
697    ptr: jlong,
698) {
699    if ptr != 0 {
700        unsafe {
701            let _ = Box::from_raw(ptr as *mut RiConnectionInfo);
702        }
703    }
704}
705
706// =============================================================================
707// RiFrameHeader JNI Bindings
708// =============================================================================
709
710#[no_mangle]
711pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_new0(
712    _env: JNIEnv,
713    _class: JClass,
714) -> jlong {
715    let header = Box::new(RiFrameHeader::default());
716    Box::into_raw(header) as jlong
717}
718
719#[no_mangle]
720pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getVersion0(
721    mut env: JNIEnv,
722    _class: JClass,
723    ptr: jlong,
724) -> jint {
725    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
726        return 0;
727    }
728    
729    let header = unsafe { &*(ptr as *const RiFrameHeader) };
730    header.version as jint
731}
732
733#[no_mangle]
734pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_setVersion0(
735    mut env: JNIEnv,
736    _class: JClass,
737    ptr: jlong,
738    version: jint,
739) {
740    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
741        return;
742    }
743    
744    let header = unsafe { &mut *(ptr as *mut RiFrameHeader) };
745    header.version = version as u8;
746}
747
748#[no_mangle]
749pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getFrameType0(
750    mut env: JNIEnv,
751    _class: JClass,
752    ptr: jlong,
753) -> jint {
754    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
755        return 0;
756    }
757    
758    let header = unsafe { &*(ptr as *const RiFrameHeader) };
759    header.frame_type as jint
760}
761
762#[no_mangle]
763pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_setFrameType0(
764    mut env: JNIEnv,
765    _class: JClass,
766    ptr: jlong,
767    frame_type: jint,
768) {
769    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
770        return;
771    }
772    
773    let header = unsafe { &mut *(ptr as *mut RiFrameHeader) };
774    header.frame_type = match frame_type {
775        0 => RiFrameType::Data,
776        1 => RiFrameType::Control,
777        2 => RiFrameType::Heartbeat,
778        3 => RiFrameType::Ack,
779        _ => RiFrameType::Error,
780    };
781}
782
783#[no_mangle]
784pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getSequenceNumber0(
785    mut env: JNIEnv,
786    _class: JClass,
787    ptr: jlong,
788) -> jlong {
789    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
790        return 0;
791    }
792    
793    let header = unsafe { &*(ptr as *const RiFrameHeader) };
794    header.sequence_number as jlong
795}
796
797#[no_mangle]
798pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_setSequenceNumber0(
799    mut env: JNIEnv,
800    _class: JClass,
801    ptr: jlong,
802    sequence_number: jlong,
803) {
804    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
805        return;
806    }
807    
808    let header = unsafe { &mut *(ptr as *mut RiFrameHeader) };
809    header.sequence_number = sequence_number as u64;
810}
811
812#[no_mangle]
813pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getLength0(
814    mut env: JNIEnv,
815    _class: JClass,
816    ptr: jlong,
817) -> jint {
818    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
819        return 0;
820    }
821    
822    let header = unsafe { &*(ptr as *const RiFrameHeader) };
823    header.length as jint
824}
825
826#[no_mangle]
827pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getTimestamp0(
828    mut env: JNIEnv,
829    _class: JClass,
830    ptr: jlong,
831) -> jlong {
832    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
833        return 0;
834    }
835    
836    let header = unsafe { &*(ptr as *const RiFrameHeader) };
837    header.timestamp as jlong
838}
839
840#[no_mangle]
841pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getFlags0(
842    mut env: JNIEnv,
843    _class: JClass,
844    ptr: jlong,
845) -> jint {
846    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
847        return 0;
848    }
849    
850    let header = unsafe { &*(ptr as *const RiFrameHeader) };
851    header.flags as jint
852}
853
854#[no_mangle]
855pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_free0(
856    _env: JNIEnv,
857    _class: JClass,
858    ptr: jlong,
859) {
860    if ptr != 0 {
861        unsafe {
862            let _ = Box::from_raw(ptr as *mut RiFrameHeader);
863        }
864    }
865}
866
867// =============================================================================
868// RiFrame JNI Bindings
869// =============================================================================
870
871#[no_mangle]
872pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_new0(
873    _env: JNIEnv,
874    _class: JClass,
875) -> jlong {
876    let frame = Box::new(RiFrame::default());
877    Box::into_raw(frame) as jlong
878}
879
880#[no_mangle]
881pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getHeader0(
882    mut env: JNIEnv,
883    _class: JClass,
884    ptr: jlong,
885) -> jlong {
886    if !check_not_null(&mut env, ptr, "RiFrame") {
887        return 0;
888    }
889    
890    let frame = unsafe { &*(ptr as *const RiFrame) };
891    let header = Box::new(frame.header.clone());
892    Box::into_raw(header) as jlong
893}
894
895#[no_mangle]
896pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getPayload0(
897    mut env: JNIEnv,
898    _class: JClass,
899    ptr: jlong,
900) -> jbyteArray {
901    if !check_not_null(&mut env, ptr, "RiFrame") {
902        return std::ptr::null_mut();
903    }
904    
905    let frame = unsafe { &*(ptr as *const RiFrame) };
906    let payload = &frame.payload;
907    
908    let array = match env.new_byte_array(payload.len() as i32) {
909        Ok(a) => a,
910        Err(_) => return std::ptr::null_mut(),
911    };
912    let _ = env.set_byte_array_region(&array, 0, unsafe { 
913        std::slice::from_raw_parts(payload.as_ptr() as *const i8, payload.len()) 
914    });
915    array.into_raw()
916}
917
918#[no_mangle]
919pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_setPayload0(
920    mut env: JNIEnv,
921    _class: JClass,
922    ptr: jlong,
923    payload: jbyteArray,
924) {
925    if !check_not_null(&mut env, ptr, "RiFrame") {
926        return;
927    }
928    
929    let payload_vec: Vec<u8> = if !payload.is_null() {
930        env.convert_byte_array(payload).unwrap_or_default()
931    } else {
932        Vec::new()
933    };
934    
935    let frame = unsafe { &mut *(ptr as *mut RiFrame) };
936    frame.payload = payload_vec;
937}
938
939#[no_mangle]
940pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getSourceId0<'local>(
941    mut env: JNIEnv<'local>,
942    _class: JClass<'local>,
943    ptr: jlong,
944) -> jstring {
945    if !check_not_null(&mut env, ptr, "RiFrame") {
946        return std::ptr::null_mut();
947    }
948    
949    let frame = unsafe { &*(ptr as *const RiFrame) };
950    match env.new_string(&frame.source_id) {
951        Ok(s) => s.into_raw(),
952        Err(_) => std::ptr::null_mut(),
953    }
954}
955
956#[no_mangle]
957pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_setSourceId0(
958    mut env: JNIEnv,
959    _class: JClass,
960    ptr: jlong,
961    source_id: JString,
962) {
963    if !check_not_null(&mut env, ptr, "RiFrame") {
964        return;
965    }
966    
967    let source_id_str: String = match env.get_string(&source_id) {
968        Ok(s) => s.into(),
969        Err(_) => {
970            crate::java::exception::throw_ri_error(&mut env, "Invalid source_id");
971            return;
972        }
973    };
974    
975    let frame = unsafe { &mut *(ptr as *mut RiFrame) };
976    frame.source_id = source_id_str;
977}
978
979#[no_mangle]
980pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getTargetId0<'local>(
981    mut env: JNIEnv<'local>,
982    _class: JClass<'local>,
983    ptr: jlong,
984) -> jstring {
985    if !check_not_null(&mut env, ptr, "RiFrame") {
986        return std::ptr::null_mut();
987    }
988    
989    let frame = unsafe { &*(ptr as *const RiFrame) };
990    match env.new_string(&frame.target_id) {
991        Ok(s) => s.into_raw(),
992        Err(_) => std::ptr::null_mut(),
993    }
994}
995
996#[no_mangle]
997pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_setTargetId0(
998    mut env: JNIEnv,
999    _class: JClass,
1000    ptr: jlong,
1001    target_id: JString,
1002) {
1003    if !check_not_null(&mut env, ptr, "RiFrame") {
1004        return;
1005    }
1006    
1007    let target_id_str: String = match env.get_string(&target_id) {
1008        Ok(s) => s.into(),
1009        Err(_) => {
1010            crate::java::exception::throw_ri_error(&mut env, "Invalid target_id");
1011            return;
1012        }
1013    };
1014    
1015    let frame = unsafe { &mut *(ptr as *mut RiFrame) };
1016    frame.target_id = target_id_str;
1017}
1018
1019#[no_mangle]
1020pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_toBytes0(
1021    mut env: JNIEnv,
1022    _class: JClass,
1023    ptr: jlong,
1024) -> jbyteArray {
1025    if !check_not_null(&mut env, ptr, "RiFrame") {
1026        return std::ptr::null_mut();
1027    }
1028    
1029    let frame = unsafe { &*(ptr as *const RiFrame) };
1030    let bytes = frame.to_bytes();
1031    
1032    let array = match env.new_byte_array(bytes.len() as i32) {
1033        Ok(a) => a,
1034        Err(_) => return std::ptr::null_mut(),
1035    };
1036    let _ = env.set_byte_array_region(&array, 0, unsafe { 
1037        std::slice::from_raw_parts(bytes.as_ptr() as *const i8, bytes.len()) 
1038    });
1039    array.into_raw()
1040}
1041
1042#[no_mangle]
1043pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_free0(
1044    _env: JNIEnv,
1045    _class: JClass,
1046    ptr: jlong,
1047) {
1048    if ptr != 0 {
1049        unsafe {
1050            let _ = Box::from_raw(ptr as *mut RiFrame);
1051        }
1052    }
1053}
1054
1055// =============================================================================
1056// RiFrameParser JNI Bindings
1057// =============================================================================
1058
1059#[no_mangle]
1060pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameParser_new0(
1061    _env: JNIEnv,
1062    _class: JClass,
1063) -> jlong {
1064    let parser = Box::new(RiFrameParser::new());
1065    Box::into_raw(parser) as jlong
1066}
1067
1068#[no_mangle]
1069pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameParser_parse0(
1070    mut env: JNIEnv,
1071    _class: JClass,
1072    ptr: jlong,
1073    data: jbyteArray,
1074) -> jlong {
1075    if !check_not_null(&mut env, ptr, "RiFrameParser") {
1076        return 0;
1077    }
1078    
1079    let data_vec: Vec<u8> = if !data.is_null() {
1080        env.convert_byte_array(data).unwrap_or_default()
1081    } else {
1082        Vec::new()
1083    };
1084    
1085    let parser = unsafe { &*(ptr as *const RiFrameParser) };
1086    match parser.parse(&data_vec) {
1087        Some(frame) => {
1088            let frame = Box::new(frame);
1089            Box::into_raw(frame) as jlong
1090        }
1091        None => 0,
1092    }
1093}
1094
1095#[no_mangle]
1096pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameParser_free0(
1097    _env: JNIEnv,
1098    _class: JClass,
1099    ptr: jlong,
1100) {
1101    if ptr != 0 {
1102        unsafe {
1103            let _ = Box::from_raw(ptr as *mut RiFrameParser);
1104        }
1105    }
1106}
1107
1108// =============================================================================
1109// RiFrameBuilder JNI Bindings
1110// =============================================================================
1111
1112#[no_mangle]
1113pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_new0(
1114    _env: JNIEnv,
1115    _class: JClass,
1116) -> jlong {
1117    let builder = Box::new(RiFrameBuilder::new());
1118    Box::into_raw(builder) as jlong
1119}
1120
1121#[no_mangle]
1122pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setFrameType0(
1123    mut env: JNIEnv,
1124    _class: JClass,
1125    ptr: jlong,
1126    frame_type: jint,
1127) {
1128    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1129        return;
1130    }
1131    
1132    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1133    builder.frame_type = match frame_type {
1134        0 => RiFrameType::Data,
1135        1 => RiFrameType::Control,
1136        2 => RiFrameType::Heartbeat,
1137        3 => RiFrameType::Ack,
1138        _ => RiFrameType::Error,
1139    };
1140}
1141
1142#[no_mangle]
1143pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setSequenceNumber0(
1144    mut env: JNIEnv,
1145    _class: JClass,
1146    ptr: jlong,
1147    sequence_number: jlong,
1148) {
1149    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1150        return;
1151    }
1152    
1153    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1154    builder.sequence_number = sequence_number as u64;
1155}
1156
1157#[no_mangle]
1158pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setSourceId0(
1159    mut env: JNIEnv,
1160    _class: JClass,
1161    ptr: jlong,
1162    source_id: JString,
1163) {
1164    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1165        return;
1166    }
1167    
1168    let source_id_str: String = match env.get_string(&source_id) {
1169        Ok(s) => s.into(),
1170        Err(_) => {
1171            crate::java::exception::throw_ri_error(&mut env, "Invalid source_id");
1172            return;
1173        }
1174    };
1175    
1176    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1177    builder.source_id = source_id_str;
1178}
1179
1180#[no_mangle]
1181pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setTargetId0(
1182    mut env: JNIEnv,
1183    _class: JClass,
1184    ptr: jlong,
1185    target_id: JString,
1186) {
1187    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1188        return;
1189    }
1190    
1191    let target_id_str: String = match env.get_string(&target_id) {
1192        Ok(s) => s.into(),
1193        Err(_) => {
1194            crate::java::exception::throw_ri_error(&mut env, "Invalid target_id");
1195            return;
1196        }
1197    };
1198    
1199    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1200    builder.target_id = target_id_str;
1201}
1202
1203#[no_mangle]
1204pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_buildDataFrame0(
1205    mut env: JNIEnv,
1206    _class: JClass,
1207    ptr: jlong,
1208    payload: jbyteArray,
1209) -> jlong {
1210    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1211        return 0;
1212    }
1213    
1214    let payload_vec: Vec<u8> = if !payload.is_null() {
1215        env.convert_byte_array(payload).unwrap_or_default()
1216    } else {
1217        Vec::new()
1218    };
1219    
1220    let builder = unsafe { &*(ptr as *const RiFrameBuilder) };
1221    let frame = Box::new(builder.build_data_frame(payload_vec));
1222    Box::into_raw(frame) as jlong
1223}
1224
1225#[no_mangle]
1226pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_buildHeartbeatFrame0(
1227    mut env: JNIEnv,
1228    _class: JClass,
1229    ptr: jlong,
1230) -> jlong {
1231    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1232        return 0;
1233    }
1234    
1235    let builder = unsafe { &*(ptr as *const RiFrameBuilder) };
1236    let frame = Box::new(builder.build_heartbeat_frame());
1237    Box::into_raw(frame) as jlong
1238}
1239
1240#[no_mangle]
1241pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_buildAckFrame0(
1242    mut env: JNIEnv,
1243    _class: JClass,
1244    ptr: jlong,
1245    sequence_number: jlong,
1246) -> jlong {
1247    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1248        return 0;
1249    }
1250    
1251    let builder = unsafe { &*(ptr as *const RiFrameBuilder) };
1252    let frame = Box::new(builder.build_ack_frame(sequence_number as u64));
1253    Box::into_raw(frame) as jlong
1254}
1255
1256#[no_mangle]
1257pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_free0(
1258    _env: JNIEnv,
1259    _class: JClass,
1260    ptr: jlong,
1261) {
1262    if ptr != 0 {
1263        unsafe {
1264            let _ = Box::from_raw(ptr as *mut RiFrameBuilder);
1265        }
1266    }
1267}