added an fbs reader and server, still not tested

This commit is contained in:
betzalel
2017-07-12 18:23:52 +03:00
parent fe51682a55
commit 7dc1773596
5 changed files with 391 additions and 44 deletions

144
server/fbs-reader.go Normal file
View File

@@ -0,0 +1,144 @@
package server
import (
"encoding/binary"
"io"
"os"
"vncproxy/common"
"vncproxy/logger"
)
type FbsReader struct {
reader io.Reader
}
func NewFbsReader(fbsFile string) (*FbsReader, error) {
reader, err := os.OpenFile(fbsFile, os.O_RDONLY, 0644)
if err != nil {
logger.Error("NewFbsReader: can't open fbs file: ", fbsFile)
return nil, err
}
return &FbsReader{reader: reader}, nil
}
func (player *FbsReader) ReadStartSession() (*common.ServerInit, error) {
initMsg := common.ServerInit{}
reader := player.reader
var framebufferWidth uint16
var framebufferHeight uint16
var SecTypeNone uint32
//read rfb header information (the only part done without the [size|data|timestamp] block wrapper)
//.("FBS 001.000\n")
bytes := make([]byte, 12)
_, err := reader.Read(bytes)
if err != nil {
logger.Error("error reading rbs init message - FBS file Version:", err)
return nil, err
}
//read the version message into the buffer so it will be written in the first rbs block
//RFB 003.008\n
bytes = make([]byte, 12)
_, err = reader.Read(bytes)
if err != nil {
logger.Error("error reading rbs init - RFB Version: ", err)
return nil, err
}
//push sec type and fb dimensions
binary.Read(reader, binary.BigEndian, &SecTypeNone)
if err != nil {
logger.Error("error reading rbs init - SecType: ", err)
}
//read frame buffer width, height
binary.Read(reader, binary.BigEndian, &framebufferWidth)
if err != nil {
logger.Error("error reading rbs init - FBWidth: ", err)
return nil, err
}
initMsg.FBWidth = framebufferWidth
binary.Read(reader, binary.BigEndian, &framebufferHeight)
if err != nil {
logger.Error("error reading rbs init - FBHeight: ", err)
return nil, err
}
initMsg.FBHeight = framebufferHeight
//read pixel format
pixelFormat := &common.PixelFormat{}
binary.Read(reader, binary.BigEndian, pixelFormat)
if err != nil {
logger.Error("error reading rbs init - Pixelformat: ", err)
return nil, err
}
initMsg.PixelFormat = *pixelFormat
//read padding
bytes = make([]byte, 3)
reader.Read(bytes)
//read desktop name
var desknameLen uint32
binary.Read(reader, binary.BigEndian, &desknameLen)
if err != nil {
logger.Error("error reading rbs init - deskname Len: ", err)
return nil, err
}
initMsg.NameLength = desknameLen
bytes = make([]byte, desknameLen)
reader.Read(bytes)
if err != nil {
logger.Error("error reading rbs init - desktopName: ", err)
return nil, err
}
initMsg.NameText = bytes
return &initMsg, nil
}
func (player *FbsReader) ReadSegment() (*FbsSegment, error) {
reader := player.reader
var bytesLen uint32
//read length
err := binary.Read(reader, binary.BigEndian, &bytesLen)
if err != nil {
logger.Error("error reading rbs file: ", err)
return nil, err
}
paddedSize := (bytesLen + 3) & 0x7FFFFFFC
//read bytes
bytes := make([]byte, paddedSize)
_, err = reader.Read(bytes)
if err != nil {
logger.Error("error reading rbs file: ", err)
return nil, err
}
//remove padding
actualBytes := bytes[:bytesLen]
//read timestamp
var timeSinceStart uint32
binary.Read(reader, binary.BigEndian, &timeSinceStart)
if err != nil {
logger.Error("error reading rbs file: ", err)
return nil, err
}
//timeStamp := time.Unix(timeSinceStart, 0)
return &FbsSegment{actualBytes, timeSinceStart}, nil
}
type FbsSegment struct {
bytes []byte
timeSinceStart uint32
}

63
server/main.go Normal file
View File

@@ -0,0 +1,63 @@
package server
import (
"log"
"vncproxy/common"
"vncproxy/encodings"
"vncproxy/logger"
)
func newServerConnHandler(cfg *ServerConfig, conn *ServerConn) error {
return nil
}
func main() {
//chServer := make(chan common.ClientMessage)
chClient := make(chan common.ServerMessage)
cfg := &ServerConfig{
//SecurityHandlers: []SecurityHandler{&ServerAuthNone{}, &ServerAuthVNC{}},
SecurityHandlers: []SecurityHandler{&ServerAuthVNC{"Ch_#!T@8"}},
Encodings: []common.Encoding{&encodings.RawEncoding{}, &encodings.TightEncoding{}, &encodings.CopyRectEncoding{}},
PixelFormat: common.NewPixelFormat(32),
//ClientMessageCh: chServer,
ServerMessageCh: chClient,
ClientMessages: DefaultClientMessages,
DesktopName: []byte("workDesk"),
Height: uint16(768),
Width: uint16(1024),
NewConnHandler: newServerConnHandler,
}
loadFbsFile("c:\\Users\\betzalel\\Dropbox\\recording.rbs", cfg)
url := "http://localhost:8091/"
go WsServe(url, cfg)
go TcpServe(":5904", cfg)
// Process messages coming in on the ClientMessage channel.
for {
msg := <-chClient
switch msg.Type() {
default:
log.Printf("Received message type:%v msg:%v\n", msg.Type(), msg)
}
}
}
func loadFbsFile(filename string, cfg *ServerConfig) {
fbs, err := NewFbsReader(filename)
if err != nil {
logger.Error("failed to open fbs reader:", err)
}
//NewFbsReader("/Users/amitbet/vncRec/recording.rbs")
initMsg, err := fbs.ReadStartSession()
if err != nil {
logger.Error("failed to open read fbs start session:", err)
}
cfg.PixelFormat = &initMsg.PixelFormat
cfg.Height = initMsg.FBHeight
cfg.Width = initMsg.FBWidth
cfg.DesktopName = initMsg.NameText
}