mirror of
https://github.com/amitbet/vncproxy.git
synced 2025-09-23 10:28:54 +00:00
added an fbs reader and server, still not tested
This commit is contained in:
144
server/fbs-reader.go
Normal file
144
server/fbs-reader.go
Normal 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
63
server/main.go
Normal 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
|
||||
}
|
Reference in New Issue
Block a user