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