Mercurial > hg > RemoteEditor > emacs
changeset 41:0f547ed856f6
*** empty log message ***
author | gongo |
---|---|
date | Fri, 22 Aug 2008 20:27:01 +0900 |
parents | 1978dc75b15c |
children | 95301aa3ea2f |
files | test/packet/README test/packet/redit-test-packet-recv.el |
diffstat | 2 files changed, 140 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/packet/README Fri Aug 22 20:27:01 2008 +0900 @@ -0,0 +1,62 @@ +emacs が SessionManager(以下SM) から REPcommand(以下cmd) を受け取る時のテスト + +-------- +- 状況 - +-------- + +emacs は SM (所謂lisp内でいうprocess) からメッセージを受け取ると +set-process-filter で設定された関数が呼び出される。 +その際、引数で受信した文字列を見れるわけですが、 +このとき、filter の文字列に、複数の cmd がくっついてる可能性がある。 + +例えば、 + +SM から cmd が 3 つ(A,B,C)送られてきた + +* 例1 +-> filter が呼ばれた (|A| が引数に) +-> filter が呼ばれた (|B| が引数に) +-> filter が呼ばれた (|C| が引数に) + +* 例2 +-> filter が呼ばれた (|A|B| が引数に) +-> filter が呼ばれた (|C| が引数に) + +みたいな感じで、引数に複数の cmd が連結された状態になってる可能性がある。 + +------------ +- 解決方法 - +------------ + +filter 内では process からのパケットを受け取ることはしない(らしい)ので、 + +1. filter が呼び出される +2. 受け取った文字列を、複数の cmd に対応できるように分割する +3. それぞれの cmd に対して処理を行う +4. 1 に戻る + +まあ書いてみると簡単なんですけどね。 +cmd 自体はサイズがわかっているので、分割はきっと大丈夫と信じる。 + +/** + * $ID:$ + * 現在、まだ動いてません + */ + +--------- +- Usage - +--------- + +0. redit-test-packet-recv.el の redit-test-client-program に書いてある + redit-test-packet-send.pl の場所を自分の環境に合う用に書いてください +1. emacs を起動 +2. M-x load-file [Enter] で recv.el を指定する +3. M-x redit-test-start で起動 + *Messages* に、send.pl から送られてきたパケットが表示されているはず。 + + 41 1 1 0 $i 0 + + $i が、0 〜 send_count-1 の数だけパケットが表示されると正常。 + send.pl で send_count や send_interval を変えると + 受け取れないパケットがある可能性がある。 + それがあるうちはバグが取れていない証拠です \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/packet/redit-test-packet-recv.el Fri Aug 22 20:27:01 2008 +0900 @@ -0,0 +1,78 @@ +;; send.pl のパス。 +(defconst redit-test-client-program "/Users/gongo/Source/Concurrency/REP_project/emacs/test/packet/redit-test-packet-send.pl") + +;; プロセス変数 +(defvar redit-test-client-process nil) + + +(defun redit-test-unpack-int-loop (pkt pos count) + (if (> count 1) + (+ + (* (redit-test-unpack-int-loop pkt (- pos 1) (- count 1)) 256) + (string-to-char (substring pkt (- pos 1) pos))) + 0 + )) + +(defun redit-test-unpack-int (pkt pos) + (redit-test-unpack-int-loop pkt (* pos 4) 4)) + +(defun rep-test-get-command-from-pkt (pkt) + (redit-test-unpack-int pkt 1)) +(defun rep-test-get-session-id-from-pkt (pkt) + (redit-test-unpack-int pkt 2)) +(defun rep-test-get-editor-id-from-pkt (pkt) + (redit-test-unpack-int pkt 3)) +(defun rep-test-get-sequence-id-from-pkt (pkt) + (redit-test-unpack-int pkt 4)) +(defun rep-test-get-line-number-from-pkt (pkt) + (redit-test-unpack-int pkt 5)) +(defun rep-test-get-text-size-from-pkt (pkt) + (redit-test-unpack-int pkt 6)) + + +;; process (send.pl) を起動する。 +;; send.pl がパケットを送るトリガー(?)として +;; 文字列を送信する(標準入力)。 +(defun redit-test-start () + (interactive) + (setq redit-test-client-process + (start-process "reditclient" nil redit-test-client-program)) + (set-process-filter redit-test-client-process + 'redit-test-client-process-filter) + (set-process-coding-system redit-test-client-process + 'binary 'binary) + + (process-send-string redit-test-client-process "a")) + +;; process を終了する。 +(defun redit-test-stop () + (interactive) + (if (not (eq (process-status redit-test-client-process) 'exit)) + (kill-process redit-test-client-process))) + +;; process の restart。 +(defun redit-test-restart () + (interactive) + (redit-test-stop) + (redit-test-start)) + +;; process からのパケットを受け取る。 +;; パケットは REPcommand。 +;; バイトデータと、unpack して取得した値を出力する +(defun redit-test-client-process-filter (proc string) + (let ((cmd (rep-test-get-command-from-pkt string)) + (sid (rep-test-get-session-id-from-pkt string)) + (eid (rep-test-get-editor-id-from-pkt string)) + (seq (rep-test-get-sequence-id-from-pkt string)) + (lno (rep-test-get-line-number-from-pkt string)) + (siz (rep-test-get-text-size-from-pkt string))) + + (message (concat string "\n")) + (message (concat (number-to-string cmd) " " + (number-to-string sid) " " + (number-to-string eid) " " + (number-to-string seq) " " + (number-to-string lno) " " + (number-to-string siz) + "\n")) + )) \ No newline at end of file