
:mod:`ic` --- Access to the Mac OS X Internet Config
====================================================

.. module:: ic
   :platform: Mac
   :synopsis: Access to the Mac OS X Internet Config.


This module provides access to various internet-related preferences set through
:program:`System Preferences` or the :program:`Finder`.

.. index:: module: icglue

There is a low-level companion module :mod:`icglue` which provides the basic
Internet Config access functionality.  This low-level module is not documented,
but the docstrings of the routines document the parameters and the routine names
are the same as for the Pascal or C API to Internet Config, so the standard IC
programmers' documentation can be used if this module is needed.

The :mod:`ic` module defines the :exc:`error` exception and symbolic names for
all error codes Internet Config can produce; see the source for details.


.. exception:: error

   Exception raised on errors in the :mod:`ic` module.

The :mod:`ic` module defines the following class and function:


.. class:: IC([signature[, ic]])

   Create an Internet Config object. The signature is a 4-character creator code of
   the current application (default ``'Pyth'``) which may influence some of ICs
   settings. The optional *ic* argument is a low-level ``icglue.icinstance``
   created beforehand, this may be useful if you want to get preferences from a
   different config file, etc.


.. function:: launchurl(url[, hint])
              parseurl(data[, start[, end[, hint]]])
              mapfile(file)
              maptypecreator(type, creator[, filename])
              settypecreator(file)

   These functions are "shortcuts" to the methods of the same name, described
   below.


IC Objects
----------

:class:`IC` objects have a mapping interface, hence to obtain the mail address
you simply get ``ic['MailAddress']``. Assignment also works, and changes the
option in the configuration file.

The module knows about various datatypes, and converts the internal IC
representation to a "logical" Python data structure. Running the :mod:`ic`
module standalone will run a test program that lists all keys and values in your
IC database, this will have to serve as documentation.

If the module does not know how to represent the data it returns an instance of
the ``ICOpaqueData`` type, with the raw data in its :attr:`data` attribute.
Objects of this type are also acceptable values for assignment.

Besides the dictionary interface, :class:`IC` objects have the following
methods:


.. method:: IC.launchurl(url[, hint])

   Parse the given URL, launch the correct application and pass it the URL. The
   optional *hint* can be a scheme name such as ``'mailto:'``, in which case
   incomplete URLs are completed with this scheme.  If *hint* is not provided,
   incomplete URLs are invalid.


.. method:: IC.parseurl(data[, start[, end[, hint]]])

   Find an URL somewhere in *data* and return start position, end position and the
   URL. The optional *start* and *end* can be used to limit the search, so for
   instance if a user clicks in a long text field you can pass the whole text field
   and the click-position in *start* and this routine will return the whole URL in
   which the user clicked.  As above, *hint* is an optional scheme used to complete
   incomplete URLs.


.. method:: IC.mapfile(file)

   Return the mapping entry for the given *file*, which can be passed as either a
   filename or an :func:`FSSpec` result, and which need not exist.

   The mapping entry is returned as a tuple ``(version, type, creator, postcreator,
   flags, extension, appname, postappname, mimetype, entryname)``, where *version*
   is the entry version number, *type* is the 4-character filetype, *creator* is
   the 4-character creator type, *postcreator* is the 4-character creator code of
   an optional application to post-process the file after downloading, *flags* are
   various bits specifying whether to transfer in binary or ascii and such,
   *extension* is the filename extension for this file type, *appname* is the
   printable name of the application to which this file belongs, *postappname* is
   the name of the postprocessing application, *mimetype* is the MIME type of this
   file and *entryname* is the name of this entry.


.. method:: IC.maptypecreator(type, creator[, filename])

   Return the mapping entry for files with given 4-character *type* and *creator*
   codes. The optional *filename* may be specified to further help finding the
   correct entry (if the creator code is ``'????'``, for instance).

   The mapping entry is returned in the same format as for *mapfile*.


.. method:: IC.settypecreator(file)

   Given an existing *file*, specified either as a filename or as an :func:`FSSpec`
   result, set its creator and type correctly based on its extension.  The finder
   is told about the change, so the finder icon will be updated quickly.
