summaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/gallery3d/exif/ExifXmlReader.java')
-rw-r--r--tests/src/com/android/gallery3d/exif/ExifXmlReader.java126
1 files changed, 71 insertions, 55 deletions
diff --git a/tests/src/com/android/gallery3d/exif/ExifXmlReader.java b/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
index 72dd31373..54def2756 100644
--- a/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
+++ b/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
@@ -20,78 +20,94 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
public class ExifXmlReader {
+ private static final String TAG_EXIF = "exif";
+ private static final String TAG_TAG = "tag";
- private static final String XML_EXIF_TAG = "exif";
- private static final String XML_IFD_TAG = "ifd";
- private static final String XML_IFD_NAME = "name";
- private static final String XML_TAG = "tag";
- private static final String XML_IFD0 = "ifd0";
- private static final String XML_IFD1 = "ifd1";
- private static final String XML_EXIF_IFD = "exif-ifd";
- private static final String XML_INTEROPERABILITY_IFD = "interoperability-ifd";
- private static final String XML_TAG_ID = "id";
-
- public static void readXml(XmlPullParser parser, HashMap<Short, String> ifd0,
- HashMap<Short, String> ifd1, HashMap<Short, String> exifIfd,
- HashMap<Short, String> interoperabilityIfd) throws XmlPullParserException,
- IOException {
+ private static final String IFD0 = "IFD0";
+ private static final String EXIF_IFD = "ExifIFD";
+ private static final String GPS_IFD = "GPS";
+ private static final String IFD1 = "IFD1";
+ private static final String INTEROP_IFD = "InteropIFD";
+
+ private static final String ATTR_ID = "id";
+ private static final String ATTR_IFD = "ifd";
+
+ /**
+ * This function read the ground truth XML.
+ *
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ static public List<Map<Short, Set<String>>> readXml(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+
+ List<Map<Short, Set<String>>> exifData =
+ new ArrayList<Map<Short, Set<String>>>(IfdId.TYPE_IFD_COUNT);
+ for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) {
+ exifData.add(new HashMap<Short, Set<String>>());
+ }
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() == XmlPullParser.START_TAG) {
break;
}
}
+ parser.require(XmlPullParser.START_TAG, null, TAG_EXIF);
- assert(parser.getName().equals(XML_EXIF_TAG));
-
- parser.require(XmlPullParser.START_TAG, null, XML_EXIF_TAG);
while (parser.next() != XmlPullParser.END_TAG) {
- if (parser.getEventType() == XmlPullParser.START_TAG) {
- readXmlIfd(parser, ifd0, ifd1, exifIfd, interoperabilityIfd);
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
}
- }
- parser.require(XmlPullParser.END_TAG, null, XML_EXIF_TAG);
- }
- private static void readXmlIfd(XmlPullParser parser, HashMap<Short, String> ifd0,
- HashMap<Short, String> ifd1, HashMap<Short, String> exifIfd,
- HashMap<Short, String> interoperabilityIfd) throws XmlPullParserException,
- IOException {
- parser.require(XmlPullParser.START_TAG, null, XML_IFD_TAG);
- String name = parser.getAttributeValue(null, XML_IFD_NAME);
- HashMap<Short, String> ifdData = null;
- if (XML_IFD0.equals(name)) {
- ifdData = ifd0;
- } else if (XML_IFD1.equals(name)) {
- ifdData = ifd1;
- } else if (XML_EXIF_IFD.equals(name)) {
- ifdData = exifIfd;
- } else if (XML_INTEROPERABILITY_IFD.equals(name)) {
- ifdData = interoperabilityIfd;
- } else {
- throw new RuntimeException("Unknown IFD name in xml file: " + name);
- }
- while (parser.next() != XmlPullParser.END_TAG) {
- if (parser.getEventType() == XmlPullParser.START_TAG) {
- readXmlTag(parser, ifdData);
+ parser.require(XmlPullParser.START_TAG, null, TAG_TAG);
+
+ int ifdId = getIfdIdFromString(parser.getAttributeValue(null, ATTR_IFD));
+ short id = Integer.decode(parser.getAttributeValue(null, ATTR_ID)).shortValue();
+
+ String value = "";
+ if (parser.next() == XmlPullParser.TEXT) {
+ value = parser.getText();
+ parser.next();
}
+
+ if (ifdId < 0) {
+ // TODO: the MarkerNote segment.
+ } else {
+ Set<String> tagData = exifData.get(ifdId).get(id);
+ if (tagData == null) {
+ tagData = new HashSet<String>();
+ exifData.get(ifdId).put(id, tagData);
+ }
+ tagData.add(value.trim());
+ }
+
+ parser.require(XmlPullParser.END_TAG, null, null);
}
- parser.require(XmlPullParser.END_TAG, null, XML_IFD_TAG);
+ return exifData;
}
- private static void readXmlTag(XmlPullParser parser, HashMap<Short, String> data)
- throws XmlPullParserException, IOException {
- parser.require(XmlPullParser.START_TAG, null, XML_TAG);
- short id = Integer.decode(parser.getAttributeValue(null, XML_TAG_ID)).shortValue();
- String value = "";
- if (parser.next() == XmlPullParser.TEXT) {
- value = parser.getText();
- parser.next();
+ static private int getIfdIdFromString(String prefix) {
+ if (IFD0.equals(prefix)) {
+ return IfdId.TYPE_IFD_0;
+ } else if (EXIF_IFD.equals(prefix)) {
+ return IfdId.TYPE_IFD_EXIF;
+ } else if (GPS_IFD.equals(prefix)) {
+ return IfdId.TYPE_IFD_GPS;
+ } else if (IFD1.equals(prefix)) {
+ return IfdId.TYPE_IFD_1;
+ } else if (INTEROP_IFD.equals(prefix)) {
+ return IfdId.TYPE_IFD_INTEROPERABILITY;
+ } else {
+ assert(false);
+ return -1;
}
- data.put(id, value);
- parser.require(XmlPullParser.END_TAG, null, XML_TAG);
}
-} \ No newline at end of file
+}