Filters add the capability to handle a new format, by translating it to another, already known format. The browser may even try to daisy chain filters, to arrive at a format it knows. Their signature consists of:
One or more pairs of (MIME-like) types.
The object file(s) to load.
A suffix to add to function names.
Question: Do we need a `degradation factor' to describe to the browser how much information will (typically) be lost in the conversion?
A filter must export the following functions:
Bool initXXX(char ***from, char ***to, int
*nrfromto, float **qual)
Initialized private variables and returns the list of
transformations that the filter can do. Each string in
to is a MIME type. The
qual array must be exactly as long as the
from array and contain numbers between 0.0 and 1.0.
When the function returns
FALSE, the errno variable holds
Bool openXXX(const char *from_type, const char
*from_params, const char *to_type, const char *to_params, long
The types are things like
FALSE in case of
an error. See
errno for error
int readXXX(long id, char *buf,
Returns number of (converted) characters read. -1 with an
EAGAIN means that no
converted characters are available yet and a call to
writeXXX is required first. A return value of 0
indicates the end of the data.
int writeXXX(long id, const char
*buf, size_t nchars)
Returns number of characters actually written. A return of -1
indicates an error, 0 indicates that a call to
readXXX is required first. To indicate to the
filter that the end of the data is reached, call
Bool closeXXX(long id)
Should be called after the last
0. (For error codes, see
The browser must call these routines subject to the same constraints m.m. as for the agents.