# HG changeset patch # User gongo # Date 1219915407 -32400 # Node ID 5e44d3723fa9d734b2cb62f72812979c3df44eee # Parent 2dea55a8d0e4fae1df09e1a4369fd525b56b6ac9 *** empty log message *** diff -r 2dea55a8d0e4 -r 5e44d3723fa9 ChangeLog --- a/ChangeLog Thu Aug 28 17:19:48 2008 +0900 +++ b/ChangeLog Thu Aug 28 18:23:27 2008 +0900 @@ -1,5 +1,19 @@ 2008-08-28 Wataru MIYAGUNI + * redit-client-sm.el (redit-client-process-filter) + (redit-client-exec-insert-line, redit-client-exec-join) + (redit-client-exec-put, redit-client-exec-delete-line): fix + 一斉大編集。 + 今までは各関数内で (redit-get-*-from-pkt ) とかしてたんだけど + それもなんかめんどくさくなったので、 + process-filter で予め cmd 〜 siz, text を取得し、 + 各関数の引数に渡す感じにしました。 + + redit-client-editor-id, redit-client-session-id なんかが + バッファ毎に管理する必要がでて、普通の大域変数へのアクセスだけだと + きつくなってきたのでこういう変更にしました。 + 動いてるのは確認しました。 + * redit-client-sm.el (redit-client-after-change-function): fix 前回(2008-08-27)の判定ルーチンを修正してみた。 diff -r 2dea55a8d0e4 -r 5e44d3723fa9 redit-client-sm.el --- a/redit-client-sm.el Thu Aug 28 17:19:48 2008 +0900 +++ b/redit-client-sm.el Thu Aug 28 18:23:27 2008 +0900 @@ -34,11 +34,15 @@ (defvar redit-client-buffer-number nil "Remote-edit client's buffer-number.") -(defvar redit-client-editor-id "0" - "Remote-edit client's editor-id.") +;; obsolete +;; SessionInfo で管理する +;;(defvar redit-client-editor-id "0" +;;"Remote-edit client's editor-id.") -(defvar redit-client-session-id 0 - "Remote-edit client's session-id.") +;; obsolete +;; SessionInfo で管理する +;;(defvar redit-client-session-id 0 +;;"Remote-edit client's session-id.") ;; editor local sequence number (defvar redit-client-seqno 0 @@ -50,8 +54,8 @@ ;; obsolete ;; Session と繋がっている各バッファで保持する事になったので ;; SessionInfo に持たせている -(defvar redit-client-previous-edited-line 1 - "Current cursor line of remote-edit client.") +;;(defvar redit-client-previous-edited-line 1 +;;"Current cursor line of remote-edit client.") (defvar redit-client-previous-max-line 1 "The max line in the current buffer") @@ -386,15 +390,15 @@ ;; linenumで指定された行の編集をサーバへ送る ;; redit-client-process に insert コマンドと -;; バッファ番号、行番号、行の内容を送り、 Ack を受け取る +;; バッファ(sid)番号、行番号、行の内容を送り、 Ack を受け取る ;; _text が指定されている場合、バッファのlinenumの文字列ではなく ;; _text で指定された文字列を送信する (defun redit-client-insert-line (linenum isnewline &optional _text) (if redit-client-process (save-excursion - (let ((beginp) (endp) (text) (text-size) (packet) (sinfo)) + (let (sinfo packet text text-size) (if (null _text) - (progn + (let (beginp endp) (setq beginp (progn (goto-line linenum) (beginning-of-line) (point))) (setq endp @@ -407,24 +411,21 @@ ))) (setq text _text)) (setq text-size (string-bytes text)) - (setq sinfo (redit-sinfo-get-buf2sinfo (buffer-name))) (if sinfo - (progn - (setq redit-client-session-id (SessionInfo-sid sinfo)) - (setq redit-client-editor-id (SessionInfo-eid sinfo)) - + (let ((sid (SessionInfo-sid sinfo)) + (eid (SessionInfo-eid sinfo)) (packet)) + (setq packet (redit-make-packet - redit-insert-command redit-client-session-id - redit-client-editor-id (gen-seqno) linenum - text-size text)) + redit-insert-command sid eid + (gen-seqno) linenum text-size text)) (process-send-string redit-client-process packet) (redit-debug-message (format "insert-command: %d %d %d %d %d %d %s" - redit-insert-command redit-client-session-id - redit-client-editor-id 0 linenum text-size text)) + redit-insert-command sid eid (gen-seqno) + linenum text-size text)) )) )) (error "redit-client is not running."))) @@ -433,19 +434,25 @@ (defun redit-client-delete-line (linenum) (if redit-client-process (save-excursion - (let (packet) - ;; insert lines on server buffer - (setq packet (redit-make-packet - redit-delete-line-command redit-client-session-id - redit-client-editor-id (gen-seqno) linenum - 5 "55555")) - - (process-send-string redit-client-process packet)) - (redit-debug-message - (format "delete-line-command: %d %d %d %d %d %d %s" - redit-delete-line-command redit-client-session-id - redit-client-editor-id 0 linenum 5 "55555")) - ) + (let (sinfo) + (setq sinfo (redit-sinfo-get-buf2sinfo (buffer-name))) + (if sinfo + (let ((sid (SessionInfo-sid sinfo)) + (eid (SessionInfo-eid sinfo)) (packet)) + ;; insert lines on server buffer + (setq packet (redit-make-packet + redit-delete-line-command sid eid + (gen-seqno) linenum + 5 "55555")) + + (process-send-string redit-client-process packet) + + (redit-debug-message + (format "delete-line-command: %d %d %d %d %d %d %s" + redit-delete-line-command sid eid (gen-seqno) + linenum 5 "55555")) + )) + )) (error "redit-client is not running."))) ;; redit-client-process へcloseコマンドを送る @@ -486,7 +493,7 @@ (remove-hook 'after-change-functions 'redit-client-after-change-function) - (let (command textsize text allsize cursize) + (let (cmd sid eid seq lno siz txt allsize cursize) ;; 前回に余った奴があれば、それを前方追加する (setq string (concat redit-process-filter-resume string)) (setq allsize (length string)) @@ -495,62 +502,64 @@ ;; process-filter が受け取れるのは1024byteまで。 ;; なので、string に入っているパケットが途中で切れてる可能性がある (while (> allsize redit-command-header-size) - (setq command (redit-get-command-from-pkt string)) - (setq textsize (redit-get-text-size-from-pkt string)) + (setq siz (redit-get-text-size-from-pkt string)) ;; ヘッダ (redit-command-header-size) + テキストサイズ - (setq cursize (+ redit-command-header-size textsize)) + (setq cursize (+ redit-command-header-size siz)) ;; パケットが 1024 byte の壁で途切れてる場合、 ;; テキストが読めないので、ループを抜ける (if (> cursize allsize) (return-from loop)) - (let ((command (redit-get-command-from-pkt string))) - ;; command がどの命令かを判断し、対応した処理をする。case みたい - (cond - ;; FIXME - ;;((if (= command redit-open-ack) - ;;(if (/= redit-client-editor-id (redit-get-editor-id-from-pkt string)) - ;;(redit-client-exec-open-ack string)))) + (setq cmd (redit-get-command-from-pkt string)) + (setq sid (redit-get-session-id-from-pkt string)) + (setq eid (redit-get-editor-id-from-pkt string)) + (setq seq (redit-get-sequence-id-from-pkt string)) + (setq lno (redit-get-line-number-from-pkt string)) + (setq txt (redit-get-text-from-pkt string)) + + ;; command がどの命令かを判断し、対応した処理をする。case みたい + (cond + ;; FIXME + ;;((if (= command redit-open-ack) + ;;(if (/= redit-client-editor-id eid) + ;;(redit-client-exec-open-ack string)))) - ((if (= command redit-read-ack) - (if (= redit-client-editor-id (redit-get-editor-id-from-pkt string)) - (redit-client-exec-read-ack string)))) + ;;((if (= cmd redit-read-ack) + ;;(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 (redit-get-editor-id-from-pkt string)) - (redit-client-exec-insert-ack string)))) - - ((if (= command redit-delete-line-ack) - (if (= redit-client-editor-id (redit-get-editor-id-from-pkt string)) - (redit-client-exec-delete-line-ack string)))) + ;;((if (= command redit-insert-ack) + ;;(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string)) + ;;(redit-client-exec-insert-ack string)))) - ((if (= command redit-close-ack) - (if (= redit-client-editor-id (redit-get-editor-id-from-pkt string)) - (redit-client-exec-close-ack string)))) + ;;((if (= command redit-delete-line-ack) + ;;(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string)) + ;;(redit-client-exec-delete-line-ack string)))) - ((if (= command redit-insert-command) - (if (/= redit-client-editor-id (redit-get-editor-id-from-pkt string)) - (redit-client-exec-insert-line string)))) + ;;((if (= command redit-close-ack) + ;;(if (= redit-client-editor-id (redit-get-editor-id-from-pkt string)) + ;;(redit-client-exec-close-ack string)))) - ;; from Session Manager - ;; join ack (editor id) - ((if (= command redit-join-ack-command) - (redit-client-exec-join string))) + ((if (= cmd redit-insert-command) + (redit-client-exec-insert-line sid lno txt))) + + ((if (= cmd redit-join-ack-command) + (redit-client-exec-join txt sid eid))) - ;; put ack (editor id) - ((if (= command redit-put-ack-command) - (redit-client-exec-put string))) + ((if (= cmd redit-put-ack-command) + (redit-client-exec-put sid eid))) + + ((if (= cmd redit-delete-line-command) + (redit-client-exec-delete-line sid lno))) + ) - ;; delete line - ((if (= command redit-delete-line-command) - (if (/= redit-client-editor-id (redit-get-editor-id-from-pkt string)) - (redit-client-exec-delete-line string)))) - ) - - (setq allsize (- allsize cursize)) - ;; string の分割 - (setq string (substring string cursize)))))) + (setq allsize (- allsize cursize)) + ;; string の分割 + (setq string (substring string cursize)) + ) + ) + ) ;; 途切れたやつは次の process-filter の string に入っているので ;; この時点で余った奴を保存し、 @@ -638,9 +647,6 @@ (setq cur-max-line (real-count-lines (point-max))) (setq prev-edit-line (SessionInfo-prevline sinfo)) - (setq redit-client-session-id (SessionInfo-sid sinfo)) - (setq redit-client-editor-id (SessionInfo-sid sinfo)) - ;; 詳しくは ChangeLog [2008-08-28] を見て (if (= redit-client-before-begin-line redit-client-after-end-line) (progn @@ -659,7 +665,7 @@ prev-edit-line redit-client-before-end-line)) (progn - ;; 行の削除による prev-edit のずれを考慮 + ;; 行の削除による prev-edit-line のずれを考慮 (redit-client-insert-line (if (> prev-edit-line redit-client-before-end-line) (- prev-edit-line max-line-diff) prev-edit-line) @@ -703,12 +709,8 @@ ;; 引き数で与えられた string (line_num + text_data) から ;; 指定された行を削除し、そこに text_data を挿入する -(defun redit-client-exec-insert-line (pkt) - (let ((sid (redit-get-session-id-from-pkt pkt)) - (editlineno (redit-get-line-number-from-pkt pkt)) - (text (redit-get-text-from-pkt pkt)) - (curlineno) (bufname) (sinfo)) - +(defun redit-client-exec-insert-line (sid editlineno text) + (let ((curlineno) (bufname) (sinfo)) ;; SessionID から、このテキストを挿入するべき ;; バッファ名を取得する (setq bufname (redit-sinfo-get-sid2buf sid)) @@ -738,21 +740,23 @@ (insert text)))) ;; 引き数 string (line_num + text_data) で指定された行を削除する -(defun redit-client-exec-delete-line (string) - (let ((diff) (linenum (redit-get-line-number-from-pkt string))) - (setq diff (goto-line linenum)) - (if (= diff 0) - (progn - ;; 行頭から末尾までのテキストを削除 - (delete-region (progn (beginning-of-line) (point)) - (progn (end-of-line) (point))) - ;; 指定された行自体を削除 - ;; 指定された行番号は別の行の番号を表すことになる - (if (= (point) (point-max)) - (delete-backward-char 1) - (delete-char 1))) - ) - )) +(defun redit-client-exec-delete-line (sid linenum) + (let ((diff) (bufname (redit-sinfo-get-sid2buf sid))) + (save-excursion + (set-buffer bufname) + (setq diff (goto-line linenum)) + (if (= diff 0) + (progn + ;; 行頭から末尾までのテキストを削除 + (delete-region (progn (beginning-of-line) (point)) + (progn (end-of-line) (point))) + ;; 指定された行自体を削除 + ;; 指定された行番号は別の行の番号を表すことになる + (if (= (point) (point-max)) + (delete-backward-char 1) + (delete-char 1))) + ) + ))) ;; 何用?相手が開いてるファイルを取得するのかな? ;; read みたいなもん? @@ -827,59 +831,46 @@ ;; (kill-all-local-variables)) ;; 引き数で与えられた string から Editor IDを取得する -(defun redit-client-exec-join (string) - (let ((filename) (bufname) (sinfo)) - (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 filename (redit-get-text-from-pkt string)) - +(defun redit-client-exec-join (filename sid eid) + (let ((bufname) (sinfo)) ;; SessionInfo の生成 - (setq sinfo (redit-create-session-info redit-client-session-id - redit-client-editor-id)) + (setq sinfo (redit-create-session-info sid eid)) ;; SessionManager から受け取った、このセッションのファイル名を ;; バッファ名とし、そのバッファを生成する。 (setq bufname (buffer-name (generate-new-buffer filename))) ;; SessionID => BufferName => SessionInfo のテーブル生成 - (redit-sinfo-put-sid2buf redit-client-session-id bufname) + (redit-sinfo-put-sid2buf sid bufname) (redit-sinfo-put-buf2sinfo bufname sinfo) (switch-to-buffer bufname) - (redit-debug-message - (format "join-ack: Session [%d] %s" redit-client-session-id bufname)) - (redit-debug-message - (format "Your editor id = %d" redit-client-editor-id)) + (redit-debug-message (format "join-ack: Session [%d] %s" sid bufname)) + (redit-debug-message (format "Your editor id = %d" eid)) )) ;; //引き数で与えられた string から Session IDを取得する ;; 新仕様で、(put = ファイル有りjoin) ってことになって ;; editor id を返すことになったので、sid と共に eid もセーブする -(defun redit-client-exec-put (string) - (let ((sinfo) (bufname)) - (setq redit-client-editor-id (redit-get-editor-id-from-pkt string)) - (setq redit-client-session-id (redit-get-session-id-from-pkt string)) - +(defun redit-client-exec-put (sid eid) + (let (sinfo bufname) ;; SessionInfo の生成 - (setq sinfo (redit-create-session-info redit-client-session-id - redit-client-editor-id)) + (setq sinfo (redit-create-session-info sid eid)) ;; put (ファイル名付きjoin) を行ったバッファで ;; すでにファイルが開かれている(はずな)ので、それをバッファ名とする (setq bufname (buffer-name)) ;; SessionID => BufferName => SessionInfo のテーブル生成 - (redit-sinfo-put-sid2buf redit-client-session-id bufname) + (redit-sinfo-put-sid2buf sid bufname) (redit-sinfo-put-buf2sinfo bufname sinfo) (switch-to-buffer bufname) - (redit-debug-message - (format "put-ack Session [%d] %s" redit-client-session-id bufname)) - (redit-debug-message - (format "Your editor id = %d" redit-client-editor-id)) + (redit-debug-message (format "put-ack Session [%d] %s" sid bufname)) + (redit-debug-message (format "Your editor id = %d" eid)) )) ;; SessionIDを名前とした、新しいバッファを開く