Annotation of libwww/Library/src/HTFormat.html, revision 2.42

2.10      timbl       1: <HTML>
                      2: <HEAD>
2.31      frystyk     3: <TITLE>The Format Manager in the WWW Library</TITLE>
2.15      timbl       4: <NEXTID N="z18">
2.10      timbl       5: </HEAD>
2.1       timbl       6: <BODY>
2.27      frystyk     7: 
2.31      frystyk     8: <H1>The Format Manager</H1>
2.33      frystyk     9: 
                     10: <PRE>
                     11: /*
2.41      frystyk    12: **     (c) COPYRIGHT MIT 1995.
2.33      frystyk    13: **     Please first read the full copyright statement in the file COPYRIGH.
                     14: */
                     15: </PRE>
2.31      frystyk    16: 
                     17: Here we describe the functions of the HTFormat module which handles
                     18: conversion between different data representations. (In MIME parlance,
                     19: a representation is known as a content-type. In <A
2.38      frystyk    20: HREF="http://www.w3.org/hypertext/WWW/TheProject.html">WWW</A> the
2.31      frystyk    21: term <EM>format</EM> is often used as it is shorter). The content of
                     22: this module is:
                     23: 
                     24: <UL>
2.42    ! frystyk    25: <LI><A HREF="#converter">Converters</A>
        !            26: <LI><A HREF="#user">User Preferences (media type, language, charset etc.)</A>
        !            27: <LI><A HREF="#Rank">Content Negotiation</A>
2.31      frystyk    28: <LI><A HREF="#z3">The Stream Stack</A>
                     29: </UL>
                     30: 
                     31: This module is implemented by <A HREF="HTFormat.c">HTFormat.c</A>, and
                     32: it is a part of the <A NAME="z10"
2.38      frystyk    33: HREF="http://www.w3.org/hypertext/WWW/Library/User/Guide/Guide.html">Library
2.31      frystyk    34: of Common Code</A>.
2.27      frystyk    35: 
2.31      frystyk    36: <PRE>
                     37: #ifndef HTFORMAT_H
2.1       timbl      38: #define HTFORMAT_H
                     39: 
2.31      frystyk    40: #include <A HREF="HTUtils.html">"HTUtils.h"</A>
                     41: #include <A HREF="HTStream.html">"HTStream.h"</A>
                     42: #include <A HREF="HTAtom.html">"HTAtom.h"</A>
                     43: #include <A HREF="HTList.html">"HTList.h"</A>
2.42    ! frystyk    44: #include <A HREF="HTAnchor.html">"HTAnchor.h"</A>
        !            45: #include <A HREF="HTAccess.html">"HTAccess.h"</A>
2.31      frystyk    46: </PRE>
2.1       timbl      47: 
2.42    ! frystyk    48: <A NAME="converter"><H2>Stream Converters</H2></A>
2.18      luotonen   49: 
2.42    ! frystyk    50: A <CODE><A NAME="z12">converter</A></CODE> is a stream with a special
        !            51: set of parameters and which is registered as capable of converting
        !            52: from a MIME type to something else (maybe another MIME-type). A
        !            53: converter is defined to be a function returning a stream and accepting
        !            54: the following parameters. The content type elements are atoms for
        !            55: which we have defined a prototype.
2.18      luotonen   56: 
2.31      frystyk    57: <PRE>
2.42    ! frystyk    58: typedef HTStream * HTConverter PARAMS((HTRequest *     request,
        !            59:                                        void *          param,
        !            60:                                        HTFormat        input_format,
        !            61:                                        HTFormat        output_format,
        !            62:                                        HTStream *      output_stream));
        !            63: </PRE>
2.18      luotonen   64: 
2.42    ! frystyk    65: <A NAME="user"><H2>User Preferences</H2></A>
2.31      frystyk    66: 
2.42    ! frystyk    67: The Library contains functionality for letting the application (or
        !            68: user) express the preferences for the rendition of a given data object
        !            69: when issuing a request. The categories supported are:
        !            70: 
        !            71: <UL>
        !            72: <LI>Content type (media type)
        !            73: <LI>Encoding
        !            74: <LI>Language
        !            75: <LI>Charset
        !            76: </UL>
2.17      luotonen   77: 
2.42    ! frystyk    78: There are two places where these preferences can be registered: in a
        !            79: <EM>global</EM> list valid for <B>all</B> requests and a
        !            80: <EM>local</EM> list valid for a particular request only. The elements
        !            81: are all <A HREF="HTAtom.html">atoms</A> representations. This allows
        !            82: faster manipulation (comparison and copying) that if we stayed with
        !            83: strings.
2.31      frystyk    84: 
2.42    ! frystyk    85: <A NAME="FormatTypes"><H3>Registration of Accepted Content Types</H3></A>
2.17      luotonen   86: 
2.42    ! frystyk    87: A <CODE>presenter</CODE> is a module (possibly an external program)
        !            88: which can present a graphic object of a certain MIME type to the
        !            89: user. That is, <CODE>presenters</CODE> are normally used to present
        !            90: objects that the <CODE>converters</CODE> are not able to handle. Data
        !            91: is transferred to the external program using for example the <A
        !            92: HREF="HTFWrite.html">HTSaveAndExecute</A> stream which writes to a
        !            93: local file. Both presenters and converters are of the type <A
        !            94: HREF="#converter">HTConverter</A>.
2.31      frystyk    95: 
                     96: <PRE>
2.42    ! frystyk    97: typedef struct _HTPresentation {
        !            98:     HTFormat   rep;                         /* representation name atomized */
        !            99:     HTFormat   rep_out;                         /* resulting representation */
        !           100:     HTConverter *converter;          /* The routine to gen the stream stack */
        !           101:     char *     command;                               /* MIME-format string */
        !           102:     char *     test_command;                          /* MIME-format string */
        !           103:     double     quality;                     /* Between 0 (bad) and 1 (good) */
        !           104:     double     secs;
        !           105:     double     secs_per_byte;
        !           106: } HTPresentation;
2.25      luotonen  107: 
2.42    ! frystyk   108: extern HTList * HTConversions;   /* Global list of converters and presenters */
2.28      frystyk   109: </PRE>
                    110: 
2.42    ! frystyk   111: <H4>Predefined Content Types</H4>
2.28      frystyk   112: 
2.42    ! frystyk   113: These macros (which used to be constants) define some basic internally
        !           114: referenced representations. The <CODE>www/xxx</CODE> ones are of
        !           115: course not MIME standard. <CODE>star/star</CODE> is an output format
        !           116: which leaves the input untouched. It is useful for diagnostics, and
        !           117: for users who want to see the original, whatever it is.
2.28      frystyk   118: 
                    119: <PRE>
                    120: #define WWW_SOURCE     HTAtom_for("*/*")      /* Whatever it was originally */
                    121: </PRE>
                    122: 
2.31      frystyk   123: <CODE>www/present</CODE> represents the user's perception of the
                    124: document.  If you convert to www/present, you present the material to
                    125: the user.
2.10      timbl     126: 
2.28      frystyk   127: <PRE>
                    128: #define WWW_PRESENT    HTAtom_for("www/present")   /* The user's perception */
                    129: </PRE>
                    130: 
                    131: The message/rfc822 format means a MIME message or a plain text message
                    132: with no MIME header. This is what is returned by an HTTP server.
                    133: 
                    134: <PRE>
                    135: #define WWW_MIME       HTAtom_for("www/mime")             /* A MIME message */
                    136: </PRE>
                    137: 
2.31      frystyk   138: <CODE>www/unknown</CODE> is a really unknown type.  Some default
                    139: action is appropriate.
2.13      timbl     140: 
2.28      frystyk   141: <PRE>
                    142: #define WWW_UNKNOWN     HTAtom_for("www/unknown")
2.13      timbl     143: </PRE>
2.28      frystyk   144: 
2.31      frystyk   145: These are regular MIME types defined. Others can be added!
2.28      frystyk   146: 
                    147: <PRE>
                    148: #define WWW_PLAINTEXT  HTAtom_for("text/plain")
2.1       timbl     149: #define WWW_POSTSCRIPT         HTAtom_for("application/postscript")
                    150: #define WWW_RICHTEXT   HTAtom_for("application/rtf")
2.10      timbl     151: #define WWW_AUDIO       HTAtom_for("audio/basic")
2.1       timbl     152: #define WWW_HTML       HTAtom_for("text/html")
2.11      timbl     153: #define WWW_BINARY     HTAtom_for("application/octet-stream")
2.26      frystyk   154: #define WWW_VIDEO      HTAtom_for("video/mpeg")
2.38      frystyk   155: #define WWW_GIF        HTAtom_for("image/gif")
2.28      frystyk   156: </PRE>
                    157: 
2.42    ! frystyk   158: <H4>Register a Presenter</H4>
2.31      frystyk   159: 
2.1       timbl     160: <DL>
2.31      frystyk   161: <DT>conversions
                    162: <DD>The list of <CODE>conveters</CODE> and <CODE>presenters</CODE>
                    163: <DT>representation
2.42    ! frystyk   164: <DD>the MIME-style format name
2.1       timbl     165: <DT>command
2.31      frystyk   166: <DD>the MAILCAP-style command template
2.1       timbl     167: <DT>quality
2.31      frystyk   168: <DD>A degradation faction [0..1]
2.1       timbl     169: <DT>maxbytes
2.31      frystyk   170: <DD>A limit on the length acceptable as input (0 infinite)
2.1       timbl     171: <DT>maxsecs
2.31      frystyk   172: <DD>A limit on the time user will wait (0 for infinity)
2.1       timbl     173: </DL>
                    174: 
2.31      frystyk   175: <PRE>
                    176: extern void HTSetPresentation  PARAMS((HTList *        conversions,
                    177:                                        CONST char *    representation,
                    178:                                        CONST char *    command,
                    179:                                        CONST char *    test_command,
2.37      frystyk   180:                                        double          quality,
                    181:                                        double          secs, 
                    182:                                        double          secs_per_byte));
2.31      frystyk   183: </PRE>
2.1       timbl     184: 
2.42    ! frystyk   185: <H4>Register a Converter</H4>
2.1       timbl     186: 
                    187: <DL>
2.31      frystyk   188: <DT>conversions
                    189: <DD>The list of <CODE>conveters</CODE> and <CODE>presenters</CODE>
2.1       timbl     190: <DT>rep_in
2.42    ! frystyk   191: <DD>the MIME-style format name
2.1       timbl     192: <DT>rep_out
2.31      frystyk   193: <DD>is the resulting content-type after the conversion
2.1       timbl     194: <DT>converter
2.31      frystyk   195: <DD>is the routine to call which actually does the conversion
                    196: <DT>quality
                    197: <DD>A degradation faction [0..1]
                    198: <DT>maxbytes
                    199: <DD>A limit on the length acceptable as input (0 infinite)
                    200: <DT>maxsecs
                    201: <DD>A limit on the time user will wait (0 for infinity)
2.1       timbl     202: </DL>
                    203: 
                    204: <PRE>
2.31      frystyk   205: extern void HTSetConversion    PARAMS((HTList *        conversions,
                    206:                                        CONST char *    rep_in,
                    207:                                        CONST char *    rep_out,
                    208:                                        HTConverter *   converter,
2.37      frystyk   209:                                        double          quality,
                    210:                                        double          secs, 
                    211:                                        double          secs_per_byte));
2.31      frystyk   212: </PRE>
                    213: 
2.42    ! frystyk   214: <H4>Set up Default Presenters and Converters</H4>
        !           215: 
        !           216: The <A HREF="HTInit.c">HTInit module</A> defines a default set of
        !           217: <CODE>converters</CODE> and <CODE>presenters</CODE>. However, no
        !           218: automatic initialization is done in the Library, so this is for the
        !           219: application to do!
        !           220: 
        !           221: <PRE>
        !           222: extern void HTFormatInit       PARAMS((HTList * conversions));
        !           223: </PRE>
        !           224: 
        !           225: <A NAME="Encoding"><H3>Registration of Accepted Content Encodings</H3></A>
        !           226: 
        !           227: Encodings are the HTTP extension of transfer encodings. Encodings
        !           228: include compress, gzip etc. These are the data structures:
        !           229: 
        !           230: <PRE>
        !           231: typedef struct _HTAcceptNode {
        !           232:     HTAtom *   atom;
        !           233:     double     quality;
        !           234: } HTAcceptNode;
        !           235: 
        !           236: extern HTList * HTEncodings;                    /* Global list of encodings */
        !           237: </PRE>
        !           238: 
        !           239: <H4>Predefined Encoding Types</H4>
        !           240: 
        !           241: <PRE>
        !           242: #define WWW_ENC_7BIT           HTAtom_for("7bit")
        !           243: #define WWW_ENC_8BIT           HTAtom_for("8bit")
        !           244: #define WWW_ENC_BINARY         HTAtom_for("binary")
        !           245: #define WWW_ENC_BASE64         HTAtom_for("base64")
        !           246: #define WWW_ENC_COMPRESS       HTAtom_for("compress")
        !           247: #define WWW_ENC_GZIP           HTAtom_for("gzip")
        !           248: </PRE>
        !           249: 
        !           250: <H4>Register an Encoding</H4>
        !           251: 
        !           252: <PRE>
        !           253: extern void HTAcceptEncoding   PARAMS((HTList *        list,
        !           254:                                        CONST char *    enc,
        !           255:                                        double          quality));
        !           256: </PRE>
2.31      frystyk   257: 
2.42    ! frystyk   258: <H3><A NAME="charset">Registration of Accepted Charsets</A></H3>
2.31      frystyk   259: 
2.42    ! frystyk   260: We use the same <CODE>HTAcceptNode</CODE> as above.
2.31      frystyk   261: 
                    262: <PRE>
2.42    ! frystyk   263: extern HTList * HTCharsets;                      /* Global list of charsets */
        !           264: </PRE>
        !           265: 
        !           266: <H4>Register a Charset</H4>
        !           267: 
        !           268: <PRE>
        !           269: extern void HTAcceptCharset    PARAMS((HTList *        list,
        !           270:                                        CONST char *    charset,
        !           271:                                        double          quality));
        !           272: </PRE>
        !           273: 
        !           274: <A NAME="Language"><H3>Registration of Accepted Content Languages</H3></A>
        !           275: 
        !           276: We use the same <CODE>HTAcceptNode</CODE> as above.
        !           277: 
        !           278: <PRE>
        !           279: extern HTList * HTLanguages;                    /* Global list of languages */
2.31      frystyk   280: </PRE>
                    281: 
2.42    ! frystyk   282: <H4>Register a Language</H4>
2.31      frystyk   283: 
                    284: <PRE>
2.42    ! frystyk   285: extern void HTAcceptLanguage   PARAMS((HTList *        list,
        !           286:                                        CONST char *    lang,
        !           287:                                        double          quality));
2.31      frystyk   288: </PRE>
                    289: 
2.42    ! frystyk   290: <H3>Garbage Collection of User Preferences</H3>
        !           291: 
        !           292: This is used for cleaning up the lists of user preferences, both the
        !           293: local and the global lists:
2.1       timbl     294: 
2.42    ! frystyk   295: <H3>Remove Local Preferences</H3>
        !           296: 
        !           297: The function is called from <A HREF="HTAccess.html#z100">HTRequest_delete</A>.
2.1       timbl     298: 
2.31      frystyk   299: <PRE>
                    300: extern void HTFormatDelete     PARAMS((HTRequest * request));
                    301: </PRE>
                    302: 
2.42    ! frystyk   303: <H3>Remove Global Preferences</H3>
        !           304: 
        !           305: The function is called from <A HREF="HTAccess.html#Library">HTLibTerminate</A>.
2.34      frystyk   306: 
                    307: <PRE>
                    308: extern void HTDisposeConversions NOPARAMS;
                    309: </PRE>
2.31      frystyk   310: 
                    311: <A NAME="Rank"><H2>Ranking of Accepted Formats</H2></A>
                    312: 
2.36      frystyk   313: This function is used when the best match among several possible
                    314: documents is to be found as a function of the accept headers sent in
                    315: the client request.
2.31      frystyk   316: 
                    317: <PRE>
2.42    ! frystyk   318: typedef struct _HTContentDescription {
        !           319:     char *     filename;
        !           320:     HTAtom *   content_type;
        !           321:     HTAtom *   content_language;
        !           322:     HTAtom *   content_encoding;
        !           323:     int                content_length;
        !           324:     double     quality;
        !           325: } HTContentDescription;
        !           326: 
2.32      frystyk   327: extern BOOL HTRank PARAMS((HTList * possibilities,
2.31      frystyk   328:                           HTList * accepted_content_types,
                    329:                           HTList * accepted_content_languages,
                    330:                           HTList * accepted_content_encodings));
2.1       timbl     331: </PRE>
2.31      frystyk   332: 
2.42    ! frystyk   333: <H2><A NAME="z3">The Stream Stack</A></H2>
2.31      frystyk   334: 
                    335: This is the routine which actually sets up the conversion. It
                    336: currently checks only for direct conversions, but multi-stage
                    337: conversions are forseen.  It takes a stream into which the output
                    338: should be sent in the final format, builds the conversion stack, and
                    339: returns a stream into which the data in the input format should be
2.42    ! frystyk   340: fed. If <CODE>guess</CODE> is true and input format is
2.31      frystyk   341: <CODE>www/unknown</CODE>, try to guess the format by looking at the
                    342: first few bytes of the stream. <P>
2.1       timbl     343: 
2.31      frystyk   344: <PRE>
2.32      frystyk   345: extern HTStream * HTStreamStack PARAMS((HTFormat       rep_in,
2.31      frystyk   346:                                        HTFormat        rep_out,
                    347:                                        HTStream *      output_stream,
                    348:                                        HTRequest *     request,
                    349:                                        BOOL            guess));
2.1       timbl     350: </PRE>
2.31      frystyk   351: 
2.42    ! frystyk   352: <H2>Cost of a Stream Stack</H2>
2.31      frystyk   353: 
                    354: Must return the cost of the same stack which HTStreamStack would set
2.1       timbl     355: up.
                    356: 
2.31      frystyk   357: <PRE>
2.37      frystyk   358: extern double HTStackValue     PARAMS((HTList *        conversions,
2.31      frystyk   359:                                        HTFormat        format_in,
                    360:                                        HTFormat        format_out,
2.37      frystyk   361:                                        double          initial_value,
2.31      frystyk   362:                                        long int        length));
                    363: 
2.42    ! frystyk   364: #endif /* HTFORMAT */
2.38      frystyk   365: </PRE>
                    366: 
2.42    ! frystyk   367: End of declaration module
2.31      frystyk   368: 
                    369: </BODY>
2.10      timbl     370: </HTML>

Webmaster