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

2.10      timbl       1: <HTML>
                      2: <HEAD>
2.45      frystyk     3: <TITLE>Format Negotiation Manager</TITLE>
2.60    ! frystyk     4: <!-- Changed by: Henrik Frystyk Nielsen,  3-Feb-1996 -->
2.15      timbl       5: <NEXTID N="z18">
2.10      timbl       6: </HEAD>
2.1       timbl       7: <BODY>
2.27      frystyk     8: 
2.31      frystyk     9: <H1>The Format Manager</H1>
2.33      frystyk    10: 
                     11: <PRE>
                     12: /*
2.41      frystyk    13: **     (c) COPYRIGHT MIT 1995.
2.33      frystyk    14: **     Please first read the full copyright statement in the file COPYRIGH.
                     15: */
                     16: </PRE>
2.31      frystyk    17: 
                     18: Here we describe the functions of the HTFormat module which handles
                     19: conversion between different data representations. (In MIME parlance,
                     20: a representation is known as a content-type. In <A
2.46      frystyk    21: HREF="http://www.w3.org/pub/WWW/TheProject.html">WWW</A> the
2.31      frystyk    22: term <EM>format</EM> is often used as it is shorter). The content of
                     23: this module is:
                     24: 
                     25: <UL>
2.42      frystyk    26: <LI><A HREF="#converter">Converters</A>
2.50      frystyk    27: <LI><A HREF="#user">Generic preferences (media type, language, charset etc.)</A>
                     28: <LI><A HREF="#global">Global Preferences</A>
2.42      frystyk    29: <LI><A HREF="#Rank">Content Negotiation</A>
2.31      frystyk    30: <LI><A HREF="#z3">The Stream Stack</A>
                     31: </UL>
                     32: 
                     33: This module is implemented by <A HREF="HTFormat.c">HTFormat.c</A>, and
2.49      frystyk    34: it is a part of the <A HREF="http://www.w3.org/pub/WWW/Library/"> W3C
                     35: Reference Library</A>.
2.27      frystyk    36: 
2.31      frystyk    37: <PRE>
                     38: #ifndef HTFORMAT_H
2.1       timbl      39: #define HTFORMAT_H
                     40: 
2.31      frystyk    41: #include <A HREF="HTUtils.html">"HTUtils.h"</A>
                     42: #include <A HREF="HTStream.html">"HTStream.h"</A>
                     43: #include <A HREF="HTAtom.html">"HTAtom.h"</A>
                     44: #include <A HREF="HTList.html">"HTList.h"</A>
2.42      frystyk    45: #include <A HREF="HTAnchor.html">"HTAnchor.h"</A>
2.47      frystyk    46: #include <A HREF="HTReq.html">"HTReq.h"</A>
2.31      frystyk    47: </PRE>
2.1       timbl      48: 
2.42      frystyk    49: <A NAME="converter"><H2>Stream Converters</H2></A>
2.18      luotonen   50: 
2.42      frystyk    51: A <CODE><A NAME="z12">converter</A></CODE> is a stream with a special
                     52: set of parameters and which is registered as capable of converting
                     53: from a MIME type to something else (maybe another MIME-type). A
                     54: converter is defined to be a function returning a stream and accepting
                     55: the following parameters. The content type elements are atoms for
                     56: which we have defined a prototype.
2.18      luotonen   57: 
2.31      frystyk    58: <PRE>
2.52      frystyk    59: typedef HTStream * HTConverter (HTRequest *    request,
                     60:                                 void *         param,
                     61:                                 HTFormat       input_format,
                     62:                                 HTFormat       output_format,
                     63:                                 HTStream *     output_stream);
2.42      frystyk    64: </PRE>
2.18      luotonen   65: 
2.50      frystyk    66: <A NAME="user"><H2>Generic Preferences</H2></A>
2.31      frystyk    67: 
2.42      frystyk    68: The Library contains functionality for letting the application (or
                     69: user) express the preferences for the rendition of a given data object
                     70: when issuing a request. The categories supported are:
                     71: 
                     72: <UL>
                     73: <LI>Content type (media type)
                     74: <LI>Encoding
                     75: <LI>Language
                     76: <LI>Charset
                     77: </UL>
2.17      luotonen   78: 
2.42      frystyk    79: <A NAME="FormatTypes"><H3>Registration of Accepted Content Types</H3></A>
2.17      luotonen   80: 
2.42      frystyk    81: A <CODE>presenter</CODE> is a module (possibly an external program)
                     82: which can present a graphic object of a certain MIME type to the
                     83: user. That is, <CODE>presenters</CODE> are normally used to present
                     84: objects that the <CODE>converters</CODE> are not able to handle. Data
                     85: is transferred to the external program using for example the <A
                     86: HREF="HTFWrite.html">HTSaveAndExecute</A> stream which writes to a
                     87: local file. Both presenters and converters are of the type <A
                     88: HREF="#converter">HTConverter</A>.
2.31      frystyk    89: 
                     90: <PRE>
2.42      frystyk    91: typedef struct _HTPresentation {
                     92:     HTFormat   rep;                         /* representation name atomized */
                     93:     HTFormat   rep_out;                         /* resulting representation */
                     94:     HTConverter *converter;          /* The routine to gen the stream stack */
                     95:     char *     command;                               /* MIME-format string */
                     96:     char *     test_command;                          /* MIME-format string */
                     97:     double     quality;                     /* Between 0 (bad) and 1 (good) */
                     98:     double     secs;
                     99:     double     secs_per_byte;
                    100: } HTPresentation;
2.28      frystyk   101: </PRE>
                    102: 
2.42      frystyk   103: <H4>Predefined Content Types</H4>
2.28      frystyk   104: 
2.42      frystyk   105: These macros (which used to be constants) define some basic internally
                    106: referenced representations. The <CODE>www/xxx</CODE> ones are of
2.52      frystyk   107: course not MIME standard. They are internal representations used in
                    108: the Library but they can't be exported to other apps!
2.28      frystyk   109: 
                    110: <PRE>
2.57      frystyk   111: #define WWW_RAW                HTAtom_for("www/void")   /* Raw output from Protocol */
2.28      frystyk   112: </PRE>
                    113: 
2.57      frystyk   114: <CODE>WWW_RAW</CODE> is an output format which leaves the input
2.54      frystyk   115: untouched <EM>exactly</EM> as it is received by the protocol
                    116: module. For example, in the case of FTP, this format returns raw ASCII
                    117: objects for directory listings; for HTTP, everything including the
                    118: header is returned, for Gopher, a raw ASCII object is returned for a
                    119: menu etc.
2.10      timbl     120: 
2.28      frystyk   121: <PRE>
2.57      frystyk   122: #define WWW_SOURCE     HTAtom_for("*/*")   /* Almost what it was originally */
                    123: </PRE>
                    124: 
                    125: <CODE>WWW_SOURCE</CODE> is an output format which leaves the input
                    126: untouched <EM>exactly</EM> as it is received by the protocol module
                    127: <B>IF</B> not a suitable converter has been registered with a quality
                    128: factor higher than 1 (for example 2). In this case the <EM>SUPER
                    129: CONVERTER</EM> is preferred for the raw output. This can be used as a
                    130: filter effect that allows conversion from, for example raw
                    131: FTPdirectory listings into HTML but passes a MIME body untouched.
                    132: 
                    133: <PRE>
2.28      frystyk   134: #define WWW_PRESENT    HTAtom_for("www/present")   /* The user's perception */
                    135: </PRE>
                    136: 
2.52      frystyk   137: <CODE>WWW_PRESENT</CODE> represents the user's perception of the
                    138: document.  If you convert to <CODE>WWW_PRESENT</CODE>, you present the
                    139: material to the user.
2.58      frystyk   140: 
                    141: <PRE>
                    142: #define WWW_DEBUG      HTAtom_for("www/debug")
                    143: </PRE>
                    144: 
                    145: <CODE>WWW_DEBUG</CODE> represents the user's perception of debug
                    146: information, for example sent as a HTML document in a HTTP redirection
                    147: message.
2.28      frystyk   148: 
                    149: <PRE>
2.52      frystyk   150: #define WWW_UNKNOWN     HTAtom_for("www/unknown")
2.28      frystyk   151: </PRE>
                    152: 
2.52      frystyk   153: <CODE>WWW_UNKNOWN</CODE> is a really unknown type. It differs from the
                    154: real MIME type <EM>"application/octet-stream"</EM> in that we haven't
                    155: even tried to figure out the content type at this point.<P>
2.28      frystyk   156: 
2.31      frystyk   157: These are regular MIME types defined. Others can be added!
2.28      frystyk   158: 
                    159: <PRE>
2.52      frystyk   160: #define WWW_HTML       HTAtom_for("text/html")
2.28      frystyk   161: #define WWW_PLAINTEXT  HTAtom_for("text/plain")
2.52      frystyk   162: 
                    163: #define WWW_MIME       HTAtom_for("message/rfc822")
2.60    ! frystyk   164: #define WWW_MIME_HEAD  HTAtom_for("message/x-rfc822-head")
2.52      frystyk   165: 
2.10      timbl     166: #define WWW_AUDIO       HTAtom_for("audio/basic")
2.52      frystyk   167: 
2.26      frystyk   168: #define WWW_VIDEO      HTAtom_for("video/mpeg")
2.52      frystyk   169: 
2.38      frystyk   170: #define WWW_GIF        HTAtom_for("image/gif")
2.52      frystyk   171: #define WWW_PNG        HTAtom_for("image/png")
                    172: 
                    173: #define WWW_BINARY     HTAtom_for("application/octet-stream")
                    174: #define WWW_POSTSCRIPT         HTAtom_for("application/postscript")
                    175: #define WWW_RICHTEXT   HTAtom_for("application/rtf")
2.48      frystyk   176: </PRE>
                    177: 
2.52      frystyk   178: We also have some MIME types that come from the various protocols when
                    179: we convert from ASCII to HTML.
2.48      frystyk   180: 
                    181: <PRE>
                    182: #define WWW_GOPHER_MENU HTAtom_for("text/x-gopher")
2.53      frystyk   183: #define WWW_CSO_SEARCH HTAtom_for("text/x-cso")
2.48      frystyk   184: 
                    185: #define WWW_FTP_LNST   HTAtom_for("text/x-ftp-lnst")
                    186: #define WWW_FTP_LIST   HTAtom_for("text/x-ftp-list")
                    187: 
                    188: #define WWW_NNTP_LIST   HTAtom_for("text/x-nntp-list")
                    189: #define WWW_NNTP_OVER  HTAtom_for("text/x-nntp-over")
                    190: #define WWW_NNTP_HEAD  HTAtom_for("text/x-nntp-head")
2.59      frystyk   191: 
                    192: #define WWW_HTTP       HTAtom_for("text/x-http")
2.55      frystyk   193: </PRE>
                    194: 
                    195: Finally we have defined a special format for our RULE files as they
                    196: can be handled by a special converter.
                    197: 
                    198: <PRE>
2.57      frystyk   199: #define WWW_RULES      HTAtom_for("application/x-www-rules")
2.28      frystyk   200: </PRE>
                    201: 
2.50      frystyk   202: <H4>Add a Presenter</H4>
                    203: 
                    204: This function creates a presenter object and adds to the list of
                    205: conversions.
2.31      frystyk   206: 
2.1       timbl     207: <DL>
2.31      frystyk   208: <DT>conversions
                    209: <DD>The list of <CODE>conveters</CODE> and <CODE>presenters</CODE>
2.50      frystyk   210: <DT>rep_in
2.42      frystyk   211: <DD>the MIME-style format name
2.50      frystyk   212: <DT>rep_out
                    213: <DD>is the resulting content-type after the conversion
                    214: <DT>converter
                    215: <DD>is the routine to call which actually does the conversion
2.1       timbl     216: <DT>quality
2.31      frystyk   217: <DD>A degradation faction [0..1]
2.1       timbl     218: <DT>maxbytes
2.31      frystyk   219: <DD>A limit on the length acceptable as input (0 infinite)
2.1       timbl     220: <DT>maxsecs
2.31      frystyk   221: <DD>A limit on the time user will wait (0 for infinity)
2.1       timbl     222: </DL>
                    223: 
2.31      frystyk   224: <PRE>
2.49      frystyk   225: extern void HTPresentation_add (HTList *       conversions,
                    226:                                CONST char *    representation,
                    227:                                CONST char *    command,
                    228:                                CONST char *    test_command,
                    229:                                double          quality,
                    230:                                double          secs, 
                    231:                                double          secs_per_byte);
2.31      frystyk   232: </PRE>
2.1       timbl     233: 
2.50      frystyk   234: <H4>Delete a list of Presenters</H4>
                    235: 
                    236: <PRE>
                    237: extern void HTPresentation_deleteAll   (HTList * list);
                    238: </PRE>
                    239: 
                    240: <H4>Add a Converter</H4>
                    241: 
                    242: This function creates a presenter object and adds to the list of
                    243: conversions.
2.1       timbl     244: 
                    245: <DL>
2.31      frystyk   246: <DT>conversions
                    247: <DD>The list of <CODE>conveters</CODE> and <CODE>presenters</CODE>
2.1       timbl     248: <DT>rep_in
2.42      frystyk   249: <DD>the MIME-style format name
2.1       timbl     250: <DT>rep_out
2.31      frystyk   251: <DD>is the resulting content-type after the conversion
2.1       timbl     252: <DT>converter
2.31      frystyk   253: <DD>is the routine to call which actually does the conversion
                    254: <DT>quality
                    255: <DD>A degradation faction [0..1]
                    256: <DT>maxbytes
                    257: <DD>A limit on the length acceptable as input (0 infinite)
                    258: <DT>maxsecs
                    259: <DD>A limit on the time user will wait (0 for infinity)
2.1       timbl     260: </DL>
                    261: 
                    262: <PRE>
2.49      frystyk   263: extern void HTConversion_add   (HTList *       conversions,
                    264:                                CONST char *    rep_in,
                    265:                                CONST char *    rep_out,
                    266:                                HTConverter *   converter,
                    267:                                double          quality,
                    268:                                double          secs, 
                    269:                                double          secs_per_byte);
2.42      frystyk   270: </PRE>
                    271: 
2.50      frystyk   272: <H4>Delete a list of Converters</H4>
                    273: 
                    274: <PRE>
                    275: extern void HTConversion_deleteAll     (HTList * list);
                    276: </PRE>
                    277: 
2.42      frystyk   278: <A NAME="Encoding"><H3>Registration of Accepted Content Encodings</H3></A>
                    279: 
                    280: Encodings are the HTTP extension of transfer encodings. Encodings
2.50      frystyk   281: include compress, gzip etc.
2.42      frystyk   282: 
                    283: <PRE>
                    284: typedef struct _HTAcceptNode {
                    285:     HTAtom *   atom;
                    286:     double     quality;
                    287: } HTAcceptNode;
                    288: </PRE>
                    289: 
                    290: <H4>Predefined Encoding Types</H4>
                    291: 
                    292: <PRE>
                    293: #define WWW_ENC_7BIT           HTAtom_for("7bit")
                    294: #define WWW_ENC_8BIT           HTAtom_for("8bit")
                    295: #define WWW_ENC_BINARY         HTAtom_for("binary")
                    296: #define WWW_ENC_BASE64         HTAtom_for("base64")
                    297: #define WWW_ENC_COMPRESS       HTAtom_for("compress")
                    298: #define WWW_ENC_GZIP           HTAtom_for("gzip")
                    299: </PRE>
                    300: 
                    301: <H4>Register an Encoding</H4>
                    302: 
                    303: <PRE>
2.50      frystyk   304: extern void HTEncoding_add (HTList *           list,
                    305:                            CONST char *        enc,
                    306:                            double              quality);
2.42      frystyk   307: </PRE>
2.31      frystyk   308: 
2.50      frystyk   309: <H4>Delete a list of Encoders</H4>
2.31      frystyk   310: 
2.50      frystyk   311: <PRE>
2.51      frystyk   312: extern void HTEncoding_deleteAll (HTList * list);
2.50      frystyk   313: </PRE>
                    314: 
                    315: <H3><A NAME="charset">Accepted Charsets</A></H3>
2.31      frystyk   316: 
2.42      frystyk   317: <H4>Register a Charset</H4>
                    318: 
                    319: <PRE>
2.50      frystyk   320: extern void HTCharset_add (HTList *            list,
                    321:                           CONST char *         charset,
                    322:                           double               quality);
2.42      frystyk   323: </PRE>
                    324: 
2.50      frystyk   325: <H4>Delete a list of Charsets</H4>
2.42      frystyk   326: 
2.50      frystyk   327: <PRE>
                    328: extern void HTCharset_deleteAll        (HTList * list);
                    329: </PRE>
                    330: 
                    331: <A NAME="Language"><H3>Accepted Content Languages</H3></A>
2.31      frystyk   332: 
2.42      frystyk   333: <H4>Register a Language</H4>
2.31      frystyk   334: 
                    335: <PRE>
2.50      frystyk   336: extern void HTLanguage_add (HTList *           list,
                    337:                            CONST char *        lang,
                    338:                            double              quality);
                    339: </PRE>
                    340: 
                    341: <H4>Delete a list of Languages</H4>
                    342: 
                    343: <PRE>
2.51      frystyk   344: extern void HTLanguage_deleteAll (HTList * list);
2.50      frystyk   345: </PRE>
                    346: 
                    347: <A NAME="global"><H2>Global Registrations</H2></A>
                    348: 
                    349: There are two places where these preferences can be registered: in a
                    350: <EM>global</EM> list valid for <B>all</B> requests and a
                    351: <EM>local</EM> list valid for a particular request only. These are
                    352: valid for <EM>all</EM> requests. See the <A HREF="HTReq.html">Request
                    353: Manager</A> fro local sets.
                    354: 
2.51      frystyk   355: <H3>Converters and Presenters</H3>
2.50      frystyk   356: 
                    357: The <EM>global</EM> list of specific conversions which the format
                    358: manager can do in order to fulfill the request.  There is also a <A
                    359: HREF="HTReq.html"><EM>local</EM></A> list of conversions which
                    360: contains a generic set of possible conversions.
                    361: 
                    362: <PRE>
                    363: extern void HTFormat_setConversion     (HTList *list);
                    364: extern HTList * HTFormat_conversion    (void);
2.31      frystyk   365: </PRE>
                    366: 
2.50      frystyk   367: <H3>Content Encodings</H3>
2.42      frystyk   368: 
2.50      frystyk   369: <PRE>
                    370: extern void HTFormat_setEncoding       (HTList *list);
                    371: extern HTList * HTFormat_encoding      (void);
                    372: </PRE>
2.1       timbl     373: 
2.51      frystyk   374: <H3>Content Languages</H3>
2.50      frystyk   375: 
                    376: <PRE>
                    377: extern void HTFormat_setLanguage       (HTList *list);
                    378: extern HTList * HTFormat_language      (void);
                    379: </PRE>
2.42      frystyk   380: 
2.51      frystyk   381: <H3>Content Charsets</H3>
2.1       timbl     382: 
2.31      frystyk   383: <PRE>
2.50      frystyk   384: extern void HTFormat_setCharset                (HTList *list);
                    385: extern HTList * HTFormat_charset       (void);
2.31      frystyk   386: </PRE>
                    387: 
2.50      frystyk   388: <H3>Delete All Global Lists</H3>
2.42      frystyk   389: 
2.50      frystyk   390: This is a convenience function that might make life easier.
2.34      frystyk   391: 
                    392: <PRE>
2.50      frystyk   393: extern void HTFormat_deleteAll (void);
2.34      frystyk   394: </PRE>
2.31      frystyk   395: 
                    396: <A NAME="Rank"><H2>Ranking of Accepted Formats</H2></A>
                    397: 
2.36      frystyk   398: This function is used when the best match among several possible
                    399: documents is to be found as a function of the accept headers sent in
                    400: the client request.
2.31      frystyk   401: 
                    402: <PRE>
2.42      frystyk   403: typedef struct _HTContentDescription {
                    404:     char *     filename;
                    405:     HTAtom *   content_type;
                    406:     HTAtom *   content_language;
                    407:     HTAtom *   content_encoding;
                    408:     int                content_length;
                    409:     double     quality;
                    410: } HTContentDescription;
                    411: 
2.52      frystyk   412: extern BOOL HTRank (HTList * possibilities,
                    413:                    HTList * accepted_content_types,
                    414:                    HTList * accepted_content_languages,
                    415:                    HTList * accepted_content_encodings);
2.1       timbl     416: </PRE>
2.31      frystyk   417: 
2.42      frystyk   418: <H2><A NAME="z3">The Stream Stack</A></H2>
2.31      frystyk   419: 
                    420: This is the routine which actually sets up the conversion. It
                    421: currently checks only for direct conversions, but multi-stage
                    422: conversions are forseen.  It takes a stream into which the output
                    423: should be sent in the final format, builds the conversion stack, and
                    424: returns a stream into which the data in the input format should be
2.42      frystyk   425: fed. If <CODE>guess</CODE> is true and input format is
2.31      frystyk   426: <CODE>www/unknown</CODE>, try to guess the format by looking at the
                    427: first few bytes of the stream. <P>
2.1       timbl     428: 
2.31      frystyk   429: <PRE>
2.52      frystyk   430: extern HTStream * HTStreamStack (HTFormat      rep_in,
                    431:                                 HTFormat       rep_out,
                    432:                                 HTStream *     output_stream,
                    433:                                 HTRequest *    request,
                    434:                                 BOOL           guess);
2.1       timbl     435: </PRE>
2.31      frystyk   436: 
2.42      frystyk   437: <H2>Cost of a Stream Stack</H2>
2.31      frystyk   438: 
                    439: Must return the cost of the same stack which HTStreamStack would set
2.1       timbl     440: up.
                    441: 
2.31      frystyk   442: <PRE>
2.52      frystyk   443: extern double HTStackValue     (HTList *       conversions,
                    444:                                 HTFormat       format_in,
                    445:                                 HTFormat       format_out,
                    446:                                 double         initial_value,
                    447:                                 long int       length);
2.31      frystyk   448: 
2.42      frystyk   449: #endif /* HTFORMAT */
2.38      frystyk   450: </PRE>
                    451: 
2.42      frystyk   452: End of declaration module
2.31      frystyk   453: 
                    454: </BODY>
2.10      timbl     455: </HTML>

Webmaster