// The contents from this file are from a proposed API that is not yet // implemented in upstream liblzma. #ifndef INDEX_PARSER_H #define INDEX_PARSER_H #include #include #include namespace lzma { /** * \brief Internal data structure * * The contents of this structure is not visible outside the library. */ typedef struct lzma_index_parser_internal_s lzma_index_parser_internal; /** * \brief Reading the indexes of an .xz file * * The lzma_index_parser_data data structure is passed to * lzma_parse_indexes_from_file(), which can be used to retrieve the index * information for a given .xz file. * * It should be initialized with LZMA_INDEX_PARSER_DATA_INIT, * and, minimally, the file_size and read_callback() members need to be set. * * The allocation of internals happens transparently upon usage and does not * need to be taken care of. * In the case of an error, lzma_parse_indexes_from_file() performs all * necessary cleanup. * In the case of success, the index member will be set and needs to be * freed using lzma_index_end after the caller is done with it. If a custom * allocator was set on this struct, it needs to be used for freeing the * resulting index, too. * * Reading the data from the underlying file may happen synchronously or * asynchronously, see the description of the read_callback(). */ typedef struct { /** * \brief Combined Index of all Streams in the file * * This will be set to an lzma_index * when parsing the file was * successful, as indicated by a LZMA_STREAM_END return status. */ lzma_index *index; /** * \brief Total amount of Stream Padding * * This will be set when the file was successfully read. */ size_t stream_padding; /** * \brief Callback for reading data from the input file * * This member needs to be set to a function that provides a slice of * the input file. * * The opaque pointer will have the same value as the opaque pointer * set on this struct. * * When being invoked, it should read count bytes from the underlying * file, starting at the specified offset, into buf. * The return value may be -1, in which case * lzma_parse_indexes_from_file() will return with LZMA_DATA_ERROR. * Otherwise, the number of read bytes should be returned. If this is * not the number of requested bytes, it will be assumed that the file * was truncated, and lzma_parse_indexes_from_file() will fail with * LZMA_DATA_ERROR. * * It is possible to perform the underlying I/O operations in an * asynchronous manner. To do so, set the async flag on this struct * to true. After read_callback() is invoked, * lzma_parse_indexes_from_file() will return immediately with * LZMA_OK (unless the read_callback() return value indicates failure), * and you are expected to call lzma_parse_indexes_from_file() with * the same struct as soon as the buffer has been filled. * * If asynchronous reading is used and the underlying read operation * fails, you should set file_size to SIZE_MAX and call * lzma_parse_indexes_from_file() to trigger an error clean up all * remaining internal state. * * You should not perform any operations on this structure until * the data has been read in any case. * * This function is modelled after pread(2), which is a available on * some platforms and can be easily wrapped to be used here. */ int64_t (LZMA_API_CALL *read_callback)(void *opaque, uint8_t *buf, size_t count, int64_t offset); /// Opaque pointer that is passed to read_callback. void *opaque; /// Whether to return after calling read_callback and wait for /// another call. Defaults to synchronous operations. lzma_bool async; /** \brief Callback for reading data from the input file * * This needs to be set to the size of the input file before all * other operations. If this is set to SIZE_MAX, the parser will * fail with LZMA_OPTIONS_ERROR. This can be used to clean up * after a failed asynchronous read_callback(). * * On error, this will be set to SIZE_MAX. */ size_t file_size; /** \brief Memory limit for decoding the indexes. * * Set a memory limit for decoding. Default to UINT64_MAX for no limit. * If this is set too low to allocate the internal data structure * that is minimally required for parsing, this will be set to 0. * If this is set too low to parse the underlying .xz file, * this will be set to the amount of memory that would have * been necessary for parsing the file. */ uint64_t memlimit; /// Message that may be set when additional information is available /// on error. const char *message; /** * \brief Custom memory allocation functions * * In most cases this is NULL which makes liblzma use * the standard malloc() and free(). */ const lzma_allocator *allocator; /** * \brief Data which is internal to the index parser. * * Do not touch. You can check whether this is NULL to see if this * structure currently holds external resources, not counting the * possible index member that is set on success. */ lzma_index_parser_internal* internal; /* * Reserved space to allow possible future extensions without * breaking the ABI. Excluding the initialization of this structure, * you should not touch these, because the names of these variables * may change. */ void *reserved_ptr1; void *reserved_ptr2; void *reserved_ptr3; void *reserved_ptr4; uint64_t reserved_int1; uint64_t reserved_int2; size_t reserved_int3; size_t reserved_int4; lzma_reserved_enum reserved_enum1; lzma_reserved_enum reserved_enum2; } lzma_index_parser_data; /** * \brief Initialization for lzma_index_parser_data * * When you declare an instance of lzma_index_parser_data, you should * immediately initialize it to this value: * * lzma_index_parser_data strm = LZMA_INDEX_PARSER_DATA_INIT; * * Anything which applies for LZMA_STREAM_INIT applies here, too. */ #define LZMA_INDEX_PARSER_DATA_INIT \ { NULL, 0, NULL, NULL, 0, 0, 0, NULL, NULL, NULL, \ NULL, NULL, NULL, NULL, 0, 0, 0, 0, \ LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM } /** \brief Parse the Index(es) from the given .xz file * * Read metadata from the underlying file. * The info pointer should refer to a lzma_index_parser_data struct that * has been initialized using LZMA_INDEX_PARSER_DATA_INIT. * * This will call info->read_callback() multiple times to read parts of the * underlying .xz file and, upon success, fill info->index with an * lzma_index pointer that contains metadata for the whole file, accumulated * across multiple streams. * * \param info Pointer to a lzma_index_parser_data structure. * * \return On success, LZMA_STREAM_END is returned. * On error, another value is returned, and info->message may * be set to provide additional information. * If info->async is set, LZMA_OK may be returned to indicate * that another call to lzma_parse_indexes_from_file() should be * performed after the data has been read. */ extern lzma_ret my_lzma_parse_indexes_from_file(lzma_index_parser_data *info); } #endif