NEWS
----

New in 2.0.1:
* pypi required .tar.gz
* cups.require couldn't handle version bigger than 1

New in 2.0.0:
* dropped macros for older CUPS < 2.0.0
* dropped Python 2 support and its related macros
* update license headers
* thread did not hold GIL when called Py_XDECREF() from destroy_TLS(), causing SIGSEGV(Fedora bug #1816107)
* fixed several compiler warnings
* fix silent error on Connection.printFiles() (patch by Wilbert Berendsen)

New in 1.9.74:
* fix Connection_writeRequestData with binary data (https://github.com/zdohnal/pycups/pull/1)
* misspelling (patch by Edward Betts)
* fixed print function in example/cupstree.py (patch by Jiri Popelka)

New in 1.9.73:

* Fixed build for CUPS 1.6.3 by making several constants conditional
  on CUPS >= 1.7.

New in 1.9.72:

* Removed private CANCEL_DOCUMENT, GET_DOCUMENT_ATTRIBUTES,
  GET_DOCUMENTS, DELETE_DOCUMENT, SET_DOCUMENT_ATTRIBUTES IPP
  operation constants.
* Fixed build for CUPS 1.4 by making several constants conditional on
  CUPS >= 1.5.

New in 1.9.71:

* Fixes for cups.IPP_JOB_CANCELED, cups.IPP_ERROR_JOB_CANCELED,
  cups.IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED,
  cups.IPP_AUTHENTICATION_CANCELED,
  cups.IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED, and
  cups.IPP_UPGRADE_REQUIRED.

New in 1.9.70:

* cups.ippErrorString(). Fixed build with CUPS 1.5. New-style (CUPS
  1.6) naming for HTTP status (cups.HTTP_STATUS_*), IPP orientation
  (cups.IPP_ORIENT_*), IPP status (cups.IPP_STATUS_*), and IPP
  I/O (cups.IPP_STATE_*) constants.

New in 1.9.69:

* cups.IPPRequest.operation, cups.IPPRequest.state,
  cups.IPPRequest.statuscode, cups.ippOpString(), cups.IPP_OP_*,
  cups.IPPRequest.addSeparator(), cups.IPPRequest.add(),
  cups.IPPRequest.writeIO().

New in 1.9.68:

* Now builds against CUPS 2.0.
* The rpm provider script is now Python3.

New in 1.9.67:

* Bindings for streaming API: cups.CUPS_FORMAT_* constants, cups.createJob(),
  cups.startDocument(), cups.writeRequestData(), cups.finishDocument().

New in 1.9.66:

* Python 3 support.

New in 1.9.65:

* cups.connectDest() API fix: now returns a tuple.
* cups.enumDests(), cups.connectDest(), and cups.CUPS_DEST_FLAGS_*
  constants (requires CUPS 1.6).

New in 1.9.63:

* cups.IPPError tuple now contains the specific error string, if one
  is available.

New in 1.9.62:

* Define all constants regardless of which version of CUPS is built
  against.

New in 1.9.60:

* New constants from 1.5:
  - IPP_AUTHENTICATION_CANCELED
  - IPP_PKI_ERROR
  - HTTP_NOT_IMPLEMENTED
  - HTTP_BAD_GATEWAY
  - HTTP_SERVICE_UNAVAILABLE
  - HTTP_GATEWAY_TIMEOUT
  - HTTP_NOT_SUPPORTED
  - HTTP_AUTHORIZATION_CANCELED
  - HTTP_PKI_ERROR

New in 1.9.59:

* Password callbacks can now return None to indicate they want to
  abort the current operation.

New in 1.9.58:

* cups.Connection.adminExportSamba

New in 1.9.57:

* Fixed rpm provides script for newer versions of rpm.

New in 1.9.56:

* Builds against older versions of CUPS again.

New in 1.9.55:

* cups.IPP_QUALITY_DRAFT, cups.IPP_QUALITY_NORMAL,
  cups.IPP_QUALITY_HIGH
* cups.IPP_PORTRAIT, cups.IPP_LANDSCAPE, cups.IPP_REVERSE_PORTRAIT,
  cups.IPP_REVERSE_LANDSCAPE
* cups.IPP_RES_UNITS_CM, cups.IPP_RES_UNITS_INCH
* Support for IPP_TAG_RESOLUTION as triplet (xres, yres, units).

New in 1.9.52:

* cups.Connection.getPPDs2(): New method, identical to getPPDs() but
  returning all attribute values as lists.

New in 1.9.50:

* cups.Connection.getPPD3()
* cups.Connection.getJobs() now takes optional requested_attributes argument.
* cups.Connection.getPrinterAttributes(): member-names is now always a list.
* cups.HTTP_NOT_MODIFIED constant.
* cups.PPD_ORDER_ANY constant.
* cups.PPD_ORDER_DOCUMENT constant.
* cups.PPD_ORDER_EXIT constant.
* cups.PPD_ORDER_JCL constant.
* cups.PPD_ORDER_PAGE constant.
* cups.PPD_ORDER_PROLOG constant.
* cups.PPD.emitString() method.
* cups.PPD.emit() method.
* cups.PPD.emitAfterOrder() method.
* cups.PPD.emitFd() method.
* cups.PPD.emitJCL() method.
* cups.PPD.emitJCLEnd() method.

New in 1.9.48:

* cups.Connection.cancelJob()'s optional second argument is now a keyword.

New in 1.9.47:

* cups.Connection.restartJob() now takes optional job_hold_until argument.
* cups.Connection.cancelJob() now takes optional purge_job argument.
* cups.setPasswordCB2() method.
* cups.Connection.moveJob() method.
* cups.IPPAttribute and cups.IPPRequest types.
* IPP state constants.
* cups.Connection.getDevices() now takes optional timeout argument.

New in 1.9.46:

* cups.Connection.getDevices() now takes optional limit,
  exclude_schemes and include_schemes arguments.
* cups.Connection.getPPDs() now takes optional limit, exclude_schemes,
  include_schemes, ppd_device_id, ppd_make, ppd_make_and_model,
  ppd_model_number, ppd_product, ppd_psversion, ppd_type and
  ppd_natural_language arguments.
* cups.ppdSetConformance() method.
* cups.PPD_CONFORM_RELAXED constant.
* cups.PPD_CONFORM_STRICT constant.
* cups.modelSort() now accepts Unicode strings.

New in 1.9.45:

* cups.PPD.localizeIPPReason()
* cups.PPD.localizeMarkerName()

New in 1.9.42:

* cups.Connection.getJobAttributes() now takes optional requested_attributes
  argument.
* cups.Connection.getJobs() now takes optional limit and first_job_id
  arguments.

New in 1.9.41:

* cups.Connection.putFile() now accepts a file descriptor or a Python
  file object as the destination.

New in 1.9.40:

* cups.Connection() now takes optional arguments host, port, and
  encryption.
* cups.Connection.getPrinterAttributes() now takes an optional
  requested_attributes argument

New in 1.9.39:

* cups.Connection.authenticateJob() auth parameter is now optional
* cups.Connection.printFile()
* cups.Connection.printFiles()

New in 1.9.38:

* cups.Connection.getFile() now accepts a file descriptor or a Python file
  object as the destination.

New in 1.9.37:

* cups.Connection.authenticateJob()
* cups.CUPS_PRINTER_DISCOVERED

New in 1.9.36:

* cups.Connection.renewSubscription() now takes an optional parameter
  lease_duration.
* cups.Connection.getJobAttributes() and
  cups.Connection.getNotifications(): State reasons are now lists as they
  ought to be.

New in 1.9.35:

* cups.Connection.getJobAttributes()
* cups.Connection.cancelAllJobs()

New in 1.9.32:

* cups.Connection.getPrinterAttributes() now takes a uri keyword argument
  for fetching attributes from non-CUPS IPP servers.

New in 1.9.31:

* cups.Connection.getDocument()
* cups.Connection.getDefault()

New in 1.9.29:

* IPP attribute strings are now represented as Unicode objects.

New in 1.9.28:

* cups.Connection.getDests() now includes a (None,None) key in its result
  for identifying the default printer.  This is intended to be equivalent
  to cupsGetDest(NULL, NULL, ...).

New in 1.9.27:

* IPP attributes with type IPP_TAG_NOVALUE now take Python value None.

New in 1.9.25:

* cups.CUPS_SERVER_REMOTE_ANY (for CUPS 1.3)
* cups.Connection.getServerPPD()

New in 1.9.23:

* cups.require()

New in 1.9.22:

* cups.Connection.getPPDs() and cups.Connection.getDevices() now allow
  threads during the IO request
* cups.Connection.printTestPage() now optionally takes more parameters
  than just the printer name

New in 1.9.21:

* cups.Connection.getSubscriptions()
* cups.Connection.createSubscription()
* cups.Connection.getNotifications()
* cups.Connection.renewSubscription()
* cups.Connection.cancelSubscription()
* cups.CUPS_PRINTER_COMMANDS

New in 1.9.20:

* cups.Connection.getPrinters() 'printer-state-reasons' attribute is now a
  list (as it ought to have been originally).

New in 1.9.19:

* cups.IPP_JOB_* job states

New in 1.9.18:

* cups.Connection.getJobs() now includes job-state, job-preserved,
  time-at-creation, time-at-processing, time-at-completed, job-media-sheets,
  and job-media-sheets-completed attributes.
* cups.Connection.getJobs() has new optional parameters which_jobs and
  my_jobs.
* cups.Connection.setJobHoldUntil()
* cups.Connection.restartJob()

New in 1.9.17:

* cups.PPD.localize()

New in 1.9.16:

* cups.Connection.getPrinters() now includes printer-state-message and
  printer-state-reasons attributes
* cups.Connection.disablePrinter() and cups.Connection.rejectJobs()
  now take an optional 'reason' keyword argument and use it to set
  printer-state-message
* cups.Connection.getJobs() now includes job-priority attribute

New in 1.9.15:

* cups.Connection.getJobs()
* cups.Connection.cancelJob()

New in 1.9.13:

* cups.HTTP_FORBIDDEN

New since 1.9.10:

* cups.HTTP_* status codes

New since 1.9.9:

* cups.Connection getClasses() handles IPP_NOT_FOUND
* PYCUPS_DEBUG environment variable controls debugging output

New since 1.9.8:

* cups.Connection.addPrinterOptionDefault() now supports lists and tuples
* cups.Connection.getPrinterAttributes() now handles multi-valued default
  options as lists
* cups.IPP_FINISHINGS_* constants
* cups.Connection getPrinters() handles IPP_NOT_FOUND

New since 1.9.7:

* cups.Connection.adminGetServerSettings()
* cups.Connection.adminSetServerSettings()
* cups.CUPS_SERVER_* string constants

New since 1.9.6:

* threading support
* cups.Dest type
* cups.Connection.addPrinterOptionDefault()
* cups.Connection.deletePrinterOptionDefault()
* cups.Connection.getDests()

New since 1.9.5:

* cups.Attribute object
* cups.PPD.attributes
* cups.PPD.findAttr()
* cups.PPD.findNextAttr()

New since 1.9.4:

* cups.Connection.setPrinterShared() now handles classes
* cups.Connection.printTestPage()
* cups.Connection.getPPDs() includes ppd-make attribute
* cups.IPP_MAX_NAME

New since 1.9.3:

* cups.Connection.enablePrinter() uses IPP_PAUSE_PRINTER
* cups.Connection.disablePrinter() uses IPP_RESUME_PRINTER
* cups.Connection.deleteClass()
* cups.Connection.setPrinterLocation() and
  cups.Connection.setPrinterInfo() now handle classes

New since 1.9.2:

* cups.PPD.* now convert from the PPD character set encoding
* cups.Connection.setPrinterPublished() is now renamed to
  cups.Connection.setPrinterShared()
* cups.Connection.setPrinterUsersAllowed()
* cups.Connection.setPrinterUsersDenied()

New since 1.9.1:

* fixed cups.Connection.setPrinterInfo()
* fixed cups.Connection.setPrinterLocation()
* cups.Connection.getPrinterAttributes()
* cups.Connection.setPrinterJobSheets()
* cups.Connection.setPrinterErrorPolicy()
* cups.Connection.setPrinterOpPolicy()
* cups.PPD.nondefaultsMarked()
* cups.IPP_* error constants

New since 1.9.0:

* cups.Constraint type
* cups.IPPError now includes the cupsLastErrorString()
* cups.IPP_PRINTER_* constants
* cups.setPort()
* cups.getUser()
* cups.getServer()
* cups.getPort()
* cups.getEncryption()

* cups.PPD.constraints attribute
* cups.PPD.getOptionGroups() method changed to optionGroups attribute
* cups.PPD.Group.options is a list, not a dict
* cups.PPD.findOption()
* cups.PPD.writeFd()

* cups.Connection.addPrinter now allows ppdname="foo.ppd" keyword for
  installed PPDs; also info, location, device and ppd keywords
* cups.Connection.getPPDs()
* cups.Connection.getDevices()
* cups.Connection.getClasses()
* cups.Connection.setPrinterInfo()
* cups.Connection.setPrinterLocation()
* cups.Connection.setPrinterPublished()
