-;;; 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) 1995,96,97,98,99,2000 Free Software Foundation, Inc.
-;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Author: MORIOKA Tomohiko <tomo@m17n.org>
;; Keywords: definition, MIME, multimedia, mail, news
;; This file is part of FLIM (Faithful Library about Internet Message).
;;; Code:
+(require 'poe)
+(require 'poem)
+(require 'pcustom)
(require 'mcharset)
+(require 'alist)
-(eval-and-compile
- (defconst mime-library-product ["FLIM" (1 12 6) "Family-K\e.D\8eòenmae"]
- "Product name, version number and code name of MIME-library package.")
+(eval-when-compile
+ (require 'cl) ; list*
+ (require 'luna) ; luna-arglist-to-arguments
)
+(eval-and-compile
+ (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) "\"")))
;;; @ variables
;;;
-(require 'custom)
-
-(eval-when-compile (require 'cl))
-
-(defgroup mime nil
+(defgroup mime '((default-mime-charset custom-variable))
"Emacs MIME Interfaces"
:group 'news
:group 'mail)
-(custom-handle-keyword 'default-mime-charset :group 'mime
- 'custom-variable)
-
(defcustom mime-uuencode-encoding-name-list '("x-uue" "x-uuencode")
"*List of encoding names for uuencode format."
:group 'mime
: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
-;;;
-
-(defmacro make-mime-entity-internal (representation-type location
- &optional content-type
- children parent node-id
- ;; for NOV
- decoded-subject decoded-from
- date message-id references
- chars lines
- xref
- ;; for other fields
- original-header parsed-header
- ;; for buffer representation
- buffer
- header-start header-end
- body-start body-end)
- `(vector ,representation-type ,location
- ,content-type nil nil ,children ,parent ,node-id
- ;; for NOV
- ,decoded-subject ,decoded-from
- ,date ,message-id ,references
- ,chars ,lines
- ,xref
- ;; for other fields
- ,original-header ,parsed-header
- ;; for buffer representation
- ,buffer ,header-start ,header-end ,body-start ,body-end))
-
-(defmacro mime-entity-representation-type-internal (entity)
- `(aref ,entity 0))
-(defmacro mime-entity-set-representation-type-internal (entity type)
- `(aset ,entity 0 ,type))
-(defmacro mime-entity-location-internal (entity)
- `(aref ,entity 1))
-(defmacro mime-entity-set-location-internal (entity location)
- `(aset ,entity 1 ,location))
-
-(defmacro mime-entity-content-type-internal (entity)
- `(aref ,entity 2))
-(defmacro mime-entity-set-content-type-internal (entity type)
- `(aset ,entity 2 ,type))
-(defmacro mime-entity-content-disposition-internal (entity)
- `(aref ,entity 3))
-(defmacro mime-entity-set-content-disposition-internal (entity disposition)
- `(aset ,entity 3 ,disposition))
-(defmacro mime-entity-encoding-internal (entity)
- `(aref ,entity 4))
-(defmacro mime-entity-set-encoding-internal (entity encoding)
- `(aset ,entity 4 ,encoding))
-
-(defmacro mime-entity-children-internal (entity)
- `(aref ,entity 5))
-(defmacro mime-entity-set-children-internal (entity children)
- `(aset ,entity 5 ,children))
-(defmacro mime-entity-parent-internal (entity)
- `(aref ,entity 6))
-(defmacro mime-entity-node-id-internal (entity)
- `(aref ,entity 7))
-
-(defmacro mime-entity-decoded-subject-internal (entity)
- `(aref ,entity 8))
-(defmacro mime-entity-set-decoded-subject-internal (entity subject)
- `(aset ,entity 8 ,subject))
-(defmacro mime-entity-decoded-from-internal (entity)
- `(aref ,entity 9))
-(defmacro mime-entity-set-decoded-from-internal (entity from)
- `(aset ,entity 9 ,from))
-(defmacro mime-entity-date-internal (entity)
- `(aref ,entity 10))
-(defmacro mime-entity-set-date-internal (entity date)
- `(aset ,entity 10 ,date))
-(defmacro mime-entity-message-id-internal (entity)
- `(aref ,entity 11))
-(defmacro mime-entity-set-message-id-internal (entity message-id)
- `(aset ,entity 11 ,message-id))
-(defmacro mime-entity-references-internal (entity)
- `(aref ,entity 12))
-(defmacro mime-entity-set-references-internal (entity references)
- `(aset ,entity 12 ,references))
-(defmacro mime-entity-chars-internal (entity)
- `(aref ,entity 13))
-(defmacro mime-entity-set-chars-internal (entity chars)
- `(aset ,entity 13 ,chars))
-(defmacro mime-entity-lines-internal (entity)
- `(aref ,entity 14))
-(defmacro mime-entity-set-lines-internal (entity lines)
- `(aset ,entity 14 ,lines))
-(defmacro mime-entity-xref-internal (entity)
- `(aref ,entity 15))
-(defmacro mime-entity-set-xref-internal (entity xref)
- `(aset ,entity 15 ,xref))
-
-(defmacro mime-entity-original-header-internal (entity)
- `(aref ,entity 16))
-(defmacro mime-entity-set-original-header-internal (entity header)
- `(aset ,entity 16 ,header))
-(defmacro mime-entity-parsed-header-internal (entity)
- `(aref ,entity 17))
-(defmacro mime-entity-set-parsed-header-internal (entity header)
- `(aset ,entity 17 ,header))
-
-(defmacro mime-entity-buffer-internal (entity)
- `(aref ,entity 18))
-(defmacro mime-entity-set-buffer-internal (entity buffer)
- `(aset ,entity 18 ,buffer))
-(defmacro mime-entity-header-start-internal (entity)
- `(aref ,entity 19))
-(defmacro mime-entity-set-header-start-internal (entity point)
- `(aset ,entity 19 ,point))
-(defmacro mime-entity-header-end-internal (entity)
- `(aref ,entity 20))
-(defmacro mime-entity-set-header-end-internal (entity point)
- `(aset ,entity 20 ,point))
-(defmacro mime-entity-body-start-internal (entity)
- `(aref ,entity 21))
-(defmacro mime-entity-set-body-start-internal (entity point)
- `(aset ,entity 21 ,point))
-(defmacro mime-entity-body-end-internal (entity)
- `(aref ,entity 22))
-(defmacro mime-entity-set-body-end-internal (entity point)
- `(aset ,entity 22 ,point))
-
-
;;; @ message structure
;;;
Following is a list of slots of the structure:
-buffer buffer includes this entity (buffer).
node-id node-id (list of integers)
-header-start minimum point of header in raw-buffer
-header-end maximum point of header in raw-buffer
-body-start minimum point of body in raw-buffer
-body-end maximum point of body in raw-buffer
content-type content-type (content-type)
content-disposition content-disposition (content-disposition)
encoding Content-Transfer-Encoding (string or nil)
(make-variable-buffer-local 'mime-message-structure)
-
-;;; @ for mm-backend
-;;;
-
-(require 'alist)
-
-(defvar mime-entity-implementation-alist nil)
-
-(defmacro mm-define-backend (type &optional parents)
- "Define TYPE as a mm-backend.
-If PARENTS is specified, TYPE inherits PARENTS.
-Each parent must be backend name (symbol)."
- (if parents
- `(let ((rest ',(reverse parents)))
- (while rest
- (set-alist 'mime-entity-implementation-alist
- ',type
- (copy-alist
- (cdr (assq (car rest)
- mime-entity-implementation-alist))))
- (setq rest (cdr rest))
- ))))
-
-(defmacro mm-define-method (name args &rest body)
- "Define NAME as a method function of (nth 1 (car ARGS)) backend.
-
-ARGS is like an argument list of lambda, but (car ARGS) must be
-specialized parameter. (car (car ARGS)) is name of variable and (nth
-1 (car ARGS)) is name of backend."
- (let* ((specializer (car args))
- (class (nth 1 specializer))
- (self (car specializer)))
- `(let ((imps (cdr (assq ',class mime-entity-implementation-alist)))
- (func (lambda ,(if self
- (cons self (cdr args))
- (cdr args))
- ,@body)))
- (if imps
- (set-alist 'mime-entity-implementation-alist
- ',class (put-alist ',name func imps))
- (set-alist 'mime-entity-implementation-alist
- ',class
- (list (cons ',name func)))
- ))))
-
-(put 'mm-define-method 'lisp-indent-function 'defun)
-
-(eval-when-compile
- (defmacro eval-module-depended-macro (module definition)
- (condition-case nil
- (progn
- (require (eval module))
- definition)
- (error `(eval-after-load ,(symbol-name (eval module)) ',definition))
- ))
- )
-
-(eval-module-depended-macro
- 'edebug
- (def-edebug-spec mm-define-method
- (&define name ((arg symbolp)
- [&rest arg]
- [&optional ["&optional" arg &rest arg]]
- &optional ["&rest" arg]
- )
- def-body))
- )
-
-(defsubst mm-arglist-to-arguments (arglist)
- (let (dest)
- (while arglist
- (let ((arg (car arglist)))
- (or (memq arg '(&optional &rest))
- (setq dest (cons arg dest)))
- )
- (setq arglist (cdr arglist)))
- (nreverse dest)))
+(make-obsolete-variable 'mime-message-structure "should not use it.")
;;; @ for mel-backend
"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)))
- ,@(mm-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)
(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)
(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
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)
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)
(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)
(if (fboundp 'dynamic-link)
(let ((path (expand-file-name "base64.so" exec-directory)))
(and (file-exists-p path)
- path)
- ))))
+ path)))))
;;; @ end