Synch with `flim-1_14'.
[elisp/flim.git] / mime-def.el
index 276dadd..05b0e00 100644 (file)
@@ -1,8 +1,6 @@
-;;; mime-def.el --- definition module about MIME
+;;; mime-def.el --- definition module about MIME -*- coding: iso-2022-jp; -*-
 
-;; Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc.
-;; Copyright (C) 1999 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
+;; Copyright (C) 1995,96,97,98,99,2000 Free Software Foundation, Inc.
 
 ;; Author: MORIOKA Tomohiko <tomo@m17n.org>
 ;; Keywords: definition, MIME, multimedia, mail, news
 (require 'mcharset)
 (require 'alist)
 
-(eval-when-compile (require 'cl))      ; list*
+(eval-when-compile
+  (require 'cl)   ; list*
+  (require 'luna) ; luna-arglist-to-arguments
+  )
 
 (eval-and-compile
-  (defconst mime-library-product ["FLIM" (1 13 2) "Kasanui"]
-    "Product name, version number and code name of MIME-library package.")
-  )
+  (defconst mime-library-product ["CLIME" (1 14 0) "\e$B8^4VF2\e(B"]
+    "Product name, version number and code name of MIME-library package."))
 
 (defmacro mime-product-name (product)
-  `(aref ,product 0))
+  (` (aref (, product) 0)))
 
 (defmacro mime-product-version (product)
-  `(aref ,product 1))
+  (` (aref (, product) 1)))
 
 (defmacro mime-product-code-name (product)
-  `(aref ,product 2))
+  (` (aref (, product) 2)))
 
 (defconst mime-library-version
   (eval-when-compile
     (concat (mime-product-name mime-library-product) " "
-           (mapconcat #'number-to-string
+           (mapconcat (function int-to-string)
                       (mime-product-version mime-library-product) ".")
            " - \"" (mime-product-code-name mime-library-product) "\"")))
 
@@ -59,8 +59,6 @@
 ;;; @ variables
 ;;;
 
-(require 'custom)
-
 (defgroup mime '((default-mime-charset custom-variable))
   "Emacs MIME Interfaces"
   :group 'news
   :type '(repeat string))
 
 
+;;; @@ for encoded-word
+;;;
+
+(defgroup mime-header nil
+  "Header representation, specially encoded-word"
+  :group 'mime)
+
+;;; @@@ decoding
+;;;
+
+(defcustom mime-field-decoding-max-size 1000
+  "*Max size to decode header field."
+  :group 'mime-header
+  :type '(choice (integer :tag "Limit (bytes)")
+                (const :tag "Don't limit" nil)))
+
+;;; @@@ encoding
+;;;
+
+(defcustom mime-field-encoding-method-alist
+  '(("X-Nsubject" . iso-2022-jp-2)
+    ("Newsgroups" . nil)
+    ("Message-ID" . nil)
+    (t            . mime)
+    )
+  "*Alist to specify field encoding method.
+Its key is field-name, value is encoding method.
+
+If method is `mime', this field will be encoded into MIME format.
+
+If method is a MIME-charset, this field will be encoded as the charset
+when it must be convert into network-code.
+
+If method is `default-mime-charset', this field will be encoded as
+variable `default-mime-charset' when it must be convert into
+network-code.
+
+If method is nil, this field will not be encoded."
+  :group 'mime-header
+  :type '(repeat (cons (choice :tag "Field"
+                              (string :tag "Name")
+                              (const :tag "Default" t))
+                      (choice :tag "Method"
+                              (const :tag "MIME conversion" mime)
+                              (symbol :tag "non-MIME conversion")
+                              (const :tag "no-conversion" nil)))))
+
+
 ;;; @ required functions
 ;;;
 
          base64-token-regexp
          base64-token-padding-regexp
          base64-token-padding-regexp
-          "\\)"))
+         "\\)"))
 
 ;; (defconst eword-B-encoding-and-encoded-text-regexp
 ;;   (concat "\\(B\\)\\?" eword-B-encoded-text-regexp))
 ;;;
 
 (defsubst make-mime-content-type (type subtype &optional parameters)
-  (list* (cons 'type type)
-        (cons 'subtype subtype)
-        (nreverse parameters))
-  )
+  (cons (cons 'type type)
+       (cons (cons 'subtype subtype)
+             (nreverse parameters))))
 
 (defsubst mime-content-type-primary-type (content-type)
   "Return primary-type of CONTENT-TYPE."
   (cdr (car content-type)))
 
 (defsubst mime-content-type-subtype (content-type)
-  "Return primary-type of CONTENT-TYPE."
+  "Return subtype of CONTENT-TYPE."
   (cdr (cadr content-type)))
 
 (defsubst mime-content-type-parameters (content-type)
-  "Return primary-type of CONTENT-TYPE."
+  "Return parameters of CONTENT-TYPE."
   (cddr content-type))
 
 (defsubst mime-content-type-parameter (content-type parameter)
   (mime-content-disposition-parameter content-disposition "filename"))
 
 
-;;; @ MIME entity
-;;;
-
-(require 'luna)
-
-(autoload 'mime-entity-content-type "mime")
-(autoload 'mime-parse-multipart "mime-parse")
-(autoload 'mime-parse-encapsulated "mime-parse")
-(autoload 'mime-entity-content "mime")
-
-(luna-define-class mime-entity ()
-                  (location
-                   content-type children parent
-                   node-id
-                   content-disposition encoding
-                   ;; for other fields
-                   original-header parsed-header))
-
-(defalias 'mime-entity-representation-type-internal 'luna-class-name)
-(defalias 'mime-entity-set-representation-type-internal 'luna-set-class-name)
-
-(luna-define-internal-accessors 'mime-entity)
-
-(luna-define-method mime-entity-fetch-field ((entity mime-entity)
-                                            field-name)
-  (or (symbolp field-name)
-      (setq field-name (intern (capitalize (capitalize field-name)))))
-  (cdr (assq field-name
-            (mime-entity-original-header-internal entity))))
-
-(luna-define-method mime-entity-children ((entity mime-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-insert-text-content ((entity mime-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)
-   ))
-
-
-;;; @ for mm-backend
-;;;
-
-(defmacro mm-expand-class-name (type)
-  `(intern (format "mime-%s-entity" ,type)))
-
-(defmacro mm-define-backend (type &optional parents)
-  `(luna-define-class ,(mm-expand-class-name type)
-                     ,(nconc (mapcar (lambda (parent)
-                                       (mm-expand-class-name parent)
-                                       )
-                                     parents)
-                             '(mime-entity))))
-
-(defmacro mm-define-method (name args &rest body)
-  (or (eq name 'initialize-instance)
-      (setq name (intern (format "mime-%s" name))))
-  (let ((spec (car args)))
-    (setq args
-         (cons (list (car spec)
-                     (mm-expand-class-name (nth 1 spec)))
-               (cdr args)))
-    `(luna-define-method ,name ,args ,@body)
-    ))
-
-(put 'mm-define-method 'lisp-indent-function 'defun)
-
-(def-edebug-spec mm-define-method
-  (&define name ((arg symbolp)
-                [&rest arg]
-                [&optional ["&optional" arg &rest arg]]
-                &optional ["&rest" arg]
-                )
-          def-body))
-
-
 ;;; @ message structure
 ;;;
 
@@ -331,16 +285,16 @@ message/rfc822, `mime-entity' structures of them are included in
   "Define NAME as a service for Content-Transfer-Encodings.
 If ARGS is specified, NAME is defined as a generic function for the
 service."
-  `(progn
-     (add-to-list 'mel-service-list ',name)
-     (defvar ,(intern (format "%s-obarray" name)) (make-vector 7 0))
-     ,@(if args
-          `((defun ,name ,args
-              ,@rest
-              (funcall (mel-find-function ',name ,(car (last args)))
-                       ,@(luna-arglist-to-arguments (butlast args)))
-              )))
-     ))
+  (` (progn
+       (add-to-list 'mel-service-list '(, name))
+       (defvar (, (intern (format "%s-obarray" name))) (make-vector 7 0))
+       (,@ (if args
+              (` ((defun (, name) (, args)
+                    (,@ rest)
+                    (funcall (mel-find-function '(, name)
+                                                (, (car (last args))))
+                             (,@ (luna-arglist-to-arguments
+                                  (butlast args))))))))))))
 
 (put 'mel-define-service 'lisp-indent-function 'defun)
 
@@ -354,10 +308,8 @@ service."
          (while (and rest
                      (progn
                        (require (car rest))
-                       (null (setq f (intern-soft encoding ob-array)))
-                       ))
-           (setq rest (cdr rest))
-           )
+                       (null (setq f (intern-soft encoding ob-array)))))
+           (setq rest (cdr rest)))
          f))))
 
 (defsubst mel-copy-method (service src-backend dst-backend)
@@ -367,9 +319,8 @@ service."
     (when f
       (setq sym (intern dst-backend oa))
       (or (fboundp sym)
-         (fset sym (symbol-function f))
-         ))))
-       
+         (fset sym (symbol-function f))))))
+
 (defsubst mel-copy-backend (src-backend dst-backend)
   (let ((services mel-service-list))
     (while services
@@ -381,9 +332,9 @@ service."
 If PARENTS is specified, TYPE inherits PARENTS.
 Each parent must be backend name (string)."
   (cons 'progn
-       (mapcar (lambda (parent)
-                 `(mel-copy-backend ,parent ,type)
-                 )
+       (mapcar (function
+                (lambda (parent)
+                  (` (mel-copy-backend (, parent) (, type)))))
                parents)))
 
 (defmacro mel-define-method (name args &rest body)
@@ -393,11 +344,12 @@ specialized parameter.  (car (car (last ARGS))) is name of variable
 and (nth 1 (car (last ARGS))) is name of backend (encoding)."
   (let* ((specializer (car (last args)))
         (class (nth 1 specializer)))
-    `(progn
-       (mel-define-service ,name)
-       (fset (intern ,class ,(intern (format "%s-obarray" name)))
-            (lambda ,(butlast args)
-              ,@body)))))
+    (` (progn
+        (mel-define-service (, name))
+        (fset (intern (, class) (, (intern (format "%s-obarray" name))))
+              (function
+               (lambda (, (butlast args))
+                 (,@ body))))))))
 
 (put 'mel-define-method 'lisp-indent-function 'defun)
 
@@ -411,21 +363,20 @@ variable and (nth 1 (car (last ARGS))) is name of backend (encoding)."
         (args (cdr spec))
         (specializer (car (last args)))
         (class (nth 1 specializer)))
-    `(let (sym)
-       (mel-define-service ,name)
-       (setq sym (intern ,class ,(intern (format "%s-obarray" name))))
-       (or (fboundp sym)
-          (fset sym (symbol-function ,function))))))
+    (` (let (sym)
+        (mel-define-service (, name))
+        (setq sym (intern (, class) (, (intern (format "%s-obarray" name)))))
+        (or (fboundp sym)
+            (fset sym (symbol-function (, function))))))))
 
 (defmacro mel-define-function (function spec)
   (let* ((name (car spec))
         (args (cdr spec))
         (specializer (car (last args)))
         (class (nth 1 specializer)))
-    `(progn
-       (define-function ,function
-        (intern ,class ,(intern (format "%s-obarray" name))))
-       )))
+    (` (progn
+        (define-function (, function)
+          (intern (, class) (, (intern (format "%s-obarray" name)))))))))
 
 (defvar base64-dl-module
   (if (and (fboundp 'base64-encode-string)
@@ -434,8 +385,7 @@ variable and (nth 1 (car (last ARGS))) is name of backend (encoding)."
     (if (fboundp 'dynamic-link)
        (let ((path (expand-file-name "base64.so" exec-directory)))
          (and (file-exists-p path)
-              path)
-         ))))
+              path)))))
 
 
 ;;; @ end