func()

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
}