* wl-summary.el (wl-summary-detect-mark-position): Use
[elisp/wanderlust.git] / elmo / modb.el
1 ;;; modb.el --- Message Orchestration DataBase.
2
3 ;; Copyright (C) 2003 Yuuichi Teranishi <teranisi@gohome.org>
4
5 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
6 ;;      Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
7 ;; Keywords: mail, net news
8
9 ;; This file is part of ELMO (Elisp Library for Message Orchestration).
10
11 ;; This program is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; any later version.
15 ;;
16 ;; This program is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;; GNU General Public License for more details.
20 ;;
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
25 ;;
26
27 ;;; Commentary:
28 ;;
29
30 ;;; Code:
31 ;;
32
33 (eval-when-compile (require 'cl))
34
35 (require 'luna)
36 (require 'modb-entity)
37
38 (eval-and-compile
39   (luna-define-class modb-generic () (location         ; location for save.
40                                       message-modified ; message is modified.
41                                       flag-modified    ; flag is modified.
42                                       ))
43   (luna-define-internal-accessors 'modb-generic))
44
45 (luna-define-generic elmo-msgdb-load (msgdb)
46   "Load the MSGDB.")
47
48 (luna-define-generic elmo-msgdb-save (msgdb)
49   "Save the MSGDB.")
50
51 (luna-define-generic elmo-msgdb-location (msgdb)
52   "Return the location of MSGDB.")
53
54 (luna-define-generic elmo-msgdb-message-modified-p (msgdb)
55   "Return non-nil if message is modified.")
56
57 (luna-define-generic elmo-msgdb-flag-modified-p (msgdb)
58   "Return non-nil if flag is modified.")
59
60 (luna-define-generic elmo-msgdb-append (msgdb msgdb-append)
61   "Append the MSGDB-APPEND to the MSGDB.
62 Return a list of messages which have duplicated message-id.")
63
64 (luna-define-generic elmo-msgdb-clear (msgdb)
65   "Clear the MSGDB structure.")
66
67 (luna-define-generic elmo-msgdb-length (msgdb)
68   "Return number of messages in the MSGDB")
69
70 (luna-define-generic elmo-msgdb-flags (msgdb number)
71   "Return a list of flag which corresponds to the message with NUMBER.")
72
73 (luna-define-generic elmo-msgdb-set-flag (msgdb number flag)
74   "Set message flag.
75 MSGDB is the ELMO msgdb.
76 NUMBER is a message number to set flag.
77 FLAG is a symbol which is one of the following:
78 `new'       ... Message which is new.
79 `read'      ... Message which is already read.
80 `important' ... Message which is important.
81 `answered'  ... Message which is answered.
82 `cached'    ... Message which is cached.")
83
84 (luna-define-generic elmo-msgdb-unset-flag (msgdb number flag)
85   "Unset message flag.
86 MSGDB is the ELMO msgdb.
87 NUMBER is a message number to set flag.
88 FLAG is a symbol which is one of the following:
89 `new'       ... Message which is new.
90 `read'      ... Message which is already read.
91 `important' ... Message which is important.
92 `answered'  ... Message which is answered.
93 `cached'    ... Message which is cached.")
94
95 (luna-define-generic elmo-msgdb-list-messages (msgdb)
96   "Return a list of message numbers in the MSGDB.")
97
98 (luna-define-generic elmo-msgdb-list-flagged (msgdb flag)
99   "Return a list of message numbers which is set FLAG in the MSGDB.")
100
101 ;;; (luna-define-generic elmo-msgdb-search (msgdb condition &optional numbers)
102 ;;;   "Search and return list of message numbers.
103 ;;; MSGDB is the ELMO msgdb structure.
104 ;;; CONDITION is a condition structure for searching.
105 ;;; If optional argument NUMBERS is specified and is a list of message numbers,
106 ;;; messages are searched from the list.")
107
108 (luna-define-generic elmo-msgdb-append-entity (msgdb entity &optional flags)
109   "Append a ENTITY with FLAGS into the MSGDB.
110 Return non-nil if message-id of entity is duplicated.")
111
112 (luna-define-generic elmo-msgdb-delete-messages (msgdb numbers)
113   "Delete messages which are contained NUMBERS from MSGDB.")
114
115 (luna-define-generic elmo-msgdb-sort-entities (msgdb predicate
116                                                      &optional app-data)
117   "Sort entities of MSGDB, comparing with PREDICATE.
118 PREDICATE is called with two entities and APP-DATA.
119 Should return non-nil if the first entity is \"less\" than the second.")
120
121 (luna-define-generic elmo-msgdb-message-entity (msgdb key)
122   "Return the message-entity structure which matches to the KEY.
123 KEY is a number or a string.
124 A number is for message number in the MSGDB.
125 A string is for message-id of the message.")
126
127 (luna-define-generic elmo-msgdb-message-entity-handler (msgdb)
128   "Get modb entity handler instance which corresponds to the MSGDB.")
129
130 ;;; generic implement
131 ;;
132 (luna-define-method elmo-msgdb-load ((msgdb modb-generic))
133   t)
134
135 (luna-define-method elmo-msgdb-location ((msgdb modb-generic))
136   (modb-generic-location-internal msgdb))
137
138 (luna-define-method elmo-msgdb-message-modified-p ((msgdb modb-generic))
139   (modb-generic-message-modified-internal msgdb))
140
141 (luna-define-method elmo-msgdb-flag-modified-p ((msgdb modb-generic))
142   (modb-generic-flag-modified-internal msgdb))
143
144 (luna-define-method elmo-msgdb-append ((msgdb modb-generic) msgdb-append)
145   (let (duplicates)
146     (dolist (number (elmo-msgdb-list-messages msgdb-append))
147       (when (elmo-msgdb-append-entity
148              msgdb
149              (elmo-msgdb-message-entity msgdb-append number)
150              (elmo-msgdb-flags msgdb-append number))
151         (setq duplicates (cons number duplicates))))
152     duplicates))
153
154 (luna-define-method elmo-msgdb-clear ((msgdb modb-generic))
155   (modb-generic-set-message-modified-internal msgdb nil)
156   (modb-generic-set-flag-modified-internal msgdb nil))
157
158 (luna-define-method elmo-msgdb-length ((msgdb modb-generic))
159   0)
160
161
162 (luna-define-method elmo-msgdb-message-entity-handler ((msgdb modb-generic))
163   (or modb-entity-default-cache-internal
164       (setq modb-entity-default-cache-internal
165             (luna-make-entity modb-entity-default-handler))))
166
167 ;; for on demand loading
168 (provide 'modb-generic)
169
170 (require 'product)
171 (product-provide (provide 'modb) (require 'elmo-version))
172
173 ;;; modb.el ends here