;;; @ message parser
;;;
-(defun mime-parse-multipart (header-start header-end body-start body-end
- content-type content-disposition
- encoding node-id)
+(defun mime-parse-multipart (entity)
(goto-char (point-min))
- (let* ((dash-boundary
- (concat "--"
- (std11-strip-quoted-string
- (mime-content-type-parameter content-type "boundary"))))
+ (let* ((representation-type
+ (mime-entity-representation-type-internal entity))
+ (content-type (mime-entity-content-type-internal entity))
+ (dash-boundary
+ (concat "--" (mime-content-type-parameter content-type "boundary")))
(delimiter (concat "\n" (regexp-quote dash-boundary)))
(close-delimiter (concat delimiter "--[ \t]*$"))
(rsep (concat delimiter "[ \t]*\n"))
(make-mime-content-type 'message 'rfc822)
(make-mime-content-type 'text 'plain)
))
- cb ce ret ncb children (i 0))
+ (header-end (mime-entity-header-end-internal entity))
+ (body-end (mime-entity-body-end-internal entity)))
(save-restriction
(goto-char body-end)
(narrow-to-region header-end
(match-beginning 0)
body-end))
(goto-char header-end)
- (re-search-forward rsep nil t)
- (setq cb (match-end 0))
- (while (re-search-forward rsep nil t)
- (setq ce (match-beginning 0))
- (setq ncb (match-end 0))
- (save-restriction
- (narrow-to-region cb ce)
- (setq ret (mime-parse-message dc-ctl "7bit" (cons i node-id)))
- )
- (setq children (cons ret children))
- (goto-char (setq cb ncb))
- (setq i (1+ i))
- )
- (setq ce (point-max))
- (save-restriction
- (narrow-to-region cb ce)
- (setq ret (mime-parse-message dc-ctl "7bit" (cons i node-id)))
- )
- (setq children (cons ret children))
- )
- (make-mime-entity (current-buffer)
- header-start header-end body-start body-end
- node-id content-type content-disposition encoding
- (nreverse children))
- ))
+ (if (re-search-forward rsep nil t)
+ (let ((cb (match-end 0))
+ ce ncb ret children
+ (node-id (mime-entity-node-id-internal entity))
+ (i 0))
+ (while (re-search-forward rsep nil t)
+ (setq ce (match-beginning 0))
+ (setq ncb (match-end 0))
+ (save-restriction
+ (narrow-to-region cb ce)
+ (setq ret (mime-parse-message representation-type dc-ctl
+ entity (cons i node-id)))
+ )
+ (setq children (cons ret children))
+ (goto-char (setq cb ncb))
+ (setq i (1+ i))
+ )
+ (setq ce (point-max))
+ (save-restriction
+ (narrow-to-region cb ce)
+ (setq ret (mime-parse-message representation-type dc-ctl
+ entity (cons i node-id)))
+ )
+ (setq children (cons ret children))
+ (mime-entity-set-children-internal entity (nreverse children))
+ )
+ (mime-entity-set-content-type-internal
+ entity (make-mime-content-type 'message 'x-broken))
+ nil)
+ )))
-;;;###autoload
-(defun mime-parse-message (&optional default-ctl default-encoding node-id)
- "Parse current-buffer as a MIME message.
-DEFAULT-CTL is used when an entity does not have valid Content-Type
-field. Its format must be as same as return value of
-mime-{parse|read}-Content-Type."
+(defun mime-parse-encapsulated (entity)
+ (mime-entity-set-children-internal
+ entity
+ (save-restriction
+ (narrow-to-region (mime-entity-body-start-internal entity)
+ (mime-entity-body-end-internal entity))
+ (list (mime-parse-message
+ (mime-entity-representation-type-internal entity) nil
+ entity (cons 0 (mime-entity-node-id-internal entity))))
+ )))
+
+(defun mime-parse-message (representation-type &optional default-ctl
+ parent node-id)
(let ((header-start (point-min))
header-end
body-start
(body-end (point-max))
- content-type content-disposition encoding
- primary-type)
+ content-type)
(goto-char header-start)
(if (re-search-forward "^$" nil t)
(setq header-end (match-end 0)
- body-start (1+ header-end))
+ body-start (if (= header-end body-end)
+ body-end
+ (1+ header-end)))
(setq header-end (point-min)
- body-start (point-min))
- )
+ body-start (point-min)))
(save-restriction
(narrow-to-region header-start header-end)
(setq content-type (or (let ((str (std11-fetch-field "Content-Type")))
(if str
(mime-parse-Content-Type str)
))
- default-ctl)
- content-disposition (let ((str (std11-fetch-field
- "Content-Disposition")))
- (if str
- (mime-parse-Content-Disposition str)
- ))
- encoding (let ((str (std11-fetch-field
- "Content-Transfer-Encoding")))
- (if str
- (mime-parse-Content-Transfer-Encoding str)
- default-encoding))
- primary-type (mime-content-type-primary-type content-type))
+ default-ctl))
)
- (cond ((eq primary-type 'multipart)
- (mime-parse-multipart header-start header-end
- body-start body-end
- content-type content-disposition encoding
- node-id)
- )
- ((and (eq primary-type 'message)
- (memq (mime-content-type-subtype content-type)
- '(rfc822 news external-body)
- ))
- (make-mime-entity (current-buffer)
- header-start header-end body-start body-end
- node-id
- content-type content-disposition encoding
- (save-restriction
- (narrow-to-region body-start body-end)
- (list (mime-parse-message
- nil nil (cons 0 node-id)))
- ))
- )
- (t
- (make-mime-entity (current-buffer)
- header-start header-end body-start body-end
- node-id
- content-type content-disposition encoding nil)
- ))
+ (make-mime-entity-internal representation-type
+ (current-buffer)
+ content-type nil parent node-id
+ (current-buffer)
+ header-start header-end
+ body-start body-end)
))
;;; @ for buffer
;;;
-(defvar mime-message-structure nil
- "Information about structure of message.
-Please use reference function `mime-entity-SLOT' to get value of SLOT.
-
-Following is a list of slots of the structure:
-
-buffer buffer includes this entity (buffer).
-node-id node-id (list of integers)
-header-start minimum point of header in raw-buffer
-header-end maximum point of header in raw-buffer
-body-start minimum point of body in raw-buffer
-body-end maximum point of body in raw-buffer
-content-type content-type (content-type)
-content-disposition content-disposition (content-disposition)
-encoding Content-Transfer-Encoding (string or nil)
-children entities included in this entity (list of entity)
-
-If an entity includes other entities in its body, such as multipart or
-message/rfc822, `mime-entity' structures of them are included in
-`children', so the `mime-entity' structure become a tree.")
-(make-variable-buffer-local 'mime-message-structure)
-
;;;###autoload
-(defun mime-parse-buffer (&optional buffer)
+(defun mime-parse-buffer (&optional buffer representation-type)
"Parse BUFFER as a MIME message.
If buffer is omitted, it parses current-buffer."
(save-excursion
(if buffer (set-buffer buffer))
- (setq mime-message-structure (mime-parse-message))
+ (setq mime-message-structure
+ (mime-parse-message (or representation-type 'buffer) nil))
))
-;;; @ utilities
-;;;
-
-(defsubst mime-root-entity-p (entity)
- "Return t if ENTITY is root-entity (message)."
- (null (mime-entity-node-id entity)))
-
-
;;; @ end
;;;