Simplify readers + writers: Media

master
HimbeerserverDE 2021-04-01 20:27:58 +02:00
parent 9ff98c75c5
commit 8f02e2b1ff
No known key found for this signature in database
GPG Key ID: 1A651504791E6A8B
2 changed files with 42 additions and 113 deletions

View File

@ -720,10 +720,7 @@ func Init(c, c2 *Conn, ignMedia, noAccessDenied bool, fin chan *Conn) {
case ToServerInit2:
c2.announceMedia()
case ToServerRequestMedia:
data := make([]byte, r.Len())
r.Read(data)
c2.sendMedia(data)
c2.sendMedia(r)
case ToServerClientReady:
defaultSrv := ConfKey("default_server").(string)

150
media.go
View File

@ -43,9 +43,7 @@ func (c *Conn) fetchMedia() {
r := ByteReader(pkt)
cmdBytes := make([]byte, 2)
r.Read(cmdBytes)
switch cmd := binary.BigEndian.Uint16(cmdBytes); cmd {
switch cmd := ReadUint16(r); cmd {
case ToClientNodedef:
servers := ConfKey("servers").(map[interface{}]interface{})
var srvname string
@ -91,28 +89,16 @@ func (c *Conn) fetchMedia() {
case ToClientAnnounceMedia:
var rq []string
countBytes := make([]byte, 2)
r.Read(countBytes)
count := binary.BigEndian.Uint16(countBytes)
count := ReadUint16(r)
for i := uint16(0); i < count; i++ {
namelenBytes := make([]byte, 2)
r.Read(namelenBytes)
namelen := binary.BigEndian.Uint16(namelenBytes)
name := string(ReadBytes16(r))
name := make([]byte, namelen)
r.Read(name)
digest := ReadBytes16(r)
diglenBytes := make([]byte, 2)
r.Read(diglenBytes)
diglen := binary.BigEndian.Uint16(diglenBytes)
digest := make([]byte, diglen)
r.Read(digest)
if media[string(name)] == nil && !isCached(string(name), digest) {
rq = append(rq, string(name))
media[string(name)] = &mediaFile{digest: digest}
if media[name] == nil && !isCached(name, digest) {
rq = append(rq, name)
media[name] = &mediaFile{digest: digest}
}
}
@ -122,19 +108,15 @@ func (c *Conn) fetchMedia() {
pktlen += 2 + len(rq[f])
}
data := make([]byte, 4+pktlen)
data[0] = uint8(0x00)
data[1] = uint8(ToServerRequestMedia)
binary.BigEndian.PutUint16(data[2:4], uint16(len(rq)))
sj := 4
w := bytes.NewBuffer([]byte{0x00, ToServerRequestMedia})
WriteUint16(w, uint16(len(rq)))
for f := range rq {
binary.BigEndian.PutUint16(data[sj:2+sj], uint16(len(rq[f])))
copy(data[2+sj:2+sj+len(rq[f])], []byte(rq[f]))
sj += 2 + len(rq[f])
WriteBytes16(w, []byte(rq[f]))
}
_, err := c.Send(rudp.Pkt{
Reader: bytes.NewReader(data),
Reader: w,
PktInfo: rudp.PktInfo{
Channel: 1,
},
@ -145,39 +127,20 @@ func (c *Conn) fetchMedia() {
continue
}
case ToClientMedia:
bunchcountBytes := make([]byte, 2)
r.Read(bunchcountBytes)
bunchcount := binary.BigEndian.Uint16(bunchcountBytes)
bunchCount := ReadUint16(r)
bunchID := ReadUint16(r)
fileCount := ReadUint32(r)
bunchBytes := make([]byte, 2)
r.Read(bunchBytes)
bunch := binary.BigEndian.Uint16(bunchBytes)
for i := uint32(0); i < fileCount; i++ {
name := string(ReadBytes16(r))
data := ReadBytes32(r)
filecountBytes := make([]byte, 4)
r.Read(filecountBytes)
filecount := binary.BigEndian.Uint32(filecountBytes)
for i := uint32(0); i < filecount; i++ {
namelenBytes := make([]byte, 2)
r.Read(namelenBytes)
namelen := binary.BigEndian.Uint16(namelenBytes)
name := make([]byte, namelen)
r.Read(name)
datalenBytes := make([]byte, 4)
r.Read(datalenBytes)
datalen := binary.BigEndian.Uint32(datalenBytes)
data := make([]byte, datalen)
r.Read(data)
if media[string(name)] != nil && len(media[string(name)].data) == 0 {
media[string(name)].data = data
if media[name] != nil && len(media[name].data) == 0 {
media[name].data = data
}
}
if bunch >= bunchcount-1 {
if bunchID >= bunchCount-1 {
c.Close()
return
}
@ -187,12 +150,10 @@ func (c *Conn) fetchMedia() {
func (c *Conn) updateDetachedInvs(srvname string) {
for i := range detachedinvs[srvname] {
data := make([]byte, 2+len(detachedinvs[srvname][i]))
data[0] = uint8(0x00)
data[1] = uint8(ToClientDetachedInventory)
copy(data[2:], detachedinvs[srvname][i])
w := bytes.NewBuffer([]byte{0x00, ToClientDetachedInventory})
w.Write(detachedinvs[srvname][i])
ack, err := c.Send(rudp.Pkt{Reader: bytes.NewReader(data)})
ack, err := c.Send(rudp.Pkt{Reader: w})
if err != nil {
log.Print(err)
continue
@ -252,27 +213,15 @@ func (c *Conn) announceMedia() {
}
<-ack
pktlen := 0
w := bytes.NewBuffer([]byte{0x00, ToClientAnnounceMedia})
WriteUint16(w, uint16(len(media)))
for f := range media {
pktlen += 4 + len(f) + len(media[f].digest)
WriteBytes16(w, []byte(f))
WriteBytes16(w, media[f].digest)
}
data = make([]byte, 6+pktlen)
data[0] = uint8(0x00)
data[1] = uint8(ToClientAnnounceMedia)
binary.BigEndian.PutUint16(data[2:4], uint16(len(media)))
si := 4
for f := range media {
binary.BigEndian.PutUint16(data[si:2+si], uint16(len(f)))
copy(data[2+si:2+si+len(f)], []byte(f))
binary.BigEndian.PutUint16(data[2+si+len(f):4+si+len(f)], uint16(len(media[f].digest)))
copy(data[4+si+len(f):4+si+len(f)+len(media[f].digest)], media[f].digest)
si += 4 + len(f) + len(media[f].digest)
}
data[si] = uint8(0x00)
data[1+si] = uint8(0x00)
ack, err = c.Send(rudp.Pkt{Reader: bytes.NewReader(data)})
ack, err = c.Send(rudp.Pkt{Reader: w})
if err != nil {
log.Print(err)
return
@ -280,43 +229,26 @@ func (c *Conn) announceMedia() {
<-ack
}
func (c *Conn) sendMedia(rqdata []byte) {
func (c *Conn) sendMedia(r *bytes.Reader) {
count := ReadUint16(r)
var rq []string
count := binary.BigEndian.Uint16(rqdata[0:2])
si := uint16(2)
for i := uint16(0); i < count; i++ {
namelen := binary.BigEndian.Uint16(rqdata[si : 2+si])
name := rqdata[2+si : 2+si+namelen]
rq = append(rq, string(name))
si += 2 + namelen
name := string(ReadBytes16(r))
rq = append(rq, name)
}
pktlen := 0
for f := range rq {
pktlen += 6 + len(rq[f]) + len(media[rq[f]].data)
}
w := bytes.NewBuffer([]byte{0x00, ToClientMedia, 0x00, 0x01, 0x00, 0x00})
data := make([]byte, 12+pktlen)
data[0] = uint8(0x00)
data[1] = uint8(ToClientMedia)
data[2] = uint8(0x00)
data[3] = uint8(0x01)
data[4] = uint8(0x00)
data[5] = uint8(0x00)
binary.BigEndian.PutUint32(data[6:10], uint32(len(rq)))
sj := 10
WriteUint32(w, uint32(len(rq)))
for f := range rq {
binary.BigEndian.PutUint16(data[sj:2+sj], uint16(len(rq[f])))
copy(data[2+sj:2+sj+len(rq[f])], rq[f])
binary.BigEndian.PutUint32(data[2+sj+len(rq[f]):6+sj+len(rq[f])], uint32(len(media[rq[f]].data)))
copy(data[6+sj+len(rq[f]):6+sj+len(rq[f])+len(media[rq[f]].data)], media[rq[f]].data)
sj += 6 + len(rq[f]) + len(media[rq[f]].data)
WriteBytes16(w, []byte(rq[f]))
WriteBytes32(w, media[rq[f]].data)
}
data[sj] = uint8(0x00)
data[1+sj] = uint8(0x00)
WriteBytes16(w, []byte{}) // remote media server url
ack, err := c.Send(rudp.Pkt{
Reader: bytes.NewReader(data),
Reader: w,
PktInfo: rudp.PktInfo{
Channel: 2,
},