changeset 25:2d27043cb96b first-connection

First connection to REP session manager.
author kono
date Sun, 26 Oct 2008 17:39:37 +0900
parents e7d30a296a9b
children 7101f8c1fa21
files src/reditor.c src/reditor.h
diffstat 2 files changed, 141 insertions(+), 116 deletions(-) [+]
line wrap: on
line diff
--- a/src/reditor.c	Wed Sep 24 21:22:42 2008 +0900
+++ b/src/reditor.c	Sun Oct 26 17:39:37 2008 +0900
@@ -34,7 +34,6 @@
 
 static int rep_connect(char *host);
 
-static void* rep_alloc(int size);
 static void rep_free(void *obj);
 
 static BUFTYPE* get_buf_by_name(char *name);
@@ -68,14 +67,14 @@
 static unsigned int get_header(char *buf,int offset);
 static int set_header(unsigned int num, char *pkt, int offset);
 
-static int rep_exe_cmd(unsigned int cmd,
+static int rep_exe_cmd(rep_cmd *command, unsigned int cmd,
                        unsigned int sid,
                        unsigned int eid,
                        unsigned int seq,
                        unsigned int lnum,
                        unsigned int textsize,
                        char *text);
-static int rep_exe_pkt(char *pkt);
+static int rep_exe_pkt(rep_cmd *command, char *pkt);
 static int rep_exe_pktlist(rep_cmdlist *cmdlist);
 
 static int rep_recv_cmds(int fd, rep_cmdlist *smcmdlist,rep_cmdlist *txtcmdlist);
@@ -339,12 +338,17 @@
     g_rep.seqno = 0;
     
     g_rep.permit = FALSE;
-    
+   
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 255
+#endif
+    g_rep.hostname = (char *)malloc(HOST_NAME_MAX);
     if (gethostname(g_rep.hostname, sizeof(g_rep.hostname)) < 0) {
         strncpy(g_rep.hostname, def_hostname, sizeof(def_hostname)+1);
     }
+    g_rep.nop = make_cmd(REPCMD_NOP, 0, 0, 0, 0, "");
     
-    return(TRUE);
+    return TRUE;
 }
 
 
@@ -447,12 +451,12 @@
     char *sname;
     int namelen = strlen(name)+1;
     
-    s = (Session*)rep_alloc(sizeof(Session));
+    s = (Session*)malloc(sizeof(Session));
     if (s == NULL) {
         return(NULL);
     }
     
-    if ((sname = (char*)rep_alloc(namelen)) == NULL) {
+    if ((sname = (char*)malloc(namelen)) == NULL) {
         return NULL;
     }
     strncpy(sname,name,namelen);
@@ -594,7 +598,7 @@
     rep->smfd = sock;
     rep->permit = TRUE;
     
-    add_cmd_to_list(&cmdlist, make_cmd(REP_JOIN_CMD, 0, rep->eid, rep->seqno++, 0, "bufname"));
+    add_cmd_to_list(&cmdlist, make_cmd(SMCMD_JOIN, 0, rep->eid, rep->seqno++, 0, ""));
     rep_send_cmds(sock, &cmdlist);
 
     free_cmdlist(&cmdlist);
@@ -631,10 +635,10 @@
         rep_free(rep->waiting_session_name);
     }
     len = strlen(sname) +1;
-    rep->waiting_session_name = (char *)rep_alloc(len);
+    rep->waiting_session_name = (char *)malloc(len);
     memcpy(rep->waiting_session_name, sname, len);
         
-    add_cmd_to_list(&cmdlist, make_cmd(REP_PUT_CMD, 0, rep->eid, rep->seqno++, 0, sname));
+    add_cmd_to_list(&cmdlist, make_cmd(SMCMD_PUT, 0, rep->eid, rep->seqno++, 0, sname));
 
     rep_send_cmds(rep->smfd, &cmdlist);
 
@@ -657,7 +661,7 @@
         return FALSE;
     }
     
-    cmd = make_cmd(REP_DEREGISTER_CMD, sn->sid, rep->eid, rep->seqno, 0, NULL);
+    cmd = make_cmd(REPCMD_CLOSE, sn->sid, rep->eid, rep->seqno, 0, NULL);
     add_cmd_to_list(&cmdlist, cmd);
     rep_send_cmds(rep->smfd, &cmdlist);
     free_cmdlist(&cmdlist);
@@ -669,18 +673,6 @@
 
 /* Session End */
 
-static void *
-rep_alloc(size)
-    int size;   /* byte */
-{
-    void *allocated;
-    if ((allocated = malloc(size)) == NULL) {
-        e_msg_wrp("no memory!");
-    }
-
-    return allocated;
-}
-
 static void
 rep_free(obj)
     void *obj;
@@ -745,7 +737,7 @@
 
     if (text) len = strlen(text);// + 1; /* for include '\0' */
 
-    if ((packet = (char *)rep_alloc(REP_HEADER_SIZE+len)) == NULL) {
+    if ((packet = (char *)malloc(REP_HEADER_SIZE+len)) == NULL) {
         return(NULL);
     }
     
@@ -783,7 +775,7 @@
         return(NULL);
     }
 
-    cmd_p = (rep_cmd*)rep_alloc(sizeof(rep_cmd));
+    cmd_p = (rep_cmd*)malloc(sizeof(rep_cmd));
     if (cmd_p == NULL) {
         e_msg_wrp("make_cmd: no memory: ERROR");
         return(NULL);
@@ -802,7 +794,6 @@
     cmd_p->len  = length;
     cmd_p->lnum = lnum;
     
-    cmd_p->stat = REP_AVAIL;
     cmd_p->pkt  = pkt;
 
     return(cmd_p);
@@ -900,14 +891,14 @@
     cursn->prevline=lnum;
     if (xtr<0) {
 	// ml_delete case
-	cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
+	cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
 	rep_send_cmd(rep->smfd,cmd);
 	rep_free(cmd);
     } else if (xtr==0) {
 	// ml_replace case
 	if (cursn->del_cmd) 
 	    return;       // already line saved do nothing
-	cursn->del_cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
+	cursn->del_cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
 	
     } else {
 	// ml_append case
@@ -945,7 +936,7 @@
     
 	for(i=lnum;i<lnume;i++) {
 	    // make INSERT_CMD for insert or changed lines if any
-	    cmd = make_cmd(REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, i+1, get_memline_wrp(cursn->buf, i+1));
+	    cmd = make_cmd(REPCMD_INSERT, cursn->sid, rep->eid, rep->seqno++, i+1, get_memline_wrp(cursn->buf, i+1));
 	    add_cmd_to_list(&(cursn->new_cmdlist), cmd);
 	}
 	cursn->prevline=-1;
@@ -965,12 +956,12 @@
 	cursn->prevline = lnum;
 
 	// send saved new line as INSERT command
-	cmd = make_cmd(REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
+	cmd = make_cmd(REPCMD_INSERT, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
 	rep_send_cmd(rep->smfd,cmd);
 	rep_free(cmd);
 
 	// save current line for next replace
-	cursn->del_cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
+	cursn->del_cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum));
     }
 
 }
@@ -1007,9 +998,57 @@
 	return(header);
 }
 
+/*
+     REP command packet flow
+
+     Own change
+
+     CMD ------>  session manager
+                  session manager <--- CMD   command return
+         <------  MERGE_START (block user input)
+         <------  Merge fix from session manager
+     CMD ------>  session manager        return same command as ack
+         <------  MERGE_END              command return
+                              (enable user input)
+
+                  session manager <--- CMD   incomming external command 
+     NOP ------>  session manager        if we have sent any command
+     CMD ------>  session manager        return same command as ack
+
+ */
+
+static void
+forwardCommand(rep_T *rep, rep_cmd *command)
+{
+    int fd = rep->smfd;
+    writen(fd,command->pkt,command->len+REP_HEADER_SIZE);
+}
+
+static void
+incrementSeq(rep_T *rep)
+{
+    rep->seqno++;
+}
+
+static void
+addNop(Session *session, rep_T *rep) 
+{
+    int fd = rep->smfd;
+    char *packet = rep->nop->pkt;
+
+    if (rep->prevSeq==rep->seqno) {
+	set_header(session->sid, packet, REP_SID_OFFSET);
+	set_header(rep->eid, packet, REP_EID_OFFSET);
+	set_header(rep->seqno,  packet, REP_SEQNUM_OFFSET);
+	rep->prevSeq = rep->seqno;
+	incrementSeq(rep);
+	writen(fd,rep->nop->pkt,rep->nop->len+REP_HEADER_SIZE);
+    }
+}
 
 static int
-rep_exe_cmd(cmd, sid, eid, seq, lnum, textsize, text)
+rep_exe_cmd(command, cmd, sid, eid, seq, lnum, textsize, text)
+    rep_cmd *command;
     unsigned int cmd;
     unsigned int sid;
     unsigned int eid;
@@ -1018,14 +1057,13 @@
     unsigned int textsize;
     char *text;
 {
-    rep_cmdlist tmplist = {NULL, 0};
     rep_T *rep = get_rep();
     Session *session;
     
     session = find_session_by_id(sid);
 
     switch (cmd) {
-    case REP_JOIN_ACK:
+    case SMCMD_JOIN_ACK:
         /* show session lineup */
         if (rep->slineup) {
             free_session(rep->slineup);
@@ -1038,11 +1076,9 @@
         rep_start_create_cmds();
         update_screen_now_wrp();
 
-        if (rep->eid == 0) {
-            rep->eid = eid;
-        }
+	rep->eid = eid;
         break;
-    case REP_PUT_ACK:
+    case SMCMD_PUT_ACK:
         /* Enter Session */
 
         if (text) {  // text is error message.
@@ -1063,26 +1099,37 @@
         /* set session to cursession */
         set_cursession(session);
         rep_start_create_cmds();
-        
         break;
-    case REP_INSERT_CMD:
+    case REPCMD_INSERT:
         append_memline_wrp(lnum, text);
+	if (eid!=MERGE_EID) addNop(session, rep);
+	forwardCommand(rep,command);
         break;
-    case REP_DELETE_LINE_CMD:
+    case REPCMD_DELETE:
         delete_memline_wrp(lnum);
+    case REPCMD_NOP:
+	if (eid!=MERGE_EID) addNop(session, rep);
+	forwardCommand(rep,command);
         break;
+    case SMCMD_SYNC:
+        break;
+    case SMCMD_QUIT:
+	forwardCommand(rep,command);
+        break;
+    case SMCMD_START_MERGE:
+        break;
+    case SMCMD_END_MERGE:
+	rep->prevSeq = rep->seqno;
     default:
         break;
     }
 
-    free_cmdlist(&(tmplist));
-
     return(TRUE);
 }
 
-
 static int
-rep_exe_pkt(pkt)
+rep_exe_pkt(command, pkt)
+    rep_cmd *command;
     char *pkt;
 {
     unsigned int cmd;
@@ -1101,7 +1148,7 @@
     len = get_header(pkt, REP_T_SIZE_OFFSET);
     text = pkt + REP_TEXT_OFFSET;
 
-    rep_exe_cmd(cmd, sid, eid, seq, lnum, len, text);
+    rep_exe_cmd(command, cmd, sid, eid, seq, lnum, len, text);
     
     return(TRUE);
 }
@@ -1118,9 +1165,7 @@
     }
 
     for (repcmd = cmdlist->head; repcmd; repcmd = repcmd->next) {
-        if (repcmd->stat == REP_AVAIL) {
-            rep_exe_pkt(repcmd->pkt);
-        }
+	rep_exe_pkt(repcmd, repcmd->pkt);
     }
     
     return(TRUE);
@@ -1149,8 +1194,6 @@
         return(FALSE);
     }
     
-    /* 一定時間読み取るようにしたい */
-
     /* read header part */
     if (readn(fd, header, REP_HEADER_SIZE) < 0) {
         puts_sys_err();
@@ -1165,7 +1208,7 @@
     textsize = get_header(header, REP_T_SIZE_OFFSET);
 
     if (textsize > 0) {
-        if ((text = (char*)rep_alloc(textsize)+1) == NULL) {
+        if ((text = (char*)malloc(textsize)+1) == NULL) {
             return(FALSE);
         }
         /* read text part */
@@ -1177,9 +1220,8 @@
 	text[textsize] = 0;
     }
 
-    if (cmd == REP_INSERT_CMD ||
-        cmd == REP_DELETE_LINE_CMD ||
-        cmd == REP_REPLACE_CMD) {
+    if (cmd == REPCMD_DELETE ||
+        cmd == REPCMD_DELETE ) {
         add_cmd_to_list(txtcmdlist, make_cmd(cmd, sid, eid, seq, lnum, text));
     } else {
         add_cmd_to_list(smcmdlist, make_cmd(cmd, sid, eid, seq, lnum, text));
@@ -1247,43 +1289,23 @@
     rep_cmdlist smcmdlist = {NULL,0};
     rep_cmdlist txtcmdlist = {NULL,0};
 
-    Session *sn = NULL;
-    
-    /* input from keyboard is most important.
-     * reditor has nothing to do */
-    if (FD_ISSET(fd, rfds_p) || FD_ISSET(fd, efds_p)) {
-        return(TRUE);
-    }
-    
     rep_p = get_rep();
-
     if ((rep_p->smfd > 0) && (FD_ISSET(rep_p->smfd, rfds_p))) {
         if (rep_recv_cmds(rep_p->smfd, &(smcmdlist), &(txtcmdlist)) == FALSE) {
             close(rep_p->smfd);
             rep_p->smfd = -1;
-            return FALSE;
-        }
-        /* Session ごとに行う↓*/
-        rep_exe_pktlist(&txtcmdlist);
-
-	if (rep_send_cmds(rep_p->smfd, &(txtcmdlist)) == FALSE) {
-	    close(sn->smfd);
-	    sn->smfd = -1;
+        } else {
+	    rep_exe_pktlist(&txtcmdlist);
 	    free_cmdlist(&(txtcmdlist));
-	    return FALSE;
+	    rep_exe_pktlist( &smcmdlist);
+	    free_cmdlist(&(smcmdlist));
 	}
-	free_cmdlist(&(txtcmdlist));
-        
-        rep_exe_pktlist( &smcmdlist);
-	free_cmdlist(&(smcmdlist));
+    }
 
-        return TRUE;
+    if (FD_ISSET(fd, rfds_p) || FD_ISSET(fd, efds_p)) {
+        return(TRUE);
     }
-    rep_exe_pktlist( &smcmdlist);
-    free_cmdlist(&(smcmdlist));
-
-    return TRUE;	
- 
+    return FALSE;
 }
 
 
@@ -1366,8 +1388,7 @@
 
         }
         
-        rep_fd_check(fd, &rfds_p, &efds_p);
-        return(TRUE);
+        if (rep_fd_check(fd, &rfds_p, &efds_p)) return(TRUE);
     }
 }
 
--- a/src/reditor.h	Wed Sep 24 21:22:42 2008 +0900
+++ b/src/reditor.h	Sun Oct 26 17:39:37 2008 +0900
@@ -3,38 +3,39 @@
 #define SOCK_MAX   5
 #define MAX_FDS    10
 
-#define REP_OPEN_CMD          1
-#define REP_OPEN_ACK          2
-#define REP_READ_CMD          3
-#define REP_READ_ACK          4
-#define REP_READ_FIN          5
-#define REP_INSERT_CMD         6
-#define REP_INSERT_STILL_ACK   7
-#define REP_INSERT_FINISH_ACK  8
-#define REP_DELETE_LINE_CMD   9
-#define REP_DELETE_LINE_ACK  10
-#define REP_CLOSE_CMD        11
-#define REP_CLOSE_ACK        12
-#define REP_REPLACE_CMD      13
 
-//#define REP_CHANGE_FD_CMD    14
-//#define REP_ENTER_RING_CMD   15
-//#define REP_ENTER_RING_ACK   16
+#define	 REPCMD_INSERT		( 6)
+#define	 REPCMD_INSERT_ACK	( 7)
+#define	 REPCMD_DELETE		( 9)
+#define	 REPCMD_DELETE_ACK	( 10)
+#define	 REPCMD_CLOSE		( 11)
+#define	 REPCMD_CLOSE_2		( 12)
+#define	 REPCMD_NOP		( 15)
+#define	 SMCMD_JOIN		( 41)
+#define	 SMCMD_JOIN_ACK		( 42)
+#define	 SMCMD_PUT		( 45)
+#define	 SMCMD_PUT_ACK		( 46)
+#define	 SMCMD_SELECT		( 47)
+#define	 SMCMD_SELECT_ACK	( 48), 
+#define	 SMCMD_SELECT0 		(49)
+#define	 SMCMD_QUIT		( 53)
+#define	 SMCMD_QUIT_ACK		( 54)
+#define	 SMCMD_SM_JOIN   	( 62)
+#define	 SMCMD_SM_JOIN_ACK 	( 63)
+#define	 SMCMD_UPDATE 		( 65)
+#define	 SMCMD_UPDATE_ACK 	( 66)
+#define	 SMCMD_START_MERGE 	( 75)
+#define	 SMCMD_START_MERGE_ACK ( 76)
+#define	 SMCMD_END_MERGE 	( 77)
+#define	 SMCMD_QUIT_2 		( 67)
+#define	 SMCMD_QUIT_2_ACK 	( 68)
 
-#define REP_JOIN_CMD         41
-#define REP_JOIN_ACK         42
-#define REP_GET_CMD          43
-#define REP_GET_ACK          44
-#define REP_PUT_CMD          45
-#define REP_PUT_ACK          46
-#define REP_SELECT_CMD       47
-#define REP_SELECT_ACK       48
-#define REP_REGISTER_CMD     49
-#define REP_REGISTER_ACK     50
-#define REP_DEREGISTER_CMD   51
-#define REP_DEREGISTER_ACK   52
-#define REP_QUIT_CMD         53
-#define REP_QUIT_ACK         54
+
+#define	 SM_EID 		( -1)
+#define	 MERGE_EID 		( -2)
+
+#define	 SMCMD_SYNC 		( 83)
+#define	 SMCMD_SYNC_ACK 	( 84)
 
 
 /* header and text
@@ -126,16 +127,19 @@
     BUFTYPE *scratch_buf;
     
     char *servername;
-    char hostname[HOSTNAME_LEN];
 
     char *waiting_session_name;
 
     int eid;  /* editor id */
     int seqno; /* sequence number of REP command*/
+    int prevSeq; /* sequence number of last merged command */
     
     int smfd; /* socket connected to SessionManager */
 
     int permit;
+    rep_cmd *nop;
+
+    char *hostname;
 } rep_T;