mirror of
https://github.com/amitbet/vncproxy.git
synced 2025-09-16 14:50:22 +00:00
refactored player code
This commit is contained in:
81
player/fbs-play-listener.go
Normal file
81
player/fbs-play-listener.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package player
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
|
||||
"time"
|
||||
"vncproxy/client"
|
||||
"vncproxy/common"
|
||||
|
||||
"vncproxy/logger"
|
||||
"vncproxy/server"
|
||||
)
|
||||
|
||||
type FBSPlayListener struct {
|
||||
Conn *server.ServerConn
|
||||
Fbs *FbsReader
|
||||
serverMessageMap map[uint8]common.ServerMessage
|
||||
firstSegDone bool
|
||||
startTime int
|
||||
}
|
||||
|
||||
func NewFBSPlayListener(conn *server.ServerConn, r *FbsReader) *FBSPlayListener {
|
||||
h := &FBSPlayListener{Conn: conn, Fbs: r}
|
||||
cm := client.BellMessage(0)
|
||||
h.serverMessageMap = make(map[uint8]common.ServerMessage)
|
||||
h.serverMessageMap[0] = &client.FramebufferUpdateMessage{}
|
||||
h.serverMessageMap[1] = &client.SetColorMapEntriesMessage{}
|
||||
h.serverMessageMap[2] = &cm
|
||||
h.serverMessageMap[3] = &client.ServerCutTextMessage{}
|
||||
|
||||
return h
|
||||
}
|
||||
func (handler *FBSPlayListener) Consume(seg *common.RfbSegment) error {
|
||||
|
||||
switch seg.SegmentType {
|
||||
case common.SegmentFullyParsedClientMessage:
|
||||
clientMsg := seg.Message.(common.ClientMessage)
|
||||
logger.Debugf("ClientUpdater.Consume:(vnc-server-bound) got ClientMessage type=%s", clientMsg.Type())
|
||||
switch clientMsg.Type() {
|
||||
|
||||
case common.FramebufferUpdateRequestMsgType:
|
||||
if !handler.firstSegDone {
|
||||
handler.firstSegDone = true
|
||||
handler.startTime = int(time.Now().UnixNano() / int64(time.Millisecond))
|
||||
}
|
||||
handler.sendFbsMessage()
|
||||
}
|
||||
// server.FramebufferUpdateRequest:
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *FBSPlayListener) sendFbsMessage() {
|
||||
var messageType uint8
|
||||
//messages := make(map[uint8]common.ServerMessage)
|
||||
fbs := h.Fbs
|
||||
//conn := h.Conn
|
||||
err := binary.Read(fbs, binary.BigEndian, &messageType)
|
||||
if err != nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error in reading FBS segment: ", err)
|
||||
return
|
||||
}
|
||||
//common.IClientConn{}
|
||||
binary.Write(h.Conn, binary.BigEndian, messageType)
|
||||
msg := h.serverMessageMap[messageType]
|
||||
if msg == nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error unknown message type: ", messageType)
|
||||
return
|
||||
}
|
||||
timeSinceStart := int(time.Now().UnixNano()/int64(time.Millisecond)) - h.startTime
|
||||
timeToSleep := fbs.currentTimestamp - timeSinceStart
|
||||
if timeToSleep > 0 {
|
||||
time.Sleep(time.Duration(timeToSleep) * time.Millisecond)
|
||||
}
|
||||
|
||||
err = msg.CopyTo(fbs, h.Conn, fbs)
|
||||
if err != nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error in reading FBS segment: ", err)
|
||||
return
|
||||
}
|
||||
}
|
@@ -1,84 +1,16 @@
|
||||
package player
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
|
||||
"testing"
|
||||
"time"
|
||||
"vncproxy/client"
|
||||
"vncproxy/common"
|
||||
"vncproxy/encodings"
|
||||
"vncproxy/logger"
|
||||
"vncproxy/server"
|
||||
)
|
||||
|
||||
type ServerMessageHandler struct {
|
||||
Conn *server.ServerConn
|
||||
Fbs *FbsReader
|
||||
serverMessageMap map[uint8]common.ServerMessage
|
||||
firstSegDone bool
|
||||
startTime int
|
||||
}
|
||||
|
||||
func NewServerMessageHandler(conn *server.ServerConn, r *FbsReader) *ServerMessageHandler {
|
||||
h := &ServerMessageHandler{Conn: conn, Fbs: r}
|
||||
cm := client.BellMessage(0)
|
||||
h.serverMessageMap = make(map[uint8]common.ServerMessage)
|
||||
h.serverMessageMap[0] = &client.FramebufferUpdateMessage{}
|
||||
h.serverMessageMap[1] = &client.SetColorMapEntriesMessage{}
|
||||
h.serverMessageMap[2] = &cm
|
||||
h.serverMessageMap[3] = &client.ServerCutTextMessage{}
|
||||
|
||||
return h
|
||||
}
|
||||
func (handler *ServerMessageHandler) Consume(seg *common.RfbSegment) error {
|
||||
|
||||
switch seg.SegmentType {
|
||||
case common.SegmentFullyParsedClientMessage:
|
||||
clientMsg := seg.Message.(common.ClientMessage)
|
||||
logger.Debugf("ClientUpdater.Consume:(vnc-server-bound) got ClientMessage type=%s", clientMsg.Type())
|
||||
switch clientMsg.Type() {
|
||||
|
||||
case common.FramebufferUpdateRequestMsgType:
|
||||
if !handler.firstSegDone {
|
||||
handler.firstSegDone = true
|
||||
handler.startTime = int(time.Now().UnixNano() / int64(time.Millisecond))
|
||||
}
|
||||
handler.sendFbsMessage()
|
||||
}
|
||||
// server.FramebufferUpdateRequest:
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *ServerMessageHandler) sendFbsMessage() {
|
||||
var messageType uint8
|
||||
//messages := make(map[uint8]common.ServerMessage)
|
||||
fbs := h.Fbs
|
||||
//conn := h.Conn
|
||||
err := binary.Read(fbs, binary.BigEndian, &messageType)
|
||||
if err != nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error in reading FBS segment: ", err)
|
||||
return
|
||||
}
|
||||
//common.IClientConn{}
|
||||
binary.Write(h.Conn, binary.BigEndian, messageType)
|
||||
msg := h.serverMessageMap[messageType]
|
||||
if msg == nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error unknown message type: ", messageType)
|
||||
return
|
||||
}
|
||||
timeSinceStart := int(time.Now().UnixNano()/int64(time.Millisecond)) - h.startTime
|
||||
timeToSleep := fbs.currentTimestamp - timeSinceStart
|
||||
if timeToSleep > 0 {
|
||||
time.Sleep(time.Duration(timeToSleep) * time.Millisecond)
|
||||
}
|
||||
|
||||
err = msg.CopyTo(fbs, h.Conn, fbs)
|
||||
if err != nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error in reading FBS segment: ", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func loadFbsFile(filename string, conn *server.ServerConn) (*FbsReader, error) {
|
||||
fbs, err := NewFbsReader(filename)
|
||||
@@ -117,12 +49,15 @@ func TestServer(t *testing.T) {
|
||||
}
|
||||
|
||||
cfg.NewConnHandler = func(cfg *server.ServerConfig, conn *server.ServerConn) error {
|
||||
fbs, err := loadFbsFile("/Users/amitbet/Dropbox/recording.rbs", conn)
|
||||
//fbs, err := loadFbsFile("/Users/amitbet/Dropbox/recording.rbs", conn)
|
||||
//fbs, err := loadFbsFile("/Users/amitbet/vncRec/recording.rbs", conn)
|
||||
fbs, err := loadFbsFile("/Users/amitbet/vncRec/recording1500411789.rbs", conn)
|
||||
|
||||
if err != nil {
|
||||
logger.Error("TestServer.NewConnHandler: Error in loading FBS: ", err)
|
||||
return err
|
||||
}
|
||||
conn.Listeners.AddListener(NewServerMessageHandler(conn, fbs))
|
||||
conn.Listeners.AddListener(NewFBSPlayListener(conn, fbs))
|
||||
return nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user