1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use { rust_icu_common as common, rust_icu_sys as sys, rust_icu_sys::versioned_function, rust_icu_sys::*, std::convert::TryFrom, std::os::raw, }; /// Implements `UDataMemory`. /// /// Represents data memory backed by a borrowed memory buffer used for loading ICU data. /// UDataMemory is very much not thread safe, as it affects the global state of the ICU library. /// This suggests that the best way to use this data is to load it up in a main thread, or access /// it through a synchronized wrapper. #[derive(Debug)] pub struct UDataMemory { // The buffer backing this data memory. We're holding it here though unused // so that we're sure the underlying buffer won't go away while the data is // in use. #[allow(dead_code)] buf: Vec<u8>, } impl Drop for UDataMemory { // Implements `u_cleanup`. fn drop(&mut self) { unsafe { versioned_function!(u_cleanup)() }; } } impl TryFrom<Vec<u8>> for crate::UDataMemory { type Error = common::Error; /// Makes a UDataMemory out of a buffer. /// /// Implements `udata_setCommonData`. fn try_from(buf: Vec<u8>) -> Result<Self, Self::Error> { let mut status = sys::UErrorCode::U_ZERO_ERROR; // Expects that buf is a valid pointer and that it contains valid // ICU data. If data is invalid, an error status will be set. // No guarantees for invalid pointers. unsafe { versioned_function!(udata_setCommonData)( buf.as_ptr() as *const raw::c_void, &mut status, ); }; common::Error::ok_or_warning(status)?; Ok(UDataMemory { buf }) } }