]>
Commit | Line | Data |
---|---|---|
6988a057 JH |
1 | package hotline |
2 | ||
3 | import ( | |
4 | "bytes" | |
5 | "encoding/binary" | |
6 | "errors" | |
85767504 | 7 | "io" |
6988a057 JH |
8 | ) |
9 | ||
df2735b2 | 10 | type transfer struct { |
6988a057 JH |
11 | Protocol [4]byte // "HTXF" 0x48545846 |
12 | ReferenceNumber [4]byte // Unique ID generated for the transfer | |
13 | DataSize [4]byte // File size | |
14 | RSVD [4]byte // Not implemented in Hotline Protocol | |
15 | } | |
16 | ||
df2735b2 | 17 | var HTXF = [4]byte{0x48, 0x54, 0x58, 0x46} // (HTXF) is the only supported transfer protocol |
6988a057 | 18 | |
df2735b2 JH |
19 | func (tf *transfer) Write(b []byte) (int, error) { |
20 | if err := binary.Read(bytes.NewReader(b), binary.BigEndian, tf); err != nil { | |
21 | return 0, err | |
6988a057 JH |
22 | } |
23 | ||
df2735b2 JH |
24 | if tf.Protocol != HTXF { |
25 | return 0, errors.New("invalid protocol") | |
6988a057 JH |
26 | } |
27 | ||
df2735b2 | 28 | return len(b), nil |
6988a057 | 29 | } |
85767504 | 30 | |
df1ade54 | 31 | func receiveFile(r io.Reader, targetFile, resForkFile, infoFork, counterWriter io.Writer) error { |
7cd900d6 JH |
32 | var ffo flattenedFileObject |
33 | if _, err := ffo.ReadFrom(r); err != nil { | |
85767504 JH |
34 | return err |
35 | } | |
36 | ||
7cd900d6 | 37 | // Write the information fork |
9cf66aea | 38 | _, err := io.Copy(infoFork, &ffo.FlatFileInformationFork) |
85767504 JH |
39 | if err != nil { |
40 | return err | |
41 | } | |
42 | ||
1a7d1fb9 | 43 | if _, err = io.CopyN(targetFile, io.TeeReader(r, counterWriter), ffo.dataSize()); err != nil { |
165b7ac9 JH |
44 | return err |
45 | } | |
85767504 | 46 | |
7cd900d6 JH |
47 | if ffo.FlatFileHeader.ForkCount == [2]byte{0, 3} { |
48 | if err := binary.Read(r, binary.BigEndian, &ffo.FlatFileResForkHeader); err != nil { | |
85767504 JH |
49 | return err |
50 | } | |
ba29c43b | 51 | |
1a7d1fb9 | 52 | if _, err = io.CopyN(resForkFile, io.TeeReader(r, counterWriter), ffo.rsrcSize()); err != nil { |
ba29c43b JH |
53 | return err |
54 | } | |
7cd900d6 JH |
55 | } |
56 | return nil | |
57 | } |