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