X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mmbuffer.el;h=f014aeccd024c8d85743c49f05ea26e182af437c;hb=e6e1768246f2b1d3c7b56cda18ab15ef5da8ca80;hp=d5868dccca35bd3f8068a4d9554e479cf2046c53;hpb=81963310fe6da6c1fdfd33dfd05e50c3f8f69d46;p=elisp%2Fflim.git diff --git a/mmbuffer.el b/mmbuffer.el index d5868dc..f014aec 100644 --- a/mmbuffer.el +++ b/mmbuffer.el @@ -41,36 +41,44 @@ (luna-define-method initialize-instance :after ((entity mime-buffer-entity) &rest init-args) - (mime-buffer-entity-set-buffer-internal - entity (mime-entity-location-internal entity)) + (or (mime-buffer-entity-buffer-internal entity) + (mime-buffer-entity-set-buffer-internal + entity (mime-entity-location-internal entity))) (save-excursion (set-buffer (mime-buffer-entity-buffer-internal entity)) - (setq mime-message-structure entity) - (let ((header-start (point-min)) - header-end - body-start - (body-end (point-max))) + (if (mime-root-entity-p entity) + (setq mime-message-structure entity)) + (let ((header-start + (or (mime-buffer-entity-header-start-internal entity) + (mime-buffer-entity-set-header-start-internal + entity (point-min)))) + (header-end (mime-buffer-entity-header-end-internal entity)) + (body-start (mime-buffer-entity-body-start-internal entity)) + (body-end + (or (mime-buffer-entity-body-end-internal entity) + (mime-buffer-entity-set-body-end-internal entity (point-max))))) (goto-char header-start) - (if (re-search-forward "^$" nil t) - (setq header-end (match-end 0) - body-start (if (= header-end body-end) - body-end - (1+ header-end))) - (setq header-end (point-min) - body-start (point-min))) - (save-restriction - (narrow-to-region header-start header-end) - (mime-entity-set-content-type-internal - entity - (let ((str (std11-fetch-field "Content-Type"))) - (if str - (mime-parse-Content-Type str) - ))) + (unless (and header-end body-start) + (if (re-search-forward "^$" body-end t) + (setq header-end (match-end 0) + body-start (if (= header-end body-end) + body-end + (1+ header-end))) + (setq header-end (point-min) + body-start (point-min))) + (mime-buffer-entity-set-header-end-internal entity header-end) + (mime-buffer-entity-set-body-start-internal entity body-start) ) - (mime-buffer-entity-set-header-start-internal entity header-start) - (mime-buffer-entity-set-header-end-internal entity header-end) - (mime-buffer-entity-set-body-start-internal entity body-start) - (mime-buffer-entity-set-body-end-internal entity body-end) + (or (mime-entity-content-type-internal entity) + (save-restriction + (narrow-to-region header-start header-end) + (mime-entity-set-content-type-internal + entity + (let ((str (std11-fetch-field "Content-Type"))) + (if str + (mime-parse-Content-Type str) + ))) + )) )) entity) @@ -79,132 +87,6 @@ ) -;;; @ message parser -;;; - -(defun mime-parse-multipart (entity) - (goto-char (point-min)) - (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")) - (dc-ctl - (if (eq (mime-content-type-subtype content-type) 'digest) - (make-mime-content-type 'message 'rfc822) - (make-mime-content-type 'text 'plain) - )) - (body-start (mime-buffer-entity-body-start-internal entity)) - (body-end (mime-buffer-entity-body-end-internal entity))) - (save-restriction - (goto-char body-end) - (narrow-to-region body-start - (if (re-search-backward close-delimiter nil t) - (match-beginning 0) - body-end)) - (goto-char body-start) - (if (re-search-forward - (concat "^" (regexp-quote dash-boundary) "[ \t]*\n") - 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) - ))) - -(defun mime-parse-encapsulated (entity) - (mime-entity-set-children-internal - entity - (save-restriction - (narrow-to-region (mime-buffer-entity-body-start-internal entity) - (mime-buffer-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) - (goto-char header-start) - (if (re-search-forward "^$" nil t) - (setq header-end (match-end 0) - body-start (if (= header-end body-end) - body-end - (1+ header-end))) - (setq header-end (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)) - ) - (luna-make-entity representation-type - :location (current-buffer) - :content-type content-type - :parent parent - :node-id node-id - :buffer (current-buffer) - :header-start header-start - :header-end header-end - :body-start body-start - :body-end body-end) - )) - -(luna-define-method mime-entity-children ((entity mime-buffer-entity)) - (let* ((content-type (mime-entity-content-type entity)) - (primary-type (mime-content-type-primary-type content-type))) - (cond ((eq primary-type 'multipart) - (mime-parse-multipart entity) - ) - ((and (eq primary-type 'message) - (memq (mime-content-type-subtype content-type) - '(rfc822 news external-body) - )) - (mime-parse-encapsulated entity) - )) - )) - - -(luna-define-method mime-goto-header-start-point ((entity mime-buffer-entity)) - (set-buffer (mime-buffer-entity-buffer-internal entity)) - (goto-char (mime-buffer-entity-header-start-internal entity)) - ) - (defun mime-visible-field-p (field-name visible-fields invisible-fields) (or (catch 'found (while visible-fields @@ -276,33 +158,24 @@ (mime-buffer-entity-body-end-internal entity)) (mime-entity-encoding entity)))) -(luna-define-method mime-insert-text-content ((entity mime-buffer-entity)) - (insert - (decode-mime-charset-string (mime-entity-content entity) - (or (mime-content-type-parameter - (mime-entity-content-type entity) - "charset") - default-mime-charset) - 'CRLF) - )) - -;;; redefine to speed up - -(mm-define-method entity-point-min ((entity buffer)) - (mime-buffer-entity-header-start-internal entity)) - -(mm-define-method entity-point-max ((entity buffer)) - (mime-buffer-entity-body-end-internal entity)) - -(luna-define-method mime-entity-fetch-field ((entity mime-buffer-entity) - field-name) - (save-excursion - (set-buffer (mime-buffer-entity-buffer-internal entity)) - (save-restriction - (narrow-to-region (mime-buffer-entity-header-start-internal entity) - (mime-buffer-entity-header-end-internal entity)) - (std11-fetch-field field-name) - ))) +(luna-define-method mime-entity-fetch-field :around + ((entity mime-buffer-entity) field-name) + (or (luna-call-next-method) + (save-excursion + (set-buffer (mime-buffer-entity-buffer-internal entity)) + (save-restriction + (narrow-to-region (mime-buffer-entity-header-start-internal entity) + (mime-buffer-entity-header-end-internal entity)) + (let ((ret (std11-fetch-field field-name))) + (when ret + (or (symbolp field-name) + (setq field-name + (intern (capitalize (capitalize field-name))))) + (mime-entity-set-original-header-internal + entity + (put-alist field-name ret + (mime-entity-original-header-internal entity))) + ret)))))) (mm-define-method insert-entity-content ((entity buffer)) (insert (with-current-buffer (mime-buffer-entity-buffer-internal entity) @@ -344,17 +217,58 @@ )) -;;; @ buffer +;;; @ header buffer ;;; (luna-define-method mime-entity-header-buffer ((entity mime-buffer-entity)) (mime-buffer-entity-buffer-internal entity) ) +(luna-define-method mime-goto-header-start-point ((entity mime-buffer-entity)) + (set-buffer (mime-buffer-entity-buffer-internal entity)) + (goto-char (mime-buffer-entity-header-start-internal entity)) + ) + +(luna-define-method mime-entity-header-start-point ((entity + mime-buffer-entity)) + (mime-buffer-entity-header-start-internal entity) + ) + +(luna-define-method mime-entity-header-end-point ((entity + mime-buffer-entity)) + (mime-buffer-entity-header-end-internal entity) + ) + + +;;; @ body buffer +;;; + (luna-define-method mime-entity-body-buffer ((entity mime-buffer-entity)) (mime-buffer-entity-buffer-internal entity) ) +(luna-define-method mime-goto-body-start-point ((entity mime-buffer-entity)) + (set-buffer (mime-buffer-entity-buffer-internal entity)) + (goto-char (mime-buffer-entity-body-start-internal entity)) + ) + +(luna-define-method mime-goto-body-end-point ((entity mime-buffer-entity)) + (set-buffer (mime-buffer-entity-buffer-internal entity)) + (goto-char (mime-buffer-entity-body-end-internal entity)) + ) + +(luna-define-method mime-entity-body-start-point ((entity mime-buffer-entity)) + (mime-buffer-entity-body-start-internal entity) + ) + +(luna-define-method mime-entity-body-end-point ((entity mime-buffer-entity)) + (mime-buffer-entity-body-end-internal entity) + ) + + +;;; @ buffer (obsolete) +;;; + (luna-define-method mime-entity-buffer ((entity mime-buffer-entity)) (mime-buffer-entity-buffer-internal entity) ) @@ -368,20 +282,6 @@ ) -;;; @ utility -;;; - -;;;###autoload -(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 (or representation-type 'buffer) nil)) - )) - - ;;; @ end ;;;