* elmo-imap4.el (toplevel): Delete defun-maybe for sasl-*.
[elisp/wanderlust.git] / elmo / mmelmo.el
index 2a98a24..102bda3 100644 (file)
@@ -1,10 +1,9 @@
 ;;; mmelmo.el -- mm-backend by ELMO.
 
-;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 
 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
 ;; Keywords: mail, net news
-;; Time-stamp: <00/03/07 17:00:43 teranisi>
 
 ;; This file is part of ELMO (Elisp Library for Message Orchestration).
 
 
 ;;; 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
@@ -142,16 +156,108 @@ If function is specified, its return value is used.")
        (while attrlist
          (setq ret-val (append ret-val
                                (list (cons (downcase (car attrlist))
-                                           (downcase (car (cdr attrlist)))))))
+                                           (car (cdr attrlist))))))
          (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