[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. Decoding and Viewing

This chapter deals with decoding and viewing MIME messages on a higher level.

The main idea is to first analyze a MIME article, and then allow other programs to do things based on the list of handles that are returned as a result of this analysis.

3.1 Dissection  Analyzing a MIME message.
3.2 Handles  Handle manipulations.
3.3 Display  Displaying handles.
3.4 Customization  Variables that affect display.
3.5 New Viewers  How to write your own viewers.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 Dissection

The mm-dissect-buffer is the function responsible for dissecting a MIME article. If given a multipart message, it will recursively descend the message, following the structure, and return a tree of MIME handles that describes the structure of the message.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 Handles

A MIME handle is a list that fully describes a MIME component.

The following macros can be used to access elements in a handle:

mm-handle-buffer
Return the buffer that holds the contents of the undecoded MIME part.

mm-handle-type
Return the parsed Content-Type of the part.

mm-handle-encoding
Return the Content-Transfer-Encoding of the part.

mm-handle-undisplayer
Return the object that can be used to remove the displayed part (if it has been displayed).

mm-handle-set-undisplayer
Set the undisplayer object.

mm-handle-disposition
Return the parsed Content-Disposition of the part.

mm-handle-disposition
Return the description of the part.

mm-get-content-id
Returns the handle(s) referred to by Content-ID.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 Display

Functions for displaying, removing and saving.

mm-display-part
Display the part.

mm-remove-part
Remove the part (if it has been displayed).

mm-inlinable-p
Say whether a MIME type can be displayed inline.

mm-automatic-display-p
Say whether a MIME type should be displayed automatically.

mm-destroy-part
Free all resources occupied by a part.

mm-save-part
Offer to save the part in a file.

mm-pipe-part
Offer to pipe the part to some process.

mm-interactively-view-part
Prompt for a mailcap method to use to view the part.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4 Customization

mm-inline-media-tests
This is an alist where the key is a MIME type, the second element is a function to display the part inline (i.e., inside Emacs), and the third element is a form to be evaled to say whether the part can be displayed inline.

This variable specifies whether a part can be displayed inline, and, if so, how to do it. It does not say whether parts are actually displayed inline.

mm-inlined-types
This, on the other hand, says what types are to be displayed inline, if they satisfy the conditions set by the variable above. It's a list of MIME media types.

mm-automatic-display
This is a list of types that are to be displayed "automatically", but only if the above variable allows it. That is, only inlinable parts can be displayed automatically.

mm-attachment-override-types
Some MIME agents create parts that have a content-disposition of `attachment'. This variable allows overriding that disposition and displaying the part inline. (Note that the disposition is only overridden if we are able to, and want to, display the part inline.)

mm-discouraged-alternatives
List of MIME types that are discouraged when viewing `multipart/alternative'. Viewing agents are supposed to view the last possible part of a message, as that is supposed to be the richest. However, users may prefer other types instead, and this list says what types are most unwanted. If, for instance, `text/html' parts are very unwanted, and `text/richtech' parts are somewhat unwanted, then the value of this variable should be set to:

 
("text/html" "text/richtext")

mm-inline-large-images-p
When displaying inline images that are larger than the window, XEmacs does not enable scrolling, which means that you cannot see the whole image. To prevent this, the library tries to determine the image size before displaying it inline, and if it doesn't fit the window, the library will display it externally (e.g. with `ImageMagick' or `xv'). Setting this variable to t disables this check and makes the library display all inline images as inline, regardless of their size.

mm-inline-override-p
mm-inlined-types may include regular expressions, for example to specify that all `text/.*' parts be displayed inline. If a user prefers to have a type that matches such a regular expression be treated as an attachment, that can be accomplished by setting this variable to a list containing that type. For example assuming mm-inlined-types includes `text/.*', then including `text/html' in this variable will cause `text/html' parts to be treated as attachments.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.5 New Viewers

Here's an example viewer for displaying text/enriched inline:

 
(defun mm-display-enriched-inline (handle)
  (let (text)
    (with-temp-buffer
      (mm-insert-part handle)
      (save-window-excursion
        (enriched-decode (point-min) (point-max))
        (setq text (buffer-string))))
    (mm-insert-inline handle text)))

We see that the function takes a MIME handle as its parameter. It then goes to a temporary buffer, inserts the text of the part, does some work on the text, stores the result, goes back to the buffer it was called from and inserts the result.

The two important helper functions here are mm-insert-part and mm-insert-inline. The first function inserts the text of the handle in the current buffer. It handles charset and/or content transfer decoding. The second function just inserts whatever text you tell it to insert, but it also sets things up so that the text can be "undisplayed' in a convenient manner.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by James LewisMoss on November, 11 2002 using texi2html