use crate::error::{AccessError, PickerError};
use crate::token::{
FileAccessToken, PermissionStatus, ReadSeek, TokenInner, WriteSeek,
};
pub(super) fn token_from_url(url: &str) -> Result<FileAccessToken, PickerError> {
let display_name = url.rsplit('/').next().unwrap_or("unnamed").to_owned();
Ok(FileAccessToken {
inner: TokenInner::Ios {
bookmark: url.as_bytes().to_vec(),
display_name,
mime_type: None,
},
})
}
pub(super) fn open_read_bookmark(
bookmark: &[u8],
) -> Result<Box<dyn ReadSeek>, AccessError> {
let _url = String::from_utf8(bookmark.to_vec()).map_err(|_| {
AccessError::Platform {
message: "invalid bookmark data".into(),
}
})?;
Err(AccessError::Platform {
message: "iOS bookmark resolution requires Objective-C runtime".into(),
})
}
pub(super) fn open_write_bookmark(
bookmark: &[u8],
) -> Result<Box<dyn WriteSeek>, AccessError> {
let _url = String::from_utf8(bookmark.to_vec()).map_err(|_| {
AccessError::Platform {
message: "invalid bookmark data".into(),
}
})?;
Err(AccessError::Platform {
message: "iOS bookmark resolution requires Objective-C runtime".into(),
})
}
pub(super) fn check_bookmark(bookmark: &[u8]) -> PermissionStatus {
if bookmark.is_empty() {
PermissionStatus::Revoked
} else {
PermissionStatus::Unknown
}
}
#[allow(dead_code)] pub(super) struct ScopedBookmarkFile {
file: std::fs::File,
url: String,
}
impl std::io::Read for ScopedBookmarkFile {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.file.read(buf)
}
}
impl std::io::Write for ScopedBookmarkFile {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.file.write(buf)
}
fn flush(&mut self) -> std::io::Result<()> {
self.file.flush()
}
}
impl std::io::Seek for ScopedBookmarkFile {
fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result<u64> {
self.file.seek(pos)
}
}
impl Drop for ScopedBookmarkFile {
fn drop(&mut self) {
}
}