Added resend functionality and preparations for RSA / Encrpyption
This commit is contained in:
51
packets.go
51
packets.go
@@ -21,8 +21,8 @@ type Packet struct {
|
||||
}
|
||||
|
||||
func PacketFromBytes(bytes []byte) Packet {
|
||||
sid := SessionID(bytes[0:32])
|
||||
flag := HeaderFlag(bytes[32])
|
||||
flag := HeaderFlag(bytes[0])
|
||||
sid := SessionID(bytes[1:33])
|
||||
sync := binary.LittleEndian.Uint32(bytes[33:37])
|
||||
dataLength := binary.LittleEndian.Uint32(bytes[37:41])
|
||||
pck := Packet{
|
||||
@@ -30,7 +30,7 @@ func PacketFromBytes(bytes []byte) Packet {
|
||||
flag: flag,
|
||||
sync: sync,
|
||||
dataLength: dataLength,
|
||||
data: bytes[41 : 41+dataLength],
|
||||
data: bytes[HeaderSize : HeaderSize+int(dataLength)],
|
||||
}
|
||||
return pck
|
||||
}
|
||||
@@ -64,6 +64,32 @@ func NewRequest(path string) *Packet {
|
||||
}
|
||||
}
|
||||
|
||||
func (pck *Packet) GetUint32Payload() (uint32, error) {
|
||||
flag := pck.flag
|
||||
if flag != PTE && flag != Ack && flag != End && flag != Resend {
|
||||
return 0, errors.New(fmt.Sprintf("Can not get Sync from Packet Type with flag: %v", flag))
|
||||
}
|
||||
return binary.LittleEndian.Uint32(pck.data), nil
|
||||
}
|
||||
|
||||
func (pck *Packet) GetFilePath() (string, error) {
|
||||
if pck.flag != Request {
|
||||
return "", errors.New("Can not get FilePath from Packet that is not Request")
|
||||
}
|
||||
return string(pck.data), nil
|
||||
}
|
||||
|
||||
func NewResendFile(resendPck *Packet, data []byte) *Packet {
|
||||
sync, _ := resendPck.GetUint32Payload()
|
||||
return &Packet{
|
||||
sid: resendPck.sid,
|
||||
flag: File,
|
||||
sync: sync,
|
||||
dataLength: uint32(len(data)),
|
||||
data: data,
|
||||
}
|
||||
}
|
||||
|
||||
func NewFile(lastPck *Packet, data []byte) *Packet {
|
||||
return &Packet{
|
||||
sid: lastPck.sid,
|
||||
@@ -110,25 +136,10 @@ func NewPte(fileSize uint32, lastPck *Packet) *Packet {
|
||||
}
|
||||
}
|
||||
|
||||
func (pck *Packet) GetUint32Payload() (uint32, error) {
|
||||
flag := pck.flag
|
||||
if flag != PTE && flag != Ack && flag != End && flag != Resend {
|
||||
return 0, errors.New(fmt.Sprintf("Can not get Sync from Packet Type with flag: %v", flag))
|
||||
}
|
||||
return binary.LittleEndian.Uint32(pck.data), nil
|
||||
}
|
||||
|
||||
func (pck *Packet) GetFilePath() (string, error) {
|
||||
if pck.flag != Request {
|
||||
return "", errors.New("Can not get FilePath from Packet that is not Request")
|
||||
}
|
||||
return string(pck.data), nil
|
||||
}
|
||||
|
||||
func (pck *Packet) ToBytes() []byte {
|
||||
arr := make([]byte, HeaderSize+int(pck.dataLength))
|
||||
copy(arr[0:32], pck.sid[:])
|
||||
arr[32] = byte(pck.flag)
|
||||
arr[0] = byte(pck.flag)
|
||||
copy(arr[1:33], pck.sid[:])
|
||||
binary.LittleEndian.PutUint32(arr[33:37], pck.sync)
|
||||
binary.LittleEndian.PutUint32(arr[37:41], pck.dataLength)
|
||||
copy(arr[41:], pck.data)
|
||||
|
||||
Reference in New Issue
Block a user