pub mod error;
pub use error::FileUriError;
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
use std::ptr;
use error::error_from_code;
use ohos_fileuri_sys::*;
pub fn get_uri_from_path(path: &str) -> std::result::Result<String, FileUriError> {
let c_path = CString::new(path).map_err(|_| FileUriError::NullByteError)?;
let mut result: *mut c_char = ptr::null_mut();
let code =
unsafe { OH_FileUri_GetUriFromPath(c_path.as_ptr(), path.len() as u32, &mut result) };
if code == FileManagement_ErrCode_ERR_OK {
if result.is_null() {
return Err(FileUriError::ConversionError);
}
let uri = unsafe {
let c_str = CStr::from_ptr(result);
let rust_str = c_str
.to_str()
.map_err(|_| FileUriError::ConversionError)?
.to_string();
libc::free(result as *mut _);
rust_str
};
Ok(uri)
} else {
if !result.is_null() {
unsafe { libc::free(result as *mut _) };
}
Err(error_from_code(code))
}
}
pub fn get_path_from_uri(uri: &str) -> std::result::Result<String, FileUriError> {
let c_uri = CString::new(uri).map_err(|_| FileUriError::NullByteError)?;
let mut result: *mut c_char = ptr::null_mut();
let code = unsafe { OH_FileUri_GetPathFromUri(c_uri.as_ptr(), uri.len() as u32, &mut result) };
if code == FileManagement_ErrCode_ERR_OK {
if result.is_null() {
return Err(FileUriError::ConversionError);
}
let path = unsafe {
let c_str = CStr::from_ptr(result);
let rust_str = c_str
.to_str()
.map_err(|_| FileUriError::ConversionError)?
.to_string();
libc::free(result as *mut _);
rust_str
};
Ok(path)
} else {
if !result.is_null() {
unsafe { libc::free(result as *mut _) };
}
Err(error_from_code(code))
}
}
pub fn get_full_directory_uri(uri: &str) -> std::result::Result<String, FileUriError> {
let c_uri = CString::new(uri).map_err(|_| FileUriError::NullByteError)?;
let mut result: *mut c_char = ptr::null_mut();
let code =
unsafe { OH_FileUri_GetFullDirectoryUri(c_uri.as_ptr(), uri.len() as u32, &mut result) };
if code == FileManagement_ErrCode_ERR_OK {
if result.is_null() {
return Err(FileUriError::ConversionError);
}
let dir_uri = unsafe {
let c_str = CStr::from_ptr(result);
let rust_str = c_str
.to_str()
.map_err(|_| FileUriError::ConversionError)?
.to_string();
libc::free(result as *mut _);
rust_str
};
Ok(dir_uri)
} else {
if !result.is_null() {
unsafe { libc::free(result as *mut _) };
}
Err(error_from_code(code))
}
}
pub fn is_valid_uri(uri: &str) -> bool {
let Ok(c_uri) = CString::new(uri) else {
return false;
};
unsafe { OH_FileUri_IsValidUri(c_uri.as_ptr(), uri.len() as u32) }
}
#[cfg(feature = "api-13")]
pub fn get_file_name(uri: &str) -> std::result::Result<String, FileUriError> {
let c_uri = CString::new(uri).map_err(|_| FileUriError::NullByteError)?;
let mut result: *mut c_char = ptr::null_mut();
let code = unsafe { OH_FileUri_GetFileName(c_uri.as_ptr(), uri.len() as u32, &mut result) };
if code == FileManagement_ErrCode_ERR_OK {
if result.is_null() {
return Err(FileUriError::ConversionError);
}
let filename = unsafe {
let c_str = CStr::from_ptr(result);
let rust_str = c_str
.to_str()
.map_err(|_| FileUriError::ConversionError)?
.to_string();
libc::free(result as *mut _);
rust_str
};
Ok(filename)
} else {
if !result.is_null() {
unsafe { libc::free(result as *mut _) };
}
Err(error_from_code(code))
}
}