* mime-view.el (mime-view-insert-text-content): Check whether "jka-compr"
[elisp/semi.git] / mime-bbdb.el
index f054044..a6b370c 100644 (file)
@@ -1,16 +1,13 @@
 ;;; mime-bbdb.el --- SEMI shared module for BBDB
 
-;; Copyright (C) 1995,1996 Shuhei KOBAYASHI
-;; Copyright (C) 1996 Artur Pioro
-;; Copyright (C) 1997 MORIOKA Tomohiko
+;; Copyright (C) 1995,1996,1997 Shuhei KOBAYASHI
+;; Copyright (C) 1997,1998 MORIOKA Tomohiko
 
 ;; Author: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
-;;         Artur Pioro <artur@flugor.if.uj.edu.pl>
 ;; Maintainer: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
-;; Version: $Id: mime-bbdb.el,v 0.0 1997-03-03 18:47:43 morioka Exp $
-;; Keywords: mail, news, MIME, multimedia, multilingual, BBDB
+;; Keywords: BBDB, MIME, multimedia, multilingual, mail, news
 
-;; This file is part of SEMI (SEMI is Emacs MIME Interfaces).
+;; This file is part of SEMI (Suite of Emacs MIME Interfaces).
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
@@ -29,7 +26,7 @@
 
 ;;; Code:
 
-(require 'file-detect)
+(require 'path-util)
 (require 'std11)
 (require 'mime-view)
 
       "Returns a regexp matching the address of the logged-in user"
       '(or bbdb-user-mail-names
           (setq bbdb-user-mail-names
-                (concat "\\b" (regexp-quote (user-login-name)) "\\b"))))
-    ))
+                (concat "\\b" (regexp-quote (user-login-name)) "\\b"))))))
 
 
 ;;; @ User Variables
 ;;;
 
-(defvar mime-bbdb-use-mail-extr t
+(defvar mime-bbdb/use-mail-extr t
   "*If non-nil, `mail-extract-address-components' is used.
-Otherwise `mime-bbdb-extract-address-components' overrides it.")
+Otherwise `mime-bbdb/extract-address-components' overrides it.")
 
-(defvar mime-bbdb-auto-create-p nil
+(defvar mime-bbdb/auto-create-p nil
   "*If t, create new BBDB records automatically.
 If function, then it is called with no arguments to decide whether an
 entry should be automatically creaded.
@@ -64,7 +60,7 @@ entry should be automatically creaded.
 mime-bbdb uses this variable instead of `bbdb/mail-auto-create-p' or
 `bbdb/news-auto-create-p' unless other tm-MUA overrides it.")
 
-(defvar mime-bbdb-delete-empty-window nil
+(defvar mime-bbdb/delete-empty-window nil
   "*If non-nil, delete empty BBDB window.
 All bbdb-MUAs but bbdb-gnus display BBDB window even if it is empty.
 If you prefer behavior of bbdb-gnus, set this variable to t.
@@ -74,28 +70,26 @@ For framepop users: If empty, `framepop-banish' is used instead.")
 ;;; @ mail-extr
 ;;;
 
-(defun mime-bbdb-extract-address-components (str)
+(defun mime-bbdb/extract-address-components (str)
   (let* ((ret     (std11-extract-address-components str))
          (phrase  (car ret))
          (address (car (cdr ret)))
-         (methods mime-bbdb-canonicalize-full-name-methods))
+         (methods mime-bbdb/canonicalize-full-name-methods))
     (while (and phrase methods)
       (setq phrase  (funcall (car methods) phrase)
             methods (cdr methods)))
     (if (string= address "") (setq address nil))
     (if (string= phrase "") (setq phrase nil))
-    (list phrase address)
-    ))
+    (list phrase address)))
 
-(or mime-bbdb-use-mail-extr
+(or mime-bbdb/use-mail-extr
     (progn
       (require 'mail-extr) ; for `what-domain'
       (or (fboundp 'tm:mail-extract-address-components)
           (fset 'tm:mail-extract-address-components
                 (symbol-function 'mail-extract-address-components)))
       (fset 'mail-extract-address-components
-           (symbol-function 'mime-bbdb-extract-address-components))
-      ))
+           (symbol-function 'mime-bbdb/extract-address-components))))
 
 
 ;;; @ bbdb-extract-field-value
@@ -105,110 +99,110 @@ For framepop users: If empty, `framepop-banish' is used instead.")
     (progn
       ;; (require 'bbdb-hooks) ; not provided.
       ;; (or (fboundp 'bbdb-extract-field-value) ; defined as autoload
-      (or (fboundp 'bbdb-header-start)
-          (load "bbdb-hooks"))
+
+      ;; almost BBDB functions are autoloaded.
+      ;; (or (fboundp 'bbdb-header-start)
+      (or (and (fboundp 'bbdb-extract-field-value)
+              (not (eq 'autoload (car-safe (symbol-function
+                                            'bbdb-extract-field-value)))))
+         (load "bbdb-hooks"))
       (fset 'tm:bbdb-extract-field-value
-            (symbol-function 'bbdb-extract-field-value))
+           (symbol-function 'bbdb-extract-field-value))
       (defun bbdb-extract-field-value (field)
         (let ((value (tm:bbdb-extract-field-value field)))
           (and value
-               (eword-decode-string value))))
-      ))
+               (eword-decode-string value))))))
 
 
 ;;; @ full-name canonicalization methods
 ;;;
 
-(defun mime-bbdb-canonicalize-spaces (str)
+(defun mime-bbdb/canonicalize-spaces (str)
   (let (dest)
     (while (string-match "\\s +" str)
       (setq dest (cons (substring str 0 (match-beginning 0)) dest))
-      (setq str (substring str (match-end 0)))
-      )
+      (setq str (substring str (match-end 0))))
     (or (string= str "")
         (setq dest (cons str dest)))
     (setq dest (nreverse dest))
-    (mapconcat 'identity dest " ")
-    ))
+    (mapconcat 'identity dest " ")))
 
-(defun mime-bbdb-canonicalize-dots (str)
+(defun mime-bbdb/canonicalize-dots (str)
   (let (dest)
     (while (string-match "\\." str)
       (setq dest (cons (substring str 0 (match-end 0)) dest))
-      (setq str (substring str (match-end 0)))
-      )
+      (setq str (substring str (match-end 0))))
     (or (string= str "")
         (setq dest (cons str dest)))
     (setq dest (nreverse dest))
-    (mapconcat 'identity dest " ")
-    ))
+    (mapconcat 'identity dest " ")))
 
-(defvar mime-bbdb-canonicalize-full-name-methods
+(defvar mime-bbdb/canonicalize-full-name-methods
   '(eword-decode-string
-    mime-bbdb-canonicalize-dots
-    mime-bbdb-canonicalize-spaces))
+    mime-bbdb/canonicalize-dots
+    mime-bbdb/canonicalize-spaces))
 
 
 ;;; @ BBDB functions for mime-view-mode
 ;;;
 
-(defun mime-bbdb-update-record (&optional offer-to-create)
+(defun mime-bbdb/update-record (&optional offer-to-create)
   "Return the record corresponding to the current MIME previewing message.
 Creating or modifying it as necessary. A record will be created if
-mime-bbdb-auto-create-p is non-nil, or if OFFER-TO-CREATE is non-nil and
+mime-bbdb/auto-create-p is non-nil, or if OFFER-TO-CREATE is non-nil and
 the user confirms the creation."
   (save-excursion
-    (if (and mime::article/preview-buffer
-             (get-buffer mime::article/preview-buffer))
-        (set-buffer mime::article/preview-buffer))
+    (if (and mime-preview-buffer
+             (get-buffer mime-preview-buffer))
+        (set-buffer mime-preview-buffer))
     (if bbdb-use-pop-up
-        (mime-bbdb-pop-up-bbdb-buffer offer-to-create)
-      (let* ((from (std11-field-body "From"))
-             (addr (if from
-                      (car (cdr (mail-extract-address-components from))))))
-        (if (or (null from)
-                (null addr)
-                (string-match (bbdb-user-mail-names) addr))
-            (setq from (or (std11-field-body "To") from))
-         )
+        (mime-bbdb/pop-up-bbdb-buffer offer-to-create)
+      (let* ((message (get-text-property (point-min) 'mime-view-entity))
+            (from (mime-entity-fetch-field message 'From))
+            addr)
+       (if (or (null from)
+                (null (setq addr (car (mime-entity-read-field message 'From))))
+                (string-match (bbdb-user-mail-names)
+                             (std11-address-string addr)))
+            (setq from (or (mime-entity-fetch-field message 'To)
+                          from)))
         (if from
             (bbdb-annotate-message-sender
-             from t
-             (or (bbdb-invoke-hook-for-value mime-bbdb-auto-create-p)
+             (mime-decode-field-body from 'From) t
+             (or (bbdb-invoke-hook-for-value mime-bbdb/auto-create-p)
                  offer-to-create)
-             offer-to-create))
-        ))))
+             offer-to-create))))))
 
-(defun mime-bbdb-annotate-sender (string)
+(defun mime-bbdb/annotate-sender (string)
   "Add a line to the end of the Notes field of the BBDB record
 corresponding to the sender of this message."
   (interactive
    (list (if bbdb-readonly-p
              (error "The Insidious Big Brother Database is read-only.")
            (read-string "Comments: "))))
-  (bbdb-annotate-notes (mime-bbdb-update-record t) string))
+  (bbdb-annotate-notes (mime-bbdb/update-record t) string))
 
-(defun mime-bbdb-edit-notes (&optional arg)
+(defun mime-bbdb/edit-notes (&optional arg)
   "Edit the notes field or (with a prefix arg) a user-defined field
 of the BBDB record corresponding to the sender of this message."
   (interactive "P")
-  (let ((record (or (mime-bbdb-update-record t)
+  (let ((record (or (mime-bbdb/update-record t)
                     (error ""))))
     (bbdb-display-records (list record))
     (if arg
        (bbdb-record-edit-property record nil t)
       (bbdb-record-edit-notes record t))))
 
-(defun mime-bbdb-show-sender ()
+(defun mime-bbdb/show-sender ()
   "Display the contents of the BBDB for the sender of this message.
 This buffer will be in bbdb-mode, with associated keybindings."
   (interactive)
-  (let ((record (mime-bbdb-update-record t)))
+  (let ((record (mime-bbdb/update-record t)))
     (if record
        (bbdb-display-records (list record))
        (error "unperson"))))
 
-(defun mime-bbdb-pop-up-bbdb-buffer (&optional offer-to-create)
+(defun mime-bbdb/pop-up-bbdb-buffer (&optional offer-to-create)
   "Make the *BBDB* buffer be displayed along with the MIME preview window(s),
 displaying the record corresponding to the sender of the current message."
   (let ((framepop (eq temp-buffer-show-function 'framepop-display-buffer)))
@@ -223,7 +217,7 @@ displaying the record corresponding to the sender of the current message."
     (let ((bbdb-gag-messages t)
           (bbdb-use-pop-up nil)
           (bbdb-electric-p nil))
-      (let ((record (mime-bbdb-update-record offer-to-create))
+      (let ((record (mime-bbdb/update-record offer-to-create))
             (bbdb-elided-display (bbdb-pop-up-elided-display))
             (b (current-buffer)))
         (if framepop
@@ -232,18 +226,17 @@ displaying the record corresponding to the sender of the current message."
               (framepop-banish))
           (bbdb-display-records (if record (list record) nil))
           (if (and (null record)
-                   mime-bbdb-delete-empty-window)
+                   mime-bbdb/delete-empty-window)
               (delete-windows-on (get-buffer "*BBDB*"))))
         (set-buffer b)
         record))))
 
-(defun mime-bbdb-define-keys ()
+(defun mime-bbdb/define-keys ()
   (let ((mime-view-mode-map (current-local-map)))
-    (define-key mime-view-mode-map ";" 'mime-bbdb-edit-notes)
-    (define-key mime-view-mode-map ":" 'mime-bbdb-show-sender)
-    ))
+    (define-key mime-view-mode-map ";" 'mime-bbdb/edit-notes)
+    (define-key mime-view-mode-map ":" 'mime-bbdb/show-sender)))
 
-(add-hook 'mime-view-define-keymap-hook 'mime-bbdb-define-keys)
+(add-hook 'mime-view-define-keymap-hook 'mime-bbdb/define-keys)
 
 
 ;;; @ for signature.el
@@ -253,8 +246,7 @@ displaying the record corresponding to the sender of the current message."
   "Extract sigtype information from BBDB."
   (let ((record (bbdb-search-simple nil addr)))
     (and record
-         (bbdb-record-getprop record 'sigtype))
-    ))
+         (bbdb-record-getprop record 'sigtype))))
 
 (defun signature/set-bbdb-sigtype (sigtype addr)
   "Add sigtype information to BBDB."
@@ -267,31 +259,25 @@ displaying the record corresponding to the sender of the current message."
     (if record
         (progn
           (bbdb-record-putprop record 'sigtype sigtype)
-          (bbdb-change-record record nil))
-      )))
+          (bbdb-change-record record nil)))))
 
 (defun signature/get-sigtype-from-bbdb (&optional verbose)
   (let* ((to (std11-field-body "To"))
          (addr (and to
                     (car (cdr (mail-extract-address-components to)))))
          (sigtype (signature/get-bbdb-sigtype addr))
-         return
-         )
+         return)
     (if addr
         (if verbose
             (progn
               (setq return (signature/get-sigtype-interactively sigtype))
               (if (and (not (string-equal return sigtype))
                        (y-or-n-p
-                        (format "Register \"%s\" for <%s>? " return addr))
-                       )
-                  (signature/set-bbdb-sigtype return addr)
-                )
+                        (format "Register \"%s\" for <%s>? " return addr)))
+                  (signature/set-bbdb-sigtype return addr))
               return)
           (or sigtype
-              (signature/get-signature-file-name))
-          ))
-    ))
+              (signature/get-signature-file-name))))))
 
 
 ;;; @ end