X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-def.el;h=2444b426888d8c9055ba4a619545225191086b4a;hb=eb9783f46dee7de4c9372e428a26e384e04d60f8;hp=c870f250cfb167eb746dc2e4dc44d3c560c4381e;hpb=a0a1ddc99e2a091b842f608db40de667b57858d2;p=elisp%2Fflim.git diff --git a/mime-def.el b/mime-def.el index c870f25..2444b42 100644 --- a/mime-def.el +++ b/mime-def.el @@ -24,15 +24,26 @@ ;;; Code: -(defconst mime-library-version - '("FLAM-DOODLE" "柑子 7.5YR7.0/11.0" 1 10 0) - "Implementation name, version name and numbers of MIME-library package.") +(eval-and-compile + (defconst mime-library-product ["FLAM-DOODLE" (1 10 2) "赤白橡 5.0YR8.0/6.0"] + "Product name, version number and code name of MIME-library package.") + ) + +(defmacro mime-product-name (product) + `(aref ,product 0)) -(defconst mime-library-version-string - `,(concat (car mime-library-version) " " +(defmacro mime-product-version (product) + `(aref ,product 1)) + +(defmacro mime-product-code-name (product) + `(aref ,product 2)) + +(defconst mime-library-version + (eval-when-compile + (concat (mime-product-name mime-library-product) " " (mapconcat #'number-to-string - (cddr mime-library-version) ".") - " - \"" (cadr mime-library-version) "\"")) + (mime-product-version mime-library-product) ".") + " - \"" (mime-product-code-name mime-library-product) "\""))) ;;; @ variables @@ -309,6 +320,9 @@ message/rfc822, `mime-entity' structures of them are included in (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 @@ -321,6 +335,11 @@ message/rfc822, `mime-entity' structures of them are included in )))) (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))) @@ -355,21 +374,72 @@ message/rfc822, `mime-entity' structures of them are included in ;;; @ for mel-backend ;;; +(defvar mel-service-list nil) + (defmacro mel-define-service (name &optional args &rest rest) - (if args - `(progn - (defvar ,(intern (format "%s-obarray" name)) (make-vector 1 nil)) - (defun ,name ,args - ,@rest - (funcall (mel-find-function ',name ,(car (last args))) - ,@(mm-arglist-to-arguments (butlast args))) - )) - `(defvar ,(intern (format "%s-obarray" name)) (make-vector 1 nil)) - )) + "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 1 nil)) + ,@(if args + `((defun ,name ,args + ,@rest + (funcall (mel-find-function ',name ,(car (last args))) + ,@(mm-arglist-to-arguments (butlast args))) + ))) + )) (put 'mel-define-service 'lisp-indent-function 'defun) + +(defvar mel-encoding-module-alist nil) + +(defsubst mel-find-function-from-obarray (ob-array encoding) + (let* ((f (intern-soft encoding ob-array))) + (or f + (let ((rest (cdr (assoc encoding mel-encoding-module-alist)))) + (while (and rest + (progn + (require (car rest)) + (null (setq f (intern-soft encoding ob-array))) + )) + (setq rest (cdr rest)) + ) + f)))) + +(defsubst mel-copy-method (service src-backend dst-backend) + (let* ((oa (symbol-value (intern (format "%s-obarray" service)))) + (f (mel-find-function-from-obarray oa src-backend)) + sym) + (when f + (setq sym (intern dst-backend oa)) + (or (fboundp sym) + (fset sym (symbol-function f)) + )))) + +(defsubst mel-copy-backend (src-backend dst-backend) + (let ((services mel-service-list)) + (while services + (mel-copy-method (car services) src-backend dst-backend) + (setq services (cdr services))))) + +(defmacro mel-define-backend (type &optional parents) + "Define TYPE as a mel-backend. +If PARENTS is specified, TYPE inherits PARENTS. +Each parent must be backend name (string)." + (cons 'progn + (mapcar (lambda (parent) + `(mel-copy-backend ,parent ,type) + ) + parents))) + (defmacro mel-define-method (name args &rest body) + "Define NAME as a method function of (nth 1 (car (last ARGS))) backend. +ARGS is like an argument list of lambda, but (car (last ARGS)) must be +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 @@ -381,6 +451,11 @@ message/rfc822, `mime-entity' structures of them are included in (put 'mel-define-method 'lisp-indent-function 'defun) (defmacro mel-define-method-function (spec function) + "Set SPEC's function definition to FUNCTION. +First element of SPEC is service. +Rest of ARGS is like an argument list of lambda, but (car (last ARGS)) +must be specialized parameter. (car (car (last ARGS))) is name of +variable and (nth 1 (car (last ARGS))) is name of backend (encoding)." (let* ((name (car spec)) (args (cdr spec)) (specializer (car (last args))) @@ -401,6 +476,12 @@ message/rfc822, `mime-entity' structures of them are included in (intern ,class ,(intern (format "%s-obarray" name)))) ))) +(defvar base64-dl-module + (and (fboundp 'dynamic-link) + (let ((path (expand-file-name "base64.so" exec-directory))) + (and (file-exists-p path) + path)))) + ;;; @ end ;;;