in vncclient/client.go [542:591]
func (c *ClientConn) mainLoop() {
defer c.Close()
// Build the map of available server messages
typeMap := make(map[uint8]ServerMessage)
defaultMessages := []ServerMessage{
new(FramebufferUpdateMessage),
new(SetColorMapEntriesMessage),
new(BellMessage),
new(ServerCutTextMessage),
}
for _, msg := range defaultMessages {
typeMap[msg.Type()] = msg
}
if c.config.ServerMessages != nil {
for _, msg := range c.config.ServerMessages {
typeMap[msg.Type()] = msg
}
}
for {
var messageType uint8
if err := binary.Read(c.c, binary.BigEndian, &messageType); err != nil {
c.reportError(errors.Annotate(err, "could not read message type"))
break
}
msg, ok := typeMap[messageType]
if !ok {
// Unsupported message type! Bad!
c.reportError(errors.Errorf("no such message type: %d", messageType))
break
}
parsedMsg, err := msg.Read(c, c.c)
if err != nil {
c.reportError(err)
break
}
if c.config.ServerMessageCh == nil {
continue
}
c.config.ServerMessageCh <- parsedMsg
}
}