X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Fmmelmo.el;h=14b24ff108a87b17901facb4d159f3bb73677f19;hb=e64882498d21cef2b964ddc18d41421ab36bd19b;hp=2a98a247d2fe9053311ab32d439bbc901b4e739a;hpb=187df37d14178d110f34a8a7972a6371efccbe72;p=elisp%2Fwanderlust.git diff --git a/elmo/mmelmo.el b/elmo/mmelmo.el index 2a98a24..14b24ff 100644 --- a/elmo/mmelmo.el +++ b/elmo/mmelmo.el @@ -4,7 +4,6 @@ ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news -;; Time-stamp: <00/03/07 17:00:43 teranisi> ;; This file is part of ELMO (Elisp Library for Message Orchestration). @@ -29,12 +28,23 @@ ;;; Code: ;; - (require 'elmo-vars) (require 'elmo-util) (require 'mime-parse) (require 'mmbuffer) +(require 'product) +(product-provide (provide 'mmelmo) (require 'elmo-version)) +(require 'mmelmo-imap4) + +(eval-and-compile + (luna-define-class mime-elmo-entity (mime-buffer-entity) + (imap folder number msgdb size)) + (luna-define-internal-accessors 'mime-elmo-entity)) + +(defvar mmelmo-force-reload nil) +(defvar mmelmo-sort-field-list nil) + (defvar mmelmo-header-max-column fill-column "*Inserted header is folded with this value. If function is specified, its return value is used.") @@ -50,7 +60,7 @@ If function is specified, its return value is used.") (if (not ret-val) (save-excursion (set-buffer (setq ret-val - (get-buffer-create + (get-buffer-create (concat mmelmo-entity-buffer-name "0")))) (mmelmo-original-mode))) ret-val)) @@ -62,7 +72,11 @@ If function is specified, its return value is used.") (kill-buffer x))) (mapcar 'buffer-name (buffer-list)))) -(defun mmelmo-insert-sorted-header-from-buffer (buffer +;; For FLIM 1-13.x +(defun-maybe mime-entity-body (entity) + (luna-send entity 'mime-entity-body)) + +(defun mmelmo-insert-sorted-header-from-buffer (buffer start end &optional invisible-fields visible-fields @@ -146,12 +160,104 @@ If function is specified, its return value is used.") (setq attrlist (cdr (cdr attrlist)))) ret-val))) -(provide 'mmelmo) ; for circular dependency. -(static-if (fboundp 'luna-define-method) - ;; FLIM 1.13 or later - (require 'mmelmo-2) - ;; FLIM 1.12 - (require 'mmelmo-1)) +(luna-define-method initialize-instance :after ((entity mime-elmo-entity) + &rest init-args) + "The initialization method for elmo. +mime-elmo-entity has its own member variable, +`imap', `folder', `msgdb' and `size'. +imap: boolean. if non-nil, entity becomes mime-elmo-imap4-entity class. +folder: string. folder name. +msgdb: msgdb of elmo. +size: size of the entity." + (if (mime-elmo-entity-imap-internal entity) + ;; use imap part fetching. + ;; child mime-entity's class becomes `mime-elmo-imap4-entity' + ;; which implements `entity-buffer' method. + (progn + (let (new-entity) + (mime-buffer-entity-set-buffer-internal entity nil) + (setq new-entity + (mmelmo-imap4-get-mime-entity + (mime-elmo-entity-folder-internal entity) ; folder + (mime-elmo-entity-number-internal entity) ; number + (mime-elmo-entity-msgdb-internal entity) ; msgdb + )) + (mime-entity-set-content-type-internal + entity + (mime-entity-content-type-internal new-entity)) + (mime-entity-set-encoding-internal + entity + (mime-entity-encoding-internal new-entity)) + (mime-entity-set-children-internal + entity + (mime-entity-children-internal new-entity)) + (mime-elmo-entity-set-size-internal + entity + (mime-elmo-entity-size-internal new-entity)) + (mime-entity-set-representation-type-internal + entity 'mime-elmo-imap4-entity) + entity)) + (set-buffer (mime-buffer-entity-buffer-internal entity)) + (mmelmo-original-mode) + (when (mime-root-entity-p entity) + (let ((buffer-read-only nil) + header-end body-start) + (erase-buffer) + (elmo-read-msg-with-buffer-cache + (mime-elmo-entity-folder-internal entity) + (mime-elmo-entity-number-internal entity) + (current-buffer) + (mime-elmo-entity-msgdb-internal entity) + mmelmo-force-reload) + (goto-char (point-min)) + (if (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$\\|^$" ) + nil t) + (setq header-end (match-beginning 0) + body-start (if (= (match-end 0) (point-max)) + (point-max) + (1+ (match-end 0)))) + (setq header-end (point-min) + body-start (point-min))) + (mime-buffer-entity-set-header-start-internal entity (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-body-end-internal entity (point-max)) + (save-restriction + (narrow-to-region (mime-buffer-entity-header-start-internal entity) + (mime-buffer-entity-header-end-internal entity)) + (mime-entity-set-content-type-internal + entity + (let ((str (std11-fetch-field "Content-Type"))) + (if str + (mime-parse-Content-Type str) + )))))) + entity)) + +(luna-define-method mime-insert-header ((entity mime-elmo-entity) + &optional invisible-fields + visible-fields) + (mmelmo-insert-sorted-header-from-buffer + (mime-buffer-entity-buffer-internal entity) + (mime-buffer-entity-header-start-internal entity) + (mime-buffer-entity-header-end-internal entity) + invisible-fields visible-fields mmelmo-sort-field-list)) + +(luna-define-method mime-insert-text-content :around ((entity + mime-elmo-entity)) + (luna-call-next-method) + (run-hooks 'mmelmo-entity-content-inserted-hook)) + +(luna-define-method mime-entity-body ((entity mime-elmo-entity)) + (with-current-buffer (mime-buffer-entity-buffer-internal entity) + (buffer-substring (mime-buffer-entity-body-start-internal entity) + (mime-buffer-entity-body-end-internal entity)))) +;;(luna-define-method mime-entity-content ((entity mime-elmo-entity)) +;; (mime-decode-string +;; (with-current-buffer (mime-buffer-entity-buffer-internal entity) +;; (buffer-substring (mime-buffer-entity-body-start-internal entity) +;; (mime-buffer-entity-body-end-internal entity))) +;; (mime-entity-encoding entity))) ;;; mmelmo.el ends here