egg-980315.
[elisp/egg.git] / egg / wnn.el
index a07977e..22822b3 100644 (file)
@@ -60,6 +60,7 @@
           wnn-decide-candidate
       wnn-change-bunsetsu-length
     wnn-end-conversion
+    wnn-start-reverse-conversion
 
     wnn-fini
  ])
 (defvar wnn-environments nil
   "Environment for WNN kana-kanji conversion")
 
-(defcustom wnn-jserver "localhost" "jserver host" :group 'wnn :type 'string)
-(defcustom wnn-cserver "localhost" "cserver host" :group 'wnn :type 'string)
-(defcustom wnn-tserver "localhost" "tserver host" :group 'wnn :type 'string)
-(defcustom wnn-kserver "localhost" "kserver host" :group 'wnn :type 'string)
+(defcustom wnn-jserver nil "jserver host list" :group 'wnn :type 'string)
+(defcustom wnn-cserver nil "cserver host list" :group 'wnn :type 'string)
+(defcustom wnn-tserver nil "tserver host list" :group 'wnn :type 'string)
+(defcustom wnn-kserver nil "kserver host list" :group 'wnn :type 'string)
+
+(defcustom wnn-jport 22273 "jserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-cport 22289 "cserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-tport 22321 "tserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-kport 22305 "kserver port number" :group 'wnn :type 'integer)
 
 ;; The port number should be initialized from $WNNLIB/serverdefs by wnn-init
 (defconst wnn-server-info-list
-  ;; language      locale  server  port  stream coding-system hostname
-  '(("Japanese"    "ja_JP" jserver 22273 "Wnn"  fixed-euc-jp wnn-jserver)
-    ("Chinese-GB"  "zh_CN" cserver 22289 "cWnn" fixed-euc-cn wnn-cserver)
-    ("Chinese-CNS" "zh_TW" tserver 22321 "tWnn" fixed-euc-tw wnn-tserver)
-    ("Korean"      "ko_KR" kserver 22305 "kWnn" fixed-euc-kr wnn-kserver)))
+  ;; language      locale  server  port     stream coding-system hostname
+  '(("Japanese"    "ja_JP" jserver wnn-jport "Wnn"  fixed-euc-jp wnn-jserver)
+    ("Chinese-GB"  "zh_CN" cserver wnn-cport "cWnn" fixed-euc-cn wnn-cserver)
+    ("Chinese-CNS" "zh_TW" tserver wnn-tport "tWnn" fixed-euc-tw wnn-tserver)
+    ("Korean"      "ko_KR" kserver wnn-kport "kWnn" fixed-euc-kr wnn-kserver)))
 
 (defun wnn-get-server-info (lang)
   (let (info)
   (nth 2 info))
 
 (defsubst wnn-server-port (info)
-  (nth 3 info))
+  (symbol-value (nth 3 info)))
 
 (defsubst wnn-server-stream-name (info)
   (nth 4 info))
@@ -207,6 +213,9 @@ Return the list of bunsetsu."
     (wnnenv-set-daibunsetsu-info env (car result))
     (cdr result)))
 
+(defun wnn-start-reverse-conversion (yomi &optional language dic-set)
+  (wnn-start-conversion yomi language dic-set t))
+
 (defun wnn-get-bunsetsu-converted (bunsetsu)
   (concat (wnn-bunsetsu-get-converted bunsetsu)
          (wnn-bunsetsu-get-fuzokugo  bunsetsu)))
@@ -390,43 +399,65 @@ Return the list of bunsetsu."
              l (cdr l))))))
 
 ;;
+(defvar wnn-open-message)
+
 (defun wnn-open (server-info)
   "Establish the connection to WNN server.  Return process object."
   ;; Open the session to WNN server, 
   (let ((buf (generate-new-buffer (wnn-server-buffer-name server-info)))
-       (hostname (wnn-server-hostname server-info))
-       proc result)
-    (condition-case result
-       (setq proc (open-network-stream (wnn-server-stream-name server-info)
-                                       buf
-                                       hostname
-                                       (wnn-server-port server-info)))
-      (error (progn
-              (kill-buffer buf)
-              (signal (car result) (cdr result)))))
-    (process-kill-without-query proc)
-    (set-process-coding-system proc 'no-conversion 'no-conversion)
-    (set-process-sentinel proc 'wnn-comm-sentinel)
-    (set-marker-insertion-type (process-mark proc) t)
+       (server-type (wnn-server-type server-info))
+       (hostname-list (wnn-server-hostname server-info))
+       (msg-form "WNN: connecting to %S at %s...")
+       hostname proc result msg)
     (save-excursion
       (set-buffer buf)
       (erase-buffer)
       (buffer-disable-undo)
       (setq enable-multibyte-characters nil
            egg-fixed-euc (wnn-server-coding-system server-info)))
-    (setq result (wnnrpc-open proc
-                             (if (equal hostname "localhost")
-                                 "unix"
-                               (system-name))
-                             (user-login-name)))
-    (if (< result 0)
-       (let ((msg (wnnrpc-get-error-message (- result))))
-         (delete-process proc)
-         (kill-buffer buf)
-         (error "Can't open WNN session (%s %S): %s"
-                hostname
-                (wnn-server-type server-info) msg))
-      proc)))
+    (cond
+     ((null hostname-list)
+      (setq hostname-list '("localhost")))
+     ((null (listp hostname-list))
+      (setq hostname-list (list hostname-list))))
+    (while (and hostname-list (null proc))
+      (setq hostname (car hostname-list)
+           hostname-list (cdr hostname-list))
+      (message msg-form server-type hostname)
+      (sit-for 0)
+      (condition-case result
+         (setq proc (open-network-stream (wnn-server-stream-name server-info)
+                                         buf
+                                         hostname
+                                         (wnn-server-port server-info)))
+       (error nil))
+      (if proc
+         (progn
+           (process-kill-without-query proc)
+           (set-process-coding-system proc 'no-conversion 'no-conversion)
+           (set-process-sentinel proc 'wnn-comm-sentinel)
+           (set-marker-insertion-type (process-mark proc) t)
+           (setq result (wnnrpc-open proc
+                                     (if (equal hostname "localhost")
+                                         "unix"
+                                       (system-name))
+                                     (user-login-name)))
+           (if (< result 0)
+               (progn
+                 (delete-process proc)
+                 (setq proc nil
+                       msg (format "Can't open WNN session (%s %S): %s"
+                                   hostname
+                                   (wnn-server-type server-info)
+                                   msg)))))))
+    (if proc
+       (progn
+         (setq wnn-open-message (format (concat msg-form "done")
+                                        server-type
+                                        hostname))
+         proc)
+      (kill-buffer buf)
+      (error "%s" (or msg (format "no %S available" server-type))))))
 
 (defvar wnn-dictionary-specification-list
   '((jserver
@@ -722,6 +753,12 @@ REVERSE specifies reverse conversion, if non nil."
                 (eq (wnn-dic-spec-reverse s) reverse))
            (setq env e))
        (setq spec (cdr spec)))
+      (if (null env)
+         (error "WNN: environment for %S%s (%s) not found"
+                server-type
+                (if dic-set (format "(%S)" dic-set) "")
+                (if reverse 'reverse 'normal)))
+      (message "%s" wnn-open-message)
       env)))
 
 (defun wnn-create-environment (proc server-type spec)
@@ -884,7 +921,6 @@ REVERSE specifies reverse conversion, if non nil."
   "Activate Wnn backend of Tamagotchy."
   (egg-set-support-languages wnn-support-languages)
   (egg-set-conversion-backend wnn-conversion-backend
-                             (list (nth 2 arg))
                              wnn-support-languages)
   (apply 'egg-mode arg))