(Fexpt): Use floats for negative exponent.
[bpt/emacs.git] / lisp / gnus / mm-partial.el
CommitLineData
c113de23 1;;; mm-partial.el --- showing message/partial
23f87bed 2;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
c113de23
GM
3
4;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
5;; Keywords: message partial
6
7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software; you can redistribute it and/or modify
10;; it under the terms of the GNU General Public License as published
11;; by the Free Software Foundation; either version 2, or (at your
12;; option) any later version.
13
14;; GNU Emacs is distributed in the hope that it will be useful, but
15;; WITHOUT ANY WARRANTY; without even the implied warranty of
16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17;; General Public License for more details.
18
19;; You should have received a copy of the GNU General Public License
20;; along with GNU Emacs; see the file COPYING. If not, write to the
3a35cf56
LK
21;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22;; Boston, MA 02110-1301, USA.
c113de23
GM
23
24;;; Commentary:
25
26;;; Code:
27
23f87bed 28(eval-when-compile (require 'cl))
c113de23
GM
29
30(require 'gnus-sum)
31(require 'mm-util)
32(require 'mm-decode)
33
34(defun mm-partial-find-parts (id &optional art)
35 (let ((headers (save-excursion
36 (set-buffer gnus-summary-buffer)
37 gnus-newsgroup-headers))
38 phandles header)
39 (while (setq header (pop headers))
40 (unless (eq (aref header 0) art)
41 (mm-with-unibyte-buffer
a1506d29 42 (gnus-request-article-this-buffer (aref header 0)
c113de23
GM
43 gnus-newsgroup-name)
44 (when (search-forward id nil t)
23f87bed
MB
45 (let ((nhandles (mm-dissect-buffer
46 nil gnus-article-loose-mime)) nid)
c113de23
GM
47 (if (consp (car nhandles))
48 (mm-destroy-parts nhandles)
a1506d29 49 (setq nid (cdr (assq 'id
c113de23
GM
50 (cdr (mm-handle-type nhandles)))))
51 (if (not (equal id nid))
52 (mm-destroy-parts nhandles)
53 (push nhandles phandles))))))))
54 phandles))
55
56;;;###autoload
57(defun mm-inline-partial (handle &optional no-display)
58 "Show the partial part of HANDLE.
a1506d29 59This function replaces the buffer of HANDLE with a buffer contains
c113de23
GM
60the entire message.
61If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing."
a1506d29 62 (let ((id (cdr (assq 'id (cdr (mm-handle-type handle)))))
c113de23
GM
63 phandles
64 (b (point)) (n 1) total
65 phandle nn ntotal
66 gnus-displaying-mime handles buffer)
67 (unless (mm-handle-cache handle)
68 (unless id
715a2ca2 69 (error "Can not find message/partial id"))
c113de23 70 (setq phandles
a1506d29 71 (sort (cons handle
c113de23 72 (mm-partial-find-parts
a1506d29 73 id
c113de23
GM
74 (save-excursion
75 (set-buffer gnus-summary-buffer)
76 (gnus-summary-article-number))))
77 #'(lambda (a b)
a1506d29
JB
78 (let ((anumber (string-to-number
79 (cdr (assq 'number
c113de23 80 (cdr (mm-handle-type a))))))
a1506d29
JB
81 (bnumber (string-to-number
82 (cdr (assq 'number
c113de23
GM
83 (cdr (mm-handle-type b)))))))
84 (< anumber bnumber)))))
85 (setq gnus-article-mime-handles
23f87bed 86 (mm-merge-handles gnus-article-mime-handles phandles))
c113de23 87 (save-excursion
5859a75c 88 (set-buffer (generate-new-buffer " *mm*"))
c113de23 89 (while (setq phandle (pop phandles))
a1506d29
JB
90 (setq nn (string-to-number
91 (cdr (assq 'number
c113de23 92 (cdr (mm-handle-type phandle))))))
a1506d29
JB
93 (setq ntotal (string-to-number
94 (cdr (assq 'total
c113de23
GM
95 (cdr (mm-handle-type phandle))))))
96 (if ntotal
97 (if total
a1506d29 98 (unless (eq total ntotal)
715a2ca2 99 (error "The numbers of total are different"))
c113de23
GM
100 (setq total ntotal)))
101 (unless (< nn n)
102 (unless (eq nn n)
103 (error "Missing part %d" n))
104 (mm-insert-part phandle)
105 (goto-char (point-max))
106 (when (not (eq 0 (skip-chars-backward "\r\n")))
107 ;; remove tail blank spaces except one
108 (if (looking-at "\r?\n")
109 (goto-char (match-end 0)))
110 (delete-region (point) (point-max)))
111 (setq n (+ n 1))))
112 (unless total
113 (error "Don't known the total number of"))
114 (if (<= n total)
115 (error "Missing part %d" n))
116 (kill-buffer (mm-handle-buffer handle))
23f87bed
MB
117 (goto-char (point-min))
118 (let ((point (if (search-forward "\n\n" nil t)
119 (1- (point))
120 (point-max))))
121 (goto-char (point-min))
122 (unless (re-search-forward "^mime-version:" point t)
123 (insert "MIME-Version: 1.0\n")))
c113de23
GM
124 (setcar handle (current-buffer))
125 (mm-handle-set-cache handle t)))
126 (unless no-display
127 (save-excursion
128 (save-restriction
129 (narrow-to-region b b)
130 (mm-insert-part handle)
131 (let (gnus-article-mime-handles)
132 (run-hooks 'gnus-article-decode-hook)
133 (gnus-article-prepare-display)
134 (setq handles gnus-article-mime-handles))
135 (when handles
136 ;; It is in article buffer.
137 (setq gnus-article-mime-handles
23f87bed 138 (mm-merge-handles gnus-article-mime-handles handles)))
c113de23
GM
139 (mm-handle-set-undisplayer
140 handle
141 `(lambda ()
142 (let (buffer-read-only)
143 (condition-case nil
144 ;; This is only valid on XEmacs.
145 (mapcar (lambda (prop)
146 (remove-specifier
147 (face-property 'default prop) (current-buffer)))
148 '(background background-pixmap foreground))
149 (error nil))
150 (delete-region ,(point-min-marker) ,(point-max-marker))))))))))
151
23f87bed
MB
152(provide 'mm-partial)
153
ab5796a9 154;;; arch-tag: 460e7424-05f2-4a1d-a0f2-70ec081eff7d
715a2ca2 155;;; mm-partial.el ends here