...
1
2
3
4
5 package packet
6
7 import (
8 "bytes"
9 "image"
10 "image/jpeg"
11 "io"
12 "io/ioutil"
13 )
14
15 const UserAttrImageSubpacket = 1
16
17
18
19
20
21 type UserAttribute struct {
22 Contents []*OpaqueSubpacket
23 }
24
25
26
27 func NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) {
28 uat = new(UserAttribute)
29 for _, photo := range photos {
30 var buf bytes.Buffer
31
32 data := []byte{
33 0x10, 0x00,
34 0x01,
35 0x01,
36 0, 0, 0, 0,
37 0, 0, 0, 0,
38 0, 0, 0, 0}
39 if _, err = buf.Write(data); err != nil {
40 return
41 }
42 if err = jpeg.Encode(&buf, photo, nil); err != nil {
43 return
44 }
45
46 lengthBuf := make([]byte, 5)
47 n := serializeSubpacketLength(lengthBuf, len(buf.Bytes())+1)
48 lengthBuf = lengthBuf[:n]
49
50 uat.Contents = append(uat.Contents, &OpaqueSubpacket{
51 SubType: UserAttrImageSubpacket,
52 EncodedLength: lengthBuf,
53 Contents: buf.Bytes(),
54 })
55 }
56 return
57 }
58
59
60 func NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute {
61 return &UserAttribute{Contents: contents}
62 }
63
64 func (uat *UserAttribute) parse(r io.Reader) (err error) {
65
66 b, err := ioutil.ReadAll(r)
67 if err != nil {
68 return
69 }
70 uat.Contents, err = OpaqueSubpackets(b)
71 return
72 }
73
74
75
76 func (uat *UserAttribute) Serialize(w io.Writer) (err error) {
77 var buf bytes.Buffer
78 for _, sp := range uat.Contents {
79 err = sp.Serialize(&buf)
80 if err != nil {
81 return err
82 }
83 }
84 if err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil {
85 return err
86 }
87 _, err = w.Write(buf.Bytes())
88 return
89 }
90
91
92
93
94 func (uat *UserAttribute) ImageData() (imageData [][]byte) {
95 for _, sp := range uat.Contents {
96 if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 {
97 imageData = append(imageData, sp.Contents[16:])
98 }
99 }
100 return
101 }
102
View as plain text