///|
fn pdf_reader_validate_xref_metadata_for_reconstruction(
data : BytesView,
) -> Unit raise @core.PdfError {
let cursor = @core.byte_cursor_of_view(data)
ignore(@reader.pdf_read_header_from_cursor(cursor))
let mut current_xref = @reader.pdf_read_startxref_position(cursor.view())
let mut done = false
let mut depth = 0
while !done {
if depth >= 1024 {
raise XRefExpected
}
cursor.seek_absolute(current_xref)
let section = pdf_cursor_read_xref_section(cursor)
match @reader.pdf_trailer_xref_stream_position(section.trailer) {
Some(xref_stream_position) => {
cursor.seek_absolute(xref_stream_position)
ignore(pdf_cursor_read_xref_stream_section(cursor))
}
None => ()
}
match @reader.pdf_trailer_prev_position(section.trailer) {
Some(previous) => current_xref = previous
None => done = true
}
depth += 1
}
}
///|
fn pdf_reader_xref_entry_error_from_metadata(data : BytesView) -> Bool {
pdf_reader_xref_metadata_error_allows_reconstruction(data, XRefEntryExpected)
}
///|
fn pdf_reader_xref_metadata_error_allows_reconstruction(
data : BytesView,
error : @core.PdfError,
) -> Bool {
let result : Result[Unit, Error] = try
pdf_reader_validate_xref_metadata_for_reconstruction(data)
catch {
err => Err(err)
} noraise {
value => Ok(value)
}
match (result, error) {
(Err(@core.PdfError::XRefEntryExpected), XRefEntryExpected) => true
(
Err(@core.PdfError::FilterNotSupported(metadata_filter)),
FilterNotSupported(filter),
) => metadata_filter == filter
(Err(@core.PdfError::PredictorExpected), PredictorExpected) => true
(
Err(@core.PdfError::PredictorNotSupported(metadata_predictor)),
PredictorNotSupported(predictor),
) => metadata_predictor == predictor
_ => false
}
}