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

* 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)
* Xcode 32bit build uses 64bit config.h
* 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
================
* 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
