Mercurial > hg > RemoteEditor > emacs
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))))