API Plans
=========

Encryption
----------
* struct zip *zip_open_encrypted(const char *path, int flags, const char *password, int *errorp);
* int zip_set_encryption(struct zip *archive, zip_uint64_t idx, zip_uint16_t method, const char *password);
* void zip_set_archive_encryption(struct zip *archive, zip_uint16_t method, const char *password);

Prefixes
--------
For example for adding extractors for self-extracting zip archives.
* zip_set_archive_prefix(struct zip *za, const zip_uint8_t *data, zip_uint64_t length);
* const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp);

Progress Callback
-----------------
Register callback; will be called from zip_close() after each file has been processed.
typedef void (*zip_progress_callback_t)(double);
void zip_register_progress_callback(zip_t *, zip_progress_callback_t);

API Issues
==========
! D zip_get_archive_comment has int *lenp argument.  Cleaner would be zip_uint32_t *.
	rename and fix.  which other functions for naming consistency?
! D rename remaining zip_XXX_{file,archive}_* to zip_{file,archive}_XXX_*?
* compression/crypt implementations: how to set error code on failure
* compression/crypt error messages a la ZIP_ER_ZLIB (no detailed info passing)
* check arguments for every entry point into libzip


Features
========
* support setting extra fields from zip_source
  . introduce layers of extra fields:
    . original
    . from zip_source
    . manually set
  . when querying extra fields, search all of them in reverse order
  . add whiteout (deleted) flag
  . allow invalid data flag, used when computing extra field size before writing data
  . new command ZIP_SOURCE_EXTRA_FIELDS
  . no support for multiple copies of same extra field
* delete all extra fields during zip_replace()
* function to copy file from one archive to another
* set O_CLOEXEC flag after fopen and mkstemp
* configure: use windows backends on windows
* add append-only mode writing file to disk incrementally to keep memory usage low
* add zipalign mode or tool that puts uncompressed data on an offset that's a multiple
  of four; used on Android to speed up loading of data
* install modify
  * rename to ziptool
  * write man page
  * add support for enums
  * add set_mtime_for_all

* support streaming output (creating new archive to e.g. stdout)
* add functions to:
  . read/set ASCII file flag? (wiz: more general options?)
* zip_commit (to finish changes without closing archive)
* add custom compression function support
* zip_fseek
* zip_source_zip: allow rewinding
* zipcmp: add option for file content comparison
* zipcmp: compare bit flags if paranoid
* zipcmp: compare external attributes/opsys if paranoid
* zipcmp: compare last_mod if paranoid (or with separate flag?)
* consistency
  . for stored files, test compressed = uncompressed
  . data descriptor
  . local headers come before central dir

* support for old compression methods?????


Bugs
====
* support InfoZIP encryption header extension (copy data descriptor for encrypted files)
! ensure that nentries is small enough not to cause overflow (size_t for entry, uint64 for CD on disk)
* fix OpenSUSE i686 regression failures
* fix open_filename_duplicate_consistency.test to fail
* check for limits imposed by format (central dir size, file size, extra fields, ...)
* _zip_u2d_time: handle localtime(3) failure
* POSIX: zip_open: check whether file can be created and fail if not
* fix inconsistent usage of valid flags (not checked in many places)
* cdr == NULL -> ER_NOENT vs. idx > cdir->nentry -> ER_INVAL inconsistent (still there?)


Cleanup
=======
* use bool
* use ZIP_SOURCE_SUPPORTS_{READABLE,SEEKABLE,WRITABLE}
* use zip_source_seek_compute_offset
* move compat refs from zipint.h to own file, and include that in zipint.h and src
* get rid of zip_get_{compression,encryption}_implementation
* use zip_*int*_t internally


Analysis
========
* pass through coverity


Infrastructure
==============
* create CMakefile.txt man page linking from links file


Test Case Issues
================
* unchange on added file
* test seek in zip_source_crc
* test cases for set_extra*, delete_extra*, *extra_field*
* test cases for in memory archives
  add
  delete
  delete all
  modify
* use gcov output to increase test coverage
* merge most tools into modify
* add test case to change values for newly added files (name, compression method, comment, mtime, . . .)
* zip_open file less than EOCDLEN bytes long
* test calls against old API
* run regression tests also from CMake framework
* rename file to dir/ and vice versa (fails)
* fix comment test to be newline insensitive
* check if http://bugs.python.org/issue20078 provides ideas for new tests

* (add, replace)
	add to empty zip
	add to existing zip
	add w/ existing file name [E]
	replace ok
	replace w/ illegal index [E]
	replace w/ deleted name [E]
	unchange added/replaced file
* (close)
	copy zip file
	open copy
	rename, delete, replace, add w/ new name, add w/ deleted name
	close
	zipcmp copy expected
	remove copy
* (error_get)
* (error_get_sys_type)
* (error_to_str)
* (extra_fields)
* (file_error_get)
* (file_strerror)
* (replace)
* (source_buffer)
* (source_file)
* (source_filep)
* (source_free)
* (source_function)
* (source_zip)
* (strerror)
* (unchange)
* (unchange_all)
* open(ZIP_RDONLY)
* I/O abstraction layer
    zip_open_from_source
* read two zip entries interleaved


Unsorted
========
* zip_source_file: don't allow write if start/len specify a part of the file
* script to check if all exported symbols are marked with ZIP_EXTERN, add to make distcheck

D re-implement fix for OS X sandboxing (zip_archive_set_tempdir).

* document: zip_source_write: length can't be > ZIP_INT64_MAX
* document: ZIP_SOURCE_CLOSE implementation can't return error
* keep error codes in man pages in sync
* document error codes in new man pages
