mirror of
				https://github.com/eledio-devices/thirdparty-miniz.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Add flag to set (compressed) size in local file header
This commit is contained in:
		
							
								
								
									
										53
									
								
								miniz_zip.c
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								miniz_zip.c
									
									
									
									
									
								
							| @@ -3437,7 +3437,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | |||||||
| mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, | mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, | ||||||
|                                 const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) |                                 const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) | ||||||
| { | { | ||||||
|     mz_uint16 gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; |     mz_uint16 gen_flags = (level_and_flags & MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE) ? 0 : MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; | ||||||
|     mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; |     mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; | ||||||
|     mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; |     mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; | ||||||
|     mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; |     mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; | ||||||
| @@ -3447,7 +3447,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA | |||||||
|     mz_uint32 extra_size = 0; |     mz_uint32 extra_size = 0; | ||||||
|     mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; |     mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; | ||||||
|     mz_zip_internal_state *pState; |     mz_zip_internal_state *pState; | ||||||
| 	mz_uint64 file_ofs = 0; |     mz_uint64 file_ofs = 0, cur_archive_header_file_ofs; | ||||||
|  |  | ||||||
|     if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) |     if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) | ||||||
|         gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; |         gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; | ||||||
| @@ -3546,8 +3546,14 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA | |||||||
|         if (max_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) |         if (max_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) | ||||||
|         { |         { | ||||||
|             pExtra_data = extra_data; |             pExtra_data = extra_data; | ||||||
|             extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (max_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, |             if (level_and_flags & MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE) | ||||||
|                                                                (max_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); |                 extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (max_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, | ||||||
|  |                                                                (max_size >= MZ_UINT32_MAX) ? &comp_size : NULL, | ||||||
|  |                                                                 (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||||
|  |             else | ||||||
|  |                 extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, NULL, | ||||||
|  |                                                                    NULL, | ||||||
|  |                                                                    (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), 0, 0, 0, method, gen_flags, dos_time, dos_date)) |         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), 0, 0, 0, method, gen_flags, dos_time, dos_date)) | ||||||
| @@ -3703,6 +3709,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA | |||||||
|         pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); |         pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (!(level_and_flags & MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE)) | ||||||
|     { |     { | ||||||
|         mz_uint8 local_dir_footer[MZ_ZIP_DATA_DESCRIPTER_SIZE64]; |         mz_uint8 local_dir_footer[MZ_ZIP_DATA_DESCRIPTER_SIZE64]; | ||||||
|         mz_uint32 local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE32; |         mz_uint32 local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE32; | ||||||
| @@ -3730,6 +3737,44 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA | |||||||
|         cur_archive_file_ofs += local_dir_footer_size; |         cur_archive_file_ofs += local_dir_footer_size; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (level_and_flags & MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE) | ||||||
|  |     { | ||||||
|  |         if (pExtra_data != NULL) | ||||||
|  |         { | ||||||
|  |             extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (max_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, | ||||||
|  |                                                                (max_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, | ||||||
|  |                                                    (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), | ||||||
|  |                                                    (max_size >= MZ_UINT32_MAX) ? MZ_UINT32_MAX : uncomp_size,  | ||||||
|  |                                                     (max_size >= MZ_UINT32_MAX) ? MZ_UINT32_MAX : comp_size, | ||||||
|  |                                                    uncomp_crc32, method, gen_flags, dos_time, dos_date)) | ||||||
|  |             return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); | ||||||
|  |  | ||||||
|  |         cur_archive_header_file_ofs = local_dir_header_ofs; | ||||||
|  |  | ||||||
|  |         if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_header_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) | ||||||
|  |             return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); | ||||||
|  |  | ||||||
|  |         if (pExtra_data != NULL) | ||||||
|  |         { | ||||||
|  |             cur_archive_header_file_ofs += sizeof(local_dir_header); | ||||||
|  |  | ||||||
|  |             if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_header_file_ofs, pArchive_name, archive_name_size) != archive_name_size) | ||||||
|  |             { | ||||||
|  |                 return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             cur_archive_header_file_ofs += archive_name_size; | ||||||
|  |  | ||||||
|  |             if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_header_file_ofs, extra_data, extra_size) != extra_size) | ||||||
|  |                 return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); | ||||||
|  |  | ||||||
|  |             cur_archive_header_file_ofs += extra_size; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (pExtra_data != NULL) |     if (pExtra_data != NULL) | ||||||
|     { |     { | ||||||
|         extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, |         extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, | ||||||
|   | |||||||
| @@ -97,7 +97,10 @@ typedef enum { | |||||||
|     MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY = 0x2000,     /* validate the local headers, but don't decompress the entire file and check the crc32 */ |     MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY = 0x2000,     /* validate the local headers, but don't decompress the entire file and check the crc32 */ | ||||||
|     MZ_ZIP_FLAG_WRITE_ZIP64 = 0x4000,               /* always use the zip64 file format, instead of the original zip file format with automatic switch to zip64. Use as flags parameter with mz_zip_writer_init*_v2 */ |     MZ_ZIP_FLAG_WRITE_ZIP64 = 0x4000,               /* always use the zip64 file format, instead of the original zip file format with automatic switch to zip64. Use as flags parameter with mz_zip_writer_init*_v2 */ | ||||||
|     MZ_ZIP_FLAG_WRITE_ALLOW_READING = 0x8000, |     MZ_ZIP_FLAG_WRITE_ALLOW_READING = 0x8000, | ||||||
|     MZ_ZIP_FLAG_ASCII_FILENAME = 0x10000 |     MZ_ZIP_FLAG_ASCII_FILENAME = 0x10000, | ||||||
|  |     /*After adding a compressed file, seek back | ||||||
|  |     to local file header and set the correct sizes*/ | ||||||
|  |     MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE = 0x20000 | ||||||
| } mz_zip_flags; | } mz_zip_flags; | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
| @@ -384,6 +387,7 @@ MINIZ_EXPORT mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, c | |||||||
| 	const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data_local, mz_uint user_extra_data_local_len, | 	const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data_local, mz_uint user_extra_data_local_len, | ||||||
| 	const char *user_extra_data_central, mz_uint user_extra_data_central_len); | 	const char *user_extra_data_central, mz_uint user_extra_data_central_len); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef MINIZ_NO_STDIO | #ifndef MINIZ_NO_STDIO | ||||||
| /* Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. */ | /* Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. */ | ||||||
| /* level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. */ | /* level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user