* elmo.el (elmo-folder-synchronize): Fix description of the return value.
[elisp/wanderlust.git] / elmo / elmo-nntp.el
index 802bd29..df6e816 100644 (file)
@@ -417,7 +417,8 @@ Don't cache if nil.")
       (with-current-buffer outbuf
        (erase-buffer)
        (insert-buffer-substring (elmo-network-session-buffer session)
-                                start (- end 3))))
+                                start (- end 3))
+       (elmo-delete-cr-buffer)))
     t))
 
 (defun elmo-nntp-select-group (session group &optional force)
@@ -465,9 +466,7 @@ Don't cache if nil.")
 (defsubst elmo-nntp-catchup-msgdb (msgdb max-number)
   (let ((numbers (elmo-msgdb-list-messages msgdb))
        msgdb-max)
-    (setq msgdb-max (if numbers
-                       (car (sort numbers '>))
-                     0))
+    (setq msgdb-max (if numbers (apply #'max numbers) 0))
     (when (and msgdb-max
               max-number
               (< msgdb-max max-number))
@@ -506,9 +505,9 @@ Don't cache if nil.")
                            (not (string= (elmo-nntp-folder-group-internal
                                           folder) "")))
                       (concat " active"
-                              (format " %s.*"
-                                      (elmo-nntp-folder-group-internal folder)
-                                      "")))))
+                              (format 
+                               " %s.*"
+                               (elmo-nntp-folder-group-internal folder))))))
          (if (elmo-nntp-read-response session t)
              (if (null (setq response (elmo-nntp-read-contents session)))
                  (error "NNTP List folders failed")
@@ -548,14 +547,14 @@ Don't cache if nil.")
            (progn
              (setq regexp
                    (format "^\\(%s[^. ]+\\)\\([. ]\\).*\n"
-                           (if (and
-                                (elmo-nntp-folder-group-internal folder)
-                                (null (string=
-                                       (elmo-nntp-folder-group-internal
-                                        folder) "")))
+                           (if (and (elmo-nntp-folder-group-internal folder)
+                                    (null (string=
+                                           (elmo-nntp-folder-group-internal
+                                            folder) "")))
                                (concat (elmo-nntp-folder-group-internal
                                         folder)
-                                       "\\.") "")))
+                                       "\\.")
+                             "")))
              (while (looking-at regexp)
                (setq top-ng (elmo-match-buffer 1))
                (if (string= (elmo-match-buffer 2) " ")
@@ -737,13 +736,14 @@ Don't cache if nil.")
     ("lines" . 7)
     ("xref" . 8)))
 
-(defun elmo-nntp-create-msgdb-from-overview-string (str
+(defun elmo-nntp-create-msgdb-from-overview-string (folder
+                                                   str
                                                    flag-table
                                                    &optional numlist)
   (let ((new-msgdb (elmo-make-msgdb))
-       ov-list gmark message-id entity
+       ov-list message-id entity
        ov-entity num
-       extras extra ext field field-index)
+       extras extra ext field field-index flags)
     (setq ov-list (elmo-nntp-parse-overview-string str))
     (while ov-list
       (setq ov-entity (car ov-list))
@@ -761,13 +761,14 @@ Don't cache if nil.")
        (while extras
          (setq ext (downcase (car extras)))
          (when (setq field-index (cdr (assoc ext elmo-nntp-overview-index)))
-            (when (> (length ov-entity) field-index)
+           (when (> (length ov-entity) field-index)
              (setq field (aref ov-entity field-index))
              (when (eq field-index 8) ;; xref
                (setq field (elmo-msgdb-remove-field-string field)))
-              (setq extra (cons (cons ext field) extra))))
+             (setq extra (cons (cons ext field) extra))))
          (setq extras (cdr extras)))
        (setq entity (elmo-msgdb-make-message-entity
+                     (elmo-msgdb-message-entity-handler new-msgdb)
                      :message-id (aref ov-entity 4)
                      :number     num
                      :references (elmo-msgdb-get-last-message-id
@@ -782,14 +783,10 @@ Don't cache if nil.")
                      :date       (aref ov-entity 3)
                      :size       (string-to-int (aref ov-entity 6))
                      :extra      extra))
-       (setq message-id (elmo-message-entity-field entity 'message-id))
-       (setq gmark (or (elmo-msgdb-global-mark-get message-id)
-                       (elmo-msgdb-mark
-                        (elmo-flag-table-get flag-table message-id)
-                        (elmo-file-cache-status
-                         (elmo-file-cache-get message-id))
-                        'new)))
-       (elmo-msgdb-append-entity new-msgdb entity gmark))
+       (setq message-id (elmo-message-entity-field entity 'message-id)
+             flags (elmo-flag-table-get flag-table message-id))
+       (elmo-global-flags-set flags folder num message-id)
+       (elmo-msgdb-append-entity new-msgdb entity flags))
       (setq ov-list (cdr ov-list)))
     new-msgdb))
 
@@ -825,6 +822,7 @@ Don't cache if nil.")
              (elmo-msgdb-append
               new-msgdb
               (elmo-nntp-create-msgdb-from-overview-string
+               folder
                ov-str
                flag-table
                filter))))
@@ -852,6 +850,7 @@ Don't cache if nil.")
            (elmo-msgdb-append
             new-msgdb
             (elmo-nntp-create-msgdb-from-overview-string
+             folder
              ov-str
              flag-table
              filter)))))
@@ -901,9 +900,7 @@ Don't cache if nil.")
          (setq max-number
                (nth 1 (read (concat "(" (elmo-nntp-read-contents
                                          session) ")"))))
-         (setq msgdb-max (if numbers
-                             (car (sort numbers '>))
-                           0))
+         (setq msgdb-max (if numbers (apply #'max numbers) 0))
          (when (and msgdb-max
                     max-number
                     (< msgdb-max max-number))
@@ -1073,22 +1070,15 @@ Don't cache if nil.")
 
 (luna-define-method elmo-folder-delete-messages ((folder elmo-nntp-folder)
                                                 numbers)
-  (elmo-nntp-folder-delete-messages folder numbers))
-
-(defun elmo-nntp-folder-delete-messages (folder numbers)
-  (let ((killed-list (elmo-folder-killed-list-internal folder)))
-    (dolist (number numbers)
-      (setq killed-list
-           (elmo-msgdb-set-as-killed killed-list number)))
-    (elmo-folder-set-killed-list-internal folder killed-list))
+  (elmo-folder-kill-messages folder numbers)
   t)
 
 (luna-define-method elmo-folder-exists-p-plugged ((folder elmo-nntp-folder))
   (let ((session (elmo-nntp-get-session folder)))
-         (elmo-nntp-send-command
-          session
-          (format "group %s"
-                  (elmo-nntp-folder-group-internal folder)))
+    (elmo-nntp-send-command
+     session
+     (format "group %s"
+            (elmo-nntp-folder-group-internal folder)))
     (elmo-nntp-read-response session)))
 
 (defun elmo-nntp-retrieve-field (spec field from-msgs)
@@ -1400,7 +1390,7 @@ Returns a list of cons cells like (NUMBER . VALUE)"
 (defun elmo-nntp-msgdb-create-message (len flag-table)
   (save-excursion
     (let ((new-msgdb (elmo-make-msgdb))
-         beg entity i num gmark message-id)
+         beg entity i num message-id)
       (elmo-set-buffer-multibyte nil)
       (goto-char (point-min))
       (setq i 0)
@@ -1418,18 +1408,15 @@ Returns a list of cons cells like (NUMBER . VALUE)"
            (save-restriction
              (narrow-to-region beg (point))
              (setq entity
-                   (elmo-msgdb-create-overview-from-buffer num))
+                   (elmo-msgdb-create-message-entity-from-buffer
+                    (elmo-msgdb-message-entity-handler new-msgdb) num))
              (when entity
                (setq message-id
-                     (elmo-message-entity-field entity 'message-id)
-                     gmark
-                     (or (elmo-msgdb-global-mark-get message-id)
-                         (elmo-msgdb-mark
-                          (elmo-flag-table-get flag-table message-id)
-                          (elmo-file-cache-status
-                           (elmo-file-cache-get message-id))
-                          'new)))
-               (elmo-msgdb-append-entity new-msgdb entity gmark)))))
+                     (elmo-message-entity-field entity 'message-id))
+               (elmo-msgdb-append-entity
+                new-msgdb
+                entity
+                (elmo-flag-table-get flag-table message-id))))))
        (when (> len elmo-display-progress-threshold)
          (setq i (1+ i))
          (if (or (zerop (% i 20)) (= i len))
@@ -1462,7 +1449,7 @@ Returns a list of cons cells like (NUMBER . VALUE)"
 ;;         temp-crosses slot is a list of cons cell:
 ;;         (NUMBER . (MESSAGE-ID (LIST-OF-NEWSGROUPS) 'ng))
 ;;    1.2. In elmo-folder-close, `temp-crosses' slot is cleared,
-;;    1.3. In elmo-folder-mark-as-read, move crosspost entry
+;;    1.3. In elmo-folder-flag-as-read, move crosspost entry
 ;;         from `temp-crosses' slot to `elmo-crosspost-message-alist'.
 
 ;; 2. process crosspost alist.
@@ -1507,7 +1494,7 @@ Returns a list of cons cells like (NUMBER . VALUE)"
   )
 
 (defun elmo-nntp-folder-update-crosspost-message-alist (folder numbers)
-;;    1.3. In elmo-folder-mark-as-read, move crosspost entry
+;;    1.3. In elmo-folder-flag-as-read, move crosspost entry
 ;;         from `temp-crosses' slot to `elmo-crosspost-message-alist'.
   (let (elem)
     (dolist (number numbers)
@@ -1520,11 +1507,19 @@ Returns a list of cons cells like (NUMBER . VALUE)"
         folder
         (delq elem (elmo-nntp-folder-temp-crosses-internal folder)))))))
 
-(luna-define-method elmo-folder-mark-as-read :before ((folder
-                                                      elmo-nntp-folder)
-                                                     numbers
-                                                     &optional ignore-flags)
-  (elmo-nntp-folder-update-crosspost-message-alist folder numbers))
+(luna-define-method elmo-folder-set-flag :before ((folder elmo-nntp-folder)
+                                                 numbers
+                                                 flag
+                                                 &optional is-local)
+  (when (eq flag 'read)
+    (elmo-nntp-folder-update-crosspost-message-alist folder numbers)))
+
+(luna-define-method elmo-folder-unset-flag :before ((folder elmo-nntp-folder)
+                                                   numbers
+                                                   flag
+                                                   &optional is-local)
+  (when (eq flag 'unread)
+    (elmo-nntp-folder-update-crosspost-message-alist folder numbers)))
 
 (defsubst elmo-nntp-folder-process-crosspost (folder)
 ;;    2.1. At elmo-folder-process-crosspost, setup `reads' slot from
@@ -1550,12 +1545,19 @@ Returns a list of cons cells like (NUMBER . VALUE)"
 (luna-define-method elmo-folder-process-crosspost ((folder elmo-nntp-folder))
   (elmo-nntp-folder-process-crosspost folder))
 
-(luna-define-method elmo-folder-list-unreads :around ((folder
-                                                      elmo-nntp-folder))
+(luna-define-method elmo-folder-list-flagged :around ((folder elmo-nntp-folder)
+                                                     flag &optional in-msgdb)
   ;;    2.3. elmo-folder-list-unreads return unread message list according to
   ;;         `reads' slot.
-  (elmo-living-messages (luna-call-next-method)
-                       (elmo-nntp-folder-reads-internal folder)))
+  (let ((msgs (luna-call-next-method)))
+    (if in-msgdb
+       msgs
+      (case flag
+       (unread
+        (elmo-living-messages msgs (elmo-nntp-folder-reads-internal folder)))
+       ;; Should consider read, digest and any flag?
+       (otherwise
+        msgs)))))
 
 (require 'product)
 (product-provide (provide 'elmo-nntp) (require 'elmo-version))