|
20 | 20 | import brut.androlib.exceptions.AXmlDecodingException;
|
21 | 21 | import brut.androlib.exceptions.RawXmlEncounteredException;
|
22 | 22 | import brut.androlib.res.data.ResTable;
|
23 |
| -import brut.androlib.res.util.ExtXmlSerializer; |
| 23 | +import brut.xmlpull.XmlPullUtils; |
24 | 24 | import org.xmlpull.v1.XmlPullParser;
|
25 | 25 | import org.xmlpull.v1.XmlPullParserException;
|
26 |
| -import org.xmlpull.v1.wrapper.XmlPullParserWrapper; |
27 |
| -import org.xmlpull.v1.wrapper.XmlPullWrapperFactory; |
28 |
| -import org.xmlpull.v1.wrapper.XmlSerializerWrapper; |
29 |
| -import org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper; |
| 26 | +import org.xmlpull.v1.XmlSerializer; |
30 | 27 |
|
31 | 28 | import java.io.*;
|
32 | 29 |
|
33 | 30 | public class AndroidManifestPullStreamDecoder implements ResStreamDecoder {
|
34 |
| - public AndroidManifestPullStreamDecoder(AXmlResourceParser parser, |
35 |
| - ExtXmlSerializer serializer) { |
36 |
| - this.mParser = parser; |
37 |
| - this.mSerial = serializer; |
| 31 | + private final AXmlResourceParser mParser; |
| 32 | + private final XmlSerializer mSerial; |
| 33 | + |
| 34 | + public AndroidManifestPullStreamDecoder(AXmlResourceParser parser, XmlSerializer serial) { |
| 35 | + mParser = parser; |
| 36 | + mSerial = serial; |
38 | 37 | }
|
39 | 38 |
|
40 | 39 | @Override
|
41 |
| - public void decode(InputStream in, OutputStream out) |
42 |
| - throws AndrolibException { |
| 40 | + public void decode(InputStream in, OutputStream out) throws AndrolibException { |
43 | 41 | try {
|
44 |
| - XmlPullWrapperFactory factory = XmlPullWrapperFactory.newInstance(); |
45 |
| - XmlPullParserWrapper par = factory.newPullParserWrapper(mParser); |
46 |
| - final ResTable resTable = mParser.getResTable(); |
47 |
| - |
48 |
| - XmlSerializerWrapper ser = new StaticXmlSerializerWrapper(mSerial, factory) { |
49 |
| - final boolean hideSdkInfo = !resTable.getAnalysisMode(); |
50 |
| - |
51 |
| - @Override |
52 |
| - public void event(XmlPullParser pp) |
53 |
| - throws XmlPullParserException, IOException { |
54 |
| - int type = pp.getEventType(); |
55 |
| - |
56 |
| - if (type == XmlPullParser.START_TAG) { |
57 |
| - if ("manifest".equals(pp.getName())) { |
58 |
| - try { |
59 |
| - parseManifest(pp); |
60 |
| - } catch (AndrolibException ignored) {} |
61 |
| - } else if ("uses-sdk".equals(pp.getName())) { |
62 |
| - try { |
63 |
| - parseUsesSdk(pp); |
64 |
| - } catch (AndrolibException ignored) {} |
65 |
| - if (hideSdkInfo) { |
66 |
| - return; |
67 |
| - } |
68 |
| - } |
69 |
| - } else if (type == XmlPullParser.END_TAG |
70 |
| - && "uses-sdk".equals(pp.getName())) { |
71 |
| - if (hideSdkInfo) { |
72 |
| - return; |
73 |
| - } |
74 |
| - } |
| 42 | + mParser.setInput(in, null); |
| 43 | + mSerial.setOutput(out, null); |
| 44 | + XmlPullUtils.copy(mParser, mSerial, new EventHandler(mParser.getResTable())); |
| 45 | + } catch (XmlPullParserException ex) { |
| 46 | + throw new AXmlDecodingException("Could not decode XML", ex); |
| 47 | + } catch (IOException ex) { |
| 48 | + throw new RawXmlEncounteredException("Could not decode XML", ex); |
| 49 | + } |
| 50 | + } |
75 | 51 |
|
76 |
| - super.event(pp); |
| 52 | + private static class EventHandler implements XmlPullUtils.EventHandler { |
| 53 | + private final ResTable mResTable; |
| 54 | + private final boolean mHideSdkInfo; |
| 55 | + |
| 56 | + public EventHandler(ResTable resTable) { |
| 57 | + mResTable = resTable; |
| 58 | + mHideSdkInfo = !resTable.getAnalysisMode(); |
| 59 | + } |
| 60 | + |
| 61 | + @Override |
| 62 | + public boolean onEvent(XmlPullParser in, XmlSerializer out) throws XmlPullParserException { |
| 63 | + int type = in.getEventType(); |
| 64 | + |
| 65 | + if (type == XmlPullParser.START_TAG) { |
| 66 | + String name = in.getName(); |
| 67 | + |
| 68 | + if (name.equals("manifest")) { |
| 69 | + parseManifest(in); |
| 70 | + } else if (name.equals("uses-sdk")) { |
| 71 | + parseUsesSdk(in); |
| 72 | + |
| 73 | + if (mHideSdkInfo) { |
| 74 | + return true; |
| 75 | + } |
77 | 76 | }
|
| 77 | + } else if (type == XmlPullParser.END_TAG) { |
| 78 | + String name = in.getName(); |
78 | 79 |
|
79 |
| - private void parseManifest(XmlPullParser pp) |
80 |
| - throws AndrolibException { |
81 |
| - for (int i = 0; i < pp.getAttributeCount(); i++) { |
82 |
| - String ns = pp.getAttributeNamespace(i); |
83 |
| - String name = pp.getAttributeName(i); |
84 |
| - String value = pp.getAttributeValue(i); |
85 |
| - |
86 |
| - if (value.isEmpty()) { |
87 |
| - continue; |
88 |
| - } |
89 |
| - |
90 |
| - if (ns.isEmpty()) { |
91 |
| - if (name.equals("package")) { |
92 |
| - resTable.setPackageRenamed(value); |
93 |
| - } |
94 |
| - } else if (ns.equals(AXmlResourceParser.ANDROID_RES_NS)) { |
95 |
| - switch (name) { |
96 |
| - case "versionCode": |
97 |
| - resTable.setVersionCode(value); |
98 |
| - break; |
99 |
| - case "versionName": |
100 |
| - resTable.setVersionName(value); |
101 |
| - break; |
102 |
| - } |
103 |
| - } |
| 80 | + if (name.equals("uses-sdk")) { |
| 81 | + if (mHideSdkInfo) { |
| 82 | + return true; |
104 | 83 | }
|
105 | 84 | }
|
| 85 | + } |
106 | 86 |
|
107 |
| - private void parseUsesSdk(XmlPullParser pp) |
108 |
| - throws AndrolibException { |
109 |
| - for (int i = 0; i < pp.getAttributeCount(); i++) { |
110 |
| - String ns = pp.getAttributeNamespace(i); |
111 |
| - String name = pp.getAttributeName(i); |
112 |
| - String value = pp.getAttributeValue(i); |
113 |
| - |
114 |
| - if (value.isEmpty()) { |
115 |
| - continue; |
116 |
| - } |
117 |
| - |
118 |
| - if (ns.equals(AXmlResourceParser.ANDROID_RES_NS)) { |
119 |
| - switch (name) { |
120 |
| - case "minSdkVersion": |
121 |
| - case "targetSdkVersion": |
122 |
| - case "maxSdkVersion": |
123 |
| - case "compileSdkVersion": |
124 |
| - resTable.addSdkInfo(name, value); |
125 |
| - break; |
126 |
| - } |
127 |
| - } |
| 87 | + return false; |
| 88 | + } |
| 89 | + |
| 90 | + private void parseManifest(XmlPullParser in) { |
| 91 | + for (int i = 0; i < in.getAttributeCount(); i++) { |
| 92 | + String ns = in.getAttributeNamespace(i); |
| 93 | + String name = in.getAttributeName(i); |
| 94 | + String value = in.getAttributeValue(i); |
| 95 | + |
| 96 | + if (value.isEmpty()) { |
| 97 | + continue; |
| 98 | + } |
| 99 | + if (ns.isEmpty()) { |
| 100 | + if (name.equals("package")) { |
| 101 | + mResTable.setPackageRenamed(value); |
| 102 | + } |
| 103 | + } else if (ns.equals(AXmlResourceParser.ANDROID_RES_NS)) { |
| 104 | + switch (name) { |
| 105 | + case "versionCode": |
| 106 | + mResTable.setVersionCode(value); |
| 107 | + break; |
| 108 | + case "versionName": |
| 109 | + mResTable.setVersionName(value); |
| 110 | + break; |
128 | 111 | }
|
129 | 112 | }
|
130 |
| - }; |
| 113 | + } |
| 114 | + } |
131 | 115 |
|
132 |
| - par.setInput(in, null); |
133 |
| - ser.setOutput(out, null); |
| 116 | + private void parseUsesSdk(XmlPullParser in) { |
| 117 | + for (int i = 0; i < in.getAttributeCount(); i++) { |
| 118 | + String ns = in.getAttributeNamespace(i); |
| 119 | + String name = in.getAttributeName(i); |
| 120 | + String value = in.getAttributeValue(i); |
134 | 121 |
|
135 |
| - while (par.nextToken() != XmlPullParser.END_DOCUMENT) { |
136 |
| - ser.event(par); |
| 122 | + if (value.isEmpty()) { |
| 123 | + continue; |
| 124 | + } |
| 125 | + if (ns.equals(AXmlResourceParser.ANDROID_RES_NS)) { |
| 126 | + switch (name) { |
| 127 | + case "minSdkVersion": |
| 128 | + case "targetSdkVersion": |
| 129 | + case "maxSdkVersion": |
| 130 | + case "compileSdkVersion": |
| 131 | + mResTable.addSdkInfo(name, value); |
| 132 | + break; |
| 133 | + } |
| 134 | + } |
137 | 135 | }
|
138 |
| - ser.flush(); |
139 |
| - } catch (XmlPullParserException ex) { |
140 |
| - throw new AXmlDecodingException("Could not decode XML", ex); |
141 |
| - } catch (IOException ex) { |
142 |
| - throw new RawXmlEncounteredException("Could not decode XML", ex); |
143 | 136 | }
|
144 | 137 | }
|
145 |
| - |
146 |
| - private final AXmlResourceParser mParser; |
147 |
| - private final ExtXmlSerializer mSerial; |
148 | 138 | }
|
0 commit comments