in vncclient/client.go [460:538]
func (c *ClientConn) handshake() (error, bool) {
var protocolVersion [pvLen]byte
// 7.1.1, read the ProtocolVersion message sent by the server.
if _, err := io.ReadFull(c.c, protocolVersion[:]); err != nil {
return err, true
}
maxMajor, maxMinor, err := ParseProtocolVersion(protocolVersion[:])
if err != nil {
return err, false
}
if maxMajor < 3 {
return errors.Errorf("unsupported major version, less than 3: %d", maxMajor), false
}
if maxMinor < 3 {
return errors.Errorf("unsupported minor version, less than 3: %d", maxMinor), false
}
if maxMinor == 8 {
err := c.securityHandshakeVersion8()
if err != nil {
return err, false
}
} else {
err := c.securityHandshakeVersion3()
if err != nil {
return err, false
}
}
// 7.1.3 SecurityResult Handshake
var securityResult uint32
if err = binary.Read(c.c, binary.BigEndian, &securityResult); err != nil {
return err, false
}
if securityResult == 1 {
return errors.Errorf("security handshake failed: %s", c.readErrorReason()), false
}
// 7.3.1 ClientInit
var sharedFlag uint8 = 1
if c.config.Exclusive {
sharedFlag = 0
}
if err = binary.Write(c.c, binary.BigEndian, sharedFlag); err != nil {
return err, false
}
// 7.3.2 ServerInit
if err = binary.Read(c.c, binary.BigEndian, &c.FramebufferWidth); err != nil {
return err, false
}
if err = binary.Read(c.c, binary.BigEndian, &c.FramebufferHeight); err != nil {
return err, false
}
// Read the pixel format
if err = ReadPixelFormat(c.c, &c.PixelFormat); err != nil {
return err, false
}
var nameLength uint32
if err = binary.Read(c.c, binary.BigEndian, &nameLength); err != nil {
return err, false
}
nameBytes := make([]uint8, nameLength)
if err = binary.Read(c.c, binary.BigEndian, &nameBytes); err != nil {
return err, false
}
c.DesktopName = string(nameBytes)
return nil, false
}