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    env.new_string(&info.connection_id).unwrap().into_raw()
584}
585
586#[no_mangle]
587pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getDeviceId0<'local>(
588    mut env: JNIEnv<'local>,
589    _class: JClass<'local>,
590    ptr: jlong,
591) -> jstring {
592    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
593        return std::ptr::null_mut();
594    }
595    
596    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
597    env.new_string(&info.device_id).unwrap().into_raw()
598}
599
600#[no_mangle]
601pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getAddress0<'local>(
602    mut env: JNIEnv<'local>,
603    _class: JClass<'local>,
604    ptr: jlong,
605) -> jstring {
606    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
607        return std::ptr::null_mut();
608    }
609    
610    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
611    env.new_string(&info.address).unwrap().into_raw()
612}
613
614#[no_mangle]
615pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getProtocolType0(
616    mut env: JNIEnv,
617    _class: JClass,
618    ptr: jlong,
619) -> jint {
620    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
621        return 0;
622    }
623    
624    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
625    info.protocol_type as jint
626}
627
628#[no_mangle]
629pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getState0(
630    mut env: JNIEnv,
631    _class: JClass,
632    ptr: jlong,
633) -> jint {
634    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
635        return 0;
636    }
637    
638    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
639    info.state as jint
640}
641
642#[no_mangle]
643pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getSecurityLevel0(
644    mut env: JNIEnv,
645    _class: JClass,
646    ptr: jlong,
647) -> jint {
648    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
649        return 0;
650    }
651    
652    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
653    info.security_level as jint
654}
655
656#[no_mangle]
657pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getConnectedAt0(
658    mut env: JNIEnv,
659    _class: JClass,
660    ptr: jlong,
661) -> jlong {
662    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
663        return 0;
664    }
665    
666    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
667    info.connected_at as jlong
668}
669
670#[no_mangle]
671pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_getLastActivity0(
672    mut env: JNIEnv,
673    _class: JClass,
674    ptr: jlong,
675) -> jlong {
676    if !check_not_null(&mut env, ptr, "RiConnectionInfo") {
677        return 0;
678    }
679    
680    let info = unsafe { &*(ptr as *const RiConnectionInfo) };
681    info.last_activity as jlong
682}
683
684#[no_mangle]
685pub extern "system" fn Java_com_dunimd_ri_protocol_RiConnectionInfo_free0(
686    _env: JNIEnv,
687    _class: JClass,
688    ptr: jlong,
689) {
690    if ptr != 0 {
691        unsafe {
692            let _ = Box::from_raw(ptr as *mut RiConnectionInfo);
693        }
694    }
695}
696
697// =============================================================================
698// RiFrameHeader JNI Bindings
699// =============================================================================
700
701#[no_mangle]
702pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_new0(
703    _env: JNIEnv,
704    _class: JClass,
705) -> jlong {
706    let header = Box::new(RiFrameHeader::default());
707    Box::into_raw(header) as jlong
708}
709
710#[no_mangle]
711pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getVersion0(
712    mut env: JNIEnv,
713    _class: JClass,
714    ptr: jlong,
715) -> jint {
716    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
717        return 0;
718    }
719    
720    let header = unsafe { &*(ptr as *const RiFrameHeader) };
721    header.version as jint
722}
723
724#[no_mangle]
725pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_setVersion0(
726    mut env: JNIEnv,
727    _class: JClass,
728    ptr: jlong,
729    version: jint,
730) {
731    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
732        return;
733    }
734    
735    let header = unsafe { &mut *(ptr as *mut RiFrameHeader) };
736    header.version = version as u8;
737}
738
739#[no_mangle]
740pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getFrameType0(
741    mut env: JNIEnv,
742    _class: JClass,
743    ptr: jlong,
744) -> jint {
745    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
746        return 0;
747    }
748    
749    let header = unsafe { &*(ptr as *const RiFrameHeader) };
750    header.frame_type as jint
751}
752
753#[no_mangle]
754pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_setFrameType0(
755    mut env: JNIEnv,
756    _class: JClass,
757    ptr: jlong,
758    frame_type: jint,
759) {
760    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
761        return;
762    }
763    
764    let header = unsafe { &mut *(ptr as *mut RiFrameHeader) };
765    header.frame_type = match frame_type {
766        0 => RiFrameType::Data,
767        1 => RiFrameType::Control,
768        2 => RiFrameType::Heartbeat,
769        3 => RiFrameType::Ack,
770        _ => RiFrameType::Error,
771    };
772}
773
774#[no_mangle]
775pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getSequenceNumber0(
776    mut env: JNIEnv,
777    _class: JClass,
778    ptr: jlong,
779) -> jlong {
780    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
781        return 0;
782    }
783    
784    let header = unsafe { &*(ptr as *const RiFrameHeader) };
785    header.sequence_number as jlong
786}
787
788#[no_mangle]
789pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_setSequenceNumber0(
790    mut env: JNIEnv,
791    _class: JClass,
792    ptr: jlong,
793    sequence_number: jlong,
794) {
795    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
796        return;
797    }
798    
799    let header = unsafe { &mut *(ptr as *mut RiFrameHeader) };
800    header.sequence_number = sequence_number as u64;
801}
802
803#[no_mangle]
804pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getLength0(
805    mut env: JNIEnv,
806    _class: JClass,
807    ptr: jlong,
808) -> jint {
809    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
810        return 0;
811    }
812    
813    let header = unsafe { &*(ptr as *const RiFrameHeader) };
814    header.length as jint
815}
816
817#[no_mangle]
818pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getTimestamp0(
819    mut env: JNIEnv,
820    _class: JClass,
821    ptr: jlong,
822) -> jlong {
823    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
824        return 0;
825    }
826    
827    let header = unsafe { &*(ptr as *const RiFrameHeader) };
828    header.timestamp as jlong
829}
830
831#[no_mangle]
832pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_getFlags0(
833    mut env: JNIEnv,
834    _class: JClass,
835    ptr: jlong,
836) -> jint {
837    if !check_not_null(&mut env, ptr, "RiFrameHeader") {
838        return 0;
839    }
840    
841    let header = unsafe { &*(ptr as *const RiFrameHeader) };
842    header.flags as jint
843}
844
845#[no_mangle]
846pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameHeader_free0(
847    _env: JNIEnv,
848    _class: JClass,
849    ptr: jlong,
850) {
851    if ptr != 0 {
852        unsafe {
853            let _ = Box::from_raw(ptr as *mut RiFrameHeader);
854        }
855    }
856}
857
858// =============================================================================
859// RiFrame JNI Bindings
860// =============================================================================
861
862#[no_mangle]
863pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_new0(
864    _env: JNIEnv,
865    _class: JClass,
866) -> jlong {
867    let frame = Box::new(RiFrame::default());
868    Box::into_raw(frame) as jlong
869}
870
871#[no_mangle]
872pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getHeader0(
873    mut env: JNIEnv,
874    _class: JClass,
875    ptr: jlong,
876) -> jlong {
877    if !check_not_null(&mut env, ptr, "RiFrame") {
878        return 0;
879    }
880    
881    let frame = unsafe { &*(ptr as *const RiFrame) };
882    let header = Box::new(frame.header.clone());
883    Box::into_raw(header) as jlong
884}
885
886#[no_mangle]
887pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getPayload0(
888    mut env: JNIEnv,
889    _class: JClass,
890    ptr: jlong,
891) -> jbyteArray {
892    if !check_not_null(&mut env, ptr, "RiFrame") {
893        return std::ptr::null_mut();
894    }
895    
896    let frame = unsafe { &*(ptr as *const RiFrame) };
897    let payload = &frame.payload;
898    
899    let array = env.new_byte_array(payload.len() as i32).unwrap();
900    env.set_byte_array_region(&array, 0, unsafe { 
901        std::slice::from_raw_parts(payload.as_ptr() as *const i8, payload.len()) 
902    }).unwrap();
903    array.into_raw()
904}
905
906#[no_mangle]
907pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_setPayload0(
908    mut env: JNIEnv,
909    _class: JClass,
910    ptr: jlong,
911    payload: jbyteArray,
912) {
913    if !check_not_null(&mut env, ptr, "RiFrame") {
914        return;
915    }
916    
917    let payload_vec: Vec<u8> = if !payload.is_null() {
918        env.convert_byte_array(payload).unwrap_or_default()
919    } else {
920        Vec::new()
921    };
922    
923    let frame = unsafe { &mut *(ptr as *mut RiFrame) };
924    frame.payload = payload_vec;
925}
926
927#[no_mangle]
928pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getSourceId0<'local>(
929    mut env: JNIEnv<'local>,
930    _class: JClass<'local>,
931    ptr: jlong,
932) -> jstring {
933    if !check_not_null(&mut env, ptr, "RiFrame") {
934        return std::ptr::null_mut();
935    }
936    
937    let frame = unsafe { &*(ptr as *const RiFrame) };
938    env.new_string(&frame.source_id).unwrap().into_raw()
939}
940
941#[no_mangle]
942pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_setSourceId0(
943    mut env: JNIEnv,
944    _class: JClass,
945    ptr: jlong,
946    source_id: JString,
947) {
948    if !check_not_null(&mut env, ptr, "RiFrame") {
949        return;
950    }
951    
952    let source_id_str: String = env.get_string(&source_id)
953        .expect("Failed to get source id")
954        .into();
955    
956    let frame = unsafe { &mut *(ptr as *mut RiFrame) };
957    frame.source_id = source_id_str;
958}
959
960#[no_mangle]
961pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_getTargetId0<'local>(
962    mut env: JNIEnv<'local>,
963    _class: JClass<'local>,
964    ptr: jlong,
965) -> jstring {
966    if !check_not_null(&mut env, ptr, "RiFrame") {
967        return std::ptr::null_mut();
968    }
969    
970    let frame = unsafe { &*(ptr as *const RiFrame) };
971    env.new_string(&frame.target_id).unwrap().into_raw()
972}
973
974#[no_mangle]
975pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_setTargetId0(
976    mut env: JNIEnv,
977    _class: JClass,
978    ptr: jlong,
979    target_id: JString,
980) {
981    if !check_not_null(&mut env, ptr, "RiFrame") {
982        return;
983    }
984    
985    let target_id_str: String = env.get_string(&target_id)
986        .expect("Failed to get target id")
987        .into();
988    
989    let frame = unsafe { &mut *(ptr as *mut RiFrame) };
990    frame.target_id = target_id_str;
991}
992
993#[no_mangle]
994pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_toBytes0(
995    mut env: JNIEnv,
996    _class: JClass,
997    ptr: jlong,
998) -> jbyteArray {
999    if !check_not_null(&mut env, ptr, "RiFrame") {
1000        return std::ptr::null_mut();
1001    }
1002    
1003    let frame = unsafe { &*(ptr as *const RiFrame) };
1004    let bytes = frame.to_bytes();
1005    
1006    let array = env.new_byte_array(bytes.len() as i32).unwrap();
1007    env.set_byte_array_region(&array, 0, unsafe { 
1008        std::slice::from_raw_parts(bytes.as_ptr() as *const i8, bytes.len()) 
1009    }).unwrap();
1010    array.into_raw()
1011}
1012
1013#[no_mangle]
1014pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrame_free0(
1015    _env: JNIEnv,
1016    _class: JClass,
1017    ptr: jlong,
1018) {
1019    if ptr != 0 {
1020        unsafe {
1021            let _ = Box::from_raw(ptr as *mut RiFrame);
1022        }
1023    }
1024}
1025
1026// =============================================================================
1027// RiFrameParser JNI Bindings
1028// =============================================================================
1029
1030#[no_mangle]
1031pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameParser_new0(
1032    _env: JNIEnv,
1033    _class: JClass,
1034) -> jlong {
1035    let parser = Box::new(RiFrameParser::new());
1036    Box::into_raw(parser) as jlong
1037}
1038
1039#[no_mangle]
1040pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameParser_parse0(
1041    mut env: JNIEnv,
1042    _class: JClass,
1043    ptr: jlong,
1044    data: jbyteArray,
1045) -> jlong {
1046    if !check_not_null(&mut env, ptr, "RiFrameParser") {
1047        return 0;
1048    }
1049    
1050    let data_vec: Vec<u8> = if !data.is_null() {
1051        env.convert_byte_array(data).unwrap_or_default()
1052    } else {
1053        Vec::new()
1054    };
1055    
1056    let parser = unsafe { &*(ptr as *const RiFrameParser) };
1057    match parser.parse(&data_vec) {
1058        Some(frame) => {
1059            let frame = Box::new(frame);
1060            Box::into_raw(frame) as jlong
1061        }
1062        None => 0,
1063    }
1064}
1065
1066#[no_mangle]
1067pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameParser_free0(
1068    _env: JNIEnv,
1069    _class: JClass,
1070    ptr: jlong,
1071) {
1072    if ptr != 0 {
1073        unsafe {
1074            let _ = Box::from_raw(ptr as *mut RiFrameParser);
1075        }
1076    }
1077}
1078
1079// =============================================================================
1080// RiFrameBuilder JNI Bindings
1081// =============================================================================
1082
1083#[no_mangle]
1084pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_new0(
1085    _env: JNIEnv,
1086    _class: JClass,
1087) -> jlong {
1088    let builder = Box::new(RiFrameBuilder::new());
1089    Box::into_raw(builder) as jlong
1090}
1091
1092#[no_mangle]
1093pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setFrameType0(
1094    mut env: JNIEnv,
1095    _class: JClass,
1096    ptr: jlong,
1097    frame_type: jint,
1098) {
1099    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1100        return;
1101    }
1102    
1103    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1104    builder.frame_type = match frame_type {
1105        0 => RiFrameType::Data,
1106        1 => RiFrameType::Control,
1107        2 => RiFrameType::Heartbeat,
1108        3 => RiFrameType::Ack,
1109        _ => RiFrameType::Error,
1110    };
1111}
1112
1113#[no_mangle]
1114pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setSequenceNumber0(
1115    mut env: JNIEnv,
1116    _class: JClass,
1117    ptr: jlong,
1118    sequence_number: jlong,
1119) {
1120    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1121        return;
1122    }
1123    
1124    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1125    builder.sequence_number = sequence_number as u64;
1126}
1127
1128#[no_mangle]
1129pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setSourceId0(
1130    mut env: JNIEnv,
1131    _class: JClass,
1132    ptr: jlong,
1133    source_id: JString,
1134) {
1135    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1136        return;
1137    }
1138    
1139    let source_id_str: String = env.get_string(&source_id)
1140        .expect("Failed to get source id")
1141        .into();
1142    
1143    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1144    builder.source_id = source_id_str;
1145}
1146
1147#[no_mangle]
1148pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_setTargetId0(
1149    mut env: JNIEnv,
1150    _class: JClass,
1151    ptr: jlong,
1152    target_id: JString,
1153) {
1154    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1155        return;
1156    }
1157    
1158    let target_id_str: String = env.get_string(&target_id)
1159        .expect("Failed to get target id")
1160        .into();
1161    
1162    let builder = unsafe { &mut *(ptr as *mut RiFrameBuilder) };
1163    builder.target_id = target_id_str;
1164}
1165
1166#[no_mangle]
1167pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_buildDataFrame0(
1168    mut env: JNIEnv,
1169    _class: JClass,
1170    ptr: jlong,
1171    payload: jbyteArray,
1172) -> jlong {
1173    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1174        return 0;
1175    }
1176    
1177    let payload_vec: Vec<u8> = if !payload.is_null() {
1178        env.convert_byte_array(payload).unwrap_or_default()
1179    } else {
1180        Vec::new()
1181    };
1182    
1183    let builder = unsafe { &*(ptr as *const RiFrameBuilder) };
1184    let frame = Box::new(builder.build_data_frame(payload_vec));
1185    Box::into_raw(frame) as jlong
1186}
1187
1188#[no_mangle]
1189pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_buildHeartbeatFrame0(
1190    mut env: JNIEnv,
1191    _class: JClass,
1192    ptr: jlong,
1193) -> jlong {
1194    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1195        return 0;
1196    }
1197    
1198    let builder = unsafe { &*(ptr as *const RiFrameBuilder) };
1199    let frame = Box::new(builder.build_heartbeat_frame());
1200    Box::into_raw(frame) as jlong
1201}
1202
1203#[no_mangle]
1204pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_buildAckFrame0(
1205    mut env: JNIEnv,
1206    _class: JClass,
1207    ptr: jlong,
1208    sequence_number: jlong,
1209) -> jlong {
1210    if !check_not_null(&mut env, ptr, "RiFrameBuilder") {
1211        return 0;
1212    }
1213    
1214    let builder = unsafe { &*(ptr as *const RiFrameBuilder) };
1215    let frame = Box::new(builder.build_ack_frame(sequence_number as u64));
1216    Box::into_raw(frame) as jlong
1217}
1218
1219#[no_mangle]
1220pub extern "system" fn Java_com_dunimd_ri_protocol_RiFrameBuilder_free0(
1221    _env: JNIEnv,
1222    _class: JClass,
1223    ptr: jlong,
1224) {
1225    if ptr != 0 {
1226        unsafe {
1227            let _ = Box::from_raw(ptr as *mut RiFrameBuilder);
1228        }
1229    }
1230}