changeset 72:cd5f16bbd07d

add repcmd
author one
date Sun, 19 Dec 2010 18:02:14 +0900
parents 858af2c8e77e
children a904c41852d9
files redit-client-sm.el
diffstat 1 files changed, 92 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/redit-client-sm.el	Sun Dec 19 14:52:40 2010 +0900
+++ b/redit-client-sm.el	Sun Dec 19 18:02:14 2010 +0900
@@ -178,13 +178,16 @@
 ;; Session Info struct ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;; sid: Session ID
-;; eid: Editor ID
-;; prevline: この Session に対応するバッファで最後に編集された行
-;; send_cmdlist: rep_command list from user to SessionManager
-;; recv_cmdlist: rep_command list from SessionManager to user
-(defstruct SessionInfo "a" (sid nil) (eid nil) (prevline 1)
-  (send_cmdlist nil) (recv_cmdlist nil)
+
+(defstruct SessionInfo 
+";; sid: Session ID
+ ;; eid: Editor ID
+ ;; prevline: この Session に対応するバッファで最後に編集された行
+ ;; send_cmdlist: rep_command list from user to SessionManager
+ ;; recv_cmdlist: rep_command list from SessionManager to user
+ ;; quit: quit status null or "
+  (sid nil) (eid nil) (prevline 1)
+  (send_cmdlist nil) (recv_cmdlist nil) (quit nil)
 )
 
 ;; create and initialize
@@ -503,6 +506,27 @@
   ))
 )
 
+(defun redit-client-forward-command (command)
+ "forward command to the session editor"
+  (enqueue redit-client-command-queue command)
+  (redit-client-send-command-queue redit-client-command-queue)
+  )
+
+(defun redit-client-send-command (command)
+"send command to the session editor"
+(let (new-command (concat command "")
+		  (sinfo (redit-sinfo-get-buf2sinfo (buffername)))
+		  (sid (SessionInfo-sid sinfo))
+		  (eid (SessionInfo-eid sinfo))
+		  (seq (gen-seqno)))
+  (store-substring new-command (redit-command-offset-sid (redit-pack-int sid)))
+  (store-substring new-command (redit-command-offset-eid (redit-pack-int eid)))
+  (store-substring new-command (redit-command-offset-seq (redit-pack-int seq)))
+  (enqueue redit-client-command-queue new-command)
+  (redit-client-send-command-queue redit-client-command-queue)
+  )
+)
+
 ;; proc == redit-client-process
 ;; string == redit-client-process からの output
 (defun redit-client-process-filter (proc string)
@@ -512,10 +536,11 @@
   (remove-hook 'after-change-functions
 	       'redit-client-after-change-function)
     
-  (let (cmd sid eid seq lno siz txt allsize cursize)
+  (let (cmd sid eid seq lno siz txt allsize cursize sinfo)
     ;; 前回に余った奴があれば、それを前方追加する
     (setq string (concat redit-process-filter-resume string))
     (setq allsize (length string))
+    (setq sinfo (redit-sinfo-get-buf2sinfo (buffername))) 
     
     (block loop
       ;; process-filter が受け取れるのは1024byteまで。
@@ -539,18 +564,72 @@
 	
 	;; command がどの命令かを判断し、対応した処理をする。case みたい
 	(cond
-	 ((if (= cmd repcmd-insert)
+	 ((= cmd repcmd-insert)
 	      (redit-client-exec-insert sid lno txt)
-	    ))
-	 ((if (= cmd repcmd-delete)
+	    )
+	 ((= cmd repcmd-delete)
 	      (redit-client-exec-delete sid lno)
-	    ))
+	    )
+
+	 ((or (= cmd repcmd-nop)
+	      (= cmd repcmd-merge-mark)
+	      (= cmd repcmd-insert-ack)
+	      (= cmd repcmd-delete-ack))
+	  (forward-command string))
+	 ((or (= cmd repcmd-close)
+	      (= cmd repcmd-close-2)
+	      t))
+	 ((= cmd smcmd-quit)
+	  (if (eq eid (SessionInfo-eid sinfo))
+	      (setf (SessionInfo-quit (redit-make-pkt smcmd-quit-2 (SessionInfo-sid sinfo) -1 (gen-seqno) 0 )))
+	    (setf (SessionInfo-quit string))))
+	 ;; timeout=1;
+	 ;; // stop input processing after this command
+	 ;; cmds.clear();
+	 ;; break;
+	 ((if (= cmd smcmd-start-merge )
+	 ;; // lock user input during merge (optional)
+	 ;; inputLock = hasInputLock;
+	 ;; cmd.cmd = REP.SMCMD-START-MERGE_ACK;
+	 ;; ns.writeLog("BeforeMerge "+text);
+	 ;; sendCommand(cmd);
+	 ;; break;
+	 ((if (= cmd smcmd-end-merge )
+	 ;; inputLock = false;
+	 ;; ns.writeLog("AfterMerge "+text);
+	 ;; break;
+	 ;; // master editor changes QUIT-2 to QUIT-2-ACK
+	 ;; // Session manager should do this
+	 ((if (= cmd smcmd-quit-2 )
+	 ;; if (cmd.eid!=eid) {
+	 ;; forwardCommand(cmd);
+	 ;; } else {
+	 ;; cmd.cmd = REP.SMCMD_QUIT_2_ACK;
+	 ;; sendCommand(cmd);
+	 ;; }
+	 ;; running = false;
+	 ;; dumpText();
+	 ;; break;
+	 ((if (= cmd smcmd-sync)
+	 ;; // start contents sync with newly joined editor
+	 ;; cmd.cmd = REP.SMCMD-SYNC-ACK;
+	 ;; forwardCommand(cmd);
+	 ;; //if (cmd.eid==eid) {
+	 ;; if (master && syncEnable ) {
+	 ;; syncCounter = 1;
+	 ;; timeout = 1;
+	 ;; }
+
+
 	 ((if (= cmd smcmd-join-ack)
 	      (redit-client-exec-join txt sid eid)))
 	   
 	 ((if (= cmd smcmd-put-ack)
 	      (redit-client-exec-put sid eid)))
-	 )
+	 ((if (= cmd smcmd-quit ) 
+	      (progn)
+	 ((if
+
 
 	(setq allsize (- allsize cursize))
 	;; string の分割