Guide to porting backends from 0.8.x to 0.9.x

 * Do not use pk_backend_job_message() -- either use an error if the transaction
   cannot or should not be run or just do the right thing. Users don't want to
   see technical messages from a package manager.

 * Remove the PkProvidesEnum parameter from pk_backend_what_provides() -- all
   provides should be done as if ANY is specified.

 * Remove pk_backend_get_provides() from any backend that implements it, it's no
   longer needed.

Guide to porting backends from 0.7.x to 0.8.x

 * Remove any Simulate* methods from pk-backend-*.c

 * There's no such thing as UpdateSystem anymore

 * Rename the 'gboolean only_trusted' arguments to
   'PkBitfield transaction_flags' in the following methods:
  - InstallFiles
  - InstallPackages
  - UpdateFiles

 * Add a 'PkBitfield transaction_flags' argument to the methods:
  - RemovePackages

 * If PK_TRANSACTION_FLAG_ENUM_ONLY_SIMULATE is set in transaction_flags
   then depsolve and return what would be done. Treat this just like
   the Simulate* methods, i.e. emit what would be done in an actual
   transaction.

 * If PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD is set in transaction_flags
   then depsolve and download any packages or metadata, but don't
   actually make any database changes or change any files

 * Switch the RemovePackages() arguments to match the D-Bus API if you're
   using a spawned backend, i.e.
   transaction_flags, package_ids, allow_deps, auto_remove

 * Remove any references to Rollback, it's no longer available.

 * pk_backend_job_thread_create now takes an additional user_data and
   GDestroyNotify parameter. The thread functions themselves now return
   void, rather than gboolean.

 * All the pk_backend_foo() backend functions that are intended to be
   run in a transaction take an additional PkBackendJob parameter after
   the PkBackend. Hopefully I've done a lot of the heavy lifting, but
   you might have to change a few (backend) to (job)'s yourself.

 * The pk_backend_get_uint() functions are removed, and threaded
   backends should now parse the GVariant params which is specific to
   the job, not the backend.

 * Remove any calls to pk_backend_set_sub_percentage() and replace them
   with calls to pk_backend_job_set_item_progress(package)

 * Spawned backends (i.e. those using pk_backend_spawn_new) *must* now
   manually set the backend by using pk_backend_spawn_set_backend() in
   pk_backend_initialize().

 * pk_backend_job_update_detail now takes a gchar** rather than a gchar* for
   the updates and obsoletes fields. No change is required for spawned
   backends.

 * pk_backend_job_update_detail now takes a gchar** rather than a gchar* for
   the vendor_urls, bugzilla_urls and cve_urls fields.
   All backends should remove any URL title (the bit before the ';') and
   *just* send the array of raw URLs.

 * Add calls to pk_backend_set_locked() to declare when your backend holds
   write-lock on its database. PackageKit will spawn multiple transactions
   which can read the database at any time. Not using this method will cause
   your backend to fail, as we then try to create multiple write transactions
   too.
   See the dummy backend for some examples.

 * Make your backend is threadsafe, so tasks can be executed in parallel.
   If your package manager is not threadsafe, create a new process and
   do IPC from the main thread, or - if possible - change your package manager
   to be threadsafe.
   If you managed to do this, add a new backend function
   "pk_backend_supports_parallelization" and let it return TRUE, so PackageKit
   can enable parallelization for your backend.
   Otherwise, PackageKit will fall-back to the old, non-parallel behaviour.
   Please try to enable parallelization, and use the non-parallel approach only
   if you have to, as some frontends will likely start to rely on beeing able
   to request data in parallel.

 * Fail any transactions which requires lock with PK_ERROR_ENUM_LOCK_REQUIRED.
   PackageKit will then requeue the transaction as soon as another transaction
   releases lock. If the transaction fails multiple times, PK will emit the
   PK_ERROR_ENUM_CANNOT_GET_LOCK signal to frontends. If you continue to use
   this in your backends directly, your backend won't work properly with
   parallel transactions.
   (if you don't use parallelization, you can still emit CANNOT_GET_LOCK)
