| // Note: These manual bindings and the `cc` build dependency are a temporary measure. |
| // We can revert to using `brotlic-sys` if https://github.com/AronParker/brotlic/pull/5 |
| // is ever merged. |
| |
| #![allow(non_camel_case_types)] |
| #![allow(dead_code)] |
| #![allow(non_upper_case_globals)] |
| |
| use std::os::raw::{c_int, c_void}; |
| |
| /// Opaque structure that holds decoder state. |
| pub type BrotliDecoderState = c_void; |
| |
| // From brotli/c/include/brotli/decode.h |
| pub type BrotliDecoderResult = c_int; |
| pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_ERROR: BrotliDecoderResult = 0; |
| pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_SUCCESS: BrotliDecoderResult = 1; |
| pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: BrotliDecoderResult = 2; |
| pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: BrotliDecoderResult = 3; |
| |
| // From brotli/c/include/brotli/shared_dictionary.h |
| pub type BrotliSharedDictionaryType = c_int; |
| pub const BrotliSharedDictionaryType_BROTLI_SHARED_DICTIONARY_RAW: BrotliSharedDictionaryType = 0; |
| pub const BrotliSharedDictionaryType_BROTLI_SHARED_DICTIONARY_SERIALIZED: |
| BrotliSharedDictionaryType = 1; |
| |
| // From brotli/c/include/brotli/types.h |
| pub type BROTLI_BOOL = c_int; |
| pub const BROTLI_TRUE: BROTLI_BOOL = 1; |
| pub const BROTLI_FALSE: BROTLI_BOOL = 0; |
| |
| // From brotli/c/include/brotli/types.h |
| pub type brotli_alloc_func = |
| Option<unsafe extern "C" fn(opaque: *mut c_void, size: usize) -> *mut c_void>; |
| pub type brotli_free_func = Option<unsafe extern "C" fn(opaque: *mut c_void, address: *mut c_void)>; |
| |
| // Functions from brotli/c/include/brotli/decode.h |
| extern "C" { |
| /// Creates an instance of [`BrotliDecoderState`] and initializes it. |
| /// |
| /// The instance can be used once for decoding and should then be destroyed with |
| /// [`BrotliDecoderDestroyInstance`]. It cannot be reused for a new decoding |
| /// session. |
| /// |
| /// # Safety |
| /// |
| /// `alloc_func` and `free_func` MUST be both `Some` or both `None`. In the |
| /// case they are both `None`, default memory allocators are used. `opaque` is |
| /// passed to `alloc_func` and `free_func` when they are called. `free_func` |
| /// has to return without doing anything when asked to free a null pointer. |
| /// |
| /// # Arguments |
| /// |
| /// * `alloc_func` - Custom memory allocation function. |
| /// * `free_func` - Custom memory free function. |
| /// * `opaque` - Custom memory manager handle. |
| /// |
| /// # Returns |
| /// |
| /// `null` if the instance cannot be allocated or initialized; otherwise, a |
| /// pointer to an initialized [`BrotliDecoderState`]. |
| pub fn BrotliDecoderCreateInstance( |
| alloc_func: brotli_alloc_func, |
| free_func: brotli_free_func, |
| opaque: *mut c_void, |
| ) -> *mut BrotliDecoderState; |
| |
| /// Adds LZ77 prefix dictionary, adds or replaces built-in static dictionary and |
| /// transforms. |
| /// |
| /// Attached dictionary ownership is not transferred. |
| /// |
| /// # Note |
| /// |
| /// Dictionaries can NOT be attached after actual decoding is started. |
| /// |
| /// # Safety |
| /// |
| /// * `state` must be a valid pointer to a [`BrotliDecoderState`]. |
| /// * `data` must point to a valid memory region of at least `data_size` bytes. |
| /// * The memory pointed to by `data` must be kept accessible until decoding |
| /// is finished and the decoder instance is destroyed. |
| /// |
| /// # Arguments |
| /// |
| /// * `state` - Decoder instance. |
| /// * `type_` - Dictionary data format. |
| /// * `data_size` - Length of memory region pointed by `data`. |
| /// * `data` - Dictionary data in format corresponding to `type_`. |
| /// |
| /// # Returns |
| /// |
| /// [`BROTLI_FALSE`] if the dictionary is corrupted, or the dictionary count |
| /// limit is reached; otherwise, [`BROTLI_TRUE`]. |
| pub fn BrotliDecoderAttachDictionary( |
| state: *mut BrotliDecoderState, |
| type_: BrotliSharedDictionaryType, |
| data_size: usize, |
| data: *const u8, |
| ) -> BROTLI_BOOL; |
| |
| /// Decompresses the input stream to the output stream. |
| /// |
| /// The values `available_in` and `available_out` must specify the number of |
| /// bytes addressable at `next_in` and `next_out` respectively. |
| /// |
| /// After each call, `available_in` will be decremented by the amount of input |
| /// bytes consumed, and the `next_in` pointer will be incremented by that |
| /// amount. Similarly, `available_out` will be decremented by the amount of |
| /// output bytes written, and the `next_out` pointer will be incremented by |
| /// that amount. |
| /// |
| /// `total_out`, if it is not a null-pointer, will be set to the number |
| /// of bytes decompressed since the last `state` initialization. |
| /// |
| /// # Note |
| /// |
| /// Input is never overconsumed, so `next_in` and `available_in` could be |
| /// passed to the next consumer after decoding is complete. |
| /// |
| /// # Safety |
| /// |
| /// * `state` must be a valid pointer to a [`BrotliDecoderState`]. |
| /// * `available_in`, `next_in`, `available_out`, and `next_out` must all be |
| /// valid, non-null pointers to their respective types. |
| /// * The memory region pointed to by `*next_in` must be at least |
| /// `*available_in` bytes long. |
| /// * The memory region pointed to by `*next_out` must be at least |
| /// `*available_out` bytes long, unless `*available_out` is 0, in which |
| /// case `*next_out` may be `null`. |
| /// * `total_out` may be `null`; if not, it must be a valid pointer to a |
| /// [`usize`]. |
| /// |
| /// # Arguments |
| /// |
| /// * `state` - Decoder instance. |
| /// * `available_in` - **in:** amount of available input; **out:** amount of unused input. |
| /// * `next_in` - **in/out:** pointer to the next compressed byte. |
| /// * `available_out` - **in:** length of output buffer; **out:** remaining size of output buffer. |
| /// * `next_out` - **in/out:** output buffer cursor; can be `null` if `available_out` is 0. |
| /// * `total_out` - **out:** number of bytes decompressed so far; can be `null`. |
| /// |
| /// # Returns |
| /// |
| /// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_ERROR`] - Input is corrupted, |
| /// memory allocation failed, arguments were invalid, etc. |
| /// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT`] - Decoding |
| /// is blocked until more input data is provided. |
| /// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT`] - Decoding |
| /// is blocked until more output space is provided. |
| /// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_SUCCESS`] - Decoding is |
| /// finished; no more input might be consumed and no more output will be produced. |
| pub fn BrotliDecoderDecompressStream( |
| state: *mut BrotliDecoderState, |
| available_in: *mut usize, |
| next_in: *mut *const u8, |
| available_out: *mut usize, |
| next_out: *mut *mut u8, |
| total_out: *mut usize, |
| ) -> BrotliDecoderResult; |
| |
| /// Deinitializes and frees a [`BrotliDecoderState`] instance. |
| /// |
| /// # Safety |
| /// |
| /// The `state` pointer must be either `null` or a pointer to a valid |
| /// [`BrotliDecoderState`] previously allocated with [`BrotliDecoderCreateInstance`]. |
| /// |
| /// # Arguments |
| /// |
| /// * `state` - Decoder instance to be cleaned up and deallocated. |
| pub fn BrotliDecoderDestroyInstance(state: *mut BrotliDecoderState); |
| } |