use crate::bindgen::FPDF_DOCUMENT;
use crate::error::PdfiumError;
use crate::pdfium::PdfiumLibraryBindingsAccessor;
use crate::utils::{mem::create_byte_buffer, utf16le::get_string_from_pdfium_utf16le_bytes};
use std::marker::PhantomData;
#[cfg(any(
feature = "pdfium_future",
feature = "pdfium_7881",
feature = "pdfium_7763"
))]
use std::ffi::c_ushort;
#[cfg(doc)]
use crate::pdf::document::PdfDocument;
pub struct PdfCatalog<'a> {
document_handle: FPDF_DOCUMENT,
lifetime: PhantomData<&'a FPDF_DOCUMENT>,
}
impl<'a> PdfCatalog<'a> {
#[inline]
pub(crate) fn from_pdfium(document_handle: FPDF_DOCUMENT) -> Self {
Self {
document_handle,
lifetime: PhantomData,
}
}
#[inline]
pub(crate) fn document_handle(&self) -> FPDF_DOCUMENT {
self.document_handle
}
#[inline]
pub fn is_tagged(&self) -> bool {
self.bindings()
.is_true(unsafe { self.bindings().FPDFCatalog_IsTagged(self.document_handle()) })
}
#[cfg(any(
feature = "pdfium_future",
feature = "pdfium_7881",
feature = "pdfium_7763"
))]
pub fn get_language(&self) -> Result<String, PdfiumError> {
let buffer_length = unsafe {
self.bindings()
.FPDFCatalog_GetLanguage(self.document_handle(), std::ptr::null_mut(), 0)
};
if buffer_length == 0 {
return Err(PdfiumError::PdfiumFunctionReturnValueIndicatedFailure);
}
if buffer_length == 2 {
return Err(PdfiumError::NoLanguageSetInDocumentCatalog);
}
let mut buffer = create_byte_buffer(buffer_length as usize);
let result = unsafe {
self.bindings().FPDFCatalog_GetLanguage(
self.document_handle(),
buffer.as_mut_ptr() as *mut c_ushort,
buffer_length,
)
};
assert_eq!(result, buffer_length);
get_string_from_pdfium_utf16le_bytes(buffer)
.ok_or(PdfiumError::NoLanguageSetInDocumentCatalog)
}
#[cfg(any(
feature = "pdfium_future",
feature = "pdfium_7881",
feature = "pdfium_7763",
feature = "pdfium_7543",
feature = "pdfium_7350",
feature = "pdfium_7215",
feature = "pdfium_7123",
feature = "pdfium_6996",
feature = "pdfium_6721",
feature = "pdfium_6666"
))]
pub fn set_language(&mut self, language: impl ToString) -> Result<(), PdfiumError> {
if self.bindings().is_true(unsafe {
self.bindings()
.FPDFCatalog_SetLanguage_str(self.document_handle(), language.to_string().as_str())
}) {
Ok(())
} else {
Err(PdfiumError::PdfiumFunctionReturnValueIndicatedFailure)
}
}
}
impl<'a> PdfiumLibraryBindingsAccessor<'a> for PdfCatalog<'a> {}
#[cfg(feature = "thread_safe")]
unsafe impl<'a> Send for PdfCatalog<'a> {}
#[cfg(feature = "thread_safe")]
unsafe impl<'a> Sync for PdfCatalog<'a> {}