예제 #1
0
파일: userevent.go 프로젝트: chogaths/robin
func InvokeUserInit(componentList []string, user *User, p netfw.IPeer, param ...interface{}) error {

	// 防止重复注册
	user.Ev.Clear()

	var err error

	for _, cname := range componentList {

		// 在加载列表里没有的组件, 就不参与初始化了
		if !p.HasComponent(cname) {

			continue
		}

		ie, ok := p.GetComponent(cname).(IUserEvent)

		if !ok {
			continue
		}

		if err = ie.OnUserInit(user, param...); err != nil {
			return err
		}
	}

	return nil
}
예제 #2
0
파일: relay.go 프로젝트: chogaths/robin
func (self *relayComponent) Start(p netfw.IPeer) {

	// 接收方
	p.RegisterMessage("coredef.RelayMessageACK", func(msg *coredef.RelayMessageACK, relaySession *netdef.Session) {

		userpkt := &netdef.Packet{
			MsgID: msg.GetUserMsgID(),
			Size:  uint16(len(msg.GetUserMsg())),
			Data:  msg.GetUserMsg(),
		}

		if self.callback == nil {
			return
		}

		self.callback(relaySession, msg.GetSessionID(), userpkt, msg.GetBroardCast())

	})
}
예제 #3
0
파일: rpc.go 프로젝트: chogaths/robin
func (self *rpcComponent) Start(p netfw.IPeer) {

	// 应答方
	p.RegisterMessage("coredef.RemoteCallREQ", func(msg *coredef.RemoteCallREQ, ses *netdef.Session) {

		userpkt := &netdef.Packet{
			MsgID: msg.GetUserMsgID(),
			Size:  uint16(len(msg.GetUserMsg())),
			Data:  msg.GetUserMsg(),
		}

		userc := netdef.NewPacketContext(userpkt, ses)

		injectResponseHandler(userc, p.GetCodec(), ses, msg)

		p.CallHandlers(int(userpkt.MsgID), userc)

	})

	p.RegisterMessage("coredef.RemoteCallACK", func(msg *coredef.RemoteCallACK) {

		// 获得callid对应的调用上下文
		rcd := self.getCallData(msg.GetCallID())

		defer self.removeCallData(msg.GetCallID())

		if rcd == nil {
			rcd.fail(lostCallDataError)
			return
		}

		err := proto.Unmarshal(msg.GetUserMsg(), rcd.Reply.(proto.Message))
		if err != nil {
			rcd.fail(replyUnmarshalingError)
			return
		}

		// 回应请求方, 请求方解除阻塞
		rcd.done()

	})
}