+(defun elmo-get-network-stream-type (symbol)
+ "Return network stream type corresponding to SYMBOL.
+Returned value is searched from `elmo-network-stream-type-alist'."
+ (let ((alist elmo-network-stream-type-alist)
+ spec)
+ (while alist
+ (when (eq (nth 1 (car alist)) symbol)
+ (setq spec (car alist))
+ (setq alist nil))
+ (setq alist (cdr alist)))
+ spec))
+
+(defun elmo-net-folder-set-parameters (folder params &optional defaults)
+ (let ((port (cdr (assq 'port params)))
+ (stream-type (cdr (assq 'stream-type params))))
+ ;; server
+ (elmo-net-folder-set-server-internal
+ folder
+ (or (cdr (assq 'server params))
+ (plist-get defaults :server)))
+ ;; port
+ (elmo-net-folder-set-port-internal
+ folder
+ (or (and port (string-to-int port))
+ (plist-get defaults :port)))
+ ;; stream-type
+ (elmo-net-folder-set-stream-type-internal
+ folder
+ (or (and stream-type
+ (assoc (concat "!" stream-type) elmo-network-stream-type-alist))
+ (plist-get defaults :stream-type)))))
+
+(luna-define-method elmo-folder-initialize ((folder elmo-net-folder) name)
+ ;; user and auth should be set in subclass.
+ (when (string-match "\\(@[^@:/!]+\\)?\\(:[0-9]+\\)?\\(!.*\\)?$" name)
+ (elmo-net-folder-set-parameters
+ folder
+ (car (elmo-parse-separated-tokens
+ (substring name (match-beginning 0))
+ elmo-net-folder-name-syntax))))
+ folder)
+
+(luna-define-method elmo-net-port-info ((folder elmo-net-folder))
+ (list (elmo-net-folder-server-internal folder)
+ (elmo-net-folder-port-internal folder)
+ (elmo-network-stream-type-symbol
+ (elmo-net-folder-stream-type-internal folder))))
+
+(defun elmo-net-port-label (folder)
+ (concat
+ (symbol-name (elmo-folder-type-internal folder))
+ (if (elmo-net-folder-stream-type-internal folder)
+ (concat "!" (symbol-name
+ (elmo-network-stream-type-symbol
+ (elmo-net-folder-stream-type-internal
+ folder)))))))
+
+(luna-define-method elmo-folder-plugged-p ((folder elmo-net-folder))
+ (apply 'elmo-plugged-p
+ (append (elmo-net-port-info folder)
+ (list nil (quote (elmo-net-port-label folder))))))
+
+(luna-define-method elmo-folder-set-plugged ((folder elmo-net-folder)
+ plugged &optional add)
+ (apply 'elmo-set-plugged plugged
+ (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)
+ ;; 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)
+ (elmo-folder-send folder 'elmo-folder-status-plugged)
+ (elmo-folder-send folder 'elmo-folder-status-unplugged)))
+
+(luna-define-method elmo-folder-status-unplugged
+ ((folder elmo-net-folder))
+ (if elmo-enable-disconnected-operation
+ (elmo-folder-status-dop folder)
+ (error "Unplugged")))
+
+(luna-define-method elmo-folder-next-message-number ((folder elmo-net-folder))
+ (if (elmo-folder-plugged-p folder)
+ (elmo-folder-send folder 'elmo-folder-next-message-number-plugged)
+ (elmo-folder-send folder 'elmo-folder-next-message-number-unplugged)))
+
+(luna-define-method elmo-folder-next-message-number-unplugged
+ ((folder elmo-net-folder))
+ (if elmo-enable-disconnected-operation
+ (elmo-folder-next-message-number-dop folder)
+ (error "Unplugged")))
+
+(luna-define-method elmo-folder-list-messages-internal
+ ((folder elmo-net-folder) &optional nohide)
+ (elmo-net-folder-list-messages-internal folder nohide))
+
+(defun elmo-net-folder-list-messages-internal (folder nohide)
+ (if (elmo-folder-plugged-p folder)
+ (elmo-folder-send folder 'elmo-folder-list-messages-plugged nohide)
+ (elmo-folder-send folder 'elmo-folder-list-messages-unplugged)))
+
+(luna-define-method elmo-folder-list-messages-plugged
+ ((folder elmo-net-folder))
+ nil)
+
+;; Should consider offline append and removal.
+(luna-define-method elmo-folder-list-messages-unplugged ((folder
+ elmo-net-folder))
+ (if elmo-enable-disconnected-operation
+ (let ((deleting (elmo-dop-list-deleting-messages folder)))
+ (nconc
+ ;; delete deleting messages
+ (elmo-delete-if
+ (lambda (number) (memq number deleting))
+ ;; current number-list.
+ (elmo-folder-list-messages folder nil 'in-msgdb))
+ ;; append appending messages
+ (mapcar (lambda (x) (* -1 x))
+ (elmo-dop-spool-folder-list-messages folder))))
+ t))
+
+(luna-define-method elmo-folder-list-flagged-internal ((folder elmo-net-folder)
+ flag)
+ (if (and (elmo-folder-plugged-p folder)
+ (elmo-folder-use-flag-p folder))
+ (elmo-folder-send folder 'elmo-folder-list-flagged-plugged flag)
+ ;; Should consider offline append and removal?
+ t))
+
+(luna-define-method elmo-folder-list-flagged-plugged ((folder elmo-net-folder)
+ flag)
+ t)
+
+(luna-define-method elmo-folder-delete-messages-internal ((folder
+ elmo-net-folder)
+ numbers)
+ (if (elmo-folder-plugged-p folder)
+ (elmo-folder-send folder 'elmo-folder-delete-messages-plugged numbers)
+ (elmo-folder-send folder 'elmo-folder-delete-messages-unplugged numbers)))
+
+(luna-define-method elmo-folder-delete-messages-unplugged ((folder
+ elmo-net-folder)
+ numbers)
+ (elmo-folder-delete-messages-dop folder numbers))
+
+(luna-define-method elmo-folder-msgdb-create ((folder elmo-net-folder)
+ numbers flag-table)
+ (if (elmo-folder-plugged-p folder)
+ (elmo-folder-send folder 'elmo-folder-msgdb-create-plugged
+ numbers flag-table)
+ (elmo-folder-send folder 'elmo-folder-msgdb-create-unplugged
+ numbers flag-table)))
+
+(luna-define-method elmo-folder-msgdb-create-unplugged ((folder
+ elmo-net-folder)
+ numbers
+ 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)
+ flag-table)))
+
+(luna-define-method elmo-folder-set-flag :before ((folder elmo-net-folder)
+ numbers
+ flag
+ &optional is-local)
+ (when (and (not is-local)
+ (elmo-folder-use-flag-p folder))
+ (elmo-folder-send folder
+ (if (elmo-folder-plugged-p folder)
+ 'elmo-folder-set-flag-plugged
+ 'elmo-folder-set-flag-unplugged)
+ numbers
+ flag)))
+
+(luna-define-method elmo-folder-unset-flag :before ((folder elmo-net-folder)
+ numbers
+ flag
+ &optional is-local)
+ (when (and (not is-local)
+ (elmo-folder-use-flag-p folder))
+ (elmo-folder-send folder
+ (if (elmo-folder-plugged-p folder)
+ 'elmo-folder-unset-flag-plugged
+ 'elmo-folder-unset-flag-unplugged)
+ numbers
+ flag)))
+
+(luna-define-method elmo-folder-set-flag-unplugged ((folder elmo-net-folder)
+ numbers flag)
+ (elmo-folder-set-flag-dop folder numbers flag))
+
+(luna-define-method elmo-folder-unset-flag-unplugged ((folder elmo-net-folder)
+ numbers flag)
+ (elmo-folder-unset-flag-dop folder numbers flag))
+
+(luna-define-method elmo-message-encache :around ((folder elmo-net-folder)
+ number &optional read)
+ (if (elmo-folder-plugged-p folder)
+ (luna-call-next-method)
+ (if elmo-enable-disconnected-operation
+ (elmo-message-encache-dop folder number read)
+ (error "Unplugged"))))
+
+(luna-define-generic elmo-message-fetch-plugged (folder number strategy
+ &optional
+ section
+ outbuf
+ unseen)
+ "")
+
+(luna-define-generic elmo-message-fetch-unplugged (folder number strategy
+ &optional
+ section
+ outbuf
+ unseen)
+ "")
+
+(luna-define-method elmo-message-fetch-internal ((folder elmo-net-folder)
+ number strategy
+ &optional section unseen)
+ (if (elmo-folder-plugged-p folder)
+ (elmo-message-fetch-plugged folder number
+ strategy section
+ (current-buffer) unseen)
+ (elmo-message-fetch-unplugged folder number
+ strategy section
+ (current-buffer) unseen)))
+
+(luna-define-method elmo-message-fetch-unplugged
+ ((folder elmo-net-folder) number strategy &optional section outbuf unseen)
+ (if (and elmo-enable-disconnected-operation
+ (< number 0))
+ (elmo-message-fetch-internal
+ (elmo-dop-spool-folder folder) (abs number) strategy
+ section unseen)
+ (error "Unplugged")))
+
+(luna-define-method elmo-folder-check ((folder elmo-net-folder))
+ (if (elmo-folder-plugged-p folder)
+ (elmo-folder-send folder 'elmo-folder-check-plugged)))
+
+(luna-define-method elmo-folder-close :after ((folder elmo-net-folder))
+ (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))
+ (if (and (elmo-folder-use-flag-p folder)
+ (elmo-folder-plugged-p folder))
+ (elmo-folder-send folder 'elmo-folder-diff-plugged)
+ (luna-call-next-method)))
+
+(luna-define-method elmo-folder-local-p ((folder elmo-net-folder))
+ nil)
+
+(luna-define-method elmo-quit ((folder elmo-net-folder))
+ (elmo-network-clear-session-cache))
+