changeset 45:653a9b9b7775 v20080823

*** empty log message ***
author gongo
date Sat, 23 Aug 2008 17:09:19 +0900
parents 24ec88b5c1d3
children 991526bc3f16
files test/packet/README test/packet/redit-test-packet-recv.el test/packet/redit-test-packet-send.pl
diffstat 3 files changed, 74 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
Binary file test/packet/README has changed
--- a/test/packet/redit-test-packet-recv.el	Fri Aug 22 22:15:12 2008 +0900
+++ b/test/packet/redit-test-packet-recv.el	Sat Aug 23 17:09:19 2008 +0900
@@ -5,6 +5,11 @@
 ;; プロセス変数
 (defvar redit-test-client-process nil)
 
+;;
+(defvar redit-test-filter-resume nil)
+
+(defconst redit-test-command-header-size 24)
+
 
 (defun redit-test-unpack-int-loop (pkt pos count)
   (if (> count 1)
@@ -17,6 +22,14 @@
 (defun redit-test-unpack-int (pkt pos)
   (redit-test-unpack-int-loop pkt (* pos 4) 4))
 
+;; binary この時点では、pkt は binary 形式なので
+;; substring でも抽出できる。。。ってことかな(何
+;; utf-8 とかで decode されていれば多分出来ないはず
+;; (length "あいうえお") => 5
+;; (string-bytes "あいうえお") => 15 (utf-8の場合)
+(defun redit-test-unpack-str (pkt pos length)
+  (substring pkt (* pos 4) (+ (* pos 4) length)))
+
 (defun rep-test-get-command-from-pkt (pkt)
   (redit-test-unpack-int pkt 1))
 (defun rep-test-get-session-id-from-pkt (pkt)
@@ -30,6 +43,13 @@
 (defun rep-test-get-text-size-from-pkt (pkt)
   (redit-test-unpack-int pkt 6))
 
+;; text のサイズが指定されていればそれを使い、
+;; そうでなければ、get-text-size-from-pkt を実行する
+(defun rep-test-get-text-from-pkt (pkt &optional _siz)
+  (let (size)
+    (setq size (if (null _siz) (rep-test-get-text-size-from-pkt pkt) _siz))
+    (redit-test-unpack-str pkt 6 size)))
+
 
 ;; process (send.pl) を起動する。
 ;; send.pl がパケットを送るトリガー(?)として
@@ -58,16 +78,48 @@
   (redit-test-start))
 
 ;; process からのパケットを受け取る。
-;; パケットは REPcommand。
-;; バイトデータと、unpack して取得した値を出力する
+;; *Messages* に バイトデータ、現在のバッファに unpack して取得した値を出力する
+;;
+;; パケットには複数の REPcommand がある(連結されている)場合があるので
+;; 全体のサイズを見て、分割しながら判別していく
 (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)))
+  (let (cmd sid eid seq lno siz txt allsize cursize)
+
+    ;; 前回に余った奴があれば、それを前方追加する
+    (setq string (concat redit-test-filter-resume string))
+    (setq allsize (length string))
+      
+    (block loop
+      ;; process-filter が受け取れるのは1024byteまで。
+      ;; なので、string に入っているパケットが途中で切れてる可能性がある
+      (while (> allsize redit-test-command-header-size)
+	(setq cmd (rep-test-get-command-from-pkt string))
+	(setq sid (rep-test-get-session-id-from-pkt string))
+	(setq eid (rep-test-get-editor-id-from-pkt string))
+	(setq seq (rep-test-get-sequence-id-from-pkt string))
+	(setq lno (rep-test-get-line-number-from-pkt string))
+	(setq siz (rep-test-get-text-size-from-pkt string))
+	
+	;; ヘッダ(redit-test-command-header-size) + テキストサイズ
+	(setq cursize (+ redit-test-command-header-size siz))
 
-    (message (concat string "\n"))
-    (message (format "%d %d %d %d %d %d"
-		     cmd sid eid seq lno siz))))
\ No newline at end of file
+	;; パケットが 1024 byte の壁で途切れてる場合、
+	;; テキストが読めないので、ループを抜ける
+	(if (> cursize allsize) (return-from loop))
+	
+	(setq txt (rep-test-get-text-from-pkt string siz))
+	
+	(insert (format "%d %d %d %d %d %d %s\n"
+			cmd sid eid seq lno siz
+			(decode-coding-string txt 'utf-8)))
+	(insert (format "残り %d byte\n" (- allsize cursize)))
+	
+	(setq allsize (- allsize cursize))
+	;; string の分割
+	(setq string (substring string cursize))))
+
+    ;; 途切れたやつは次の process-filter の string に入っているので
+    ;; この時点で余った奴を保存し、
+    ;; 次の process-filter の string の前に連結する
+    (setq redit-test-filter-resume string)
+    ))
\ No newline at end of file
--- a/test/packet/redit-test-packet-send.pl	Fri Aug 22 22:15:12 2008 +0900
+++ b/test/packet/redit-test-packet-send.pl	Sat Aug 23 17:09:19 2008 +0900
@@ -2,27 +2,34 @@
 
 use IO::Select;
 use Time::HiRes; # sleep で 1秒未満も扱えるように
+use NKF;
 
 my $selector = new IO::Select(\*STDIN) or die "Cannot select stdin : $!\n";
 
 # パケット送信する回数
-my $send_count = 10;
+my $send_count = 320;
 
 # パケット送信の間隔(秒)
-my $send_interval = 0.05;
+my $send_interval = 0;
 
 sub make_packet {
     my ($cmd, $sid, $eid, $seqno, $lineno, $text) = @_;
-    return pack("NNNNNN", $cmd, $sid, $eid, $seqno, $lineno, length($text)).$text;
+    my $txt = NKF::nkf("-w", $text);
+    return pack("NNNNNN", $cmd, $sid, $eid, $seqno, $lineno, length($txt)).$txt;
 }
 
+@strarr = ('あいうえお', 'abcdefg', 'ひゃしゃjさいsn', 'さんまんま',
+	   'gongo', '琉球大学', '宜野湾農工大学', 'ほいほい',
+	   '☆ふほほ');
+$strsiz = @strarr;
+
 # パケット送信のトリガー(?)的な意味なので
 # 特に STDIN から拾う必要は無い(多分)
 $selector->can_read(0);
 
 for ($i = 0; $i < $send_count; $i++) {
     # REPcommand を生成
-    my $packet = &make_packet(41, 1, 1, 0, $i, "");
+    my $packet = &make_packet(41, 1, 1, 0, $i, $strarr[$i%$strsiz]);
     syswrite(STDOUT, $packet, length($packet));
     Time::HiRes::sleep($send_interval);
 }