X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-def.el;h=a8528e20ecd37f059ce58acdc890ee4b46c78427;hb=77deb981bf01a22bfeb737268029b56a91760f29;hp=8f49b0111b13bdaded0b54d746da87996fbdd868;hpb=3d0e6b789084a42204de5a835cb4024dd6fe650c;p=elisp%2Fflim.git diff --git a/mime-def.el b/mime-def.el index 8f49b01..a8528e2 100644 --- a/mime-def.el +++ b/mime-def.el @@ -4,7 +4,7 @@ ;; Copyright (C) 1999 Electrotechnical Laboratory, JAPAN. ;; Licensed to the Free Software Foundation. -;; Author: MORIOKA Tomohiko +;; Author: MORIOKA Tomohiko ;; Keywords: definition, MIME, multimedia, mail, news ;; This file is part of FLIM (Faithful Library about Internet Message). @@ -26,26 +26,32 @@ ;;; Code: +(require 'poe) +(require 'poem) +(require 'pcustom) (require 'mcharset) +(require 'alist) + +(eval-when-compile (require 'cl)) ; list* (eval-and-compile - (defconst mime-library-product ["FLIM" (1 12 6) "Family-K.DŽòenmae"] + (defconst mime-library-product ["CLIME" (1 13 1) "$B0BEH(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 number-to-string) (mime-product-version mime-library-product) ".") " - \"" (mime-product-code-name mime-library-product) "\""))) @@ -53,18 +59,11 @@ ;;; @ 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 @@ -211,6 +210,11 @@ (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 @@ -224,42 +228,52 @@ (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) + )) + )) -;;; @ message structure -;;; - -(defvar mime-message-structure nil - "Information about structure of message. -Please use reference function `mime-entity-SLOT' to get value of SLOT. - -Following is a list of slots of the structure: - -node-id node-id (list of integers) -content-type content-type (content-type) -content-disposition content-disposition (content-disposition) -encoding Content-Transfer-Encoding (string or nil) -children entities included in this entity (list of entity) - -If an entity includes other entities in its body, such as multipart or -message/rfc822, `mime-entity' structures of them are included in -`children', so the `mime-entity' structure become a tree.") - -(make-variable-buffer-local 'mime-message-structure) +(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))) + (` (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)))) + (` (luna-define-class (, (mm-expand-class-name type)) + (, (nconc (mapcar (function + (lambda (parent) + (mm-expand-class-name parent) + )) + parents) + '(mime-entity)))))) (defmacro mm-define-method (name args &rest body) (or (eq name 'initialize-instance) @@ -269,30 +283,42 @@ message/rfc822, `mime-entity' structures of them are included in (cons (list (car spec) (mm-expand-class-name (nth 1 spec))) (cdr args))) - `(luna-define-method ,name ,args ,@body) + (` (luna-define-method (, name) (, args) (,@ body))) )) + (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)) - )) - ) +(def-edebug-spec mm-define-method + (&define name ((arg symbolp) + [&rest arg] + [&optional ["&optional" arg &rest arg]] + &optional ["&rest" arg] + ) + def-body)) + + +;;; @ message structure +;;; + +(defvar mime-message-structure nil + "Information about structure of message. +Please use reference function `mime-entity-SLOT' to get value of SLOT. + +Following is a list of slots of the structure: + +node-id node-id (list of integers) +content-type content-type (content-type) +content-disposition content-disposition (content-disposition) +encoding Content-Transfer-Encoding (string or nil) +children entities included in this entity (list of entity) -(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)) - ) +If an entity includes other entities in its body, such as multipart or +message/rfc822, `mime-entity' structures of them are included in +`children', so the `mime-entity' structure become a tree.") + +(make-variable-buffer-local 'mime-message-structure) + +(make-obsolete-variable 'mime-message-structure "should not use it.") ;;; @ for mel-backend @@ -304,16 +330,17 @@ 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,9 +381,10 @@ 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) @@ -366,11 +394,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) @@ -384,21 +413,21 @@ 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)