* wl-summary.el (wl-summary-line-subject): Decode.
[elisp/wanderlust.git] / elmo / elmo-net.el
index 6f2d6c3..9ec6022 100644 (file)
@@ -235,6 +235,12 @@ Returns a process object.  if making session failed, returns nil."
            (elmo-network-authenticate-session session)
            (elmo-network-setup-session session)))
       (error
+       (when (eq (car error) 'elmo-open-error)
+        (elmo-set-plugged nil server port
+                          (elmo-network-stream-type-symbol stream-type)
+                          (current-time))
+        (message "Auto plugged off at %s:%d :%s" server port (cadr error))
+        (sit-for 1))
        (when (eq (car error) 'elmo-authenticate-error)
         (elmo-remove-passwd (elmo-network-session-password-key session)))
        (elmo-network-close-session session)
@@ -329,10 +335,21 @@ Returned value is searched from `elmo-network-stream-type-alist'."
         (append (elmo-net-port-info folder)
                 (list nil nil (quote (elmo-net-port-label folder)) add))))
 
+(luna-define-method elmo-folder-create ((folder elmo-net-folder))
+  (if (elmo-folder-plugged-p folder)
+      (elmo-folder-send folder 'elmo-folder-create-plugged)
+    (elmo-folder-send folder 'elmo-folder-create-unplugged)))
+
+(luna-define-method elmo-folder-create-unplugged ((folder elmo-net-folder))
+  (if elmo-enable-disconnected-operation
+      (elmo-folder-create-dop folder)
+    (error "Unplugged")))
+
 (luna-define-method elmo-folder-exists-p ((folder elmo-net-folder))
   (if (elmo-folder-plugged-p folder)
       (elmo-folder-send folder 'elmo-folder-exists-p-plugged)
-    t)) ; If unplugged, assume the folder exists.
+    ;; If unplugged, guess by msgdb.
+    (file-directory-p (elmo-folder-msgdb-path folder))))
 
 (luna-define-method elmo-folder-status ((folder elmo-net-folder))
   (if (elmo-folder-plugged-p folder)
@@ -356,7 +373,7 @@ Returned value is searched from `elmo-network-stream-type-alist'."
 
 (luna-define-method elmo-folder-list-messages-plugged
   ((folder elmo-net-folder))
-  t)
+  nil)
 
 ;; Should consider offline append and removal.
 (luna-define-method elmo-folder-list-messages-unplugged ((folder
@@ -368,27 +385,32 @@ Returned value is searched from `elmo-network-stream-type-alist'."
         (elmo-delete-if
          (lambda (number) (memq number deleting))
          ;; current number-list.
-         (mapcar
-          'car
-          (elmo-msgdb-get-number-alist (elmo-folder-msgdb folder))))
+         (elmo-msgdb-list-messages (elmo-folder-msgdb folder)))
         ;; append appending messages
         (mapcar (lambda (x) (* -1 x))
                 (elmo-dop-spool-folder-list-messages folder))))
-    (error "Unplugged")))
+    t))
 
-(luna-define-method elmo-folder-list-unreads-internal
-  ((folder elmo-net-folder) unread-marks &optional mark-alist)
+(luna-define-method elmo-folder-list-unreads :around ((folder
+                                                      elmo-net-folder))
   (if (and (elmo-folder-plugged-p folder)
           (elmo-folder-use-flag-p folder))
       (elmo-folder-send folder 'elmo-folder-list-unreads-plugged)
-    t))
+    (luna-call-next-method)))
 
-(luna-define-method elmo-folder-list-importants-internal
-  ((folder elmo-net-folder) important-mark)
+(luna-define-method elmo-folder-list-importants :around ((folder
+                                                         elmo-net-folder))
   (if (and (elmo-folder-plugged-p folder)
           (elmo-folder-use-flag-p folder))
       (elmo-folder-send folder 'elmo-folder-list-importants-plugged)
-    t))
+    (luna-call-next-method)))
+
+(luna-define-method elmo-folder-list-answereds :around ((folder
+                                                        elmo-net-folder))
+  (if (and (elmo-folder-plugged-p folder)
+          (elmo-folder-use-flag-p folder))
+      (elmo-folder-send folder 'elmo-folder-list-answereds-plugged)
+    (luna-call-next-method)))
 
 (luna-define-method elmo-folder-list-unreads-plugged
   ((folder elmo-net-folder))
@@ -398,6 +420,10 @@ Returned value is searched from `elmo-network-stream-type-alist'."
   ((folder elmo-net-folder))
   t)
 
+(luna-define-method elmo-folder-list-answereds-plugged
+  ((folder elmo-net-folder))
+  t)
+
 (luna-define-method elmo-folder-delete-messages ((folder elmo-net-folder)
                                                 numbers)
   (if (elmo-folder-plugged-p folder)
@@ -410,91 +436,119 @@ Returned value is searched from `elmo-network-stream-type-alist'."
   (elmo-folder-delete-messages-dop folder numbers))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-net-folder)
-                                             numbers new-mark
-                                             already-mark seen-mark
-                                             important-mark seen-list)
+                                             numbers flag-table)
   (if (elmo-folder-plugged-p folder)
       (elmo-folder-send folder 'elmo-folder-msgdb-create-plugged
-                       numbers
-                       new-mark
-                       already-mark seen-mark
-                       important-mark seen-list)
+                       numbers flag-table)
     (elmo-folder-send folder 'elmo-folder-msgdb-create-unplugged
-                     numbers
-                     new-mark already-mark seen-mark
-                     important-mark seen-list)))
+                     numbers flag-table)))
 
 (luna-define-method elmo-folder-msgdb-create-unplugged ((folder
                                                         elmo-net-folder)
                                                        numbers
-                                                       new-mark already-mark
-                                                       seen-mark
-                                                       important-mark
-                                                       seen-list)
+                                                       flag-table)
   ;; XXXX should be appended to already existing msgdb.
   (elmo-dop-msgdb
    (elmo-folder-msgdb-create (elmo-dop-spool-folder folder)
                             (mapcar 'abs numbers)
-                            new-mark already-mark
-                            seen-mark
-                            important-mark
-                            seen-list)))
-
-(luna-define-method elmo-folder-unmark-important ((folder elmo-net-folder)
-                                                 numbers)
-  (if (elmo-folder-use-flag-p folder)
-      (if (elmo-folder-plugged-p folder)
-         (elmo-folder-send folder 'elmo-folder-unmark-important-plugged
-                           numbers)
-       (elmo-folder-send folder
-                         'elmo-folder-unmark-important-unplugged numbers))
-    t))
-
-(luna-define-method elmo-folder-mark-as-important ((folder elmo-net-folder)
-                                                  numbers)
-  (if (elmo-folder-use-flag-p folder)
-      (if (elmo-folder-plugged-p folder)
-         (elmo-folder-send folder 'elmo-folder-mark-as-important-plugged
-                           numbers)
-       (elmo-folder-send folder 'elmo-folder-mark-as-important-unplugged
-                         numbers))
-    t))
-
-(luna-define-method elmo-folder-unmark-read ((folder elmo-net-folder)
-                                            numbers)
-  (if (elmo-folder-use-flag-p folder)
-      (if (elmo-folder-plugged-p folder)
-         (elmo-folder-send folder 'elmo-folder-unmark-read-plugged numbers)
-       (elmo-folder-send folder 'elmo-folder-unmark-read-unplugged numbers))
-    t))
-
-(luna-define-method elmo-folder-mark-as-read ((folder elmo-net-folder)
-                                             numbers)
-  (if (elmo-folder-use-flag-p folder)
-      (if (elmo-folder-plugged-p folder)
-         (elmo-folder-send folder 'elmo-folder-mark-as-read-plugged numbers)
-       (elmo-folder-send
-        folder 'elmo-folder-mark-as-read-unplugged numbers))
-    t))
+                            flag-table)))
 
-(luna-define-method elmo-folder-mark-as-read-unplugged ((folder
+(luna-define-method elmo-folder-unflag-important :before ((folder
+                                                          elmo-net-folder)
+                                                         numbers
+                                                         &optional
+                                                         is-local)
+  (when (and (elmo-folder-use-flag-p folder)
+            (not is-local))
+    (if (elmo-folder-plugged-p folder)
+       (elmo-folder-send folder 'elmo-folder-unflag-important-plugged
+                         numbers)
+      (elmo-folder-send folder
+                       'elmo-folder-unflag-important-unplugged numbers))))
+
+(luna-define-method elmo-folder-flag-as-important :before ((folder
+                                                           elmo-net-folder)
+                                                          numbers
+                                                          &optional
+                                                          is-local)
+  (when (and (elmo-folder-use-flag-p folder)
+            (not is-local))
+    (if (elmo-folder-plugged-p folder)
+       (elmo-folder-send folder 'elmo-folder-flag-as-important-plugged
+                         numbers)
+      (elmo-folder-send folder 'elmo-folder-flag-as-important-unplugged
+                       numbers))))
+
+(luna-define-method elmo-folder-unflag-read :before ((folder elmo-net-folder)
+                                                    numbers
+                                                    &optional is-local)
+  (when (and (elmo-folder-use-flag-p folder)
+            (not is-local))
+    (if (elmo-folder-plugged-p folder)
+       (elmo-folder-send folder 'elmo-folder-unflag-read-plugged numbers)
+      (elmo-folder-send folder 'elmo-folder-unflag-read-unplugged numbers))))
+
+(luna-define-method elmo-folder-flag-as-read :before ((folder elmo-net-folder)
+                                                     numbers
+                                                     &optional is-local)
+  (when (and (elmo-folder-use-flag-p folder)
+            (not is-local))
+    (if (elmo-folder-plugged-p folder)
+       (elmo-folder-send folder 'elmo-folder-flag-as-read-plugged numbers)
+      (elmo-folder-send
+       folder 'elmo-folder-flag-as-read-unplugged numbers))))
+
+(luna-define-method elmo-folder-unflag-answered :before ((folder
+                                                         elmo-net-folder)
+                                                        numbers
+                                                        &optional is-local)
+  (when (and (elmo-folder-use-flag-p folder)
+            (not is-local))
+    (if (elmo-folder-plugged-p folder)
+       (elmo-folder-send folder 'elmo-folder-unflag-answered-plugged
+                         numbers)
+      (elmo-folder-send folder
+                       'elmo-folder-unflag-answered-unplugged numbers))))
+
+(luna-define-method elmo-folder-flag-as-answered :before ((folder
+                                                          elmo-net-folder)
+                                                         numbers
+                                                         &optional is-local)
+  (when (and (elmo-folder-use-flag-p folder)
+            (not is-local))
+    (if (elmo-folder-plugged-p folder)
+       (elmo-folder-send folder 'elmo-folder-flag-as-answered-plugged
+                         numbers)
+      (elmo-folder-send folder 'elmo-folder-flag-as-answered-unplugged
+                       numbers))))
+
+(luna-define-method elmo-folder-flag-as-read-unplugged ((folder
                                                         elmo-net-folder)
                                                        numbers)
-  (elmo-folder-mark-as-read-dop folder numbers))
+  (elmo-folder-flag-as-read-dop folder numbers))
 
-(luna-define-method elmo-folder-unmark-read-unplugged ((folder elmo-net-folder)
+(luna-define-method elmo-folder-unflag-read-unplugged ((folder elmo-net-folder)
                                                     numbers)
-  (elmo-folder-unmark-read-dop folder numbers))
+  (elmo-folder-unflag-read-dop folder numbers))
 
-(luna-define-method elmo-folder-mark-as-important-unplugged ((folder
+(luna-define-method elmo-folder-flag-as-important-unplugged ((folder
                                                              elmo-net-folder)
                                                             numbers)
-  (elmo-folder-mark-as-important-dop folder numbers))
+  (elmo-folder-flag-as-important-dop folder numbers))
 
-(luna-define-method elmo-folder-unmark-important-unplugged ((folder
+(luna-define-method elmo-folder-unflag-important-unplugged ((folder
                                                             elmo-net-folder)
                                                            numbers)
-  (elmo-folder-unmark-important-dop folder numbers))
+  (elmo-folder-unflag-important-dop folder numbers))
+
+(luna-define-method elmo-folder-flag-as-answered-unplugged ((folder
+                                                            elmo-net-folder)
+                                                           numbers)
+  (elmo-folder-flag-as-answered-dop folder numbers))
+
+(luna-define-method elmo-folder-unflag-answered-unplugged
+  ((folder elmo-net-folder) numbers)
+  (elmo-folder-unflag-answered-dop folder numbers))
 
 (luna-define-method elmo-message-encache :around ((folder elmo-net-folder)
                                                  number &optional read)
@@ -546,8 +600,7 @@ Returned value is searched from `elmo-network-stream-type-alist'."
   (if (elmo-folder-plugged-p folder)
       (elmo-folder-send folder 'elmo-folder-check-plugged)))
 
-(luna-define-method elmo-folder-diff :around ((folder elmo-net-folder)
-                                             &optional numbers)
+(luna-define-method elmo-folder-diff :around ((folder elmo-net-folder))
   (if (and (elmo-folder-use-flag-p folder)
           (elmo-folder-plugged-p folder))
       (elmo-folder-send folder 'elmo-folder-diff-plugged)