mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-24 22:07:14 +03:00
fcbcb6b5a8
* toolbox: compress: moved decompressor implementation to separate func * toolbox: compress: callback-based api; cli: storage unpack command * toolbox: compress: separate r/w contexts for stream api * targets: f18: sync API * compress: naming fixes & cleanup * toolbox: compress: using hs buffer size for stream buffers * toolbox: tar: heatshrink stream mode * toolbox: compress: docs & small cleanup * toolbox: tar: header support for .hs; updater: now uses .hs for resources; .hs.tar: now rewindable * toolbox: compress: fixed hs stream tail handling * updater: reworked progress for resources cleanup; rebalanced stage weights * updater: single-pass decompression; scripts: print resources compression ratio * updater: fixed warnings * toolbox: tar: doxygen * docs: update * docs: info or tarhs format; scripts: added standalone compression/decompression tool for heatshrink-formatted streams * scripts: tarhs: fixed parameter handling * cli: storage extract command; toolbox: tar: guess type based on extension * unit_tests: added test for streamed raw hs decompressor `compress_decode_streamed` * unit_tests: compress: added extraction test for .tar.hs * rpc: autodetect compressed archives * scripts: minor cleanup of common parts * scripts: update: now using in-memory intermediate tar stream * scripts: added hs.py wrapper for heatshrink-related ops (single object and directory-as-tar compression) * scripts: naming fixes * Toolbox: export compress_config_heatshrink_default as const symbol * Toolbox: fix various types naming * Toolbox: more of types naming fixes * Toolbox: use size_t in compress io callbacks and structures * UnitTests: update to match new compress API * Toolbox: proper path_extract_extension usage Co-authored-by: あく <alleteam@gmail.com>
211 lines
5.8 KiB
C
211 lines
5.8 KiB
C
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <storage/storage.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct TarArchive TarArchive;
|
|
|
|
typedef struct Storage Storage;
|
|
|
|
/** Tar archive open mode
|
|
*/
|
|
typedef enum {
|
|
TarOpenModeRead = 'r',
|
|
TarOpenModeWrite = 'w',
|
|
/* read-only heatshrink compressed tar */
|
|
TarOpenModeReadHeatshrink = 'h',
|
|
} TarOpenMode;
|
|
|
|
/** Get expected open mode for archive at the path.
|
|
* Used for automatic mode detection based on the file extension.
|
|
*
|
|
* @param[in] path Path to the archive
|
|
*
|
|
* @return open mode from TarOpenMode enum
|
|
*/
|
|
TarOpenMode tar_archive_get_mode_for_path(const char* path);
|
|
|
|
/** Tar archive constructor
|
|
*
|
|
* @param storage Storage API pointer
|
|
*
|
|
* @return allocated object
|
|
*/
|
|
TarArchive* tar_archive_alloc(Storage* storage);
|
|
|
|
/** Open tar archive
|
|
*
|
|
* @param archive Tar archive object
|
|
* @param[in] path Path to the tar archive
|
|
* @param mode Open mode
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_open(TarArchive* archive, const char* path, TarOpenMode mode);
|
|
|
|
/** Tar archive destructor
|
|
*
|
|
* @param archive Tar archive object
|
|
*/
|
|
void tar_archive_free(TarArchive* archive);
|
|
|
|
/* High-level API - assumes archive is open */
|
|
|
|
/** Unpack tar archive to destination
|
|
*
|
|
* @param archive Tar archive object. Must be opened in read mode
|
|
* @param[in] destination Destination path
|
|
* @param converter Storage name converter
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_unpack_to(
|
|
TarArchive* archive,
|
|
const char* destination,
|
|
Storage_name_converter converter);
|
|
|
|
/** Add file to tar archive
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
* @param[in] fs_file_path Path to the file on the filesystem
|
|
* @param[in] archive_fname Name of the file in the archive
|
|
* @param file_size Size of the file
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_add_file(
|
|
TarArchive* archive,
|
|
const char* fs_file_path,
|
|
const char* archive_fname,
|
|
const int32_t file_size);
|
|
|
|
/** Add directory to tar archive
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
* @param fs_full_path Path to the directory on the filesystem
|
|
* @param path_prefix Prefix to add to the directory name in the archive
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_add_dir(TarArchive* archive, const char* fs_full_path, const char* path_prefix);
|
|
|
|
/** Get number of entries in the archive
|
|
*
|
|
* @param archive Tar archive object
|
|
*
|
|
* @return number of entries. -1 on error
|
|
*/
|
|
int32_t tar_archive_get_entries_count(TarArchive* archive);
|
|
|
|
/** Get read progress
|
|
*
|
|
* @param archive Tar archive object. Must be opened in read mode
|
|
* @param[in] processed Number of processed entries
|
|
* @param[in] total Total number of entries
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_get_read_progress(TarArchive* archive, int32_t* processed, int32_t* total);
|
|
|
|
/** Unpack single file from tar archive
|
|
*
|
|
* @param archive Tar archive object. Must be opened in read mode
|
|
* @param[in] archive_fname Name of the file in the archive
|
|
* @param[in] destination Destination path
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_unpack_file(
|
|
TarArchive* archive,
|
|
const char* archive_fname,
|
|
const char* destination);
|
|
|
|
/** Optional per-entry callback on unpacking
|
|
* @param name Name of the file or directory
|
|
* @param is_directory True if the entry is a directory
|
|
* @param[in] context User context
|
|
* @return true to process the entry, false to skip
|
|
*/
|
|
typedef bool (*tar_unpack_file_cb)(const char* name, bool is_directory, void* context);
|
|
|
|
/** Set per-entry callback on unpacking
|
|
* @param archive Tar archive object
|
|
* @param callback Callback function
|
|
* @param[in] context User context
|
|
*/
|
|
void tar_archive_set_file_callback(TarArchive* archive, tar_unpack_file_cb callback, void* context);
|
|
|
|
/* Low-level API */
|
|
|
|
/** Add tar archive directory header
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
* @param[in] dirpath Path to the directory
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_dir_add_element(TarArchive* archive, const char* dirpath);
|
|
|
|
/** Add tar archive file header
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
* @param[in] path Path to the file
|
|
* @param data_len Size of the file
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_file_add_header(TarArchive* archive, const char* path, const int32_t data_len);
|
|
|
|
/** Add tar archive file data block
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
* @param[in] data_block Data block
|
|
* @param block_len Size of the data block
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_file_add_data_block(
|
|
TarArchive* archive,
|
|
const uint8_t* data_block,
|
|
const int32_t block_len);
|
|
|
|
/** Finalize tar archive file
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_file_finalize(TarArchive* archive);
|
|
|
|
/** Store data in tar archive
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
* @param[in] path Path to the file
|
|
* @param[in] data Data to store
|
|
* @param data_len Size of the data
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_store_data(
|
|
TarArchive* archive,
|
|
const char* path,
|
|
const uint8_t* data,
|
|
const int32_t data_len);
|
|
|
|
/** Finalize tar archive
|
|
*
|
|
* @param archive Tar archive object. Must be opened in write mode
|
|
*
|
|
* @return true if successful
|
|
*/
|
|
bool tar_archive_finalize(TarArchive* archive);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|