Annotation of libwww/Library/src/HTFormat.html, revision 2.61
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,
2.61 ! frystyk 226: const char * representation,
! 227: const char * command,
! 228: const char * test_command,
2.49 frystyk 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,
2.61 ! frystyk 264: const char * rep_in,
! 265: const char * rep_out,
2.49 frystyk 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,
2.61 ! frystyk 305: const char * enc,
2.50 frystyk 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,
2.61 ! frystyk 321: const char * charset,
2.50 frystyk 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,
2.61 ! frystyk 337: const char * lang,
2.50 frystyk 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