mirror of https://github.com/jetkvm/kvm.git
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package kvm
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
)
|
|
|
|
type RemoteImageReader interface {
|
|
Read(ctx context.Context, offset int64, size int64) ([]byte, error)
|
|
}
|
|
|
|
type WebRTCDiskReader struct {
|
|
}
|
|
|
|
var webRTCDiskReader WebRTCDiskReader
|
|
|
|
func (w *WebRTCDiskReader) Read(ctx context.Context, offset int64, size int64) ([]byte, error) {
|
|
virtualMediaStateMutex.RLock()
|
|
if currentVirtualMediaState == nil {
|
|
virtualMediaStateMutex.RUnlock()
|
|
return nil, errors.New("image not mounted")
|
|
}
|
|
if currentVirtualMediaState.Source != WebRTC {
|
|
virtualMediaStateMutex.RUnlock()
|
|
return nil, errors.New("image not mounted from webrtc")
|
|
}
|
|
mountedImageSize := currentVirtualMediaState.Size
|
|
virtualMediaStateMutex.RUnlock()
|
|
end := offset + size
|
|
if end > mountedImageSize {
|
|
end = mountedImageSize
|
|
}
|
|
req := DiskReadRequest{
|
|
Start: uint64(offset),
|
|
End: uint64(end),
|
|
}
|
|
jsonBytes, err := json.Marshal(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if currentSession == nil || currentSession.DiskChannel == nil {
|
|
return nil, errors.New("not active session")
|
|
}
|
|
|
|
logger.Debugf("reading from webrtc %v", string(jsonBytes))
|
|
err = currentSession.DiskChannel.SendText(string(jsonBytes))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var buf []byte
|
|
for {
|
|
select {
|
|
case data := <-diskReadChan:
|
|
buf = data[16:]
|
|
case <-ctx.Done():
|
|
return nil, context.Canceled
|
|
}
|
|
if len(buf) >= int(end-offset) {
|
|
break
|
|
}
|
|
}
|
|
return buf, nil
|
|
}
|