# HG changeset patch # User gongo # Date 1219482686 -32400 # Node ID 8d73102deff67357f8bce154cdfb9d87defaf14f # Parent 1d131b6064aedb02ece60f191d07a9f3631afae9 *** empty log message *** diff -r 1d131b6064ae -r 8d73102deff6 redit-client-sm.el --- 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))