changeset 53:0b7ba6b2a0f9

*** empty log message ***
author gongo
date Tue, 26 Aug 2008 17:26:13 +0900
parents 769ebe87cd5a
children 9620bf594a88
files test/session-info/README test/session-info/redit-test-change-session.el
diffstat 2 files changed, 103 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/test/session-info/README	Tue Aug 26 15:19:34 2008 +0900
+++ b/test/session-info/README	Tue Aug 26 17:26:13 2008 +0900
@@ -1,2 +1,40 @@
-ここはまだできてないので
-動いてないと思います
\ No newline at end of file
+/**
+ * $Id$
+ */
+
+編集したバッファによって、対応する SessionInfo を呼び出す
+
+
+--------
+- 状況 -
+--------
+
+Session と emacs Buffer を一対一の関係にするっつーことで、
+バッファに対応する SessionInfo を生成した。これは
+
+SessionID, EditorID, Send Command List, Recv Command List
+
+で構成されている。
+
+--------
+- 流れ -
+--------
+
+1. ユーザが編集をおこなった
+2. そのバッファ名から、対応する SessionInfo を hash table より取得
+3. SessionInfo から sid, eid を取り出す
+
+4. 本番だと、その sid, eid を REPcommand に含めて SessionManager に送信
+
+まあ簡単ですねきっと
+
+---------
+- Usage -
+---------
+
+1. emacs を起動
+2. M-x load-file [Enter] で redit-test-change-session.el を指定する
+3. M-x redit-test-start で起動
+   このとき、バッファに hoge.c hoge.c<2> hoge.c<3> という3つのバッファができる
+   各バッファで編集を行うと、そのバッファに対応する sid eid が
+   *Messages* に表示される。対応する様子は .el を見てください。
--- a/test/session-info/redit-test-change-session.el	Tue Aug 26 15:19:34 2008 +0900
+++ b/test/session-info/redit-test-change-session.el	Tue Aug 26 17:26:13 2008 +0900
@@ -48,37 +48,81 @@
   (send_cmdlist nil) (recv_cmdlist nil))
 
 ;; create and initialize
-(defun test-redit-create-session-info (sid eid)
+(defun redit-test-create-session-info (sid eid)
   (make-SessionInfo :sid sid
 		    :eid eid
 		    :send_cmdlist (make-Queue)
 		    :recv_cmdlist (make-Queue)))
 
-(defun test-redit-get-session-id-from-session-info (sinfo)
+(defun redit-test-get-session-id-from-session-info (sinfo)
   (SessionInfo-sid sinfo))
-(defun test-redit-get-editor-id-from-session-info (sinfo)
+(defun redit-test-get-editor-id-from-session-info (sinfo)
   (SessionInfo-eid sinfo))
-(defun test-redit-get-sendqueue-from-session-info (sinfo)
+(defun redit-test-get-sendqueue-from-session-info (sinfo)
   (SessionInfo-send_cmdlist sinfo))
-(defun test-redit-get-recvqueue-from-session-info (sinfo)
+(defun redit-test-get-recvqueue-from-session-info (sinfo)
   (SessionInfo-recv_cmdlist sinfo))
 
 
 ;; hash table of SessionInfo
 
-(defvar bufname-to-sid-table (make-hash-table))
-(defvar sid-to-session-table (make-hash-table))
+(defvar htable-sid2bufname (make-hash-table))
+(defvar htable-bufname2sinfo (make-hash-table))
+
+(defun redit-test-sinfo-add-sid2buf (sid bufname)
+  (setf (gethash sid htable-sid2bufname) bufname))
+(defun redit-test-sinfo-get-sid2buf (sid)
+  (gethash sid htable-sid2bufname))
+(defun redit-test-sinfo-rm-sid2buf (sid)
+  (remhash sid htable-sid2bufname))
+
+(defun redit-test-sinfo-add-buf2sinfo (bufname sinfo)
+  (setf (gethash bufname htable-bufname2sinfo) sinfo))
+(defun redit-test-sinfo-get-buf2sinfo (bufname)
+  (gethash bufname htable-bufname2sinfo))
+(defun redit-test-sinfo-rm-buf2sinfo (bufname)
+  (remhash bufname htable-bufname2sinfo))
+
+;; バッファを3つ作り、それぞれに対応する SessionInfo を登録する
+(defun redit-test-start ()
+  (interactive)
+  (let ((sinfo1 (redit-test-create-session-info 0 1)) ;; sid = 0, eid = 1
+	(sinfo2 (redit-test-create-session-info 3 8)) ;; sid = 3, eid = 8
+	(sinfo3 (redit-test-create-session-info 102 12)) ;; sid = 102, eid = 12
+	(bufname))
+
+    ;; hoge.c sid = 0 eid = 1
+    (setq bufname (buffer-name (generate-new-buffer "hoge.c")))
+    (redit-test-sinfo-add-sid2buf 0 bufname)
+    (redit-test-sinfo-add-buf2sinfo bufname sinfo1)
 
-(defun test-redit-sinfo-add-buf2sid (bufname sid)
-  (setf (gethash bufname bufname-to-sid-table) sid))
-(defun test-redit-sinfo-get-buf2sid (bufname)
-  (gethash bufname bufname-to-sid-table))
-(defun test-redit-sinfo-rm-buf2sid (bufname)
-  (remhash bufname bufname-to-sid-table))
+    ;; hoge.c<2> sid = 3 eid = 8
+    (setq bufname (buffer-name (generate-new-buffer "hoge.c")))
+    (redit-test-sinfo-add-sid2buf 3 bufname)
+    (redit-test-sinfo-add-buf2sinfo bufname sinfo2)
+
+    ;; hoge.c<3> sid = 102 eid = 12
+    (setq bufname (buffer-name (generate-new-buffer "hoge.c")))
+    (redit-test-sinfo-add-sid2buf 102 bufname)
+    (redit-test-sinfo-add-buf2sinfo bufname sinfo3)
+
+    (add-hook 'before-change-functions
+	      'redit-test-before-change-function t)))
 
-(defun test-redit-sinfo-add-sid2sinfo (sid eid sinfo)
-  (setf (gethash sid sid-to-session-table) sinfo))
-(defun test-redit-sinfo-get-sid2sinfo (sid)
-  (gethash sid sid-to-session-table))
-(defun test-redit-sinfo-rm-sid2sinfo (sid)
-  (remhash sid sid-to-session-table))
+(defun redit-test-stop ()
+  (interactive)
+  (remove-hook 'before-change-functions
+	       'redit-test-before-change-function))
+
+;; 編集が行われた時に呼び出される。
+;; そのバッファ名から SessionInfo を hash table から取得し、
+;; 取得した SessionInfo から sid, eid を読み取り出力する
+(defun redit-test-before-change-function (begin end)
+  (let ((sinfo) (sid) (eid) (bufname (buffer-name)))
+    (setq sinfo (redit-test-sinfo-get-buf2sinfo bufname))
+    (if sinfo
+	(progn
+	  (setq sid (SessionInfo-sid sinfo))
+	  (setq eid (SessionInfo-eid sinfo))
+	  (message (format "sid = %d, eid = %d\n" sid eid)))
+    )))
\ No newline at end of file