VNC or RFB server for PB
Posted: Sat Sep 08, 2012 3:17 pm
Hi,
since I'm a 'networker'
I had the need for an VNC server.
Here is the result of my first try under PureBASIC.
Save it as rfb.pbi
since I'm a 'networker'

Here is the result of my first try under PureBASIC.
Save it as rfb.pbi
Code: Select all
;
; RFB Protocol V 3.3
;
; translated to PB by infratec
;
; Set this For the endian of your machine. 0 = big, 1 = little
#rfbEndianTest = 1
;
; Macro To compare pixel formats.
;
Macro PF_EQ(x,y)
((x\bitsPerPixel = y\bitsPerPixel) And (x\depth = y\depth) And (x\trueColour = y\trueColour) And ((x\bigEndian = y\bigEndian) Or (x\bitsPerPixel = 8)) And ( Not x\trueColour Or ((x\redMax = y\redMax) And (x\greenMax = y\greenMax) And (x\blueMax = y\blueMax) And (x\redShift = y\redShift) And (x\greenShift = y\greenShift) And (x\blueShift = y\blueShift))))
EndMacro
;
; Macros For endian swapping.
;
Macro Swap16(s)
((((s) & $ff) << 8) | (((s) >> 8) & $ff))
EndMacro
Macro Swap32(l)
(((l) >> 24) | (((l) & $00ff0000) >> 8) | (((l) & $0000ff00) << 8) | ((l) << 24))
EndMacro
CompilerIf #rfbEndianTest = 1
Macro Swap16IfLE(s)
Swap16(s)
EndMacro
CompilerElse
Macro Swap16IfLE(s)
(s)
EndMacro
CompilerEndIf
CompilerIf #rfbEndianTest = 1
Macro Swap32IfLE(l)
Swap32(l)
EndMacro
CompilerElse
Macro Swap32IfLE(l)
(l)
EndMacro
CompilerEndIf
;*****************************************************************************
;*
;* Structures used in several messages
;*
;*****************************************************************************
Structure rfbRectangle
x.u
y.u
w.u
h.u
EndStructure
#sz_rfbRectangle = 8
Structure rfbPixelFormat
bitsPerPixel.a ; /* 8,16,32 only */
depth.a; /* 8 to 32 */
bigEndian.a; /* True if multi-byte pixels are interpreted as big endian
trueColour.a; /* If false then we need a "colour map" to
; the following fields are only meaningful If trueColour is true */
redMax.u
greenMax.u
blueMax.u
redShift.a
greenShift.a
blueShift.a
pad1.a
pad2.u
EndStructure
#sz_rfbPixelFormat = 16
#rfbProtocolMajorVersion = "003"
#rfbProtocolMinorVersion = "003"
#sz_rfbProtocolVersionMsg = 12
Enumeration
#rfbConnFailed
#rfbNoAuth
#rfbVncAuth
EndEnumeration
Enumeration
#rfbVncAuthOK
#rfbVncAuthFailed
#rfbVncAuthTooMany
EndEnumeration
Structure rfbClientInitMsg
Shared.l
EndStructure
#sz_rfbClientInitMsg = 1
Structure rfbServerInitMsg
framebufferWidth.u
framebufferHeight.u
format.rfbPixelFormat
nameLength.l
EndStructure
#sz_rfbServerInitMsg = (8 + #sz_rfbPixelFormat)
;*****************************************************************************
;*
;* Message types
;*
;*****************************************************************************/
;* server -> client *
Enumeration
#rfbFramebufferUpdate
#rfbSetColourMapEntries
#rfbBell
#rfbServerCutText
EndEnumeration
;* client -> server *
Enumeration
#rfbSetPixelFormat
#rfbFixColourMapEntries
#rfbSetEncodings
#rfbFramebufferUpdateRequest
#rfbKeyEvent
#rfbPointerEvent
#rfbClientCutText
#rfbEnableExtensionRequest = 10
#rfbExtensionData
EndEnumeration
;*****************************************************************************
;*
;* Encoding types
;*
;*****************************************************************************
Enumeration
#rfbEncodingRaw
#rfbEncodingCopyRect
#rfbEncodingRRE
#rfbEncodingCoRRE = 4
#rfbEncodingHextile
#rfbEncodingZlib
#rfbEncodingTight
#rfbEncodingZlibHex
#rfbEncodingZRLE = 16
#rfbEncodingLzo = 21
EndEnumeration
;*****************************************************************************
;*
;* Server -> client message definitions
;*
;*****************************************************************************
Structure rfbFramebufferUpdateMsg
type.a; /* always rfbFramebufferUpdate */
pad.a
nRects.u
; followed by nRects rectangles
EndStructure
#sz_rfbFramebufferUpdateMsg = 4
Structure rfbFramebufferUpdateRectHeader
r.rfbRectangle
encoding.l; /* one of the encoding types rfbEncoding... */
EndStructure
#sz_rfbFramebufferUpdateRectHeader = #sz_rfbRectangle + 4
Structure rfbCopyRect
srcX.u
srcY.u
EndStructure
#sz_rfbCopyRect = 4
Structure rfbRREHeader
nSubrects.l
EndStructure
#sz_rfbRREHeader = 4
Structure rfbCoRRERectangle
x.a
y.a
w.a
h.a
EndStructure
#sz_rfbCoRRERectangle = 4
Macro rfbHextileRaw
(1 << 0)
EndMacro
Macro rfbHextileBackgroundSpecified
(1 << 1)
EndMacro
Macro rfbHextileForegroundSpecified
(1 << 2)
EndMacro
Macro rfbHextileAnySubrects
(1 << 3)
EndMacro
Macro rfbHextileSubrectsColoured
(1 << 4)
EndMacro
Macro rfbHextilePackXY(x,y)
(((x) << 4) | (y))
EndMacro
Macro rfbHextilePackWH(w,h)
((((w)-1) << 4) | ((h)-1))
EndMacro
Macro rfbHextileExtractX(byte)
((byte) >> 4)
EndMacro
Macro rfbHextileExtractY(byte)
((byte) & 0xf)
EndMacro
Macro rfbHextileExtractW(byte)
(((byte) >> 4) + 1)
EndMacro
Macro rfbHextileExtractH(byte)
(((byte) & 0xf) + 1)
EndMacro
Structure rfbSetColourMapEntriesMsg
type.a; /* always rfbSetColourMapEntries */
pad.a
firstColour.u
nColours.u
; /* Followed by nColours * 3 * CARD16
; r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */
EndStructure
#sz_rfbSetColourMapEntriesMsg = 6
Structure rfbBellMsg
type.a
EndStructure
#sz_rfbBellMsg = 1
Structure rfbServerCutTextMsg
type.a
pad1.a
pad2.u
length.l
; followed by char text[length] */
EndStructure
#sz_rfbServerCutTextMsg = 8
Structure rfbEnableExtensionRequestMsg
type.a; /* always rfbEnableExtensionRequest */
new_msg.a
flags.a
pad1.a
length.l
; Followed by <length> bytes of Data */
EndStructure
Structure rfbExtensionDataMsg
type.a
pad1.a
pad2.u
length.l; /* Must be correct if used
; Followed by <length> bytes of Data
EndStructure
Structure rfbServerToClientMsg
StructureUnion
fu.rfbFramebufferUpdateMsg
scme.rfbSetColourMapEntriesMsg
b.rfbBellMsg
sct.rfbServerCutTextMsg
eer.rfbEnableExtensionRequestMsg
ed.rfbExtensionDataMsg
EndStructureUnion
EndStructure
;*****************************************************************************
;*
;* Message definitions (client -> server)
;*
;*****************************************************************************
Structure rfbSetPixelFormatMsg
type.a; /* always rfbSetPixelFormat */
pad1.a
pad2.u
format.rfbPixelFormat
EndStructure
#sz_rfbSetPixelFormatMsg = (#sz_rfbPixelFormat + 4)
Structure rfbFixColourMapEntriesMsg
type.a; /* always rfbFixColourMapEntries */
pad.a
firstColour.u
nColours.u
; Followed by nColours * 3 * CARD16
; r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */
EndStructure
#sz_rfbFixColourMapEntriesMsg = 6
Structure rfbSetEncodingsMsg
type.a; /* always rfbSetEncodings */
pad.a
nEncodings.u
; followed by nEncodings * CARD32 encoding types */
EndStructure
#sz_rfbSetEncodingsMsg = 4
Structure rfbFramebufferUpdateRequestMsg
type.a; /* always rfbFramebufferUpdateRequest */
incremental.a
x.u
y.u
w.u
h.u
EndStructure
#sz_rfbFramebufferUpdateRequestMsg = 10
Structure rfbKeyEventMsg
type.a; /* always rfbKeyEvent */
down.a; /* true if down (press), false if up */
pad.u;
key.l; /* key is specified as an X keysym */
EndStructure
#sz_rfbKeyEventMsg = 8
#rfbButton1Mask = 1
#rfbButton2Mask = 2
#rfbButton3Mask = 4
Structure rfbPointerEventMsg
type.a; /* always rfbPointerEvent */
buttonMask.a; /* bits 0-7 are buttons 1-8, 0=up, 1=down */
x.u
y.u
EndStructure
#sz_rfbPointerEventMsg = 6
Structure rfbClientCutTextMsg
type.a; /* always rfbClientCutText */
pad1.a
pad2.u
length.l
; followed by char text[length] */
EndStructure
#sz_rfbClientCutTextMsg = 8
Structure rfbClientToServerMsg
StructureUnion
spf.rfbSetPixelFormatMsg
fcme.rfbFixColourMapEntriesMsg
se.rfbSetEncodingsMsg
fur.rfbFramebufferUpdateRequestMsg
ke.rfbKeyEventMsg
pe.rfbPointerEventMsg
cct.rfbClientCutTextMsg
eer.rfbEnableExtensionRequestMsg
ed.rfbExtensionDataMsg
EndStructureUnion
EndStructure