use crate::asset_io::{AssetIO, CAILoader, CAIRead, HashObjectPositions};
use crate::error::{Error, Result};
use std::fs::File;
use std::path::Path;
pub struct C2paIO {}
impl CAILoader for C2paIO {
fn read_cai(&self, asset_reader: &mut dyn CAIRead) -> Result<Vec<u8>> {
let mut cai_data = Vec::new();
asset_reader.read_to_end(&mut cai_data)?;
Ok(cai_data)
}
fn read_xmp(&self, _asset_reader: &mut dyn CAIRead) -> Option<String> {
None
}
}
impl AssetIO for C2paIO {
fn read_cai_store(&self, asset_path: &Path) -> Result<Vec<u8>> {
let mut f = File::open(asset_path)?;
self.read_cai(&mut f)
}
fn save_cai_store(&self, asset_path: &std::path::Path, store_bytes: &[u8]) -> Result<()> {
std::fs::write(asset_path, &store_bytes)
.map_err(|_err| Error::BadParam("C2PA write error".to_owned()))?;
Ok(())
}
fn get_object_locations(
&self,
_asset_path: &std::path::Path,
) -> Result<Vec<HashObjectPositions>> {
Ok(Vec::new())
}
}
#[cfg(test)]
#[cfg(feature = "file_io")]
pub mod tests {
#![allow(clippy::expect_used)]
#![allow(clippy::unwrap_used)]
use super::{AssetIO, C2paIO};
use tempfile::tempdir;
use crate::{
status_tracker::OneShotStatusTracker,
store::Store,
utils::test::{fixture_path, temp_dir_path, temp_signer},
};
#[test]
fn c2pa_io_parse() {
let path = fixture_path("C.jpg");
let temp_dir = tempdir().expect("temp dir");
let temp_path = temp_dir_path(&temp_dir, "test.c2pa");
let c2pa_io = C2paIO {};
let manifest = crate::jumbf_io::load_jumbf_from_file(&path).expect("read_cai_store");
c2pa_io
.save_cai_store(&temp_path, &manifest)
.expect("save cai store");
let store = Store::load_from_asset(&temp_path, false, &mut OneShotStatusTracker::new())
.expect("loading store");
let signer = temp_signer();
let manifest2 = store.to_jumbf(&signer).expect("to_jumbf");
assert_eq!(&manifest, &manifest2);
}
}