changeset 62:5e44d3723fa9 v20080828-1

*** empty log message ***
author gongo
date Thu, 28 Aug 2008 18:23:27 +0900
parents 2dea55a8d0e4
children 0f7d2aab0e04
files ChangeLog redit-client-sm.el
diffstat 2 files changed, 130 insertions(+), 125 deletions(-) [+]
line wrap: on
line diff
--- 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  <gongo@cr.ie.u-ryukyu.ac.jp>
 
+	* 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)の判定ルーチンを修正してみた。
 
--- 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を名前とした、新しいバッファを開く