changeset 16:cf36410f06c2

*** empty log message ***
author gongo
date Sat, 10 Nov 2007 15:47:45 +0900
parents 80db8560887c
children c213eff29303
files ChangeLog redit-client-sm.el
diffstat 2 files changed, 160 insertions(+), 126 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Nov 10 14:58:51 2007 +0900
+++ b/ChangeLog	Sat Nov 10 15:47:45 2007 +0900
@@ -1,5 +1,24 @@
 2007-11-10  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
+	* redit-client-sm.el:unpack-int
+	< (setq num (* byte 4))
+	<   (string-to-char (substring pkt num (+ num 1)))))
+	----------
+	> (setq num (* byte 4))
+	>   (string-to-char (substring pkt (- num 1) num))))
+	通りで、SMからのACKにある
+	eid や sid を取得できない訳だ。
+	
+	* error: redit-put-command
+	cmd(redit-put-command, 0, 0, 0, 0, str-length, str)
+	みたいに送ると、GUI SessionManager で受け取る文字列が化ける。
+
+	emacs || GUI SessionManager
+	------++-------------------
+	gongo -> 杯湧
+
+	どっちが原因なのか・・・
+	
 	* TODO
 	送信文字数がバイトとかになるんで
 
@@ -16,6 +35,7 @@
 
 	open-network-stream を追加してみた。
 
+	redit-join-command()
 	< (setq redit-client-process
 	<   (start-process "reditclient" nil redit-client-program host))
 	-----
--- a/redit-client-sm.el	Sat Nov 10 14:58:51 2007 +0900
+++ b/redit-client-sm.el	Sat Nov 10 15:47:45 2007 +0900
@@ -63,20 +63,22 @@
 (defvar redit-close-command         "11")
 (defvar redit-close-ack             "12")
 (defvar redit-replace-command       "13")
+(defvar redit-replace-ack           "14")
+(defvar redit-nop-command           "15")
 
 ;; REP Session
 (defvar redit-join-command           "41")
 (defvar redit-join-ack-command       "42")
-(defvar redit-get-command            "43")
-(defvar redit-get-ack-command        "44")
+(defvar redit-get-command            "43") ;; obsolete
+(defvar redit-get-ack-command        "44") ;; obsolete
 (defvar redit-put-command            "45")
 (defvar redit-put-ack-command        "46")
 (defvar redit-select-command         "47")
 (defvar redit-select-ack-command     "48")
-(defvar redit-register-command       "49")
-(defvar redit-register-ack-command   "50")
-(defvar redit-deregister-command     "51")
-(defvar redit-deregister-ack-command "52")
+(defvar redit-register-command       "49") ;; obsolete
+(defvar redit-register-ack-command   "50") ;; obsolete
+(defvar redit-deregister-command     "51") ;; obsolete
+(defvar redit-deregister-ack-command "52") ;; obsolete
 (defvar redit-quit-command           "53")
 (defvar redit-quit-ack-command       "54")
 
@@ -95,108 +97,111 @@
 ;; 適当に作ってしまったので。
 ;; 一応コマンドは認識してます。
 ;; エンディアンとか考える必要あるん?
-(defun pack-int-loop (num count)
+;; UTF8だから大丈夫とか言っていい?
+(defun redit-pack-int-loop (num count)
   (if (> count 0)
       (concat
-       (pack-int-loop (/ num 256) (- count 1))
+       (redit-pack-int-loop (/ num 256) (- count 1))
        (char-to-string (% num 256)))))
 
-(defun pack-int (num)
-  (pack-int-loop num 4))
+(defun redit-pack-int (num)
+  (redit-pack-int-loop num 4))
+
+(defun redit-pack (cmd sid eid seq lno siz)
+  (concat
+   (redit-pack-int cmd) (redit-pack-int sid) (redit-pack-int eid)
+   (redit-pack-int seq) (redit-pack-int lno) (redit-pack-int siz)))
+
+(defun unpack-int (pkt byte)
+  (let (num)
+    (setq num (* byte 4))
+    (string-to-char (substring pkt (- num 1) num))))
 
 
-(defun unpack-int (pkt start end)
-  (string-to-char (substring pkt start end)))
-
-(defun redit-client-start (host)
-  "Allow this Emacs process to be a remote-edit client for client processes."
-  (interactive "P")
-  (if redit-client-process
-      (progn
-	(set-process-sentinel redit-client-process nil)
-	(condition-case () ;; エラーが起こるとプロセスを消す
-	    (delete-process redit-client-process) (error nil))))
-  (if (setq host (read-string "Hostname: ")) ;; minibufferでホスト名を入力させる
-      (let ((process-connection-type nil))
-	;; クライアントプロセス(redit-client)内のプログラムをスタートさせる。
-	;; 引き数として host が与えられる
-	(setq redit-client-process
-	      (start-process "reditclient" nil redit-client-program host))
+;; これ使ってる?
+;; redit-join-command の仕事と被ってるっぽいのでコメント
+;; (defun redit-client-start (host)
+;;   "Allow this Emacs process to be a remote-edit client for client processes."
+;;   (interactive "P")
+;;   (if redit-client-process
+;;       (progn
+;; 	(set-process-sentinel redit-client-process nil)
+;; 	(condition-case () ;; エラーが起こるとプロセスを消す
+;; 	    (delete-process redit-client-process) (error nil))))
+;;   (if (setq host (read-string "Hostname: ")) ;; minibufferでホスト名を入力させる
+;;       (let ((process-connection-type nil))
+;; 	;; クライアントプロセス(redit-client)内のプログラムをスタートさせる。
+;; 	;; 引き数として host が与えられる
+;; 	(setq redit-client-process
+;; 	      (start-process "reditclient" nil redit-client-program host))
+;; 
+;; 	;; redit-client-process の状態が変化すると redit-client-sentinel を呼ぶ
+;; 	(set-process-sentinel redit-client-process 'redit-client-sentinel)
+;; 	;; redit-client-process からのデータ入力は redit-client-process-filter
+;; 	;; を介する
+;; 	(set-process-filter redit-client-process 'redit-client-process-filter)
+;; 	;; redit-client-process からの入出力を 8-bit codes で取扱う。
+;; 	;;(set-process-coding-system redit-client-process
+;; 	;;'raw-text 'raw-text)
+;; 	(set-process-coding-system redit-client-process
+;; 				   'utf-8 'utf-8)
+;; 	;; emacs が終了すると redit-client-process も終了する
+;; 	(set-process-query-on-exit-flag redit-client-process nil)
+;; 
+;; 	;; フック変数 before-change-functions, after-change-functions
+;; 	;; をバッファローカルにする
+;; 	;; not necessary since Emacs 21.1
+;; 	;; (make-local-hook 'before-change-functions)
+;; 	;; (make-local-hook 'after-change-functions)
+;; 	
+;; 	(message "Remote edit client started."))   (error "redit-client connection refused.")))
+;; 
+;; (redit-join-command ())
 
 
-	;; redit-client-process の状態が変化すると redit-client-sentinel を呼ぶ
-	(set-process-sentinel redit-client-process 'redit-client-sentinel)
-	;; redit-client-process からのデータ入力は redit-client-process-filter
-	;; を介する
-	(set-process-filter redit-client-process 'redit-client-process-filter)
-	;; redit-client-process からの入出力を 8-bit codes で取扱う。
-	(set-process-coding-system redit-client-process
-				   'raw-text 'raw-text)
-	;; emacs が終了すると redit-client-process も終了する
-	(set-process-query-on-exit-flag redit-client-process nil)
-
-	;; フック変数 before-change-functions, after-change-functions
-	;; をバッファローカルにする
-	;; not necessary since Emacs 21.1
-	;; (make-local-hook 'before-change-functions)
-	;; (make-local-hook 'after-change-functions)
-	
-	(message "Remote edit client started."))   (error "redit-client connection refused.")))
-
-;; (redit-join-command ())
-(defun redit-join-command (host)
+(defun redit-join-command ()
   "Allow this Emacs process to be a remote-edit session manager for client processes."
-  (interactive "P")
+  (interactive)
   (if redit-client-process
       (progn
 	(set-process-sentinel redit-client-process nil)
 	(condition-case () ;; 
 	    (delete-process redit-client-process) (error nil))))
-  (if (setq host (read-string "Hostname: "))
-      (let ((process-connection-type nil))
-	;;(setq redit-client-process
-	;;(start-process "reditclient" nil redit-client-program host))
+
+  (setq redit-client-process (open-network-stream
+			      "redit-client" nil "localhost" 8766))    
 
-	;; lisp で通信ver
-	(setq redit-client-process (open-network-stream
-				    "redit-client"
-				    nil
-				    "localhost"
-				    8766))
+  ;; called when the process changes state
+  (set-process-sentinel redit-client-process 'redit-client-sentinel)
 
-	(set-process-sentinel redit-client-process 'redit-client-sentinel)
-	(set-process-filter redit-client-process 'redit-client-process-filter)
-	(set-process-coding-system redit-client-process
-				   'raw-text 'raw-text)
+  ;; called when the process receive packet
+  (set-process-filter redit-client-process 'redit-client-process-filter)
 
-	(set-process-query-on-exit-flag redit-client-process nil)
-
-	;; not necessary since Emacs 21.1
-	;; (make-local-hook 'before-change-functions)
-	;; (make-local-hook 'after-change-functions)
+  ;; Code that is the process input/output buffer is utf-8
+  (set-process-coding-system redit-client-process 'utf-8 'utf-8)
 
-	;; FIXME
-	;; concat my hostname this command?
-	(process-send-string 
-	 redit-client-process
-	 ;;Perl を使わずに、直接SessionManagerに送ってるので
-	 ;;文字列じゃなくて pack して送信
-	 ;;(concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-join-command) 0 0 (gen-seqno) 0 0) "\n")))
-	 (concat
-	  (pack-int (string-to-number redit-join-command))
-	  (pack-int 0)
-	  (pack-int 0)
-	  (pack-int 0)
-	  (pack-int 0) (pack-int 0))
-	 ))
-    (error "redit-client connection refused.")))
+  ;; ???
+  (set-process-query-on-exit-flag redit-client-process nil)
+    
+  ;; not necessary since Emacs 21.1
+  ;; (make-local-hook 'before-change-functions)
+  ;; (make-local-hook 'after-change-functions)
+    
+  (process-send-string redit-client-process
+		       (concat
+			(redit-pack
+			 (string-to-number redit-join-command)
+			 0 0 0 0 0))))
 
-;; (redit-get-command)
-(defun redit-get-command ()
-  "get. alias redit-join-command and redit-select-command."
-  (interactive)
-  (redit-join-command ())
-  (redit-select-command ()))
+
+
+
+;; 'get' is obsolete command
+;; (defun redit-get-command ()
+;;   "get. alias redit-join-command and redit-select-command."
+;;   (interactive)
+;;   (redit-join-command)
+;;   (redit-select-command ()))
 
 ;; select : select session
 ;; ユーザの入力を受け取って、selectコマンドを構成し、通信プロセスに渡す
@@ -204,7 +209,7 @@
 (defun redit-select-command (session-name)
   "select session"
   (interactive "P")
-  (if (setq session-name (read-string "session name:")) 
+  (if (setq session-name (read-string "session name:"))
       (progn 
 	(setq redit-client-session-id (string-to-number session-name))
 	(process-send-string 
@@ -225,26 +230,34 @@
   (if (setq session-name (read-string "put session name:")) 
       (process-send-string 
        redit-client-process
-       (concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-put-command) redit-client-session-id redit-client-editor-id (gen-seqno) 0 0) session-name "\n"))
+       (concat
+	(redit-pack
+	 (string-to-number redit-put-command) 0 0 0 0
+	 (string-bytes (encode-coding-string session-name 'utf-8)))
+	session-name
+	)
+       )
     (error "invalid session name.")
-    )
-  )
+    ))
 
-(defun redit-register-command (session-name)
-  "register"
-  (interactive "P")
-  (if (setq session-name (read-string "session name:")) 
-      (process-send-string 
-       redit-client-process
-       (concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-register-command) redit-client-session-id redit-client-editor-id (gen-seqno) 0 0) session-name "\n"))
-    (error "invalid session name.")
-    )
-  )
+;; 'register' is obsolete command
+;; (defun redit-register-command (session-name)
+;;   "register"
+;;   (interactive "P")
+;;   (if (setq session-name (read-string "session name:")) 
+;;       (process-send-string 
+;;        redit-client-process
+;;        (concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-register-command) redit-client-session-id redit-client-editor-id (gen-seqno) 0 0) session-name "\n"))
+;;     (error "invalid session name.")
+;;     )
+;;   )
+;; 
 
-(defun redit-deregister-command ()
-  "deregister"
-  (interactive)
-  )
+;; 'deregister' is obsolete command
+;;(defun redit-deregister-command ()
+;;  "deregister"
+;;  (interactive)
+;; )
 
 (defun redit-quit-command ()
   "quit"
@@ -368,7 +381,7 @@
 	       'redit-client-before-change-function t)
   (remove-hook 'after-change-functions
 	       'redit-client-after-change-function t)
-
+  
   (let ((command (rep-get-command-from-pkt string)))
     ;; command がどの命令かを判断し、対応した処理をする。case みたい
     (cond 
@@ -400,6 +413,7 @@
      ;; from Session Manager
      ;; join ack (editor id)
      ((if (= command (string-to-number redit-join-ack-command))
+	  ;;(message "redit-client-exec-join")
 	  (redit-client-exec-join string)))
 
      ;; put ack (editor id)
@@ -412,23 +426,24 @@
 	  (redit-client-exec-select)))
 
      ;; get
-     ((if (= command (string-to-number redit-get-command))
-	  (if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
-	      (redit-client-exec-get string))))
+     ;;((if (= command (string-to-number redit-get-command))
+     ;;(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+     ;;(redit-client-exec-get string))))
+
      ;; register
-     ((if (= command (string-to-number redit-register-command))
-	  (if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
-	      (redit-client-exec-register string))))
+     ;;((if (= command (string-to-number redit-register-command))
+     ;;(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+     ;;(redit-client-exec-register string))))
+
      ;; deregister
-     ((if (= command (string-to-number redit-deregister-command))
-	  (if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
-	      (redit-client-exec-deregister string))))
+     ;;((if (= command (string-to-number redit-deregister-command))
+     ;;(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+     ;;(redit-client-exec-deregister string))))
 
      ;; delete line
      ((if (= command (string-to-number redit-delete-line-command))
 	  (if (/= redit-client-editor-id (rep-get-editor-id-from-pkt string))
 	      (redit-client-exec-delete-line string))))
-     ;;((string-equal string ""))
      ))
 
   (add-hook 'before-change-functions
@@ -632,8 +647,7 @@
 ;; 引き数で与えられた string から Editor IDを取得する
 (defun redit-client-exec-join (string)
   (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
-  (insert (concat "eid = " (number-to-string redit-client-editor-id) "\n"))
-  (insert (rep-get-text-from-pkt string)))
+  (insert (concat "eid = " (number-to-string redit-client-editor-id) "\n")))
 
 ;; 引き数で与えられた string から Session IDを取得する
 (defun redit-client-exec-put (string)
@@ -661,22 +675,22 @@
 
 (defun rep-get-command-from-pkt (pkt)
   ;;(string-to-number (substring pkt 0 10)))
-  (unpack-int pkt 3 4))
+  (unpack-int pkt 1))
 (defun rep-get-session-id-from-pkt (pkt)
   ;;(string-to-number (substring pkt 10 20)))
-  (unpack-int pkt 7 8))
+  (unpack-int pkt 2))
 (defun rep-get-editor-id-from-pkt (pkt)
   ;;(string-to-number (substring pkt 20 30)))
-  (unpack-int pkt 11 12))
+  (unpack-int pkt 3))
 (defun rep-get-sequence-id-from-pkt (pkt)
   ;;(string-to-number (substring pkt 30 40)))
-  (unpack-int pkt 15 16))
+  (unpack-int pkt 4))
 (defun rep-get-line-number-from-pkt (pkt)
   ;;(string-to-number (substring pkt 40 50)))
-  (unpack-int pkt 19 20))
+  (unpack-int pkt 5))
 (defun rep-get-text-size-from-pkt (pkt)
   ;;(string-to-number (substring pkt 50 60)))
-  (unpack-int pkt 23 24))
+  (unpack-int pkt 6))
 (defun rep-get-text-from-pkt (pkt)
   (let ((size (rep-get-text-size-from-pkt pkt)))
   (substring (decode-coding-string pkt 'euc-jp) 27 (+ 27 size))))