;;;
;;; tm-edit.el --- Simple MIME Composer for GNU Emacs
;;;
-
-;; Copyright (C) 1993 UMEDA Masanobu
-;; Copyright (C) 1994,1995 MORIOKA Tomohiko
-
-;; Author: UMEDA Masanobu <umerin@mse.kyutech.ac.jp>
-;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;; Version: $Revision: 7.37 $
-;; Keywords: mail, news, MIME, multimedia, multilingual
-
-;; This file is not part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;;; Copyright (C) 1993 UMEDA Masanobu
+;;; Copyright (C) 1994 .. 1996 MORIOKA Tomohiko
+;;;
+;;; Author: UMEDA Masanobu <umerin@mse.kyutech.ac.jp>
+;;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;;; Created: 1994/08/21 renamed from mime.el
+;;; Version: $Revision: 7.68 $
+;;; Keywords: mail, news, MIME, multimedia, multilingual
+;;;
+;;; This file is part of tm (Tools for MIME).
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License as
+;;; published by the Free Software Foundation; either version 2, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with This program. If not, write to the Free Software
+;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;;; Commentary:
;; definition to load mime/editor-mode automatically:
;;
;; (autoload 'mime/editor-mode "tm-edit"
-;; "Minor mode for editing MIME message." t)
+;; "Minor mode for editing MIME message." t)
;;
;; In case of Mail mode (includes VM mode), you need the following
;; hook definition:
;;
;;--[[audio/basic][base64]]^M...audio encoded in base64 comes here...
-;; LCD Archive Entry:
-;; mime|Masanobu UMEDA|umerin@mse.kyutech.ac.jp|
-;; Simple MIME Composer|
-;; $Date: 1995/12/19 17:47:16 $|$Revision: 7.37 $|~/misc/mime.el.Z|
-
;;; Code:
(require 'sendmail)
;;;
(defconst mime-editor/RCS-ID
- "$Id: tm-edit.el,v 7.37 1995/12/19 17:47:16 morioka Exp $")
+ "$Id: tm-edit.el,v 7.68 1996/06/12 05:53:26 morioka Exp $")
(defconst mime-editor/version (get-version-string mime-editor/RCS-ID))
(defvar mime-prefix "\C-c\C-x"
"*Keymap prefix for MIME commands.")
-(defvar mime-signature-file "~/.signature.rtf"
- "*Signature file to be included as a part of a multipart message.")
-
(defvar mime-ignore-preceding-spaces nil
"*Ignore preceding white spaces if non-nil.")
(defvar mime-auto-hide-body t
"*Hide non-textual body encoded in base64 after insertion if non-nil.")
-(defvar mime-body-charset-chooser
- (cond ((boundp 'NEMACS)
- (function mime-body-charset-chooser-for-nemacs))
- ((featurep 'mule)
- (function mime-body-charset-chooser-for-mule))
- ((string-match "^19\\." emacs-version)
- (function mime-body-charset-chooser-for-emacs19))
- (t ;ASCII only emacs
- (function mime-body-charset-chooser-for-emacs18)))
- "*Function to identify charset and encoding of a text in a given region.
-The value is a form of (CHARSET . ENCODING), where ENCODING must be a
-full name, such as base64.")
-
-(defvar mime-string-encoder
- (cond ((boundp 'NEMACS)
- (function mime-string-encoder-for-nemacs))
- ((featurep 'mule)
- (function mime-string-encoder-for-mule))
- ((string-match "^19\\." emacs-version)
- (function mime-string-encoder-for-emacs19))
- (t ;ASCII only emacs
- (function mime-string-encoder-for-emacs18)))
- "*Function to encode a string for given encoding method.
-The method is a form of (CHARSET . ENCODING).")
-
(defvar mime-voice-recorder
(function mime-voice-recorder-for-sun)
"*Function to record a voice message and return a buffer that contains it.")
(defvar mime-editor/translate-hook nil
"*Hook called before translating into a MIME compliant message.
-To insert a signature file specified by mime-signature-file
-(`.signature.rtf' by default) automatically, call the function
+To insert a signature file automatically, call the function
`mime-editor/insert-signature' from this hook.")
(defvar mime-editor/exit-hook nil
("rfc822")
)
("application"
- ("octet-stream"
- ("name")
- ("type" "" "tar" "shar")
- ("conversions"))
+ ("octet-stream" ("type" "" "tar" "shar"))
("postscript")
("x-kiss" ("x-cnf")))
("image"
(defvar mime-file-types
'(("\\.rtf$"
- "text" "richtext" nil nil)
+ "text" "richtext" nil
+ nil
+ nil nil)
("\\.html$"
- "text" "html" nil nil)
+ "text" "html" nil
+ nil
+ nil nil)
("\\.ps$"
- "application" "postscript" nil "quoted-printable"
- (("Content-Description" . file))
+ "application" "postscript" nil
+ "quoted-printable"
+ "attachment" (("filename" . file))
)
("\\.jpg$"
- "image" "jpeg" nil "base64"
- (("Content-Description" . file))
+ "image" "jpeg" nil
+ "base64"
+ "inline" (("filename" . file))
)
("\\.gif$"
- "image" "gif" nil "base64"
- (("Content-Description" . file))
+ "image" "gif" nil
+ "base64"
+ "inline" (("filename" . file))
)
("\\.tiff$"
- "image" "tiff" nil "base64"
- (("Content-Description" . file))
+ "image" "tiff" nil
+ "base64"
+ "inline" (("filename" . file))
)
("\\.pic$"
- "image" "x-pic" nil "base64"
- (("Content-Description" . file)))
+ "image" "x-pic" nil
+ "base64"
+ "inline" (("filename" . file))
+ )
("\\.mag$"
- "image" "x-mag" nil "base64"
- (("Content-Description" . file))
+ "image" "x-mag" nil
+ "base64"
+ "inline" (("filename" . file))
)
("\\.xbm$"
- "image" "x-xbm" nil "base64"
- (("Content-Description" . file))
+ "image" "x-xbm" nil
+ "base64"
+ "inline" (("filename" . file))
)
("\\.xwd$"
- "image" "x-xwd" nil "base64"
- (("Content-Description" . file))
+ "image" "x-xwd" nil
+ "base64"
+ "inline" (("filename" . file))
)
("\\.au$"
- "audio" "basic" nil "base64")
+ "audio" "basic" nil
+ "base64"
+ "attachment" (("filename" . file))
+ )
("\\.mpg$"
- "video" "mpeg" nil "base64"
- (("Content-Description" . file))
+ "video" "mpeg" nil
+ "base64"
+ "attachment" (("filename" . file))
)
("\\.el$"
- "application" "octet-stream" (("name" . file)
- ("type" . "emacs-lisp")) "7bit")
+ "application" "octet-stream" (("type" . "emacs-lisp"))
+ "7bit"
+ "attachment" (("filename" . file))
+ )
("\\.lsp$"
- "application" "octet-stream" (("name" . file)
- ("type" . "common-lisp")) "7bit")
- ("\\.tar.gz$"
- "application" "octet-stream" (("name" . file)
- ("type" . "tar")
- ("conversions" . "gzip")) nil)
+ "application" "octet-stream" (("type" . "common-lisp"))
+ "7bit"
+ "attachment" (("filename" . file))
+ )
+ ("\\.tar\\.gz$"
+ "application" "octet-stream" (("type" . "tar+gzip"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.tgz$"
+ "application" "octet-stream" (("type" . "tar+gzip"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.tar\\.Z$"
+ "application" "octet-stream" (("type" . "tar+compress"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.taz$"
+ "application" "octet-stream" (("type" . "tar+compress"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.gz$"
+ "application" "octet-stream" (("type" . "gzip"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.Z$"
+ "application" "octet-stream" (("type" . "compress"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.lzh$"
+ "application" "octet-stream" (("type" . "lha"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.zip$"
+ "application" "zip" nil
+ nil
+ "attachment" (("filename" . file))
+ )
("\\.diff$"
- "application" "octet-stream" (("name" . file)
- ("type" . "patch")) nil)
+ "application" "octet-stream" (("type" . "patch"))
+ nil
+ "attachment" (("filename" . file))
+ )
+ ("\\.patch$"
+ "application" "octet-stream" (("type" . "patch"))
+ nil
+ "attachment" (("filename" . file))
+ )
("\\.signature"
"text" "plain" nil nil)
- (".*" nil nil nil nil)
+ (".*"
+ "application" "octet-stream" nil
+ nil
+ "attachment" (("filename" . file))
+ )
)
"*Alist of file name, types, parameters, and default encoding.
If encoding is nil, it is determined from its contents.")
+;;; @@ about charset, encoding and transfer-level
+;;;
+
+(defvar mime-editor/transfer-level 7
+ "*A number of network transfer level. It should be bigger than 7.")
+(make-variable-buffer-local 'mime-editor/transfer-level)
+
+(defvar mime-editor/transfer-level-string
+ (mime/encoding-name mime-editor/transfer-level 'not-omit)
+ "*A string formatted version of mime/defaul-transfer-level")
+(make-variable-buffer-local 'mime-editor/transfer-level-string)
+
+(defvar mime-editor/charset-default-encoding-alist
+ (mime/make-charset-default-encoding-alist mime-editor/transfer-level))
+(make-variable-buffer-local 'mime-editor/charset-default-encoding-alist)
+
;;; @@ about message inserting
;;;
(defvar mime-editor/yank-ignored-field-list
- '("Received" "Sender" "Approved" "Path" "Status" "X-VM-.*" "X-UIDL")
+ '("Received" "Approved" "Path" "Replied" "Status" "X-VM-.*" "X-UIDL")
"Delete these fields from original message when it is inserted
as message/rfc822 part.
Each elements are regexp of field-name. [tm-edit.el]")
(defvar mime-editor/split-blind-field-regexp
"\\(^[BDFbdf]cc:\\|^cc:[ \t]*$\\)")
-(defvar mime-editor/message-default-sender-alist
- '((mail-mode . mail-send-and-exit)
- (mh-letter-mode . mh-send-letter)
- (news-reply-mode . gnus-inews-news)
- ))
-
(defvar mime-editor/split-message-sender-alist
- '((mail-mode
- . (lambda ()
- (interactive)
- (sendmail-send-it)
- ))
- (mh-letter-mode
+ '((mh-letter-mode
. (lambda (&optional arg)
(interactive "P")
(write-region (point-min) (point-max)
))
))
-(defvar mime-editor/window-config-alist
- '((mail-mode . nil)
- (mh-letter-mode . mh-previous-window-config)
- (news-reply-mode . (cond ((boundp 'gnus-winconf-post-news)
- (prog1
- gnus-winconf-post-news
- (setq gnus-winconf-post-news nil)
- ))
- ((boundp 'gnus-prev-winconf)
- (prog1
- gnus-prev-winconf
- (setq gnus-prev-winconf nil)
- ))
- ))
- ))
-
(defvar mime-editor/news-reply-mode-server-running nil)
(format "1.0 (generated by tm-edit %s)" mime-editor/version)
"MIME version number.")
+(defconst mime-editor/mime-map (make-sparse-keymap)
+ "Keymap for MIME commands.")
+
;;; @ keymap and menu
;;;
(defvar mime/editor-mode-flag nil)
(make-variable-buffer-local 'mime/editor-mode-flag)
-(set-alist 'minor-mode-alist 'mime/editor-mode-flag '(" MIME-Edit"))
+(set-alist 'minor-mode-alist
+ 'mime/editor-mode-flag
+ '((" MIME-Edit " mime-editor/transfer-level-string)))
(defun mime-editor/define-keymap (keymap)
"Add mime-editor commands to KEYMAP."
(define-key keymap "?" 'mime-editor/help)
))
+(mime-editor/define-keymap mime-editor/mime-map)
+
(defconst mime-editor/menu-title "MIME-Edit")
(defconst mime-editor/menu-list
- (nconc
- '((mime-help "Describe MIME editor mode" mime-editor/help)
- (file "Insert File" mime-editor/insert-file)
- (external "Insert External" mime-editor/insert-external)
- (voice "Insert Voice" mime-editor/insert-voice)
- (message "Insert Message" mime-editor/insert-message)
- (mail "Insert Mail" mime-editor/insert-mail)
- (signature "Insert Signature" mime-editor/insert-signature)
- (text "Insert Text" mime-editor/insert-text)
- (tag "Insert Tag" mime-editor/insert-tag)
- (alternative "Enclose as alternative"
- mime-editor/enclose-alternative-region)
- (parallel "Enclose as parallel" mime-editor/enclose-parallel-region)
- (mixed "Enclose as serial" mime-editor/enclose-mixed-region)
- (digest "Enclose as digest" mime-editor/enclose-digest-region)
- (signed "Enclose as signed" mime-editor/enclose-signed-region)
- (encrypted "Enclose as encrypted" mime-editor/enclose-encrypted-region)
- (key "Insert Public Key" mime-editor/insert-key)
- (split "About split" mime-editor/set-split)
- )
- (if (and (featurep 'mailcrypt)
- (not (or mime-editor/signing-type mime-editor/encrypting-type)))
- '((sign "About sign" mime-editor/set-sign)
- (encrypt "About encryption" mime-editor/set-encrypt)
- ))
- '((preview "Preview Message" mime-editor/preview-message))
- )
+ '((mime-help "Describe MIME editor mode" mime-editor/help)
+ (file "Insert File" mime-editor/insert-file)
+ (external "Insert External" mime-editor/insert-external)
+ (voice "Insert Voice" mime-editor/insert-voice)
+ (message "Insert Message" mime-editor/insert-message)
+ (mail "Insert Mail" mime-editor/insert-mail)
+ (signature "Insert Signature" mime-editor/insert-signature)
+ (text "Insert Text" mime-editor/insert-text)
+ (tag "Insert Tag" mime-editor/insert-tag)
+ (alternative "Enclose as alternative"
+ mime-editor/enclose-alternative-region)
+ (parallel "Enclose as parallel" mime-editor/enclose-parallel-region)
+ (mixed "Enclose as serial" mime-editor/enclose-mixed-region)
+ (digest "Enclose as digest" mime-editor/enclose-digest-region)
+ (signed "Enclose as signed" mime-editor/enclose-signed-region)
+ (encrypted "Enclose as encrypted" mime-editor/enclose-encrypted-region)
+ (key "Insert Public Key" mime-editor/insert-key)
+ (split "About split" mime-editor/set-split)
+ (sign "About sign" mime-editor/set-sign)
+ (encrypt "About encryption" mime-editor/set-encrypt)
+ (preview "Preview Message" mime-editor/preview-message)
+ (level "Toggle transfer-level" mime-editor/toggle-transfer-level)
+ )
"MIME-edit menubar entry.")
(defun mime-editor/define-menu-for-emacs19 ()
(reverse mime-editor/menu-list)
))
-;;; modified by Pekka Marjola <pema@niksula.hut.fi>
+;;; modified by Pekka Marjola <pema@iki.fi>
;;; 1995/9/5 (c.f. [tm-en:69])
(defun mime-editor/define-menu-for-xemacs ()
"Define menu for Emacs 19."
;;; modified by Steven L. Baur <steve@miranova.com>
;;; 1995/12/6 (c.f. [tm-en:209])
-(if (and (string-match "XEmacs\\|Lucid" emacs-version)
- (not (boundp 'mime-editor/popup-menu-for-xemacs)))
+(if (and running-xemacs (not (boundp 'mime-editor/popup-menu-for-xemacs)))
(setq mime-editor/popup-menu-for-xemacs
(append '("MIME Commands" "---")
(mapcar (function (lambda (item)
\\[mime-editor/insert-key] insert PGP public key.
\\[mime-editor/preview-message] preview editing MIME message.
\\[mime-editor/exit] exit and translate into a MIME compliant message.
-\\[mime-editor/maybe-translate] exit, translate and run the original command.
+\\[mime-editor/maybe-translate] exit and translate if in MIME mode, then split.
\\[mime-editor/help] show this help.
Additional commands are available in some major modes:
mime-prefix
Specifies a key prefix for MIME minor mode commands.
- mime-signature-file
- Specifies a signature file to be included as part of a multipart
- message.
-
mime-ignore-preceding-spaces
Preceding white spaces in a message body are ignored if non-nil.
Hide a non-textual body message encoded in base64 after insertion
if non-nil.
- mime-body-charset-chooser
- Specifies a function to identify charset and encoding of a text in
- a given region. The value is a form of (CHARSET . ENCODING),
- where ENCODING must be a full name, such as base64.
-
- mime-string-encoder
- Specifies a function to encode a string for given encoding method.
- The method is a form of (CHARSET . ENCODING).
-
mime-voice-recorder
Specifies a function to record a voice message and return a buffer
that contains it. The function mime-voice-recorder-for-sun is for
(error "You are already editing a MIME message.")
(setq mime/editor-mode-flag t)
;; Remember old key bindings.
- (make-local-variable 'mime/editor-mode-old-local-map)
- (setq mime/editor-mode-old-local-map (current-local-map))
- ;; Add MIME commands to current local map.
- (use-local-map (copy-keymap (current-local-map)))
+ (if running-xemacs
+ nil
+ (make-local-variable 'mime/editor-mode-old-local-map)
+ (setq mime/editor-mode-old-local-map (current-local-map))
+ ;; Add MIME commands to current local map.
+ (use-local-map (copy-keymap (current-local-map)))
+ )
(if (not (lookup-key (current-local-map) mime-prefix))
- (define-key (current-local-map) mime-prefix (make-sparse-keymap)))
- (mime-editor/define-keymap (lookup-key (current-local-map) mime-prefix))
+ (define-key (current-local-map) mime-prefix mime-editor/mime-map))
+
+ ;; Set transfer level into mode line
+ ;;
+ (setq mime-editor/transfer-level-string
+ (mime/encoding-name mime-editor/transfer-level 'not-omit))
+ (force-mode-line-update)
;; Define menu. Menus for other emacs implementations are
;; welcome.
- ;; modified by Pekka Marjola <pema@niksula.hut.fi>
- ;; 1995/9/5 (c.f. [tm-eng:69])
- (cond ((string-match "XEmacs\\|Lucid" emacs-version)
+ (cond (running-xemacs
(mime-editor/define-menu-for-xemacs))
- ((string-match "^19\\." emacs-version)
+ ((>= emacs-major-version 19)
(mime-editor/define-menu-for-emacs19)
))
;; end
(mime-editor/translate-buffer)))
;; Restore previous state.
(setq mime/editor-mode-flag nil)
- (use-local-map mime/editor-mode-old-local-map)
-
- ;; modified by Pekka Marjola <pema@niksula.hut.fi>
- ;; 1995/9/5 (c.f. [tm-eng:69])
- (if (string-match "XEmacs\\|Lucid" emacs-version)
- (progn
- (delete-menu-item (list mime-editor/menu-title))
- ; should rather be const
- ;; (while mime-editor/xemacs-old-bindings
- ;; (eval (pop mime-editor/xemacs-old-bindings)))
- (local-unset-key mime-prefix)))
- ;; end
+ (cond (running-xemacs
+ ;; mime-prefix only defined if binding was nil
+ (if (eq (lookup-key (current-local-map) mime-prefix)
+ mime-editor/mime-map)
+ (define-key (current-local-map) mime-prefix nil))
+ (delete-menu-item (list mime-editor/menu-title)))
+ (t
+ (use-local-map mime/editor-mode-old-local-map)))
(setq selective-display mime/editor-mode-old-selective-display)
(set-buffer-modified-p (buffer-modified-p))
(defun mime-editor/insert-text ()
"Insert a text message.
-Charset is automatically obtained from the mime-body-charset-chooser."
+Charset is automatically obtained from the `mime/lc-charset-alist'."
(interactive)
(if (and (mime-editor/insert-tag "text" nil nil)
(looking-at mime-editor/single-part-tag-regexp))
(subtype (nth 1 guess))
(parameters (nth 2 guess))
(default (nth 3 guess)) ;Guess encoding from its file name.
- (fields (nth 4 guess))
+ (disposition-type (nth 4 guess))
+ (disposition-params (nth 5 guess))
(encoding
(if (not (interactive-p))
default
mime-encoding-method-alist nil t nil))))
(if (string-equal encoding "")
(setq encoding default))
- (if (or (consp parameters) (consp fields))
+ (if (or (consp parameters) (stringp disposition-type))
(let ((rest parameters) cell attribute value)
(setq parameters "")
(while rest
(setq attribute (car cell))
(setq value (cdr cell))
(if (eq value 'file)
- (setq value (file-name-nondirectory file))
+ (setq value (rfc822/wrap-as-quoted-string
+ (file-name-nondirectory file)))
)
(setq parameters (concat parameters "; " attribute "=" value))
(setq rest (cdr rest))
)
- (setq rest fields)
- (while rest
- (setq cell (car rest))
- (setq attribute (car cell))
- (setq value (cdr cell))
- (if (eq value 'file)
- (setq value (file-name-nondirectory file))
- )
- (setq parameters (concat parameters "\n" attribute ": " value))
- (setq rest (cdr rest))
- )
+ (if disposition-type
+ (progn
+ (setq parameters
+ (concat parameters "\n"
+ "Content-Disposition: " disposition-type))
+ (setq rest disposition-params)
+ (while rest
+ (setq cell (car rest))
+ (setq attribute (car cell))
+ (setq value (cdr cell))
+ (if (eq value 'file)
+ (setq value (rfc822/wrap-as-quoted-string
+ (file-name-nondirectory file)))
+ )
+ (setq parameters
+ (concat parameters "; " attribute "=" value))
+ (setq rest (cdr rest))
+ )
+ ))
))
(mime-editor/insert-tag pritype subtype parameters)
(mime-editor/insert-binary-file file encoding)
)))
(defun mime-editor/insert-signature (&optional arg)
- "Insert a signature file specified by mime-signature-file."
+ "Insert a signature file."
(interactive "P")
- (let ((signature
- (expand-file-name
- (if arg
- (read-file-name "Insert your signature: "
- (concat signature-file-name "-")
- signature-file-name
- nil)
- (signature/get-signature-file-name))))
- )
- (if signature-insert-at-eof
- (goto-char (point-max))
- )
- (apply (function mime-editor/insert-tag)
- (mime-find-file-type signature))
- (if (file-readable-p signature)
- (progn
- (goto-char (point-max))
- (if (not (bolp))
- (insert "\n"))
- (delete-blank-lines)
- (insert-file-contents signature)
- (set-buffer-modified-p (buffer-modified-p))
- ; force mode line update
- ))))
+ (let ((signature-insert-hook
+ (function
+ (lambda ()
+ (apply (function mime-editor/insert-tag)
+ (mime-find-file-type signature-file-name))
+ )))
+ )
+ (insert-signature arg)
+ ))
\f
;; Insert a new tag around a point.
(exist-next-tag (save-excursion
(insert "\n")
)))
- ;; (beginning-of-line)
- ;; (cond ((and oldtag ;Text
- ;; (not (eobp))
- ;; (save-excursion
- ;; (forward-line -1)
- ;; (looking-at mime-editor/beginning-tag-regexp)
- ;; )
- ;; (or mime-ignore-same-text-tag
- ;; (not (string-equal oldtag newtag))))
- ;; ;; If point is at the next of current tag, move to the
- ;; ;; beginning of the tag to disable insertion of extra tag.
- ;; (forward-line -1))
- ;; ((and oldtag ;Text
- ;; (not (eobp))
- ;; (not (looking-at mime-editor/tag-regexp))
- ;; (or mime-ignore-same-text-tag
- ;; (not (string-equal oldtag newtag))))
- ;; ;; Copy current tag to break a text into two.
- ;; (save-excursion
- ;; (insert oldtag "\n")))
- ;; ((and (null oldtag) ;Not text
- ;; (not (looking-at mime-editor/tag-regexp)))
- ;; ;; Adjust insertion point. In the middle of text, it is
- ;; ;; okay to break the text into two. However, it should not
- ;; ;; be broken into two, if otherwise.
- ;; (goto-char (mime-editor/content-end))
- ;; (if (eolp)
- ;; (forward-line 1))
- ;; (if (not (bolp))
- ;; (insert "\n"))
- ;; ))
(if (not (bolp))
(if exist-prev-tag
(forward-line 1)
(insert-buffer-substring buffer)
;; Encode binary message if necessary.
(if encoding
- (mime-encode-region encoding start (point-max))))
+ (mime-encode-region start (point-max) encoding)
+ ))
(if hide-p
(progn
(mime-flag-region (point-min) (1- (point-max)) ?\^M)
(defun mime-editor/choose-charset ()
"Choose charset of a text following current point."
- (save-excursion
- (let* ((beg (point))
- (end (mime-editor/content-end)))
- (car (funcall mime-body-charset-chooser beg end)))))
-
-(defun mime-editor/choose-encoding ()
- "Choose encoding of a text following current point."
- (save-excursion
- (let* ((beg (point))
- (end (mime-editor/content-end)))
- (cdr (funcall mime-body-charset-chooser beg end)))))
+ (mime/find-charset-region (point) (mime-editor/content-end))
+ )
(defun mime-make-text-tag (&optional subtype)
"Make a tag for a text after current point.
(mime-prompt-for-parameters-1 (cdr (assoc answer (cdr parameter)))))
))
-(defun mime-encode-string (encoding string)
- "Using ENCODING encode a STRING.
-If the STRING is too long, the encoded string may be broken into
-several lines."
- (save-excursion
- (set-buffer (get-buffer-create " *MIME encoding*"))
- (erase-buffer)
- (insert string)
- (mime-encode-region encoding (point-min) (point-max))
- (prog1
- (buffer-substring (point-min) (point-max))
- (kill-buffer (current-buffer)))))
-
-(defun mime-decode-string (encoding string)
- "Using ENCODING decode a STRING."
- (save-excursion
- (set-buffer (get-buffer-create " *MIME decoding*"))
- (erase-buffer)
- (insert string)
- (mime-decode-region encoding (point-min) (point-max))
- (prog1
- (buffer-substring (point-min) (point-max))
- (kill-buffer (current-buffer)))))
-
(defun mime-flag-region (from to flag)
"Hides or shows lines from FROM to TO, according to FLAG.
If FLAG is `\\n' (newline character) then text is shown,
;;; @ Translate the tagged MIME messages into a MIME compliant message.
;;;
+(defvar mime-editor/translate-buffer-hook
+ '(mime-editor/pgp-enclose-buffer
+ mime/encode-message-header
+ mime-editor/translate-body))
+
(defun mime-editor/translate-buffer ()
"Encode the tagged MIME message in current buffer in MIME compliant message."
(interactive)
(if (catch 'mime-editor/error
(save-excursion
- (mime/encode-message-header)
- (mime-editor/translate-body)
- (mime-editor/pgp-processing)
+ (run-hooks 'mime-editor/translate-buffer-hook)
))
(progn
(undo)
(mime-editor/sign-pgp-elkins bb eb boundary)
)
((eq mime-editor/signing-type 'pgp-kazu)
- (mime-editor/process-pgp-kazu 'mc-sign
- bb eb boundary)
+ (mime-editor/sign-pgp-kazu bb eb boundary)
)
))
((string= type "encrypted")
- (cond ((eq mime-editor/signing-type 'pgp-elkins)
+ (cond ((eq mime-editor/encrypting-type 'pgp-elkins)
(mime-editor/encrypt-pgp-elkins bb eb boundary)
)
- ((eq mime-editor/signing-type 'pgp-kazu)
- (mime-editor/process-pgp-kazu 'mc-encrypt
- bb eb boundary)
+ ((eq mime-editor/encrypting-type 'pgp-kazu)
+ (mime-editor/encrypt-pgp-kazu bb eb boundary)
)))
(t
(setq boundary
))
boundary))))
+
+(autoload 'mc-pgp-lookup-key "mc-pgp")
+(autoload 'mc-pgp-sign-region "mc-pgp")
+(autoload 'mc-pgp-encrypt-region "mc-pgp")
+
(defun tm:mc-pgp-generic-parser (result)
(let ((ret (mc-pgp-generic-parser result)))
(if (consp ret)
(vector (car ret)(cdr ret))
)))
-(autoload 'mc-pgp-lookup-key "mc-pgp")
-
(defun tm:mc-process-region
(beg end passwd program args parser &optional buffer boundary)
(let ((obuf (current-buffer))
(defun mime-editor/encrypt-pgp-elkins (beg end boundary)
(save-excursion
(save-restriction
- (narrow-to-region beg end)
- (let* ((ret
- (mime-editor/translate-region beg end boundary))
- (ctype (car ret))
- (encoding (nth 1 ret))
- (parts (nth 3 ret))
- (pgp-boundary (concat "pgp-" boundary))
- )
- (goto-char beg)
- (insert (format "Content-Type: %s\n" ctype))
- (if encoding
- (insert (format "Content-Transfer-Encoding: %s\n" encoding))
- )
- (insert "\n")
- (if (null
- (progn
- (goto-char beg)
- (insert "=\n")
- (prog1
- (let ((mail-header-separator "="))
- (call-interactively 'mc-encrypt)
- )
- (goto-char beg)
- (and (search-forward "=\n")
- (replace-match ""))
- )))
- (throw 'mime-editor/error 'pgp-error)
- )
- (goto-char beg)
- (insert (format "--[[multipart/encrypted;
- boundary=\"%s\"; protocol=\"application/pgp-encrypted\"][7bit]]
+ (let ((from (rfc822/get-field-body "From"))
+ (to (rfc822/get-field-body "To"))
+ (cc (rfc822/get-field-body "cc"))
+ recipients)
+ (narrow-to-region beg end)
+ (let* ((ret
+ (mime-editor/translate-region beg end boundary))
+ (ctype (car ret))
+ (encoding (nth 1 ret))
+ (parts (nth 3 ret))
+ (pgp-boundary (concat "pgp-" boundary))
+ )
+ (goto-char beg)
+ (if (and (stringp from)
+ (not (string-equal from "")))
+ (insert (format "From: %s\n" from))
+ )
+ (if (and (stringp to)
+ (not (string-equal to "")))
+ (progn
+ (insert (format "To: %s\n" to))
+ (setq recipients to)
+ ))
+ (if (and (stringp cc)
+ (not (string-equal cc "")))
+ (progn
+ (insert (format "cc: %s\n" cc))
+ (if recipients
+ (setq recipients (concat recipients "," cc))
+ (setq recipients cc)
+ )))
+ (insert (format "Content-Type: %s\n" ctype))
+ (if encoding
+ (insert (format "Content-Transfer-Encoding: %s\n" encoding))
+ )
+ (insert "\n")
+ (if (null
+ (let ((mc-pgp-always-sign 'never))
+ (mc-pgp-encrypt-region
+ (mc-split "\\([ \t\n]*,[ \t\n]*\\)+" recipients)
+ (point-min) (point-max) from nil)
+ ))
+ (throw 'mime-editor/error 'pgp-error)
+ )
+ (goto-char beg)
+ (insert (format "--[[multipart/encrypted;
+ boundary=\"%s\";
+ protocol=\"application/pgp-encrypted\"][7bit]]
--%s
Content-Type: application/pgp-encrypted
Content-Transfer-Encoding: 7bit
" pgp-boundary pgp-boundary pgp-boundary))
- (goto-char (point-max))
- (insert (format "\n--%s--\n" pgp-boundary))
- ))
- ))
+ (goto-char (point-max))
+ (insert (format "\n--%s--\n" pgp-boundary))
+ )))))
-(defun mime-editor/process-pgp-kazu (type beg end boundary)
+(defun mime-editor/sign-pgp-kazu (beg end boundary)
(save-excursion
(save-restriction
(narrow-to-region beg end)
(insert (format "Content-Transfer-Encoding: %s\n" encoding))
)
(insert "\n")
- (if (null
- (progn
- (goto-char beg)
- (insert "=\n")
- (prog1
- (let ((mail-header-separator "="))
- (call-interactively type)
- )
- (goto-char beg)
- (and (search-forward "=\n")
- (replace-match ""))
- )))
+ (or (let ((program-coding-system-alist
+ (cons (cons (cons nil ".*pgp.*")
+ (cons *noconv* *noconv*))
+ program-coding-system-alist))
+ )
+ (mc-pgp-sign-region beg (point-max))
+ )
(throw 'mime-editor/error 'pgp-error)
- )
+ )
(goto-char beg)
(insert
"--[[application/pgp; format=mime][7bit]]\n")
))
))
+(defun mime-editor/encrypt-pgp-kazu (beg end boundary)
+ (save-excursion
+ (let ((from (rfc822/get-field-body "From"))
+ (to (rfc822/get-field-body "To"))
+ (cc (rfc822/get-field-body "cc"))
+ recipients)
+ (save-restriction
+ (narrow-to-region beg end)
+ (let* ((ret
+ (mime-editor/translate-region beg end boundary))
+ (ctype (car ret))
+ (encoding (nth 1 ret))
+ (parts (nth 3 ret))
+ )
+ (goto-char beg)
+ (if (and (stringp from)
+ (not (string-equal from "")))
+ (insert (format "From: %s\n" from))
+ )
+ (if (and (stringp to)
+ (not (string-equal to "")))
+ (progn
+ (insert (format "To: %s\n" to))
+ (setq recipients to)
+ ))
+ (if (and (stringp cc)
+ (not (string-equal cc "")))
+ (progn
+ (insert (format "cc: %s\n" cc))
+ (if recipients
+ (setq recipients (concat recipients "," cc))
+ (setq recipients cc)
+ )))
+ (insert (format "Content-Type: %s\n" ctype))
+ (if encoding
+ (insert (format "Content-Transfer-Encoding: %s\n" encoding))
+ )
+ (insert "\n")
+ (or (let ((program-coding-system-alist
+ (cons (cons (cons nil ".*pgp.*")
+ (cons *noconv* *noconv*))
+ program-coding-system-alist))
+ )
+ (mc-pgp-encrypt-region
+ (mc-split "\\([ \t\n]*,[ \t\n]*\\)+" recipients)
+ beg (point-max))
+ )
+ (throw 'mime-editor/error 'pgp-error)
+ )
+ (goto-char beg)
+ (insert
+ "--[[application/pgp; format=mime][7bit]]\n")
+ ))
+ )))
+
(defun mime-editor/translate-body ()
"Encode the tagged MIME body in current buffer in MIME compliant message."
(interactive)
(save-excursion
(let ((boundary
- (concat mime-multipart-boundary " " (current-time-string)))
+ (concat mime-multipart-boundary "_"
+ (replace-space-with-underline (current-time-string))
+ ))
(i 1)
- (time (current-time-string))
ret)
(while (mime-editor/process-multipart-1
- (format "%s %s-%d" mime-multipart-boundary time i))
+ (format "%s-%d" boundary i))
(setq i (1+ i))
)
(save-restriction
(point))))
(setq ret (mime-editor/translate-region
beg end
- (format "%s %s-%d" mime-multipart-boundary time i)))
+ (format "%s-%d" boundary i)))
))
(let ((contype (car ret)) ;Content-Type
(encoding (nth 1 ret)) ;Content-Transfer-Encoding
(defun mime-editor/translate-region (beg end &optional boundary multipart)
(if (null boundary)
(setq boundary
- (concat mime-multipart-boundary " " (current-time-string)))
+ (concat mime-multipart-boundary "_"
+ (replace-space-with-underline (current-time-string))))
)
(save-excursion
(save-restriction
;; Remove extra whitespaces after the tag.
(if (looking-at "[ \t]+$")
(delete-region (match-beginning 0) (match-end 0)))
- (cond ((= (following-char) ?\^M)
- ;; It must be image, audio or video.
- (let ((beg (point))
- (end (mime-editor/content-end)))
- ;; Insert explicit MIME tags after hidden messages.
- (forward-line 1)
- (if (and (not (eobp))
- (not (looking-at mime-editor/single-part-tag-regexp)))
- (progn
- (insert (mime-make-text-tag) "\n")
- (forward-line -1) ;Process it again as text.
+ (cond
+ ((= (following-char) ?\^M)
+ ;; It must be image, audio or video.
+ (let ((beg (point))
+ (end (mime-editor/content-end)))
+ ;; Insert explicit MIME tags after hidden messages.
+ (forward-line 1)
+ (if (and (not (eobp))
+ (not (looking-at mime-editor/single-part-tag-regexp)))
+ (progn
+ (insert (mime-make-text-tag) "\n")
+ (forward-line -1) ;Process it again as text.
+ ))
+ ;; Show a hidden message. The point is not altered
+ ;; after the conversion.
+ (mime-flag-region beg end ?\n)
+ ))
+ ((mime-test-content-type contype "message")
+ ;; Content-type "message" should be sent as is.
+ (forward-line 1)
+ )
+ ((mime-test-content-type contype "text")
+ ;; Define charset for text if necessary.
+ (setq charset (or charset (mime-editor/choose-charset)))
+ (mime-editor/define-charset charset)
+ (cond ((string-equal contype "text/x-rot13-47")
+ (save-excursion
+ (forward-line)
+ (set-mark (point))
+ (goto-char (mime-editor/content-end))
+ (tm:caesar-region)
+ ))
+ ((string-equal contype "text/enriched")
+ (save-excursion
+ (let ((beg (progn
+ (forward-line)
+ (point)))
+ (end (mime-editor/content-end))
+ )
+ (enriched-encode beg end)
+ (goto-char beg)
+ (if (search-forward "\n\n")
+ (delete-region beg (match-end 0))
+ )
+ ))))
+ ;; Point is now on current tag.
+ ;; Define encoding and encode text if necessary.
+ (or encoding ;Encoding is not specified.
+ (let* ((encoding
+ (cdr
+ (assoc charset
+ mime-editor/charset-default-encoding-alist)
))
- ;; Show a hidden message. The point is not altered
- ;; after the conversion.
- (mime-flag-region beg end ?\n)))
- ((mime-test-content-type contype "message")
- ;; Content-type "message" should be sent as is.
- (forward-line 1))
- ((mime-test-content-type contype "text")
- ;; Define charset for text if necessary.
- (setq charset (or charset (mime-editor/choose-charset)))
- (mime-editor/define-charset charset)
- (if (string-equal contype "text/x-rot13-47")
- (save-excursion
- (forward-line)
- (set-mark (point))
- (goto-char (mime-editor/content-end))
- (tm:caesar-region)
- ))
- ;; Point is now on current tag.
- ;; Define encoding and encode text if necessary.
- (if (null encoding) ;Encoding is not specified.
- (let* ((encoding (mime-editor/choose-encoding))
- (beg (mime-editor/content-beginning))
- (end (mime-editor/content-end))
- (body (buffer-substring beg end))
- (encoded (funcall mime-string-encoder
- (cons charset encoding) body)))
- (if (not (string-equal body encoded))
- (progn
- (goto-char beg)
- (delete-region beg end)
- (insert encoded)
- (goto-char beg)))
- (mime-editor/define-encoding encoding)))
- (forward-line 1))
- ((null encoding) ;Encoding is not specified.
- ;; Application, image, audio, video, and any other
- ;; unknown content-type without encoding should be
- ;; encoded.
- (let* ((encoding "base64") ;Encode in BASE64 by default.
- (beg (mime-editor/content-beginning))
- (end (mime-editor/content-end))
- (body (buffer-substring beg end))
- (encoded (funcall mime-string-encoder
- (cons nil encoding) body)))
- (if (not (string-equal body encoded))
- (progn
- (goto-char beg)
- (delete-region beg end)
- (insert encoded)
- (goto-char beg)))
- (mime-editor/define-encoding encoding))
- (forward-line 1))
- )
+ (beg (mime-editor/content-beginning))
+ )
+ (mime-charset-encode-region beg (mime-editor/content-end)
+ charset)
+ (mime-encode-region beg (mime-editor/content-end) encoding)
+ (mime-editor/define-encoding encoding)
+ ))
+ (forward-line 1)
+ )
+ ((null encoding) ;Encoding is not specified.
+ ;; Application, image, audio, video, and any other
+ ;; unknown content-type without encoding should be
+ ;; encoded.
+ (let* ((encoding "base64") ;Encode in BASE64 by default.
+ (beg (mime-editor/content-beginning))
+ (end (mime-editor/content-end))
+ (body (buffer-substring beg end))
+ )
+ (mime-encode-region beg end encoding)
+ (mime-editor/define-encoding encoding))
+ (forward-line 1)
+ )
+ )
)))
(defun mime-delete-field (field)
;;; Platform dependent functions
;;;
-;; Emacs 18 implementations
-
-(defun mime-body-charset-chooser-for-emacs18 (begin end)
- "Return a cons of charset and encoding of a message in a given region.
-Encoding name must be a canonical name, such as `base64'."
- '("US-ASCII" . nil) ;Default charset of MIME.
- )
-
-(defun mime-string-encoder-for-emacs18 (method string)
- "For given METHOD that is a cons of charset and encoding, encode a STRING."
- (let ((charset (car method))
- (encoding (cdr method)))
- (cond ((stringp encoding)
- (mime-encode-string encoding string))
- ;; Return string without any encoding.
- (t string)
- )))
-
-\f
-;; Emacs 19 implementations
-
-(defun mime-body-charset-chooser-for-emacs19 (begin end)
- "Return a cons of charset and encoding of a message in a given region.
-Encoding name must be a canonical name, such as `base64'.
-US-ASCII and ISO-8859-1 are supported on Emacs 19."
- (cond ((save-excursion
- (goto-char begin)
- (re-search-forward "[\200-\377]" end t))
- '("ISO-8859-1" . "quoted-printable"))
- (t
- '("US-ASCII" . nil)) ;Default charset of MIME.
- ))
-
-(defun mime-string-encoder-for-emacs19 (method string)
- "For given METHOD that is a cons of charset and encoding, encode a STRING."
- (let ((charset (car method))
- (encoding (cdr method)))
- (cond ((stringp encoding)
- (mime-encode-string encoding string))
- ;; Return string without any encoding.
- (t string)
- )))
-
-\f
-;; NEmacs implementations
-
-(defun mime-body-charset-chooser-for-nemacs (begin end)
- "Return a cons of charset and encoding of a message in a given region.
-Encoding name must be a canonical name, such as `base64'.
-US-ASCII and ISO-2022-JP are supported on NEmacs."
- (cond ((check-region-kanji-code begin end)
- ;; The following are safe encoding methods for use in
- ;; USENET News systems that strip off all ESCs.
- ;; '("ISO-2022-JP" . "quoted-printable")
- ;; '("ISO-2022-JP" . "base64")
- ;; The following expects transport systems are all MIME
- ;; compliants. For instance, ESCs are never stripped off.
- '("ISO-2022-JP" . nil))
- (t
- '("US-ASCII" . nil)) ;Default charset of MIME.
- ))
-
-(defun mime-string-encoder-for-nemacs (method string)
- "For given METHOD that is a cons of charset and encoding, encode a STRING.
-US-ASCII and ISO-2022-JP are supported on NEmacs."
- (let ((charset (car method))
- (encoding (cdr method)))
- (cond ((stringp encoding)
- (mime-encode-string encoding
- ;; Convert internal (EUC) to JIS code.
- (convert-string-kanji-code string 3 2)
- ))
- ;; NEmacs can convert into ISO-2022-JP automatically,
- ;; but can do it myself as follows:
- ;;(t (convert-string-kanji-code string 3 2))
-
- ;; Return string without any encoding.
- (t string)
- )))
-
-\f
-;; Mule implementations
-;; Thanks to contributions by wkenji@flab.fujitsu.co.jp (Kenji
-;; WAKAMIYA) and handa@etl.go.jp (Kenichi Handa).
-
-(defun mime-body-charset-chooser-for-mule (begin end)
- "Return a cons of charset and encoding of a message in a given
-region. Encoding name must be a canonical name, such as `base64'.
-US-ASCII, ISO-8859-* (except for ISO-8859-6), ISO-2022-JP,
-ISO-2022-JP-2 and ISO-2022-INT-1 are supported on Mule. Either of
-charset ISO-2022-JP-2 or ISO-2022-INT-1 is used for multilingual text
-in Mule."
- (let ((lclist (find-charset-region begin end)))
- (cond ((null lclist)
- '("US-ASCII" . nil)) ;Default charset of MIME.
- ;; Multilingual capability requred.
- ((and (> (length lclist) 1)
- (boundp '*iso-2022-int-1*))
- '("ISO-2022-INT-1" . nil))
- ((> (length lclist) 1)
- '("ISO-2022-JP-2" . nil))
- ;; Simple charset.
- ((memq lc-ltn1 lclist)
- '("ISO-8859-1" . "quoted-printable"))
- ((memq lc-ltn2 lclist)
- '("ISO-8859-2" . "quoted-printable"))
- ((memq lc-ltn3 lclist)
- '("ISO-8859-3" . "quoted-printable"))
- ((memq lc-ltn4 lclist)
- '("ISO-8859-4" . "quoted-printable"))
- ((memq lc-crl lclist)
- '("ISO-8859-5" . "quoted-printable"))
- ;;((memq lc-arb lclist)
- ;; '("ISO-8859-6" . "quoted-printable"))
- ((memq lc-grk lclist)
- '("ISO-8859-7" . "quoted-printable"))
- ((memq lc-hbw lclist)
- '("ISO-8859-8" . "quoted-printable"))
- ((memq lc-ltn5 lclist)
- '("ISO-8859-9" . "quoted-printable"))
- ((memq lc-jp lclist)
- '("ISO-2022-JP" . nil))
- ((memq lc-kr lclist)
- '("ISO-2022-KR" . nil))
- ;; Unknown charset.
- ((boundp '*iso-2022-int-1*)
- '("ISO-2022-INT-1" . nil))
- (t
- '("ISO-2022-JP-2" . nil))
- )))
-
-(defun mime-string-encoder-for-mule (method string)
- "For given METHOD that is a cons of charset and encoding, encode a
-STRING. US-ASCII, ISO-8859-* (except for ISO-8859-6), ISO-2022-JP,
-ISO-2022-JP-2 and ISO-2022-INT-1 are supported on Mule. Either of
-charset ISO-2022-JP-2 or ISO-2022-INT-1 is used for multilingual
-text."
- (let* ((charset (car method))
- (encoding (cdr method))
- (coding-system
- (cdr (assoc (and (stringp charset) (upcase charset))
- '(("ISO-8859-1" . *ctext*)
- ("ISO-8859-2" . *iso-8859-2*)
- ("ISO-8859-3" . *iso-8859-3*)
- ("ISO-8859-4" . *iso-8859-4*)
- ("ISO-8859-5" . *iso-8859-5*)
- ;;("ISO-8859-6" . *iso-8859-6*)
- ("ISO-8859-7" . *iso-8859-7*)
- ("ISO-8859-8" . *iso-8859-8*)
- ("ISO-8859-9" . *iso-8859-9*)
- ("ISO-2022-JP" . *junet*)
- ("ISO-2022-JP-2" . *iso-2022-ss2-7*)
- ("ISO-2022-KR" . *korean-mail*)
- ("ISO-2022-INT-1" . *iso-2022-int-1*)
- )))))
- ;; In bilingual environment it may be unnecessary to convert the
- ;; coding system of the string unless transfer encoding is
- ;; required since such conversion may be performed by mule
- ;; automatically.
- (if (not (null coding-system))
- (setq string (code-convert-string string *internal* coding-system)))
- (if (stringp encoding)
- (setq string (mime-encode-string encoding string)))
- string
- ))
-
-\f
;; Sun implementations
(defun mime-voice-recorder-for-sun ()
(message "This message is not enabled to split.")
))
+(defun mime-editor/toggle-transfer-level (&optional transfer-level)
+ "Toggle transfer-level is 7bit or 8bit through.
+
+Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
+ (interactive)
+ (if (numberp transfer-level)
+ (setq mime-editor/transfer-level transfer-level)
+ (if (< mime-editor/transfer-level 8)
+ (setq mime-editor/transfer-level 8)
+ (setq mime-editor/transfer-level 7)
+ ))
+ (setq mime-editor/charset-default-encoding-alist
+ (mime/make-charset-default-encoding-alist
+ mime-editor/transfer-level))
+ (message (format "Current transfer-level is %d bit"
+ mime-editor/transfer-level))
+ (setq mime-editor/transfer-level-string
+ (mime/encoding-name mime-editor/transfer-level 'not-omit))
+ (force-mode-line-update)
+ )
+
;;; @ pgp
;;;
(y-or-n-p "Do you want to sign?")
))
(if arg
- (progn
- (setq mime-editor/pgp-processing 'sign)
- (message "This message will be signed.")
+ (if mime-editor/signing-type
+ (progn
+ (setq mime-editor/pgp-processing 'sign)
+ (message "This message will be signed.")
+ )
+ (message "Please specify signing type.")
)
(if (eq mime-editor/pgp-processing 'sign)
(setq mime-editor/pgp-processing nil)
(y-or-n-p "Do you want to encrypt?")
))
(if arg
- (progn
- (setq mime-editor/pgp-processing 'encrypt)
- (message "This message will be encrypt.")
+ (if mime-editor/encrypting-type
+ (progn
+ (setq mime-editor/pgp-processing 'encrypt)
+ (message "This message will be encrypt.")
+ )
+ (message "Please specify encrypting type.")
)
(if (eq mime-editor/pgp-processing 'encrypt)
(setq mime-editor/pgp-processing nil)
(defvar mime-editor/pgp-processing nil)
(make-variable-buffer-local 'mime-editor/pgp-processing)
-(defun mime-editor/call-mc (command)
- (let* ((header (rfc822/get-header-string-except
- "^Content-Type:" mail-header-separator)))
- (goto-char (point-min))
- (if (search-forward mail-header-separator)
- (replace-match "")
- )
- (goto-char (point-min))
- (insert header)
- (insert "Content-Type: application/pgp; format=mime\n")
- (insert mail-header-separator)
- (insert "\n")
- (if (null (call-interactively command))
- (throw 'mime-editor/error 'pgp-error)
- )
- ))
-
-(defun mime-editor/pgp-processing ()
- (let ((command
- (cdr (assq mime-editor/pgp-processing
- '((sign . mc-sign)
- (encrypt . mc-encrypt)
- )))))
- (and command
- (mime-editor/call-mc command)
- )))
+(defun mime-editor/pgp-enclose-buffer ()
+ (let ((beg (save-excursion
+ (goto-char (point-min))
+ (if (search-forward (concat "\n" mail-header-separator "\n"))
+ (match-end 0)
+ )))
+ (end (point-max))
+ )
+ (if beg
+ (cond ((eq mime-editor/pgp-processing 'sign)
+ (mime-editor/enclose-signed-region beg end)
+ )
+ ((eq mime-editor/pgp-processing 'encrypt)
+ (mime-editor/enclose-encrypted-region beg end)
+ ))
+ )))
;;; @ split
(make-temp-name
(expand-file-name "tm-draft" mime/tmp-dir))))
(separator mail-header-separator)
- (config
- (eval (cdr (assq major-mode mime-editor/window-config-alist))))
(id (concat "\""
(replace-space-with-underline (current-time-string))
"@" (system-name) "\"")))
(run-hooks 'mime-editor/before-split-hook)
- (let* ((header (rfc822/get-header-string-except
- mime-editor/split-ignored-field-regexp separator))
- (subject (mail-fetch-field "subject"))
- (total (+ (/ lines mime-editor/message-max-length)
- (if (> (mod lines mime-editor/message-max-length) 0)
- 1)))
- (the-buf (current-buffer))
- (buf (get-buffer "*tmp-send*"))
- (command
- (or cmd
- (cdr
- (assq major-mode
- mime-editor/split-message-sender-alist))
- (cdr
- (assq major-mode
- mime-editor/message-default-sender-alist))
- ))
- data)
- (goto-char (point-min))
- (if (re-search-forward (concat "^" (regexp-quote separator) "$")
- nil t)
- (replace-match "")
- )
- (if buf
- (progn
- (switch-to-buffer buf)
- (erase-buffer)
- (switch-to-buffer the-buf)
- )
- (setq buf (get-buffer-create "*tmp-send*"))
- )
- (switch-to-buffer buf)
- (make-local-variable 'mail-header-separator)
- (setq mail-header-separator separator)
- (switch-to-buffer the-buf)
- (goto-char (point-min))
- (re-search-forward "^$" nil t)
- (let ((mime-editor/partial-number 1))
- (setq data (buffer-substring
- (point-min)
- (progn
- (goto-line mime-editor/message-max-length)
- (point))
- ))
- (delete-region (point-min)(point))
- (switch-to-buffer buf)
- (mime-editor/insert-partial-header
- header subject id mime-editor/partial-number total separator)
- (insert data)
- (save-excursion
- (save-restriction
- (goto-char (point-min))
- (search-forward (concat "\n" mail-header-separator "\n"))
- (narrow-to-region
- (match-end 0)
- (if (re-search-forward "^$" nil t)
- (match-beginning 0)
- (point-max)
+ (let ((the-buf (current-buffer))
+ (copy-buf (get-buffer-create " *Original Message*"))
+ (header (rfc822/get-header-string-except
+ mime-editor/split-ignored-field-regexp separator))
+ (subject (mail-fetch-field "subject"))
+ (total (+ (/ lines mime-editor/message-max-length)
+ (if (> (mod lines mime-editor/message-max-length) 0)
+ 1)))
+ (command
+ (or cmd
+ (cdr
+ (assq major-mode
+ mime-editor/split-message-sender-alist))
))
- (goto-char (point-min))
- (while (re-search-forward
- mime-editor/split-blind-field-regexp nil t)
- (delete-region (match-beginning 0)
- (let ((e (rfc822/field-end)))
- (if (< e (point-max))
- (1+ e)
- e)))
- )
- ))
- (save-excursion
- (message (format "Sending %d/%d..."
- mime-editor/partial-number total))
- (call-interactively command)
- (message (format "Sending %d/%d... done"
- mime-editor/partial-number total))
- )
+ (mime-editor/partial-number 1)
+ data)
+ (save-excursion
+ (set-buffer copy-buf)
(erase-buffer)
- (switch-to-buffer the-buf)
- (setq mime-editor/partial-number 2)
- (while (< mime-editor/partial-number total)
+ (insert-buffer the-buf)
+ (save-restriction
+ (if (re-search-forward
+ (concat "^" (regexp-quote separator) "$") nil t)
+ (let ((he (match-beginning 0)))
+ (replace-match "")
+ (narrow-to-region (point-min) he)
+ ))
+ (goto-char (point-min))
+ (while (re-search-forward mime-editor/split-blind-field-regexp nil t)
+ (delete-region (match-beginning 0)
+ (1+ (rfc822/field-end)))
+ )))
+ (while (< mime-editor/partial-number total)
+ (erase-buffer)
+ (save-excursion
+ (set-buffer copy-buf)
(setq data (buffer-substring
(point-min)
(progn
(point))
))
(delete-region (point-min)(point))
- (switch-to-buffer buf)
- (mime-editor/insert-partial-header
- header subject id mime-editor/partial-number total separator)
- (insert data)
- (save-excursion
- (message (format "Sending %d/%d..."
- mime-editor/partial-number total))
- (call-interactively command)
- (message (format "Sending %d/%d... done"
- mime-editor/partial-number total))
- )
- (erase-buffer)
- (switch-to-buffer the-buf)
- (setq mime-editor/partial-number
- (1+ mime-editor/partial-number))
)
- (goto-char (point-min))
(mime-editor/insert-partial-header
header subject id mime-editor/partial-number total separator)
+ (insert data)
+ (save-excursion
+ (message (format "Sending %d/%d..."
+ mime-editor/partial-number total))
+ (call-interactively command)
+ (message (format "Sending %d/%d... done"
+ mime-editor/partial-number total))
+ )
+ (setq mime-editor/partial-number
+ (1+ mime-editor/partial-number))
+ )
+ (erase-buffer)
+ (save-excursion
+ (set-buffer copy-buf)
+ (setq data (buffer-string))
+ (erase-buffer)
+ )
+ (mime-editor/insert-partial-header
+ header subject id mime-editor/partial-number total separator)
+ (insert data)
+ (save-excursion
(message (format "Sending %d/%d..."
mime-editor/partial-number total))
- ))))
+ (message (format "Sending %d/%d... done"
+ mime-editor/partial-number total))
+ )
+ )))
(defun mime-editor/maybe-split-and-send (&optional cmd)
(interactive)
)
-;;; @ etc
+;;; @ edit again
;;;
-(defun replace-space-with-underline (str)
- (mapconcat (function
- (lambda (arg)
- (char-to-string
- (if (= arg 32)
- ?_
- arg)))) str "")
- )
+(defun mime-editor::edit-again (code-conversion)
+ (save-excursion
+ (goto-char (point-min))
+ (let ((ctl (mime/Content-Type)))
+ (if ctl
+ (let ((ctype (car ctl))
+ (params (cdr ctl))
+ type stype)
+ (if (string-match "/" ctype)
+ (progn
+ (setq type (substring ctype 0 (match-beginning 0)))
+ (setq stype (substring ctype (match-end 0)))
+ )
+ (setq type ctype)
+ )
+ (cond
+ ((string-equal type "multipart")
+ (let ((boundary (assoc-value "boundary" params)))
+ (re-search-forward (concat "\n--" boundary) nil t)
+ (let ((bb (match-beginning 0)) eb tag)
+ (setq tag (format "\n--<<%s>>-{" stype))
+ (goto-char bb)
+ (insert tag)
+ (setq bb (+ bb (length tag)))
+ (re-search-forward (concat "\n--" boundary "--") nil t)
+ (setq eb (match-beginning 0))
+ (replace-match (format "\n--}-<<%s>>" stype))
+ (save-restriction
+ (narrow-to-region bb eb)
+ (goto-char (point-min))
+ (while (re-search-forward
+ (concat "\n--" boundary "\n") nil t)
+ (let ((beg (match-beginning 0))
+ end)
+ (delete-region beg (match-end 0))
+ (save-excursion
+ (if (re-search-forward
+ (concat "\n--" boundary) nil t)
+ (setq end (match-beginning 0))
+ (setq end (point-max))
+ )
+ (save-restriction
+ (narrow-to-region beg end)
+ (mime-editor::edit-again code-conversion)
+ (goto-char (point-max))
+ ))))
+ ))
+ (goto-char (point-min))
+ (or (= (point-min) 1)
+ (delete-region (point-min)
+ (if (re-search-forward "^$" nil t)
+ (match-end 0)
+ (point-min)
+ )))
+ ))
+ (t
+ (let* (charset
+ (pstr
+ (mapconcat (function
+ (lambda (attr)
+ (if (string-equal (car attr)
+ "charset")
+ (progn
+ (setq charset (cdr attr))
+ "")
+ (concat ";" (car attr)
+ "=" (cdr attr))
+ )
+ ))
+ params ""))
+ encoding
+ encoded)
+ (save-excursion
+ (if (re-search-forward
+ "Content-Transfer-Encoding:" nil t)
+ (let ((beg (match-beginning 0))
+ (hbeg (match-end 0))
+ (end (rfc822/field-end)))
+ (setq encoding
+ (eliminate-top-spaces
+ (rfc822/unfolding-string
+ (buffer-substring hbeg end))))
+ (if (or charset (string-equal type "text"))
+ (progn
+ (delete-region beg (1+ end))
+ (goto-char (point-min))
+ (if (search-forward "\n\n" nil t)
+ (progn
+ (mime-decode-region
+ (match-end 0)(point-max) encoding)
+ (setq encoded t
+ encoding nil)
+ )))))))
+ (if (or code-conversion encoded)
+ (if charset
+ (mime-charset-decode-region (point-min)(point-max)
+ charset)
+ (character-decode-region (point-min)(point-max)
+ mime/default-coding-system)
+ ))
+ (let ((he
+ (if (re-search-forward "^$" nil t)
+ (match-end 0)
+ (point-min)
+ )))
+ (if (= (point-min) 1)
+ (progn
+ (goto-char he)
+ (insert
+ (concat
+ "\n"
+ (mime-create-tag
+ (concat type "/" stype pstr) encoding)
+ ))
+ )
+ (delete-region (point-min) he)
+ (insert
+ (concat "\n"
+ (mime-create-tag
+ (concat type "/" stype pstr) encoding)
+ ))
+ ))
+ ))))
+ (if code-conversion
+ (character-decode-region (point-min) (point-max)
+ mime/default-coding-system)
+ )
+ ))))
+
+(defun mime/edit-again (&optional code-conversion no-separator no-mode)
+ (interactive)
+ (mime-editor::edit-again code-conversion)
+ (goto-char (point-min))
+ (save-restriction
+ (narrow-to-region (point-min)
+ (if (re-search-forward "^$" nil t)
+ (match-end 0)
+ (point-max)
+ ))
+ (goto-char (point-min))
+ (while (re-search-forward
+ "^\\(Content-.*\\|Mime-Version\\):" nil t)
+ (delete-region (match-beginning 0) (1+ (rfc822/field-end)))
+ ))
+ (or no-separator
+ (and (re-search-forward "^$")
+ (replace-match mail-header-separator)
+ ))
+ (or no-mode
+ (mime/editor-mode)
+ ))
;;; @ end