changeset 48:8d73102deff6

*** empty log message ***
author gongo
date Sat, 23 Aug 2008 18:11:26 +0900
parents 1d131b6064ae
children c3634084508d
files redit-client-sm.el
diffstat 1 files changed, 61 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/redit-client-sm.el	Sat Aug 23 17:47:10 2008 +0900
+++ b/redit-client-sm.el	Sat Aug 23 18:11:26 2008 +0900
@@ -63,7 +63,7 @@
   "String of the unprocessing in redit-client-process-filter")
 
 ;; REP が使用する文字コード
-(defconst rep-string-encoding 'utf-8)
+(defconst redit-string-coding 'utf-8)
 
 ;; port
 (defconst redit-process-port 8766)
@@ -104,6 +104,7 @@
 (defconst redit-quit-command           53)
 (defconst redit-quit-ack-command       54)
 
+
 ;;;;;;;;;;;;;;;;;;
 ;; Queue struct ;;
 ;;;;;;;;;;;;;;;;;;
@@ -190,7 +191,6 @@
 (defun redit-get-session-info-from-sid-table (sid)
   (gethash sid sid-to-session-table))
 
-
 ;;;;;;;;;;;;;;;;;;;
 ;; pack / unpack ;;
 ;;;;;;;;;;;;;;;;;;;
@@ -220,6 +220,37 @@
   (redit-unpack-int-loop pkt (* pos 4) 4))
 
 
+;; binary この時点では、pkt は binary 形式なので
+;; substring でも抽出できる。。。ってことかな(何
+;; utf-8 とかで decode されていれば多分出来ないはず
+;; (length "あいうえお") => 5
+;; (string-bytes "あいうえお") => 15 (utf-8の場合)
+(defun redit-unpack-str (pkt pos length)
+  (substring pkt (* pos 4) (+ (* pos 4) length)))
+
+(defun redit-make-packet (cmd sid eid seq lno siz text)
+  (concat (redit-pack cmd sid eid seq lno siz) text))
+
+(defun redit-get-command-from-pkt (pkt)
+  (redit-unpack-int pkt 1))
+(defun redit-get-session-id-from-pkt (pkt)
+  (redit-unpack-int pkt 2))
+(defun redit-get-editor-id-from-pkt (pkt)
+  (redit-unpack-int pkt 3))
+(defun redit-get-sequence-id-from-pkt (pkt)
+  (redit-unpack-int pkt 4))
+(defun redit-get-line-number-from-pkt (pkt)
+  (redit-unpack-int pkt 5))
+(defun redit-get-text-size-from-pkt (pkt)
+  (redit-unpack-int pkt 6))
+
+;; text のサイズが指定されていればそれを使い、
+;; そうでなければ、get-text-size-from-pkt を実行する
+(defun redit-get-text-from-pkt (pkt &optional _siz)
+  (let (size)
+    (setq size (if (null _siz) (redit-get-text-size-from-pkt pkt) _siz))
+    (decode-coding-string (redit-unpack-str pkt 6 size) redit-string-coding)))
+
 ;;;;;;;;;;;;;;;;;;
 ;; User Command ;;
 ;;;;;;;;;;;;;;;;;;
@@ -230,7 +261,7 @@
   (let (bufname)
     (setq bufname (encode-coding-string
 		   (buffer-name)
-		   rep-string-encoding))
+		   redit-string-coding))
 
     (if redit-client-process
 	(progn
@@ -248,8 +279,8 @@
     ;; called when the process receive packet
     (set-process-filter redit-client-process 'redit-client-process-filter)
     
-    ;; //Code of the process input/output buffer is rep-string-encoding
-    ;; //(set-process-coding-system redit-client-process rep-string-encoding rep-string-encoding)
+    ;; //Code of the process input/output buffer is redit-string-coding
+    ;; //(set-process-coding-system redit-client-process redit-string-coding redit-string-coding)
     ;; 送受信するデータはバイナリで貰わないといけない。
     ;; utf-8 じゃなくてずれる可能性があるので
     (set-process-coding-system redit-client-process 'binary 'binary)
@@ -346,7 +377,7 @@
 		   (progn (goto-line linenum) (end-of-line) (point)))
 	     (setq text
 		   (encode-coding-string
-		    (buffer-substring beginp endp) rep-string-encoding))
+		    (buffer-substring beginp endp) redit-string-coding))
 	     (setq length (string-bytes text))
 	     
 	     ;;(setq packet (concat (redit-pack redit-insert-command
@@ -451,8 +482,8 @@
       ;; process-filter が受け取れるのは1024byteまで。
       ;; なので、string に入っているパケットが途中で切れてる可能性がある
       (while (> allsize redit-command-header-size)
-	(setq command (rep-get-command-from-pkt string))
-	(setq textsize (rep-get-text-size-from-pkt string))
+	(setq command (redit-get-command-from-pkt string))
+	(setq textsize (redit-get-text-size-from-pkt string))
 	
 	;; ヘッダ (redit-command-header-size) + テキストサイズ
 	(setq cursize (+ redit-command-header-size textsize))
@@ -461,32 +492,32 @@
 	;; テキストが読めないので、ループを抜ける
 	(if (> cursize allsize) (return-from loop))
 
-	(let ((command (rep-get-command-from-pkt string)))
+	(let ((command (redit-get-command-from-pkt string)))
 	  ;; command がどの命令かを判断し、対応した処理をする。case みたい
 	  (cond 
 	   ;; FIXME
 	   ;;((if (= command redit-open-ack)
-	   ;;(if (/= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+	   ;;(if (/= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 	   ;;(redit-client-exec-open-ack string))))
 
 	   ((if (= command redit-read-ack)
-		(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+		(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 		    (redit-client-exec-read-ack string))))
 	   
 	   ((if (= command redit-insert-ack)
-		(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+		(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 		    (redit-client-exec-insert-ack string))))
 	   
 	   ((if (= command redit-delete-line-ack)
-		(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+		(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 		    (redit-client-exec-delete-line-ack string))))
 	   
 	   ((if (= command redit-close-ack)
-		(if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+		(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 		    (redit-client-exec-close-ack string))))
 	   
 	   ((if (= command redit-insert-command)
-		(if (/= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+		(if (/= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 		    (redit-client-exec-insert-line string))))
 	   
 	   ;; from Session Manager
@@ -500,7 +531,7 @@
 
 	   ;; delete line
 	   ((if (= command redit-delete-line-command)
-		(if (/= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+		(if (/= redit-client-editor-id (redit-get-editor-id-from-pkt string))
 		    (redit-client-exec-delete-line string))))
 	   )
 
@@ -615,8 +646,8 @@
 ;; 引き数で与えられた string (line_num + text_data) から
 ;; 指定された行を削除し、そこに text_data を挿入する
 (defun redit-client-exec-insert-line (string)
-  (let ((linenum (rep-get-line-number-from-pkt string)) ;; 行番号
-	(text (rep-get-text-from-pkt string))) ;; テキストデータ
+  (let ((linenum (redit-get-line-number-from-pkt string)) ;; 行番号
+	(text (redit-get-text-from-pkt string))) ;; テキストデータ
     (if (< (real-count-lines (point-max)) linenum)
 	(progn
 	  (call-interactively 'end-of-buffer) (newline)))
@@ -628,7 +659,7 @@
 
 ;; 引き数 string (line_num + text_data) で指定された行を削除する
 (defun redit-client-exec-delete-line (string)
-  (let ((linenum (rep-get-line-number-from-pkt string)))
+  (let ((linenum (redit-get-line-number-from-pkt string)))
     (goto-line linenum)
     ;; 行頭から末尾までのテキストを削除
     (delete-region (progn (beginning-of-line) (point))
@@ -645,12 +676,12 @@
 ;; 引き数 string (buf_num + line_num + text_data) 
 ;;(defun redit-client-exec-open-ack (string)
 ;;  (save-excursion
-;;    (let ((bufnum (rep-get-editor-id-from-pkt string))
-;;	  (linenum (rep-get-line-number-from-pkt string)))
+;;    (let ((bufnum (redit-get-editor-id-from-pkt string))
+;;	  (linenum (redit-get-line-number-from-pkt string)))
 ;;      (make-variable-buffer-local 'redit-client-buffer-name)
 ;;      (make-variable-buffer-local 'redit-client-editor-id)
 ;;      (setq redit-client-buffer-name
-;;	    (rep-get-text-from-pkt string))
+;;	    (redit-get-text-from-pkt string))
 ;;      (setq redit-client-buffer (get-buffer-create redit-client-buffer-name))
 ;;      ;; プロセスとバッファを関連づける
 ;;      (set-process-buffer redit-client-process redit-client-buffer)
@@ -682,26 +713,26 @@
 ;; text_data を挿入する
 (defun redit-client-exec-read-ack (string)
   (save-excursion
-    (let ((lines (rep-get-line-number-from-pkt string)))
+    (let ((lines (redit-get-line-number-from-pkt string)))
       ;; redit-client-buffer をカレントバッファにする
       (set-buffer redit-client-buffer)
       (goto-line lines)
       (beginning-of-line) ;; 行の始めへ移動
       ;;      (delete-region (progn (beginning-of-line) (point))
       ;; 		     (progn (end-of-line) (point)))
-      (insert (rep-get-text-from-pkt string))))) ;; テキストデータを挿入
+      (insert (redit-get-text-from-pkt string))))) ;; テキストデータを挿入
 
 ;; redit-client-line-max-in-server に行番号を入れてる(だけ)
 (defun redit-client-exec-insert-ack (string)
   (save-excursion
     (set-buffer redit-client-buffer)
-    (let ((linenum (rep-get-line-number-from-pkt string )))
+    (let ((linenum (redit-get-line-number-from-pkt string )))
       (setq redit-client-line-max-in-server linenum))))
 
 (defun redit-client-exec-delete-line-ack (string)
   (save-excursion
     (set-buffer redit-client-buffer)
-    (let ((linenum (rep-get-line-number-from-pkt string)))
+    (let ((linenum (redit-get-line-number-from-pkt string)))
       (setq redit-client-line-max-in-server linenum))))
 
 ;; プロセスとバッファ、ローカル変数を削除する
@@ -715,8 +746,8 @@
 ;; 引き数で与えられた string から Editor IDを取得する
 (defun redit-client-exec-join (string)
   (let (sinfo)
-    (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
-    (setq redit-client-session-id (rep-get-session-id-from-pkt string))
+    (setq redit-client-editor-id (redit-get-editor-id-from-pkt string))
+    (setq redit-client-session-id (redit-get-session-id-from-pkt string))
   
     (setq sinfo (redit-create-session-info redit-client-editor-id))
     (redit-set-session-info-to-sid-table redit-client-session-id sinfo)
@@ -734,8 +765,8 @@
 ;; editor id を返すことになったので、sid と共に eid もセーブする
 (defun redit-client-exec-put (string)
   (let (sinfo)
-    (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
-    (setq redit-client-session-id (rep-get-session-id-from-pkt string))
+    (setq redit-client-editor-id (redit-get-editor-id-from-pkt string))
+    (setq redit-client-session-id (redit-get-session-id-from-pkt string))
 
     (setq sinfo (redit-create-session-info redit-client-editor-id))
     (redit-set-session-info-to-sid-table redit-client-session-id sinfo)
@@ -766,42 +797,6 @@
   "generate editor local sequence number."
   (setq redit-client-seqno (+ redit-client-seqno 1)))
 
-(defun redit-make-packet (cmd sid eid seq lno siz text)
-  (concat (redit-pack cmd sid eid seq lno siz) text))
-
-(defun rep-get-command-from-pkt (pkt)
-  (redit-unpack-int pkt 1))
-(defun rep-get-session-id-from-pkt (pkt)
-  (redit-unpack-int pkt 2))
-(defun rep-get-editor-id-from-pkt (pkt)
-  (redit-unpack-int pkt 3))
-(defun rep-get-sequence-id-from-pkt (pkt)
-  (redit-unpack-int pkt 4))
-(defun rep-get-line-number-from-pkt (pkt)
-  (redit-unpack-int pkt 5))
-(defun rep-get-text-size-from-pkt (pkt)
-  (redit-unpack-int pkt 6))
-
-;; コマンド後ろにあるテキストは
-;;   (substring packet 24)
-;; でとれるので、text-size は要らない、とうれしい。
-;; が、(通信テストまだなので)例えば連続してパケットが送られて来たとき
-;; そのパケットが繋がってしまうと駄目。
-;; もし、process-filter が、一つのパケットの処理が終わるまで
-;; 後続のパケットを止めててくれるならこれでいけるが。
-;; 念のため、受け取った text-size と比較して
-;; 同じならおk、だめならそのサイズ分だけ取る、って所か。
-;; 最初からサイズ分だけでいいんじゃね?と思ったりもするが。
-;; あと、現時点ではサイズが違う(失敗)時の処理いれてない。
-(defun rep-get-text-from-pkt (pkt)
-  (let ((size) (text))
-    (setq size (rep-get-text-size-from-pkt pkt))
-    (setq text (substring pkt 24))
-    (decode-coding-string text rep-string-encoding)))
-    ;;(if (= size (string-bytes text)) text
-    ;;(decode-coding-string (apply 'concat (split-string text "\xe3"))
-    ;;rep-string-encoding))))
-
 (defun redit-line-translate-out (cque rque)
   "redit line translate for output"
   (let ((cc) (rc) (xcc) (xrc) (ccc) (crc) (cignore 0) (rignore 0))