-(defsubst make-mime-entity-internal (representation-type location
- &optional content-type
- children parent node-id
- buffer
- header-start header-end
- body-start body-end)
- (vector representation-type location
- content-type nil nil children parent node-id
- buffer header-start header-end body-start body-end
- nil nil))
-
-(defsubst mime-entity-representation-type-internal (entity)
- (aref entity 0))
-(defsubst mime-entity-set-representation-type-internal (entity type)
- (aset entity 0 type))
-(defsubst mime-entity-location-internal (entity)
- (aref entity 1))
-
-(defsubst mime-entity-content-type-internal (entity)
- (aref entity 2))
-(defsubst mime-entity-set-content-type-internal (entity type)
- (aset entity 2 type))
-(defsubst mime-entity-content-disposition-internal (entity)
- (aref entity 3))
-(defsubst mime-entity-set-content-disposition-internal (entity disposition)
- (aset entity 3 disposition))
-(defsubst mime-entity-encoding-internal (entity)
- (aref entity 4))
-(defsubst mime-entity-set-encoding-internal (entity encoding)
- (aset entity 4 encoding))
-
-(defsubst mime-entity-children-internal (entity)
- (aref entity 5))
-(defsubst mime-entity-set-children-internal (entity children)
- (aset entity 5 children))
-(defsubst mime-entity-parent-internal (entity)
- (aref entity 6))
-(defsubst mime-entity-node-id-internal (entity)
- (aref entity 7))
-
-(defsubst mime-entity-buffer-internal (entity)
- (aref entity 8))
-(defsubst mime-entity-set-buffer-internal (entity buffer)
- (aset entity 8 buffer))
-(defsubst mime-entity-header-start-internal (entity)
- (aref entity 9))
-(defsubst mime-entity-set-header-start-internal (entity point)
- (aset entity 9 point))
-(defsubst mime-entity-header-end-internal (entity)
- (aref entity 10))
-(defsubst mime-entity-set-header-end-internal (entity point)
- (aset entity 10 point))
-(defsubst mime-entity-body-start-internal (entity)
- (aref entity 11))
-(defsubst mime-entity-set-body-start-internal (entity point)
- (aset entity 11 point))
-(defsubst mime-entity-body-end-internal (entity)
- (aref entity 12))
-(defsubst mime-entity-set-body-end-internal (entity point)
- (aset entity 12 point))
-
-(defsubst mime-entity-original-header-internal (entity)
- (aref entity 13))
-(defsubst mime-entity-set-original-header-internal (entity header)
- (aset entity 13 header))
-(defsubst mime-entity-parsed-header-internal (entity)
- (aref entity 14))
-(defsubst mime-entity-set-parsed-header-internal (entity header)
- (aset entity 14 header))
+(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 (function
+ (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))