61
65
(integer :tag "number"))))
64
(defcustom elmo-shimbun-update-overview-folder-list nil
68
(defcustom elmo-shimbun-update-overview-folder-list 'all
65
69
"*List of FOLDER-REGEXP.
66
70
FOLDER-REGEXP is the regexp of shimbun folder name which should be
67
update overview when message is fetched."
68
:type '(repeat (regexp :tag "Folder Regexp"))
71
update overview when message is fetched.
72
If it is the symbol `all', update overview for all shimbun folders."
73
:type '(choice (const :tag "All shimbun folders" all)
74
(repeat (regexp :tag "Folder Regexp")))
103
107
(defun elmo-shimbun-folder-entity-hash (folder)
104
108
(or (elmo-shimbun-folder-entity-hash-internal folder)
105
(let ((overviews (elmo-msgdb-get-overview (elmo-folder-msgdb folder)))
109
(let ((overviews (elmo-folder-list-message-entities folder))
108
112
(setq hash (elmo-make-hash (length overviews)))
109
113
(dolist (entity overviews)
110
(elmo-set-hash-val (elmo-msgdb-overview-entity-get-id entity)
114
(elmo-set-hash-val (elmo-message-entity-field entity 'message-id)
112
(when (setq id (elmo-msgdb-overview-entity-get-extra-field
113
entity "x-original-id"))
116
(when (setq id (elmo-message-entity-field entity 'x-original-id))
114
117
(elmo-set-hash-val id entity hash)))
115
118
(elmo-shimbun-folder-set-entity-hash-internal folder hash)))))
117
120
(defsubst elmo-shimbun-folder-shimbun-header (folder location)
118
121
(let ((hash (elmo-shimbun-folder-header-hash-internal folder)))
119
122
(or (and hash (elmo-get-hash-val location hash))
120
(let ((entity (elmo-msgdb-overview-get-entity
122
(elmo-folder-msgdb folder)))
123
(let ((entity (elmo-message-entity folder location))
123
124
(elmo-hash-minimum-size 63)
156
158
(defun elmo-shimbun-entity-to-header (entity)
157
159
(let (message-id shimbun-id)
158
(if (setq message-id (elmo-msgdb-overview-entity-get-extra-field
159
entity "x-original-id"))
160
(setq shimbun-id (elmo-msgdb-overview-entity-get-id entity))
161
(setq message-id (elmo-msgdb-overview-entity-get-id entity)
160
(if (setq message-id (elmo-message-entity-field
161
entity 'x-original-id))
162
(setq shimbun-id (elmo-message-entity-field entity 'message-id))
163
(setq message-id (elmo-message-entity-field entity 'message-id)
164
(set-buffer-multibyte t)
166
(elmo-msgdb-overview-entity-get-number entity)
167
(shimbun-mime-encode-string
168
(decode-mime-charset-string
169
(elmo-msgdb-overview-entity-get-subject-no-decode entity)
171
(shimbun-mime-encode-string
172
(decode-mime-charset-string
173
(elmo-msgdb-overview-entity-get-from-no-decode entity)
175
(elmo-msgdb-overview-entity-get-date entity)
177
(elmo-msgdb-overview-entity-get-references entity)
180
(elmo-msgdb-overview-entity-get-extra-field entity "xref")
182
(list (cons "x-shimbun-id" shimbun-id)))))))
165
(elmo-with-enable-multibyte
167
(elmo-message-entity-number entity)
168
(shimbun-mime-encode-string
169
(elmo-message-entity-field entity 'subject 'decode))
170
(shimbun-mime-encode-string
171
(elmo-message-entity-field entity 'from 'decode))
172
(elmo-message-entity-field entity 'date)
174
(elmo-message-entity-field entity 'references)
177
(elmo-message-entity-field entity 'xref)
179
(list (cons "x-shimbun-id" shimbun-id)))))))
184
181
(defsubst elmo-shimbun-folder-header-hash-setup (folder headers)
185
182
(let ((hash (or (elmo-shimbun-folder-header-hash-internal folder)
191
188
(defun elmo-shimbun-get-headers (folder)
192
189
(let* ((shimbun (elmo-shimbun-folder-shimbun-internal folder))
193
(key (concat (shimbun-server-internal shimbun)
194
"." (shimbun-current-group-internal shimbun)))
190
(key (concat (shimbun-server shimbun)
191
"." (shimbun-current-group shimbun)))
195
192
(elmo-hash-minimum-size 63)
215
210
(luna-define-method elmo-folder-initialize ((folder
216
211
elmo-shimbun-folder)
218
(let ((server-group (if (string-match "\\([^.]+\\)\\." name)
219
(list (elmo-match-string 1 name)
220
(substring name (match-end 0)))
222
(when (nth 0 server-group) ; server
223
(elmo-shimbun-folder-set-shimbun-internal
225
(shimbun-open (nth 0 server-group)
226
(luna-make-entity 'shimbun-elmo-mua :folder folder))))
227
(when (nth 1 server-group)
228
(elmo-shimbun-folder-set-group-internal
230
(nth 1 server-group)))
231
(elmo-shimbun-folder-set-range-internal
233
(or (cdr (elmo-string-matched-assoc (elmo-folder-name-internal folder)
234
elmo-shimbun-index-range-alist))
235
elmo-shimbun-default-index-range))
213
(if (string= name "")
215
(let ((server-group (if (string-match "\\([^.]+\\)\\." name)
216
(list (elmo-match-string 1 name)
217
(substring name (match-end 0)))
219
(when (nth 0 server-group) ; server
220
(elmo-shimbun-folder-set-shimbun-internal
223
(shimbun-open (nth 0 server-group)
224
(luna-make-entity 'shimbun-elmo-mua :folder folder))
226
(luna-make-entity 'shimbun :server (nth 0 server-group))))))
227
(when (nth 1 server-group)
228
(elmo-shimbun-folder-set-group-internal
230
(nth 1 server-group)))
231
(elmo-shimbun-folder-set-range-internal
233
(or (cdr (elmo-string-matched-assoc (elmo-folder-name-internal folder)
234
elmo-shimbun-index-range-alist))
235
elmo-shimbun-default-index-range))
238
238
(luna-define-method elmo-folder-open-internal ((folder elmo-shimbun-folder))
240
(elmo-shimbun-folder-shimbun-internal folder)
241
(elmo-shimbun-folder-group-internal folder))
242
(let ((inhibit-quit t))
243
(unless (elmo-map-folder-location-alist-internal folder)
244
(elmo-map-folder-location-setup
246
(elmo-msgdb-location-load (elmo-folder-msgdb-path folder))))
247
(when (and (elmo-folder-plugged-p folder)
248
(elmo-shimbun-headers-check-p folder))
249
(elmo-shimbun-get-headers folder)
250
(elmo-map-folder-update-locations
252
(elmo-map-folder-list-message-locations folder)))))
239
(when (elmo-shimbun-folder-shimbun-internal folder)
241
(elmo-shimbun-folder-shimbun-internal folder)
242
(elmo-shimbun-folder-group-internal folder))
243
(let ((inhibit-quit t))
244
(unless (elmo-map-folder-location-alist-internal folder)
245
(elmo-map-folder-location-setup
247
(elmo-msgdb-location-load (elmo-folder-msgdb-path folder))))
248
(when (and (elmo-folder-plugged-p folder)
249
(elmo-shimbun-headers-check-p folder))
250
(elmo-shimbun-get-headers folder)
251
(elmo-map-folder-update-locations
253
(elmo-map-folder-list-message-locations folder))))))
254
255
(luna-define-method elmo-folder-reserve-status-p ((folder elmo-shimbun-folder))
277
278
(luna-define-method elmo-folder-plugged-p ((folder elmo-shimbun-folder))
280
(shimbun-server-internal (elmo-shimbun-folder-shimbun-internal folder))
282
(shimbun-server-internal (elmo-shimbun-folder-shimbun-internal folder))))
279
(if (elmo-shimbun-folder-shimbun-internal folder)
282
(shimbun-server (elmo-shimbun-folder-shimbun-internal folder))
284
(shimbun-server (elmo-shimbun-folder-shimbun-internal folder)))
284
287
(luna-define-method elmo-folder-set-plugged ((folder elmo-shimbun-folder)
285
288
plugged &optional add)
286
289
(elmo-set-plugged plugged
288
(shimbun-server-internal
289
292
(elmo-shimbun-folder-shimbun-internal folder))
291
(shimbun-server-internal
292
295
(elmo-shimbun-folder-shimbun-internal folder))
295
298
(luna-define-method elmo-net-port-info ((folder elmo-shimbun-folder))
297
(shimbun-server-internal
298
301
(elmo-shimbun-folder-shimbun-internal folder))
301
304
(luna-define-method elmo-folder-check :around ((folder elmo-shimbun-folder))
302
(when (shimbun-current-group-internal
305
(when (shimbun-current-group
303
306
(elmo-shimbun-folder-shimbun-internal folder))
304
307
(when (and (elmo-folder-plugged-p folder)
305
308
(elmo-shimbun-headers-check-p folder))
333
336
(shimbun-header-insert
334
337
(elmo-shimbun-folder-shimbun-internal folder)
336
(setq ov (elmo-msgdb-create-overview-from-buffer number))
337
(elmo-msgdb-overview-entity-set-extra
339
(setq ov (elmo-msgdb-create-message-entity-from-buffer
340
(elmo-msgdb-message-entity-handler
341
(elmo-folder-msgdb-internal folder)) number))
342
(elmo-message-entity-set-field
340
(elmo-msgdb-overview-entity-get-extra ov)
341
(list (cons "xref" (shimbun-header-xref header)))))))))
344
'xref (shimbun-header-xref header)))
343
347
(luna-define-method elmo-folder-msgdb-create ((folder elmo-shimbun-folder)
345
already-mark seen-mark
348
(let* (overview number-alist mark-alist entity
349
i percent number length pair msgid gmark seen)
349
(let ((new-msgdb (elmo-make-msgdb))
350
entity i percent length msgid flags)
350
351
(setq length (length numlist))
352
353
(message "Creating msgdb...")
355
356
(elmo-shimbun-msgdb-create-entity
356
357
folder (car numlist)))
359
(elmo-msgdb-append-element
361
(setq number (elmo-msgdb-overview-entity-get-number entity))
362
(setq msgid (elmo-msgdb-overview-entity-get-id entity))
364
(elmo-msgdb-number-add number-alist
366
(setq seen (member msgid seen-list))
367
(if (setq gmark (or (elmo-msgdb-global-mark-get msgid)
368
(if (elmo-file-cache-status
369
(elmo-file-cache-get msgid))
370
(if seen nil already-mark)
372
(if elmo-shimbun-use-cache
376
(elmo-msgdb-mark-append mark-alist
359
(setq msgid (elmo-message-entity-field entity 'message-id)
360
flags (elmo-flag-table-get flag-table msgid))
361
(elmo-global-flags-set flags folder (car numlist) msgid)
362
(elmo-msgdb-append-entity new-msgdb entity flags))
378
363
(when (> length elmo-display-progress-threshold)
380
365
(setq percent (/ (* i 100) length))
384
369
(setq numlist (cdr numlist)))
385
370
(message "Creating msgdb...done")
386
(elmo-msgdb-sort-by-date
387
(list overview number-alist mark-alist))))
371
(elmo-msgdb-sort-by-date new-msgdb)))
389
373
(luna-define-method elmo-folder-message-file-p ((folder elmo-shimbun-folder))
392
376
(defsubst elmo-shimbun-update-overview (folder shimbun-id header)
393
(let ((entity (elmo-msgdb-overview-get-entity shimbun-id
394
(elmo-folder-msgdb folder)))
377
(let ((entity (elmo-message-entity folder shimbun-id))
395
378
(message-id (shimbun-header-id header))
397
(unless (string= shimbun-id message-id)
398
(elmo-msgdb-overview-entity-set-extra-field
399
entity "x-original-id" message-id)
400
(elmo-shimbun-header-set-extra-field
401
header "x-shimbun-id" shimbun-id)
402
(elmo-set-hash-val message-id
404
(elmo-shimbun-folder-entity-hash folder))
405
(elmo-set-hash-val shimbun-id
407
(elmo-shimbun-folder-entity-hash folder)))
408
(elmo-msgdb-overview-entity-set-from
410
(elmo-mime-string (shimbun-header-from header)))
411
(elmo-msgdb-overview-entity-set-subject
413
(elmo-mime-string (shimbun-header-subject header)))
414
(elmo-msgdb-overview-entity-set-date
415
entity (shimbun-header-date header))
416
(when (setq references
417
(or (elmo-msgdb-get-last-message-id
418
(elmo-field-body "in-reply-to"))
419
(elmo-msgdb-get-last-message-id
420
(elmo-field-body "references"))))
421
(elmo-msgdb-overview-entity-set-references
423
(or (elmo-msgdb-overview-entity-get-id
426
(elmo-shimbun-folder-entity-hash folder)))
380
(when (elmo-msgdb-update-entity
381
(elmo-folder-msgdb folder)
384
(unless (string= shimbun-id message-id)
385
(elmo-shimbun-header-set-extra-field
386
header "x-shimbun-id" shimbun-id)
387
(elmo-set-hash-val message-id
389
(elmo-shimbun-folder-entity-hash folder))
390
(elmo-set-hash-val shimbun-id
392
(elmo-shimbun-folder-entity-hash folder))
393
(list (cons 'x-original-id message-id)))
396
(elmo-mime-string (shimbun-header-from header)))
398
(elmo-mime-string (shimbun-header-subject header)))
400
(shimbun-header-date header))
402
(or (elmo-msgdb-get-last-message-id
403
(elmo-field-body "in-reply-to"))
404
(elmo-msgdb-get-last-message-id
405
(elmo-field-body "references")))))))
406
(elmo-emit-signal 'update-overview folder
407
(elmo-message-entity-number entity)))))
429
409
(luna-define-method elmo-map-message-fetch ((folder elmo-shimbun-folder)
430
410
location strategy
437
417
(shimbun-article (elmo-shimbun-folder-shimbun-internal folder)
439
(when (elmo-string-match-member
440
(elmo-folder-name-internal folder)
441
elmo-shimbun-update-overview-folder-list)
419
(when (or (eq elmo-shimbun-update-overview-folder-list 'all)
420
(elmo-string-match-member
421
(elmo-folder-name-internal folder)
422
elmo-shimbun-update-overview-folder-list))
442
423
(elmo-shimbun-update-overview folder location header))
443
424
(when (setq shimbun-id
444
425
(elmo-shimbun-header-extra-field header "x-shimbun-id"))
474
(when (and (elmo-msgdb-overview-entity-get-extra-field
455
(when (and (elmo-message-entity-field ov 'xref)
477
457
(< (elmo-shimbun-lapse-seconds
478
458
(elmo-shimbun-parse-time-string
479
(elmo-msgdb-overview-entity-get-date ov)))
459
(elmo-message-entity-field ov 'date)))
480
460
(* expire-days 86400 ; seconds per day
483
(elmo-msgdb-overview-entity-get-id ov)))
484
(elmo-msgdb-get-overview (elmo-folder-msgdb folder))))
463
(elmo-message-entity-field ov 'message-id)))
464
(elmo-folder-list-message-entities folder)))
487
467
(or (elmo-shimbun-header-extra-field header "x-shimbun-id")
491
471
(luna-define-method elmo-folder-list-subfolders ((folder elmo-shimbun-folder)
492
472
&optional one-level)
493
(unless (elmo-shimbun-folder-group-internal folder)
496
(concat (elmo-folder-prefix-internal folder)
497
(shimbun-server-internal
498
(elmo-shimbun-folder-shimbun-internal folder))
501
(shimbun-groups (elmo-shimbun-folder-shimbun-internal folder)))))
473
(let ((prefix (elmo-folder-prefix-internal folder)))
474
(cond ((elmo-shimbun-folder-shimbun-internal folder)
475
(unless (elmo-shimbun-folder-group-internal folder)
480
(elmo-shimbun-folder-shimbun-internal folder))
482
(shimbun-groups (elmo-shimbun-folder-shimbun-internal folder)))))
483
;; the rest are for "@/" group
486
(lambda (server) (list (concat prefix server)))
487
(shimbun-servers-list)))
490
(dolist (server (shimbun-servers-list))
494
(lambda (fld) (concat prefix server "." fld))
499
(concat prefix server))))
503
505
(luna-define-method elmo-folder-exists-p ((folder elmo-shimbun-folder))
504
506
(if (elmo-shimbun-folder-group-internal folder)
507
(if (fboundp 'shimbun-group-p)
508
(shimbun-group-p (elmo-shimbun-folder-shimbun-internal folder)
509
(elmo-shimbun-folder-group-internal folder))
507
511
(elmo-shimbun-folder-group-internal folder)
508
(shimbun-groups (elmo-shimbun-folder-shimbun-internal
512
(shimbun-groups (elmo-shimbun-folder-shimbun-internal folder))))
512
;;; To override elmo-map-folder methods.
513
(luna-define-method elmo-folder-list-unreads-internal
514
((folder elmo-shimbun-folder) unread-marks &optional mark-alist)
517
(luna-define-method elmo-folder-unmark-important ((folder elmo-shimbun-folder)
521
(luna-define-method elmo-folder-mark-as-important ((folder elmo-shimbun-folder)
525
(luna-define-method elmo-folder-unmark-read ((folder elmo-shimbun-folder)
529
(luna-define-method elmo-folder-mark-as-read ((folder elmo-shimbun-folder)
515
(luna-define-method elmo-folder-delete-messages ((folder elmo-shimbun-folder)
517
(elmo-folder-kill-messages folder numbers)
520
(luna-define-method elmo-message-entity-parent ((folder elmo-shimbun-folder)
522
(let ((references (elmo-message-entity-field entity 'references)))
524
(elmo-get-hash-val references
525
(elmo-shimbun-folder-entity-hash folder)))))
533
527
(require 'product)
534
528
(product-provide (provide 'elmo-shimbun) (require 'elmo-version))