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