X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-net.el;h=b8c857718b8a492eee71f15e905baa364f856725;hb=a717271e46f76079d48f9f976807cfaeeb0a3f85;hp=d3af2ccc3f5a963bd73e1e7640767d911e26e4ac;hpb=8b003dd16e3d4a1f0d29b5fcd0f57a2ee294f967;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-net.el b/elmo/elmo-net.el index d3af2cc..b8c8577 100644 --- a/elmo/elmo-net.el +++ b/elmo/elmo-net.el @@ -1,4 +1,4 @@ -;;; elmo-net.el -- Network module for ELMO. +;;; elmo-net.el --- Network module for ELMO. ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi @@ -24,7 +24,7 @@ ;; ;;; Commentary: -;; +;; (eval-when-compile (require 'cl)) @@ -113,19 +113,20 @@ (defsubst elmo-network-session-password-key (session) (format "%s:%s/%s@%s:%d" - (elmo-network-session-name-internal session) + (upcase + (nth 1 (split-string (symbol-name + (luna-class-name session)) "[4-]"))) (elmo-network-session-user-internal session) (elmo-network-session-auth-internal session) (elmo-network-session-server-internal session) (elmo-network-session-port-internal session))) (defvar elmo-network-session-cache nil) -(defvar elmo-network-session-name-prefix nil) (defsubst elmo-network-session-cache-key (name folder) "Returns session cache key for NAME and FOLDER." (format "%s:%s/%s@%s:%d%s" - (concat elmo-network-session-name-prefix name) + name (elmo-net-folder-user-internal folder) (elmo-net-folder-auth-internal folder) (elmo-net-folder-server-internal folder) @@ -158,7 +159,9 @@ if making session failed, returns nil." (let (pair session key) (if (not (elmo-plugged-p (elmo-net-folder-server-internal folder) - (elmo-net-folder-port-internal folder))) + (elmo-net-folder-port-internal folder) + (elmo-network-stream-type-symbol + (elmo-net-folder-stream-type-internal folder)))) (error "Unplugged")) (setq pair (assoc (setq key (elmo-network-session-cache-key name folder)) elmo-network-session-cache)) @@ -210,7 +213,7 @@ Returns a process object. if making session failed, returns nil." :process nil :greeting nil)) (buffer (format " *%s session for %s@%s:%d%s" - (concat elmo-network-session-name-prefix name) + name user server port @@ -232,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) @@ -246,7 +255,7 @@ Returns a process object. if making session failed, returns nil." (elmo-network-stream-type-feature stream-type)) (require (elmo-network-stream-type-feature stream-type))) (condition-case err - (let (process-connection-type) + (let (process-connection-type) (as-binary-process (setq process (if stream-type @@ -255,16 +264,31 @@ Returns a process object. if making session failed, returns nil." (open-network-stream name buffer server service))))) (error (when auto-plugged - (elmo-set-plugged nil server service stream-type (current-time)) + (elmo-set-plugged nil server service + (elmo-network-stream-type-symbol stream-type) + (current-time)) (message "Auto plugged off at %s:%d" server service) (sit-for 1)) (signal (car err) (cdr err)))) (when process (process-kill-without-query process) (when auto-plugged - (elmo-set-plugged t server service stream-type)) + (elmo-set-plugged t server service + (elmo-network-stream-type-symbol stream-type))) process))) +(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)) + (luna-define-method elmo-folder-initialize ((folder elmo-net-folder) name) @@ -279,13 +303,13 @@ Returns a process object. if making session failed, returns nil." folder (string-to-int (elmo-match-substring 2 name 1)))) (if (match-beginning 3) - (elmo-net-folder-set-stream-type-internal + (elmo-net-folder-set-stream-type-internal folder (assoc (elmo-match-string 3 name) elmo-network-stream-type-alist))) (substring name 0 (match-beginning 0)))) -(defun elmo-net-port-info (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 @@ -304,17 +328,28 @@ Returns a process object. if making session failed, returns nil." (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) - 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) @@ -338,7 +373,7 @@ Returns a process object. if making session failed, returns nil." (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 @@ -350,27 +385,32 @@ Returns a process object. if making session failed, returns nil." (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)) @@ -380,6 +420,10 @@ Returns a process object. if making session failed, returns nil." ((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) @@ -392,75 +436,90 @@ Returns a process object. if making session failed, returns nil." (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 +(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)) + flag-table))) -(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)) +(luna-define-method elmo-folder-unmark-important :before ((folder + elmo-net-folder) + numbers + &optional + ignore-flag) + (when (and (elmo-folder-use-flag-p folder) + (not ignore-flag)) + (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)))) + +(luna-define-method elmo-folder-mark-as-important :before ((folder + elmo-net-folder) + numbers + &optional + ignore-flag) + (when (and (elmo-folder-use-flag-p folder) + (not ignore-flag)) + (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)))) + +(luna-define-method elmo-folder-unmark-read :before ((folder elmo-net-folder) + numbers + &optional ignore-flag) + (when (and (elmo-folder-use-flag-p folder) + (not ignore-flag)) + (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)))) + +(luna-define-method elmo-folder-mark-as-read :before ((folder elmo-net-folder) + numbers + &optional ignore-flag) + (when (and (elmo-folder-use-flag-p folder) + (not ignore-flag)) + (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)))) + +(luna-define-method elmo-folder-unmark-answered :before ((folder + elmo-net-folder) + numbers) + (when (elmo-folder-use-flag-p folder) + (if (elmo-folder-plugged-p folder) + (elmo-folder-send folder 'elmo-folder-unmark-answered-plugged + numbers) + (elmo-folder-send folder + 'elmo-folder-unmark-answered-unplugged numbers)))) + +(luna-define-method elmo-folder-mark-as-answered :before ((folder + elmo-net-folder) + numbers) + (when (elmo-folder-use-flag-p folder) + (if (elmo-folder-plugged-p folder) + (elmo-folder-send folder 'elmo-folder-mark-as-answered-plugged + numbers) + (elmo-folder-send folder 'elmo-folder-mark-as-answered-unplugged + numbers)))) (luna-define-method elmo-folder-mark-as-read-unplugged ((folder - elmo-net-folder) + elmo-net-folder) numbers) (elmo-folder-mark-as-read-dop folder numbers)) @@ -469,7 +528,7 @@ Returns a process object. if making session failed, returns nil." (elmo-folder-unmark-read-dop folder numbers)) (luna-define-method elmo-folder-mark-as-important-unplugged ((folder - elmo-net-folder) + elmo-net-folder) numbers) (elmo-folder-mark-as-important-dop folder numbers)) @@ -478,12 +537,21 @@ Returns a process object. if making session failed, returns nil." numbers) (elmo-folder-unmark-important-dop folder numbers)) +(luna-define-method elmo-folder-mark-as-answered-unplugged ((folder + elmo-net-folder) + numbers) + (elmo-folder-mark-as-answered-dop folder numbers)) + +(luna-define-method elmo-folder-unmark-answered-unplugged + ((folder elmo-net-folder) numbers) + (elmo-folder-unmark-answered-dop folder numbers)) + (luna-define-method elmo-message-encache :around ((folder elmo-net-folder) - number) + number &optional read) (if (elmo-folder-plugged-p folder) (luna-call-next-method) (if elmo-enable-disconnected-operation - (elmo-message-encache-dop folder number) + (elmo-message-encache-dop folder number read) (error "Unplugged")))) (luna-define-generic elmo-message-fetch-plugged (folder number strategy @@ -528,8 +596,7 @@ Returns a process object. if making session failed, returns nil." (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)