package netlib import ( "container/list" ) var ( sessionHandlerCreatorPool = make(map[string]SessionHandlerCreator) ) type SessionHandlerCreator func() SessionHandler type SessionHandler interface { GetName() string GetInterestOps() uint OnSessionOpened(s *Session) //run in main goroutine OnSessionClosed(s *Session) //run in main goroutine OnSessionIdle(s *Session) //run in main goroutine OnPacketReceived(s *Session, packetid int, logicNo uint32, packet interface{}) //run in session receive goroutine OnPacketSent(s *Session, packetid int, logicNo uint32, data []byte) //run in session send goroutine } type BasicSessionHandler struct { } func (bsh *BasicSessionHandler) GetName() string { return "BasicSessionHandler" } func (bsh *BasicSessionHandler) GetInterestOps() uint { return 0 } func (bsh *BasicSessionHandler) OnSessionOpened(s *Session) {} func (bsh *BasicSessionHandler) OnSessionClosed(s *Session) {} func (bsh *BasicSessionHandler) OnSessionIdle(s *Session) {} func (bsh *BasicSessionHandler) OnPacketReceived(s *Session, packetid int, logicNo uint32, packet interface{}) { } func (bsh *BasicSessionHandler) OnPacketSent(s *Session, packetid int, logicNo uint32, data []byte) {} type SessionHandlerChain struct { handlers *list.List handlersInterestOps [InterestOps_Max]*list.List } func NewSessionHandlerChain() *SessionHandlerChain { shc := &SessionHandlerChain{ handlers: list.New(), } for i := uint(0); i < InterestOps_Max; i++ { shc.handlersInterestOps[i] = list.New() } return shc } func (shc *SessionHandlerChain) AddFirst(sh SessionHandler) { shc.handlers.PushFront(sh) ops := sh.GetInterestOps() for i := uint(0); i < InterestOps_Max; i++ { if ops&(1<