-
Notifications
You must be signed in to change notification settings - Fork 2
/
subdoc.go
136 lines (105 loc) · 2.86 KB
/
subdoc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package xar
// #include <stdlib.h>
// #include <xar/xar.h>
import "C"
import "unsafe"
type Subdoc struct {
subdoc C.xar_subdoc_t
archive *Archive
}
func (a *Archive) NewSubdoc(name string) *Subdoc {
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
subdoc := C.xar_subdoc_new(a.archive, cName)
if subdoc == nil {
panic(ErrNil)
}
return &Subdoc{
subdoc: subdoc,
archive: a,
}
}
func (a *Archive) ListSubdocs() []*Subdoc {
iter := C.xar_iter_new()
if iter == nil {
panic(ErrNil) // memory allocation failed
}
defer C.xar_iter_free(iter)
var list []*Subdoc
next := C.xar_subdoc_first(a.archive)
for next != nil {
list = append(list, &Subdoc{
subdoc: next,
archive: a,
})
next = C.xar_subdoc_next(next)
}
return list
}
func (s *Subdoc) SetProperty(key, value string) error {
cKey := C.CString(key)
defer C.free(unsafe.Pointer(cKey))
cValue := C.CString(value)
defer C.free(unsafe.Pointer(cValue))
if C.xar_subdoc_prop_set(s.subdoc, cKey, cValue) != 0 {
return ErrNonZero
}
return nil
}
func (s *Subdoc) GetProperty(key string) (string, error) {
cKey := C.CString(key)
defer C.free(unsafe.Pointer(cKey))
var buffer *C.char
if C.xar_subdoc_prop_get(s.subdoc, cKey, &buffer) != 0 {
return "", ErrNonZero
}
return C.GoString(buffer), nil
}
func (s *Subdoc) SetPropertyAttr(prop, attr, value string) error {
cProp := C.CString(prop)
defer C.free(unsafe.Pointer(cProp))
cAttr := C.CString(attr)
defer C.free(unsafe.Pointer(cAttr))
cValue := C.CString(value)
defer C.free(unsafe.Pointer(cValue))
if C.xar_subdoc_attr_set(s.subdoc, cProp, cAttr, cValue) != 0 {
return ErrNonZero
}
return nil
}
func (s *Subdoc) GetPropertyAttr(prop, attr string) string {
cProp := C.CString(prop)
defer C.free(unsafe.Pointer(cProp))
cAttr := C.CString(attr)
defer C.free(unsafe.Pointer(cAttr))
result := C.xar_subdoc_attr_get(s.subdoc, cProp, cAttr)
return C.GoString(result)
}
func (s *Subdoc) Name() string {
return C.GoString(C.xar_subdoc_name(s.subdoc))
}
// Export gets the byte output of the subdocument in XML format.
// Synonymous to xar_subdoc_copyout in the libxar API.
func (s *Subdoc) Export() ([]byte, error) {
var buffer *C.uchar
var size C.uint
if C.xar_subdoc_copyout(s.subdoc, &buffer, &size) != 0 {
return nil, ErrNonZero
}
defer C.free(unsafe.Pointer(buffer))
bte := C.GoBytes(unsafe.Pointer(buffer), C.int(size))
return bte, nil
}
// Import fills the subdoc with the information from the byte output.
// Synonymous to xar_subdoc_copyin in the libxar API.
func (s *Subdoc) Import(b []byte) error {
if C.xar_subdoc_copyin(s.subdoc, (*C.uchar)(unsafe.Pointer(&b[0])), C.uint(len(b))) != 0 {
return ErrNonZero
}
return nil
}
// Remove removes the subdoc from the archive. Once it is removed,
// it becomes unusable. Do not touch or errors will occur.
func (s *Subdoc) Remove() {
C.xar_subdoc_remove(s.subdoc)
}