1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 use super::*;
17 use hilog_rust::{info, hilog, HiLogLabel, LogType};
18 use crate::error::BufferStatusCode;
19 const LOG_LABEL: HiLogLabel = HiLogLabel {
20 log_type: LogType::LogCore,
21 domain: 0xD002700,
22 tag: "stream_buffer_ffi"
23 };
24 /// Create unique_ptr of stream_buffer for C++ code
25 ///
26 /// # Safety
27 ///
28 /// The pointer which pointed the memory already initialized must be valid.
29 /// If uninitialized memory requires special handling, please refer to std::mem::MaybeUninit.
30 /// The pointer needs to be aligned for access. If the memory pointed to by the pointer is a compact
31 /// memory layout and requires special consideration. Please refer to (#[repr(packed)]).
32 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
33 #[no_mangle]
StreamBufferCreate() -> *mut StreamBuffer34 pub unsafe extern "C" fn StreamBufferCreate() -> *mut StreamBuffer {
35 info!(LOG_LABEL, "enter StreamBufferCreate");
36 let stream_buffer: Box::<StreamBuffer> = Box::default();
37 Box::into_raw(stream_buffer)
38 }
39 /// Drop unique_ptr of stream_buffer for C++ code
40 ///
41 /// # Safety
42 ///
43 /// The pointer which pointed the memory already initialized must be valid.
44 /// If uninitialized memory requires special handling, please refer to std::mem::MaybeUninit.
45 /// The pointer needs to be aligned for access. If the memory pointed to by the pointer is a compact
46 /// memory layout and requires special consideration. Please refer to (#[repr(packed)]).
47 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
48 #[no_mangle]
StreamBufferDelete(raw: *mut StreamBuffer)49 pub unsafe extern "C" fn StreamBufferDelete(raw: *mut StreamBuffer) {
50 info!(LOG_LABEL, "enter StreamBufferDelete");
51 if !raw.is_null() {
52 drop(Box::from_raw(raw));
53 }
54 }
55 /// Obtain the first address of sz_buff
56 ///
57 /// # Safety
58 ///
59 /// The pointer which pointed the memory already initialized must be valid.
60 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
61 #[no_mangle]
StreamBufferData(object: *const StreamBuffer) -> *const c_char62 pub unsafe extern "C" fn StreamBufferData(object: *const StreamBuffer) -> *const c_char {
63 info!(LOG_LABEL, "enter data");
64 if let Some(obj) = StreamBuffer::as_ref(object) {
65 obj.data()
66 } else {
67 std::ptr::null()
68 }
69 }
70 /// Obtain position writen
71 ///
72 /// # Safety
73 ///
74 /// The pointer which pointed the memory already initialized must be valid.
75 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
76 #[no_mangle]
StreamBufferSize(object: *const StreamBuffer) -> usize77 pub unsafe extern "C" fn StreamBufferSize(object: *const StreamBuffer) -> usize {
78 info!(LOG_LABEL, "enter size");
79 if let Some(obj) = StreamBuffer::as_ref(object) {
80 obj.size()
81 } else {
82 0
83 }
84 }
85 /// Reset StreamBuffer value
86 ///
87 /// # Safety
88 ///
89 /// The pointer which pointed the memory already initialized must be valid.
90 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
91 #[no_mangle]
StreamBufferReset(object: *mut StreamBuffer) -> i3292 pub unsafe extern "C" fn StreamBufferReset(object: *mut StreamBuffer) -> i32 {
93 info!(LOG_LABEL, "enter StreamBufferReset");
94 if let Some(obj) = StreamBuffer::as_mut(object) {
95 obj.reset();
96 BufferStatusCode::Ok.into()
97 } else {
98 BufferStatusCode::ResetFail.into()
99 }
100 }
101 /// Clean StreamBuffer value
102 ///
103 /// # Safety
104 ///
105 /// The pointer which pointed the memory already initialized must be valid.
106 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
107 #[no_mangle]
StreamBufferClean(object: *mut StreamBuffer) -> i32108 pub unsafe extern "C" fn StreamBufferClean(object: *mut StreamBuffer) -> i32 {
109 info!(LOG_LABEL, "enter clean");
110 if let Some(obj) = StreamBuffer::as_mut(object) {
111 obj.clean();
112 BufferStatusCode::Ok.into()
113 } else {
114 BufferStatusCode::CleanFail.into()
115 }
116 }
117 /// Write object data into buf
118 ///
119 /// # Safety
120 ///
121 /// The pointer which pointed the memory already initialized must be valid.
122 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
123 #[no_mangle]
StreamBufferWrite(object: *mut StreamBuffer, buf: *const StreamBuffer) -> bool124 pub unsafe extern "C" fn StreamBufferWrite(object: *mut StreamBuffer, buf: *const StreamBuffer) -> bool {
125 info!(LOG_LABEL, "enter StreamBufferWrite");
126 if let Some(obj) = StreamBuffer::as_mut(object) {
127 if let Some(buffer) = StreamBuffer::as_ref(buf) {
128 obj.write_streambuffer(buffer)
129 } else {
130 false
131 }
132 } else {
133 false
134 }
135 }
136 /// Read object data into buf
137 ///
138 /// # Safety
139 ///
140 /// The pointer which pointed the memory already initialized must be valid.
141 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
142 #[no_mangle]
StreamBufferRead(object: *const StreamBuffer, buf: *mut StreamBuffer) -> bool143 pub unsafe extern "C" fn StreamBufferRead(object: *const StreamBuffer, buf: *mut StreamBuffer) -> bool {
144 info!(LOG_LABEL, "enter StreamBufferRead");
145 if let Some(obj) = StreamBuffer::as_ref(object) {
146 if let Some(buffer) = StreamBuffer::as_mut(buf) {
147 obj.read_streambuffer(buffer)
148 } else {
149 false
150 }
151 } else {
152 false
153 }
154 }
155 /// Obtain status of reading or writing
156 ///
157 /// # Safety
158 ///
159 /// The pointer which pointed the memory already initialized must be valid.
160 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
161 #[no_mangle]
StreamBufferChkRWError(object: *const StreamBuffer) -> bool162 pub unsafe extern "C" fn StreamBufferChkRWError(object: *const StreamBuffer) -> bool {
163 if let Some(obj) = StreamBuffer::as_ref(object) {
164 obj.chk_rwerror()
165 } else {
166 false
167 }
168 }
169 /// Obtain remarked string of status
170 ///
171 /// # Safety
172 ///
173 /// The pointer which pointed the memory already initialized must be valid.
174 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
175 #[no_mangle]
StreamBufferGetErrorStatusRemark(object: *const StreamBuffer) -> *const c_char176 pub unsafe extern "C" fn StreamBufferGetErrorStatusRemark(object: *const StreamBuffer) -> *const c_char {
177 info!(LOG_LABEL, "enter StreamBufferGetErrorStatusRemark");
178 if let Some(obj) = StreamBuffer::as_ref(object) {
179 obj.get_error_status_remark()
180 } else {
181 std::ptr::null()
182 }
183 }
184 /// Buf Bytes will be writen into streambuffer's sz_buff.
185 ///
186 /// # Safety
187 ///
188 /// The pointer which pointed the memory already initialized must be valid.
189 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
190 #[no_mangle]
StreamBufferWriteChar(object: *mut StreamBuffer, buf: *const c_char, size: usize) -> bool191 pub unsafe extern "C" fn StreamBufferWriteChar(object: *mut StreamBuffer, buf: *const c_char, size: usize) -> bool {
192 info!(LOG_LABEL, "enter StreamBufferWriteChar");
193 if let Some(obj) = StreamBuffer::as_mut(object) {
194 obj.write_char_usize(buf, size)
195 } else {
196 false
197 }
198 }
199 /// Check whether the condition of writing could be satisfied or not.
200 ///
201 /// # Safety
202 ///
203 /// The pointer which pointed the memory already initialized must be valid.
204 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
205 #[no_mangle]
StreamBufferCheckWrite(object: *mut StreamBuffer, size: usize) -> bool206 pub unsafe extern "C" fn StreamBufferCheckWrite(object: *mut StreamBuffer, size: usize) -> bool {
207 info!(LOG_LABEL, "enter StreamBufferCheckWrite");
208 if let Some(obj) = StreamBuffer::as_mut(object) {
209 obj.check_write(size)
210 } else {
211 false
212 }
213 }
214 /// CircleStreamBuffer will copy data to beginning.
215 ///
216 /// # Safety
217 ///
218 /// The pointer which pointed the memory already initialized must be valid.
219 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
220 #[no_mangle]
CircleStreamBufferCopyDataToBegin(object: *mut StreamBuffer) -> i32221 pub unsafe extern "C" fn CircleStreamBufferCopyDataToBegin(object: *mut StreamBuffer) -> i32 {
222 info!(LOG_LABEL, "enter CircleStreamBufferCopyDataToBegin");
223 if let Some(obj) = StreamBuffer::as_mut(object) {
224 obj.copy_data_to_begin();
225 BufferStatusCode::Ok.into()
226 } else {
227 BufferStatusCode::CopyDataToBeginFail.into()
228 }
229 }
230 /// Read sz_buf to buf.
231 ///
232 /// # Safety
233 ///
234 /// The pointer which pointed the memory already initialized must be valid.
235 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
236 #[no_mangle]
StreamBufferReadChar(object: *mut StreamBuffer, buf: *const c_char, size: usize) -> bool237 pub unsafe extern "C" fn StreamBufferReadChar(object: *mut StreamBuffer, buf: *const c_char, size: usize) -> bool {
238 info!(LOG_LABEL, "enter StreamBufferReadChar");
239 if let Some(obj) = StreamBuffer::as_mut(object) {
240 obj.read_char_usize(buf, size)
241 } else {
242 false
243 }
244 }
245 /// Write sz_buf to buf.
246 ///
247 /// # Safety
248 ///
249 /// The pointer which pointed the memory already initialized must be valid.
250 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
251 #[no_mangle]
CircleStreamBufferWrite(object: *mut StreamBuffer, buf: *const c_char, size: usize) -> bool252 pub unsafe extern "C" fn CircleStreamBufferWrite(object: *mut StreamBuffer, buf: *const c_char, size: usize) -> bool {
253 info!(LOG_LABEL, "enter CircleStreamBufferWrite");
254 if let Some(obj) = StreamBuffer::as_mut(object) {
255 obj.circle_write(buf, size)
256 } else {
257 false
258 }
259 }
260 /// read packets on client.
261 ///
262 /// # Safety
263 ///
264 /// The pointer which pointed the memory already initialized must be valid.
265 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
266 #[no_mangle]
ReadClientPackets(object: *mut StreamBuffer, stream_client: *const CSensorServiceClient, callback_fun: ClientPacketCallBackFun) -> i32267 pub unsafe extern "C" fn ReadClientPackets(object: *mut StreamBuffer, stream_client: *const CSensorServiceClient,
268 callback_fun: ClientPacketCallBackFun) -> i32 {
269 info!(LOG_LABEL,"enter ReadClientPackets");
270 if let Some(obj) = StreamBuffer::as_mut(object) {
271 obj.read_client_packets(stream_client, callback_fun);
272 BufferStatusCode::Ok.into()
273 } else {
274 BufferStatusCode::ReadClientPacketsFail.into()
275 }
276 }
277 /// StreamBufferReadBuf.
278 ///
279 /// # Safety
280 ///
281 /// The pointer which pointed the memory already initialized must be valid.
282 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
283 #[no_mangle]
StreamBufferReadBuf(object: *const StreamBuffer) -> *const c_char284 pub unsafe extern "C" fn StreamBufferReadBuf(object: *const StreamBuffer) -> *const c_char {
285 if let Some(obj) = StreamBuffer::as_ref(object) {
286 obj.read_buf()
287 } else {
288 std::ptr::null()
289 }
290 }
291 /// obtain streambuffer's r_count field.
292 ///
293 /// # Safety
294 ///
295 /// The pointer which pointed the memory already initialized must be valid.
296 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
297 #[no_mangle]
StreamBufferGetRcount(object: *const StreamBuffer) -> i32298 pub unsafe extern "C" fn StreamBufferGetRcount(object: *const StreamBuffer) -> i32 {
299 if let Some(obj) = StreamBuffer::as_ref(object) {
300 obj.r_count() as i32
301 } else {
302 BufferStatusCode::RcountFail.into()
303 }
304 }
305 /// obtain streambuffer's w_count field.
306 ///
307 /// # Safety
308 ///
309 /// The pointer which pointed the memory already initialized must be valid.
310 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
311 #[no_mangle]
StreamBufferGetWcount(object: *const StreamBuffer) -> i32312 pub unsafe extern "C" fn StreamBufferGetWcount(object: *const StreamBuffer) -> i32 {
313 if let Some(obj) = StreamBuffer::as_ref(object) {
314 obj.w_count() as i32
315 } else {
316 BufferStatusCode::WcountFail.into()
317 }
318 }
319 /// obtain streambuffer's w_pos field.
320 ///
321 /// # Safety
322 ///
323 /// The pointer which pointed the memory already initialized must be valid.
324 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
325 #[no_mangle]
StreamBufferGetWpos(object: *const StreamBuffer) -> i32326 pub unsafe extern "C" fn StreamBufferGetWpos(object: *const StreamBuffer) -> i32 {
327 if let Some(obj) = StreamBuffer::as_ref(object) {
328 obj.w_pos() as i32
329 } else {
330 BufferStatusCode::WposFail.into()
331 }
332 }
333 /// obtain streambuffer's r_pos field.
334 ///
335 /// # Safety
336 ///
337 /// The pointer which pointed the memory already initialized must be valid.
338 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
339 #[no_mangle]
StreamBufferGetRpos(object: *const StreamBuffer) -> i32340 pub unsafe extern "C" fn StreamBufferGetRpos(object: *const StreamBuffer) -> i32 {
341 if let Some(obj) = StreamBuffer::as_ref(object) {
342 obj.r_pos() as i32
343 } else {
344 BufferStatusCode::RposFail.into()
345 }
346 }
347 /// obtain streambuffer's sz_buff field.
348 ///
349 /// # Safety
350 ///
351 /// The pointer which pointed the memory already initialized must be valid.
352 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
353 #[no_mangle]
StreamBufferGetSzBuff(object: *const StreamBuffer) -> *const c_char354 pub unsafe extern "C" fn StreamBufferGetSzBuff(object: *const StreamBuffer) -> *const c_char {
355 if let Some(obj) = StreamBuffer::as_ref(object) {
356 obj.sz_buff()
357 } else {
358 std::ptr::null()
359 }
360 }
361 /// obtain streambuffer's rw_err_status field.
362 ///
363 /// # Safety
364 ///
365 /// The pointer which pointed the memory already initialized must be valid.
366 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
367 #[no_mangle]
StreamBufferSetRwErrStatus(object: *mut StreamBuffer, rw_error_status: ErrorStatus) -> i32368 pub unsafe extern "C" fn StreamBufferSetRwErrStatus(object: *mut StreamBuffer, rw_error_status: ErrorStatus) -> i32 {
369 if let Some(obj) = StreamBuffer::as_mut(object) {
370 obj.set_rw_error_status(rw_error_status);
371 BufferStatusCode::Ok.into()
372 } else {
373 BufferStatusCode::SetRwErrStatusFail.into()
374 }
375 }
376 /// set streambuffer's r_pos field.
377 ///
378 /// # Safety
379 ///
380 /// The pointer which pointed the memory already initialized must be valid.
381 /// Makesure the memory shouldn't be dropped while whose pointer is being used.
382 #[no_mangle]
StreamBufferSetRpos(object: *mut StreamBuffer, r_pos: i32) -> i32383 pub unsafe extern "C" fn StreamBufferSetRpos(object: *mut StreamBuffer, r_pos: i32) -> i32 {
384 if let Some(obj) = StreamBuffer::as_mut(object) {
385 obj.set_r_pos(r_pos as usize);
386 BufferStatusCode::Ok.into()
387 } else {
388 BufferStatusCode::SetRposFail.into()
389 }
390 }
391
392