+2005-01-23 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * Makefile (compile-strict): New target.
+
+ * WL-MK (wl-examine-modules): New function.
+
+2005-01-01 TAKAHASHI Kaoru <kaoru@kaisei.org>
+
+ * README, README.ja: Update stable branch.
+
2004-12-24 Yuuichi Teranishi <teranisi@gohome.org>
* 2.12.0 - "Your Wildest Dreams"
$(EMACS) $(FLAGS) -l WL-MK -f update-version \
$(LISPDIR) $(PIXMAPDIR)
+compile-strict: clean-elc
+ @args="$(FLAGS)";\
+ args="$$args -L elmo -L wl";\
+ echo "=============================================";\
+ echo "Compiling the 1st stage-----without elc files";\
+ echo "=============================================";\
+ for i in `$(EMACS) $(FLAGS) -l WL-MK -f wl-examine-modules 2>/dev/null`;\
+ do\
+ j=`echo $$i| sed 's/elc$$/el/g'`;\
+ echo "$(EMACS) ARGS -f batch-byte-compile $$j";\
+ $(EMACS) $$args -f batch-byte-compile $$j;\
+ mv $$i $$j"x";\
+ done;\
+ for i in `echo elmo/*.elx wl/*.elx utils/*.elx`; do\
+ j=`echo $$i| sed 's/elx$$/elc/g'`;\
+ mv $$i $$j;\
+ done;\
+ echo "==============================================";\
+ echo "Compiling the 2nd stage-----with all elc files";\
+ echo "==============================================";\
+ for i in `$(EMACS) $(FLAGS) -l WL-MK -f wl-examine-modules 2>/dev/null`;\
+ do\
+ j=`echo $$i| sed 's/elc$$/el/g'`;\
+ echo "$(EMACS) ARGS -f batch-byte-compile $$j";\
+ $(EMACS) $$args -f batch-byte-compile $$j;\
+ done
+
install-elc:
$(EMACS) $(FLAGS) -l WL-MK -f install-wl-package \
$(LISPDIR) $(PIXMAPDIR)
objs))
+(defun wl-examine-modules ()
+ "Examine wl modules should be byte-compile'd."
+ (config-wl-package-subr)
+ (make-wl-news)
+ (dolist (module modules-alist)
+ (dolist (filename (cdr module))
+ (princ (format "%s/%s.elc " (car module) filename)))))
+
+
(defun compile-wl-package ()
(config-wl-package)
(make-wl-news)
-\def\versionnumber{2.12.0}
+\def\versionnumber{2.12.1}
-@set VERSION 2.12.0
+@set VERSION 2.12.1
\e$B%P!<%8%g%s\e(B @value{VERSION} \e$B8=:_!"MQ0U$5$l$F$$$k%U%)%k%@$O!"\e(BIMAP, NNTP,
LocalDir(MH), Maildir, News Spool, Archive, POP, Shimbun, Namazu, Multi,
-Filter, Pipe, Internal, File \e$B$N\e(B 14 \e$B<oN`$G$9!#\e(B
+Filter, Pipe, File, Access, Internal \e$B$N\e(B 15 \e$B<oN`$G$9!#\e(B
@menu
* IMAP Folder:: @samp{%} -- IMAP \e$B%U%)%k%@\e(B
* Pipe Folder:: @samp{|} -- \e$B%Q%$%W%U%)%k%@\e(B
* Internal Folder:: @samp{'} -- \e$BFbIt%U%)%k%@\e(B
* File Folder:: -- \e$B%U%!%$%k%U%)%k%@\e(B
+* Access Folder:: -- \e$B%"%/%;%9%U%)%k%@\e(B
@end menu
\e$B%G%#%l%/%H%j\e(B (@file{~/.elmo/cache})\e$B$N%5%V%G%#%l%/%H%jL>$r;XDj$7$^$9!#\e(B
-@node File Folder, , Internal Folder, Folders
+@node File Folder, Access Folder, Internal Folder, Folders
@section \e$B%U%!%$%k%U%)%k%@\e(B
@cindex File Folder
@end example
+@node Access Folder, , File Folder, Folders
+@section \e$B%"%/%;%9%U%)%k%@\e(B
+@cindex Access Folder
+
+\e$B;XDj$5$l$?%U%)%k%@$NG[2<$N%5%V%U%)%k%@$r2>A[E*$K0l$D$N%U%)%k%@$H$7$F07$(\e(B
+\e$B$k$h$&$K$9$k%U%)%k%@$G$9!#%5%V%U%)%k%@$NA}8:$O<+F0E*$KH?1G$5$l$^$9!#\e(B
+
+\e$B=q<0\e(B:
+
+@example
+@samp{access:} @var{\e$B%k!<%H%U%)%k%@\e(B}
+@end example
+
+\e$BNc\e(B:
+
+@example
+@group
+access:%INBOX -> %INBOX \e$B0J2<$N\e(B IMAP \e$B$N%a!<%k%\%C%/%9$NA4$F\e(B
+access:'cache -> \e$BA4$F$N\e(B 'cache \e$B%U%)%k%@\e(B
+@end group
+@end example
+
+
@node Folder, Summary, Folders, Top
@chapter \e$B%U%)%k%@%b!<%I\e(B
@cindex Folder
@table @code
@item wl-message-buffer-prefetch-folder-type-list
@vindex wl-message-buffer-prefetch-folder-type-list
-\e$B=i4|@_Dj$O\e(B @code{t}\e$B!#$3$N>l9g!"A4$F$N%U%)%k%@$G@hFI$_5!G=$,M-8z$K$J$j$^\e(B
-\e$B$9!#FCDj$N%U%)%k%@<oJL$N>l9g$K$@$1@hFI$_5!G=$rM-8z$K$7$?$$>l9g$K$O!"%U%)\e(B
-\e$B%k%@<oJL$N%j%9%H$r;XDj$7$^$9!#\e(B
-\e$BNc$($P0J2<$N$h$&$K@_Dj$7$^$9!#\e(B(NNTP \e$B%U%)%k%@$H\e(B IMAP \e$B%U%)%k%@$G$@$1@hFI$_\e(B
-\e$B$7$?$$>l9g\e(B)
-
-@lisp
-@group
-(setq wl-message-buffer-prefetch-folder-type-list
- '(nntp imap4))
-@end group
-@end lisp
-
-\e$B$3$N>l9g!"$b$7\e(B localdir \e$B$H\e(B IMAP \e$B%U%)%k%@$,:.:_$7$?%^%k%A%U%)%k%@$G$O\e(B
-IMAP \e$B$N%a%C%;!<%8$@$1$,@hFI$_$NBP>]$H$J$j$^$9!#$3$NJQ?t$O\e(B
-@code{wl-message-buffer-prefetch-folder-list} \e$B$h$j$bM%@h$5$l$^$9!#\e(B
+\e$B=i4|@_Dj$O\e(B @code{'(imap4 nntp)}\e$B!#@hFI$_5!G=$rM-8z$K$7$?$$%U%)%k%@%?%$%W\e(B
+\e$B$N%7%s%\%k%j%9%H$r;XDj$7$^$9!#=i4|@_Dj$G$O!"\e(BIMAP4 \e$B$H\e(BNNTP \e$B%U%)%k%@$G@hFI\e(B
+\e$B$_5!G=$,M-8z$K$J$j$^$9!#$b$7\e(B localdir \e$B$H\e(B IMAP \e$B%U%)%k%@$,:.:_$7$?%^%k%A%U%)\e(B
+\e$B%k%@$G$O\e(B IMAP \e$B$N%a%C%;!<%8$@$1$,@hFI$_$NBP>]$H$J$j$^$9!#$3$NJQ?t$O\e(B
+@code{wl-message-buffer-prefetch-folder-list} \e$B$h$j$bM%@h$5$l$^$9!#$9$Y$F\e(B
+\e$B$N%U%)%k%@$G@hFI$_5!G=$rM-8z$K$7$?$$>l9g$K$O!"\e(Bt \e$B$r;XDj$7$^$9!#\e(B
@item wl-message-buffer-prefetch-folder-list
@vindex wl-message-buffer-prefetch-folder-list
@item wl-message-buffer-prefetch-depth
@vindex wl-message-buffer-prefetch-depth
-\e$B=i4|@_Dj$O\e(B 3\e$B!#@hFI$_5!G=$9$k%a%C%;!<%8$N?t!#\e(B
+\e$B=i4|@_Dj$O\e(B 1\e$B!#@hFI$_5!G=$9$k%a%C%;!<%8$N?t!#\e(B
@item wl-message-buffer-prefetch-idle-time
@vindex wl-message-buffer-prefetch-idle-time
-\e$B=i4|@_Dj$O\e(B 0.2 (\e$BC10L\e(B:\e$BIC\e(B)\e$B!#@hFI$_5!G=$9$k;~4V4V3V!#\e(B
+\e$B=i4|@_Dj$O\e(B 1 (\e$BC10L\e(B:\e$BIC\e(B)\e$B!#@hFI$_5!G=$9$k;~4V4V3V!#\e(B
@item wl-message-buffer-prefetch-threshold
@vindex wl-message-buffer-prefetch-threshold
\e$B=i4|@_Dj$O\e(B @code{t}\e$B!#\e(B
Non-nil \e$B$J$i!"\e(B@samp{^L} \e$B$G2~%Z!<%8$7$F%a%C%;!<%8$rI=<($7$^$9!#\e(B
-@item wl-message-window-size
-@vindex wl-message-window-size
-\e$B=i4|@_Dj$O\e(B '(1 . 4)\e$B!#\e(B
-\e$B%5%^%j$rI=<($9$k%&%#%s%I%&$H%a%C%;!<%8K\BN$rI=<($9$k%&%#%s%I%&$NHf$r\e(B
-cons \e$B$G;XDj$7$^$9!#\e(Bcar:cdr \e$B$,\e(B \e$B%5%^%j\e(B:\e$B%a%C%;!<%8\e(B \e$B$G$9!#\e(B
-
@item wl-summary-from-function
@vindex wl-summary-from-function
\e$B%5%^%j$N:9=P?MI=<($N@07A$K;H$&4X?t$r;XDj$7$^$9!#\e(B
@end table
-@node Regular Expressions Header Matching, , SpamAssassin, Spam Filter Processors
+@node Regular Expressions Header Matching, , SpamOracle, Spam Filter Processors
@subsection Regular Expressions Header Matching
@cindex Regular Expressions Header Matching
Wanderlust uses ELMO as it's interface, so you can use every folder types
supported by ELMO.
-As of version @value{VERSION}, 14 types of folders are predefined. These
+As of version @value{VERSION}, 15 types of folders are predefined. These
are IMAP, NNTP, LocalDir(MH), Maildir, News Spool, Archive, POP,
-Shimbun, Namazu, Multi, Filter, Pipe, Internal and File folder types.
+Shimbun, Namazu, Multi, Filter, Pipe, File, Access and Internal folder
+types.
@menu
* IMAP Folder:: @samp{%} -- IMAP folder
* Pipe Folder:: @samp{|} -- Pipe folder
* Internal Folder:: @samp{'} -- Internal folder
* File Folder:: -- File folder
+* Access Folder:: -- Access folder
@end menu
(@file{~/.elmo/cache}).
-@node File Folder, , Internal Folder, Folders
+@node File Folder, Access Folder, Internal Folder, Folders
@section File folder
@cindex File Folder
@end example
+@node Access Folder, , File Folder, Folders
+@section Access folder
+@cindex Access Folder
+
+A folder to access virtual folder which collects messages from a root
+folder and subfolders of one. The add and remove of the subfolder is
+automatically reflected.
+
+
+Format:
+
+@example
+@samp{access:} @var{root-folder}
+@end example
+
+Example:
+
+@example
+@group
+access:%INBOX -> All subfolders of IMAP mailbox "inbox".
+access:'cache -> All of 'cache folder
+@end group
+@end example
+
+
@node Folder, Summary, Folders, Top
@chapter Folder mode
@cindex Folder
@table @code
@item wl-message-buffer-prefetch-folder-type-list
@vindex wl-message-buffer-prefetch-folder-type-list
-The initial setting is @code{t}. In this case, prefetch messages in all
-folders.
-If it is a list of folder types, it specifies the folder types in which
-message prefetching is enabled.
-Following is an example (prefetch messages in nntp and imap4 folders)
-
-@lisp
-@group
-(setq wl-message-buffer-prefetch-folder-type-list
- '(nntp imap4))
-@end group
-@end lisp
-
-In this case, multi folder that contains localdir and imap4 prefetches
-only imap4 messages. This variable precedes the value of
+The initial setting is @code{'(imap4 nntp)}. If it is a list of folder
+types, it specifies the folder types in which message prefetching is
+enabled. In initial setting, messages are prefetch only in the nntp and
+imap4 folders. In this case, multi folder that contains localdir and
+imap4 prefetches only imap4 messages. This variable precedes the value of
@code{wl-message-buffer-prefetch-folder-list}.
+To prefetch messages in all folder types, specify @code{t}.
@item wl-message-buffer-prefetch-folder-list
@vindex wl-message-buffer-prefetch-folder-list
@item wl-message-buffer-prefetch-depth
@vindex wl-message-buffer-prefetch-depth
-The initial setting is 3. The number of messages for automatical prefetch.
+The initial setting is 1. The number of messages for automatical prefetch.
@item wl-message-buffer-prefetch-idle-time
@vindex wl-message-buffer-prefetch-idle-time
-The initial setting is 0.2 (in seconds). The period of automatical prefetch.
+The initial setting is 1 (in seconds). The period of automatical prefetch.
@item wl-message-buffer-prefetch-threshold
@vindex wl-message-buffer-prefetch-threshold
The initial setting is @code{t}.
If non-nil, message is split as pages by @samp{^L}.
-@item wl-message-window-size
-@vindex wl-message-window-size
-The initial setting is '(1 . 4).
-A cons cell to specify the rate of summary and message window.
-car:cdr corresponds summary:message.
-
@item wl-summary-from-function
@vindex wl-summary-from-function
Format function to display sender in summary.
@table @code
@item wl-message-window-size
@vindex wl-message-window-size
-Initial setting is @code{'(1 . 4)}. It is a cons cell and the ratio of
+Initial setting is @code{(1 . 4)}. It is a cons cell and the ratio of
its car and cdr value corresponds to the ratio of Summary and Message
windows.
@end table
-@node Regular Expressions Header Matching, , SpamAssassin, Spam Filter Processors
+@node Regular Expressions Header Matching, , SpamOracle, Spam Filter Processors
@subsection Regular Expressions Header Matching
@cindex Regular Expressions Header Matching
+2005-02-06 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo-nntp.el (elmo-nntp-server-command-index): Add entry `xhdr'.
+
+2005-02-01 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo-flag.el (elmo-flag-valid-p): Simplify.
+ (elmo-folder-list-subfolders): Copy `elmo-global-flags'.
+ (elmo-folder-delete): Update `elmo-global-flag-folder-alist'.
+
+2005-01-30 TAKAHASHI Kaoru <kaoru@kaisei.org>
+
+ * elmo-util.el (elmo-passwd-alist-load, elmo-passwd-alist-save):
+ Use `with-temp-buffer'.
+
+2005-01-30 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo-flag.el (elmo-folder-initialize): Fixed the last change.
+
+ * elmo-util.el (elmo-read-search-condition): Eliminate (renamed to
+ `wl-read-search-condition').
+ (elmo-read-search-condition-internal): Likewise.
+
+ * elmo-flag.el (elmo-flag-char-regexp): New constant.
+ (elmo-flag-valid-p): New function.
+ (elmo-folder-initialize): Check flag name is valid.
+
+2005-01-26 Yuuichi Teranishi <teranisi@gohome.org>
+
+ * elmo-imap4.el (elmo-folder-list-subfolders): Use root mailbox without
+ delimiter to obtain root mailbox itself.
+
+2005-01-25 Tetsurou Okazaki <okazaki@be.to>
+
+ * elmo-net.el (elmo-network-session-idle-timeout): Fix customization
+ type mismatch.
+
+2005-01-24 Yuuichi Teranishi <teranisi@gohome.org>
+
+ * elmo-mime.el (elmo-mime-entity-display): Bind elmo-message-displaying
+ as t.
+
+2005-01-23 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo-shimbun.el (toplevel): Require cl at compile.
+
+ * elmo-nntp.el (toplevel): Ditto.
+
+ * elmo-nmz.el (toplevel): Ditto.
+
+ * elmo-multi.el (toplevel): Ditto.
+
+ * elmo-file.el (toplevel): Ditto.
+
+ * elmo-dop.el (toplevel): Ditto.
+
+ * elmo-archive.el (toplevel): Likewise elmo and cl (at compile).
+
+2005-01-20 Yuuichi Teranishi <teranisi@gohome.org>
+
+ * mmimap.el (mmimap-make-mime-entity): Set children's top node number
+ as nil.
+
+ * elmo.el (elmo-message-fetch): Return t even when the output buffer
+ size of elmo-message-fetch-internal is 0 byte.
+
+2005-01-14 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo-maildir.el (elmo-map-message-fetch): Fixed last change.
+
2005-01-13 Yoichi NAKAYAMA <yoichi@geiin.org>
* elmo-shimbun.el (elmo-folder-plugged-p): Treat "@" as
always plugged.
+2005-01-13 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo-maildir.el (elmo-map-message-fetch): Call
+ `elmo-map-folder-set-flag'.
+
+ * elmo.el (elmo-message-fetch-with-cache-process): Abolish.
+ (elmo-message-fetch): Merge from
+ `elmo-message-fetch-with-cache-process'.
+
+ * elmo-sendlog.el (elmo-message-fetch-with-cache-process): Abolish.
+ (elmo-message-fetch): Define.
+
+ * elmo-nntp.el (elmo-message-fetch): Renamed from
+ `elmo-message-fetch-with-cache-process'.
+
+ * elmo-cache.el (elmo-message-fetch-with-cache-process): Abolish.
+ (elmo-message-fetch): Define.
+
+ * elmo-util.el (elmo-condition-parse-primitive): Downcase
+ search-key.
+
+ * elmo-shimbun.el (shimbun-mua-search-id): Use
+ `elmo-message-entity' instead of `elmo-msgdb-message-entity'.
+ (elmo-shimbun-folder-shimbun-header): Ditto.
+ (elmo-shimbun-get-headers): Ditto.
+ (elmo-shimbun-update-overview): Ditto.
+
+ * elmo-pipe.el (elmo-folder-detach-messages): Define.
+
+ * elmo-net.el (elmo-folder-list-messages-unplugged): Use
+ `elmo-folder-list-messages' instead of `elmo-msgdb-list-messages'.
+
+2005-01-13 Yuuichi Teranishi <teranisi@gohome.org>
+
+ * elmo.el (elmo-message-fetch): Unset unread flag on server when
+ message is cached.
+ (elmo-message-fetch-string): Fixed argument.
+
+2005-01-11 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo.el (elmo-message-fetch): Removed argument `outbuf' and
+ exchange order of arguments `section' and `unread'.
+ (elmo-message-encache): Follow the API change.
+ (elmo-message-match-condition): Ditto.
+ (elmo-generic-folder-append-messages): Ditto.
+ (elmo-message-fetch-string): New function.
+
+ * elmo-split.el (elmo-split-subr): Ditto.
+
+ * elmo-spam.el (elmo-spam-message-fetch): Ditto.
+
+ * elmo-pipe.el (elmo-message-fetch): Ditto.
+
+ * elmo-multi.el (elmo-message-fetch): Ditto.
+
+ * elmo-mime.el (elmo-message-mime-entity): Ditto.
+
+ * elmo-flag.el (elmo-global-flag-set-internal): Ditto.
+
+ * elmo-filter.el (elmo-message-fetch): Ditto.
+
+ * elmo-dop.el (elmo-folder-append-buffer-dop-delayed): Ditto.
+
+ * elmo-imap4.el (mime-imap-location-section-body): Use
+ `elmo-message-fetch-string' instead of `elmo-message-fetch' and
+ follow the API change.
+
+2005-01-08 Yuuichi Teranishi <teranisi@gohome.org>
+
+ * elmo-net.el (elmo-network-session-idle-timeout): New option.
+ (elmo-network-session): New attribute `last-accessed'.
+ (elmo-network-get-session): Discard network cache if elapsed time
+ since last-accessed is larger than elmo-network-session-idle-timeout.
+
+2005-01-07 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo.el (elmo-find-fetch-strategy): Removed argument `entity'
+ and added `number', `require-entireness'.
+ (elmo-find-fetch-strategy): Rewrite.
+ (elmo-message-fetch): Unset `unread' flag when argument unread is
+ non-nil.
+
+ * elmo-spam.el (elmo-spam-message-fetch): Follow the API change.
+
+ * elmo-multi.el (elmo-find-fetch-strategy): Ditto.
+ (elmo-message-fetch): Notify event `flag-changed'.
+
+ * elmo-pipe.el: Likewise.
+
+ * elmo-mime.el (elmo-mime-entity): New class.
+ (elmo-mime-entity-display-p): New generic function.
+ (elmo-mime-entity-display): Ditto.
+ (elmo-mime-entity-display-as-is): Ditto.
+ (mime-elmo-buffer-entity, mime-elmo-imap-entity): Inherit
+ elmo-mime-entity.
+ (elmo-make-mime-message-location): Removed.
+ (elmo-mime-message-display): Ditto.
+ (elmo-mime-display-as-is): Ditto.
+ (elmo-message-mime-entity): New function.
+
+ * elmo-imap4.el (elmo-find-fetch-strategy): Rewrite.
+
+ * elmo-filter.el (elmo-find-fetch-strategy): Follow the API
+ change.
+ (elmo-message-fetch): Re-count flagged message number and notify
+ event `flag-changed'.
+
+ * elmo-version.el (elmo-version): Up to 2.13.1.
+
2005-01-02 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
* elmo-filter.el (elmo-message-field): Define.
(elmo-message-set-field): Ditto.
+2004-12-25 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * elmo.el (elmo-message-set-cached): Call
+ `elmo-folder-notify-event' with cache-changed.
+ (elmo-event-handler-cache-changed): New generic function.
+
2004-12-24 Yuuichi Teranishi <teranisi@gohome.org>
* 2.12.0 is released.
;;; Code:
;;
+(eval-when-compile (require 'cl))
+(require 'elmo)
(require 'elmo-msgdb)
(require 'emu)
(require 'std11)
(elmo-cache-folder-directory-internal folder))))
t)
-(luna-define-method elmo-message-fetch-with-cache-process
- ((folder elmo-cache-folder) number strategy &optional section unseen)
+(luna-define-method elmo-message-fetch
+ ((folder elmo-cache-folder) number strategy &optional unseen section)
;; disbable cache process
- (elmo-message-fetch-internal folder number strategy section unseen))
+ (erase-buffer)
+ (when (elmo-message-fetch-internal folder number strategy section unseen)
+ (when (and (not unseen)
+ (elmo-message-flagged-p folder number 'unread))
+ (elmo-message-unset-flag folder number 'unread))
+ t))
(luna-define-method elmo-map-message-fetch ((folder elmo-cache-folder)
location strategy
;;; Code:
;;
+(eval-when-compile (require 'cl))
(require 'elmo)
(require 'elmo-vars)
(with-temp-buffer
(when (elmo-message-fetch spool-folder number
(elmo-make-fetch-strategy 'entire)
- nil (current-buffer) 'unread)
+ 'unread)
(setq flags (or (elmo-message-flags-for-append folder (* -1 number))
(cond ((listp flag)
flag)
;;; Code:
;;
+(eval-when-compile (require 'cl))
+
(require 'elmo)
(require 'elmo-map)
(require 'mime-edit)
(luna-define-method elmo-folder-newsgroups ((folder elmo-filter-folder))
(elmo-folder-newsgroups (elmo-filter-folder-target-internal folder)))
-(luna-define-method elmo-find-fetch-strategy
- ((folder elmo-filter-folder) entity &optional ignore-cache)
+(luna-define-method elmo-find-fetch-strategy ((folder elmo-filter-folder)
+ number
+ &optional
+ ignore-cache
+ require-entireness)
(elmo-find-fetch-strategy
(elmo-filter-folder-target-internal folder)
- entity ignore-cache))
+ number ignore-cache require-entireness))
(luna-define-method elmo-folder-get-primitive-list ((folder
elmo-filter-folder))
(luna-define-method elmo-message-fetch ((folder elmo-filter-folder)
number strategy
- &optional section outbuf unseen)
- (elmo-message-fetch
- (elmo-filter-folder-target-internal folder)
- number strategy section outbuf unseen))
+ &optional unseen section)
+ (unless unseen
+ (elmo-filter-folder-countup-message-flags folder (list number) -1))
+ (when (elmo-message-fetch (elmo-filter-folder-target-internal folder)
+ number strategy unseen section)
+ (unless unseen
+ (elmo-filter-folder-countup-message-flags folder (list number))
+ (elmo-folder-notify-event folder 'flag-changed (list number)))
+ t))
(luna-define-method elmo-folder-delete-messages ((folder elmo-filter-folder)
numbers)
"Internal variable to hold global-flag-folder structures.")
(eval-and-compile
+ (defconst elmo-flag-char-regexp "]!#$&'+,./0-9:;<=>?@A-Z[^_`a-z|}~-"))
+
+(defun elmo-flag-valid-p (flag)
+ (string-match (eval-when-compile
+ (concat "^[" elmo-flag-char-regexp "]+$"))
+ (if (stringp flag) flag (symbol-name flag))))
+
+(eval-and-compile
(luna-define-class elmo-flag-folder (elmo-localdir-folder)
(flag minfo minfo-hash max-number))
(luna-define-internal-accessors 'elmo-flag-folder))
(luna-define-method elmo-folder-initialize ((folder
elmo-flag-folder)
name)
- (if (string-match "flag/\\([a-z]+\\)" name)
- (setq name (match-string 1 name))
+ (unless (string-match (eval-when-compile
+ (concat "^flag\\(/\\(["
+ elmo-flag-char-regexp
+ "]+\\)\\)?$"))
+ name)
+ (error "Error in folder name `%s'" (elmo-folder-name-internal folder)))
+ (if (match-beginning 1)
+ (setq name (match-string 2 name))
(setq name (symbol-name (car elmo-global-flags)))
(elmo-folder-set-name-internal
folder
(elmo-uniq-list
(append
(mapcar 'intern (delete ".." (delete "." (directory-files dir))))
- elmo-global-flags)))))
+ (copy-sequence elmo-global-flags))))))
(defun elmo-flag-folder-delete-message (folder number
&optional keep-referrer)
(elmo-copy-file (elmo-file-cache-path cache)
new-file)
(when (and folder number)
- (elmo-message-fetch folder number (elmo-make-fetch-strategy
- 'entire)
- nil (current-buffer))
+ (elmo-message-fetch folder number
+ (elmo-make-fetch-strategy 'entire))
(write-region-as-binary (point-min) (point-max) new-file nil
'no-msg))))
(elmo-flag-folder-set-minfo-internal
(let ((flag (elmo-flag-folder-flag-internal folder)))
(when (luna-call-next-method)
(setq elmo-global-flags (delq flag elmo-global-flags))
+ (setq elmo-global-flag-folder-alist
+ (delq (assq flag elmo-global-flag-folder-alist)
+ elmo-global-flag-folder-alist))
t)))
(require 'product)
(mime-elmo-imap-location-folder-internal location)
(mime-elmo-imap-location-number-internal location)
(mime-elmo-imap-location-strategy-internal location)
- section
- (current-buffer)
- 'unseen)
+ 'unseen
+ section)
(buffer-string))
- (elmo-message-fetch
+ (elmo-message-fetch-string
(mime-elmo-imap-location-folder-internal location)
(mime-elmo-imap-location-number-internal location)
(mime-elmo-imap-location-strategy-internal location)
- section
- nil 'unseen)))
+ 'unseen
+ section)))
(luna-define-method mime-imap-location-bodystructure
(delim (or (cdr namespace-assoc)
elmo-imap4-default-hierarchy-delimiter))
;; Append delimiter when root with namespace.
+ (root-nodelim root)
(root (if (and namespace-assoc
(match-end 1)
(string= (substring root (match-end 1))
(elmo-imap4-response-get-selectable-mailbox-list
(elmo-imap4-send-command-wait
session
- (list "list \"\" " (elmo-imap4-mailbox root)))))))
+ (list "list \"\" " (elmo-imap4-mailbox
+ root-nodelim)))))))
(when (or (not (string= (elmo-net-folder-user-internal folder)
elmo-imap4-default-user))
(not (eq (elmo-net-folder-auth-internal folder)
;; elmo-folder-open-internal: do nothing.
-(luna-define-method elmo-find-fetch-strategy
- ((folder elmo-imap4-folder) entity &optional ignore-cache)
- (let ((number (elmo-message-entity-number entity))
- cache-file size message-id)
- (setq size (elmo-message-entity-field entity 'size))
- (setq message-id (elmo-message-entity-field entity 'message-id))
- (setq cache-file (elmo-file-cache-get message-id))
- (if (or ignore-cache
- (null (elmo-file-cache-status cache-file)))
- (if (and elmo-message-fetch-threshold
- (integerp size)
- (>= size elmo-message-fetch-threshold)
- (or (not elmo-message-fetch-confirm)
- (not (prog1 (y-or-n-p
+(luna-define-method elmo-find-fetch-strategy ((folder elmo-imap4-folder) number
+ &optional
+ ignore-cache
+ require-entireness)
+ (let ((entity (elmo-message-entity folder number)))
+ (if (null entity)
+ (elmo-make-fetch-strategy 'entire)
+ (let* ((size (elmo-message-entity-field entity 'size))
+ (message-id (elmo-message-entity-field entity 'message-id))
+ (cache-file (elmo-file-cache-get message-id))
+ (use-cache (and (not ignore-cache)
+ (elmo-message-use-cache-p folder number)
+ (if require-entireness
+ (eq (elmo-file-cache-status cache-file)
+ 'entire)
+ (elmo-file-cache-status cache-file)))))
+ (elmo-make-fetch-strategy
+ (if use-cache
+ (elmo-file-cache-status cache-file)
+ (if (and (not require-entireness)
+ elmo-message-fetch-threshold
+ (integerp size)
+ (>= size elmo-message-fetch-threshold)
+ (or (not elmo-message-fetch-confirm)
+ (not (prog1
+ (y-or-n-p
(format
"Fetch entire message at once? (%dbytes)"
size))
- (message "")))))
- ;; Fetch message as imap message.
- (elmo-make-fetch-strategy 'section
- nil
- (elmo-message-use-cache-p
- folder number)
- (elmo-file-cache-path
- cache-file))
- ;; Don't use existing cache and fetch entire message at once.
- (elmo-make-fetch-strategy 'entire nil
- (elmo-message-use-cache-p
- folder number)
- (elmo-file-cache-path cache-file)))
- ;; Cache found and use it.
- (if (not ignore-cache)
- (if (eq (elmo-file-cache-status cache-file) 'section)
- ;; Fetch message with imap message.
- (elmo-make-fetch-strategy 'section
- t
- (elmo-message-use-cache-p
- folder number)
- (elmo-file-cache-path
- cache-file))
- (elmo-make-fetch-strategy 'entire
- t
- (elmo-message-use-cache-p
- folder number)
- (elmo-file-cache-path
- cache-file)))))))
+ (message "")))))
+ 'section
+ 'entire))
+ use-cache
+ (elmo-message-use-cache-p folder number)
+ (elmo-file-cache-path cache-file))))))
(luna-define-method elmo-folder-create-plugged ((folder elmo-imap4-folder))
(elmo-imap4-send-command-wait
&optional section unseen)
(let ((file (elmo-maildir-message-file-name folder location)))
(when (file-exists-p file)
- (insert-file-contents-as-binary file))))
+ (insert-file-contents-as-binary file)
+ (unless unseen
+ (elmo-map-folder-set-flag folder (list location) 'read))
+ t)))
(luna-define-method elmo-folder-exists-p ((folder elmo-maildir-folder))
(let ((basedir (elmo-maildir-folder-directory-internal folder)))
(require 'mmimap)
(require 'mime-view)
+;; MIME-Entity
(eval-and-compile
- (luna-define-class mime-elmo-buffer-entity (mime-buffer-entity) ())
- (luna-define-class mime-elmo-imap-entity (mime-imap-entity) ()))
+ (luna-define-class elmo-mime-entity))
+
+(luna-define-generic elmo-mime-entity-display-p (entity mime-mode)
+ "Return non-nil if ENTITY is able to display with MIME-MODE.
+
+MIME-MODE is a symbol which is one of the following:
+ `mime' (Can display each MIME part)
+ `as-is' (Can display raw message)")
+
+(luna-define-generic elmo-mime-entity-display (entity preview-buffer
+ &optional
+ original-major-mode
+ keymap)
+ "Display MIME message ENTITY.
+PREVIEW-BUFFER is a view buffer.
+Optional argument ORIGINAL-MAJOR-MODE is major-mode of representation
+buffer of ENTITY. If it is nil, current `major-mode' is used.
+If optional argument KEYMAP is specified,
+use for keymap of representation buffer.")
+
+(luna-define-generic elmo-mime-entity-display-as-is (entity
+ preview-buffer
+ &optional
+ original-major-mode
+ keymap)
+ "Display MIME message ENTITY as is.
+PREVIEW-BUFFER is a view buffer.
+Optional argument ORIGINAL-MAJOR-MODE is major-mode of representation
+buffer of ENTITY. If it is nil, current `major-mode' is used.
+If optional argument KEYMAP is specified,
+use for keymap of representation buffer.")
+
+(luna-define-method elmo-mime-entity-display ((entity elmo-mime-entity)
+ preview-buffer
+ &optional
+ original-major-mode
+ keymap)
+ (let ((elmo-message-displaying t))
+ (mime-display-message entity
+ preview-buffer
+ nil
+ keymap
+ original-major-mode)))
+
+(eval-and-compile
+ (luna-define-class mime-elmo-buffer-entity (mime-buffer-entity
+ elmo-mime-entity))
+ (luna-define-class mime-elmo-imap-entity (mime-imap-entity
+ elmo-mime-entity)))
;; Provide backend
(provide 'mmelmo-imap)
elmo-message-sorted-field-list)
(run-hooks 'elmo-message-header-inserted-hook))
-(defun elmo-make-mime-message-location (folder number strategy rawbuf unread)
-;; Return the MIME message location structure.
-;; FOLDER is the ELMO folder structure.
-;; NUMBER is the number of the message in the FOLDER.
-;; STRATEGY is the message fetching strategy.
-;; RAWBUF is the output buffer for original message.
-;; If second optional argument UNREAD is non-nil, message is not marked
-;; as read.
- (if (and strategy
- (eq (elmo-fetch-strategy-entireness strategy) 'section))
- (luna-make-entity
- 'mime-elmo-imap-location
- :folder folder
- :number number
- :rawbuf rawbuf
- :strategy strategy)
- (with-current-buffer rawbuf
- (let (buffer-read-only)
- (erase-buffer)
- (if strategy
- (elmo-message-fetch folder number strategy
- nil (current-buffer)
- unread))))
- rawbuf))
-
-(defun elmo-mime-message-display (folder number viewbuf rawbuf original-mode
- &optional ignore-cache unread keymap)
- "Display MIME message.
-A message in the FOLDER with NUMBER is displayed on the VIEWBUF using RAWBUF.
-VIEWBUF is a view buffer and RAWBUF is a raw buffer.
-ORIGINAL is the major mode of RAWBUF.
-If optional argument IGNORE-CACHE is specified, existing cache is ignored.
-If second optional argument UNREAD is specified, message is displayed but
-keep it as unread.
-Return non-nil if not entire message was fetched."
- (let (mime-display-header-hook ; Do nothing.
- (elmo-message-displaying t)
- entity strategy)
- (unless (zerop (elmo-folder-length folder))
- (setq entity (elmo-message-entity folder number)))
- (setq strategy (if entity (elmo-find-fetch-strategy folder entity
- ignore-cache)
- (elmo-make-fetch-strategy 'entire)))
- (mime-display-message
- (mime-open-entity
- (if (and strategy
- (eq (elmo-fetch-strategy-entireness strategy) 'section))
- 'elmo-imap
- 'elmo-buffer)
- (elmo-make-mime-message-location
- folder number strategy rawbuf unread))
- viewbuf nil keymap
- original-mode)
- (if strategy
- (or (elmo-fetch-strategy-use-cache strategy)
- (eq (elmo-fetch-strategy-entireness strategy)
- 'section)))))
-
-(defun elmo-mime-display-as-is (folder number viewbuf rawbuf original-mode
- &optional ignore-cache unread keymap)
- "Display MIME message.
-A message in the FOLDER with NUMBER is displayed on the VIEWBUF using RAWBUF.
-VIEWBUF is a view buffer and RAWBUF is a raw buffer.
-ORIGINAL is the major mode of RAWBUF.
-If optional argument IGNORE-CACHE is specified, existing cache is ignored.
-If second optional argument UNREAD is specified, message is displayed but
-keep it as unread.
-Return non-nil if cache is used."
- (let (mime-display-header-hook ; Do nothing.
- (elmo-message-displaying t)
- entity cache-file cache-used)
- (unless (zerop (elmo-folder-length folder))
- (setq entity (elmo-message-entity folder number)))
- (when entity
- (setq cache-file
- (elmo-file-cache-get
- (elmo-message-entity-field entity 'message-id)))
- ;; Required to be an entire cache.
- (unless (eq (elmo-file-cache-status cache-file) 'entire)
- (setq ignore-cache t)))
- (elmo-mime-display-as-is-internal
- (mime-open-entity
- 'elmo-buffer
- (elmo-make-mime-message-location
- folder number
- (elmo-make-fetch-strategy 'entire
- (unless ignore-cache
- (setq
- cache-used
- (and cache-file
- (elmo-file-cache-status cache-file))))
- (elmo-message-use-cache-p folder number)
- (and cache-file
- (elmo-file-cache-path cache-file)))
- rawbuf unread))
- viewbuf nil keymap original-mode)
- cache-used))
+;; mime-elmo-buffer-entity
+(luna-define-method elmo-mime-entity-display-p
+ ((entity mime-elmo-buffer-entity) mime-mode)
+ ;; always return t.
+ t)
+
+(luna-define-method elmo-mime-entity-display-as-is ((entity
+ mime-elmo-buffer-entity)
+ preview-buffer
+ &optional
+ original-major-mode
+ keymap)
+ (elmo-mime-display-as-is-internal entity
+ preview-buffer
+ nil
+ keymap
+ original-major-mode))
+
+;; mime-elmo-imap-entity
+(luna-define-method elmo-mime-entity-display-p
+ ((entity mime-elmo-imap-entity) mime-mode)
+ (not (eq mime-mode 'as-is)))
+
+(luna-define-method elmo-mime-entity-display-as-is ((entity
+ mime-elmo-imap-entity)
+ preview-buffer
+ &optional
+ original-major-mode
+ keymap)
+ (error "Don't support this method."))
+
+
+(defun elmo-message-mime-entity (folder number rawbuf
+ &optional
+ ignore-cache unread entire)
+ "Return the mime-entity structure of the message in the FOLDER with NUMBER.
+RAWBUF is the output buffer for original message.
+If optional argument IGNORE-CACHE is non-nil, existing cache is ignored.
+If second optional argument UNREAD is non-nil,
+keep status of the message as unread.
+If third optional argument ENTIRE is non-nil, fetch entire message at once."
+ (let ((strategy (elmo-find-fetch-strategy folder number
+ ignore-cache
+ entire)))
+ (cond ((null strategy) nil)
+ ((eq (elmo-fetch-strategy-entireness strategy) 'section)
+ (mime-open-entity
+ 'elmo-imap
+ (luna-make-entity 'mime-elmo-imap-location
+ :folder folder
+ :number number
+ :rawbuf rawbuf
+ :strategy strategy)))
+ (t
+ (with-current-buffer rawbuf
+ (let (buffer-read-only)
+ (erase-buffer)
+ (elmo-message-fetch folder number strategy unread)))
+ (mime-open-entity 'elmo-buffer rawbuf)))))
;; Replacement of mime-display-message.
(defun elmo-mime-display-as-is-internal (message
;;; Code:
;;
+(eval-when-compile (require 'cl))
(require 'elmo)
(require 'luna)
(let ((pair (elmo-multi-real-folder-number folder number)))
(elmo-message-set-cached (car pair) (cdr pair) cached)))
-(luna-define-method elmo-find-fetch-strategy
- ((folder elmo-multi-folder) entity &optional ignore-cache)
- (let ((pair (elmo-multi-real-folder-number
- folder
- (elmo-message-entity-number entity))))
- (elmo-find-fetch-strategy
- (car pair)
- (elmo-message-entity (car pair) (cdr pair)) ignore-cache)))
+(luna-define-method elmo-find-fetch-strategy ((folder elmo-multi-folder)
+ number
+ &optional
+ ignore-cache
+ require-entireness)
+ (let ((pair (elmo-multi-real-folder-number folder number)))
+ (elmo-find-fetch-strategy (car pair)
+ (cdr pair)
+ ignore-cache
+ require-entireness)))
(luna-define-method elmo-message-number ((folder elmo-multi-folder)
message-id)
(luna-define-method elmo-message-fetch ((folder elmo-multi-folder)
number strategy
- &optional section outbuf unseen)
+ &optional unseen section)
(let ((pair (elmo-multi-real-folder-number folder number)))
- (elmo-message-fetch (car pair) (cdr pair) strategy section outbuf unseen)))
+ (when (elmo-message-fetch (car pair) (cdr pair)
+ strategy unseen section)
+ (unless unseen
+ (elmo-folder-notify-event folder 'flag-changed (list number)))
+ t)))
(luna-define-method elmo-folder-delete-messages ((folder elmo-multi-folder)
numbers)
(defvar sasl-mechanisms)
+(defcustom elmo-network-session-idle-timeout nil
+ "Idle timeout of the network cache. Specified in seconds.
+If elapsed time since last access is larger than this value,
+cached session is not reused.
+If nil, network cache is reused."
+ :type '(choice number (const nil))
+ :group 'elmo)
+
;;; Code:
;;
(eval-and-compile
auth
stream-type
process
- greeting))
+ greeting
+ last-accessed))
(luna-define-internal-accessors 'elmo-network-session))
(luna-define-generic elmo-network-initialize-session (session)
(setq pair (assoc (setq key (elmo-network-session-cache-key name folder))
elmo-network-session-cache))
(when (and pair
- (not (memq (process-status
- (elmo-network-session-process-internal
- (cdr pair)))
- '(open run))))
+ (or (not (memq (process-status
+ (elmo-network-session-process-internal
+ (cdr pair)))
+ '(open run)))
+ (and elmo-network-session-idle-timeout
+ (elmo-network-session-last-accessed-internal
+ (cdr pair))
+ (elmo-time-expire
+ (elmo-network-session-last-accessed-internal
+ (cdr pair))
+ elmo-network-session-idle-timeout))))
(setq elmo-network-session-cache
(delq pair elmo-network-session-cache))
(elmo-network-close-session (cdr pair))
(setq pair nil))
(if pair
- (cdr pair) ; connection cache exists.
+ (progn
+ (elmo-network-session-set-last-accessed-internal
+ (cdr pair) (current-time))
+ (cdr pair)) ; connection cache exists.
(unless if-exists
(setq session
(elmo-network-open-session
:auth auth
:stream-type stream-type
:process nil
- :greeting nil))
+ :greeting nil
+ :last-accessed (current-time)
+ ))
(buffer (format " *%s session for %s@%s:%d%s"
name
user
(elmo-delete-if
(lambda (number) (memq number deleting))
;; current number-list.
- (elmo-msgdb-list-messages (elmo-folder-msgdb folder)))
+ (elmo-folder-list-messages folder nil 'in-msgdb))
;; append appending messages
(mapcar (lambda (x) (* -1 x))
(elmo-dop-spool-folder-list-messages folder))))
;;; Code:
;;
+(eval-when-compile (require 'cl))
+
(require 'elmo)
(require 'elmo-map)
(require 'mime-edit)
;;; Code:
;;
+(eval-when-compile (require 'cl))
(require 'elmo-vars)
(require 'elmo-util)
(defconst elmo-nntp-server-command-index '((xover . 0)
(listgroup . 1)
- (list-active . 2)))
+ (list-active . 2)
+ (xhdr . 3)))
(defmacro elmo-nntp-get-server-command (session)
(` (assoc (cons (elmo-network-session-server-internal (, session))
(with-current-buffer (elmo-network-session-buffer session)
(std11-field-body "Newsgroups")))))
-(luna-define-method elmo-message-fetch-with-cache-process :around
- ((folder elmo-nntp-folder) number strategy &optional section unread)
+(luna-define-method elmo-message-fetch :around
+ ((folder elmo-nntp-folder) number strategy &optional unread section)
(when (luna-call-next-method)
(elmo-nntp-setup-crosspost-buffer folder number)
(unless unread
(luna-define-method elmo-message-fetch ((folder elmo-pipe-folder)
number strategy
- &optional section outbuf unseen)
- (elmo-message-fetch (elmo-pipe-folder-dst-internal folder)
- number strategy section outbuf unseen))
+ &optional unseen section)
+ (when (elmo-message-fetch (elmo-pipe-folder-dst-internal folder)
+ number strategy unseen section)
+ (unless unseen
+ (elmo-folder-notify-event folder 'flag-changed (list number)))
+ t))
(luna-define-method elmo-folder-clear :after ((folder elmo-pipe-folder)
&optional keep-killed)
(elmo-folder-delete-messages (elmo-pipe-folder-dst-internal folder)
numbers))
+(luna-define-method elmo-folder-detach-messages ((folder elmo-pipe-folder)
+ numbers)
+ (elmo-folder-detach-messages (elmo-pipe-folder-dst-internal folder)
+ numbers))
+
(defvar elmo-pipe-drained-hook nil "A hook called when the pipe is flushed.")
(defsubst elmo-pipe-folder-list-target-messages (src &optional ignore-list)
(elmo-message-set-cached (elmo-pipe-folder-dst-internal folder)
number cached))
-(luna-define-method elmo-find-fetch-strategy
- ((folder elmo-pipe-folder) entity &optional ignore-cache)
+(luna-define-method elmo-find-fetch-strategy ((folder elmo-pipe-folder)
+ number
+ &optional
+ ignore-cache
+ require-entireness)
(elmo-find-fetch-strategy (elmo-pipe-folder-dst-internal folder)
- (elmo-message-entity
- (elmo-pipe-folder-dst-internal folder)
- (elmo-message-entity-number entity))
- ignore-cache))
+ number
+ ignore-cache
+ require-entireness))
(luna-define-method elmo-message-number ((folder elmo-pipe-folder)
message-id)
(message "Creating msgdb...done")
new-msgdb))
-(luna-define-method elmo-message-fetch-with-cache-process
- ((folder elmo-sendlog-folder) number strategy &optional section unseen)
+(luna-define-method elmo-message-fetch
+ ((folder elmo-sendlog-folder) number strategy &optional unseen section)
;; disbable cache process
- (elmo-message-fetch-internal folder number strategy section unseen))
+ (erase-buffer)
+ (when (elmo-message-fetch-internal folder number strategy section unseen)
+ (when (and (not unseen)
+ (elmo-message-flagged-p folder number 'unread))
+ (elmo-message-unset-flag folder number 'unread))
+ t))
(luna-define-method elmo-map-message-fetch ((folder elmo-sendlog-folder)
location strategy
(require 'shimbun)
(eval-when-compile
+ (require 'cl)
(defun-maybe shimbun-servers-list ()))
(defcustom elmo-shimbun-check-interval 60
(luna-define-internal-accessors 'shimbun-elmo-mua))
(luna-define-method shimbun-mua-search-id ((mua shimbun-elmo-mua) id)
- (elmo-msgdb-message-entity (elmo-folder-msgdb
- (shimbun-elmo-mua-folder-internal mua))
- id))
+ (elmo-message-entity (shimbun-elmo-mua-folder-internal mua) id))
(eval-and-compile
(luna-define-class elmo-shimbun-folder
(defsubst elmo-shimbun-folder-shimbun-header (folder location)
(let ((hash (elmo-shimbun-folder-header-hash-internal folder)))
(or (and hash (elmo-get-hash-val location hash))
- (let ((entity (elmo-msgdb-message-entity
- (elmo-folder-msgdb folder)
- location))
+ (let ((entity (elmo-message-entity folder location))
(elmo-hash-minimum-size 63)
header)
(when entity
(delq nil
(mapcar
(lambda (x)
- (unless (elmo-msgdb-message-entity
- (elmo-folder-msgdb folder)
- (shimbun-header-id x))
+ (unless (elmo-message-entity folder (shimbun-header-id x))
x))
;; This takes much time.
(shimbun-headers
nil)
(defsubst elmo-shimbun-update-overview (folder shimbun-id header)
- (let ((entity (elmo-msgdb-message-entity (elmo-folder-msgdb folder)
- shimbun-id))
+ (let ((entity (elmo-message-entity folder shimbun-id))
(message-id (shimbun-header-id header))
references)
(unless (string= shimbun-id message-id)
(let (elmo-message-fetch-threshold)
(elmo-message-fetch
folder number
- (elmo-find-fetch-strategy folder
- (elmo-message-entity folder number))
- nil (current-buffer) 'unread)))
+ (elmo-find-fetch-strategy folder number nil 'entire)
+ 'unread)))
;; generic implement
(luna-define-method elmo-spam-message-spam-p ((processor elsp-generic)
(when (ignore-errors
(elmo-message-fetch folder msg
(elmo-make-fetch-strategy 'entire)
- nil (current-buffer) 'unread))
+ 'unread))
(run-hooks 'elmo-split-fetch-hook)
(setq elmo-split-message-entity (mime-parse-buffer))
(setq flags (elmo-message-flags-for-append folder msg))
(defconst elmo-condition-atom-regexp "[^/ \")|&]*")
-(defun elmo-read-search-condition (default)
- "Read search condition string interactively."
- (elmo-read-search-condition-internal "Search by" default))
-
-(defun elmo-read-search-condition-internal (prompt default)
- (let* ((completion-ignore-case t)
- (field (completing-read
- (format "%s (%s): " prompt default)
- (mapcar 'list
- (append '("AND" "OR"
- "Last" "First" "Flag"
- "From" "Subject" "To" "Cc" "Body"
- "Since" "Before" "ToCc"
- "!From" "!Subject" "!To" "!Cc" "!Body"
- "!Since" "!Before" "!ToCc")
- elmo-msgdb-extra-fields))))
- value)
- (setq field (if (string= field "")
- (setq field default)
- field))
- (cond
- ((or (string= field "AND") (string= field "OR"))
- (concat "("
- (elmo-read-search-condition-internal
- (concat field "(1) Search by") default)
- (if (string= field "AND") "&" "|")
- (elmo-read-search-condition-internal
- (concat field "(2) Search by") default)
- ")"))
- ((string-match "Since\\|Before" field)
- (let ((default (format-time-string "%Y-%m-%d")))
- (setq value (completing-read
- (format "Value for '%s' [%s]: " field default)
- (mapcar (function
- (lambda (x)
- (list (format "%s" (car x)))))
- elmo-date-descriptions)))
- (concat (downcase field) ":"
- (if (equal value "") default value))))
- ((string= field "Flag")
- (setq value (completing-read
- (format "Value for '%s': " field)
- (mapcar 'list
- '("unread" "important" "answered" "digest" "any"))))
- (unless (string-match (concat "^" elmo-condition-atom-regexp "$")
- value)
- (setq value (prin1-to-string value)))
- (concat (downcase field) ":" value))
- (t
- (setq value (read-from-minibuffer (format "Value for '%s': " field)))
- (unless (string-match (concat "^" elmo-condition-atom-regexp "$")
- value)
- (setq value (prin1-to-string value)))
- (concat (downcase field) ":" value)))))
-
(defsubst elmo-condition-parse-error ()
(error "Syntax error in '%s'" (buffer-string)))
(goto-char (match-end 0))
(let ((search-key (vector
(if (match-beginning 1) 'unmatch 'match)
- (elmo-match-buffer 2)
+ (downcase (elmo-match-buffer 2))
(elmo-condition-parse-search-value))))
;; syntax sugar.
(if (string= (aref search-key 1) "tocc")
(defvar elmo-passwd-alist nil)
(defun elmo-passwd-alist-load ()
- (save-excursion
+ (with-temp-buffer
(let ((filename (expand-file-name elmo-passwd-alist-file-name
elmo-msgdb-directory))
- (tmp-buffer (get-buffer-create " *elmo-passwd-alist-tmp*"))
insert-file-contents-pre-hook ; To avoid autoconv-xmas...
insert-file-contents-post-hook
ret-val)
(if (not (file-readable-p filename))
()
- (set-buffer tmp-buffer)
(insert-file-contents filename)
- (setq ret-val
- (condition-case nil
- (read (current-buffer))
- (error nil nil))))
- (kill-buffer tmp-buffer)
- ret-val)))
+ (condition-case nil
+ (read (current-buffer))
+ (error nil nil))))))
(defun elmo-passwd-alist-clear ()
"Clear password cache."
(defun elmo-passwd-alist-save ()
"Save password into file."
(interactive)
- (save-excursion
+ (with-temp-buffer
(let ((filename (expand-file-name elmo-passwd-alist-file-name
elmo-msgdb-directory))
- (tmp-buffer (get-buffer-create " *elmo-passwd-alist-tmp*"))
print-length print-level)
- (set-buffer tmp-buffer)
- (erase-buffer)
- (prin1 elmo-passwd-alist tmp-buffer)
- (princ "\n" tmp-buffer)
+ (prin1 elmo-passwd-alist (current-buffer))
+ (princ "\n" (current-buffer))
;;; (if (and (file-exists-p filename)
;;; (not (equal 384 (file-modes filename))))
;;; (error "%s is not safe.chmod 600 %s!" filename filename))
(write-region (point-min) (point-max)
filename nil 'no-msg)
(set-file-modes filename 384))
- (message "%s is not writable." filename))
- (kill-buffer tmp-buffer))))
+ (message "%s is not writable." filename)))))
(defun elmo-get-passwd (key)
"Get password from password pool."
;; product-define in the first place
(product-provide 'elmo-version
;; Don't forget to check `wl-version.el' and Info.
- (product-define "ELMO" nil '(2 12 0)))
+ (product-define "ELMO" nil '(2 12 1)))
;; set version-string
(product-version-as-string 'elmo-version)
(t
(memq flag cur-flags)))))
-(luna-define-generic elmo-find-fetch-strategy
- (folder entity &optional ignore-cache)
-;; Returns the message fetching strategy suitable for the message.
-;; FOLDER is the ELMO folder structure.
-;; ENTITY is the overview entity of the message in the folder.
-;; If optional argument IGNORE-CACHE is non-nil, cache is ignored.
-;; Returned value is a elmo-fetch-strategy object.
-;; If return value is nil, message should not be nil.
- )
+(luna-define-generic elmo-find-fetch-strategy (folder number
+ &optional
+ ignore-cache
+ require-entireness)
+ "Return the message fetching strategy suitable for the message with NUMBER.
+FOLDER is the ELMO folder structure.
+If optional argument IGNORE-CACHE is non-nil, existing cache is ignored.
+If second optional argument REQUIRE-ENTIRENESS is non-nil,
+ensure that entireness of the returned strategy is entire.
+Returned value is a elmo-fetch-strategy object.
+If return value is nil, message should not be nil.")
(defmacro elmo-make-fetch-strategy (entireness
&optional
use-cache
save-cache
cache-path)
-;; Make elmo-message-fetching strategy.
-;; ENTIRENESS is 'entire or 'section.
-;; 'entire means fetch message entirely at once.
-;; 'section means fetch message section by section.
-;; If optional USE-CACHE is non-nil, existing cache is used and otherwise,
-;; existing cache is thrown away.
-;; If SAVE-CACHE is non-nil, fetched message is saved.
-;; CACHE-PATH is the cache path to be used as a message cache file.
- (` (vector (, entireness)
- (, use-cache) (, save-cache) (, cache-path))))
+ "Make elmo-message-fetching strategy.
+ENTIRENESS is 'entire or 'section.
+'entire means fetch message entirely at once.
+'section means fetch message section by section.
+If optional USE-CACHE is non-nil, existing cache is used and otherwise,
+existing cache is thrown away.
+If SAVE-CACHE is non-nil, fetched message is saved.
+CACHE-PATH is the cache path to be used as a message cache file."
+ `(vector ,entireness ,use-cache ,save-cache ,cache-path))
(defmacro elmo-fetch-strategy-entireness (strategy)
- ;; Return entireness of STRATEGY.
- (` (aref (, strategy) 0)))
+ "Return entireness of STRATEGY."
+ `(aref ,strategy 0))
(defmacro elmo-fetch-strategy-use-cache (strategy)
- ;; Return use-cache of STRATEGY.
- (` (aref (, strategy) 1)))
+ "Return use-cache of STRATEGY."
+ `(aref ,strategy 1))
(defmacro elmo-fetch-strategy-save-cache (strategy)
- ;; Return save-cache of STRATEGY.
- (` (aref (, strategy) 2)))
+ "Return save-cache of STRATEGY."
+ `(aref ,strategy 2))
(defmacro elmo-fetch-strategy-cache-path (strategy)
- ;; Return cache-path of STRATEGY.
- (` (aref (, strategy) 3)))
-
-(luna-define-method elmo-find-fetch-strategy
- ((folder elmo-folder) entity &optional ignore-cache)
- (let (cache-file size message-id number)
- (setq size (elmo-message-entity-field entity 'size))
- (setq message-id (elmo-message-entity-field entity 'message-id))
- (setq number (elmo-message-entity-number entity))
- (setq cache-file (elmo-file-cache-get message-id))
- (setq ignore-cache (or ignore-cache
- (null (elmo-message-use-cache-p folder number))))
- (if (or ignore-cache
- (null (elmo-file-cache-status cache-file)))
- ;; No cache or ignore-cache.
- (if (and (not (elmo-folder-local-p folder))
- elmo-message-fetch-threshold
- (integerp size)
- (>= size elmo-message-fetch-threshold)
- (or (not elmo-message-fetch-confirm)
- (not (prog1 (y-or-n-p
- (format "Fetch entire message(%dbytes)? "
- size))
- (message "")))))
- ;; Don't fetch message at all.
- nil
- ;; Don't use existing cache and fetch entire message at once.
- (elmo-make-fetch-strategy
- 'entire nil
- (elmo-message-use-cache-p folder number)
- (elmo-file-cache-path cache-file)))
- ;; Cache exists.
- (if (not ignore-cache)
- (elmo-make-fetch-strategy
- 'entire
- ;; ...But ignore current section cache and re-fetch
- ;; if section cache.
- (not (eq (elmo-file-cache-status cache-file) 'section))
- ;; Save cache.
- (elmo-message-use-cache-p folder number)
- (elmo-file-cache-path cache-file))))))
+ "Return cache-path of STRATEGY."
+ `(aref ,strategy 3))
+
+(luna-define-method elmo-find-fetch-strategy ((folder elmo-folder) number
+ &optional
+ ignore-cache
+ require-entireness)
+ (let ((entity (elmo-message-entity folder number)))
+ (if (null entity)
+ (elmo-make-fetch-strategy 'entire)
+ (let* ((size (elmo-message-entity-field entity 'size))
+ (message-id (elmo-message-entity-field entity 'message-id))
+ (cache-file (elmo-file-cache-get message-id))
+ (use-cache (elmo-message-use-cache-p folder number)))
+ (if (and (not ignore-cache)
+ use-cache
+ (eq (elmo-file-cache-status cache-file) 'entire))
+ ;; Cache exists and use it.
+ (elmo-make-fetch-strategy
+ 'entire
+ t ; Use cache.
+ use-cache ; Save cache.
+ (elmo-file-cache-path cache-file))
+ ;; No cache or ignore-cache.
+ (if (and (not (elmo-folder-local-p folder))
+ (not require-entireness)
+ elmo-message-fetch-threshold
+ (integerp size)
+ (>= size elmo-message-fetch-threshold)
+ (or (not elmo-message-fetch-confirm)
+ (not (prog1
+ (y-or-n-p
+ (format "Fetch entire message(%dbytes)? "
+ size))
+ (message "")))))
+ ;; Don't fetch message at all.
+ nil
+ ;; Don't use existing cache and fetch entire message at once.
+ (elmo-make-fetch-strategy
+ 'entire
+ nil ; Don't use cache.
+ use-cache ; Save cache.
+ (elmo-file-cache-path cache-file))))))))
(luna-define-method elmo-folder-list-messages-internal
((folder elmo-folder) &optional visible-only)
(luna-define-method elmo-message-encache ((folder elmo-folder) number
&optional read)
(let (path)
- (elmo-message-fetch
- folder number
- (elmo-make-fetch-strategy 'entire
- nil ;use-cache
- t ;save-cache
- (setq path (elmo-file-cache-get-path
- (elmo-message-field
- folder number 'message-id))))
- nil nil (not read))
+ (with-temp-buffer
+ (elmo-message-fetch
+ folder number
+ (elmo-make-fetch-strategy 'entire
+ nil ;use-cache
+ t ;save-cache
+ (setq path (elmo-file-cache-get-path
+ (elmo-message-field
+ folder number 'message-id))))
+ (not read)))
path))
(luna-define-generic elmo-message-fetch-bodystructure (folder number strategy)
(luna-define-generic elmo-message-fetch (folder number strategy
&optional
- section
- outbuf
- unread)
- "Fetch a message and return as a string.
-FOLDER is the ELMO folder structure.
-NUMBER is the number of the message in the FOLDER.
-STRATEGY is the message fetching strategy.
-If optional argument SECTION is specified, only the SECTION of the message
-is fetched (if possible).
-If second optional argument OUTBUF is specified, fetched message is
-inserted to the buffer and returns t if fetch was ended successfully.
-If third optional argument UNREAD is non-nil, message is not flaged as read.
-Returns non-nil if fetching was succeed.")
-
-(luna-define-generic elmo-message-fetch-with-cache-process (folder
- number strategy
- &optional
- section
- unread)
- "Fetch a message into current buffer with cache process.
+ unread
+ section)
+ "Fetch a message into current buffer.
FOLDER is the ELMO folder structure.
NUMBER is the number of the message in the FOLDER.
STRATEGY is the message fetching strategy.
-If optional argument SECTION is specified, only the SECTION of the message
-is fetched (if possible).
-If second optional argument UNREAD is non-nil, message is not flaged as read.
+If optional argument UNREAD is non-nil, message is not flaged as read.
+If second optional argument SECTION is specified, only the
+SECTION of the message is fetched (if possible).
Returns non-nil if fetching was succeed.")
(luna-define-generic elmo-message-fetch-internal (folder number strategy
(and cache t)
nil
cache-path)
- nil (current-buffer) t)
+ 'unread)
(set-buffer-multibyte default-enable-multibyte-characters)
(decode-coding-region (point-min) (point-max)
elmo-mime-display-as-is-coding-system)
'entire t nil
(elmo-file-cache-path cache)))
(error "Unplugged")))
- nil (current-buffer)
'unread)
(> (buffer-size) 0)
(elmo-folder-append-buffer
number cached)
(if cached
(elmo-msgdb-set-flag (elmo-folder-msgdb folder) number 'cached)
- (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number 'cached)))
+ (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number 'cached))
+ (elmo-folder-notify-event folder 'cache-changed number))
(defun elmo-message-copy-entity (entity)
(elmo-msgdb-copy-message-entity (elmo-message-entity-handler entity)
number strategy)
nil)
+(defun elmo-message-fetch-string (folder number strategy
+ &optional
+ unread
+ section)
+ (with-temp-buffer
+ (when (elmo-message-fetch folder number strategy unread section)
+ (buffer-string))))
+
(luna-define-method elmo-message-fetch ((folder elmo-folder)
number strategy
&optional
- section
- outbuf
- unread)
- (if outbuf
- (with-current-buffer outbuf
- (erase-buffer)
- (elmo-message-fetch-with-cache-process folder number
- strategy section unread))
- (with-temp-buffer
- (elmo-message-fetch-with-cache-process folder number
- strategy section unread)
- (buffer-string))))
-
-(luna-define-method elmo-message-fetch-with-cache-process ((folder elmo-folder)
- number strategy
- &optional
- section unread)
+ unread
+ section)
+ (erase-buffer)
(let ((cache-path (elmo-fetch-strategy-cache-path strategy))
(method-priorities
(cond ((eq (elmo-fetch-strategy-use-cache strategy) 'maybe)
'(cache entity))
(t
'(entity))))
- result err)
+ result err updated-server-flag)
(while (and method-priorities
- (null result))
+ (not result))
(setq result
(case (car method-priorities)
(cache
(elmo-file-cache-load cache-path section))
(entity
- (when (and (condition-case error
- (elmo-message-fetch-internal folder number
- strategy
- section
- unread)
- (error (setq err error) nil))
- (> (buffer-size) 0))
+ (when (condition-case error
+ (elmo-message-fetch-internal folder number
+ strategy
+ section
+ unread)
+ (error (setq err error) nil))
+ (setq updated-server-flag t)
(when (and (elmo-fetch-strategy-save-cache strategy)
cache-path)
(elmo-file-cache-save cache-path section))
t)))
method-priorities (cdr method-priorities)))
- (or result
- (and err (signal (car err) (cdr err))))))
+ (if result
+ (when (and (not unread)
+ (elmo-message-flagged-p folder number 'unread))
+ (elmo-message-unset-flag folder number 'unread updated-server-flag))
+ (when err
+ (signal (car err) (cdr err))))
+ result))
(defun elmo-folder-kill-messages-range (folder beg end)
(elmo-folder-set-killed-list-internal
(luna-define-generic elmo-event-handler-flag-changed (handler numbers)
"Notify flag of the messages with NUMBERS is changed.")
+(luna-define-generic elmo-event-handler-cache-changed (handler number)
+ "Called when cache status of the message with NUMBER is changed.")
+
(defun elmo-folder-add-handler (folder handler)
(unless (memq handler (elmo-folder-handlers-internal folder))
(elmo-folder-set-handlers-internal
entity
(list (mmimap-make-mime-entity
(nth 8 bodystructure) class
- location node-id 0
+ location node-id nil
entity))))
entity))))
+2005-02-01 Tetsurou Okazaki <okazaki@be.to>
+
+ * wl-thread.el (wl-thread-entity-get-descendant): Change `defsubst'
+ to `defun'. Use `nconc' instead of `append' to collect descendant
+ message numbers.
+
+2005-01-30 TAKAHASHI Kaoru <kaoru@kaisei.org>
+
+ * wl-thread.el (wl-thread-save-top-list)
+ (wl-thread-save-entities): Use `with-temp-buffer'.
+ * wl-news.el.in (wl-news-previous-version-load):
+ (wl-news-previous-version-save): Ditto.
+ * wl-summary.el (wl-summary-load-file-object)
+ (wl-summary-save-view-cache): Ditto.
+
+2005-01-30 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-util.el (toplevel): Require 'elmo-flag'.
+ (wl-read-search-condition): New function (Renamed from
+ `elmo-read-search-condition').
+ (wl-read-search-condition-internal): Likewise.
+
+ * wl-summary.el (wl-summary-decide-flag): Cause error if flag is
+ invalid.
+ (wl-summary-pick): Use `wl-read-search-condition' instead of
+ `elmo-read-search-condition'.
+ (wl-summary-virtual): Ditto.
+
+ * wl-folder.el (wl-folder-virtual): Ditto.
+ (wl-folder-pick): Ditto.
+
+ * wl-fldmgr.el (wl-fldmgr-make-filter): Ditto.
+
+2005-01-28 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-summary.el (wl-summary-reedit): Call
+ `wl-summary-message-string' with argument `use-cache' as `'maybe'.
+
+2005-01-23 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-mime.el (toplevel): Require wl-vars.
+
+ * wl-message.el (toplevel): Require cl at compile.
+
+ * wl-draft.el (toplevel): Require elmo.
+
+2005-01-20 Yoichi NAKAYAMA <yoichi@geiin.org>
+
+ * wl-message.el (wl-message-buffer-prefetch): Count is a number
+ and do nothing when it is not positive.
+ (wl-message-buffer-prefetch-next): Ditto.
+
+2005-01-19 Yoichi NAKAYAMA <yoichi@geiin.org>
+
+ * wl-summary.el (wl-summary-goto-folder-subr): Avoid error for
+ `wl-message-buffer-prefetch-depth' is nil though it is illegal.
+ (wl-summary-redisplay-internal): Ditto.
+
+ * wl-summary.el (wl-summary-goto-folder-subr): Protect current
+ message (the condition is borrowed from `wl-check-variables-2').
+ (wl-summary-redisplay-internal): Ditto.
+
+2005-01-17 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-mime.el (wl-draft-nntp-attribute): New function.
+ (wl-draft-attribute-nntp-posting-server): Use it.
+ (wl-draft-attribute-nntp-posting-port): Ditto.
+
+ * wl-mime.el (wl-draft-preview-attributes-list): New function.
+ (wl-draft-show-attributes-buffer): Ditto.
+ (wl-draft-hide-attributes-buffer): Ditto.
+ (wl-draft-attribute-newsgroups): Ditto.
+ (wl-draft-attribute-nntp-posting-server): Ditto.
+ (wl-draft-attribute-nntp-posting-port): Ditto.
+ (wl-draft-preview-message): Use there functions.
+
+ * wl-vars.el (wl-draft-preview-attributes-list): Change default
+ value.
+
+2005-01-11 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-draft.el (wl-draft-insert-get-message): Follow the API change.
+ (wl-draft-reedit): Ditto.
+ (wl-draft-queue-flush): Ditto.
+
+ * wl-mime.el (wl-message-request-partial): Ditto.
+ (wl-message-delete-current-part): Use `elmo-message-fetch-string'
+ instead of `elmo-message-fetch'.
+
+ * wl-action.el (wl-summary-exec-action-resend-subr): Ditto.
+
+ * wl-summary.el (wl-summary-message-string): Ditto.
+
+2005-01-07 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-util.el (wl-current-message-buffer): Follow the API change.
+
+ * wl-summary.el (wl-summary-redisplay-internal): Call
+ `wl-summary-mark-as-read' with 2nd argument as nil and update
+ unread count instead of persistent mark.
+
+ * wl-message.el (wl-message-buffer-mime-entity): New buffer local
+ variable.
+ (wl-message-redisplay): Follow the API change.
+ (wl-message-buffer-display): Managed mime-entity directly and
+ return preview buffer only.
+ (wl-message-display-internal): Rewrite.
+ (wl-message-buffer-prefetch-subr): Not save return value of
+ `wl-message-buffer-display'.
+
+ * Version number is increased to 2.13.1.
+
2005-01-05 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
* wl-addrmgr.el (wl-addrmgr-pickup-entry-list): Call
'elmo-multiple-fields-body-list' with boundary specified.
+2005-01-05 Yoichi NAKAYAMA <yoichi@geiin.org>
+
+ * wl-vars.el (wl-summary-resend-use-cache): New variable.
+ * wl-action.el (wl-summary-exec-action-resend-subr): Use file
+ cache if `wl-summary-resend-use-cache' is non-nil.
+
+2005-01-02 Yoichi NAKAYAMA <yoichi@geiin.org>
+
+ * wl-vars.el (wl-pop-before-smtp-stream-type): Fix range.
+ (wl-nntp-posting-stream-type): Ditto.
+
2005-01-01 TAKAHASHI Kaoru <kaoru@kaisei.org>
* wl-demo.el (wl-demo-copyright-notice): Add 2005.
* wl-util.el (wl-save-drafts): Avoid error on redisplaying
message.
+2004-12-25 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
+
+ * wl-summary.el (wl-summary-buffer-unsync-mark-number-list):
+ Abolish.
+ (wl-summary-buffer-persistent-mark-version): New internal
+ variable.
+ (wl-summary-update-mark-and-highlight-window): Check by
+ wl-summary-persistent-mark-invalid-p.
+ (wl-summary-update-status-marks): Ditto.
+ (elmo-event-handler-flag-changed): Rewrite.
+ (elmo-event-handler-cache-changed): Define.
+ (wl-summary-prefetch-msg): Does not update persistent mark here.
+ (wl-summary-delete-cache): Ditto.
+ (wl-summary-resume-cache-status): Ditto.
+ (wl-summary-jump-to-msg): Add arguments `beg' and `end'.
+ (wl-summary-persistent-mark-invalid-p): New function.
+ (wl-summary-validate-persistent-mark): Ditto.
+ (wl-summary-validate-persistent-mark-string): Ditto.
+ (wl-summary-invalidate-persistent-mark): Ditto.
+ (wl-summary-update-persistent-mark): Call
+ `wl-summary-validate-persistent-mark'.
+ (wl-summary-create-line): Call
+ `wl-summary-validate-persistent-mark-string'.
+
+ * wl-message.el (wl-message-buffer-prefetch-subr): Set cache
+ status as t if cache used.
+
2004-12-24 Yuuichi Teranishi <teranisi@gohome.org>
* 2.12.0 is released.
(let ((beg (point)))
;; Insert the message to be resent.
(insert
- (with-temp-buffer
- (elmo-message-fetch folder number
- (elmo-make-fetch-strategy 'entire)
- nil (current-buffer) 'unread)
- (buffer-string)))
+ ;; elmo-message-fetch is erace current buffer before fetch message
+ (elmo-message-fetch-string folder number
+ (if wl-summary-resend-use-cache
+ (elmo-make-fetch-strategy
+ 'entire 'maybe nil
+ (elmo-file-cache-get-path
+ (elmo-message-field
+ folder number 'message-id)))
+ (elmo-make-fetch-strategy 'entire))
+ 'unread))
(goto-char (point-min))
(search-forward "\n\n")
(forward-char -1)
;;; Code:
;;
-
+(require 'elmo)
(require 'sendmail)
(require 'wl-template)
(require 'emu)
wl-draft-cite-function)
(unwind-protect
(progn
- (elmo-message-fetch (wl-folder-get-elmo-folder fld)
- number
- ;; No cache.
- (elmo-make-fetch-strategy 'entire)
- nil mail-reply-buffer)
+ (with-current-buffer mail-reply-buffer
+ (erase-buffer)
+ (elmo-message-fetch (wl-folder-get-elmo-folder fld)
+ number
+ ;; No cache.
+ (elmo-make-fetch-strategy 'entire)))
(wl-draft-yank-from-mail-reply-buffer nil))
(kill-buffer mail-reply-buffer))))
(switch-to-buffer-other-frame buffer)
(switch-to-buffer buffer))
(set-buffer buffer)
- (elmo-message-fetch draft-folder number (elmo-make-fetch-strategy 'entire)
- nil (current-buffer))
+ (elmo-message-fetch draft-folder number (elmo-make-fetch-strategy 'entire))
(elmo-delete-cr-buffer)
(let ((mime-edit-again-ignored-field-regexp
"^\\(Content-.*\\|Mime-Version\\):"))
(wl-draft-queue-info-operation (car msgs) 'load)
(elmo-message-fetch queue-folder
(car msgs)
- (elmo-make-fetch-strategy 'entire)
- nil (current-buffer))
+ (elmo-make-fetch-strategy 'entire))
(condition-case err
(setq failure (funcall
wl-draft-queue-flush-send-function
(setq entity (nth 4 tmp)))
(unless entity (error "No folder"))
(wl-fldmgr-add (concat "/"
- (elmo-read-search-condition
+ (wl-read-search-condition
wl-fldmgr-make-filter-default)
"/" entity))))))
(unless entity (error "No folder"))
(wl-folder-goto-folder-subr
(concat "/"
- (elmo-read-search-condition
+ (wl-read-search-condition
wl-fldmgr-make-filter-default)
"/" entity))))
(interactive)
(save-excursion
(let* ((condition (car (elmo-parse-search-condition
- (elmo-read-search-condition
+ (wl-read-search-condition
wl-summary-pick-field-default))))
(entity (wl-folder-get-entity-from-buffer))
(folder-list
;;; Code:
;;
+(eval-when-compile (require 'cl))
(require 'wl-vars)
(require 'wl-highlight)
(defvar wl-message-buffer-original-buffer nil) ; original buffer.
(defvar wl-message-buffer-mode-line-formatter nil)
(defvar wl-message-buffer-flag-indicator nil)
+(defvar wl-message-buffer-mime-entity nil)
(make-variable-buffer-local 'wl-message-buffer-cur-folder)
(make-variable-buffer-local 'wl-message-buffer-cur-number)
(make-variable-buffer-local 'wl-message-buffer-original-buffer)
(make-variable-buffer-local 'wl-message-buffer-mode-line-formatter)
(make-variable-buffer-local 'wl-message-buffer-flag-indicator)
+(make-variable-buffer-local 'wl-message-buffer-mime-entity)
(defvar wl-fixed-window-configuration nil)
(let* ((default-mime-charset wl-mime-charset)
(buffer-read-only nil)
(summary-buf (current-buffer))
- message-buf
- strategy entity
- cache-used
- summary-win delim flags)
+ message-buf entity summary-win flags)
(setq buffer-read-only nil)
- (setq cache-used (wl-message-buffer-display
- folder number display-type force-reload))
- (setq wl-message-buffer (car cache-used))
+ (setq wl-message-buffer (wl-message-buffer-display
+ folder number display-type force-reload))
(setq message-buf wl-message-buffer)
(wl-message-select-buffer wl-message-buffer)
; (when wl-highlight-body-too
; (wl-highlight-body))
(ignore-errors (wl-message-narrow-to-page))
- (setq cache-used (cdr cache-used))
(goto-char (point-min))
(when (re-search-forward "^$" nil t)
(wl-message-add-buttons-to-header (point-min) (point))
(set-buffer summary-buf)
(setq summary-win (get-buffer-window summary-buf))
(if (window-live-p summary-win)
- (select-window summary-win))
- cache-used))
+ (select-window summary-win))))
;; Use message buffer cache.
(defun wl-message-buffer-display (folder number display-type
&optional force-reload unread)
- (let* ((msg-id (ignore-errors (elmo-message-field folder number
- 'message-id)))
+ (let* ((msg-id (ignore-errors
+ (elmo-message-field folder number 'message-id)))
(fname (elmo-folder-name-internal folder))
(hit (wl-message-buffer-cache-hit (list fname number msg-id)))
- (read nil)
- cache-used)
+ (redisplay nil)
+ entity)
(when (and hit (not (buffer-live-p hit)))
(wl-message-buffer-cache-delete (list fname number msg-id))
(setq hit nil))
;; move hit to the top.
(wl-message-buffer-cache-sort
(wl-message-buffer-cache-entry-make (list fname number msg-id) hit))
- ;; buffer cache is used.
- (setq cache-used t)
(with-current-buffer hit
;; Rewind to the top page
(widen)
(goto-char (point-min))
(ignore-errors (wl-message-narrow-to-page))
+ (setq entity wl-message-buffer-mime-entity)
(unless (eq wl-message-buffer-cur-display-type display-type)
- (setq read t))))
+ (setq redisplay t))))
;; delete tail and add new to the top.
(setq hit (wl-message-buffer-cache-add (list fname number msg-id)))
- (setq read t))
- (if (or force-reload read)
- (condition-case err
- (save-excursion
- (set-buffer hit)
- (setq
- cache-used
- (wl-message-display-internal folder number display-type
- force-reload unread))
- (setq wl-message-buffer-cur-display-type display-type))
- (quit
- (wl-message-buffer-cache-delete)
- (error "Display message %s/%s is quitted" fname number))
- (error
- (wl-message-buffer-cache-delete)
- (signal (car err) (cdr err))
- nil))) ;; will not be used
- (cons hit cache-used)))
-
-(defun wl-message-display-internal (folder number display-type
- &optional force-reload unread)
+ (setq redisplay t))
+ (when (or force-reload redisplay)
+ (condition-case err
+ (save-excursion
+ (set-buffer hit)
+ (when (or force-reload
+ (null entity)
+ (not (elmo-mime-entity-display-p
+ entity
+ (if (wl-message-mime-analysis-p display-type)
+ 'mime
+ 'as-is))))
+ (setq entity (elmo-message-mime-entity
+ folder
+ number
+ (wl-message-get-original-buffer)
+ force-reload
+ unread
+ (not (wl-message-mime-analysis-p display-type)))))
+ (unless entity
+ (error "Cannot display message %s/%s" fname number))
+ (wl-message-display-internal entity display-type))
+ (quit
+ (wl-message-buffer-cache-delete)
+ (error "Display message %s/%s is quitted" fname number))
+ (error
+ (wl-message-buffer-cache-delete)
+ (signal (car err) (cdr err))
+ nil))) ;; will not be used
+ hit))
+
+(defun wl-message-display-internal (entity display-type)
(let ((default-mime-charset wl-mime-charset)
- (elmo-mime-charset wl-mime-charset))
- (setq wl-message-buffer-require-all-header
- (wl-message-display-all-header-p display-type))
- (prog1
- (if (wl-message-mime-analysis-p display-type)
- (elmo-mime-message-display folder number
- (current-buffer)
- (wl-message-get-original-buffer)
- 'wl-original-message-mode
- force-reload
- unread
- (wl-message-define-keymap))
- (let* ((elmo-mime-display-header-analysis
- (wl-message-mime-analysis-p display-type 'header))
- (wl-highlight-x-face-function
- (and elmo-mime-display-header-analysis
- wl-highlight-x-face-function)))
- (prog1 (elmo-mime-display-as-is folder number
- (current-buffer)
- (wl-message-get-original-buffer)
- 'wl-original-message-mode
- force-reload
- unread
- (wl-message-define-keymap))
- (let (buffer-read-only)
- (wl-highlight-message (point-min) (point-max) t)))))
- (run-hooks 'wl-message-display-internal-hook)
- (setq buffer-read-only t))))
+ (elmo-mime-charset wl-mime-charset)
+ (wl-message-buffer-require-all-header
+ (wl-message-display-all-header-p display-type)))
+ (if (wl-message-mime-analysis-p display-type)
+ (elmo-mime-entity-display entity
+ (current-buffer)
+ 'wl-original-message-mode
+ (wl-message-define-keymap))
+ (let* ((elmo-mime-display-header-analysis
+ (wl-message-mime-analysis-p display-type 'header))
+ (wl-highlight-x-face-function
+ (and elmo-mime-display-header-analysis
+ wl-highlight-x-face-function)))
+ (elmo-mime-entity-display-as-is entity
+ (current-buffer)
+ 'wl-original-message-mode
+ (wl-message-define-keymap))
+ (let (buffer-read-only)
+ (wl-highlight-message (point-min) (point-max) t))))
+ (setq wl-message-buffer-cur-display-type display-type
+ wl-message-buffer-mime-entity entity)
+ (run-hooks 'wl-message-display-internal-hook)
+ (setq buffer-read-only t)))
(defun wl-message-buffer-prefetch-p (folder &optional number)
(and (or (not number)
&optional summary charset)
(let* ((summary (or summary (get-buffer wl-summary-buffer-name)))
(num number))
- (when (and count
+ (when (and (> count 0)
(wl-message-buffer-prefetch-p folder))
(unless (wl-message-buffer-prefetch-p folder number)
(setq num
&optional summary charset)
(let* ((summary (or summary (get-buffer wl-summary-buffer-name)))
next)
- (when (and count
+ (when (and (> count 0)
(wl-message-buffer-prefetch-p folder))
(setq next (wl-message-buffer-prefetch-get-next folder number summary))
(when next
(display-type (wl-message-make-display-type
wl-summary-buffer-display-mime-mode
wl-summary-buffer-display-header-mode))
- result time1 time2 sec micro)
+ time1 time2 sec micro)
(when wl-message-buffer-prefetch-debug
(message "%d: count %d, hit %s" number count (buffer-name hit)))
(if (and hit (buffer-live-p hit))
(when wl-message-buffer-prefetch-debug
(setq time1 (current-time))
(message "Prefetching %d..." number))
- (setq result (wl-message-buffer-display
- folder number display-type nil 'unread))
+ (wl-message-buffer-display folder number
+ display-type nil 'unread)
+ (when (elmo-message-use-cache-p folder number)
+ (elmo-message-set-cached folder number t))
(when wl-message-buffer-prefetch-debug
(setq time2 (current-time))
(setq sec (- (nth 1 time2)(nth 1 time1)))
;;; Code:
;;
-
(require 'mime-view)
(require 'mime-edit)
(require 'mime-play)
(require 'elmo)
+(require 'wl-vars)
(eval-when-compile
(defalias-maybe 'pgg-decrypt-region 'ignore)
(defalias 'wl-draft-enclose-digest-region 'mime-edit-enclose-digest-region)
+(defun wl-draft-preview-attributes-list ()
+ (if (listp (car wl-draft-preview-attributes-list))
+ (elmo-uniq-list
+ (append (and (wl-message-mail-p)
+ (cdr (assq 'mail wl-draft-preview-attributes-list)))
+ (and (wl-message-news-p)
+ (cdr (assq 'news wl-draft-preview-attributes-list)))))
+ wl-draft-preview-attributes-list))
+
+(defun wl-draft-show-attributes-buffer (attribute-values)
+ (let* ((cur-win (selected-window))
+ (size (min
+ (- (window-height cur-win)
+ window-min-height 1)
+ (- (window-height cur-win)
+ (max
+ window-min-height
+ (1+ wl-draft-preview-attributes-buffer-lines))))))
+ (split-window cur-win (if (> size 0) size window-min-height))
+ (select-window (next-window))
+ (let ((pop-up-windows nil))
+ (switch-to-buffer (get-buffer-create
+ wl-draft-preview-attributes-buffer-name)))
+ (with-current-buffer
+ (get-buffer wl-draft-preview-attributes-buffer-name)
+ (setq buffer-read-only t)
+ (let (buffer-read-only)
+ (erase-buffer)
+ (dolist (pair attribute-values)
+ (insert (capitalize (symbol-name (car pair))) ": "
+ (format "%s" (or (cdr pair) ""))
+ "\n"))
+ (goto-char (point-min))
+ (wl-highlight-headers)))
+ (select-window cur-win)))
+
+(defun wl-draft-hide-attributes-buffer ()
+ (let (window buffer)
+ (when (setq window (get-buffer-window
+ wl-draft-preview-attributes-buffer-name))
+ (select-window window)
+ (delete-window))
+ (when (setq buffer (get-buffer wl-draft-preview-attributes-buffer-name))
+ (kill-buffer buffer))))
+
(defun wl-draft-attribute-recipients ()
(concat (mapconcat
'identity
(or wl-smtp-posting-port
(progn (require 'smtp) smtp-service)))
+(defun wl-draft-attribute-newsgroups ()
+ (std11-field-body "Newsgroups"))
+
+(defun wl-draft-nntp-attribute (attribute &optional alternatives)
+ (let ((config (cdr (elmo-string-matched-assoc
+ (std11-field-body "newsgroups")
+ wl-nntp-posting-config-alist)))
+ entry)
+ (when (stringp config)
+ (setq config (list (cons 'server config))))
+ (if (setq entry (assq attribute config))
+ ;; maybe nil
+ (cdr entry)
+ (let (value)
+ (while alternatives
+ (if (setq value (symbol-value (car alternatives)))
+ (setq alternatives nil)
+ (setq alternatives (cdr alternatives))))
+ value))))
+
+(defun wl-draft-attribute-nntp-posting-server ()
+ (wl-draft-nntp-attribute
+ 'server
+ '(wl-nntp-posting-server elmo-nntp-default-server)))
+
+(defun wl-draft-attribute-nntp-posting-port ()
+ (wl-draft-nntp-attribute
+ 'point
+ '(wl-nntp-posting-port elmo-nntp-default-port)))
+
(defun wl-draft-attribute-value (attr)
(let ((name (symbol-name attr))
fsymbol symbol)
(defun wl-draft-preview-message ()
"Preview editing message."
(interactive)
- (let* (attribute-list
+ (let* (attribute-values
(orig-buffer (current-buffer))
(current-point (point))
(config-exec-flag wl-draft-config-exec-flag)
(symbol-value 'mime-header-encode-method-alist))))
mime-view-ignored-field-list ; all header.
(mime-edit-translate-buffer-hook
- (append
- (list
- (lambda ()
- (let ((wl-draft-config-exec-flag config-exec-flag)
- (wl-draft-parent-folder parent-folder)
- (copy-buffer (current-buffer)))
+ (cons
+ (lambda ()
+ (let ((wl-draft-config-exec-flag config-exec-flag)
+ (wl-draft-parent-folder parent-folder)
+ (copy-buffer (current-buffer)))
+ (wl-copy-local-variables
+ orig-buffer
+ copy-buffer
(with-current-buffer orig-buffer
- (wl-copy-local-variables
- orig-buffer
- copy-buffer
- (append wl-draft-config-variables
- (wl-draft-clone-local-variables))))
- (goto-char current-point)
- (run-hooks 'wl-draft-send-hook)
- (condition-case err
- (setq attribute-list
- (mapcar
- (lambda (attr)
- (cons attr (wl-draft-attribute-value attr)))
- wl-draft-preview-attributes-list))
- (error
- (kill-buffer (current-buffer))
- (signal (car err) (cdr err)))))))
+ (append wl-draft-config-variables
+ (wl-draft-clone-local-variables))))
+ (goto-char current-point)
+ (run-hooks 'wl-draft-send-hook)
+ (condition-case err
+ (setq attribute-values
+ (mapcar
+ (lambda (attr)
+ (cons attr (wl-draft-attribute-value attr)))
+ (if wl-draft-preview-attributes
+ (wl-draft-preview-attributes-list)
+ '(recipients))))
+ (error
+ (kill-buffer (current-buffer))
+ (signal (car err) (cdr err))))))
mime-edit-translate-buffer-hook)))
(mime-edit-preview-message)
(make-local-variable 'mime-preview-quitting-method-alist)
(wl-highlight-body))
(run-hooks 'wl-draft-preview-message-hook))
(make-local-hook 'kill-buffer-hook)
- (add-hook 'kill-buffer-hook
- (lambda ()
- (when (get-buffer-window
- wl-draft-preview-attributes-buffer-name)
- (select-window (get-buffer-window
- wl-draft-preview-attributes-buffer-name))
- (delete-window))
- (when (get-buffer wl-draft-preview-attributes-buffer-name)
- (kill-buffer (get-buffer
- wl-draft-preview-attributes-buffer-name))))
- nil t)
- (if (not wl-draft-preview-attributes)
- (message (concat "Recipients: "
- (cdr (assq 'recipients attribute-list))))
- (ignore-errors ; in case when the window is too small
- (let* ((cur-win (selected-window))
- (size (min
- (- (window-height cur-win)
- window-min-height 1)
- (- (window-height cur-win)
- (max
- window-min-height
- (1+ wl-draft-preview-attributes-buffer-lines))))))
- (split-window cur-win (if (> size 0) size window-min-height))
- (select-window (next-window))
- (let ((pop-up-windows nil))
- (switch-to-buffer (get-buffer-create
- wl-draft-preview-attributes-buffer-name)))
- (with-current-buffer
- (get-buffer wl-draft-preview-attributes-buffer-name)
- (setq buffer-read-only t)
- (let (buffer-read-only)
- (erase-buffer)
- (dolist (pair attribute-list)
- (insert (capitalize (symbol-name (car pair))) ": "
- (format "%s" (or (cdr pair) ""))
- "\n"))
- (goto-char (point-min))
- (wl-highlight-headers)))
- (select-window cur-win))))))
+ (add-hook 'kill-buffer-hook #'wl-draft-hide-attributes-buffer nil t)
+ (if wl-draft-preview-attributes
+ (ignore-errors ; in case when the window is too small
+ (wl-draft-show-attributes-buffer attribute-values))
+ (message (concat "Recipients: "
+ (cdr (assq 'recipients attribute-values)))))))
(defalias 'wl-draft-caesar-region 'mule-caesar-region)
(elmo-message-fetch (wl-folder-get-elmo-folder folder)
number
(elmo-make-fetch-strategy 'entire)
- nil
- (current-buffer)
'unread)
(mime-parse-buffer nil)))
(with-current-buffer orig-buf
(unless (string-equal
(buffer-string)
- (elmo-message-fetch folder number
- (elmo-make-fetch-strategy 'entire)))
+ (elmo-message-fetch-string
+ folder number
+ (elmo-make-fetch-strategy 'entire)))
(error "Buffer content differs from actual message")))
(when (and (elmo-folder-writable-p folder)
(buffer-live-p orig-buf)
;;; -*- news-list-end -*-
(defun wl-news-previous-version-load ()
- (save-excursion
+ (with-temp-buffer
(let ((filename (expand-file-name
wl-news-version-file-name
elmo-msgdb-directory))
- (tmp-buffer (get-buffer-create " *wl-news-version-tmp*"))
insert-file-contents-pre-hook
insert-file-contents-post-hook
ret-val)
(if (not (file-readable-p filename))
(cons wl-news-default-previous-version
wl-news-default-previous-version)
- (set-buffer tmp-buffer)
(insert-file-contents filename)
- (setq ret-val
- (condition-case nil
- (read (current-buffer))
- (error nil nil)))
- (kill-buffer tmp-buffer)
- ret-val))))
+ (condition-case nil
+ (read (current-buffer))
+ (error nil nil))))))
(defun wl-news-previous-version-save (current-version previous-version)
- (save-excursion
+ (with-temp-buffer
(let ((filename (expand-file-name
wl-news-version-file-name
elmo-msgdb-directory))
- (tmp-buffer (get-buffer-create " *wl-news-version-tmp*"))
print-length print-level)
- (set-buffer tmp-buffer)
- (erase-buffer)
- (prin1 (cons current-version previous-version) tmp-buffer)
- (princ "\n" tmp-buffer)
+ (prin1 (cons current-version previous-version) (current-buffer))
+ (princ "\n" (current-buffer))
(if (file-writable-p filename)
(write-region (point-min) (point-max)
filename nil 'no-msg)
- (message "%s is not writable." filename))
- (kill-buffer tmp-buffer))))
+ (message "%s is not writable." filename)))))
(defun wl-news-append-news (lang previous-version &optional no-mime-tag)
(require 'wl-mime)
(defvar wl-summary-buffer-temp-mark-column nil)
(defvar wl-summary-buffer-persistent-mark-column nil)
-(defvar wl-summary-buffer-unsync-mark-number-list nil)
+(defvar wl-summary-buffer-persistent-mark-version 0)
(defvar wl-summary-buffer-persistent nil)
(defvar wl-summary-buffer-thread-nodes nil)
(make-variable-buffer-local 'wl-summary-buffer-number-column)
(make-variable-buffer-local 'wl-summary-buffer-temp-mark-column)
(make-variable-buffer-local 'wl-summary-buffer-persistent-mark-column)
-(make-variable-buffer-local 'wl-summary-buffer-unsync-mark-number-list)
+(make-variable-buffer-local 'wl-summary-buffer-persistent-mark-version)
(make-variable-buffer-local 'wl-summary-buffer-persistent)
(make-variable-buffer-local 'wl-summary-buffer-thread-nodes)
(make-variable-buffer-local 'wl-summary-buffer-prev-refile-destination)
(save-excursion
(goto-char beg)
(while (and (< (point) end) (not (eobp)))
- (when (null (get-text-property (point) 'face))
+ (when (or (null (get-text-property (point) 'face))
+ (wl-summary-persistent-mark-invalid-p))
(setq number (wl-summary-message-number))
(when number
(setq flags (elmo-message-flags wl-summary-buffer-elmo-folder
numbers)
(save-excursion
(set-buffer (wl-summary-event-handler-buffer-internal handler))
- (dolist (number numbers)
- (when (and (wl-summary-message-visible-p number)
- (wl-summary-jump-to-msg number))
- (wl-summary-update-persistent-mark number)))))
+ (let ((window-list (get-buffer-window-list (current-buffer) 'nomini t))
+ invalidate)
+ (dolist (number numbers)
+ (when (wl-summary-message-visible-p number)
+ (if (catch 'visible
+ (let ((window-list window-list)
+ win)
+ (while (setq win (car window-list))
+ (when (wl-summary-jump-to-msg number
+ (window-start win)
+ (window-end win))
+ (throw 'visible t))
+ (setq window-list (cdr window-list)))))
+ (wl-summary-update-persistent-mark number)
+ (setq invalidate t))))
+ (when invalidate
+ (wl-summary-invalidate-persistent-mark)
+ (dolist (win window-list)
+ (wl-summary-validate-persistent-mark
+ (window-start win)
+ (window-end win)))))))
+
+(luna-define-method elmo-event-handler-cache-changed
+ ((handler wl-summary-event-handler) number)
+ (save-excursion
+ (set-buffer (wl-summary-event-handler-buffer-internal handler))
+ (let ((window-list (get-buffer-window-list (current-buffer) 'nomini t)))
+ (when (wl-summary-message-visible-p number)
+ (if (catch 'visible
+ (let ((window-list window-list)
+ win)
+ (while (setq win (car window-list))
+ (when (wl-summary-jump-to-msg number
+ (window-start win)
+ (window-end win))
+ (throw 'visible t))
+ (setq window-list (cdr window-list)))))
+ (wl-summary-update-persistent-mark number)
+ (wl-summary-invalidate-persistent-mark)
+ (dolist (win window-list)
+ (wl-summary-validate-persistent-mark
+ (window-start win)
+ (window-end win))))))))
(defun wl-summary-buffer-detach ()
(when (and (eq major-mode 'wl-summary-mode)
(folder wl-summary-buffer-elmo-folder))
(if (null number)
(message "No message.")
- (elmo-set-work-buf
- (elmo-message-fetch folder
- number
- (elmo-make-fetch-strategy
- 'entire
- use-cache ; use cache
- nil ; save cache (should `t'?)
- (and
- use-cache
- (elmo-file-cache-get-path
- (elmo-message-field folder number 'message-id))))
- nil
- (current-buffer)
- 'unread)
- (buffer-string)))))
+ (elmo-message-fetch-string folder
+ number
+ (elmo-make-fetch-strategy
+ 'entire
+ use-cache ; use cache
+ nil ; save cache (should `t'?)
+ (and
+ use-cache
+ (elmo-file-cache-get-path
+ (elmo-message-field folder number
+ 'message-id))))
+ 'unread))))
(defun wl-summary-reedit (&optional arg)
"Re-edit current message.
(interactive "P")
(wl-summary-toggle-disp-msg 'off)
(cond
- ((not (wl-summary-message-number))
+ ((null (wl-summary-message-number))
(message "No message."))
(arg
(wl-summary-supersedes-message))
(mail-position-on-field "Newsgroups")
(mail-position-on-field "To")))
(t
- (wl-draft-edit-string (wl-summary-message-string)))))
+ (wl-draft-edit-string (wl-summary-message-string 'maybe)))))
(defun wl-summary-resend-bounced-mail ()
"Re-mail the current message.
wl-thread-entities nil
wl-summary-scored nil
wl-summary-buffer-number-list nil
- wl-summary-buffer-unsync-mark-number-list nil
+ wl-summary-buffer-persistent-mark-version 0
wl-summary-buffer-target-mark-list nil
wl-summary-buffer-temp-mark-list nil
wl-summary-delayed-update nil)
(save-excursion
(save-match-data
;; online
- (if (or arg (not file-cached))
- (elmo-message-encache
- wl-summary-buffer-elmo-folder
- number))
+ (when (or arg (not file-cached))
+ (elmo-message-encache wl-summary-buffer-elmo-folder
+ number))
(elmo-message-set-cached wl-summary-buffer-elmo-folder
- number t)
- (when (and (wl-summary-jump-to-msg number)
- (wl-summary-update-persistent-mark))
- (sit-for 0)
- (wl-summary-count-unread)
- (wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- wl-summary-buffer-unread-count)))
+ number t))
t)
nil)))))
number)
(setq number (wl-summary-message-number))
(elmo-message-set-cached folder number nil)
- (when (wl-summary-update-persistent-mark)
+ (ignore-errors
(elmo-file-cache-delete
(elmo-file-cache-get-path
(elmo-message-field wl-summary-buffer-elmo-folder
(setq msgid (elmo-message-field folder number 'message-id))
(elmo-message-set-cached folder number
(elmo-file-cache-exists-p msgid))
- (wl-summary-update-persistent-mark)
(forward-line 1))
(wl-summary-count-unread)
(wl-summary-update-modeline)
(goto-char beg)
(while (and (< (point) end) (not (eobp)))
(when (or (not check)
- (let ((number (wl-summary-message-number)))
- (when (memq number wl-summary-buffer-unsync-mark-number-list)
- (setq wl-summary-buffer-unsync-mark-number-list
- (delq number
- wl-summary-buffer-unsync-mark-number-list))
- t)))
+ (wl-summary-persistent-mark-invalid-p))
(wl-summary-update-persistent-mark))
(forward-line 1))))
(setq wl-summary-buffer-mode-line
(funcall wl-summary-buffer-mode-line-formatter)))
-(defun wl-summary-jump-to-msg (&optional number)
+(defun wl-summary-jump-to-msg (&optional number beg end)
(interactive "NJump to Number:")
(let ((num (or number
(string-to-int
- (read-from-minibuffer "Jump to Message(No.): ")))))
- (setq num (int-to-string num))
- (beginning-of-line)
- (if (or (and (re-search-forward (concat "\r" num "[^0-9]") nil t)
- (progn (backward-char 1) t))
- (re-search-backward (concat "\r" num "[^0-9]") nil t))
- (progn (beginning-of-line) t)
- nil)))
+ (read-from-minibuffer "Jump to Message(No.): "))))
+ (pos (point))
+ regexp)
+ (setq regexp (concat "\r" (int-to-string num) "[^0-9]"))
+ (if (and beg end (or (< pos beg) (< end pos)))
+ (progn
+ (goto-char beg)
+ (if (re-search-forward regexp end t)
+ (progn (backward-char 1) (beginning-of-line) t)
+ (goto-char pos)
+ nil))
+ (beginning-of-line)
+ (if (or (and (re-search-forward regexp end t)
+ (progn (backward-char 1) t))
+ (re-search-backward regexp beg t))
+ (progn (beginning-of-line) t)
+ nil))))
(defun wl-summary-highlight-msgs (msgs)
(save-excursion
(defun wl-summary-load-file-object (filename)
"Load lisp object from dir."
- (save-excursion
- (let ((tmp-buffer (get-buffer-create " *wl-summary-load-file-object*"))
- insert-file-contents-pre-hook ; To avoid autoconv-xmas...
+ (with-temp-buffer
+ (let (insert-file-contents-pre-hook ; To avoid autoconv-xmas...
insert-file-contents-post-hook
ret-val)
(if (not (file-readable-p filename))
()
- (set-buffer tmp-buffer)
(as-binary-input-file (insert-file-contents filename))
- (setq ret-val
- (condition-case nil
- (read (current-buffer))
- (error (error "Reading failed")))))
- (kill-buffer tmp-buffer)
- ret-val)))
+ (condition-case nil
+ (read (current-buffer))
+ (error (error "Reading failed")))))))
(defun wl-summary-goto-folder (&optional arg)
(interactive "P")
wl-summary-buffer-message-modified
wl-summary-buffer-thread-modified
wl-summary-buffer-number-list
- wl-summary-buffer-unsync-mark-number-list
+ wl-summary-buffer-persistent-mark-version
wl-summary-buffer-folder-name
wl-summary-buffer-line-formatter)
(and (eq wl-summary-buffer-view 'thread)
(setq wl-summary-buffer-disp-msg nil)
(setq wl-summary-buffer-last-displayed-msg nil)
(setq wl-summary-buffer-current-msg nil)
+ (setq wl-summary-buffer-persistent-mark-version 0)
(let ((inhibit-read-only t)
(buffer-read-only nil))
(erase-buffer)
(wl-summary-update-modeline)))
(unless (eq wl-summary-buffer-view 'thread)
(wl-summary-make-number-list))
- (setq wl-summary-buffer-unsync-mark-number-list
- (copy-sequence wl-summary-buffer-number-list))
(when (and wl-summary-cache-use
(or (and wl-summary-check-line-format
(wl-summary-line-format-changed-p))
(wl-message-buffer-prefetch
folder
(wl-summary-message-number)
- wl-message-buffer-prefetch-depth
+ (min (or wl-message-buffer-prefetch-depth 0)
+ (1- wl-message-buffer-cache-size))
(current-buffer)
wl-summary-buffer-mime-charset))
(if mes (message "%s" mes))
'in-msgdb)
(error "No messages")))
(condition (car (elmo-parse-search-condition
- (elmo-read-search-condition
+ (wl-read-search-condition
wl-summary-pick-field-default))))
(result (elmo-folder-search wl-summary-buffer-elmo-folder
condition
(if arg
(wl-summary-unvirtual)
(wl-summary-goto-folder-subr (concat "/"
- (elmo-read-search-condition
+ (wl-read-search-condition
wl-summary-pick-field-default)
"/"
(wl-summary-buffer-folder-name))
(wl-summary-get-score-mark number)
" ")))
+(defun wl-summary-persistent-mark-invalid-p ()
+ (not
+ (equal
+ ;; mey be nil.
+ (get-text-property (point) 'wl-summary-persistent-mark-version)
+ wl-summary-buffer-persistent-mark-version)))
+
+(defun wl-summary-validate-persistent-mark (beg end)
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil))
+ (put-text-property beg end
+ 'wl-summary-persistent-mark-version
+ wl-summary-buffer-persistent-mark-version)
+ (set-buffer-modified-p nil)))
+
+(defun wl-summary-validate-persistent-mark-string (string)
+ (put-text-property 0 (length string)
+ 'wl-summary-persistent-mark-version
+ wl-summary-buffer-persistent-mark-version
+ string))
+
+(defun wl-summary-invalidate-persistent-mark ()
+ (setq wl-summary-buffer-persistent-mark-version
+ (1+ wl-summary-buffer-persistent-mark-version)))
+
(defsubst wl-summary-persistent-mark-string (folder flags cached)
"Return the persistent mark string.
The mark is decided according to the FOLDER, FLAGS and CACHED."
(buffer-read-only nil)
(mark (buffer-substring (- (point) 1) (point)))
(new-mark (wl-summary-persistent-mark number flags)))
- (unless (string= new-mark mark)
- (delete-backward-char 1)
- (insert new-mark)
- (wl-summary-set-message-modified)
- t))))
+ (prog1
+ (unless (string= new-mark mark)
+ (delete-backward-char 1)
+ (insert new-mark)
+ (wl-summary-set-message-modified)
+ t)
+ (wl-summary-validate-persistent-mark (point-at-bol)
+ (point-at-eol))))))
(when wl-summary-highlight
(wl-highlight-summary-current-line))
(set-buffer-modified-p nil)))
(unless (memq flag elmo-global-flags)
(when (elmo-local-flag-p flag)
(error "Cannot treat `%s'." flag))
+ (unless (elmo-flag-valid-p flag)
+ (error "Invalid char in `%s'" flag))
(if (y-or-n-p (format "Flag `%s' is not registered yet. Register?"
(capitalize (symbol-name flag))))
(setq elmo-global-flags (append
(number-to-string
(elmo-message-entity-number
wl-message-entity))))
+ (wl-summary-validate-persistent-mark-string line)
(if wl-summary-highlight
(wl-highlight-summary-line-string
(elmo-message-entity-number wl-message-entity)
(write-region-as-binary (point-min)(point-max)
cache nil 'no-msg)))
(when (file-writable-p view) ; 'thread or 'sequence
- (save-excursion
- (set-buffer tmp-buffer)
- (erase-buffer)
- (prin1 save-view tmp-buffer)
- (princ "\n" tmp-buffer)
+ (with-temp-buffer
+ (prin1 save-view (current-buffer))
+ (princ "\n" (current-buffer))
(write-region (point-min) (point-max) view nil 'no-msg))))
;; kill tmp buffer.
(kill-buffer tmp-buffer))))))
(num (or number (wl-summary-message-number)))
(wl-mime-charset wl-summary-buffer-mime-charset)
(default-mime-charset wl-summary-buffer-mime-charset)
- no-folder-mark fld-buf fld-win thr-entity
+ fld-buf fld-win thr-entity
(elmo-message-fetch-confirm (or elmo-message-fetch-confirm
(and force-reload
elmo-message-fetch-threshold))))
(if (setq fld-win (get-buffer-window fld-buf))
(delete-window fld-win)))
(setq wl-current-summary-buffer (current-buffer))
- (setq no-folder-mark
- ;; If cache is used, change folder-mark.
- (if (wl-message-redisplay
- folder num
- (wl-message-make-display-type
- (or mime-mode
- (wl-summary-buffer-display-mime-mode))
- (or header-mode
- (wl-summary-buffer-display-header-mode)))
- (or force-reload
- (string= (elmo-folder-name-internal folder)
- wl-draft-folder)))
- nil
- ;; plugged, then leave folder-mark.
- (if (and (not (elmo-folder-local-p
- wl-summary-buffer-elmo-folder))
- (elmo-folder-plugged-p
- wl-summary-buffer-elmo-folder))
- 'leave)))
+ (wl-message-redisplay folder num
+ (wl-message-make-display-type
+ (or mime-mode
+ (wl-summary-buffer-display-mime-mode))
+ (or header-mode
+ (wl-summary-buffer-display-header-mode)))
+ (or force-reload
+ (string= (elmo-folder-name-internal folder)
+ wl-draft-folder)))
(when (elmo-message-use-cache-p folder num)
(elmo-message-set-cached folder num t))
(ignore-errors
(if (elmo-message-flagged-p wl-summary-buffer-elmo-folder
num
'unread)
- (wl-summary-mark-as-read num no-folder-mark)
- (wl-summary-update-persistent-mark)))
+ (wl-summary-mark-as-read num)
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ wl-summary-buffer-unread-count)))
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(recenter (/ (- (window-height) 2) 2))
(if (not wl-summary-indent-length-limit)
(wl-horizontal-recenter)))
(wl-highlight-summary-displaying)
- (wl-message-buffer-prefetch-next folder num
- wl-message-buffer-prefetch-depth
- (current-buffer)
- wl-summary-buffer-mime-charset)
+ (wl-message-buffer-prefetch-next
+ folder num
+ (min (or wl-message-buffer-prefetch-depth 0)
+ (1- wl-message-buffer-cache-size))
+ (current-buffer)
+ wl-summary-buffer-mime-charset)
(run-hooks 'wl-summary-redisplay-hook))
(message "No message to display."))))
(defun wl-thread-save-top-list (dir)
(let ((top-file (expand-file-name wl-thread-entity-list-file dir))
(entity wl-thread-entity-list)
- (tmp-buffer (get-buffer-create " *wl-thread-save-top-list*"))
print-length)
- (save-excursion
- (set-buffer tmp-buffer)
- (erase-buffer)
+ (with-temp-buffer
(when (file-writable-p top-file)
- (prin1 entity tmp-buffer)
- (princ "\n" tmp-buffer)
- (write-region (point-min) (point-max) top-file nil 'no-msg)
- (kill-buffer tmp-buffer)))))
+ (prin1 entity (current-buffer))
+ (princ "\n" (current-buffer))
+ (write-region (point-min) (point-max) top-file nil 'no-msg)))))
(defun wl-thread-save-entities (dir)
(let ((top-file (expand-file-name wl-thread-entity-file dir))
(entities wl-thread-entities)
- (tmp-buffer (get-buffer-create " *wl-thread-save-entities*"))
print-length print-level)
- (save-excursion
- (set-buffer tmp-buffer)
- (erase-buffer)
+ (with-temp-buffer
(when (file-writable-p top-file)
- (prin1 entities tmp-buffer)
- (princ "\n" tmp-buffer)
- (write-region (point-min) (point-max) top-file nil 'no-msg)
- (kill-buffer tmp-buffer)))))
+ (prin1 entities (current-buffer))
+ (princ "\n" (current-buffer))
+ (write-region (point-min) (point-max) top-file nil 'no-msg)))))
(defsubst wl-thread-entity-get-number (entity)
(nth 0 entity))
(setq entity (wl-thread-get-entity (car msgs))))
ret-val))
-(defsubst wl-thread-entity-get-descendant (entity)
+(defun wl-thread-entity-get-descendant (entity)
(let (children
ret-val msgs-stack
(msgs (list (car entity))))
(if (null children)
(while (and (null msgs) msgs-stack)
(setq msgs (wl-pop msgs-stack)))
- (setq ret-val (append ret-val (copy-sequence children)))
+ (setq ret-val (nconc ret-val (copy-sequence children)))
(wl-push msgs msgs-stack)
(setq msgs children))
(setq entity (wl-thread-get-entity (car msgs))))
;;; Code:
;;
(require 'bytecomp)
-(eval-when-compile
- (require 'elmo-util))
+(require 'elmo-util)
+(require 'elmo-flag)
(condition-case nil (require 'pp) (error nil))
(with-current-buffer wl-current-summary-buffer
(or wl-message-buffer
(and (wl-summary-message-number)
- (car (wl-message-buffer-display
- wl-summary-buffer-elmo-folder
- (wl-summary-message-number)
- wl-summary-buffer-display-mime-mode
- nil nil)))))))
+ (wl-message-buffer-display
+ wl-summary-buffer-elmo-folder
+ (wl-summary-message-number)
+ wl-summary-buffer-display-mime-mode
+ nil nil))))))
(defmacro wl-kill-buffers (regexp)
(` (mapcar (function
(with-current-buffer src
(symbol-value variable))))))
+;;; Search Condition
+(defun wl-read-search-condition (default)
+ "Read search condition string interactively."
+ (wl-read-search-condition-internal "Search by" default))
+
+(defun wl-read-search-condition-internal (prompt default &optional paren)
+ (let* ((completion-ignore-case t)
+ (denial-fields (nconc (mapcar 'capitalize elmo-msgdb-extra-fields)
+ '("Flag" "Since" "Before"
+ "From" "Subject" "To" "Cc" "Body" "ToCc")))
+ (field (completing-read
+ (format "%s (%s): " prompt default)
+ (mapcar 'list
+ (append '("AND" "OR" "Last" "First")
+ denial-fields
+ (mapcar (lambda (f) (concat "!" f))
+ denial-fields)))))
+ value)
+ (setq field (if (string= field "")
+ (setq field default)
+ field))
+ (cond
+ ((or (string= field "AND") (string= field "OR"))
+ (concat (if paren "(" "")
+ (wl-read-search-condition-internal
+ (concat field "(1) Search by") default 'paren)
+ (if (string= field "AND") "&" "|")
+ (wl-read-search-condition-internal
+ (concat field "(2) Search by") default 'paren)
+ (if paren ")" "")))
+ ((string-match "Since\\|Before" field)
+ (let ((default (format-time-string "%Y-%m-%d")))
+ (setq value (completing-read
+ (format "Value for '%s' [%s]: " field default)
+ (mapcar (function
+ (lambda (x)
+ (list (format "%s" (car x)))))
+ elmo-date-descriptions)))
+ (concat (downcase field) ":"
+ (if (equal value "") default value))))
+ ((string-match "!?Flag" field)
+ (while (null value)
+ (setq value (downcase
+ (completing-read
+ (format "Value for '%s': " field)
+ (mapcar (lambda (f) (list (capitalize (symbol-name f))))
+ (elmo-uniq-list
+ (append
+ '(unread answered forwarded digest any)
+ elmo-global-flags)
+ #'delq)))))
+ (unless (elmo-flag-valid-p value)
+ (message "Invalid char in `%s'" value)
+ (setq value nil)
+ (sit-for 1)))
+ (unless (string-match (concat "^" elmo-condition-atom-regexp "$")
+ value)
+ (setq value (prin1-to-string value)))
+ (concat (downcase field) ":" value))
+ (t
+ (setq value (read-from-minibuffer (format "Value for '%s': " field)))
+ (unless (string-match (concat "^" elmo-condition-atom-regexp "$")
+ value)
+ (setq value (prin1-to-string value)))
+ (concat (downcase field) ":" value)))))
+
(require 'product)
(product-provide (provide 'wl-util) (require 'wl-version))
(defcustom wl-pop-before-smtp-stream-type nil
"*Stream type for POP-before-SMTP.
If nil, `elmo-pop3-default-stream-type' is used."
- :type 'boolean
+ :type '(choice (const :tag "Use `elmo-pop3-default-stream-type'" nil)
+ symbol)
:group 'wl)
(defcustom wl-pop-before-smtp-authenticate-type nil
(defcustom wl-nntp-posting-stream-type nil
"*Stream type for posting Netnews.
If nil, `elmo-nntp-default-stream-type' is used."
- :type 'boolean
+ :type '(choice (const :tag "Use `elmo-nntp-default-stream-type'" nil)
+ symbol)
:group 'wl)
(defcustom wl-nntp-posting-function 'elmo-nntp-post
"A function to post news.
:type 'boolean
:group 'wl-draft)
-(defcustom wl-draft-preview-attributes-list '(recipients
- envelope-from
- smtp-posting-server
- smtp-posting-port)
+(defcustom wl-draft-preview-attributes-list '((mail recipients
+ envelope-from
+ smtp-posting-server
+ smtp-posting-port)
+ (news newsgroups
+ nntp-posting-server
+ nntp-posting-port))
"*Attribute symbols to display in the draft preview.
Candidates are following:
`recipients'
`envelope-from'
`smtp-posting-server'
`smtp-posting-port'
+`newsgroups'
`nntp-posting-server'
`nntp-posting-port'
Also variables which begin with `wl-' can be specified
\(`wl-' have to be removed\)"
- :type '(repeat symbol)
+ :type '(choice (repeat (cons (choice (const :tag "Mail" mail)
+ (const :tag "News" news))
+ (repeat symbol)))
+ (repeat symbol))
:group 'wl-draft)
(defcustom wl-draft-preview-attributes-buffer-lines 5
:type 'string
:group 'wl-summary)
+(defcustom wl-summary-resend-use-cache nil
+ "*Non-nil to enable offline resending by using file cache.
+Note that strict message identity is not guaranteed when cache is used."
+ :type 'boolean
+ :group 'wl-summary)
+
(defcustom wl-folder-removed-mark "#<removed>"
"Mark for removed folder."
:type 'string
"Wanderlust" nil
(eval-when-compile
(product-version (product-find 'elmo-version))) ; equals to ELMO version.
- "Your Wildest Dreams"))
+ "99 Luftballons-pre"))
(defconst wl-version-status nil
"Wanderlust verstion status. For override default rule.