# HG changeset patch # User one # Date 1292749334 -32400 # Node ID cd5f16bbd07dfc01d88dc420bb9b2798e2280c12 # Parent 858af2c8e77eebc7276236974390f7086e2df08e add repcmd diff -r 858af2c8e77e -r cd5f16bbd07d redit-client-sm.el --- 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 の分割