view src/reditor.h @ 25:2d27043cb96b first-connection

First connection to REP session manager.
author kono
date Sun, 26 Oct 2008 17:39:37 +0900
parents 03814a8d0b2a
children 7101f8c1fa21
line wrap: on
line source

#define REP_PORT 8766
#define BUFFSIZE   200
#define SOCK_MAX   5
#define MAX_FDS    10


#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	 SM_EID 		( -1)
#define	 MERGE_EID 		( -2)

#define	 SMCMD_SYNC 		( 83)
#define	 SMCMD_SYNC_ACK 	( 84)


/* header and text
+-------+--------+--------+-------+--------+---------+--------------+
| rep   | session| editor | seqid | lineno | textsiz | text         |
| cmd   | id     | id     |       |        |         | include '\0' |
+-------+--------+--------+-------+--------+---------+--------------+
 o-----header section (network byte order)----------o
*/
/* header OFFSET */
#define REP_CMD_OFFSET      0 /* REP Command     */
#define REP_SID_OFFSET      4 /* Session ID      */
#define REP_EID_OFFSET      8 /* Editor ID       */
#define REP_SEQNUM_OFFSET  12 /* Sequence number */
#define REP_LNUM_OFFSET    16 /* Line number     */
#define REP_T_SIZE_OFFSET  20 /* TEXT size       */
#define REP_TEXT_OFFSET    24 /* TEXT            */

#define REP_HEADER_SIZE 24

#define REP_IGNORE    0
#define REP_AVAIL     1

#define SLINEUP_NAME "SessionLineup"
#define NO_NAME      "NO_NAME"       /* has not name like scratch */

#define SESSION_MAX 50

#define SESSION_NAME_MAX 50
#define HOSTNAME_LEN 50

//#define UID_MAX 99

 /* Wrapper for vim */

/* 扱うテキストバッファの型 */
//extern buf_T;
#define BUFTYPE buf_T
//#define CHAR char

 /* Wrapper END */

typedef struct rep_cmd {
    struct rep_cmd *next;
    unsigned int   lnum; /* line number */
    int            stat; /* REP_AVAIL or REP_IGNORE */
    
    unsigned int cmd;  /* command id */
    unsigned int sid;  /* session id */
    unsigned int eid;  /* editor id */
    unsigned int seq;  /* sequence number */
    unsigned int len;  /* length of text */
    
    char         *pkt; /* packed rep command */
} rep_cmd;

typedef struct rep_cmdlist {
    rep_cmd *head;
    int num;
} rep_cmdlist;

typedef struct session {
    struct session *next;
    
//    BUFTYPE *sbuf; /* Session Buffer */
    BUFTYPE *buf;   /* Editing Buffer */

    unsigned int sid;
    unsigned int smfd;
    unsigned int rfd;
    unsigned int sfd;
    char *sname;
    
    rep_cmdlist new_cmdlist; /* my REP command list */
    rep_cmdlist sent_cmdlist; /* my REP command list */
    rep_cmdlist fromsmcmlist; /* from sm */

    int permit; /* TRUE or FALSE */

    int prevline;        /* Previous Edited line */
    rep_cmd *del_cmd;    /* saved line for replace is kept here */
} Session;

typedef struct rep {
    Session *shead;  // linked list of session
    Session *slineup;  // buffer of session lineup 
    Session *cursession;

    BUFTYPE *scratch_buf;
    
    char *servername;

    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;


// extern rep_T * get_rep();
extern int rep_permit();
extern int rep_session_permit();
extern int rep_init();
extern void rep_start_create_cmds();
extern void rep_stop_create_cmds();

//extern int rep_connect(char*);
//extern int rep_add_cmd(rep_cmdlist*,unsigned short,unsigned short,unsigned int,char*);
//extern void rep_check_line_change(Session*,unsigned int);
extern void rep_register(unsigned int, unsigned int, int);
//extern int rep_clear_cmdlist(rep_cmdlist*);
//extern int rep_recv_cmds(int fd,rep_cmdlist*);
//extern int rep_send_cmds(int fd,rep_cmdlist*);
extern int rep_fd_check(int, fd_set*, fd_set*);
extern int rep_fd_set(fd_set*, fd_set*, int);
extern int rep_select(int);
extern void rep_prevline_flush(int,int);
extern void rep_end();

extern int rep_join();
extern int rep_put();

extern void rep_send_cur_cmdlist();