Files

========================================================================
The gphoto2 device database (gp2ddb)
========================================================================

Important: This is a prototype the developers can play with. The final
           version will probably look much different, so don't invest
           too much in it (yet).

References:
  [1] http://article.gmane.org/gmane.comp.multimedia.gphoto.devel/2262
      Hubert's posting from 2006-01-01 proposing storage in XML.


Note: We try to talk of "devices" and "drivers" instead of "cameras"
      and "camlibs" since we also support digital audio players.


=============================================
The idea
========

 * Maintain a device database (DDB) of cameras (and audio players),
   their abilities etc. independently from the libgphoto2 drivers.

 * Updates to the database are much easier to publish than updates to
   the drivers which need to be compiled.

 * libgphoto2 uses the DDB to find out which driver to load for a
   given device.

 * drivers use the DDB to read special driver specific information on
   that device.

 * Other software (HAL, udev, hotplug, etc.) is served by converters
   from DDB.


=============================================
The implementation
==================

 * A flex/bison based parser for text based config.

 * The specific details of the text format is not completely ironed
   out yet.

 * It is possible to use some HAL device database instead, but do we
   really want to require HAL/XML/...? Depends whether we target
   embedded or desktop environments.

 * print-camera-list prints the current config in the new format
   (minus driver internal settings ?)

 * driver specific settings can be accommodated using the
   driver_options { ... }; section.

 * The binary code (stripped) for the test case is about 22KByte. I
   suppose we could implement this database in about 35 to 40 KByte.
   However, we can probably get rid of some code in the drivers to
   compensate. 
   For comparison:
    * The current libgphoto2.so is about 120 KByte stripped. 
    * libxml2.so is 1.2MB (stripped).


=============================================
The testcase
============

 * The testcase check-ddb.sh checks that the CameraAbilitiesList read
   from the text database is the same one read from the drivers via
   gp_abilities_list_load() - for all 700something cameras.


=============================================
How to test it
==============

 * Add --enable-gp2ddb to your ./configure parameters.

 * Run "make check".

 * Have a look into tests/ddb/.


=============================================
TODO
====

What would need to be done to go into production with this:

 * Find a way to integrate the gphoto2 DDB with the HAL device 
   database, possibly using a sub/superset of the HAL device
   database. However, HAL does its stuff in XML, and we probably don't
   want libgphoto2 to depend on an XML parser.

 * Add driver specific parameters to DDB.

 * Rewrite gp_abilities_list_load() to read the data currently stored
   in the CameryAbilities records and all driver specific information
   from the DDB.

   This should probably use a caching approach, i.e. it should check
   the mtime of (the files in) /etc/libgphoto2.d/ and compare that to
   the mtime of a binary cache file in ~/.gphoto/ddb-cache.

   The compiler which creates this cache file needs to be embedded in
   libgphoto2 itself (so that libgphoto2 can "just work") but should
   also be available as a separate tool for embedded use cases. These
   embedded systems could then compile the ddb-cache at build time,
   just read in the cache, and not ship the parser/compiler at all.

   Another possibility would be to statically compile the binary
   version of the database into libgphoto2 for small-footprint
   applications.

 * Rewrite all drivers to read their device specific parameters from
   the new CameraAbilities record.

 * Maintain binary compatibility for applications.

 * Administration utilities convert the DDB to something HAL, udev, and
   other similar hotplug-device-management systems use to figure out
   the device type, what program to launch to handle such devices, and
   how to set up permissions. This is partly done in print-camera-list.

 * Administration utilities to maintain the DDB in the face of

     - updates from the gphoto project
     - updates by the user
     - update by third parties

   One solution to the problem could be a directory structure like

      /etc/libgphoto2.d/camlib-agfa.ddb # the devices from the agfa camlib
      /etc/libgphoto2.d/camlib-canon.ddb # the devices from the canon camlib
      /etc/libgphoto2.d/camlib-ptp2.ddb # the devices from the ptp2 camlib
      /etc/libgphoto2.d/foo.ddb # devices the user got from somewhere
      /etc/libgphoto2.d/bar.ddb # devices the user got from somewhere

 * Check whether there wouldn't be an XML parsing library with a much
   smaller footprint than the 1.2MB of libxml2.

 * The DDB device names should be Unicode strings.

 * There must be structured information on device names, e.g. the
   vendor must be readable without parsing strings.

 * Store other device information in the DDB which may be of interest
   for a libgphoto2 frontend, e.g.
    - thumbnail images of the devices themselves.
    - camera features like capture modes, can delete single files, can
      delete all files, can mark downloaded files, can upload files


========================================================================
End of file README.ddb.
========================================================================