1e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor/* 2e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Copyright (C) 2012 The Android Open Source Project 3e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * 4e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 5e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * you may not use this file except in compliance with the License. 6e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * You may obtain a copy of the License at 7e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * 8e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * http://www.apache.org/licenses/LICENSE-2.0 9e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * 10e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Unless required by applicable law or agreed to in writing, software 11e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 12e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * See the License for the specific language governing permissions and 14e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * limitations under the License. 15e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 16e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 17e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorpackage com.android.mms.exif; 18e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 19e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorimport java.util.HashMap; 20e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorimport java.util.Map; 21e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 22e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor/** 23e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * This class stores all the tags in an IFD. 24e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * 25e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see ExifData 26e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see ExifTag 27e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 28e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorclass IfdData { 29e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 30e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor private final int mIfdId; 31e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor private final Map<Short, ExifTag> mExifTags = new HashMap<Short, ExifTag>(); 32e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor private int mOffsetToNextIfd = 0; 33e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor private static final int[] sIfds = { 34e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_1, IfdId.TYPE_IFD_EXIF, 35e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor IfdId.TYPE_IFD_INTEROPERABILITY, IfdId.TYPE_IFD_GPS 36e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor }; 37e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 38e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Creates an IfdData with given IFD ID. 39e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * 40e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_0 41e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_1 42e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_EXIF 43e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_GPS 44e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_INTEROPERABILITY 45e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 46e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor IfdData(int ifdId) { 47e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor mIfdId = ifdId; 48e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 49e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 50e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor static protected int[] getIfds() { 51e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return sIfds; 52e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 53e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 54e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 55e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Get a array the contains all {@link ExifTag} in this IFD. 56e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 57e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected ExifTag[] getAllTags() { 58e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mExifTags.values().toArray(new ExifTag[mExifTags.size()]); 59e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 60e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 61e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 62e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Gets the ID of this IFD. 63e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * 64e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_0 65e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_1 66e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_EXIF 67e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_GPS 68e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see IfdId#TYPE_IFD_INTEROPERABILITY 69e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 70e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected int getId() { 71e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mIfdId; 72e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 73e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 74e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 75e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Gets the {@link ExifTag} with given tag id. Return null if there is no 76e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * such tag. 77e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 78e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected ExifTag getTag(short tagId) { 79e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mExifTags.get(tagId); 80e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 81e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 82e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 83e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Adds or replaces a {@link ExifTag}. 84e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 85e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected ExifTag setTag(ExifTag tag) { 86e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor tag.setIfd(mIfdId); 87e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mExifTags.put(tag.getTagId(), tag); 88e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 89e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 90e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected boolean checkCollision(short tagId) { 91e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mExifTags.get(tagId) != null; 92e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 93e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 94e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 95e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Removes the tag of the given ID 96e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 97e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected void removeTag(short tagId) { 98e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor mExifTags.remove(tagId); 99e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 100e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 101e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 102e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Gets the tags count in the IFD. 103e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 104e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected int getTagCount() { 105e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mExifTags.size(); 106e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 107e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 108e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 109e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Sets the offset of next IFD. 110e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 111e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected void setOffsetToNextIfd(int offset) { 112e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor mOffsetToNextIfd = offset; 113e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 114e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 115e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 116e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Gets the offset of next IFD. 117e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 118e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor protected int getOffsetToNextIfd() { 119e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return mOffsetToNextIfd; 120e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 121e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor 122e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor /** 123e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Returns true if all tags in this two IFDs are equal. Note that tags of 124e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * IFDs offset or thumbnail offset will be ignored. 125e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */ 126e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor @Override 127e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor public boolean equals(Object obj) { 128e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor if (this == obj) { 129e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return true; 130e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 131e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor if (obj == null) { 132e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return false; 133e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 134e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor if (obj instanceof IfdData) { 135e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor IfdData data = (IfdData) obj; 136e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor if (data.getId() == mIfdId && data.getTagCount() == getTagCount()) { 137e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor ExifTag[] tags = data.getAllTags(); 138e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor for (ExifTag tag : tags) { 139e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor if (ExifInterface.isOffsetTag(tag.getTagId())) { 140e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor continue; 141e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 142e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor ExifTag tag2 = mExifTags.get(tag.getTagId()); 143e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor if (!tag.equals(tag2)) { 144e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return false; 145e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 146e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 147e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return true; 148e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 149e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 150e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor return false; 151e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor } 152e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor} 153