Skip to content

Commit f42c32b

Browse files
authored
Merge pull request #52 from zinego/pr-namespace-bug-fix
bug fix: namespace deleted by mistake
2 parents 33cba0f + f37a40b commit f42c32b

File tree

2 files changed

+44
-20
lines changed

2 files changed

+44
-20
lines changed

xml.go

+39-9
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,45 @@ type XMLFile struct {
1414
stringPool *ResStringPool
1515
resourceMap []uint32
1616
notPrecessedNS map[ResStringPoolRef]ResStringPoolRef
17-
namespaces map[ResStringPoolRef]ResStringPoolRef
17+
namespaces XmlNamespaces
1818
xmlBuffer bytes.Buffer
1919
}
2020

21+
type (
22+
XmlNamespaces struct {
23+
l []namespaceVal
24+
}
25+
namespaceVal struct {
26+
key ResStringPoolRef
27+
value ResStringPoolRef
28+
}
29+
)
30+
31+
func (x *XmlNamespaces) add(key ResStringPoolRef, value ResStringPoolRef) {
32+
x.l = append(x.l, namespaceVal{key: key, value: value})
33+
return
34+
}
35+
36+
func (x *XmlNamespaces) remove(key ResStringPoolRef) {
37+
for i := len(x.l) - 1; i >= 0; i-- {
38+
if x.l[i].key == key {
39+
var newList = append(x.l[:i], x.l[i+1:]...)
40+
x.l = newList
41+
return
42+
}
43+
}
44+
return
45+
}
46+
47+
func (x *XmlNamespaces) get(key ResStringPoolRef) ResStringPoolRef {
48+
for i := len(x.l) - 1; i >= 0; i-- {
49+
if x.l[i].key == key {
50+
return x.l[i].value
51+
}
52+
}
53+
return ResStringPoolRef(0)
54+
}
55+
2156
// ResXMLTreeNode is basic XML tree node.
2257
type ResXMLTreeNode struct {
2358
Header ResChunkHeader
@@ -151,12 +186,7 @@ func (f *XMLFile) readStartNamespace(sr *io.SectionReader) error {
151186
f.notPrecessedNS = make(map[ResStringPoolRef]ResStringPoolRef)
152187
}
153188
f.notPrecessedNS[namespace.URI] = namespace.Prefix
154-
155-
if f.namespaces == nil {
156-
f.namespaces = make(map[ResStringPoolRef]ResStringPoolRef)
157-
}
158-
f.namespaces[namespace.URI] = namespace.Prefix
159-
189+
f.namespaces.add(namespace.URI, namespace.Prefix)
160190
return nil
161191
}
162192

@@ -173,13 +203,13 @@ func (f *XMLFile) readEndNamespace(sr *io.SectionReader) error {
173203
if err := binary.Read(sr, binary.LittleEndian, namespace); err != nil {
174204
return err
175205
}
176-
delete(f.namespaces, namespace.URI)
206+
f.namespaces.remove(namespace.URI)
177207
return nil
178208
}
179209

180210
func (f *XMLFile) addNamespacePrefix(ns, name ResStringPoolRef) string {
181211
if ns != NilResStringPoolRef {
182-
prefix := f.GetString(f.namespaces[ns])
212+
prefix := f.GetString(f.namespaces.get(ns))
183213
return fmt.Sprintf("%s:%s", prefix, f.GetString(name))
184214
}
185215
return f.GetString(name)

xml_test.go

+5-11
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ func TestReadStartNamespace(t *testing.T) {
125125
if f.notPrecessedNS[ResStringPoolRef(1)] != ResStringPoolRef(2) {
126126
t.Errorf("got %v want %v", f.notPrecessedNS[ResStringPoolRef(1)], ResStringPoolRef(2))
127127
}
128-
if f.namespaces[ResStringPoolRef(1)] != ResStringPoolRef(2) {
129-
t.Errorf("got %v want %v", f.namespaces[ResStringPoolRef(1)], ResStringPoolRef(2))
128+
if f.namespaces.get(ResStringPoolRef(1)) != ResStringPoolRef(2) {
129+
t.Errorf("got %v want %v", f.namespaces.get(ResStringPoolRef(1)), ResStringPoolRef(2))
130130
}
131131
}
132132

@@ -144,16 +144,12 @@ func TestReadEndNamespace(t *testing.T) {
144144
sr := io.NewSectionReader(buf, 0, int64(len(input)))
145145

146146
f := new(XMLFile)
147-
f.namespaces = make(map[ResStringPoolRef]ResStringPoolRef)
148-
f.namespaces[ResStringPoolRef(1)] = ResStringPoolRef(2)
147+
f.namespaces.add(ResStringPoolRef(1), ResStringPoolRef(2))
149148
err := f.readEndNamespace(sr)
150149

151150
if err != nil {
152151
t.Errorf("got %v want no error", err)
153152
}
154-
if _, ok := f.namespaces[ResStringPoolRef(1)]; ok {
155-
t.Errorf("got %v want not empty", f.namespaces[ResStringPoolRef(1)])
156-
}
157153
}
158154

159155
func TestAddNamespacePrefix(t *testing.T) {
@@ -162,8 +158,7 @@ func TestAddNamespacePrefix(t *testing.T) {
162158
uriRef := ResStringPoolRef(3)
163159

164160
f := new(XMLFile)
165-
f.namespaces = make(map[ResStringPoolRef]ResStringPoolRef)
166-
f.namespaces[uriRef] = prefixRef
161+
f.namespaces.add(uriRef, prefixRef)
167162
f.stringPool = new(ResStringPool)
168163
f.stringPool.Strings = []string{"", "name", "prefix", "http://example.com"}
169164

@@ -210,8 +205,7 @@ func TestReadStartElement(t *testing.T) {
210205
f := new(XMLFile)
211206
f.notPrecessedNS = make(map[ResStringPoolRef]ResStringPoolRef)
212207
f.notPrecessedNS[uriRef] = prefixRef
213-
f.namespaces = make(map[ResStringPoolRef]ResStringPoolRef)
214-
f.namespaces[uriRef] = prefixRef
208+
f.namespaces.add(uriRef, prefixRef)
215209
f.stringPool = new(ResStringPool)
216210
f.stringPool.Strings = []string{"", "name", "prefix", "http://example.com", "attr", "value"}
217211
err := f.readStartElement(sr)

0 commit comments

Comments
 (0)